From 9474700d09a3b8c15792a96cda53854d2b49e13a Mon Sep 17 00:00:00 2001 From: Aitor Date: Tue, 5 Dec 2023 15:20:36 +0100 Subject: [PATCH 0001/1266] :bug: Fix color picker not rendering Latin1 svgs --- .../main/ui/workspace/viewport/pixel_overlay.cljs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/viewport/pixel_overlay.cljs b/frontend/src/app/main/ui/workspace/viewport/pixel_overlay.cljs index ec83437d9..8c133aeec 100644 --- a/frontend/src/app/main/ui/workspace/viewport/pixel_overlay.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/pixel_overlay.cljs @@ -7,6 +7,7 @@ (ns app.main.ui.workspace.viewport.pixel-overlay (:require [app.common.data :as d] + [app.common.data.macros :as dm] [app.common.pages.helpers :as cph] [app.common.uuid :as uuid] [app.main.data.modal :as modal] @@ -33,7 +34,7 @@ (let [image-nodes (dom/query-all svg-node "image:not([href^=data])") noop-fn (constantly nil)] (if (empty? image-nodes) - (rx/of nil) + (rx/of svg-node) (->> (rx/from image-nodes) (rx/mapcat (fn [image] @@ -43,7 +44,8 @@ (rx/mapcat wapi/read-file-as-data-url) (rx/tap (fn [data] (dom/set-attribute! image "href" data))) - (rx/reduce noop-fn))))))))) + (rx/reduce noop-fn))))) + (rx/map (fn [_] svg-node)))))) (defn- svg-as-data-url "Transforms SVG as data-url resolving any blob, http or https url to @@ -51,7 +53,11 @@ [svg] (let [svg-clone (.cloneNode svg true)] (->> (resolve-svg-images! svg-clone) - (rx/map (fn [_] (dom/svg-node->data-uri svg-clone)))))) + (rx/mapcat (fn [svg-node] + (let [xml (js/XMLSerializer.) + xmlstr (.serializeToString xml svg-node)] + (->> (rx/of xmlstr) + (rx/map #(dm/str "data:image/svg+xml;charset=utf-8," (js/encodeURIComponent %)))))))))) (defn format-viewbox [vbox] (str/join " " [(:x vbox 0) -- Gitee From 864881721f2711823b8a161996122c9272be73b0 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 5 Jan 2024 11:09:21 +0100 Subject: [PATCH 0002/1266] :bug: Fix validation of validation error on file validate ns --- backend/resources/log4j2-devenv.xml | 1 + backend/src/app/http/sse.clj | 3 +++ common/src/app/common/files/validate.cljc | 3 ++- frontend/src/app/worker/import.cljs | 2 +- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/backend/resources/log4j2-devenv.xml b/backend/resources/log4j2-devenv.xml index a37eb1801..7abb7a188 100644 --- a/backend/resources/log4j2-devenv.xml +++ b/backend/resources/log4j2-devenv.xml @@ -26,6 +26,7 @@ + diff --git a/backend/src/app/http/sse.clj b/backend/src/app/http/sse.clj index c89c91b61..0ece3b329 100644 --- a/backend/src/app/http/sse.clj +++ b/backend/src/app/http/sse.clj @@ -80,6 +80,9 @@ (try (tap "end" (handler)) (catch Throwable cause + (binding [l/*context* (errors/request->context request)] + (l/err :hint "unexpected error process streaming response" + :cause cause)) (tap "error" (errors/handle' cause request))) (finally (sp/close! *channel*) diff --git a/common/src/app/common/files/validate.cljc b/common/src/app/common/files/validate.cljc index f6d12ada0..280271701 100644 --- a/common/src/app/common/files/validate.cljc +++ b/common/src/app/common/files/validate.cljc @@ -48,7 +48,8 @@ :not-head-main-not-allowed :not-head-copy-not-allowed :not-component-not-allowed - :component-nil-objects-not-allowed}) + :component-nil-objects-not-allowed + :instance-head-not-frame}) (def ^:private schema:error diff --git a/frontend/src/app/worker/import.cljs b/frontend/src/app/worker/import.cljs index 96bd5d7b9..fe923aec7 100644 --- a/frontend/src/app/worker/import.cljs +++ b/frontend/src/app/worker/import.cljs @@ -728,7 +728,7 @@ ::log/sync? true) (let [edata (if (map? cause) cause (ex-data cause))] (println "Error data:") - (pp/pprint (dissoc edata :explain) {:level 2 :length 10}) + (pp/pprint (dissoc edata :explain) {:level 3 :length 10}) (when (string? (:explain edata)) (js/console.log (:explain edata))) -- Gitee From 2fa06baa36bb87b5100f0615f753197de8af258a Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 24 Jan 2024 17:10:56 +0100 Subject: [PATCH 0003/1266] :bug: Fix incorrect props handling on profile registration --- backend/src/app/rpc/commands/auth.clj | 4 +- .../test/backend_tests/rpc_profile_test.clj | 48 +++++++------------ 2 files changed, 19 insertions(+), 33 deletions(-) diff --git a/backend/src/app/rpc/commands/auth.clj b/backend/src/app/rpc/commands/auth.clj index d765a5598..fd0e20600 100644 --- a/backend/src/app/rpc/commands/auth.clj +++ b/backend/src/app/rpc/commands/auth.clj @@ -325,7 +325,9 @@ (defn register-profile [{:keys [::db/conn] :as cfg} {:keys [token fullname] :as params}] (let [claims (tokens/verify (::main/props cfg) {:token token :iss :prepared-register}) - params (assoc claims :fullname fullname) + params (-> claims + (into params) + (assoc :fullname fullname)) is-active (or (:is-active params) (not (contains? cf/flags :email-verification))) diff --git a/backend/test/backend_tests/rpc_profile_test.clj b/backend/test/backend_tests/rpc_profile_test.clj index a28f186c8..d7180461b 100644 --- a/backend/test/backend_tests/rpc_profile_test.clj +++ b/backend/test/backend_tests/rpc_profile_test.clj @@ -11,6 +11,7 @@ [app.db :as db] [app.rpc :as-alias rpc] [app.auth :as auth] + [app.rpc.commands.profile :as profile] [app.tokens :as tokens] [app.util.time :as dt] [backend-tests.helpers :as th] @@ -240,56 +241,39 @@ token (get-in out [:result :token])] (t/is (string? token)) - ;; try register without token (let [data {::th/type :register-profile :fullname "foobar" :accept-terms-and-privacy true} out (th/command! data)] + ;; (th/print-result! out) (let [error (:error out)] (t/is (th/ex-info? error)) (t/is (th/ex-of-type? error :validation)) - (t/is (th/ex-of-code? error :spec-validation)))) + (t/is (th/ex-of-code? error :params-validation)))) ;; try correct register (let [data {::th/type :register-profile :token token :fullname "foobar" + :utm_campaign "utma" + :mtm_campaign "mtma" :accept-terms-and-privacy true :accept-newsletter-subscription true}] (let [{:keys [result error]} (th/command! data)] (t/is (nil? error)))) - )) - -(t/deftest prepare-register-and-register-profile-1 - (let [data {::th/type :prepare-register-profile - :email "user@example.com" - :password "foobar"} - out (th/command! data) - token (get-in out [:result :token])] - (t/is (string? token)) - - - ;; try register without token - (let [data {::th/type :register-profile - :fullname "foobar" - :accept-terms-and-privacy true} - out (th/command! data)] - (let [error (:error out)] - (t/is (th/ex-info? error)) - (t/is (th/ex-of-type? error :validation)) - (t/is (th/ex-of-code? error :params-validation)))) - ;; try correct register - (let [data {::th/type :register-profile - :token token - :fullname "foobar" - :accept-terms-and-privacy true - :accept-newsletter-subscription true}] - (let [{:keys [result error] :as out} (th/command! data)] - ;; (th/print-result! out) - (t/is (nil? error)))) - )) + (let [profile (some-> (th/db-get :profile {:email "user@example.com"}) + (profile/decode-row))] + (t/is (= "penpot" (:auth-backend profile))) + (t/is (= "foobar" (:fullname profile))) + (t/is (false? (:is-active profile))) + (t/is (uuid? (:default-team-id profile))) + (t/is (uuid? (:default-project-id profile))) + + (let [props (:props profile)] + (t/is (= "utma" (:penpot/utm-campaign props))) + (t/is (= "mtma" (:penpot/mtm-campaign props))))))) (t/deftest prepare-register-and-register-profile-2 (with-redefs [app.rpc.commands.auth/register-retry-threshold (dt/duration 500)] -- Gitee From b17371d44093172b30b9d63cbd4988749dcf9c3b Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Tue, 27 Feb 2024 13:57:16 +0100 Subject: [PATCH 0004/1266] :bug: Fix problems on sync with components chain with reset override --- frontend/src/app/main/data/workspace/libraries_helpers.cljs | 3 ++- frontend/test/frontend_tests/state_components_sync_test.cljs | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/main/data/workspace/libraries_helpers.cljs b/frontend/src/app/main/data/workspace/libraries_helpers.cljs index 84b429de4..b5fe53a7b 100644 --- a/frontend/src/app/main/data/workspace/libraries_helpers.cljs +++ b/frontend/src/app/main/data/workspace/libraries_helpers.cljs @@ -606,7 +606,8 @@ shape-main (when component (if (and reset? components-v2) - (ctf/find-remote-shape container libraries shape-inst) + ;; the reset is against the ref-shape, not against the original shape of the component + (ctf/find-ref-shape nil container libraries shape-inst {:include-deleted? true}) (ctf/get-ref-shape library component shape-inst))) shape-inst (if (and reset? components-v2) diff --git a/frontend/test/frontend_tests/state_components_sync_test.cljs b/frontend/test/frontend_tests/state_components_sync_test.cljs index 7e74291f8..1751fe9a5 100644 --- a/frontend/test/frontend_tests/state_components_sync_test.cljs +++ b/frontend/test/frontend_tests/state_components_sync_test.cljs @@ -1177,8 +1177,8 @@ (t/is (= (:fill-opacity shape1) 0)) (t/is (= (:name shape2) "Rect 1")) (t/is (= (:touched shape2) nil)) - (t/is (= (:fill-color shape2) clr/white)) - (t/is (= (:fill-opacity shape2) 1)) + (t/is (= (:fill-color shape2) clr/test)) + (t/is (= (:fill-opacity shape2) 0.5)) (t/is (= (:name c-instance2) "Board")) (t/is (= (:touched c-instance2) nil)) -- Gitee From 9940dabfff7c588a4fd1aa150f2002000738c3ff Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Mon, 11 Mar 2024 10:16:56 +0100 Subject: [PATCH 0005/1266] :bug: Fix z-index of workspace context menu --- .../resources/styles/common/framework.scss | 2 +- .../styles/common/refactor/basic-rules.scss | 2 +- .../styles/common/refactor/z-index.scss | 5 +- frontend/resources/styles/main-default.scss | 1 - .../styles/main/partials/context-menu.scss | 2 +- .../styles/main/partials/dropdown.scss | 2 +- .../styles/main/partials/exception-page.scss | 2 +- .../styles/main/partials/loader.scss | 2 +- .../styles/main/partials/tool-bar.scss | 48 ------------------- .../main/ui/components/context_menu_a11y.scss | 2 +- .../src/app/main/ui/dashboard/comments.scss | 2 +- .../src/app/main/ui/dashboard/templates.scss | 2 +- .../app/main/ui/workspace/color_palette.scss | 2 +- .../ui/workspace/color_palette_ctx_menu.scss | 2 +- .../app/main/ui/workspace/context_menu.scss | 2 +- .../src/app/main/ui/workspace/palette.scss | 2 +- .../src/app/main/ui/workspace/presence.scss | 2 +- .../src/app/main/ui/workspace/sidebar.scss | 2 +- .../main/ui/workspace/sidebar/layer_item.scss | 2 +- .../sidebar/options/menus/frame_grid.scss | 2 +- .../sidebar/options/menus/typography.scss | 2 +- .../ui/workspace/text_palette_ctx_menu.scss | 2 +- .../app/main/ui/workspace/top_toolbar.scss | 2 +- 23 files changed, 23 insertions(+), 71 deletions(-) delete mode 100644 frontend/resources/styles/main/partials/tool-bar.scss diff --git a/frontend/resources/styles/common/framework.scss b/frontend/resources/styles/common/framework.scss index 5a22085ee..a90e22dbd 100644 --- a/frontend/resources/styles/common/framework.scss +++ b/frontend/resources/styles/common/framework.scss @@ -1011,7 +1011,7 @@ input[type="range"]:focus::-ms-fill-upper { padding-left: 16px; top: 16px; right: 16px; - z-index: 1005; + z-index: 40; display: flex; align-items: center; diff --git a/frontend/resources/styles/common/refactor/basic-rules.scss b/frontend/resources/styles/common/refactor/basic-rules.scss index 61a1c4c49..4b8663f33 100644 --- a/frontend/resources/styles/common/refactor/basic-rules.scss +++ b/frontend/resources/styles/common/refactor/basic-rules.scss @@ -905,7 +905,7 @@ margin: 0; margin-top: $s-1; border-radius: $br-8; - z-index: $z-index-3; + z-index: $z-index-4; overflow-y: auto; overflow-x: hidden; background-color: var(--menu-background-color); diff --git a/frontend/resources/styles/common/refactor/z-index.scss b/frontend/resources/styles/common/refactor/z-index.scss index 5be8e2e5b..755b2e9fa 100644 --- a/frontend/resources/styles/common/refactor/z-index.scss +++ b/frontend/resources/styles/common/refactor/z-index.scss @@ -6,8 +6,9 @@ $z-index-1: 1; // floating elements $z-index-2: 2; // sidebars -$z-index-3: 3; // context menu -$z-index-4: 4; // modal +$z-index-3: 3; // topbar +$z-index-4: 4; // context menu +$z-index-5: 5; // modal $z-index-10: 10; $z-index-20: 20; $z-index-modal: 30; // When refactor finish we can reduce this number, diff --git a/frontend/resources/styles/main-default.scss b/frontend/resources/styles/main-default.scss index f3fd5e5bc..0a914e78d 100644 --- a/frontend/resources/styles/main-default.scss +++ b/frontend/resources/styles/main-default.scss @@ -60,7 +60,6 @@ @import "main/partials/project-bar"; @import "main/partials/sidebar"; @import "main/partials/tab-container"; -@import "main/partials/tool-bar"; @import "main/partials/user-settings"; @import "main/partials/workspace"; @import "main/partials/color-bullet"; diff --git a/frontend/resources/styles/main/partials/context-menu.scss b/frontend/resources/styles/main/partials/context-menu.scss index e7a302655..3f4e3f0dd 100644 --- a/frontend/resources/styles/main/partials/context-menu.scss +++ b/frontend/resources/styles/main/partials/context-menu.scss @@ -8,7 +8,7 @@ position: relative; visibility: hidden; opacity: 0; - z-index: 100; + z-index: 3; } .context-menu.is-open { diff --git a/frontend/resources/styles/main/partials/dropdown.scss b/frontend/resources/styles/main/partials/dropdown.scss index 0abd62a4f..ed3a2817f 100644 --- a/frontend/resources/styles/main/partials/dropdown.scss +++ b/frontend/resources/styles/main/partials/dropdown.scss @@ -4,7 +4,7 @@ background-color: $color-white; border-radius: $br2; box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.25); - z-index: 12; + z-index: 3; hr { margin: 0 !important; diff --git a/frontend/resources/styles/main/partials/exception-page.scss b/frontend/resources/styles/main/partials/exception-page.scss index 3ffd4ca1b..30686023a 100644 --- a/frontend/resources/styles/main/partials/exception-page.scss +++ b/frontend/resources/styles/main/partials/exception-page.scss @@ -12,7 +12,7 @@ display: flex; align-items: center; padding: 32px; - z-index: 1000; + z-index: 40; cursor: pointer; diff --git a/frontend/resources/styles/main/partials/loader.scss b/frontend/resources/styles/main/partials/loader.scss index f42675aaf..ce2542d2d 100644 --- a/frontend/resources/styles/main/partials/loader.scss +++ b/frontend/resources/styles/main/partials/loader.scss @@ -9,7 +9,7 @@ position: fixed; top: 0; width: 100%; - z-index: 999; + z-index: 40; } // full with loader CSS diff --git a/frontend/resources/styles/main/partials/tool-bar.scss b/frontend/resources/styles/main/partials/tool-bar.scss deleted file mode 100644 index eea14f2e3..000000000 --- a/frontend/resources/styles/main/partials/tool-bar.scss +++ /dev/null @@ -1,48 +0,0 @@ -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. -// -// Copyright (c) KALEIDOS INC - -.tool-bar { - background-color: $color-gray-40; - bottom: 0; - height: 100%; - position: fixed; - left: 0; - width: 50px; - z-index: 10; - - .tool-bar-inside { - padding-top: 70px; - - .main-tools { - align-items: center; - display: flex; - flex-direction: column; - - li { - cursor: pointer; - margin-bottom: $size-5; - - svg { - fill: $color-gray-20; - height: 25px; - width: 25px; - } - - &:hover { - svg { - fill: $color-white; - } - } - - &.current { - svg { - fill: $color-primary; - } - } - } - } - } -} diff --git a/frontend/src/app/main/ui/components/context_menu_a11y.scss b/frontend/src/app/main/ui/components/context_menu_a11y.scss index ed007261c..ea8a89cc5 100644 --- a/frontend/src/app/main/ui/components/context_menu_a11y.scss +++ b/frontend/src/app/main/ui/components/context_menu_a11y.scss @@ -10,7 +10,7 @@ position: relative; visibility: hidden; opacity: $op-0; - z-index: $z-index-3; + z-index: $z-index-4; &.is-open { position: relative; diff --git a/frontend/src/app/main/ui/dashboard/comments.scss b/frontend/src/app/main/ui/dashboard/comments.scss index 1be90e32b..b6e872e52 100644 --- a/frontend/src/app/main/ui/dashboard/comments.scss +++ b/frontend/src/app/main/ui/dashboard/comments.scss @@ -78,7 +78,7 @@ min-height: $s-200; position: absolute; width: 100%; - z-index: $z-index-3; + z-index: $z-index-4; hr { margin: 0; diff --git a/frontend/src/app/main/ui/dashboard/templates.scss b/frontend/src/app/main/ui/dashboard/templates.scss index 2fa508411..2649d166b 100644 --- a/frontend/src/app/main/ui/dashboard/templates.scss +++ b/frontend/src/app/main/ui/dashboard/templates.scss @@ -42,7 +42,7 @@ border-top-right-radius: $br-10; margin-right: $s-32; position: relative; - z-index: 1; + z-index: $z-index-1; background-color: $db-quaternary; } diff --git a/frontend/src/app/main/ui/workspace/color_palette.scss b/frontend/src/app/main/ui/workspace/color_palette.scss index dfe3e8229..4815dee3e 100644 --- a/frontend/src/app/main/ui/workspace/color_palette.scss +++ b/frontend/src/app/main/ui/workspace/color_palette.scss @@ -19,7 +19,7 @@ height: 100%; width: $s-24; padding: 0; - z-index: $z-index-4; + z-index: $z-index-5; svg { @extend .button-icon; stroke: var(--icon-foreground); diff --git a/frontend/src/app/main/ui/workspace/color_palette_ctx_menu.scss b/frontend/src/app/main/ui/workspace/color_palette_ctx_menu.scss index 7b09a1ab6..920d6031b 100644 --- a/frontend/src/app/main/ui/workspace/color_palette_ctx_menu.scss +++ b/frontend/src/app/main/ui/workspace/color_palette_ctx_menu.scss @@ -13,7 +13,7 @@ max-width: $s-480; padding: $s-4; margin: 0 0 $s-4 0; - z-index: $z-index-3; + z-index: $z-index-4; border-radius: $br-10; background-color: var(--context-menu-background-color); diff --git a/frontend/src/app/main/ui/workspace/context_menu.scss b/frontend/src/app/main/ui/workspace/context_menu.scss index f6d10a8ec..0ce429a5b 100644 --- a/frontend/src/app/main/ui/workspace/context_menu.scss +++ b/frontend/src/app/main/ui/workspace/context_menu.scss @@ -19,7 +19,7 @@ border-radius: $br-8; border: $s-2 solid var(--panel-border-color); background-color: var(--menu-background-color); - z-index: $z-index-3; + z-index: $z-index-4; } .separator { diff --git a/frontend/src/app/main/ui/workspace/palette.scss b/frontend/src/app/main/ui/workspace/palette.scss index 70f0639e0..9474a7909 100644 --- a/frontend/src/app/main/ui/workspace/palette.scss +++ b/frontend/src/app/main/ui/workspace/palette.scss @@ -43,7 +43,7 @@ .resize-area { grid-area: resize; height: $s-8; - z-index: $z-index-3; + z-index: $z-index-4; width: calc(100% - $s-8); border-radius: $br-circle; cursor: ns-resize; diff --git a/frontend/src/app/main/ui/workspace/presence.scss b/frontend/src/app/main/ui/workspace/presence.scss index 07c883950..22c76e3b0 100644 --- a/frontend/src/app/main/ui/workspace/presence.scss +++ b/frontend/src/app/main/ui/workspace/presence.scss @@ -42,7 +42,7 @@ padding: $s-8; margin: calc(-1 * $s-2) calc(-1 * $s-4) 0 0; background-color: var(--menu-background-color); - z-index: $z-index-3; + z-index: $z-index-4; .active-users-list { gap: $s-4; .users-num, diff --git a/frontend/src/app/main/ui/workspace/sidebar.scss b/frontend/src/app/main/ui/workspace/sidebar.scss index b14ca1253..192a8416e 100644 --- a/frontend/src/app/main/ui/workspace/sidebar.scss +++ b/frontend/src/app/main/ui/workspace/sidebar.scss @@ -47,7 +47,7 @@ $width-settings-bar-max: $s-500; position: absolute; top: 0; left: unset; - z-index: $z-index-3; + z-index: $z-index-4; width: $s-8; cursor: ew-resize; height: 100%; diff --git a/frontend/src/app/main/ui/workspace/sidebar/layer_item.scss b/frontend/src/app/main/ui/workspace/sidebar/layer_item.scss index 68779f911..124ee6f48 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/layer_item.scss +++ b/frontend/src/app/main/ui/workspace/sidebar/layer_item.scss @@ -249,7 +249,7 @@ :global(.sticky) { position: sticky; top: $s-0; - z-index: $z-index-3; + z-index: $z-index-4; } .tab-indentation { diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/frame_grid.scss b/frontend/src/app/main/ui/workspace/sidebar/options/menus/frame_grid.scss index d1bb3aa4c..bf1a29c77 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/frame_grid.scss +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/frame_grid.scss @@ -224,7 +224,7 @@ margin: 0 0 $s-40 0; margin-top: $s-4; border-radius: $br-8; - z-index: $z-index-3; + z-index: $z-index-4; overflow-y: auto; background-color: var(--menu-background-color); .option-btn { diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/typography.scss b/frontend/src/app/main/ui/workspace/sidebar/options/menus/typography.scss index 1106ea3c1..b5c417a41 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/typography.scss +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/typography.scss @@ -351,7 +351,7 @@ right: 0; height: 100%; width: 100%; - z-index: $z-index-3; + z-index: $z-index-4; } .show-recent { diff --git a/frontend/src/app/main/ui/workspace/text_palette_ctx_menu.scss b/frontend/src/app/main/ui/workspace/text_palette_ctx_menu.scss index e1b2bb08d..e29217eaa 100644 --- a/frontend/src/app/main/ui/workspace/text_palette_ctx_menu.scss +++ b/frontend/src/app/main/ui/workspace/text_palette_ctx_menu.scss @@ -13,7 +13,7 @@ max-width: $s-480; padding: $s-4; margin: 0 0 $s-4 0; - z-index: $z-index-3; + z-index: $z-index-4; border-radius: $br-10; background-color: var(--context-menu-background-color); diff --git a/frontend/src/app/main/ui/workspace/top_toolbar.scss b/frontend/src/app/main/ui/workspace/top_toolbar.scss index 293956c6c..bc7850c72 100644 --- a/frontend/src/app/main/ui/workspace/top_toolbar.scss +++ b/frontend/src/app/main/ui/workspace/top_toolbar.scss @@ -17,7 +17,7 @@ padding: $s-8 $s-16; border-radius: $s-8; border: $s-2 solid var(--panel-border-color); - z-index: $z-index-10; + z-index: $z-index-3; background-color: var(--color-background-primary); transition: top 0.3s, -- Gitee From 71b4079483ef2cce2a713569db89fbc1a7ad3297 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Mon, 11 Mar 2024 10:54:00 +0100 Subject: [PATCH 0006/1266] :bug: Fix the hero project height in dashboard --- frontend/src/app/main/ui/dashboard.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/dashboard.scss b/frontend/src/app/main/ui/dashboard.scss index 064694ec9..ed79f5362 100644 --- a/frontend/src/app/main/ui/dashboard.scss +++ b/frontend/src/app/main/ui/dashboard.scss @@ -21,7 +21,7 @@ .dashboard-content { display: grid; - grid-template-rows: $s-64 1fr; + grid-template-rows: $s-64 auto auto 1fr; position: relative; grid-row: 1 / span 2; padding: $s-16 $s-16 0 0; -- Gitee From f714f08716c4e722d4c25b88959b1c6d9dde8988 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Mon, 11 Mar 2024 11:05:21 +0100 Subject: [PATCH 0007/1266] :bug: Fix comment bubble border --- frontend/src/app/main/ui/comments.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/app/main/ui/comments.scss b/frontend/src/app/main/ui/comments.scss index ddad36a6b..2c6b622d0 100644 --- a/frontend/src/app/main/ui/comments.scss +++ b/frontend/src/app/main/ui/comments.scss @@ -138,6 +138,7 @@ width: $s-284; padding: $s-12; border-radius: $br-8; + border: $s-2 solid var(--modal-border-color); background-color: var(--comment-modal-background-color); .comments { display: flex; -- Gitee From d860eac59fa5f07ed9a55874dc82a98c9dfee0ed Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Mon, 11 Mar 2024 11:16:15 +0100 Subject: [PATCH 0008/1266] :bug: Fix disabled buttons height in login and auth pages --- frontend/resources/styles/common/refactor/basic-rules.scss | 1 - frontend/src/app/main/ui/components/forms.scss | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/resources/styles/common/refactor/basic-rules.scss b/frontend/resources/styles/common/refactor/basic-rules.scss index 4b8663f33..0a257da60 100644 --- a/frontend/resources/styles/common/refactor/basic-rules.scss +++ b/frontend/resources/styles/common/refactor/basic-rules.scss @@ -223,7 +223,6 @@ .button-disabled { @include buttonStyle; @include flexCenter; - height: $s-32; background-color: var(--button-background-color-disabled); border: $s-1 solid var(--button-border-color-disabled); color: var(--button-foreground-color-disabled); diff --git a/frontend/src/app/main/ui/components/forms.scss b/frontend/src/app/main/ui/components/forms.scss index 19027a065..53db07493 100644 --- a/frontend/src/app/main/ui/components/forms.scss +++ b/frontend/src/app/main/ui/components/forms.scss @@ -263,6 +263,7 @@ :disabled { @extend .button-disabled; + min-height: $s-32; } // MULTI INPUT -- Gitee From 4ffaf6f996d9d32e7b92f5785e39798cb04b9225 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Mon, 11 Mar 2024 11:41:49 +0100 Subject: [PATCH 0009/1266] :bug: Fix gradient background image --- frontend/resources/styles/main-default.scss | 1 - .../styles/main/partials/color-bullet.scss | 209 ------------------ .../app/main/ui/components/color_bullet.scss | 4 +- .../ui/workspace/colorpicker/gradients.scss | 2 +- .../colorpicker/slider_selector.scss | 3 +- 5 files changed, 5 insertions(+), 214 deletions(-) delete mode 100644 frontend/resources/styles/main/partials/color-bullet.scss diff --git a/frontend/resources/styles/main-default.scss b/frontend/resources/styles/main-default.scss index 0a914e78d..48c342b70 100644 --- a/frontend/resources/styles/main-default.scss +++ b/frontend/resources/styles/main-default.scss @@ -62,6 +62,5 @@ @import "main/partials/tab-container"; @import "main/partials/user-settings"; @import "main/partials/workspace"; -@import "main/partials/color-bullet"; @import "main/partials/exception-page"; @import "main/partials/signup-questions"; diff --git a/frontend/resources/styles/main/partials/color-bullet.scss b/frontend/resources/styles/main/partials/color-bullet.scss deleted file mode 100644 index 43983d50f..000000000 --- a/frontend/resources/styles/main/partials/color-bullet.scss +++ /dev/null @@ -1,209 +0,0 @@ -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. -// -// Copyright (c) KALEIDOS INC - -.color-bullet { - border: 2px solid $color-gray-30; - position: relative; - width: var(--bullet-size); - height: var(--bullet-size); - - &:hover { - border-color: $color-primary; - } -} -.color-cell { - display: grid; - grid-template-columns: 100%; - grid-template-rows: 1fr auto; - height: 100%; - justify-items: center; - width: 65px; - - .color-bullet { - border: 2px solid $color-gray-30; - position: relative; - width: var(--bullet-size); - height: var(--bullet-size); - - &:hover { - border-color: $color-primary; - } - } - - & > * { - overflow: hidden; - } -} - -.color-cell.current { - .color-bullet { - border-color: $color-gray-30; - } -} - -ul.palette-menu .color-bullet { - width: 20px; - height: 20px; - border: 1px solid $color-gray-30; - margin-right: 5px; - background-size: 8px; -} -.color-cell.add-color .color-bullet { - align-items: center; - background-color: $color-gray-50; - border: 3px dashed $color-gray-30; - cursor: pointer; - display: flex; - justify-content: center; - margin-bottom: 1rem; - padding: 0.6rem; - - svg { - fill: $color-gray-10; - height: 30px; - width: 30px; - } -} - -.colorpicker-content .color-bullet { - grid-area: color; - width: 20px; - height: 20px; - border: 1px solid $color-gray-30; - background-size: 8px; - overflow: hidden; -} - -.asset-section .asset-list-item .color-bullet { - border: 1px solid $color-gray-30; - height: 20px; - margin-right: $size-1; - width: 20px; -} -.tool-window-content .asset-list .asset-list-item { - &:hover { - .color-bullet { - border: 1px solid $color-primary; - } - } -} - -.color-cell.add-color:hover .color-bullet { - border-color: $color-gray-30; - - svg { - fill: $color-gray-30; - } -} - -.color-bullet { - display: flex; - flex-direction: row; - border-radius: 50%; - - & .color-bullet-wrapper { - background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAADFJREFUOE9jZGBgEAFifOANPknGUQMYhkkYEEgG+NMJKAwIAbwJbdQABnBCIgRoG4gAIF8IsXB/Rs4AAAAASUVORK5CYII=") - left center; - background-color: $color-white; - clip-path: circle(50%); - display: flex; - flex-direction: row; - height: 100%; - width: 100%; - } - - &.is-gradient { - background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAADFJREFUOE9jZGBgEAFifOANPknGUQMYhkkYEEgG+NMJKAwIAbwJbdQABnBCIgRoG4gAIF8IsXB/Rs4AAAAASUVORK5CYII=") - left center; - background-color: $color-white; - } - - & .color-bullet-wrapper > * { - width: 100%; - height: 100%; - } -} - -.color-data .color-bullet.multiple { - background: transparent; - - &::before { - content: "?"; - } -} - -.color-data .color-bullet { - border: 1px solid $color-gray-30; - border-radius: 50%; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - color: $color-gray-10; - flex-shrink: 0; - height: 20px; - margin: 5px 4px 0 0; - width: 20px; - - &.palette-th { - align-items: center; - border: 1px solid $color-gray-30; - display: flex; - justify-content: center; - - svg { - fill: $color-gray-30; - height: 16px; - width: 16px; - } - - &:hover { - border-color: $color-primary; - svg { - fill: $color-primary; - } - } - } -} - -.colorpicker-content .libraries .selected-colors .color-bullet { - grid-area: auto; - margin-bottom: 0.25rem; - cursor: pointer; - - &:hover { - border-color: $color-primary; - z-index: 10; - } - - &.button { - background: $color-white; - display: flex; - align-items: center; - justify-content: center; - } - - &.button svg { - width: 12px; - height: 12px; - fill: $color-gray-30; - } - - &.plus-button svg { - width: 8px; - height: 8px; - fill: $color-black; - } -} - -.color-bullet.is-not-library-color { - border-radius: $br3; - overflow: hidden; - - & .color-bullet-wrapper { - clip-path: none; - } -} diff --git a/frontend/src/app/main/ui/components/color_bullet.scss b/frontend/src/app/main/ui/components/color_bullet.scss index 36afda4b2..3a8e0e202 100644 --- a/frontend/src/app/main/ui/components/color_bullet.scss +++ b/frontend/src/app/main/ui/components/color_bullet.scss @@ -39,13 +39,13 @@ } } &.is-gradient { - background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAADFJREFUOE9jZGBgEAFifOANPknGUQMYhkkYEEgG+NMJKAwIAbwJbdQABnBCIgRoG4gAIF8IsXB/Rs4AAAAASUVORK5CYII=") + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAExJREFUSIljvHnz5n8GLEBNTQ2bMMOtW7ewiuNSz4RVlIpg1IKBt4Dx////WFMRqakFl/qhH0SjFhAELNRKLaNl0Qi2YLQsGrWAcgAA0gAgQPhT2rAAAAAASUVORK5CYII=") left center; background-color: var(--color-bullet-background-color); transform: rotate(-90deg); } &.is-transparent { - background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAADFJREFUOE9jZGBgEAFifOANPknGUQMYhkkYEEgG+NMJKAwIAbwJbdQABnBCIgRoG4gAIF8IsXB/Rs4AAAAASUVORK5CYII=") + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAExJREFUSIljvHnz5n8GLEBNTQ2bMMOtW7ewiuNSz4RVlIpg1IKBt4Dx////WFMRqakFl/qhH0SjFhAELNRKLaNl0Qi2YLQsGrWAcgAA0gAgQPhT2rAAAAAASUVORK5CYII=") left center; background-color: var(--color-bullet-background-color); } diff --git a/frontend/src/app/main/ui/workspace/colorpicker/gradients.scss b/frontend/src/app/main/ui/workspace/colorpicker/gradients.scss index 0fe9529f2..374edaaa7 100644 --- a/frontend/src/app/main/ui/workspace/colorpicker/gradients.scss +++ b/frontend/src/app/main/ui/workspace/colorpicker/gradients.scss @@ -19,7 +19,7 @@ height: 100%; width: 100%; border-radius: $br-6; - background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAADFJREFUOE9jZGBgEAFifOANPknGUQMYhkkYEEgG+NMJKAwIAbwJbdQABnBCIgRoG4gAIF8IsXB/Rs4AAAAASUVORK5CYII=") + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAExJREFUSIljvHnz5n8GLEBNTQ2bMMOtW7ewiuNSz4RVlIpg1IKBt4Dx////WFMRqakFl/qhH0SjFhAELNRKLaNl0Qi2YLQsGrWAcgAA0gAgQPhT2rAAAAAASUVORK5CYII=") left center; } diff --git a/frontend/src/app/main/ui/workspace/colorpicker/slider_selector.scss b/frontend/src/app/main/ui/workspace/colorpicker/slider_selector.scss index aef415df5..3e30ad7ea 100644 --- a/frontend/src/app/main/ui/workspace/colorpicker/slider_selector.scss +++ b/frontend/src/app/main/ui/workspace/colorpicker/slider_selector.scss @@ -54,12 +54,13 @@ } &.opacity { - background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAADFJREFUOE9jZGBgEAFifOANPknGUQMYhkkYEEgG+NMJKAwIAbwJbdQABnBCIgRoG4gAIF8IsXB/Rs4AAAAASUVORK5CYII=") + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAExJREFUSIljvHnz5n8GLEBNTQ2bMMOtW7ewiuNSz4RVlIpg1IKBt4Dx////WFMRqakFl/qhH0SjFhAELNRKLaNl0Qi2YLQsGrWAcgAA0gAgQPhT2rAAAAAASUVORK5CYII=") var(--background-repeat) center; &::after { content: ""; position: absolute; + border-radius: $br-6; width: 100%; height: 100%; background: linear-gradient( -- Gitee From 25cf30e7d3fb6e215c881ca57c1dd76069664fea Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Fri, 8 Mar 2024 13:36:33 +0100 Subject: [PATCH 0010/1266] :bug: Fix possible loop in the list of swappable components --- .../sidebar/options/menus/component.cljs | 36 ++++++++----------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.cljs index 84a888fba..95e80b0b2 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.cljs @@ -7,12 +7,10 @@ (ns app.main.ui.workspace.sidebar.options.menus.component (:require-macros [app.main.style :as stl]) (:require - [app.common.data :as d] [app.common.data.macros :as dm] [app.common.files.helpers :as cfh] [app.common.types.component :as ctk] [app.common.types.file :as ctf] - [app.common.uuid :as uuid] [app.main.data.modal :as modal] [app.main.data.workspace :as dw] [app.main.data.workspace.libraries :as dwl] @@ -296,16 +294,6 @@ (= (:component-id shape-a) (:component-id shape-b))) -;; Get the ids of the components and its root-shapes that are parents of the current shape, to avoid loops -(defn get-parent-component-ids - [objects shape ids] - (let [shape-id (:id shape)] - (if (uuid/zero? shape-id) - ids - (let [ids (if (ctk/instance-head? shape) - (conj ids shape-id (:component-id shape)) - ids)] - (get-parent-component-ids objects (get objects (:parent-id shape)) ids))))) (mf/defc component-swap {::mf/props :obj} @@ -386,13 +374,17 @@ (->> (concat groups components) (sort-by :name))) - parent-components (mf/with-memo [shapes objects] - (into #{} - (comp - (map :parent-id) - (map (d/getf objects)) - (mapcat #(get-parent-component-ids objects % []))) - shapes)) + find-parent-components + (mf/use-fn + (mf/deps objects) + (fn [shape] + (->> (cfh/get-parents objects (:id shape)) + (map :component-id) + (remove nil?)))) + + ;; Get the ids of the components that are parents of the shapes, to avoid loops + parent-components (mapcat find-parent-components shapes) + libraries-options (map (fn [library] {:value (:id library) :label (:name library)}) (vals libraries)) @@ -489,8 +481,10 @@ (let [data (dm/get-in libraries [current-library-id :data]) container (ctf/get-component-page data item) root-shape (ctf/get-component-root data item) - loop? (or (contains? parent-components (:main-instance-id item)) - (contains? parent-components (:id item)))] + components (->> (cfh/get-children-with-self (:objects container) (:id root-shape)) + (keep :component-id) + set) + loop? (some #(contains? components %) parent-components)] [:& component-swap-item {:key (dm/str (:id item)) :item item :loop loop? -- Gitee From 358176c92753444b63f6d7c7881dc9dcc038e67a Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Mon, 11 Mar 2024 16:03:40 +0100 Subject: [PATCH 0011/1266] :bug: Fix project name in sidebar --- frontend/src/app/main/ui/dashboard/sidebar.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/app/main/ui/dashboard/sidebar.scss b/frontend/src/app/main/ui/dashboard/sidebar.scss index c6cea273a..1a5c627e6 100644 --- a/frontend/src/app/main/ui/dashboard/sidebar.scss +++ b/frontend/src/app/main/ui/dashboard/sidebar.scss @@ -239,6 +239,7 @@ .element-title { @include textEllipsis; + width: $s-256; color: var(--sidebar-element-foreground-color); font-size: $fs-14; } -- Gitee From 338b6cdbd60e303ecd1b9d705d2e7524ad4411d2 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 11 Mar 2024 16:01:28 +0100 Subject: [PATCH 0012/1266] :bug: Add tooltip to button in layout --- .../ui/workspace/sidebar/options/menus/layout_container.cljs | 1 + frontend/translations/en.po | 3 +++ frontend/translations/es.po | 3 +++ 3 files changed, 7 insertions(+) diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/layout_container.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/menus/layout_container.cljs index fc31dc4f0..b7a5dde44 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/layout_container.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/layout_container.cljs @@ -480,6 +480,7 @@ [:button {:class (stl/css-case :padding-toggle true :selected (= type :multiple)) + :title (tr "workspace.layout_grid.editor.padding.expand") :data-type (d/name type) :on-click on-type-change'} i/padding-extended]])) diff --git a/frontend/translations/en.po b/frontend/translations/en.po index df15b1c17..d4b3e9527 100644 --- a/frontend/translations/en.po +++ b/frontend/translations/en.po @@ -3520,6 +3520,9 @@ msgstr "Edit grid" msgid "workspace.layout_grid.editor.options.exit" msgstr "Exit" +msgid "workspace.layout_grid.editor.padding.expand" +msgstr "Show 4 sided padding options" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Add" diff --git a/frontend/translations/es.po b/frontend/translations/es.po index 5ce93d9b9..e2072c81d 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -3582,6 +3582,9 @@ msgstr "Editar rejilla" msgid "workspace.layout_grid.editor.options.exit" msgstr "Salir" +msgid "workspace.layout_grid.editor.padding.expand" +msgstr "Mostrar el padding a 4 lados" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Añadir" -- Gitee From 112e71a259acc44a5378b66867c597d98f102ab1 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 11 Mar 2024 16:01:53 +0100 Subject: [PATCH 0013/1266] :bug: Fix propagation of auto/fix sizing on components --- .../data/workspace/libraries_helpers.cljs | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/main/data/workspace/libraries_helpers.cljs b/frontend/src/app/main/data/workspace/libraries_helpers.cljs index 296cd7c92..75fb6945a 100644 --- a/frontend/src/app/main/data/workspace/libraries_helpers.cljs +++ b/frontend/src/app/main/data/workspace/libraries_helpers.cljs @@ -1521,11 +1521,26 @@ (defn- update-flex-child-copy-attrs "Synchronizes the attributes inside the flex-child items (main->copy)" - [changes _shape-main shape-copy main-container main-component copy-container omit-touched?] + [changes shape-main shape-copy main-container main-component copy-container omit-touched?] + (let [new-changes (-> (pcb/empty-changes) (pcb/with-container copy-container) (pcb/with-objects (:objects copy-container)) + + ;; The layout-item-sizing needs to be update when the parent is auto or fix + (pcb/update-shapes + [(:id shape-copy)] + (fn [shape-copy] + (cond-> shape-copy + (contains? #{:auto :fix} (:layout-item-h-sizing shape-main)) + (propagate-attrs shape-main #{:layout-item-h-sizing} omit-touched?) + + (contains? #{:auto :fix} (:layout-item-h-sizing shape-main)) + (propagate-attrs shape-main #{:layout-item-v-sizing} omit-touched?))) + {:ignore-touched true}) + + ;; Update the child flex properties from the parent (pcb/update-shapes (:shapes shape-copy) (fn [child-copy] @@ -1542,6 +1557,20 @@ (-> (pcb/empty-changes) (pcb/with-page main-container) (pcb/with-objects (:objects main-container)) + + ;; The layout-item-sizing needs to be update when the parent is auto or fix + (pcb/update-shapes + [(:id shape-main)] + (fn [shape-main] + (cond-> shape-main + (contains? #{:auto :fix} (:layout-item-h-sizing shape-copy)) + (propagate-attrs shape-copy #{:layout-item-h-sizing} omit-touched?) + + (contains? #{:auto :fix} (:layout-item-h-sizing shape-copy)) + (propagate-attrs shape-copy #{:layout-item-v-sizing} omit-touched?))) + {:ignore-touched true}) + + ;; Updates the children properties from the parent (pcb/update-shapes (:shapes shape-main) (fn [child-main] @@ -1620,4 +1649,3 @@ (if (cfh/page? container) (assoc change :page-id (:id container)) (assoc change :component-id (:id container)))) - -- Gitee From bed13c24dfcb23a510441e964df81444f399a9df Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 11 Mar 2024 16:13:36 +0100 Subject: [PATCH 0014/1266] :bug: Fix problem with comments new line --- frontend/src/app/main/ui/comments.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/app/main/ui/comments.scss b/frontend/src/app/main/ui/comments.scss index ddad36a6b..12890644d 100644 --- a/frontend/src/app/main/ui/comments.scss +++ b/frontend/src/app/main/ui/comments.scss @@ -196,6 +196,7 @@ position: relative; .text { @include bodySmallTypography; + white-space: pre; } } } -- Gitee From de1dae7f9386a88930016cf8e637cd4aaed3d6df Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 11 Mar 2024 16:53:53 +0100 Subject: [PATCH 0015/1266] :bug: Fix problem with input fast change --- .../src/app/main/ui/components/numeric_input.cljs | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/frontend/src/app/main/ui/components/numeric_input.cljs b/frontend/src/app/main/ui/components/numeric_input.cljs index 308ef8e42..54965605e 100644 --- a/frontend/src/app/main/ui/components/numeric_input.cljs +++ b/frontend/src/app/main/ui/components/numeric_input.cljs @@ -152,7 +152,7 @@ handle-key-down (mf/use-fn - (mf/deps set-delta apply-value update-input) + (mf/deps set-delta apply-value update-input parse-value) (fn [event] (mf/set-ref-val! dirty-ref true) (let [up? (kbd/up-arrow? event) @@ -162,19 +162,13 @@ node (mf/ref-val ref)] (when (or up? down?) (set-delta event up? down?)) + (reset! last-value* (parse-value)) (when enter? (dom/blur! node)) (when esc? (update-input value-str) (dom/blur! node))))) - handle-key-up - (mf/use-fn - (mf/deps parse-value) - (fn [] - ;; Store the last value inputed - (reset! last-value* (parse-value)))) - handle-mouse-wheel (mf/use-fn (mf/deps set-delta) @@ -231,7 +225,6 @@ (obj/set! "defaultValue" (fmt/format-number value)) (obj/set! "title" title) (obj/set! "onKeyDown" handle-key-down) - (obj/set! "onKeyUp" handle-key-up) (obj/set! "onBlur" handle-blur) (obj/set! "onFocus" handle-focus))] -- Gitee From 9852558a57eec99298c4502a44bba4e8b726efcc Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 11 Mar 2024 18:11:18 +0100 Subject: [PATCH 0016/1266] :bug: Fix problem when importing templates --- .../src/app/main/ui/dashboard/import.cljs | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/frontend/src/app/main/ui/dashboard/import.cljs b/frontend/src/app/main/ui/dashboard/import.cljs index d51195184..14f0318e3 100644 --- a/frontend/src/app/main/ui/dashboard/import.cljs +++ b/frontend/src/app/main/ui/dashboard/import.cljs @@ -345,18 +345,21 @@ edition* (mf/use-state nil) edition (deref edition*) + template-finished* (mf/use-state nil) + template-finished (deref template-finished*) + on-template-cloned-success (mf/use-fn (fn [] - (swap! status* (constantly :importing)) - ;; (swap! state assoc :status :importing :importing-templates 0) + (reset! status* :importing) + (reset! template-finished* true) (st/emit! (dd/fetch-recent-files)))) on-template-cloned-error (mf/use-fn (fn [cause] - (swap! status* (constantly :error)) - ;; (swap! state assoc :status :error :importing-templates 0) + (reset! status* :error) + (reset! template-finished* true) (errors/print-error! cause) (rx/of (modal/hide) (msg/error (tr "dashboard.libraries-and-templates.import-error"))))) @@ -434,15 +437,29 @@ 1 (count (filterv has-status-success? entries))) - errors? (or (some has-status-error? entries) - (zero? (count entries))) - + errors? (if (some? template) + (= status :error) + (or (some has-status-error? entries) + (zero? (count entries)))) pending-analysis? (some has-status-analyzing? entries) - pending-import? (pos? num-importing) + pending-import? (and (or (nil? template) + (not template-finished)) + (pos? num-importing)) + valid-all-entries? (or (some? template) - (not (some has-status-analyze-error? entries)))] + (not (some has-status-analyze-error? entries))) + + template-status + (cond + (and (= :importing status) pending-import?) + :importing + + (and (= :importing status) (not ^boolean pending-import?)) + :import-finish + :else + :ready)] ;; Run analyze operation on component mount (mf/with-effect [] @@ -486,7 +503,7 @@ :can-be-deleted (> (count entries) 1)}]) (when (some? template) - [:& import-entry {:entry (assoc template :status :ready) + [:& import-entry {:entry (assoc template :status template-status) :can-be-deleted false}])] [:div {:class (stl/css :modal-footer)} -- Gitee From d08dfaa022384de8bc455fa5c3df70ec33a4cb34 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Mon, 11 Mar 2024 17:55:57 +0100 Subject: [PATCH 0017/1266] :bug: Fix reset override behaviour --- frontend/src/app/main/data/workspace/libraries_helpers.cljs | 3 ++- frontend/test/frontend_tests/state_components_sync_test.cljs | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/main/data/workspace/libraries_helpers.cljs b/frontend/src/app/main/data/workspace/libraries_helpers.cljs index 296cd7c92..1fb4cfd1d 100644 --- a/frontend/src/app/main/data/workspace/libraries_helpers.cljs +++ b/frontend/src/app/main/data/workspace/libraries_helpers.cljs @@ -620,7 +620,8 @@ shape-main (when component (if (and reset? components-v2) - (ctf/find-remote-shape container libraries shape-inst) + ;; the reset is against the ref-shape, not against the original shape of the component + (ctf/find-ref-shape file container libraries shape-inst) (ctf/get-ref-shape library component shape-inst))) shape-inst (if (and reset? components-v2) diff --git a/frontend/test/frontend_tests/state_components_sync_test.cljs b/frontend/test/frontend_tests/state_components_sync_test.cljs index 7e74291f8..1751fe9a5 100644 --- a/frontend/test/frontend_tests/state_components_sync_test.cljs +++ b/frontend/test/frontend_tests/state_components_sync_test.cljs @@ -1177,8 +1177,8 @@ (t/is (= (:fill-opacity shape1) 0)) (t/is (= (:name shape2) "Rect 1")) (t/is (= (:touched shape2) nil)) - (t/is (= (:fill-color shape2) clr/white)) - (t/is (= (:fill-opacity shape2) 1)) + (t/is (= (:fill-color shape2) clr/test)) + (t/is (= (:fill-opacity shape2) 0.5)) (t/is (= (:name c-instance2) "Board")) (t/is (= (:touched c-instance2) nil)) -- Gitee From 3fdf0c727e99c2190f735fed57d8cd217f5ad90a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Mon, 11 Mar 2024 11:01:00 +0100 Subject: [PATCH 0018/1266] :bug: Fix comments thread overflowing the viewport and displacing comment bubbles --- .../styles/main/partials/workspace.scss | 20 +++------ frontend/src/app/main/ui/comments.cljs | 42 +++++++++++++++---- frontend/src/app/main/ui/comments.scss | 10 +++++ .../main/ui/workspace/viewport/comments.cljs | 2 + .../main/ui/workspace/viewport/comments.scss | 7 +++- 5 files changed, 56 insertions(+), 25 deletions(-) diff --git a/frontend/resources/styles/main/partials/workspace.scss b/frontend/resources/styles/main/partials/workspace.scss index 5288b7475..a387fed48 100644 --- a/frontend/resources/styles/main/partials/workspace.scss +++ b/frontend/resources/styles/main/partials/workspace.scss @@ -152,16 +152,6 @@ $height-palette-max: 80px; } } -// .workspace-loader { -// display: flex; -// justify-content: center; -// align-items: center; - -// svg { -// fill: $color-gray-50; -// } -// } - .workspace-content { background-color: $color-canvas; display: flex; @@ -242,20 +232,22 @@ $height-palette-max: 80px; .viewport-overlays { cursor: initial; - height: 100%; overflow: hidden; pointer-events: none; position: absolute; - width: 100%; + top: 0; + left: 0; + bottom: 0; + right: 0; z-index: 10; .pixel-overlay { - height: 100%; left: 0; pointer-events: initial; position: absolute; top: 0; - width: 100%; + right: 0; + bottom: 0; z-index: 1; } } diff --git a/frontend/src/app/main/ui/comments.cljs b/frontend/src/app/main/ui/comments.cljs index 9cb417b8f..c1c1b5685 100644 --- a/frontend/src/app/main/ui/comments.cljs +++ b/frontend/src/app/main/ui/comments.cljs @@ -355,22 +355,41 @@ [thread-id] (l/derived (l/in [:comments thread-id]) st/state)) +(defn- offset-position [position viewport zoom bubble-margin] + (let [base-x (+ (* (:x position) zoom) (:offset-x viewport)) + base-y (+ (* (:y position) zoom) (:offset-y viewport)) + w (:width viewport) + h (:height viewport) + comment-width 284 ;; TODO: this is the width set via CSS in an outer container… + ;; We should probably do this in a different way. + orientation-left? (>= (+ base-x comment-width (:x bubble-margin)) w) + orientation-top? (>= base-y (/ h 2)) + h-dir (if orientation-left? :left :right) + v-dir (if orientation-top? :top :bottom) + x (:x position) + y (:y position)] + {:x x :y y :h-dir h-dir :v-dir v-dir})) + (mf/defc thread-comments {::mf/wrap [mf/memo]} - [{:keys [thread zoom users origin position-modifier]}] + [{:keys [thread zoom users origin position-modifier viewport]}] (let [ref (mf/use-ref) - - thread-id (:id thread) thread-pos (:position thread) - pos (cond-> thread-pos + base-pos (cond-> thread-pos (some? position-modifier) (gpt/transform position-modifier)) - pos-x (+ (* (:x pos) zoom) 24) - pos-y (- (* (:y pos) zoom) 28) + max-height (int (* (:height viewport) 0.75)) + ;; We should probably look for a better way of doing this. + bubble-margin {:x 24 :y 0} + pos (offset-position base-pos viewport zoom bubble-margin) + margin-x (* (:x bubble-margin) (if (= (:h-dir pos) :left) -1 1)) + margin-y (* (:y bubble-margin) (if (= (:v-dir pos) :top) -1 1)) + pos-x (+ (* (:x pos) zoom) margin-x) + pos-y (- (* (:y pos) zoom) margin-y) comments-ref (mf/with-memo [thread-id] (make-comments-ref thread-id)) @@ -393,9 +412,14 @@ (dom/scroll-into-view-if-needed! node))) (when (some? comment) - [:div {:class (stl/css :thread-content) - :style {:top (str pos-y "px") - :left (str pos-x "px")} + [:div {:class (stl/css-case :thread-content true + :thread-content-left (= (:h-dir pos) :left) + :thread-content-top (= (:v-dir pos) :top)) + :id (str "thread-" thread-id) + :style {:left (str pos-x "px") + :top (str pos-y "px") + :max-height max-height + :overflow-y "scroll"} :on-click dom/stop-propagation} [:div {:class (stl/css :comments)} diff --git a/frontend/src/app/main/ui/comments.scss b/frontend/src/app/main/ui/comments.scss index ddad36a6b..368ed4824 100644 --- a/frontend/src/app/main/ui/comments.scss +++ b/frontend/src/app/main/ui/comments.scss @@ -139,6 +139,9 @@ padding: $s-12; border-radius: $br-8; background-color: var(--comment-modal-background-color); + --translate-x: 0%; + --translate-y: 0%; + transform: translate(var(--translate-x), var(--translate-y)); .comments { display: flex; flex-direction: column; @@ -146,6 +149,13 @@ } } +.thread-content-left { + --translate-x: -100%; +} +.thread-content-top { + --translate-y: -100%; +} + // comment-item .comment-container { diff --git a/frontend/src/app/main/ui/workspace/viewport/comments.cljs b/frontend/src/app/main/ui/workspace/viewport/comments.cljs index ca842d1c6..f75559b5e 100644 --- a/frontend/src/app/main/ui/workspace/viewport/comments.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/comments.cljs @@ -84,6 +84,7 @@ (when (seq (dcm/apply-filters local profile [thread])) [:& cmt/thread-comments {:thread (update-position positions thread) :users users + :viewport {:offset-x pos-x :offset-y pos-y :width (:width vport) :height (:height vport)} :zoom zoom}]))) (when-let [draft (:comment drawing)] @@ -91,3 +92,4 @@ :on-cancel on-draft-cancel :on-submit on-draft-submit :zoom zoom}])]]])) + diff --git a/frontend/src/app/main/ui/workspace/viewport/comments.scss b/frontend/src/app/main/ui/workspace/viewport/comments.scss index ee56bc948..9c587d596 100644 --- a/frontend/src/app/main/ui/workspace/viewport/comments.scss +++ b/frontend/src/app/main/ui/workspace/viewport/comments.scss @@ -15,10 +15,13 @@ pointer-events: none; overflow: hidden; user-select: text; + position: absolute; } .threads { position: absolute; - top: $s-0; - left: $s-0; + top: 0; + left: 0; + right: 0; + bottom: 0; } -- Gitee From 343efc68c5599643c7f8df0172f6792726e86137 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 12 Mar 2024 09:11:06 +0100 Subject: [PATCH 0019/1266] :bug: Propagate parent changes con reset overrides --- frontend/src/app/main/data/workspace/libraries.cljs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index c27c00b0f..448997208 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -708,11 +708,18 @@ components-v2 (features/active-feature? state "components/v2") + shape-inst (ctn/get-shape container id) + swap-slot (-> (ctn/get-shape container id) + (ctk/get-swap-slot)) changes (-> (pcb/empty-changes it) (pcb/with-container container) (pcb/with-objects (:objects container)) - (dwlh/generate-sync-shape-direct file-full libraries container id true components-v2))] + (dwlh/generate-sync-shape-direct file-full libraries container id true components-v2) + (cond-> + (some? swap-slot) + ;; We need to propagate parent changes + (dwlh/generate-sync-shape-direct file-full libraries container (:parent-id shape-inst) true components-v2)))] (log/debug :msg "RESET-COMPONENT finished" :js/rchanges (log-changes (:redo-changes changes) -- Gitee From 56bc70dffecc3ff980c184ab0e9a8fd8694f8ed5 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 12 Mar 2024 12:43:42 +0100 Subject: [PATCH 0020/1266] :bug: Fix restore component --- frontend/src/app/main/data/workspace/libraries_helpers.cljs | 3 --- frontend/src/app/main/data/workspace/selection.cljs | 2 ++ 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/main/data/workspace/libraries_helpers.cljs b/frontend/src/app/main/data/workspace/libraries_helpers.cljs index 296cd7c92..8f3def937 100644 --- a/frontend/src/app/main/data/workspace/libraries_helpers.cljs +++ b/frontend/src/app/main/data/workspace/libraries_helpers.cljs @@ -263,9 +263,6 @@ parent (get-in page [:objects parent-id]) main-inst (get-in component [:objects (:main-instance-id component)]) inside-component? (some? (ctn/get-instance-root (:objects page) parent)) - origin-frame (get-in page [:objects (:frame-id main-inst)]) - ;; We are using a deleted component andit's coordenates are absolute, we must adjust them to its containing frame to adjust the delta - delta (gpt/subtract delta (-> origin-frame :selrect gpt/point)) shapes (cfh/get-children-with-self (:objects component) (:main-instance-id component)) shapes (map #(gsh/move % delta) shapes) diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index 15d3d5ab4..bf1d68e44 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -433,6 +433,8 @@ main-component (ctf/get-component libraries file-id component-id) moved-component (gsh/move component-root delta) pos (gpt/point (:x moved-component) (:y moved-component)) + origin-frame (get-in page [:objects frame-id]) + delta (gpt/subtract delta (-> origin-frame :selrect gpt/point)) instantiate-component #(dwlh/generate-instantiate-component changes -- Gitee From d478a7d8d92e6c0f2ba634f4e3d444c88ad713e2 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Tue, 12 Mar 2024 13:05:51 +0100 Subject: [PATCH 0021/1266] :bug: Fix project name too long --- frontend/src/app/main/ui/dashboard/grid.scss | 2 +- .../src/app/main/ui/dashboard/projects.cljs | 79 ++++++++++--------- .../src/app/main/ui/dashboard/projects.scss | 13 ++- 3 files changed, 54 insertions(+), 40 deletions(-) diff --git a/frontend/src/app/main/ui/dashboard/grid.scss b/frontend/src/app/main/ui/dashboard/grid.scss index 3108fa656..a8c812c92 100644 --- a/frontend/src/app/main/ui/dashboard/grid.scss +++ b/frontend/src/app/main/ui/dashboard/grid.scss @@ -18,7 +18,7 @@ $thumbnail-default-height: $s-168; // Default width } .grid-row { - display: flex; + display: grid; width: 100%; gap: $s-24; } diff --git a/frontend/src/app/main/ui/dashboard/projects.cljs b/frontend/src/app/main/ui/dashboard/projects.cljs index 82bbe0378..9135ca83b 100644 --- a/frontend/src/app/main/ui/dashboard/projects.cljs +++ b/frontend/src/app/main/ui/dashboard/projects.cljs @@ -276,7 +276,8 @@ (fn [event] (when (kbd/enter? event) (dom/stop-propagation event) - (on-menu-click event))))] + (on-menu-click event)))) + title-width (/ 100 limit)] [:article {:class (stl/css-case :dashboard-project-row true :first first?)} [:header {:class (stl/css :project)} @@ -285,46 +286,52 @@ [:& inline-edition {:content (:name project) :on-end on-edit}] [:h2 {:on-click on-nav + :style {:max-width (str title-width "%")} + :class (stl/css :project-name) + :title (if (:is-default project) + (tr "labels.drafts") + (:name project)) :on-context-menu on-menu-click} (if (:is-default project) (tr "labels.drafts") (:name project))]) - [:& project-menu - {:project project - :show? (:menu-open @local) - :left (+ 24 (:x (:menu-pos @local))) - :top (:y (:menu-pos @local)) - :on-edit on-edit-open - :on-menu-close on-menu-close - :on-import on-import}] - - [:span {:class (stl/css :info)} (str (tr "labels.num-of-files" (i18n/c file-count)))] - - (let [time (-> (:modified-at project) - (dt/timeago {:locale locale}))] - [:span {:class (stl/css :recent-files-row-title-info)} (str ", " time)]) - - [:div {:class (stl/css :project-actions)} - (when-not (:is-default project) - [:> pin-button* {:class (stl/css :pin-button) :is-pinned (:is-pinned project) :on-click toggle-pin :tab-index 0}]) - - [:button {:class (stl/css :btn-secondary :btn-small :tooltip :tooltip-bottom) - :on-click on-create-click - :alt (tr "dashboard.new-file") - :aria-label (tr "dashboard.new-file") - :data-test "project-new-file" - :on-key-down handle-create-click} - i/add] - - [:button - {:class (stl/css :btn-secondary :btn-small :tooltip :tooltip-bottom) - :on-click on-menu-click - :alt (tr "dashboard.options") - :aria-label (tr "dashboard.options") - :data-test "project-options" - :on-key-down handle-menu-click} - i/menu]]]] + [:div {:class (stl/css :info-wrapper)} + [:& project-menu + {:project project + :show? (:menu-open @local) + :left (+ 24 (:x (:menu-pos @local))) + :top (:y (:menu-pos @local)) + :on-edit on-edit-open + :on-menu-close on-menu-close + :on-import on-import}] + + [:span {:class (stl/css :info)} (str (tr "labels.num-of-files" (i18n/c file-count)))] + + (let [time (-> (:modified-at project) + (dt/timeago {:locale locale}))] + [:span {:class (stl/css :recent-files-row-title-info)} (str ", " time)]) + + [:div {:class (stl/css :project-actions)} + (when-not (:is-default project) + [:> pin-button* {:class (stl/css :pin-button) :is-pinned (:is-pinned project) :on-click toggle-pin :tab-index 0}]) + + [:button {:class (stl/css :btn-secondary :btn-small) + :on-click on-create-click + :title (tr "dashboard.new-file") + :aria-label (tr "dashboard.new-file") + :data-test "project-new-file" + :on-key-down handle-create-click} + i/add] + + [:button + {:class (stl/css :btn-secondary :btn-small) + :on-click on-menu-click + :title (tr "dashboard.options") + :aria-label (tr "dashboard.options") + :data-test "project-options" + :on-key-down handle-menu-click} + i/menu]]]]] [:div {:class (stl/css :grid-container) :ref rowref} [:& line-grid diff --git a/frontend/src/app/main/ui/dashboard/projects.scss b/frontend/src/app/main/ui/dashboard/projects.scss index 13204f3d5..aa1be237a 100644 --- a/frontend/src/app/main/ui/dashboard/projects.scss +++ b/frontend/src/app/main/ui/dashboard/projects.scss @@ -48,6 +48,7 @@ display: flex; align-items: center; justify-content: flex-start; + width: 100%; min-height: $s-32; margin-left: $s-8; } @@ -57,7 +58,8 @@ padding: $s-8; } - h2 { + .project-name { + @include textEllipsis; cursor: pointer; font-size: $fs-16; line-height: 0.8; @@ -65,8 +67,13 @@ color: $df-primary; margin-right: $s-4; margin-right: $s-12; + width: fit-content; + } + .info-wrapper { + display: flex; + align-items: center; + gap: $s-8; } - .info, .recent-files-row-title-info { font-size: $fs-14; @@ -80,7 +87,7 @@ .project-actions { display: flex; - opacity: 1; + opacity: 0; margin-left: $s-32; .btn-small:not(.pin-button) { -- Gitee From c865a1bdfda85954a57ed689865434a2ce746cb4 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Tue, 12 Mar 2024 14:04:06 +0100 Subject: [PATCH 0022/1266] :recycle: Refactor project header css --- .../src/app/main/ui/dashboard/projects.cljs | 43 ++-- .../src/app/main/ui/dashboard/projects.scss | 202 +++++++++--------- 2 files changed, 122 insertions(+), 123 deletions(-) diff --git a/frontend/src/app/main/ui/dashboard/projects.cljs b/frontend/src/app/main/ui/dashboard/projects.cljs index 9135ca83b..931ac0604 100644 --- a/frontend/src/app/main/ui/dashboard/projects.cljs +++ b/frontend/src/app/main/ui/dashboard/projects.cljs @@ -40,6 +40,12 @@ (def ^:private close-icon (i/icon-xref :close (stl/css :close-icon))) +(def ^:private add-icon + (i/icon-xref :add (stl/css :add-icon))) + +(def ^:private menu-icon + (i/icon-xref :menu (stl/css :menu-icon))) + (mf/defc header {::mf/wrap [mf/memo]} [] @@ -312,26 +318,26 @@ (dt/timeago {:locale locale}))] [:span {:class (stl/css :recent-files-row-title-info)} (str ", " time)]) - [:div {:class (stl/css :project-actions)} + [:div {:class (stl/css-case :project-actions true + :pinned-project (:is-pinned project))} (when-not (:is-default project) [:> pin-button* {:class (stl/css :pin-button) :is-pinned (:is-pinned project) :on-click toggle-pin :tab-index 0}]) - [:button {:class (stl/css :btn-secondary :btn-small) + [:button {:class (stl/css :add-file-btn) :on-click on-create-click :title (tr "dashboard.new-file") :aria-label (tr "dashboard.new-file") :data-test "project-new-file" :on-key-down handle-create-click} - i/add] + add-icon] - [:button - {:class (stl/css :btn-secondary :btn-small) - :on-click on-menu-click - :title (tr "dashboard.options") - :aria-label (tr "dashboard.options") - :data-test "project-options" - :on-key-down handle-menu-click} - i/menu]]]]] + [:button {:class (stl/css :options-btn) + :on-click on-menu-click + :title (tr "dashboard.options") + :aria-label (tr "dashboard.options") + :data-test "project-options" + :on-key-down handle-menu-click} + menu-icon]]]]] [:div {:class (stl/css :grid-container) :ref rowref} [:& line-grid @@ -343,14 +349,13 @@ (when (and (> limit 0) (> file-count limit)) - [:button - {:class (stl/css :show-more) - :on-click on-nav - :tab-index "0" - :on-key-down (fn [event] - (when (kbd/enter? event) - (on-nav)))} - [:div {:class (stl/css :placeholder-label)} (tr "dashboard.show-all-files")] + [:button {:class (stl/css :show-more) + :on-click on-nav + :tab-index "0" + :on-key-down (fn [event] + (when (kbd/enter? event) + (on-nav)))} + [:span {:class (stl/css :placeholder-label)} (tr "dashboard.show-all-files")] show-more-icon])])) diff --git a/frontend/src/app/main/ui/dashboard/projects.scss b/frontend/src/app/main/ui/dashboard/projects.scss index aa1be237a..735f4e7ee 100644 --- a/frontend/src/app/main/ui/dashboard/projects.scss +++ b/frontend/src/app/main/ui/dashboard/projects.scss @@ -9,135 +9,129 @@ .dashboard-container { flex: 1 0 0; + width: 100%; margin-right: $s-16; + border-top: $s-1 solid var(--panel-border-color); overflow-y: auto; - width: 100%; - border-top: $s-1 solid $db-quaternary; +} - &.dashboard-projects { - user-select: none; - } - &.dashboard-shared { - width: calc(100vw - $s-320); - margin-right: $s-52; - } +.dashboard-projects { + user-select: none; +} - &.search { - margin-top: $s-12; - } +.dashboard-shared { + width: calc(100vw - $s-320); + margin-right: $s-52; +} + +.search { + margin-top: $s-12; } .dashboard-project-row { + --actions-opacity: 0; margin-bottom: $s-24; position: relative; - .project { - align-items: center; - border-radius: $br-4; - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - margin-top: $s-16; - padding: $s-8 $s-8 $s-8 $s-16; - width: 99%; - max-height: $s-40; - gap: $s-8; - - .project-name-wrapper { - display: flex; - align-items: center; - justify-content: flex-start; - width: 100%; - min-height: $s-32; - margin-left: $s-8; - } - - .btn-secondary { - border: none; - padding: $s-8; - } + &:hover, + &:focus, + &:focus-within { + --actions-opacity: 1; + } +} - .project-name { - @include textEllipsis; - cursor: pointer; - font-size: $fs-16; - line-height: 0.8; - font-weight: $fw400; - color: $df-primary; - margin-right: $s-4; - margin-right: $s-12; - width: fit-content; - } - .info-wrapper { - display: flex; - align-items: center; - gap: $s-8; - } - .info, - .recent-files-row-title-info { - font-size: $fs-14; - line-height: 1.15; - font-weight: $fw400; - color: $df-secondary; - @media (max-width: 760px) { - display: none; - } - } +.pinned-project { + --actions-opacity: 1; +} - .project-actions { - display: flex; - opacity: 0; - margin-left: $s-32; +.project { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + gap: $s-8; + width: 99%; + max-height: $s-40; + padding: $s-8 $s-8 $s-8 $s-16; + margin-top: $s-16; + border-radius: $br-4; +} - .btn-small:not(.pin-button) { - height: $s-32; - margin: 0 $s-8; - width: $s-32; +.project-name-wrapper { + display: flex; + align-items: center; + justify-content: flex-start; + width: 100%; + min-height: $s-32; + margin-left: $s-8; +} - &:not(:hover) { - background: transparent; - } - svg { - fill: $df-primary; - height: $s-16; - width: $s-16; - } - } - } - } +.project-name { + @include bodyLargeTypography; + @include textEllipsis; + width: fit-content; + margin-right: $s-12; + line-height: 0.8; + color: var(--title-foreground-color-hover); + cursor: pointer; +} - .grid-container { - width: 100%; - padding: 0 $s-4; - } +.info-wrapper { + display: flex; + align-items: center; + gap: $s-8; +} - &:hover, - &:focus, - &:focus-within { - .project-actions { - opacity: 1; - } +.info, +.recent-files-row-title-info { + @include bodyMediumTypography; + color: var(--title-foreground-color); + @media (max-width: 760px) { + display: none; } } -.show-more { +.project-actions { display: flex; - align-items: center; - column-gap: $s-12; + opacity: var(--actions-opacity); + margin-left: $s-32; +} - color: $df-secondary; - font-size: $fs-14; - justify-content: space-between; - cursor: pointer; - background-color: transparent; - border: none; +.add-file-btn, +.options-btn { + @extend .button-tertiary; + height: $s-32; + width: $s-32; + margin: 0 $s-8; + padding: $s-8; +} + +.add-icon, +.menu-icon { + @extend .button-icon; + stroke: var(--icon-foreground); +} + +.grid-container { + width: 100%; + padding: 0 $s-4; +} + +.show-more { + --show-more-color: var(--button-secondary-foreground-color-rest); + @include buttonStyle; + @include bodyMediumTypography; position: absolute; top: $s-8; right: $s-52; + display: flex; + align-items: center; + justify-content: space-between; + column-gap: $s-12; + color: var(--show-more-color); &:hover { - color: $da-tertiary; + --show-more-color: var(--button-secondary-foreground-color-active); } } @@ -145,7 +139,7 @@ height: $s-16; width: $s-16; fill: none; - stroke: currentColor; + stroke: var(--show-more-color); } // Team hero -- Gitee From 37859a20a640ff7b0a691e5d32001d1f822d05b6 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Tue, 12 Mar 2024 14:04:41 +0100 Subject: [PATCH 0023/1266] :bug: Recover lost wrap icon --- .../icons/{wrap-refactor.svg => wrap.svg} | 0 .../main/partials/debug-icons-preview.scss | 3 +-- frontend/src/app/main/ui/icons.cljs | 26 ++++++------------- 3 files changed, 9 insertions(+), 20 deletions(-) rename frontend/resources/images/icons/{wrap-refactor.svg => wrap.svg} (100%) diff --git a/frontend/resources/images/icons/wrap-refactor.svg b/frontend/resources/images/icons/wrap.svg similarity index 100% rename from frontend/resources/images/icons/wrap-refactor.svg rename to frontend/resources/images/icons/wrap.svg diff --git a/frontend/resources/styles/main/partials/debug-icons-preview.scss b/frontend/resources/styles/main/partials/debug-icons-preview.scss index 763485890..4b72bd0a7 100644 --- a/frontend/resources/styles/main/partials/debug-icons-preview.scss +++ b/frontend/resources/styles/main/partials/debug-icons-preview.scss @@ -61,8 +61,7 @@ .cursor-item div, .icon-item-old svg { - fill: #aab5ba; - stroke: none; + stroke: #aab5ba; } .cursor-item { diff --git a/frontend/src/app/main/ui/icons.cljs b/frontend/src/app/main/ui/icons.cljs index ec9712471..002ef71a8 100644 --- a/frontend/src/app/main/ui/icons.cljs +++ b/frontend/src/app/main/ui/icons.cljs @@ -284,24 +284,14 @@ {::mf/wrap-props false} [] (let [entries (->> (seq (js/Object.entries default)) - (sort-by first)) - refactor? (fn [[key]] (str/ends-with? key "Refactor"))] - [:* - [:section.debug-icons-preview - [:h2.subtitle-old "Classic (Deprecated)"] - (for [[key val] (remove refactor? entries)] - [:div.icon-item-old {:key key - :title key} - val - [:span key]])] - - [:section.debug-icons-preview - [:h2 "Refactor"] - (for [[key val] (filter refactor? entries)] - [:div.icon-item {:key key - :title key} - val - [:span key]])]])) + (sort-by first))] + [:section.debug-icons-preview + [:h2 "icons"] + (for [[key val] entries] + [:div.icon-item-old {:key key + :title key} + val + [:span key]])])) (defn key->icon [icon-key] -- Gitee From a3bfeace736c6369072c427e74f53c7dbb49d0fc Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Tue, 12 Mar 2024 14:10:47 +0100 Subject: [PATCH 0024/1266] :bug: Fix search icon on dhasboard --- .../resources/styles/common/refactor/common-dashboard.scss | 6 ++++-- frontend/src/app/main/ui/dashboard/placeholder.scss | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/frontend/resources/styles/common/refactor/common-dashboard.scss b/frontend/resources/styles/common/refactor/common-dashboard.scss index 5404d5630..79ffa2542 100644 --- a/frontend/resources/styles/common/refactor/common-dashboard.scss +++ b/frontend/resources/styles/common/refactor/common-dashboard.scss @@ -95,12 +95,14 @@ cursor: pointer; svg { - fill: $df-secondary; + stroke: $df-secondary; + fill: none; width: $s-16; height: $s-16; &:hover { - fill: $da-tertiary; + stroke: $da-tertiary; + fill: none; } } } diff --git a/frontend/src/app/main/ui/dashboard/placeholder.scss b/frontend/src/app/main/ui/dashboard/placeholder.scss index 6f05ba000..f2a37fbf0 100644 --- a/frontend/src/app/main/ui/dashboard/placeholder.scss +++ b/frontend/src/app/main/ui/dashboard/placeholder.scss @@ -23,7 +23,8 @@ svg { width: $s-64; height: $s-64; - fill: $df-secondary; + stroke: $df-secondary; + fill: none; } } -- Gitee From 3bbf97fde9e5ccc527a2a96341e19826e3c356e8 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Tue, 12 Mar 2024 17:19:40 +0100 Subject: [PATCH 0025/1266] :bug: Fix invitation badge colors --- .../styles/common/refactor/design-tokens.scss | 32 +++++----- frontend/src/app/main/ui/dashboard/team.cljs | 20 ++---- frontend/src/app/main/ui/dashboard/team.scss | 19 ------ .../src/app/main/ui/notifications/badge.cljs | 27 ++++++++ .../src/app/main/ui/notifications/badge.scss | 64 +++++++++++++++++++ .../app/main/ui/workspace/sidebar/layers.cljs | 4 +- .../app/main/ui/workspace/sidebar/layers.scss | 10 --- .../main/ui/workspace/sidebar/sitemap.cljs | 6 +- .../main/ui/workspace/sidebar/sitemap.scss | 16 +---- 9 files changed, 121 insertions(+), 77 deletions(-) create mode 100644 frontend/src/app/main/ui/notifications/badge.cljs create mode 100644 frontend/src/app/main/ui/notifications/badge.scss diff --git a/frontend/resources/styles/common/refactor/design-tokens.scss b/frontend/resources/styles/common/refactor/design-tokens.scss index 4049cc42e..a1527bf05 100644 --- a/frontend/resources/styles/common/refactor/design-tokens.scss +++ b/frontend/resources/styles/common/refactor/design-tokens.scss @@ -315,7 +315,13 @@ --modal-navigator-foreground-color-rest: var(--color-background-quaternary); --modal-navigator-foreground-color-active: var(--color-accent-primary); - // ALERTS NOTIFICATION TOAST & STATUS WIDGET + // ALERTS, NOTIFICATION, TOAST & BADGES + + --alert-background-color-default: var(--color-background-primary); + --alert-text-foreground-color-default: var(--color-foreground-primary); + --alert-icon-foreground-color-default: var(--color-foreground-primary); + --alert-border-color-default: var(--color-background-quaternary); + --alert-background-color-success: var(--color-success-background); --alert-text-foreground-color-success: var(--color-foreground-primary); --alert-icon-foreground-color-success: var(--color-success-foreground); @@ -336,26 +342,20 @@ --alert-icon-foreground-color-info: var(--color-info-foreground); --alert-border-color-info: var(--color-info-foreground); - --alert-background-color-default: var(--color-background-primary); - --alert-text-foreground-color-default: var(--color-foreground-primary); - --alert-icon-foreground-color-default: var(--color-foreground-primary); - --alert-border-color-default: var(--color-background-quaternary); + --alert-text-foreground-color-focus: var(--color-accent-primary); + --alert-border-color-focus: var(--color-accent-primary); - --notification-background-color-success: var(); - --notification-foreground-color-success: var(); - --notification-border-color-success: var(); --notification-foreground-color-default: var(--color-foreground-secondary); + --element-foreground-warning: var(--status-color-warning-500); + --element-foreground-error: var(--status-color-error-500); + + // STATUS WIDGET --status-widget-background-color-success: var(--status-color-success-500); --status-widget-background-color-warning: var(--status-color-warning-500); --status-widget-background-color-pending: var(--status-color-pending-500); --status-widget-background-color-error: var(--status-color-error-500); - --status-widget-icon-foreground-color: var(--color-background-primary); // TODO review - - --element-foreground-success: var(--status-color-success-500); - --element-foreground-warning: var(--status-color-warning-500); - --element-foreground-pending: var(--status-color-info-500); - --element-foreground-error: var(--status-color-error-500); + --status-widget-icon-foreground-color: var(--color-background-primary); // INTERFACE ELEMENTS --search-bar-background-color: var(--color-background-primary); @@ -370,9 +370,6 @@ --pill-background-color: var(--color-background-tertiary); --pill-foreground-color: var(--color-foreground-primary); - --tag-background-color: var(--color-accent-primary); - --tag-background-color-disabled: var(--color-foreground-primary); - --link-foreground-color: var(--color-accent-primary); --resize-area-background-color: var(--color-background-primary); @@ -382,6 +379,7 @@ --dashboard-list-background-color: var(--color-background-tertiary); --dashboard-list-foreground-color: var(--color-foreground-primary); --dashboard-list-text-foreground-color: var(--color-foreground-secondary); + --flow-tag-background-color: var(--color-background-tertiary); --flow-tag-foreground-color: var(--color-foreground-secondary); --flow-tag-background-color-hover: var(--color-background-quaternary); diff --git a/frontend/src/app/main/ui/dashboard/team.cljs b/frontend/src/app/main/ui/dashboard/team.cljs index adc63664c..76652e98a 100644 --- a/frontend/src/app/main/ui/dashboard/team.cljs +++ b/frontend/src/app/main/ui/dashboard/team.cljs @@ -24,6 +24,7 @@ [app.main.ui.dashboard.change-owner] [app.main.ui.dashboard.team-form] [app.main.ui.icons :as i] + [app.main.ui.notifications.badge :refer [badge-notification]] [app.main.ui.notifications.context-notification :refer [context-notification]] [app.util.dom :as dom] [app.util.i18n :as i18n :refer [tr]] @@ -551,19 +552,6 @@ :on-click on-change'} (tr "labels.editor")]]]])) -(mf/defc invitation-status-badge - {::mf/wrap-props false} - [{:keys [status]}] - [:div - {:class (stl/css-case - :status-badge true - :badge-expired (= status :expired) - :badge-pending (= status :pending))} - [:span {:class (stl/css :status-label)} - (if (= status :expired) - (tr "labels.expired-invitation") - (tr "labels.pending-invitation"))]]) - (mf/defc invitation-actions {::mf/wrap-props false} [{:keys [invitation team-id]}] @@ -668,6 +656,10 @@ email (:email invitation) role (:role invitation) status (if expired? :expired :pending) + type (if expired? :warning :default) + badge-content (if (= status :expired) + (tr "labels.expired-invitation") + (tr "labels.pending-invitation")) on-change-role (mf/use-fn @@ -688,7 +680,7 @@ :on-change on-change-role}]] [:div {:class (stl/css :table-field :field-status)} - [:& invitation-status-badge {:status status}]] + [:& badge-notification {:type type :content badge-content}]] [:div {:class (stl/css :table-field :field-actions)} (when can-invite? diff --git a/frontend/src/app/main/ui/dashboard/team.scss b/frontend/src/app/main/ui/dashboard/team.scss index c5d67a027..e79a69f63 100644 --- a/frontend/src/app/main/ui/dashboard/team.scss +++ b/frontend/src/app/main/ui/dashboard/team.scss @@ -322,25 +322,6 @@ align-items: center; } -// STATUS BADGE -.status-badge { - @include flexCenter; - @include headlineSmallTypography; - min-width: $s-76; - width: fit-content; - height: $s-24; - border-radius: $br-8; - color: var(--pill-foreground-color); -} - -.badge-pending { - background-color: var(--status-widget-background-color-warning); -} - -.badge-expired { - background-color: var(--tag-background-color-disabled); -} - .invitations-dropdown { bottom: calc(-1 * $s-112); right: calc(-1 * $s-20); diff --git a/frontend/src/app/main/ui/notifications/badge.cljs b/frontend/src/app/main/ui/notifications/badge.cljs new file mode 100644 index 000000000..e6e6c449e --- /dev/null +++ b/frontend/src/app/main/ui/notifications/badge.cljs @@ -0,0 +1,27 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.main.ui.notifications.badge + (:require-macros [app.main.style :as stl]) + (:require + [rumext.v2 :as mf])) + +(mf/defc badge-notification + "They are persistent, informative and non-actionable. + They are small messages in specific areas off the app" + + {::mf/props :obj} + [{:keys [type content size is-focus] :as props}] + + [:aside {:class (stl/css-case :badge-notification true + :warning (= type :warning) + :error (= type :error) + :success (= type :success) + :info (= type :info) + :small (= size :small) + :focus is-focus)} + content]) + diff --git a/frontend/src/app/main/ui/notifications/badge.scss b/frontend/src/app/main/ui/notifications/badge.scss new file mode 100644 index 000000000..b98a5ee88 --- /dev/null +++ b/frontend/src/app/main/ui/notifications/badge.scss @@ -0,0 +1,64 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. +// +// Copyright (c) KALEIDOS INC + +@import "refactor/common-refactor.scss"; + +.badge-notification { + @include smallTitleTipography; + --badge-notification-bg-color: var(--alert-background-color-default); + --badge-notification-fg-color: var(--alert-text-foreground-color-default); + --badge-notification-border-color: var(--alert-border-color-default); + box-sizing: border-box; + display: grid; + place-items: center; + grid-template-columns: 1fr; + min-height: $s-32; + height: fit-content; + min-width: $s-80; + width: fit-content; + padding: 0; + margin: 0; + border: $s-1 solid var(--badge-notification-border-color); + border-radius: $br-8; + background-color: var(--badge-notification-bg-color); + color: var(--badge-notification-fg-color); +} + +.small { + @include bodySmallTypography; + min-height: $s-20; + border-radius: $br-6; +} + +.warning { + --badge-notification-bg-color: var(--alert-background-color-warning); + --badge-notification-fg-color: var(--alert-text-foreground-color-warning); + --badge-notification-border-color: var(--alert-border-color-warning); +} + +.success { + --badge-notification-bg-color: var(--alert-background-color-success); + --badge-notification-fg-color: var(--alert-text-foreground-color-success); + --badge-notification-border-color: var(--alert-border-color-success); +} + +.info { + --badge-notification-bg-color: var(--alert-background-color-info); + --badge-notification-fg-color: var(--alert-text-foreground-color-info); + --badge-notification-border-color: var(--alert-border-color-info); +} + +.error { + --badge-notification-bg-color: var(--alert-background-color-error); + --badge-notification-fg-color: var(--alert-text-foreground-color-error); + --badge-notification-border-color: var(--alert-border-color-error); +} + +.focus { + --badge-notification-bg-color: transparent; + --badge-notification-fg-color: var(--alert-text-foreground-color-focus); + --badge-notification-border-color: var(--alert-border-color-focus); +} diff --git a/frontend/src/app/main/ui/workspace/sidebar/layers.cljs b/frontend/src/app/main/ui/workspace/sidebar/layers.cljs index c3f927e04..5d3f5da5d 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/layers.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/layers.cljs @@ -19,6 +19,7 @@ [app.main.ui.components.title-bar :refer [title-bar]] [app.main.ui.hooks :as hooks] [app.main.ui.icons :as i] + [app.main.ui.notifications.badge :refer [badge-notification]] [app.main.ui.workspace.sidebar.layer-item :refer [layer-item]] [app.util.dom :as dom] [app.util.globals :as globals] @@ -513,8 +514,7 @@ (or title (tr "workspace.sidebar.layers"))] [:div {:class (stl/css :focus-mode-tag-wrapper)} - [:div {:class (stl/css :focus-mode-tag)} - (tr "workspace.focus.focus-mode")]]]] + [:& badge-notification {:content (tr "workspace.focus.focus-mode") :size :small :is-focus true}]]]] (filter-component)) diff --git a/frontend/src/app/main/ui/workspace/sidebar/layers.scss b/frontend/src/app/main/ui/workspace/sidebar/layers.scss index 422f72c19..4c0823ddf 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/layers.scss +++ b/frontend/src/app/main/ui/workspace/sidebar/layers.scss @@ -122,16 +122,6 @@ margin-right: $s-12; } -.focus-mode-tag { - @include flexCenter; - @include bodySmallTypography; - height: $s-20; - padding: $s-4 $s-6; - border: $s-1 solid var(--tag-background-color); - border-radius: $br-6; - color: var(--tag-background-color); -} - .active-filters { @include flexRow; flex-wrap: wrap; diff --git a/frontend/src/app/main/ui/workspace/sidebar/sitemap.cljs b/frontend/src/app/main/ui/workspace/sidebar/sitemap.cljs index 73977a797..975615048 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/sitemap.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/sitemap.cljs @@ -17,6 +17,7 @@ [app.main.ui.context :as ctx] [app.main.ui.hooks :as hooks] [app.main.ui.icons :as i] + [app.main.ui.notifications.badge :refer [badge-notification]] [app.util.dom :as dom] [app.util.i18n :as i18n :refer [tr]] [app.util.keyboard :as kbd] @@ -218,8 +219,9 @@ :class (stl/css :title-spacing-sitemap)} (if ^boolean read-only? - [:div {:class (stl/css :view-only-mode)} - (tr "labels.view-only")] + [:& badge-notification {:is-focus true + :size :small + :content (tr "labels.view-only")}] [:button {:class (stl/css :add-page) :on-click on-create} i/add])] diff --git a/frontend/src/app/main/ui/workspace/sidebar/sitemap.scss b/frontend/src/app/main/ui/workspace/sidebar/sitemap.scss index a02e38df3..1363ea1c5 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/sitemap.scss +++ b/frontend/src/app/main/ui/workspace/sidebar/sitemap.scss @@ -33,17 +33,6 @@ } } -.view-only-mode { - @include flexCenter; - @include bodySmallTypography; - height: $s-20; - padding: $s-4 $s-6; - margin-right: $s-12; - border: $s-1 solid var(--tag-background-color); - border-radius: $br-6; - color: var(--tag-background-color); -} - .resize-area { position: absolute; bottom: calc(-1 * $s-8); @@ -236,6 +225,7 @@ } .title-spacing-sitemap { - padding-left: $s-8; - margin-top: $s-8; + padding-inline-start: $s-8; + margin-block-start: $s-8; + padding-inline-end: $s-20; } -- Gitee From 786513863b887278be75fa724486810b687de0ba Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 12 Mar 2024 11:55:40 +0100 Subject: [PATCH 0026/1266] :bug: Fix problem with duplicate in main component --- common/src/app/common/types/component.cljc | 10 ++++++++++ frontend/src/app/main/data/workspace/selection.cljs | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/common/src/app/common/types/component.cljc b/common/src/app/common/types/component.cljc index 70b030eaf..205454d71 100644 --- a/common/src/app/common/types/component.cljc +++ b/common/src/app/common/types/component.cljc @@ -240,3 +240,13 @@ (distinct) (filter #(not (eq % (get comp1 %) (get comp2 %)))) set))) + +(defn allow-duplicate? + [objects shape] + + (let [parent (get objects (:parent-id shape))] + ;; We don't want to change the structure of component copies + (and (not (in-component-copy-not-head? shape)) + ;; Non instance, non copy. We allow + (or (not (instance-head? shape)) + (not (in-component-copy? parent)))))) diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index 15d3d5ab4..eb5e9e168 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -709,8 +709,8 @@ (let [page (wsh/lookup-page state) objects (:objects page) selected (->> (wsh/lookup-selected state) - (map #(get objects %)) - (remove #(ctk/in-component-copy-not-root? %)) ;; We don't want to change the structure of component copies + (map (d/getf objects)) + (filter #(ctk/allow-duplicate? objects %)) (map :id) set)] (when (seq selected) -- Gitee From 8128171d8e2eb5289605b555c6245ff4bd5c08c5 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 12 Mar 2024 17:34:24 +0100 Subject: [PATCH 0027/1266] :bug: Fix problem with complementary colors slider in picker --- .../app/main/ui/workspace/colorpicker/harmony.cljs | 14 +++++++++++--- .../ui/workspace/colorpicker/slider_selector.scss | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/colorpicker/harmony.cljs b/frontend/src/app/main/ui/workspace/colorpicker/harmony.cljs index 7ca720bd2..361a51f7e 100644 --- a/frontend/src/app/main/ui/workspace/colorpicker/harmony.cljs +++ b/frontend/src/app/main/ui/workspace/colorpicker/harmony.cljs @@ -8,6 +8,7 @@ (:require-macros [app.main.style :as stl]) (:require [app.common.colors :as cc] + [app.common.data.macros :as dm] [app.common.geom.point :as gpt] [app.common.math :as mth] [app.main.ui.workspace.colorpicker.slider-selector :refer [slider-selector]] @@ -118,17 +119,24 @@ :h new-hue :s saturation}))) - on-change-opacity (fn [new-alpha] (on-change {:alpha new-alpha}))] + on-change-opacity (fn [new-alpha] (on-change {:alpha new-alpha})) + + ;; This colors are to display the value slider + [h1 s1 l1] (cc/hsv->hsl [hue saturation 0]) + [h2 s2 l2] (cc/hsv->hsl [hue saturation 255])] (mf/use-effect (mf/deps canvas-ref) (fn [] (when canvas-ref (create-color-wheel (mf/ref-val canvas-ref))))) - [:div {:class (stl/css :harmony-selector)} + + [:div {:class (stl/css :harmony-selector) + :style {"--hue-from" (dm/str "hsl(" h1 ", " (* s1 100) "%, " (* l1 100) "%)") + "--hue-to" (dm/str "hsl(" h2 ", " (* s2 100) "%, " (* l2 100) "%)")}} [:div {:class (stl/css :handlers-wrapper)} [:& slider-selector {:type :value :vertical? true - :reverse? true + :reverse? false :value value :max-value 255 :vertical true diff --git a/frontend/src/app/main/ui/workspace/colorpicker/slider_selector.scss b/frontend/src/app/main/ui/workspace/colorpicker/slider_selector.scss index 3e30ad7ea..7de62cbef 100644 --- a/frontend/src/app/main/ui/workspace/colorpicker/slider_selector.scss +++ b/frontend/src/app/main/ui/workspace/colorpicker/slider_selector.scss @@ -107,7 +107,7 @@ } .slider-selector.value { - background: linear-gradient(var(--gradient-direction), #000 0%, #fff 100%); + background: linear-gradient(var(--gradient-direction), var(--hue-from, #000) 0%, var(--hue-to, #fff) 100%); } .slider-selector.saturation { background: linear-gradient( -- Gitee From 3b0148046bc5dac7c3f323f82644357e45e12233 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Tue, 12 Mar 2024 15:10:23 +0100 Subject: [PATCH 0028/1266] :bug: Fix horizontal scroll bar in comments --- frontend/src/app/main/ui/comments.scss | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/frontend/src/app/main/ui/comments.scss b/frontend/src/app/main/ui/comments.scss index 095e14294..2b10eb9e5 100644 --- a/frontend/src/app/main/ui/comments.scss +++ b/frontend/src/app/main/ui/comments.scss @@ -98,8 +98,12 @@ } .content { + position: relative; @include bodySmallTypography; color: var(--color-foreground-primary); + word-wrap: break-word; + overflow-wrap: break-word; + hyphens: auto; } .replies { @@ -203,13 +207,6 @@ } } } - .content { - position: relative; - .text { - @include bodySmallTypography; - white-space: pre; - } - } } .comment-options-dropdown { @extend .dropdown-wrapper; @@ -233,7 +230,6 @@ height: 100%; width: 100%; max-width: $s-260; - min-width: $s-260; margin-bottom: $s-8; padding: $s-8; color: var(--input-foreground-color-active); -- Gitee From 8ee79e5d7c51a1cf1204355135f442aac383d7ee Mon Sep 17 00:00:00 2001 From: Aitor Date: Tue, 12 Mar 2024 15:18:42 +0100 Subject: [PATCH 0029/1266] :bug: Fix viewer background visible on transition between frames --- .../src/app/main/ui/viewer/interactions.cljs | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/frontend/src/app/main/ui/viewer/interactions.cljs b/frontend/src/app/main/ui/viewer/interactions.cljs index 8d5fd829f..9fc794f60 100644 --- a/frontend/src/app/main/ui/viewer/interactions.cljs +++ b/frontend/src/app/main/ui/viewer/interactions.cljs @@ -316,18 +316,37 @@ [animation current-viewport orig-viewport current-size orig-size wrapper-size] (case (:animation-type animation) + ;; Why use three keyframes instead of two? + ;; If we use two keyframes, the first frame + ;; will disappear while the second frame + ;; is still appearing. + ;; ___ ___ + ;; \/ + ;; ___/\___ + ;; ^ in here we have 50% opacity of both frames so the background + ;; is visible. + ;; + ;; This solution waits until the second frame + ;; has appeared to disappear the first one. + ;; ________ + ;; /\ + ;; _/ \___ + ;; ^ in here we have 100% opacity of the first frame and 0% opacity. :dissolve (do (dom/animate! orig-viewport [#js {:opacity "100%"} - #js {:opacity "0"}] - #js {:duration (:duration animation) - :easing (name (:easing animation))} - #(st/emit! (dv/complete-animation))) + #js {:opacity "0%"} + #js {:opacity "0%"}] + #js {:delay (/ (:duration animation) 3) + :duration (/ (* 2 (:duration animation)) 3) + :easing (name (:easing animation))}) (dom/animate! current-viewport - [#js {:opacity "0"} + [#js {:opacity "0%"} + #js {:opacity "100%"} #js {:opacity "100%"}] #js {:duration (:duration animation) - :easing (name (:easing animation))})) + :easing (name (:easing animation))} + #(st/emit! (dv/complete-animation)))) :slide (case (:way animation) -- Gitee From 76b75192e799368843ef8caadb30a6231f035f90 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Tue, 12 Mar 2024 14:36:09 +0100 Subject: [PATCH 0030/1266] :bug: Fix crash copy paste a Copy --- common/src/app/common/types/file.cljc | 11 ++++++++++- frontend/src/app/main/data/workspace/selection.cljs | 9 ++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/common/src/app/common/types/file.cljc b/common/src/app/common/types/file.cljc index 676db6dc7..a060fe634 100644 --- a/common/src/app/common/types/file.cljc +++ b/common/src/app/common/types/file.cljc @@ -215,6 +215,15 @@ (some find-ref-shape-in-head (ctn/get-parent-heads (:objects container) shape)))) +(defn find-original-ref-shape + "Recursively call to find-ref-shape until find the original shape of the original component" + [file container libraries shape & options] + (let [ref-shape (find-ref-shape file container libraries shape options)] + (if (nil? (:shape-ref ref-shape)) + ref-shape + (find-original-ref-shape file container libraries ref-shape options)))) + + (defn find-ref-component "Locate the nearest component in the local file or libraries that is referenced by the instance shape." @@ -303,7 +312,7 @@ (vals (:objects component))))) ;; Return true if the object is a component that exists on the file or its libraries (even a deleted one) -(defn is-known-component? +(defn is-main-of-known-component? [shape libraries] (let [main-instance? (ctk/main-instance? shape) component-id (:component-id shape) diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index 15d3d5ab4..7f4cc84ca 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -466,7 +466,7 @@ (nil? obj) changes - (ctf/is-known-component? obj libraries) + (ctf/is-main-of-known-component? obj libraries) (prepare-duplicate-component-change changes objects page obj parent-id frame-id delta libraries library-data it) :else @@ -484,6 +484,9 @@ (ctk/instance-root? obj)) duplicating-component? (or duplicating-component? (ctk/instance-head? obj)) is-component-main? (ctk/main-instance? obj) + + original-ref-shape (-> (ctf/find-original-ref-shape nil page libraries obj {:include-deleted? true}) + :id) into-component? (and duplicating-component? (ctn/in-any-component? objects parent)) @@ -514,6 +517,10 @@ (cond-> (or frame? group? bool?) (assoc :shapes [])) + (cond-> (and (some? original-ref-shape) + (not= original-ref-shape (:shape-ref obj))) + (assoc :shape-ref original-ref-shape)) + (gsh/move delta) (d/update-when :interactions #(ctsi/remap-interactions % ids-map objects)) -- Gitee From f8c416c5aeabac014d4b632361e84fae6fc84bbe Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Tue, 12 Mar 2024 21:34:45 +0100 Subject: [PATCH 0031/1266] :bug: Fixes the folders in the Swap pannel appear weird on mixed --- .../app/main/ui/workspace/sidebar/options/menus/component.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.cljs index 3cb70d94f..49c077daa 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.cljs @@ -275,7 +275,7 @@ (defn- find-common-path ([components] - (let [paths (map (comp cfh/last-path :path) components)] + (let [paths (map (comp cfh/split-path :path) components)] (find-common-path paths [] 0))) ([paths path n] (let [current (nth (first paths) n nil)] -- Gitee From d4fb85bb02a335cce1de1898896a199bc5f46f92 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 13 Mar 2024 09:44:51 +0100 Subject: [PATCH 0032/1266] :bug: Fix problem with language update --- frontend/src/app/main/ui/settings/options.cljs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/main/ui/settings/options.cljs b/frontend/src/app/main/ui/settings/options.cljs index efef14923..2586559bd 100644 --- a/frontend/src/app/main/ui/settings/options.cljs +++ b/frontend/src/app/main/ui/settings/options.cljs @@ -24,12 +24,16 @@ (s/def ::options-form (s/keys :opt-un [::lang ::theme])) +(defn- on-success + [profile] + (st/emit! (msg/success (tr "notifications.profile-saved")) + (du/profile-fetched profile))) + (defn- on-submit [form _event] (let [data (:clean-data @form)] (st/emit! (du/update-profile data) - (du/persist-profile) - (msg/success (tr "notifications.profile-saved"))))) + (du/persist-profile {:on-success on-success})))) (mf/defc options-form {::mf/wrap-props false} -- Gitee From 98b41a5bff800c9ce30ad11749973b61de21a52f Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Wed, 13 Mar 2024 09:57:12 +0100 Subject: [PATCH 0033/1266] :bug: Fix assets group name when is too long --- .../src/app/main/ui/components/title_bar.scss | 25 ++++--------------- .../ui/workspace/sidebar/assets/groups.scss | 1 - 2 files changed, 5 insertions(+), 21 deletions(-) diff --git a/frontend/src/app/main/ui/components/title_bar.scss b/frontend/src/app/main/ui/components/title_bar.scss index 2ff458ded..43de2b42c 100644 --- a/frontend/src/app/main/ui/components/title_bar.scss +++ b/frontend/src/app/main/ui/components/title_bar.scss @@ -20,9 +20,10 @@ .title-only, .inspect-title { @include uppercaseTitleTipography; - display: flex; + display: grid; align-items: center; - flex-grow: 1; + justify-content: flex-start; + grid-auto-flow: column; height: 100%; min-height: $s-32; color: var(--title-foreground-color); @@ -30,7 +31,8 @@ } .title-only { - margin-left: $s-8; + --title-bar-title-margin: #{$s-8}; + margin-inline-start: var(--title-bar-title-margin); } .inspect-title { @@ -66,23 +68,6 @@ } } -.title, -.title-only { - @include uppercaseTitleTipography; - display: flex; - align-items: center; - flex-grow: 1; - height: 100%; - min-height: $s-32; - color: var(--title-foreground-color); - overflow: hidden; -} - -.title-only { - --title-bar-title-margin: #{$s-8}; - margin-inline-start: var(--title-bar-title-margin); -} - .title-only-icon-gap { --title-bar-title-margin: #{$s-12}; } diff --git a/frontend/src/app/main/ui/workspace/sidebar/assets/groups.scss b/frontend/src/app/main/ui/workspace/sidebar/assets/groups.scss index 52634fee3..aeafdfeca 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/assets/groups.scss +++ b/frontend/src/app/main/ui/workspace/sidebar/assets/groups.scss @@ -18,7 +18,6 @@ .path { @include textEllipsis; - max-width: 90%; margin-left: $s-2; text-transform: initial; color: var(--title-foreground-color-hover); -- Gitee From 16c8c3483f3051cf9b9d33033d6418803ce9ff47 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Wed, 13 Mar 2024 10:18:19 +0100 Subject: [PATCH 0034/1266] :bug: Change view only message --- frontend/src/app/main/ui/workspace/viewport/top_bar.cljs | 2 +- frontend/translations/en.po | 4 ++-- frontend/translations/es.po | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/viewport/top_bar.cljs b/frontend/src/app/main/ui/workspace/viewport/top_bar.cljs index a7937e670..0c7d6b01b 100644 --- a/frontend/src/app/main/ui/workspace/viewport/top_bar.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/top_bar.cljs @@ -31,7 +31,7 @@ [:div {:class (stl/css :viewport-actions-container)} [:div {:class (stl/css :viewport-actions-title)} [:& i18n/tr-html {:tag-name "span" - :label "workspace.top-bar.read-only"}]] + :label "workspace.top-bar.view-only"}]] [:button {:class (stl/css :done-btn) :on-click handle-close-view-mode} (tr "workspace.top-bar.read-only.done")]]])) diff --git a/frontend/translations/en.po b/frontend/translations/en.po index d4b3e9527..a894c3360 100644 --- a/frontend/translations/en.po +++ b/frontend/translations/en.po @@ -5063,8 +5063,8 @@ msgid "workspace.viewport.click-to-close-path" msgstr "Click to close the path" #, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Inspect mode** (View Only)" +msgid "workspace.top-bar.view-only" +msgstr "**Inspecting mode** (View Only)" msgid "workspace.top-bar.read-only.done" msgstr "Done" diff --git a/frontend/translations/es.po b/frontend/translations/es.po index e2072c81d..7656b949d 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -5148,7 +5148,7 @@ msgid "workspace.viewport.click-to-close-path" msgstr "Pulsar para cerrar la ruta" #, markdown -msgid "workspace.top-bar.read-only" +msgid "workspace.top-bar.view-only" msgstr "**Modo inspección** (View only)" msgid "workspace.top-bar.read-only.done" -- Gitee From e2412b3d437910eb458f544820d7d28a33ab4f68 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Wed, 13 Mar 2024 11:05:48 +0100 Subject: [PATCH 0035/1266] :bug: Fix draft grid columns --- frontend/src/app/main/ui/dashboard/grid.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/src/app/main/ui/dashboard/grid.scss b/frontend/src/app/main/ui/dashboard/grid.scss index a8c812c92..72f95e4ec 100644 --- a/frontend/src/app/main/ui/dashboard/grid.scss +++ b/frontend/src/app/main/ui/dashboard/grid.scss @@ -19,6 +19,8 @@ $thumbnail-default-height: $s-168; // Default width .grid-row { display: grid; + grid-auto-flow: column; + grid-auto-columns: calc($s-12 + var(--th-width, #{$thumbnail-default-width})); width: 100%; gap: $s-24; } -- Gitee From f525c6df5e9785df9b534b6de1b5308084627699 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 6 Mar 2024 23:48:17 +0100 Subject: [PATCH 0036/1266] :sparkles: Improve internal naming of setup/props --- backend/src/app/auth/oidc.clj | 11 +++++----- backend/src/app/http.clj | 3 ++- backend/src/app/http/access_token.clj | 3 ++- backend/src/app/http/awsns.clj | 5 +++-- backend/src/app/http/client.clj | 4 ++-- backend/src/app/http/debug.clj | 3 ++- backend/src/app/http/session.clj | 5 +++-- backend/src/app/loggers/audit.clj | 13 ++++++------ backend/src/app/main.clj | 18 ++++++++-------- backend/src/app/rpc.clj | 5 +++-- backend/src/app/rpc/commands/access_token.clj | 5 +++-- backend/src/app/rpc/commands/auth.clj | 21 ++++++++++--------- backend/src/app/rpc/commands/ldap.clj | 3 ++- backend/src/app/rpc/commands/profile.clj | 5 +++-- backend/src/app/rpc/commands/teams.clj | 5 +++-- backend/src/app/rpc/commands/verify_token.clj | 3 ++- backend/src/app/setup.clj | 9 ++++---- backend/src/app/tasks/telemetry.clj | 5 +++-- 18 files changed, 70 insertions(+), 56 deletions(-) diff --git a/backend/src/app/auth/oidc.clj b/backend/src/app/auth/oidc.clj index 243c08da5..e1a22288c 100644 --- a/backend/src/app/auth/oidc.clj +++ b/backend/src/app/auth/oidc.clj @@ -22,6 +22,7 @@ [app.loggers.audit :as audit] [app.main :as-alias main] [app.rpc.commands.profile :as profile] + [app.setup :as-alias setup] [app.tokens :as tokens] [app.util.json :as json] [app.util.time :as dt] @@ -413,7 +414,7 @@ ::props])) (defn get-info - [{:keys [provider ::main/props] :as cfg} {:keys [params] :as request}] + [{:keys [provider ::setup/props] :as cfg} {:keys [params] :as request}] (when-let [error (get params :error)] (ex/raise :type :internal :code :error-on-retrieving-code @@ -508,7 +509,7 @@ (if profile (let [sxf (session/create-fn cfg (:id profile)) token (or (:invitation-token info) - (tokens/generate (::main/props cfg) + (tokens/generate (::setup/props cfg) {:iss :auth :exp (dt/in-future "15m") :profile-id (:id profile)})) @@ -536,7 +537,7 @@ :iss :prepared-register :is-active true :exp (dt/in-future {:hours 48})) - token (tokens/generate (::main/props cfg) info) + token (tokens/generate (::setup/props cfg) info) params (d/without-nils {:token token :fullname (:fullname info)}) @@ -551,7 +552,7 @@ (defn- auth-handler [cfg {:keys [params] :as request}] (let [props (audit/extract-utm-params params) - state (tokens/generate (::main/props cfg) + state (tokens/generate (::setup/props cfg) {:iss :oauth :invitation-token (:invitation-token params) :props props @@ -618,7 +619,7 @@ [_] (s/keys :req [::session/manager ::http/client - ::main/props + ::setup/props ::db/pool ::providers])) diff --git a/backend/src/app/http.clj b/backend/src/app/http.clj index 1e605cdb0..a696d5477 100644 --- a/backend/src/app/http.clj +++ b/backend/src/app/http.clj @@ -23,6 +23,7 @@ [app.metrics :as mtx] [app.rpc :as-alias rpc] [app.rpc.doc :as-alias rpc.doc] + [app.setup :as-alias setup] [clojure.spec.alpha :as s] [integrant.core :as ig] [promesa.exec :as px] @@ -136,7 +137,7 @@ ::rpc/routes ::rpc.doc/routes ::oidc/routes - ::main/props + ::setup/props ::assets/routes ::debug/routes ::db/pool diff --git a/backend/src/app/http/access_token.clj b/backend/src/app/http/access_token.clj index bfddbb42d..0d1865f10 100644 --- a/backend/src/app/http/access_token.clj +++ b/backend/src/app/http/access_token.clj @@ -10,6 +10,7 @@ [app.config :as cf] [app.db :as db] [app.main :as-alias main] + [app.setup :as-alias setup] [app.tokens :as tokens] [ring.request :as rreq])) @@ -42,7 +43,7 @@ (defn- wrap-soft-auth "Soft Authentication, will be executed synchronously on the undertow worker thread." - [handler {:keys [::main/props]}] + [handler {:keys [::setup/props]}] (letfn [(handle-request [request] (try (let [token (get-token request) diff --git a/backend/src/app/http/awsns.clj b/backend/src/app/http/awsns.clj index 7508be8a2..88060bb20 100644 --- a/backend/src/app/http/awsns.clj +++ b/backend/src/app/http/awsns.clj @@ -13,6 +13,7 @@ [app.db.sql :as sql] [app.http.client :as http] [app.main :as-alias main] + [app.setup :as-alias setup] [app.tokens :as tokens] [app.worker :as-alias wrk] [clojure.spec.alpha :as s] @@ -30,7 +31,7 @@ (defmethod ig/pre-init-spec ::routes [_] (s/keys :req [::http/client - ::main/props + ::setup/props ::db/pool])) (defmethod ig/init-key ::routes @@ -106,7 +107,7 @@ [cfg headers] (let [tdata (get headers "x-penpot-data")] (when-not (str/empty? tdata) - (let [result (tokens/verify (::main/props cfg) {:token tdata :iss :profile-identity})] + (let [result (tokens/verify (::setup/props cfg) {:token tdata :iss :profile-identity})] (:profile-id result))))) (defn- parse-notification diff --git a/backend/src/app/http/client.clj b/backend/src/app/http/client.clj index 5b4a8541c..9ef4cc4b2 100644 --- a/backend/src/app/http/client.clj +++ b/backend/src/app/http/client.clj @@ -55,8 +55,8 @@ convention." ([cfg-or-client request] (let [client (resolve-client cfg-or-client)] - (send! client request {}))) + (send! client request {:sync? true}))) ([cfg-or-client request options] (let [client (resolve-client cfg-or-client)] - (send! client request options)))) + (send! client request (merge {:sync? true} options))))) diff --git a/backend/src/app/http/debug.clj b/backend/src/app/http/debug.clj index 1d2a129cf..a453c6872 100644 --- a/backend/src/app/http/debug.clj +++ b/backend/src/app/http/debug.clj @@ -20,6 +20,7 @@ [app.rpc.commands.auth :as auth] [app.rpc.commands.files-create :refer [create-file]] [app.rpc.commands.profile :as profile] + [app.setup :as-alias setup] [app.srepl.helpers :as srepl] [app.storage :as-alias sto] [app.storage.tmp :as tmp] @@ -340,7 +341,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defn- resend-email-notification - [{:keys [::db/pool ::main/props] :as cfg} {:keys [params] :as request}] + [{:keys [::db/pool ::setup/props] :as cfg} {:keys [params] :as request}] (when-not (contains? params :force) (ex/raise :type :validation diff --git a/backend/src/app/http/session.clj b/backend/src/app/http/session.clj index 7ff6dfa01..c4a3f0ba6 100644 --- a/backend/src/app/http/session.clj +++ b/backend/src/app/http/session.clj @@ -15,6 +15,7 @@ [app.db.sql :as sql] [app.http.session.tasks :as-alias tasks] [app.main :as-alias main] + [app.setup :as-alias setup] [app.tokens :as tokens] [app.util.time :as dt] [clojure.spec.alpha :as s] @@ -138,7 +139,7 @@ (declare ^:private gen-token) (defn create-fn - [{:keys [::manager ::main/props]} profile-id] + [{:keys [::manager ::setup/props]} profile-id] (us/assert! ::manager manager) (us/assert! ::us/uuid profile-id) @@ -196,7 +197,7 @@ (neg? (compare default-renewal-max-age elapsed))))) (defn- wrap-soft-auth - [handler {:keys [::manager ::main/props]}] + [handler {:keys [::manager ::setup/props]}] (us/assert! ::manager manager) (letfn [(handle-request [request] (try diff --git a/backend/src/app/loggers/audit.clj b/backend/src/app/loggers/audit.clj index 45c36334a..aead09110 100644 --- a/backend/src/app/loggers/audit.clj +++ b/backend/src/app/loggers/audit.clj @@ -24,6 +24,7 @@ [app.main :as-alias main] [app.rpc :as-alias rpc] [app.rpc.retry :as rtry] + [app.setup :as-alias setup] [app.tokens :as tokens] [app.util.services :as-alias sv] [app.util.time :as dt] @@ -261,7 +262,7 @@ (s/def ::tasks/uri ::us/string) (defmethod ig/pre-init-spec ::tasks/archive-task [_] - (s/keys :req [::db/pool ::main/props ::http.client/client])) + (s/keys :req [::db/pool ::setup/props ::http.client/client])) (defmethod ig/init-key ::tasks/archive [_ cfg] @@ -287,7 +288,7 @@ (px/sleep 100) (recur (+ total ^long n))) (when (pos? total) - (l/debug :hint "events archived" :total total))))))))) + (l/dbg :hint "events archived" :total total))))))))) (def ^:private sql:retrieve-batch-of-audit-log "select * @@ -322,7 +323,7 @@ :context])) (send [events] - (let [token (tokens/generate (::main/props cfg) + (let [token (tokens/generate (::setup/props cfg) {:iss "authentication" :iat (dt/now) :uid uuid/zero}) @@ -331,11 +332,11 @@ "origin" (cf/get :public-uri) "cookie" (u/map->query-string {:auth-token token})} params {:uri uri - :timeout 6000 + :timeout 12000 :method :post :headers headers :body body} - resp (http.client/req! cfg params {:sync? true})] + resp (http.client/req! cfg params)] (if (= (:status resp) 204) true (do @@ -355,7 +356,7 @@ (map row->event)) events (into [] xform rows)] (when-not (empty? events) - (l/trace :hint "archive events chunk" :uri uri :events (count events)) + (l/trc :hint "archive events chunk" :uri uri :events (count events)) (when (send events) (mark-as-archived conn rows) (count events))))))) diff --git a/backend/src/app/main.clj b/backend/src/app/main.clj index 47e43f5cf..e0177110f 100644 --- a/backend/src/app/main.clj +++ b/backend/src/app/main.clj @@ -221,7 +221,7 @@ {::db/pool (ig/ref ::db/pool)} ::http.awsns/routes - {::props (ig/ref ::setup/props) + {::setup/props (ig/ref ::setup/props) ::db/pool (ig/ref ::db/pool) ::http.client/client (ig/ref ::http.client/client)} @@ -262,7 +262,7 @@ ::oidc/routes {::http.client/client (ig/ref ::http.client/client) ::db/pool (ig/ref ::db/pool) - ::props (ig/ref ::setup/props) + ::setup/props (ig/ref ::setup/props) ::oidc/providers {:google (ig/ref ::oidc.providers/google) :github (ig/ref ::oidc.providers/github) :gitlab (ig/ref ::oidc.providers/gitlab) @@ -274,7 +274,7 @@ ::db/pool (ig/ref ::db/pool) ::rpc/routes (ig/ref ::rpc/routes) ::rpc.doc/routes (ig/ref ::rpc.doc/routes) - ::props (ig/ref ::setup/props) + ::setup/props (ig/ref ::setup/props) ::mtx/routes (ig/ref ::mtx/routes) ::oidc/routes (ig/ref ::oidc/routes) ::http.debug/routes (ig/ref ::http.debug/routes) @@ -286,7 +286,7 @@ {::db/pool (ig/ref ::db/pool) ::session/manager (ig/ref ::session/manager) ::sto/storage (ig/ref ::sto/storage) - ::props (ig/ref ::setup/props)} + ::setup/props (ig/ref ::setup/props)} ::http.ws/routes {::db/pool (ig/ref ::db/pool) @@ -322,7 +322,7 @@ ::rpc/climit (ig/ref ::rpc/climit) ::rpc/rlimit (ig/ref ::rpc/rlimit) ::setup/templates (ig/ref ::setup/templates) - ::props (ig/ref ::setup/props)} + ::setup/props (ig/ref ::setup/props)} :app.rpc.doc/routes {:methods (ig/ref :app.rpc/methods)} @@ -331,7 +331,7 @@ {::rpc/methods (ig/ref :app.rpc/methods) ::db/pool (ig/ref ::db/pool) ::session/manager (ig/ref ::session/manager) - ::props (ig/ref ::setup/props)} + ::setup/props (ig/ref ::setup/props)} ::wrk/registry {::mtx/metrics (ig/ref ::mtx/metrics) @@ -388,7 +388,7 @@ :app.tasks.telemetry/handler {::db/pool (ig/ref ::db/pool) ::http.client/client (ig/ref ::http.client/client) - ::props (ig/ref ::setup/props)} + ::setup/props (ig/ref ::setup/props)} [::srepl/urepl ::srepl/server] {::srepl/port (cf/get :urepl-port 6062) @@ -402,7 +402,7 @@ ::setup/props {::db/pool (ig/ref ::db/pool) - ::key (cf/get :secret-key) + ::setup/key (cf/get :secret-key) ;; NOTE: this dependency is only necessary for proper initialization ordering, props ;; module requires the migrations to run before initialize. @@ -412,7 +412,7 @@ {} ::audit.tasks/archive - {::props (ig/ref ::setup/props) + {::setup/props (ig/ref ::setup/props) ::db/pool (ig/ref ::db/pool) ::http.client/client (ig/ref ::http.client/client)} diff --git a/backend/src/app/rpc.clj b/backend/src/app/rpc.clj index 8ae7a38d6..ea49b6b70 100644 --- a/backend/src/app/rpc.clj +++ b/backend/src/app/rpc.clj @@ -27,6 +27,7 @@ [app.rpc.helpers :as rph] [app.rpc.retry :as retry] [app.rpc.rlimit :as rlimit] + [app.setup :as-alias setup] [app.storage :as-alias sto] [app.util.services :as sv] [app.util.time :as dt] @@ -248,7 +249,7 @@ ::ldap/provider ::sto/storage ::mtx/metrics - ::main/props] + ::setup/props] :opt [::climit ::rlimit])) @@ -265,7 +266,7 @@ (defmethod ig/pre-init-spec ::routes [_] (s/keys :req [::methods ::db/pool - ::main/props + ::setup/props ::session/manager])) (defmethod ig/init-key ::routes diff --git a/backend/src/app/rpc/commands/access_token.clj b/backend/src/app/rpc/commands/access_token.clj index dd10f3371..06a6e516c 100644 --- a/backend/src/app/rpc/commands/access_token.clj +++ b/backend/src/app/rpc/commands/access_token.clj @@ -13,6 +13,7 @@ [app.rpc :as-alias rpc] [app.rpc.doc :as-alias doc] [app.rpc.quotes :as quotes] + [app.setup :as-alias setup] [app.tokens :as tokens] [app.util.services :as sv] [app.util.time :as dt] @@ -23,7 +24,7 @@ (dissoc row :perms)) (defn create-access-token - [{:keys [::db/conn ::main/props]} profile-id name expiration] + [{:keys [::db/conn ::setup/props]} profile-id name expiration] (let [created-at (dt/now) token-id (uuid/next) token (tokens/generate props {:iss "access-token" @@ -47,7 +48,7 @@ [{:keys [::db/pool] :as system} profile-id name expiration] (db/with-atomic [conn pool] (let [props (:app.setup/props system)] - (create-access-token {::db/conn conn ::main/props props} + (create-access-token {::db/conn conn ::setup/props props} profile-id name expiration)))) diff --git a/backend/src/app/rpc/commands/auth.clj b/backend/src/app/rpc/commands/auth.clj index 8e9671e59..e87979007 100644 --- a/backend/src/app/rpc/commands/auth.clj +++ b/backend/src/app/rpc/commands/auth.clj @@ -26,6 +26,7 @@ [app.rpc.commands.teams :as teams] [app.rpc.doc :as-alias doc] [app.rpc.helpers :as rph] + [app.setup :as-alias setup] [app.tokens :as tokens] [app.util.services :as sv] [app.util.time :as dt] @@ -88,7 +89,7 @@ (profile/strip-private-attrs)) invitation (when-let [token (:invitation-token params)] - (tokens/verify (::main/props cfg) {:token token :iss :team-invitation})) + (tokens/verify (::setup/props cfg) {:token token :iss :team-invitation})) ;; If invitation member-id does not matches the profile-id, we just proceed to ignore the ;; invitation because invitations matches exactly; and user can't login with other email and @@ -133,7 +134,7 @@ (defn recover-profile [{:keys [::db/pool] :as cfg} {:keys [token password]}] (letfn [(validate-token [token] - (let [tdata (tokens/verify (::main/props cfg) {:token token :iss :password-recovery})] + (let [tdata (tokens/verify (::setup/props cfg) {:token token :iss :password-recovery})] (:profile-id tdata))) (update-password [conn profile-id] @@ -170,7 +171,7 @@ :code :registration-disabled))) (when (contains? params :invitation-token) - (let [invitation (tokens/verify (::main/props cfg) {:token (:invitation-token params) :iss :team-invitation})] + (let [invitation (tokens/verify (::setup/props cfg) {:token (:invitation-token params) :iss :team-invitation})] (when-not (= (:email params) (:member-email invitation)) (ex/raise :type :restriction :code :email-does-not-match-invitation @@ -233,7 +234,7 @@ params (d/without-nils params) - token (tokens/generate (::main/props cfg) params)] + token (tokens/generate (::setup/props cfg) params)] (with-meta {:token token} {::audit/profile-id uuid/zero}))) @@ -340,7 +341,7 @@ (defn register-profile [{:keys [::db/conn] :as cfg} {:keys [token fullname] :as params}] - (let [claims (tokens/verify (::main/props cfg) {:token token :iss :prepared-register}) + (let [claims (tokens/verify (::setup/props cfg) {:token token :iss :prepared-register}) params (-> claims (into params) (assoc :fullname fullname)) @@ -357,7 +358,7 @@ (create-profile-rels! conn)))) invitation (when-let [token (:invitation-token params)] - (tokens/verify (::main/props cfg) {:token token :iss :team-invitation}))] + (tokens/verify (::setup/props cfg) {:token token :iss :team-invitation}))] ;; If profile is filled in claims, means it tries to register ;; again, so we proceed to update the modified-at attr @@ -377,7 +378,7 @@ ;; email. (and (some? invitation) (= (:email profile) (:member-email invitation))) (let [claims (assoc invitation :member-id (:id profile)) - token (tokens/generate (::main/props cfg) claims) + token (tokens/generate (::setup/props cfg) claims) resp {:invitation-token token}] (-> resp (rph/with-transform (session/create-fn cfg (:id profile))) @@ -404,7 +405,7 @@ ;; In all other cases, send a verification email. :else (do - (send-email-verification! conn (::main/props cfg) profile) + (send-email-verification! conn (::setup/props cfg) profile) (rph/with-meta profile {::audit/replace-props (audit/profile->props profile) ::audit/profile-id (:id profile)}))))) @@ -429,14 +430,14 @@ (defn request-profile-recovery [{:keys [::db/pool] :as cfg} {:keys [email] :as params}] (letfn [(create-recovery-token [{:keys [id] :as profile}] - (let [token (tokens/generate (::main/props cfg) + (let [token (tokens/generate (::setup/props cfg) {:iss :password-recovery :exp (dt/in-future "15m") :profile-id id})] (assoc profile :token token))) (send-email-notification [conn profile] - (let [ptoken (tokens/generate (::main/props cfg) + (let [ptoken (tokens/generate (::setup/props cfg) {:iss :profile-identity :profile-id (:id profile) :exp (dt/in-future {:days 30})})] diff --git a/backend/src/app/rpc/commands/ldap.clj b/backend/src/app/rpc/commands/ldap.clj index bb86aec90..780f0e100 100644 --- a/backend/src/app/rpc/commands/ldap.clj +++ b/backend/src/app/rpc/commands/ldap.clj @@ -18,6 +18,7 @@ [app.rpc.commands.profile :as profile] [app.rpc.doc :as-alias doc] [app.rpc.helpers :as rph] + [app.setup :as-alias setup] [app.tokens :as tokens] [app.util.services :as sv] [clojure.spec.alpha :as s])) @@ -40,7 +41,7 @@ {::rpc/auth false ::doc/added "1.15" ::doc/module :auth} - [{:keys [::main/props ::ldap/provider] :as cfg} params] + [{:keys [::setup/props ::ldap/provider] :as cfg} params] (when-not provider (ex/raise :type :restriction :code :ldap-not-initialized diff --git a/backend/src/app/rpc/commands/profile.clj b/backend/src/app/rpc/commands/profile.clj index 6ef2ef90d..ccb6a8b2e 100644 --- a/backend/src/app/rpc/commands/profile.clj +++ b/backend/src/app/rpc/commands/profile.clj @@ -23,6 +23,7 @@ [app.rpc.climit :as climit] [app.rpc.doc :as-alias doc] [app.rpc.helpers :as rph] + [app.setup :as-alias setup] [app.storage :as sto] [app.tokens :as tokens] [app.util.services :as sv] @@ -296,12 +297,12 @@ (defn- request-email-change! [{:keys [::conn] :as cfg} {:keys [profile email] :as params}] - (let [token (tokens/generate (::main/props cfg) + (let [token (tokens/generate (::setup/props cfg) {:iss :change-email :exp (dt/in-future "15m") :profile-id (:id profile) :email email}) - ptoken (tokens/generate (::main/props cfg) + ptoken (tokens/generate (::setup/props cfg) {:iss :profile-identity :profile-id (:id profile) :exp (dt/in-future {:days 30})})] diff --git a/backend/src/app/rpc/commands/teams.clj b/backend/src/app/rpc/commands/teams.clj index 4b5f07700..f62f8bc6a 100644 --- a/backend/src/app/rpc/commands/teams.clj +++ b/backend/src/app/rpc/commands/teams.clj @@ -26,6 +26,7 @@ [app.rpc.helpers :as rph] [app.rpc.permissions :as perms] [app.rpc.quotes :as quotes] + [app.setup :as-alias setup] [app.storage :as sto] [app.tokens :as tokens] [app.util.services :as sv] @@ -691,7 +692,7 @@ (defn- create-invitation-token [cfg {:keys [profile-id valid-until team-id member-id member-email role]}] - (tokens/generate (::main/props cfg) + (tokens/generate (::setup/props cfg) {:iss :team-invitation :exp valid-until :profile-id profile-id @@ -702,7 +703,7 @@ (defn- create-profile-identity-token [cfg profile] - (tokens/generate (::main/props cfg) + (tokens/generate (::setup/props cfg) {:iss :profile-identity :profile-id (:id profile) :exp (dt/in-future {:days 30})})) diff --git a/backend/src/app/rpc/commands/verify_token.clj b/backend/src/app/rpc/commands/verify_token.clj index 49c76c110..e072c90d6 100644 --- a/backend/src/app/rpc/commands/verify_token.clj +++ b/backend/src/app/rpc/commands/verify_token.clj @@ -18,6 +18,7 @@ [app.rpc.doc :as-alias doc] [app.rpc.helpers :as rph] [app.rpc.quotes :as quotes] + [app.setup :as-alias setup] [app.tokens :as tokens] [app.tokens.spec.team-invitation :as-alias spec.team-invitation] [app.util.services :as sv] @@ -38,7 +39,7 @@ ::doc/module :auth} [{:keys [::db/pool] :as cfg} {:keys [token] :as params}] (db/with-atomic [conn pool] - (let [claims (tokens/verify (::main/props cfg) {:token token}) + (let [claims (tokens/verify (::setup/props cfg) {:token token}) cfg (assoc cfg :conn conn)] (process-token cfg params claims)))) diff --git a/backend/src/app/setup.clj b/backend/src/app/setup.clj index 8e889e2b4..d187f3e5f 100644 --- a/backend/src/app/setup.clj +++ b/backend/src/app/setup.clj @@ -50,16 +50,15 @@ :cause cause)))) instance-id))) -(s/def ::main/key ::us/string) -(s/def ::main/props - (s/map-of ::us/keyword some?)) +(s/def ::key ::us/string) +(s/def ::props (s/map-of ::us/keyword some?)) (defmethod ig/pre-init-spec ::props [_] (s/keys :req [::db/pool] - :opt [::main/key])) + :opt [::key])) (defmethod ig/init-key ::props - [_ {:keys [::db/pool ::main/key] :as cfg}] + [_ {:keys [::db/pool ::key] :as cfg}] (db/with-atomic [conn pool] (db/xact-lock! conn 0) (when-not key diff --git a/backend/src/app/tasks/telemetry.clj b/backend/src/app/tasks/telemetry.clj index 70fa8c35b..cadfff552 100644 --- a/backend/src/app/tasks/telemetry.clj +++ b/backend/src/app/tasks/telemetry.clj @@ -15,6 +15,7 @@ [app.db :as db] [app.http.client :as http] [app.main :as-alias main] + [app.setup :as-alias setup] [app.util.json :as json] [clojure.spec.alpha :as s] [integrant.core :as ig] @@ -32,10 +33,10 @@ (defmethod ig/pre-init-spec ::handler [_] (s/keys :req [::http/client ::db/pool - ::main/props])) + ::setup/props])) (defmethod ig/init-key ::handler - [_ {:keys [::db/pool ::main/props] :as cfg}] + [_ {:keys [::db/pool ::setup/props] :as cfg}] (fn [{:keys [send? enabled?] :or {send? true enabled? false}}] (let [subs {:newsletter-updates (get-subscriptions-newsletter-updates pool) :newsletter-news (get-subscriptions-newsletter-news pool)} -- Gitee From eabec6be2076735a59c97242edd5632a4664a0ff Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 7 Mar 2024 15:15:42 +0100 Subject: [PATCH 0037/1266] :fire: Remove not needed events --- backend/src/app/auth/oidc.clj | 2 +- backend/src/app/tasks/telemetry.clj | 12 ++++++------ frontend/src/app/main/data/events.cljs | 2 -- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/backend/src/app/auth/oidc.clj b/backend/src/app/auth/oidc.clj index e1a22288c..34e2cee57 100644 --- a/backend/src/app/auth/oidc.clj +++ b/backend/src/app/auth/oidc.clj @@ -38,7 +38,7 @@ ;; HELPERS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defn- obfuscate-string +(defn obfuscate-string [s] (if (< (count s) 10) (apply str (take (count s) (repeat "*"))) diff --git a/backend/src/app/tasks/telemetry.clj b/backend/src/app/tasks/telemetry.clj index cadfff552..43c0b26f9 100644 --- a/backend/src/app/tasks/telemetry.clj +++ b/backend/src/app/tasks/telemetry.clj @@ -40,6 +40,7 @@ (fn [{:keys [send? enabled?] :or {send? true enabled? false}}] (let [subs {:newsletter-updates (get-subscriptions-newsletter-updates pool) :newsletter-news (get-subscriptions-newsletter-news pool)} + enabled? (or enabled? (contains? cf/flags :telemetry) (cf/get :telemetry-enabled)) @@ -78,12 +79,11 @@ (defn- send! [cfg data] - (let [response (http/req! cfg - {:method :post - :uri (cf/get :telemetry-uri) - :headers {"content-type" "application/json"} - :body (json/encode-str data)} - {:sync? true})] + (let [request {:method :post + :uri (cf/get :telemetry-uri) + :headers {"content-type" "application/json"} + :body (json/encode-str data)} + response (http/req! cfg request)] (when (> (:status response) 206) (ex/raise :type :internal :code :invalid-response diff --git a/frontend/src/app/main/data/events.cljs b/frontend/src/app/main/data/events.cljs index a1460eedd..f80883672 100644 --- a/frontend/src/app/main/data/events.cljs +++ b/frontend/src/app/main/data/events.cljs @@ -86,12 +86,10 @@ (derive :app.main.data.dashboard/delete-team-member ::generic-action) (derive :app.main.data.dashboard/duplicate-project ::generic-action) (derive :app.main.data.dashboard/create-file ::generic-action) -(derive :app.main.data.dashboard/file-created ::generic-action) (derive :app.main.data.dashboard/invite-team-members ::generic-action) (derive :app.main.data.dashboard/leave-team ::generic-action) (derive :app.main.data.dashboard/move-files ::generic-action) (derive :app.main.data.dashboard/move-project ::generic-action) -(derive :app.main.data.dashboard/project-created ::generic-action) (derive :app.main.data.dashboard/rename-file ::generic-action) (derive :app.main.data.dashboard/set-file-shared ::generic-action) (derive :app.main.data.dashboard/update-team-member-role ::generic-action) -- Gitee From b41b3de46d14e9f0111a9536b011d9a876c7f44f Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Wed, 13 Mar 2024 13:07:39 +0100 Subject: [PATCH 0038/1266] :recycle: Refactor libraries css --- .../src/app/main/ui/workspace/libraries.cljs | 261 ++++++----- .../src/app/main/ui/workspace/libraries.scss | 439 +++++++++--------- 2 files changed, 348 insertions(+), 352 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/libraries.cljs b/frontend/src/app/main/ui/workspace/libraries.cljs index e88013b76..4cf953ae8 100644 --- a/frontend/src/app/main/ui/workspace/libraries.cljs +++ b/frontend/src/app/main/ui/workspace/libraries.cljs @@ -34,6 +34,9 @@ [okulary.core :as l] [rumext.v2 :as mf])) +(def ^:private close-icon + (i/icon-xref :close (stl/css :close-icon))) + (def ref:workspace-file (l/derived :workspace-file st/state)) @@ -185,7 +188,7 @@ :on-cancel on-delete-cancel :count-libraries 1}))))] - [:* + [:div {:class (stl/css :libraries-content)} [:div {:class (stl/css :section)} [:& title-bar {:collapsable false :title (tr "workspace.libraries.in-this-file") @@ -200,16 +203,15 @@ :graphics-count (count media) :colors-count (count colors) :typography-count (count typographies)}]]] - [:div - (if ^boolean shared? - [:input {:class (stl/css :item-unpublish) - :type "button" - :value (tr "common.unpublish") - :on-click unpublish}] - [:input {:class (stl/css :item-publish) - :type "button" - :value (tr "common.publish") - :on-click publish}])]] + (if ^boolean shared? + [:input {:class (stl/css :item-unpublish) + :type "button" + :value (tr "common.unpublish") + :on-click unpublish}] + [:input {:class (stl/css :item-publish) + :type "button" + :value (tr "common.publish") + :on-click publish}])] (for [{:keys [id name] :as library} linked-libraries] [:div {:class (stl/css :section-list-item) @@ -348,106 +350,107 @@ (dwl/set-updating-library true) (dwl/sync-file file-id library-id))))))] - [:div {:class (stl/css :section)} - (if (empty? libs-assets) - [:div {:class (stl/css :section-list-empty)} - (tr "workspace.libraries.no-libraries-need-sync")] - [:* - [:div {:class (stl/css :section-title)} (tr "workspace.libraries.library-updates")] - - [:div {:class (stl/css :section-list)} - (for [[{:keys [id name] :as library} - exceeded - {:keys [components colors typographies]}] libs-assets] - [:div {:class (stl/css :section-list-item) - :key (dm/str id)} - [:div - [:div {:class (stl/css :item-name)} name] - [:ul {:class (stl/css :item-contents)} (describe-library - (count components) - 0 - (count colors) - (count typographies))]] - [:button {:type "button" - :class (stl/css :item-update) - :disabled updating? - :data-library-id (dm/str id) - :on-click update} - (tr "workspace.libraries.update")] - - [:div {:class (stl/css :libraries-updates)} - (when-not (empty? components) - [:div {:class (stl/css :libraries-updates-column)} - (for [component components] - [:div {:class (stl/css :libraries-updates-item) - :key (dm/str (:id component))} - (let [component (ctf/load-component-objects (:data library) component) - root-shape (ctf/get-component-root (:data library) component)] - [:* - [:& component-svg {:root-shape root-shape - :objects (:objects component)}] - [:div {:class (stl/css :name-block)} - [:span {:class (stl/css :item-name) - :title (:name component)} - (:name component)]]])]) - (when (:components exceeded) - [:div {:class (stl/css :libraries-updates-item) - :key (uuid/next)} - [:div {:class (stl/css :name-block.ellipsis)} - [:span {:class (stl/css :item-name)} "(...)"]]])]) - - (when-not (empty? colors) - [:div {:class (stl/css :libraries-updates-column) - :style #js {"--bullet-size" "24px"}} - (for [color colors] - (let [default-name (cond - (:gradient color) (uc/gradient-type->string (get-in color [:gradient :type])) - (:color color) (:color color) - :else (:value color))] - [:div {:class (stl/css :libraries-updates-item) - :key (dm/str (:id color))} - [:* - [:& cb/color-bullet {:color {:color (:color color) - :id (:id color) - :opacity (:opacity color)}}] - [:div {:class (stl/css :name-block)} - [:span {:class (stl/css :item-name) - :title (:name color)} - (:name color)] - (when-not (= (:name color) default-name) - [:span.color-value (:color color)])]]])) - (when (:colors exceeded) - [:div {:class (stl/css :libraries-updates-item) - :key (uuid/next)} - [:div {:class (stl/css :name-block.ellipsis)} - [:span {:class (stl/css :item-name)} "(...)"]]])]) - - (when-not (empty? typographies) - [:div {:class (stl/css :libraries-updates-column)} - (for [typography typographies] - [:div {:class (stl/css :libraries-updates-item) - :key (dm/str (:id typography))} - [:* - [:div {:style {:font-family (:font-family typography) - :font-weight (:font-weight typography) - :font-style (:font-style typography)}} - (tr "workspace.assets.typography.sample")] - [:div {:class (stl/css :name-block)} - [:span {:class (stl/css :item-name) - :title (:name typography)} - (:name typography)]]]]) - (when (:typographies exceeded) - [:div {:class (stl/css :libraries-updates-item) - :key (uuid/next)} - [:div {:class (stl/css :name-block.ellipsis)} - [:span {:class (stl/css :item-name)} "(...)"]]])])] - - (when (or (pos? (:components exceeded)) - (pos? (:colors exceeded)) - (pos? (:typographies exceeded))) - [:div {:class (stl/css :libraries-updates-see-all)} - [:& lb/link-button {:on-click see-all-assets - :value (str "(" (tr "workspace.libraries.update.see-all-changes") ")")}]])])]])])) + [:div {:class (stl/css :updates-content)} + [:div {:class (stl/css :section)} + (if (empty? libs-assets) + [:div {:class (stl/css :section-list-empty)} + (tr "workspace.libraries.no-libraries-need-sync")] + [:* + [:div {:class (stl/css :section-title)} (tr "workspace.libraries.library-updates")] + + [:div {:class (stl/css :section-list)} + (for [[{:keys [id name] :as library} + exceeded + {:keys [components colors typographies]}] libs-assets] + [:div {:class (stl/css :section-list-item) + :key (dm/str id)} + [:div + [:div {:class (stl/css :item-name)} name] + [:ul {:class (stl/css :item-contents)} (describe-library + (count components) + 0 + (count colors) + (count typographies))]] + [:button {:type "button" + :class (stl/css :item-update) + :disabled updating? + :data-library-id (dm/str id) + :on-click update} + (tr "workspace.libraries.update")] + + [:div {:class (stl/css :libraries-updates)} + (when-not (empty? components) + [:div {:class (stl/css :libraries-updates-column)} + (for [component components] + [:div {:class (stl/css :libraries-updates-item) + :key (dm/str (:id component))} + (let [component (ctf/load-component-objects (:data library) component) + root-shape (ctf/get-component-root (:data library) component)] + [:* + [:& component-svg {:root-shape root-shape + :objects (:objects component)}] + [:div {:class (stl/css :name-block)} + [:span {:class (stl/css :item-name) + :title (:name component)} + (:name component)]]])]) + (when (:components exceeded) + [:div {:class (stl/css :libraries-updates-item) + :key (uuid/next)} + [:div {:class (stl/css :name-block.ellipsis)} + [:span {:class (stl/css :item-name)} "(...)"]]])]) + + (when-not (empty? colors) + [:div {:class (stl/css :libraries-updates-column) + :style #js {"--bullet-size" "24px"}} + (for [color colors] + (let [default-name (cond + (:gradient color) (uc/gradient-type->string (get-in color [:gradient :type])) + (:color color) (:color color) + :else (:value color))] + [:div {:class (stl/css :libraries-updates-item) + :key (dm/str (:id color))} + [:* + [:& cb/color-bullet {:color {:color (:color color) + :id (:id color) + :opacity (:opacity color)}}] + [:div {:class (stl/css :name-block)} + [:span {:class (stl/css :item-name) + :title (:name color)} + (:name color)] + (when-not (= (:name color) default-name) + [:span.color-value (:color color)])]]])) + (when (:colors exceeded) + [:div {:class (stl/css :libraries-updates-item) + :key (uuid/next)} + [:div {:class (stl/css :name-block.ellipsis)} + [:span {:class (stl/css :item-name)} "(...)"]]])]) + + (when-not (empty? typographies) + [:div {:class (stl/css :libraries-updates-column)} + (for [typography typographies] + [:div {:class (stl/css :libraries-updates-item) + :key (dm/str (:id typography))} + [:* + [:div {:style {:font-family (:font-family typography) + :font-weight (:font-weight typography) + :font-style (:font-style typography)}} + (tr "workspace.assets.typography.sample")] + [:div {:class (stl/css :name-block)} + [:span {:class (stl/css :item-name) + :title (:name typography)} + (:name typography)]]]]) + (when (:typographies exceeded) + [:div {:class (stl/css :libraries-updates-item) + :key (uuid/next)} + [:div {:class (stl/css :name-block.ellipsis)} + [:span {:class (stl/css :item-name)} "(...)"]]])])] + + (when (or (pos? (:components exceeded)) + (pos? (:colors exceeded)) + (pos? (:typographies exceeded))) + [:div {:class (stl/css :libraries-updates-see-all)} + [:& lb/link-button {:on-click see-all-assets + :value (str "(" (tr "workspace.libraries.update.see-all-changes") ")")}]])])]])]])) (mf/defc libraries-dialog {::mf/register modal/components @@ -491,28 +494,24 @@ [:div {:class (stl/css :modal-overlay) :on-click close-dialog-outside} [:div {:class (stl/css :modal-dialog)} - [:button {:class (stl/css :close) + [:button {:class (stl/css :close-btn) :on-click close-dialog} - i/close] + close-icon] [:div {:class (stl/css :modal-title)} - "Libraries"] - [:div {:class (stl/css :modal-content)} - [:div {:class (stl/css :libraries-header)} - [:& tab-container - {:on-change-tab on-tab-change - :selected selected-tab - :collapsable false} - [:& tab-element {:id :libraries :title (tr "workspace.libraries.libraries")} - [:div {:class (stl/css :libraries-content)} - [:& libraries-tab {:file-id file-id - :shared? shared? - :linked-libraries libraries - :shared-libraries shared-libraries}]]] - [:& tab-element {:id :updates :title (tr "workspace.libraries.updates")} - [:div {:class (stl/css :updates-content)} - [:& updates-tab {:file-id file-id - :file-data file-data - :libraries libraries}]]]]]]]])) + (tr "workspace.libraries.libraries")] + [:& tab-container + {:on-change-tab on-tab-change + :selected selected-tab + :collapsable false} + [:& tab-element {:id :libraries :title (tr "workspace.libraries.libraries")} + [:& libraries-tab {:file-id file-id + :shared? shared? + :linked-libraries libraries + :shared-libraries shared-libraries}]] + [:& tab-element {:id :updates :title (tr "workspace.libraries.updates")} + [:& updates-tab {:file-id file-id + :file-data file-data + :libraries libraries}]]]]])) (mf/defc v2-info-dialog {::mf/register modal/components diff --git a/frontend/src/app/main/ui/workspace/libraries.scss b/frontend/src/app/main/ui/workspace/libraries.scss index ec759217e..79c12bf94 100644 --- a/frontend/src/app/main/ui/workspace/libraries.scss +++ b/frontend/src/app/main/ui/workspace/libraries.scss @@ -6,175 +6,169 @@ @import "refactor/common-refactor.scss"; +// Library .modal-overlay { - @include flexCenter; - position: fixed; - left: 0; - top: 0; - height: 100%; - width: 100%; - z-index: $z-index-modal; - background-color: var(--overlay-color); + @extend .modal-overlay-base; } .modal-dialog { - position: relative; + @extend .modal-container-base; height: $s-520; - max-height: 100%; + max-height: $s-520; width: $s-712; - padding: $s-32; - border-radius: $br-10; - background-color: var(--modal-background-color); - .close { - @extend .button-tertiary; - position: absolute; - top: $s-8; - right: $s-8; - width: $s-28; - height: $s-32; - border-radius: $br-8; - svg { - @extend .button-icon; - stroke: var(--icon-foreground); - } + max-width: $s-712; +} + +.close-btn { + @extend .modal-close-btn-base; +} + +.close-icon { + @extend .button-icon; + stroke: var(--icon-foreground); +} + +.modal-title { + @include headlineMediumTypography; + margin-bottom: $s-16; + color: var(--modal-title-foreground-color); +} + +// Tabs content +.libraries-content, +.updates-content { + display: grid; + grid-template-columns: 1fr 1fr; + gap: $s-32; + padding-top: $s-24; + height: 100%; + max-height: $s-400; +} + +.section { + display: flex; + flex-direction: column; + height: calc(100% - $s-12); +} + +.title-spacing-lib { + margin: 0 0 0 calc(-1 * $s-8); +} + +.section-list, +.section-list-shared { + height: 100%; + max-height: $s-320; + margin-top: $s-12; + overflow: auto; +} + +.section-list-item { + display: grid; + grid-template-columns: 1fr auto; + column-gap: $s-12; + margin-bottom: $s-24; + &:last-child { + margin-bottom: $s-8; } +} - .modal-title { - @include headlineMediumTypography; - margin-bottom: $s-16; - color: var(--modal-title-foreground-color); +.item-name { + @include bodyLargeTypography; + color: var(--library-name-foreground-color); +} + +.item-publish, +.item-unpublish { + @extend .button-primary; + @include uppercaseTitleTipography; + height: $s-32; + min-width: $s-92; + padding: $s-8 $s-24; + border-radius: $br-8; +} + +.item-unpublish { + @extend .button-secondary; +} + +.item-button, +.item-button-shared { + @extend .button-secondary; + padding: $s-8 $s-24; + height: $s-32; + border-radius: $br-8; + margin-right: $s-2; + padding: $s-8; + width: $s-32; + margin-left: $s-8; + svg { + @extend .button-icon; + stroke: var(--icon-foreground); } } -.modal-content { - height: 100%; - .libraries-header { - height: 100%; +.item-button-icon { + width: $s-28; + height: $s-28; + svg { + @extend .button-icon; + stroke: var(--icon-foreground); } - .libraries-content, - .updates-content { - display: grid; - grid-template-columns: 1fr 1fr; - gap: $s-32; - padding-top: $s-24; - height: 100%; - max-height: $s-400; - .section { - display: flex; - flex-direction: column; - height: calc(100% - $s-12); - .title-spacing-lib { - margin: 0 0 0 calc(-1 * $s-8); - } - .section-list, - .section-list-shared { - height: 100%; - max-height: $s-320; - margin-top: $s-12; - overflow: auto; - .section-list-item { - display: grid; - grid-template-columns: 1fr auto; - column-gap: $s-12; - margin-bottom: $s-24; - &:last-child { - margin-bottom: $s-8; - } - .item-name { - @include bodyLargeTypography; - color: var(--library-name-foreground-color); - } - .item-publish, - .item-unpublish { - @extend .button-primary; - @include uppercaseTitleTipography; - height: $s-32; - min-width: $s-92; - padding: $s-8 $s-24; - border-radius: $br-8; - } - - .item-unpublish { - @extend .button-secondary; - } - .item-button, - .item-button-shared { - @extend .button-secondary; - padding: $s-8 $s-24; - height: $s-32; - border-radius: $br-8; - margin-right: $s-2; - padding: $s-8; - width: $s-32; - margin-left: $s-8; - svg { - @extend .button-icon; - stroke: var(--icon-foreground); - } - } - - .item-button-icon { - width: $s-28; - height: $s-28; - svg { - @extend .button-icon; - stroke: var(--icon-foreground); - } - } - } - } - .section-list-shared { - max-height: $s-272; - } - - .section-title { - @include bodyLargeTypography; - color: var(--modal-title-foreground-color); - margin-bottom: $s-12; - } - - .libraries-search { - margin: $s-12 0; - .search-icon { - @include flexCenter; - padding: 0 0 0 $s-8; - width: $s-20; - svg { - @extend .button-icon-small; - stroke: var(--icon-foreground); - } - } - } - .section-list-empty { - @include bodyLargeTypography; - @include flexCenter; - color: var(--empty-message-foreground-color); - - svg { - @extend .button-icon-small; - stroke: var(--icon-foreground); - width: $s-16; - height: $s-16; - } - } - } +} - .libraries-updates-see-all { - direction: rtl; - grid-column: span 3; - margin-top: $s-8; - margin-right: $s-8; - & input { - @extend .link; - margin: 0; - } - } +.section-list-shared { + max-height: $s-272; +} + +.section-title { + @include bodyLargeTypography; + color: var(--modal-title-foreground-color); + margin-bottom: $s-12; +} + +.libraries-search { + margin: $s-12 0; +} + +.search-icon { + @include flexCenter; + padding: 0 0 0 $s-8; + width: $s-20; + svg { + @extend .button-icon-small; + stroke: var(--icon-foreground); } - .updates-content { - grid-template-columns: 1fr; +} + +.section-list-empty { + @include bodyLargeTypography; + @include flexCenter; + color: var(--empty-message-foreground-color); + + svg { + @extend .button-icon-small; + stroke: var(--icon-foreground); + width: $s-16; + height: $s-16; } } +.libraries-updates-see-all { + direction: rtl; + grid-column: span 3; + margin-top: $s-8; + margin-right: $s-8; + & input { + @extend .link; + margin: 0; + } +} + +.updates-content { + grid-template-columns: 1fr; +} + .libraries-updates { display: grid; grid-column: span 3; @@ -182,43 +176,43 @@ grid-gap: $s-24; font-size: $fs-12; margin-top: $s-16; +} - .libraries-updates-item { - display: flex; - align-items: center; - color: var(--library-content-foreground-color); +.libraries-updates-item { + display: flex; + align-items: center; + color: var(--library-content-foreground-color); - &:not(:first-child) { - margin-top: $s-8; - } + &:not(:first-child) { + margin-top: $s-8; + } - & svg { - background-color: var(--color-canvas); - border-radius: $br-4; - border: $s-2 solid transparent; - height: $s-24; - width: $s-24; - min-height: $s-24; - min-width: $s-24; - } + & svg { + background-color: var(--color-canvas); + border-radius: $br-4; + border: $s-2 solid transparent; + height: $s-24; + width: $s-24; + min-height: $s-24; + min-width: $s-24; + } - & .name-block { - color: var(--gray-20-color); - margin-left: $s-8; - width: $s-168; + & .name-block { + color: var(--gray-20-color); + margin-left: $s-8; + width: $s-168; - &.ellipsis { - padding-left: calc($s-24 + #{$s-8}); - } + &.ellipsis { + padding-left: calc($s-24 + #{$s-8}); } + } - & .item-name { - display: block; - margin: 0; - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - } + & .item-name { + display: block; + margin: 0; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; } } @@ -264,55 +258,58 @@ display: flex; flex-direction: column; gap: $s-24; +} - .info-block { - display: grid; - grid-template-columns: auto 1fr; - column-gap: $s-20; - grid-template: - "icon title" - "icon content"; - } +.info-block { + display: grid; + grid-template-columns: auto 1fr; + column-gap: $s-20; + grid-template: + "icon title" + "icon content"; +} - .info-icon { - grid-area: icon; - width: $s-52; - height: $s-52; - margin-top: $s-8; - border-radius: $br-circle; - background: $db-quaternary; +.info-icon { + grid-area: icon; + width: $s-52; + height: $s-52; + margin-top: $s-8; + border-radius: $br-circle; + background: $db-quaternary; - display: flex; - justify-content: center; - align-items: center; + display: flex; + justify-content: center; + align-items: center; - svg { - width: $s-32; - height: $s-32; - fill: $da-primary; - } - } - .info-block-title { - grid-area: title; - font-size: $fs-16; - color: $df-primary; - } - .info-block-content { - grid-area: content; - font-size: $fs-14; - color: $df-secondary; - line-height: 1.2; + svg { + width: $s-32; + height: $s-32; + fill: $da-primary; } } +.info-block-title { + grid-area: title; + font-size: $fs-16; + color: $df-primary; +} + +.info-block-content { + grid-area: content; + font-size: $fs-14; + color: $df-secondary; + line-height: 1.2; +} + .info-bottom { margin-top: $s-24; margin-right: $s-8; display: flex; justify-content: flex-end; - .primary-button { - @extend .button-primary; - @include uppercaseTitleTipography; - padding: $s-0 $s-16; - } +} + +.primary-button { + @extend .button-primary; + @include uppercaseTitleTipography; + padding: $s-0 $s-16; } -- Gitee From 18fc08d4181a0af566b9eb158b69b112629335ff Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Wed, 13 Mar 2024 13:17:39 +0100 Subject: [PATCH 0039/1266] :bug: Fix typographies in update modal --- .../styles/common/refactor/basic-rules.scss | 11 +++++++++-- .../src/app/main/ui/components/tab_container.scss | 2 +- frontend/src/app/main/ui/components/title_bar.scss | 2 +- frontend/src/app/main/ui/workspace/libraries.scss | 12 ++++++------ 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/frontend/resources/styles/common/refactor/basic-rules.scss b/frontend/resources/styles/common/refactor/basic-rules.scss index 0a257da60..f057974d0 100644 --- a/frontend/resources/styles/common/refactor/basic-rules.scss +++ b/frontend/resources/styles/common/refactor/basic-rules.scss @@ -32,6 +32,12 @@ background: var(--text-editor-selection-background-color); color: var(--text-editor-selection-foreground-color); } + + ::placeholder, + ::-webkit-input-placeholder { + @include bodySmallTypography; + color: var(--input-placeholder-color); + } } // BUTTONS @@ -39,7 +45,7 @@ @include buttonStyle; @include flexCenter; @include focusPrimary; - @include uppercaseTitleTipography; + @include headlineSmallTypography; background-color: var(--button-primary-background-color-rest); border: $s-1 solid var(--button-primary-border-color-rest); color: var(--button-primary-foreground-color-rest); @@ -303,7 +309,7 @@ } .input-label { - @include uppercaseTitleTipography; + @include headlineSmallTypography; @include flexCenter; width: $s-20; padding-left: $s-8; @@ -401,6 +407,7 @@ background-color: var(--input-background-color); } ::placeholder { + @include bodySmallTypography; color: var(--input-placeholder-color); } &:hover { diff --git a/frontend/src/app/main/ui/components/tab_container.scss b/frontend/src/app/main/ui/components/tab_container.scss index 86ac4c4f3..7c9b08b52 100644 --- a/frontend/src/app/main/ui/components/tab_container.scss +++ b/frontend/src/app/main/ui/components/tab_container.scss @@ -28,7 +28,7 @@ width: 100%; .tab-container-tab-title { @include flexCenter; - @include uppercaseTitleTipography; + @include headlineSmallTypography; height: 100%; width: 100%; padding: 0 $s-8; diff --git a/frontend/src/app/main/ui/components/title_bar.scss b/frontend/src/app/main/ui/components/title_bar.scss index 43de2b42c..c6882c4e0 100644 --- a/frontend/src/app/main/ui/components/title_bar.scss +++ b/frontend/src/app/main/ui/components/title_bar.scss @@ -19,7 +19,7 @@ .title, .title-only, .inspect-title { - @include uppercaseTitleTipography; + @include headlineSmallTypography; display: grid; align-items: center; justify-content: flex-start; diff --git a/frontend/src/app/main/ui/workspace/libraries.scss b/frontend/src/app/main/ui/workspace/libraries.scss index 79c12bf94..761d47efa 100644 --- a/frontend/src/app/main/ui/workspace/libraries.scss +++ b/frontend/src/app/main/ui/workspace/libraries.scss @@ -6,7 +6,7 @@ @import "refactor/common-refactor.scss"; -// Library +// Library modal .modal-overlay { @extend .modal-overlay-base; } @@ -122,8 +122,8 @@ } .section-title { - @include bodyLargeTypography; - color: var(--modal-title-foreground-color); + @include headlineSmallTypography; + color: var(--title-foreground-color); margin-bottom: $s-12; } @@ -226,7 +226,7 @@ .item-update { @extend .button-primary; - @include uppercaseTitleTipography; + @include headlineSmallTypography; height: $s-32; min-width: $s-92; padding: $s-8 $s-24; @@ -238,7 +238,7 @@ } .item-contents { - @include bodyLargeTypography; + @include bodyMediumTypography; color: var(--library-content-foreground-color); display: flex; flex-wrap: wrap; @@ -310,6 +310,6 @@ .primary-button { @extend .button-primary; - @include uppercaseTitleTipography; + @include headlineSmallTypography; padding: $s-0 $s-16; } -- Gitee From 5f0b86e0df04b2c677566d4dbf0f6c699f1ee6a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Wed, 13 Mar 2024 12:55:08 +0100 Subject: [PATCH 0040/1266] :bug: Fix file renaming input size --- frontend/src/app/main/ui/workspace/left_header.scss | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/left_header.scss b/frontend/src/app/main/ui/workspace/left_header.scss index c6ebf454a..207101743 100644 --- a/frontend/src/app/main/ui/workspace/left_header.scss +++ b/frontend/src/app/main/ui/workspace/left_header.scss @@ -41,7 +41,6 @@ height: $s-16; width: 100%; padding-bottom: $s-2; - margin-top: calc(-1 * $s-2); color: var(--title-foreground-color); cursor: pointer; } @@ -54,10 +53,10 @@ .file-name-input { @include flexCenter; - height: 100%; width: 100%; margin: 0; border: 0; + padding: 0; border-radius: $br-4; background-color: var(--input-background-color); font-size: $fs-14; -- Gitee From a6f70c77cbe72875875ab83587d5dcd9cfc61e34 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 13 Mar 2024 16:21:12 +0100 Subject: [PATCH 0041/1266] Revert ":sparkles: Improve internal naming of setup/props" This reverts commit f525c6df5e9785df9b534b6de1b5308084627699. --- backend/src/app/auth/oidc.clj | 11 +++++----- backend/src/app/http.clj | 3 +-- backend/src/app/http/access_token.clj | 3 +-- backend/src/app/http/awsns.clj | 5 ++--- backend/src/app/http/client.clj | 4 ++-- backend/src/app/http/debug.clj | 3 +-- backend/src/app/http/session.clj | 5 ++--- backend/src/app/loggers/audit.clj | 13 ++++++------ backend/src/app/main.clj | 18 ++++++++-------- backend/src/app/rpc.clj | 5 ++--- backend/src/app/rpc/commands/access_token.clj | 5 ++--- backend/src/app/rpc/commands/auth.clj | 21 +++++++++---------- backend/src/app/rpc/commands/ldap.clj | 3 +-- backend/src/app/rpc/commands/profile.clj | 5 ++--- backend/src/app/rpc/commands/teams.clj | 5 ++--- backend/src/app/rpc/commands/verify_token.clj | 3 +-- backend/src/app/setup.clj | 9 ++++---- backend/src/app/tasks/telemetry.clj | 5 ++--- 18 files changed, 56 insertions(+), 70 deletions(-) diff --git a/backend/src/app/auth/oidc.clj b/backend/src/app/auth/oidc.clj index 34e2cee57..9e07a21e2 100644 --- a/backend/src/app/auth/oidc.clj +++ b/backend/src/app/auth/oidc.clj @@ -22,7 +22,6 @@ [app.loggers.audit :as audit] [app.main :as-alias main] [app.rpc.commands.profile :as profile] - [app.setup :as-alias setup] [app.tokens :as tokens] [app.util.json :as json] [app.util.time :as dt] @@ -414,7 +413,7 @@ ::props])) (defn get-info - [{:keys [provider ::setup/props] :as cfg} {:keys [params] :as request}] + [{:keys [provider ::main/props] :as cfg} {:keys [params] :as request}] (when-let [error (get params :error)] (ex/raise :type :internal :code :error-on-retrieving-code @@ -509,7 +508,7 @@ (if profile (let [sxf (session/create-fn cfg (:id profile)) token (or (:invitation-token info) - (tokens/generate (::setup/props cfg) + (tokens/generate (::main/props cfg) {:iss :auth :exp (dt/in-future "15m") :profile-id (:id profile)})) @@ -537,7 +536,7 @@ :iss :prepared-register :is-active true :exp (dt/in-future {:hours 48})) - token (tokens/generate (::setup/props cfg) info) + token (tokens/generate (::main/props cfg) info) params (d/without-nils {:token token :fullname (:fullname info)}) @@ -552,7 +551,7 @@ (defn- auth-handler [cfg {:keys [params] :as request}] (let [props (audit/extract-utm-params params) - state (tokens/generate (::setup/props cfg) + state (tokens/generate (::main/props cfg) {:iss :oauth :invitation-token (:invitation-token params) :props props @@ -619,7 +618,7 @@ [_] (s/keys :req [::session/manager ::http/client - ::setup/props + ::main/props ::db/pool ::providers])) diff --git a/backend/src/app/http.clj b/backend/src/app/http.clj index a696d5477..1e605cdb0 100644 --- a/backend/src/app/http.clj +++ b/backend/src/app/http.clj @@ -23,7 +23,6 @@ [app.metrics :as mtx] [app.rpc :as-alias rpc] [app.rpc.doc :as-alias rpc.doc] - [app.setup :as-alias setup] [clojure.spec.alpha :as s] [integrant.core :as ig] [promesa.exec :as px] @@ -137,7 +136,7 @@ ::rpc/routes ::rpc.doc/routes ::oidc/routes - ::setup/props + ::main/props ::assets/routes ::debug/routes ::db/pool diff --git a/backend/src/app/http/access_token.clj b/backend/src/app/http/access_token.clj index 0d1865f10..bfddbb42d 100644 --- a/backend/src/app/http/access_token.clj +++ b/backend/src/app/http/access_token.clj @@ -10,7 +10,6 @@ [app.config :as cf] [app.db :as db] [app.main :as-alias main] - [app.setup :as-alias setup] [app.tokens :as tokens] [ring.request :as rreq])) @@ -43,7 +42,7 @@ (defn- wrap-soft-auth "Soft Authentication, will be executed synchronously on the undertow worker thread." - [handler {:keys [::setup/props]}] + [handler {:keys [::main/props]}] (letfn [(handle-request [request] (try (let [token (get-token request) diff --git a/backend/src/app/http/awsns.clj b/backend/src/app/http/awsns.clj index 88060bb20..7508be8a2 100644 --- a/backend/src/app/http/awsns.clj +++ b/backend/src/app/http/awsns.clj @@ -13,7 +13,6 @@ [app.db.sql :as sql] [app.http.client :as http] [app.main :as-alias main] - [app.setup :as-alias setup] [app.tokens :as tokens] [app.worker :as-alias wrk] [clojure.spec.alpha :as s] @@ -31,7 +30,7 @@ (defmethod ig/pre-init-spec ::routes [_] (s/keys :req [::http/client - ::setup/props + ::main/props ::db/pool])) (defmethod ig/init-key ::routes @@ -107,7 +106,7 @@ [cfg headers] (let [tdata (get headers "x-penpot-data")] (when-not (str/empty? tdata) - (let [result (tokens/verify (::setup/props cfg) {:token tdata :iss :profile-identity})] + (let [result (tokens/verify (::main/props cfg) {:token tdata :iss :profile-identity})] (:profile-id result))))) (defn- parse-notification diff --git a/backend/src/app/http/client.clj b/backend/src/app/http/client.clj index 9ef4cc4b2..5b4a8541c 100644 --- a/backend/src/app/http/client.clj +++ b/backend/src/app/http/client.clj @@ -55,8 +55,8 @@ convention." ([cfg-or-client request] (let [client (resolve-client cfg-or-client)] - (send! client request {:sync? true}))) + (send! client request {}))) ([cfg-or-client request options] (let [client (resolve-client cfg-or-client)] - (send! client request (merge {:sync? true} options))))) + (send! client request options)))) diff --git a/backend/src/app/http/debug.clj b/backend/src/app/http/debug.clj index a453c6872..1d2a129cf 100644 --- a/backend/src/app/http/debug.clj +++ b/backend/src/app/http/debug.clj @@ -20,7 +20,6 @@ [app.rpc.commands.auth :as auth] [app.rpc.commands.files-create :refer [create-file]] [app.rpc.commands.profile :as profile] - [app.setup :as-alias setup] [app.srepl.helpers :as srepl] [app.storage :as-alias sto] [app.storage.tmp :as tmp] @@ -341,7 +340,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defn- resend-email-notification - [{:keys [::db/pool ::setup/props] :as cfg} {:keys [params] :as request}] + [{:keys [::db/pool ::main/props] :as cfg} {:keys [params] :as request}] (when-not (contains? params :force) (ex/raise :type :validation diff --git a/backend/src/app/http/session.clj b/backend/src/app/http/session.clj index c4a3f0ba6..7ff6dfa01 100644 --- a/backend/src/app/http/session.clj +++ b/backend/src/app/http/session.clj @@ -15,7 +15,6 @@ [app.db.sql :as sql] [app.http.session.tasks :as-alias tasks] [app.main :as-alias main] - [app.setup :as-alias setup] [app.tokens :as tokens] [app.util.time :as dt] [clojure.spec.alpha :as s] @@ -139,7 +138,7 @@ (declare ^:private gen-token) (defn create-fn - [{:keys [::manager ::setup/props]} profile-id] + [{:keys [::manager ::main/props]} profile-id] (us/assert! ::manager manager) (us/assert! ::us/uuid profile-id) @@ -197,7 +196,7 @@ (neg? (compare default-renewal-max-age elapsed))))) (defn- wrap-soft-auth - [handler {:keys [::manager ::setup/props]}] + [handler {:keys [::manager ::main/props]}] (us/assert! ::manager manager) (letfn [(handle-request [request] (try diff --git a/backend/src/app/loggers/audit.clj b/backend/src/app/loggers/audit.clj index aead09110..45c36334a 100644 --- a/backend/src/app/loggers/audit.clj +++ b/backend/src/app/loggers/audit.clj @@ -24,7 +24,6 @@ [app.main :as-alias main] [app.rpc :as-alias rpc] [app.rpc.retry :as rtry] - [app.setup :as-alias setup] [app.tokens :as tokens] [app.util.services :as-alias sv] [app.util.time :as dt] @@ -262,7 +261,7 @@ (s/def ::tasks/uri ::us/string) (defmethod ig/pre-init-spec ::tasks/archive-task [_] - (s/keys :req [::db/pool ::setup/props ::http.client/client])) + (s/keys :req [::db/pool ::main/props ::http.client/client])) (defmethod ig/init-key ::tasks/archive [_ cfg] @@ -288,7 +287,7 @@ (px/sleep 100) (recur (+ total ^long n))) (when (pos? total) - (l/dbg :hint "events archived" :total total))))))))) + (l/debug :hint "events archived" :total total))))))))) (def ^:private sql:retrieve-batch-of-audit-log "select * @@ -323,7 +322,7 @@ :context])) (send [events] - (let [token (tokens/generate (::setup/props cfg) + (let [token (tokens/generate (::main/props cfg) {:iss "authentication" :iat (dt/now) :uid uuid/zero}) @@ -332,11 +331,11 @@ "origin" (cf/get :public-uri) "cookie" (u/map->query-string {:auth-token token})} params {:uri uri - :timeout 12000 + :timeout 6000 :method :post :headers headers :body body} - resp (http.client/req! cfg params)] + resp (http.client/req! cfg params {:sync? true})] (if (= (:status resp) 204) true (do @@ -356,7 +355,7 @@ (map row->event)) events (into [] xform rows)] (when-not (empty? events) - (l/trc :hint "archive events chunk" :uri uri :events (count events)) + (l/trace :hint "archive events chunk" :uri uri :events (count events)) (when (send events) (mark-as-archived conn rows) (count events))))))) diff --git a/backend/src/app/main.clj b/backend/src/app/main.clj index e0177110f..47e43f5cf 100644 --- a/backend/src/app/main.clj +++ b/backend/src/app/main.clj @@ -221,7 +221,7 @@ {::db/pool (ig/ref ::db/pool)} ::http.awsns/routes - {::setup/props (ig/ref ::setup/props) + {::props (ig/ref ::setup/props) ::db/pool (ig/ref ::db/pool) ::http.client/client (ig/ref ::http.client/client)} @@ -262,7 +262,7 @@ ::oidc/routes {::http.client/client (ig/ref ::http.client/client) ::db/pool (ig/ref ::db/pool) - ::setup/props (ig/ref ::setup/props) + ::props (ig/ref ::setup/props) ::oidc/providers {:google (ig/ref ::oidc.providers/google) :github (ig/ref ::oidc.providers/github) :gitlab (ig/ref ::oidc.providers/gitlab) @@ -274,7 +274,7 @@ ::db/pool (ig/ref ::db/pool) ::rpc/routes (ig/ref ::rpc/routes) ::rpc.doc/routes (ig/ref ::rpc.doc/routes) - ::setup/props (ig/ref ::setup/props) + ::props (ig/ref ::setup/props) ::mtx/routes (ig/ref ::mtx/routes) ::oidc/routes (ig/ref ::oidc/routes) ::http.debug/routes (ig/ref ::http.debug/routes) @@ -286,7 +286,7 @@ {::db/pool (ig/ref ::db/pool) ::session/manager (ig/ref ::session/manager) ::sto/storage (ig/ref ::sto/storage) - ::setup/props (ig/ref ::setup/props)} + ::props (ig/ref ::setup/props)} ::http.ws/routes {::db/pool (ig/ref ::db/pool) @@ -322,7 +322,7 @@ ::rpc/climit (ig/ref ::rpc/climit) ::rpc/rlimit (ig/ref ::rpc/rlimit) ::setup/templates (ig/ref ::setup/templates) - ::setup/props (ig/ref ::setup/props)} + ::props (ig/ref ::setup/props)} :app.rpc.doc/routes {:methods (ig/ref :app.rpc/methods)} @@ -331,7 +331,7 @@ {::rpc/methods (ig/ref :app.rpc/methods) ::db/pool (ig/ref ::db/pool) ::session/manager (ig/ref ::session/manager) - ::setup/props (ig/ref ::setup/props)} + ::props (ig/ref ::setup/props)} ::wrk/registry {::mtx/metrics (ig/ref ::mtx/metrics) @@ -388,7 +388,7 @@ :app.tasks.telemetry/handler {::db/pool (ig/ref ::db/pool) ::http.client/client (ig/ref ::http.client/client) - ::setup/props (ig/ref ::setup/props)} + ::props (ig/ref ::setup/props)} [::srepl/urepl ::srepl/server] {::srepl/port (cf/get :urepl-port 6062) @@ -402,7 +402,7 @@ ::setup/props {::db/pool (ig/ref ::db/pool) - ::setup/key (cf/get :secret-key) + ::key (cf/get :secret-key) ;; NOTE: this dependency is only necessary for proper initialization ordering, props ;; module requires the migrations to run before initialize. @@ -412,7 +412,7 @@ {} ::audit.tasks/archive - {::setup/props (ig/ref ::setup/props) + {::props (ig/ref ::setup/props) ::db/pool (ig/ref ::db/pool) ::http.client/client (ig/ref ::http.client/client)} diff --git a/backend/src/app/rpc.clj b/backend/src/app/rpc.clj index ea49b6b70..8ae7a38d6 100644 --- a/backend/src/app/rpc.clj +++ b/backend/src/app/rpc.clj @@ -27,7 +27,6 @@ [app.rpc.helpers :as rph] [app.rpc.retry :as retry] [app.rpc.rlimit :as rlimit] - [app.setup :as-alias setup] [app.storage :as-alias sto] [app.util.services :as sv] [app.util.time :as dt] @@ -249,7 +248,7 @@ ::ldap/provider ::sto/storage ::mtx/metrics - ::setup/props] + ::main/props] :opt [::climit ::rlimit])) @@ -266,7 +265,7 @@ (defmethod ig/pre-init-spec ::routes [_] (s/keys :req [::methods ::db/pool - ::setup/props + ::main/props ::session/manager])) (defmethod ig/init-key ::routes diff --git a/backend/src/app/rpc/commands/access_token.clj b/backend/src/app/rpc/commands/access_token.clj index 06a6e516c..dd10f3371 100644 --- a/backend/src/app/rpc/commands/access_token.clj +++ b/backend/src/app/rpc/commands/access_token.clj @@ -13,7 +13,6 @@ [app.rpc :as-alias rpc] [app.rpc.doc :as-alias doc] [app.rpc.quotes :as quotes] - [app.setup :as-alias setup] [app.tokens :as tokens] [app.util.services :as sv] [app.util.time :as dt] @@ -24,7 +23,7 @@ (dissoc row :perms)) (defn create-access-token - [{:keys [::db/conn ::setup/props]} profile-id name expiration] + [{:keys [::db/conn ::main/props]} profile-id name expiration] (let [created-at (dt/now) token-id (uuid/next) token (tokens/generate props {:iss "access-token" @@ -48,7 +47,7 @@ [{:keys [::db/pool] :as system} profile-id name expiration] (db/with-atomic [conn pool] (let [props (:app.setup/props system)] - (create-access-token {::db/conn conn ::setup/props props} + (create-access-token {::db/conn conn ::main/props props} profile-id name expiration)))) diff --git a/backend/src/app/rpc/commands/auth.clj b/backend/src/app/rpc/commands/auth.clj index e87979007..8e9671e59 100644 --- a/backend/src/app/rpc/commands/auth.clj +++ b/backend/src/app/rpc/commands/auth.clj @@ -26,7 +26,6 @@ [app.rpc.commands.teams :as teams] [app.rpc.doc :as-alias doc] [app.rpc.helpers :as rph] - [app.setup :as-alias setup] [app.tokens :as tokens] [app.util.services :as sv] [app.util.time :as dt] @@ -89,7 +88,7 @@ (profile/strip-private-attrs)) invitation (when-let [token (:invitation-token params)] - (tokens/verify (::setup/props cfg) {:token token :iss :team-invitation})) + (tokens/verify (::main/props cfg) {:token token :iss :team-invitation})) ;; If invitation member-id does not matches the profile-id, we just proceed to ignore the ;; invitation because invitations matches exactly; and user can't login with other email and @@ -134,7 +133,7 @@ (defn recover-profile [{:keys [::db/pool] :as cfg} {:keys [token password]}] (letfn [(validate-token [token] - (let [tdata (tokens/verify (::setup/props cfg) {:token token :iss :password-recovery})] + (let [tdata (tokens/verify (::main/props cfg) {:token token :iss :password-recovery})] (:profile-id tdata))) (update-password [conn profile-id] @@ -171,7 +170,7 @@ :code :registration-disabled))) (when (contains? params :invitation-token) - (let [invitation (tokens/verify (::setup/props cfg) {:token (:invitation-token params) :iss :team-invitation})] + (let [invitation (tokens/verify (::main/props cfg) {:token (:invitation-token params) :iss :team-invitation})] (when-not (= (:email params) (:member-email invitation)) (ex/raise :type :restriction :code :email-does-not-match-invitation @@ -234,7 +233,7 @@ params (d/without-nils params) - token (tokens/generate (::setup/props cfg) params)] + token (tokens/generate (::main/props cfg) params)] (with-meta {:token token} {::audit/profile-id uuid/zero}))) @@ -341,7 +340,7 @@ (defn register-profile [{:keys [::db/conn] :as cfg} {:keys [token fullname] :as params}] - (let [claims (tokens/verify (::setup/props cfg) {:token token :iss :prepared-register}) + (let [claims (tokens/verify (::main/props cfg) {:token token :iss :prepared-register}) params (-> claims (into params) (assoc :fullname fullname)) @@ -358,7 +357,7 @@ (create-profile-rels! conn)))) invitation (when-let [token (:invitation-token params)] - (tokens/verify (::setup/props cfg) {:token token :iss :team-invitation}))] + (tokens/verify (::main/props cfg) {:token token :iss :team-invitation}))] ;; If profile is filled in claims, means it tries to register ;; again, so we proceed to update the modified-at attr @@ -378,7 +377,7 @@ ;; email. (and (some? invitation) (= (:email profile) (:member-email invitation))) (let [claims (assoc invitation :member-id (:id profile)) - token (tokens/generate (::setup/props cfg) claims) + token (tokens/generate (::main/props cfg) claims) resp {:invitation-token token}] (-> resp (rph/with-transform (session/create-fn cfg (:id profile))) @@ -405,7 +404,7 @@ ;; In all other cases, send a verification email. :else (do - (send-email-verification! conn (::setup/props cfg) profile) + (send-email-verification! conn (::main/props cfg) profile) (rph/with-meta profile {::audit/replace-props (audit/profile->props profile) ::audit/profile-id (:id profile)}))))) @@ -430,14 +429,14 @@ (defn request-profile-recovery [{:keys [::db/pool] :as cfg} {:keys [email] :as params}] (letfn [(create-recovery-token [{:keys [id] :as profile}] - (let [token (tokens/generate (::setup/props cfg) + (let [token (tokens/generate (::main/props cfg) {:iss :password-recovery :exp (dt/in-future "15m") :profile-id id})] (assoc profile :token token))) (send-email-notification [conn profile] - (let [ptoken (tokens/generate (::setup/props cfg) + (let [ptoken (tokens/generate (::main/props cfg) {:iss :profile-identity :profile-id (:id profile) :exp (dt/in-future {:days 30})})] diff --git a/backend/src/app/rpc/commands/ldap.clj b/backend/src/app/rpc/commands/ldap.clj index 780f0e100..bb86aec90 100644 --- a/backend/src/app/rpc/commands/ldap.clj +++ b/backend/src/app/rpc/commands/ldap.clj @@ -18,7 +18,6 @@ [app.rpc.commands.profile :as profile] [app.rpc.doc :as-alias doc] [app.rpc.helpers :as rph] - [app.setup :as-alias setup] [app.tokens :as tokens] [app.util.services :as sv] [clojure.spec.alpha :as s])) @@ -41,7 +40,7 @@ {::rpc/auth false ::doc/added "1.15" ::doc/module :auth} - [{:keys [::setup/props ::ldap/provider] :as cfg} params] + [{:keys [::main/props ::ldap/provider] :as cfg} params] (when-not provider (ex/raise :type :restriction :code :ldap-not-initialized diff --git a/backend/src/app/rpc/commands/profile.clj b/backend/src/app/rpc/commands/profile.clj index ccb6a8b2e..6ef2ef90d 100644 --- a/backend/src/app/rpc/commands/profile.clj +++ b/backend/src/app/rpc/commands/profile.clj @@ -23,7 +23,6 @@ [app.rpc.climit :as climit] [app.rpc.doc :as-alias doc] [app.rpc.helpers :as rph] - [app.setup :as-alias setup] [app.storage :as sto] [app.tokens :as tokens] [app.util.services :as sv] @@ -297,12 +296,12 @@ (defn- request-email-change! [{:keys [::conn] :as cfg} {:keys [profile email] :as params}] - (let [token (tokens/generate (::setup/props cfg) + (let [token (tokens/generate (::main/props cfg) {:iss :change-email :exp (dt/in-future "15m") :profile-id (:id profile) :email email}) - ptoken (tokens/generate (::setup/props cfg) + ptoken (tokens/generate (::main/props cfg) {:iss :profile-identity :profile-id (:id profile) :exp (dt/in-future {:days 30})})] diff --git a/backend/src/app/rpc/commands/teams.clj b/backend/src/app/rpc/commands/teams.clj index f62f8bc6a..4b5f07700 100644 --- a/backend/src/app/rpc/commands/teams.clj +++ b/backend/src/app/rpc/commands/teams.clj @@ -26,7 +26,6 @@ [app.rpc.helpers :as rph] [app.rpc.permissions :as perms] [app.rpc.quotes :as quotes] - [app.setup :as-alias setup] [app.storage :as sto] [app.tokens :as tokens] [app.util.services :as sv] @@ -692,7 +691,7 @@ (defn- create-invitation-token [cfg {:keys [profile-id valid-until team-id member-id member-email role]}] - (tokens/generate (::setup/props cfg) + (tokens/generate (::main/props cfg) {:iss :team-invitation :exp valid-until :profile-id profile-id @@ -703,7 +702,7 @@ (defn- create-profile-identity-token [cfg profile] - (tokens/generate (::setup/props cfg) + (tokens/generate (::main/props cfg) {:iss :profile-identity :profile-id (:id profile) :exp (dt/in-future {:days 30})})) diff --git a/backend/src/app/rpc/commands/verify_token.clj b/backend/src/app/rpc/commands/verify_token.clj index e072c90d6..49c76c110 100644 --- a/backend/src/app/rpc/commands/verify_token.clj +++ b/backend/src/app/rpc/commands/verify_token.clj @@ -18,7 +18,6 @@ [app.rpc.doc :as-alias doc] [app.rpc.helpers :as rph] [app.rpc.quotes :as quotes] - [app.setup :as-alias setup] [app.tokens :as tokens] [app.tokens.spec.team-invitation :as-alias spec.team-invitation] [app.util.services :as sv] @@ -39,7 +38,7 @@ ::doc/module :auth} [{:keys [::db/pool] :as cfg} {:keys [token] :as params}] (db/with-atomic [conn pool] - (let [claims (tokens/verify (::setup/props cfg) {:token token}) + (let [claims (tokens/verify (::main/props cfg) {:token token}) cfg (assoc cfg :conn conn)] (process-token cfg params claims)))) diff --git a/backend/src/app/setup.clj b/backend/src/app/setup.clj index d187f3e5f..8e889e2b4 100644 --- a/backend/src/app/setup.clj +++ b/backend/src/app/setup.clj @@ -50,15 +50,16 @@ :cause cause)))) instance-id))) -(s/def ::key ::us/string) -(s/def ::props (s/map-of ::us/keyword some?)) +(s/def ::main/key ::us/string) +(s/def ::main/props + (s/map-of ::us/keyword some?)) (defmethod ig/pre-init-spec ::props [_] (s/keys :req [::db/pool] - :opt [::key])) + :opt [::main/key])) (defmethod ig/init-key ::props - [_ {:keys [::db/pool ::key] :as cfg}] + [_ {:keys [::db/pool ::main/key] :as cfg}] (db/with-atomic [conn pool] (db/xact-lock! conn 0) (when-not key diff --git a/backend/src/app/tasks/telemetry.clj b/backend/src/app/tasks/telemetry.clj index 43c0b26f9..d040a08f9 100644 --- a/backend/src/app/tasks/telemetry.clj +++ b/backend/src/app/tasks/telemetry.clj @@ -15,7 +15,6 @@ [app.db :as db] [app.http.client :as http] [app.main :as-alias main] - [app.setup :as-alias setup] [app.util.json :as json] [clojure.spec.alpha :as s] [integrant.core :as ig] @@ -33,10 +32,10 @@ (defmethod ig/pre-init-spec ::handler [_] (s/keys :req [::http/client ::db/pool - ::setup/props])) + ::main/props])) (defmethod ig/init-key ::handler - [_ {:keys [::db/pool ::setup/props] :as cfg}] + [_ {:keys [::db/pool ::main/props] :as cfg}] (fn [{:keys [send? enabled?] :or {send? true enabled? false}}] (let [subs {:newsletter-updates (get-subscriptions-newsletter-updates pool) :newsletter-news (get-subscriptions-newsletter-news pool)} -- Gitee From 2a998a2dcc3479d7d4b29bbe34626afa9f11f234 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 13 Mar 2024 13:29:50 +0100 Subject: [PATCH 0042/1266] :bug: Fix problem when expanding components tab --- frontend/src/app/main/ui/workspace/sidebar/assets/common.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/workspace/sidebar/assets/common.cljs b/frontend/src/app/main/ui/workspace/sidebar/assets/common.cljs index 888143fdb..4c6fa807c 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/assets/common.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/assets/common.cljs @@ -142,7 +142,7 @@ on-collapsed (mf/use-fn - (mf/deps file-id section open?) + (mf/deps file-id section open? assets-count) (fn [_] (when (< 0 assets-count) (st/emit! (dw/set-assets-section-open file-id section (not open?)))))) -- Gitee From c47fe2954a739a1a75dc3a5aed214cedb5037e44 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 13 Mar 2024 13:34:01 +0100 Subject: [PATCH 0043/1266] :bug: Fix problem with typography sample --- .../app/main/ui/workspace/sidebar/options/menus/typography.cljs | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/typography.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/menus/typography.cljs index 0d7977266..44d3de561 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/typography.cljs @@ -441,6 +441,7 @@ [{:keys [visible? typography editable? name-input-ref on-close on-change on-name-blur local? navigate-to-library on-key-down]}] (let [ref (mf/use-ref nil) font-data (fonts/get-font-data (:font-id typography))] + (fonts/ensure-loaded! (:font-id typography)) (mf/use-effect (mf/deps visible?) -- Gitee From b00b77895f7bf64b35b2a697abbf3f9bdf781c03 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 13 Mar 2024 14:07:36 +0100 Subject: [PATCH 0044/1266] :bug: Fix comment number in sidebar --- frontend/src/app/main/data/comments.cljs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/data/comments.cljs b/frontend/src/app/main/data/comments.cljs index ce8e1bd6d..5762229d4 100644 --- a/frontend/src/app/main/data/comments.cljs +++ b/frontend/src/app/main/data/comments.cljs @@ -274,7 +274,9 @@ (ptk/reify ::delete-comment ptk/UpdateEvent (update [_ state] - (d/update-in-when state [:comments thread-id] dissoc id)) + (-> state + (d/update-in-when [:comments thread-id] dissoc id) + (d/update-in-when [:comment-threads thread-id :count-comments] dec))) ptk/WatchEvent (watch [_ state _] -- Gitee From 04a69c2a2cbc363c4a64450e0f2f7e7d6d8b130d Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Wed, 13 Mar 2024 16:41:53 +0100 Subject: [PATCH 0045/1266] :bug: Fix update modal spacing --- .../styles/common/refactor/mixins.scss | 2 +- .../src/app/main/ui/workspace/libraries.cljs | 56 +++-- .../src/app/main/ui/workspace/libraries.scss | 212 +++++++++--------- frontend/translations/es.po | 2 +- 4 files changed, 146 insertions(+), 126 deletions(-) diff --git a/frontend/resources/styles/common/refactor/mixins.scss b/frontend/resources/styles/common/refactor/mixins.scss index 60f2f1e3d..992380e57 100644 --- a/frontend/resources/styles/common/refactor/mixins.scss +++ b/frontend/resources/styles/common/refactor/mixins.scss @@ -116,11 +116,11 @@ } @mixin textEllipsis { + display: block; max-width: 99%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; - display: block; } @mixin twoLineTextEllipsis { diff --git a/frontend/src/app/main/ui/workspace/libraries.cljs b/frontend/src/app/main/ui/workspace/libraries.cljs index 4cf953ae8..564093850 100644 --- a/frontend/src/app/main/ui/workspace/libraries.cljs +++ b/frontend/src/app/main/ui/workspace/libraries.cljs @@ -37,6 +37,15 @@ (def ^:private close-icon (i/icon-xref :close (stl/css :close-icon))) +(def ^:private add-icon + (i/icon-xref :add (stl/css :add-icon))) + +(def ^:private detach-icon + (i/icon-xref :detach (stl/css :detach-icon))) + +(def ^:private library-icon + (i/icon-xref :library (stl/css :library-icon))) + (def ref:workspace-file (l/derived :workspace-file st/state)) @@ -189,14 +198,14 @@ :count-libraries 1}))))] [:div {:class (stl/css :libraries-content)} - [:div {:class (stl/css :section)} + [:div {:class (stl/css :lib-section)} [:& title-bar {:collapsable false :title (tr "workspace.libraries.in-this-file") :class (stl/css :title-spacing-lib)}] [:div {:class (stl/css :section-list)} [:div {:class (stl/css :section-list-item)} - [:div + [:div {:class (stl/css :item-content)} [:div {:class (stl/css :item-name)} (tr "workspace.libraries.file-library")] [:ul {:class (stl/css :item-contents)} [:& describe-library-blocks {:components-count (count components) @@ -216,7 +225,7 @@ (for [{:keys [id name] :as library} linked-libraries] [:div {:class (stl/css :section-list-item) :key (dm/str id)} - [:div + [:div {:class (stl/css :item-content)} [:div {:class (stl/css :item-name)} name] [:ul {:class (stl/css :item-contents)} (let [components-count (count (or (ctkl/components-seq (:data library)) [])) @@ -232,24 +241,23 @@ :type "button" :data-library-id (dm/str id) :on-click unlink-library} - i/detach]])]] + detach-icon]])]] - [:div {:class (stl/css :section)} + [:div {:class (stl/css :shared-section)} [:& title-bar {:collapsable false :title (tr "workspace.libraries.shared-libraries") :class (stl/css :title-spacing-lib)}] - [:div {:class (stl/css :libraries-search)} - [:& search-bar {:on-change change-search-term - :value search-term - :placeholder (tr "workspace.libraries.search-shared-libraries") - :icon (mf/html [:span {:class (stl/css :search-icon)} i/search])}]] + [:& search-bar {:on-change change-search-term + :value search-term + :placeholder (tr "workspace.libraries.search-shared-libraries") + :icon (mf/html [:span {:class (stl/css :search-icon)} i/search])}] (if (seq shared-libraries) [:div {:class (stl/css :section-list-shared)} (for [{:keys [id name] :as library} shared-libraries] [:div {:class (stl/css :section-list-item) :key (dm/str id)} - [:div + [:div {:class (stl/css :item-content)} [:div {:class (stl/css :item-name)} name] [:ul {:class (stl/css :item-contents)} (let [components-count (dm/get-in library [:library-summary :components :count] 0) @@ -263,7 +271,7 @@ [:button {:class (stl/css :item-button-shared) :data-library-id (dm/str id) :on-click link-library} - i/add]])] + add-icon]])] (when (empty? shared-libraries) [:div {:class (stl/css :section-list-empty)} @@ -272,7 +280,10 @@ (tr "workspace.libraries.loading") (str/empty? search-term) - (tr "workspace.libraries.no-shared-libraries-available") + [:* + [:span {:class (stl/css :empty-state-icon)} + library-icon] + (tr "workspace.libraries.no-shared-libraries-available")] :else (tr "workspace.libraries.no-matches-for" search-term))]))]])) @@ -351,9 +362,11 @@ (dwl/sync-file file-id library-id))))))] [:div {:class (stl/css :updates-content)} - [:div {:class (stl/css :section)} + [:div {:class (stl/css :update-section)} (if (empty? libs-assets) [:div {:class (stl/css :section-list-empty)} + [:span {:class (stl/css :empty-state-icon)} + library-icon] (tr "workspace.libraries.no-libraries-need-sync")] [:* [:div {:class (stl/css :section-title)} (tr "workspace.libraries.library-updates")] @@ -364,7 +377,7 @@ {:keys [components colors typographies]}] libs-assets] [:div {:class (stl/css :section-list-item) :key (dm/str id)} - [:div + [:div {:class (stl/css :item-content)} [:div {:class (stl/css :item-name)} name] [:ul {:class (stl/css :item-contents)} (describe-library (count components) @@ -388,6 +401,7 @@ root-shape (ctf/get-component-root (:data library) component)] [:* [:& component-svg {:root-shape root-shape + :class (stl/css :component-svg) :objects (:objects component)}] [:div {:class (stl/css :name-block)} [:span {:class (stl/css :item-name) @@ -396,7 +410,7 @@ (when (:components exceeded) [:div {:class (stl/css :libraries-updates-item) :key (uuid/next)} - [:div {:class (stl/css :name-block.ellipsis)} + [:div {:class (stl/css :name-block :ellipsis)} [:span {:class (stl/css :item-name)} "(...)"]]])]) (when-not (empty? colors) @@ -448,10 +462,9 @@ (when (or (pos? (:components exceeded)) (pos? (:colors exceeded)) (pos? (:typographies exceeded))) - [:div {:class (stl/css :libraries-updates-see-all)} - [:& lb/link-button {:on-click see-all-assets - :value (str "(" (tr "workspace.libraries.update.see-all-changes") ")")}]])])]])]])) - + [:& lb/link-button {:on-click see-all-assets + :class (stl/css :libraries-updates-see-all) + :value (str "(" (tr "workspace.libraries.update.see-all-changes") ")")}])])]])]])) (mf/defc libraries-dialog {::mf/register modal/components ::mf/register-as :libraries-dialog} @@ -525,7 +538,8 @@ [:div {:class (stl/css :modal-overlay)} [:div {:class (stl/css :modal-dialog :modal-v2-info)} - [:div {:class (stl/css :modal-title)} "IMPORTANT INFORMATION ABOUT NEW COMPONENTS"] + [:div {:class (stl/css :modal-v2-title)} + "IMPORTANT INFORMATION ABOUT NEW COMPONENTS"] [:div {:class (stl/css :modal-content)} [:div {:class (stl/css :info-content)} [:div {:class (stl/css :info-block)} diff --git a/frontend/src/app/main/ui/workspace/libraries.scss b/frontend/src/app/main/ui/workspace/libraries.scss index 761d47efa..6c430b0d8 100644 --- a/frontend/src/app/main/ui/workspace/libraries.scss +++ b/frontend/src/app/main/ui/workspace/libraries.scss @@ -13,6 +13,8 @@ .modal-dialog { @extend .modal-container-base; + display: grid; + grid-template-rows: auto 1fr; height: $s-520; max-height: $s-520; width: $s-712; @@ -30,7 +32,7 @@ .modal-title { @include headlineMediumTypography; - margin-bottom: $s-16; + margin-block-end: $s-16; color: var(--modal-title-foreground-color); } @@ -40,15 +42,20 @@ display: grid; grid-template-columns: 1fr 1fr; gap: $s-32; - padding-top: $s-24; - height: 100%; max-height: $s-400; + padding-block-start: $s-16; } -.section { - display: flex; - flex-direction: column; - height: calc(100% - $s-12); +.lib-section, +.update-section, +.shared-section { + display: grid; + grid-template-rows: auto 1fr; + gap: $s-8; +} + +.shared-section { + grid-template-rows: auto auto 1fr; } .title-spacing-lib { @@ -57,20 +64,21 @@ .section-list, .section-list-shared { - height: 100%; + display: grid; + grid-auto-rows: min-content; + gap: $s-8; max-height: $s-320; - margin-top: $s-12; - overflow: auto; + overflow-y: auto; } .section-list-item { display: grid; grid-template-columns: 1fr auto; - column-gap: $s-12; - margin-bottom: $s-24; - &:last-child { - margin-bottom: $s-8; - } + gap: $s-8; +} + +.item-content { + height: fit-content; } .item-name { @@ -85,6 +93,7 @@ height: $s-32; min-width: $s-92; padding: $s-8 $s-24; + margin: 0; border-radius: $br-8; } @@ -95,26 +104,17 @@ .item-button, .item-button-shared { @extend .button-secondary; - padding: $s-8 $s-24; height: $s-32; - border-radius: $br-8; - margin-right: $s-2; - padding: $s-8; width: $s-32; - margin-left: $s-8; - svg { - @extend .button-icon; - stroke: var(--icon-foreground); - } + margin-inline-start: $s-2; + margin-inline-end: $s-8; + padding: $s-8; } -.item-button-icon { - width: $s-28; - height: $s-28; - svg { - @extend .button-icon; - stroke: var(--icon-foreground); - } +.detach-icon, +.add-icon { + @extend .button-icon; + stroke: var(--icon-foreground); } .section-list-shared { @@ -123,46 +123,56 @@ .section-title { @include headlineSmallTypography; + margin-block-end: $s-12; color: var(--title-foreground-color); - margin-bottom: $s-12; -} - -.libraries-search { - margin: $s-12 0; } .search-icon { @include flexCenter; - padding: 0 0 0 $s-8; width: $s-20; + padding: 0 0 0 $s-8; svg { @extend .button-icon-small; stroke: var(--icon-foreground); } } +// empty state .section-list-empty { - @include bodyLargeTypography; + @include bodyMediumTypography; + display: grid; + grid-template-rows: auto 1fr; + justify-items: center; + gap: $s-8; + text-align: center; + height: fit-content; + margin-block: $s-16; + color: var(--modal-title-foreground-color); +} + +.empty-state-icon { @include flexCenter; - color: var(--empty-message-foreground-color); + width: $s-48; + height: $s-48; + border-radius: $br-circle; + background-color: var(--pill-background-color); +} - svg { - @extend .button-icon-small; - stroke: var(--icon-foreground); - width: $s-16; - height: $s-16; - } +.library-icon { + @extend .button-icon; + stroke: var(--icon-foreground); + height: $s-32; + width: $s-32; } +// Update library tab .libraries-updates-see-all { + @extend .link; direction: rtl; grid-column: span 3; - margin-top: $s-8; - margin-right: $s-8; - & input { - @extend .link; - margin: 0; - } + margin-block-start: $s-8; + margin-inline-start: $s-8; + margin: 0; } .updates-content { @@ -173,55 +183,41 @@ display: grid; grid-column: span 3; grid-template-columns: repeat(auto-fill, minmax($s-160, 1fr)); - grid-gap: $s-24; - font-size: $fs-12; - margin-top: $s-16; + gap: $s-24; + margin-block-start: $s-16; } .libraries-updates-item { - display: flex; - align-items: center; + @include bodyLargeTypography; + display: grid; + grid-template-columns: auto 1fr; + align-items: start; + gap: $s-8; color: var(--library-content-foreground-color); +} - &:not(:first-child) { - margin-top: $s-8; - } - - & svg { - background-color: var(--color-canvas); - border-radius: $br-4; - border: $s-2 solid transparent; - height: $s-24; - width: $s-24; - min-height: $s-24; - min-width: $s-24; - } - - & .name-block { - color: var(--gray-20-color); - margin-left: $s-8; - width: $s-168; +.component-svg { + background-color: var(--color-canvas); + border-radius: $br-4; + border: $s-2 solid transparent; + height: $s-24; + width: $s-24; + min-height: $s-24; + min-width: $s-24; +} - &.ellipsis { - padding-left: calc($s-24 + #{$s-8}); - } - } +.name-block { + color: var(--library-content-foreground-color); + width: $s-168; +} - & .item-name { - display: block; - margin: 0; - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - } +.ellipsis { + padding-inline-start: calc($s-24 + #{$s-8}); } -.modal-v2-info { - width: $s-664; - height: fit-content; - .modal-title { - font-size: $fs-18; - } +.item-name { + @include textEllipsis; + margin: 0; } .item-update { @@ -230,8 +226,8 @@ height: $s-32; min-width: $s-92; padding: $s-8 $s-24; + margin-inline-end: $s-2; border-radius: $br-8; - margin-right: $s-2; &:disabled { @extend .button-disabled; } @@ -242,6 +238,7 @@ color: var(--library-content-foreground-color); display: flex; flex-wrap: wrap; + margin: 0; } .element-count { @@ -253,10 +250,21 @@ } } +// Modal Component v2 update +.modal-v2-info { + width: $s-664; + height: fit-content; +} + +.modal-v2-title { + @include headlineMediumTypography; + color: var(--modal-title-foreground-color); +} + .info-content { + display: grid; + grid-template-rows: repeat(4, 1fr); margin-top: $s-32; - display: flex; - flex-direction: column; gap: $s-24; } @@ -276,7 +284,6 @@ margin-top: $s-8; border-radius: $br-circle; background: $db-quaternary; - display: flex; justify-content: center; align-items: center; @@ -284,28 +291,27 @@ svg { width: $s-32; height: $s-32; - fill: $da-primary; + fill: var(--icon-foreground-active); } } .info-block-title { + @include bodyLargeTypography; grid-area: title; - font-size: $fs-16; - color: $df-primary; + color: var(--modal-title-foreground-color); } .info-block-content { + @include bodyMediumTypography; grid-area: content; - font-size: $fs-14; - color: $df-secondary; - line-height: 1.2; + color: var(--library-content-foreground-color); } .info-bottom { - margin-top: $s-24; - margin-right: $s-8; display: flex; justify-content: flex-end; + margin-block-start: $s-24; + margin-inline-end: $s-8; } .primary-button { diff --git a/frontend/translations/es.po b/frontend/translations/es.po index 7656b949d..8d9831183 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -3633,7 +3633,7 @@ msgstr "%s componentes" #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.file-library" -msgstr "Biblioteca de este archivo" +msgstr "Biblioteca del archivo" #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.graphics" -- Gitee From 2247f0ecac93f7afd61ae8c5a1db4c1b58a7f056 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Fri, 8 Mar 2024 16:47:30 +0100 Subject: [PATCH 0046/1266] :recycle: Add a tool to generate swap-slots --- backend/src/app/srepl/fixes.clj | 105 ++++++++++++++++++++- common/src/app/common/types/container.cljc | 6 +- common/src/app/common/types/file.cljc | 13 +-- 3 files changed, 116 insertions(+), 8 deletions(-) diff --git a/backend/src/app/srepl/fixes.clj b/backend/src/app/srepl/fixes.clj index 955f08366..2d50bd8a8 100644 --- a/backend/src/app/srepl/fixes.clj +++ b/backend/src/app/srepl/fixes.clj @@ -10,10 +10,15 @@ (:require [app.binfile.common :as bfc] [app.common.data :as d] + [app.common.data.macros :as dm] [app.common.files.changes :as cpc] + [app.common.files.helpers :as cfh] [app.common.files.repair :as cfr] [app.common.files.validate :as cfv] [app.common.logging :as l] + [app.common.types.component :as ctk] + [app.common.types.container :as ctn] + [app.common.types.file :as ctf] [app.common.uuid :as uuid] [app.db :as db] [app.features.fdata :as feat.fdata] @@ -133,4 +138,102 @@ (fn [touched] (disj touched :shapes-group))))] file (-> file - (update :data fix-fdata)))) \ No newline at end of file + (update :data fix-fdata)))) + +(defn add-swap-slots + [file libs _opts] + ;; Detect swapped copies and try to generate a valid swap-slot. + (letfn [(process-fdata [data] + ;; Walk through all containers in the file, both pages and deleted components. + (reduce process-container data (ctf/object-containers-seq data))) + + (process-container [data container] + ;; Walk through all shapes in depth-first tree order. + (l/dbg :hint "Processing container" :type (:type container) :name (:name container)) + (let [root-shape (ctn/get-container-root container)] + (ctf/update-container data + container + #(reduce process-shape % (ctn/get-direct-children container root-shape))))) + + (process-shape [container shape] + ;; Look for head copies in the first level (either component roots or inside main components). + ;; Even if they have been swapped, we don't add slot to them because there is no way to know + ;; the original shape. Only children. + (if (and (ctk/instance-head? shape) + (ctk/in-component-copy? shape) + (nil? (ctk/get-swap-slot shape))) + (process-copy-head container shape) + (reduce process-shape container (ctn/get-direct-children container shape)))) + + (process-copy-head [container head-shape] + ;; Process recursively all children, comparing each one with the corresponding child in the main + ;; component, looking by position. If the shape-ref does not point to the found child, then it has + ;; been swapped and need to set up a slot. + (l/trc :hint "Processing copy-head" :id (:id head-shape) :name (:name head-shape)) + (let [component-shape (ctf/find-ref-shape file container libs head-shape :include-deleted? true :with-context? true) + component-container (:container (meta component-shape))] + (loop [container container + children (map #(ctn/get-shape container %) (:shapes head-shape)) + component-children (map #(ctn/get-shape component-container %) (:shapes component-shape))] + (let [child (first children) + component-child (first component-children)] + (if (or (nil? child) (nil? component-child)) + container + (let [container (if (and (not (ctk/is-main-of? component-child child)) + (nil? (ctk/get-swap-slot child)) + (ctk/instance-head? child)) + (let [slot (guess-swap-slot component-child component-container)] + (l/dbg :hint "child" :id (:id child) :name (:name child) :slot slot) + (ctn/update-shape container (:id child) + #(update % :touched + cfh/set-touched-group + (ctk/build-swap-slot-group slot)))) + container)] + (recur (process-copy-head container child) + (rest children) + (rest component-children)))))))) + + (guess-swap-slot [shape container] + ;; To guess the slot, we must follow the chain until we find the definitive main. But + ;; we cannot navigate by shape-ref, because main shapes may also have been swapped. So + ;; chain by position, too. + (if-let [slot (ctk/get-swap-slot shape)] + slot + (if-not (ctk/in-component-copy? shape) + (:id shape) + (let [head-copy (ctn/get-component-shape (:objects container) shape)] + (if (= (:id head-copy) (:id shape)) + (:id shape) + (let [head-main (ctf/find-ref-shape file + container + libs + head-copy + :include-deleted? true + :with-context? true) + container-main (:container (meta head-main)) + shape-main (find-match-by-position shape + head-copy + container + head-main + container-main)] + (guess-swap-slot shape-main container-main))))))) + + (find-match-by-position [shape-copy head-copy container-copy head-main container-main] + ;; Find the shape in the main that has the same position under its parent than + ;; the copy under its one. To get the parent we must process recursively until + ;; the component head, because mains may also have been swapped. + (let [parent-copy (ctn/get-shape container-copy (:parent-id shape-copy)) + parent-main (if (= (:id parent-copy) (:id head-copy)) + head-main + (find-match-by-position parent-copy + head-copy + container-copy + head-main + container-main)) + index (cfh/get-position-on-parent (:objects container-copy) + (:id shape-copy)) + shape-main-id (dm/get-in parent-main [:shapes index])] + (ctn/get-shape container-main shape-main-id)))] + + file (-> file + (update :data process-fdata)))) diff --git a/common/src/app/common/types/container.cljc b/common/src/app/common/types/container.cljc index ddeeea734..ee2be1ae6 100644 --- a/common/src/app/common/types/container.cljc +++ b/common/src/app/common/types/container.cljc @@ -90,6 +90,10 @@ [container shape-id f] (update-in container [:objects shape-id] f)) +(defn get-container-root + [container] + (d/seek #(or (nil? (:parent-id %)) (= (:parent-id %) uuid/zero)) (shapes-seq container))) + (defn get-direct-children [container shape] (map #(get-shape container %) (:shapes shape))) @@ -107,7 +111,7 @@ (get-children-rec [] id))) (defn get-component-shape - "Get the parent top shape linked to a component for this shape, if any" + "Get the parent top shape linked to a component main for this shape, if any" ([objects shape] (get-component-shape objects shape nil)) ([objects shape {:keys [allow-main?] :or {allow-main? false} :as options}] (let [parent (get objects (:parent-id shape))] diff --git a/common/src/app/common/types/file.cljc b/common/src/app/common/types/file.cljc index a060fe634..3afb89c24 100644 --- a/common/src/app/common/types/file.cljc +++ b/common/src/app/common/types/file.cljc @@ -147,7 +147,7 @@ (defn get-component-container "Retrieve the container that holds the component shapes (the page in components-v2 - or the component itself in v1)" + or the component itself in v1 or deleted component)." [file-data component] (let [components-v2 (dm/get-in file-data [:options :components-v2])] (if (and components-v2 (not (:deleted component))) @@ -182,11 +182,12 @@ :data file-data} :container (ctn/make-container component-page :page)}))))) - (cond-> (dm/get-in component [:objects shape-id]) - with-context? - (with-meta {:file {:id (:id file-data) - :data file-data} - :container (ctn/make-container component :component)}))))) + (let [shape (dm/get-in component [:objects shape-id])] + (cond-> shape + (and shape with-context?) + (with-meta {:file {:id (:id file-data) + :data file-data} + :container (ctn/make-container component :component)})))))) (defn get-ref-shape "Retrieve the shape in the component that is referenced by the instance shape." -- Gitee From fbe09e6b5a8c68a48d3bb6d884cf917a99f07ec2 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Wed, 13 Mar 2024 17:36:40 +0100 Subject: [PATCH 0047/1266] :bug: Fix workspace context menu in small screens --- .../styles/main/partials/workspace.scss | 84 ------------------- .../app/main/ui/workspace/context_menu.cljs | 9 +- .../app/main/ui/workspace/context_menu.scss | 2 + .../ui/workspace/text_palette_ctx_menu.cljs | 2 +- .../ui/workspace/text_palette_ctx_menu.scss | 2 +- 5 files changed, 8 insertions(+), 91 deletions(-) diff --git a/frontend/resources/styles/main/partials/workspace.scss b/frontend/resources/styles/main/partials/workspace.scss index a387fed48..088add928 100644 --- a/frontend/resources/styles/main/partials/workspace.scss +++ b/frontend/resources/styles/main/partials/workspace.scss @@ -68,90 +68,6 @@ $height-palette-max: 80px; } } -.workspace-context-menu { - background-color: $color-white; - border-radius: $br3; - box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.25); - left: 740px; - position: absolute; - top: 40px; - width: 240px; - z-index: 12; - - li { - align-items: center; - font-size: $fs14; - padding: $size-1 $size-4; - cursor: pointer; - - display: flex; - justify-content: space-between; - - &.separator { - border-top: 1px solid $color-gray-10; - padding: 0px; - margin: 2px; - } - - span { - color: $color-gray-60; - } - - span.shortcut { - color: $color-gray-20; - font-size: $fs12; - } - - &:hover { - background-color: $color-primary-lighter; - } - - .submenu-icon { - position: absolute; - right: 1rem; - - svg { - width: 10px; - height: 10px; - } - } - } - - .icon-menu-item { - display: flex; - justify-content: flex-start; - - &:hover { - background-color: $color-primary-lighter; - } - - span.title { - margin-left: 5px; - } - - .selected-icon { - svg { - width: 10px; - height: 10px; - } - } - - .shape-icon { - margin-left: 3px; - svg { - width: 13px; - height: 13px; - } - } - - .icon-wrapper { - display: grid; - grid-template-columns: 1fr 1fr; - margin: 0; - } - } -} - .workspace-content { background-color: $color-canvas; display: flex; diff --git a/frontend/src/app/main/ui/workspace/context_menu.cljs b/frontend/src/app/main/ui/workspace/context_menu.cljs index 8ba1763fe..21f06b71c 100644 --- a/frontend/src/app/main/ui/workspace/context_menu.cljs +++ b/frontend/src/app/main/ui/workspace/context_menu.cljs @@ -652,11 +652,10 @@ [:& dropdown {:show (boolean mdata) :on-close #(st/emit! dw/hide-context-menu)} - [:ul - {:class (stl/css :workspace-context-menu) - :ref dropdown-ref - :style {:top top :left left} - :on-context-menu prevent-default} + [:ul {:class (stl/css :workspace-context-menu) + :ref dropdown-ref + :style {:top top :left left} + :on-context-menu prevent-default} (case (:kind mdata) :shape [:& shape-context-menu {:mdata mdata}] diff --git a/frontend/src/app/main/ui/workspace/context_menu.scss b/frontend/src/app/main/ui/workspace/context_menu.scss index 0ce429a5b..94b7060a0 100644 --- a/frontend/src/app/main/ui/workspace/context_menu.scss +++ b/frontend/src/app/main/ui/workspace/context_menu.scss @@ -20,6 +20,8 @@ border: $s-2 solid var(--panel-border-color); background-color: var(--menu-background-color); z-index: $z-index-4; + max-height: 100vh; + overflow-y: auto; } .separator { diff --git a/frontend/src/app/main/ui/workspace/text_palette_ctx_menu.cljs b/frontend/src/app/main/ui/workspace/text_palette_ctx_menu.cljs index f3cbb2208..3f1b573df 100644 --- a/frontend/src/app/main/ui/workspace/text_palette_ctx_menu.cljs +++ b/frontend/src/app/main/ui/workspace/text_palette_ctx_menu.cljs @@ -21,7 +21,7 @@ shared-libs (mf/deref refs/workspace-libraries)] [:& dropdown {:show show-menu? :on-close close-menu} - [:ul {:class (stl/css :workspace-context-menu)} + [:ul {:class (stl/css :text-context-menu)} (for [[idx cur-library] (map-indexed vector (vals shared-libs))] (let [typographies (-> cur-library (get-in [:data :typographies]) vals)] [:li diff --git a/frontend/src/app/main/ui/workspace/text_palette_ctx_menu.scss b/frontend/src/app/main/ui/workspace/text_palette_ctx_menu.scss index e29217eaa..664738562 100644 --- a/frontend/src/app/main/ui/workspace/text_palette_ctx_menu.scss +++ b/frontend/src/app/main/ui/workspace/text_palette_ctx_menu.scss @@ -6,7 +6,7 @@ @import "refactor/common-refactor.scss"; -.workspace-context-menu { +.text-context-menu { position: absolute; left: auto; bottom: var(--height); -- Gitee From 75d064806522745f68e33c2c5e1850719c85a67e Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 13 Mar 2024 17:53:30 +0100 Subject: [PATCH 0048/1266] :bug: Fix problem with throttle function --- .../app/main/ui/workspace/sidebar/layers.cljs | 28 ++++++++++--------- frontend/src/app/util/rxops.cljs | 2 +- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/sidebar/layers.cljs b/frontend/src/app/main/ui/workspace/sidebar/layers.cljs index 5d3f5da5d..4ab174a38 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/layers.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/layers.cljs @@ -25,7 +25,7 @@ [app.util.globals :as globals] [app.util.i18n :as i18n :refer [tr]] [app.util.keyboard :as kbd] - [app.util.timers :as ts] + [app.util.rxops :refer [throttle-fn]] [beicon.v2.core :as rx] [cuerdas.core :as str] [goog.events :as events] @@ -38,22 +38,24 @@ (mf/defc frame-wrapper {::mf/props :obj} [{:keys [selected] :as props}] - (let [disposable (mf/use-var nil) - pending-selected (mf/use-var selected) + (let [pending-selected (mf/use-var selected) current-selected (mf/use-state selected) - props (mf/spread props :selected @current-selected)] + props (mf/spread props :selected @current-selected) - (mf/with-effect [selected] + set-selected + (mf/use-memo + (fn [] + (throttle-fn + 50 + #(when-let [pending-selected @pending-selected] + (reset! current-selected pending-selected)))))] + + (mf/with-effect [selected set-selected] (reset! pending-selected selected) - (swap! disposable (fn [value] - (when (some? value) - (rx/dispose! value)) - (ts/idle-then-raf - (fn [] - (reset! current-selected @pending-selected) - (reset! disposable nil))))) + (set-selected) (fn [] - (some-> @disposable rx/dispose!))) + (reset! pending-selected nil) + #(rx/dispose! set-selected))) [:> layer-item props])) diff --git a/frontend/src/app/util/rxops.cljs b/frontend/src/app/util/rxops.cljs index 05732f3d0..7a36a8c3e 100644 --- a/frontend/src/app/util/rxops.cljs +++ b/frontend/src/app/util/rxops.cljs @@ -44,7 +44,7 @@ (when-not ^boolean timeout-id (set! (.-timeoutId state) - (js/setTimeout execute-fn (- delay ctime ltime))))))))] + (js/setTimeout execute-fn (- delay (- ctime ltime)))))))))] (specify! wrapped-fn rx/IDisposable -- Gitee From 91118bec709b261cef0b95f191e15fc27fcae738 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 14 Mar 2024 10:29:21 +0100 Subject: [PATCH 0049/1266] :sparkles: Improve internal naming of setup/props This reverts commit a6f70c77cbe72875875ab83587d5dcd9cfc61e34. --- backend/src/app/auth/oidc.clj | 11 +++++----- backend/src/app/http.clj | 3 ++- backend/src/app/http/access_token.clj | 3 ++- backend/src/app/http/awsns.clj | 5 +++-- backend/src/app/http/client.clj | 4 ++-- backend/src/app/http/debug.clj | 3 ++- backend/src/app/http/session.clj | 5 +++-- backend/src/app/loggers/audit.clj | 13 ++++++------ backend/src/app/main.clj | 18 ++++++++-------- backend/src/app/rpc.clj | 5 +++-- backend/src/app/rpc/commands/access_token.clj | 5 +++-- backend/src/app/rpc/commands/auth.clj | 21 ++++++++++--------- backend/src/app/rpc/commands/ldap.clj | 3 ++- backend/src/app/rpc/commands/profile.clj | 5 +++-- backend/src/app/rpc/commands/teams.clj | 5 +++-- backend/src/app/rpc/commands/verify_token.clj | 3 ++- backend/src/app/setup.clj | 9 ++++---- backend/src/app/tasks/telemetry.clj | 5 +++-- .../backend_tests/bounce_handling_test.clj | 14 ++++++------- 19 files changed, 77 insertions(+), 63 deletions(-) diff --git a/backend/src/app/auth/oidc.clj b/backend/src/app/auth/oidc.clj index 9e07a21e2..34e2cee57 100644 --- a/backend/src/app/auth/oidc.clj +++ b/backend/src/app/auth/oidc.clj @@ -22,6 +22,7 @@ [app.loggers.audit :as audit] [app.main :as-alias main] [app.rpc.commands.profile :as profile] + [app.setup :as-alias setup] [app.tokens :as tokens] [app.util.json :as json] [app.util.time :as dt] @@ -413,7 +414,7 @@ ::props])) (defn get-info - [{:keys [provider ::main/props] :as cfg} {:keys [params] :as request}] + [{:keys [provider ::setup/props] :as cfg} {:keys [params] :as request}] (when-let [error (get params :error)] (ex/raise :type :internal :code :error-on-retrieving-code @@ -508,7 +509,7 @@ (if profile (let [sxf (session/create-fn cfg (:id profile)) token (or (:invitation-token info) - (tokens/generate (::main/props cfg) + (tokens/generate (::setup/props cfg) {:iss :auth :exp (dt/in-future "15m") :profile-id (:id profile)})) @@ -536,7 +537,7 @@ :iss :prepared-register :is-active true :exp (dt/in-future {:hours 48})) - token (tokens/generate (::main/props cfg) info) + token (tokens/generate (::setup/props cfg) info) params (d/without-nils {:token token :fullname (:fullname info)}) @@ -551,7 +552,7 @@ (defn- auth-handler [cfg {:keys [params] :as request}] (let [props (audit/extract-utm-params params) - state (tokens/generate (::main/props cfg) + state (tokens/generate (::setup/props cfg) {:iss :oauth :invitation-token (:invitation-token params) :props props @@ -618,7 +619,7 @@ [_] (s/keys :req [::session/manager ::http/client - ::main/props + ::setup/props ::db/pool ::providers])) diff --git a/backend/src/app/http.clj b/backend/src/app/http.clj index 1e605cdb0..a696d5477 100644 --- a/backend/src/app/http.clj +++ b/backend/src/app/http.clj @@ -23,6 +23,7 @@ [app.metrics :as mtx] [app.rpc :as-alias rpc] [app.rpc.doc :as-alias rpc.doc] + [app.setup :as-alias setup] [clojure.spec.alpha :as s] [integrant.core :as ig] [promesa.exec :as px] @@ -136,7 +137,7 @@ ::rpc/routes ::rpc.doc/routes ::oidc/routes - ::main/props + ::setup/props ::assets/routes ::debug/routes ::db/pool diff --git a/backend/src/app/http/access_token.clj b/backend/src/app/http/access_token.clj index bfddbb42d..0d1865f10 100644 --- a/backend/src/app/http/access_token.clj +++ b/backend/src/app/http/access_token.clj @@ -10,6 +10,7 @@ [app.config :as cf] [app.db :as db] [app.main :as-alias main] + [app.setup :as-alias setup] [app.tokens :as tokens] [ring.request :as rreq])) @@ -42,7 +43,7 @@ (defn- wrap-soft-auth "Soft Authentication, will be executed synchronously on the undertow worker thread." - [handler {:keys [::main/props]}] + [handler {:keys [::setup/props]}] (letfn [(handle-request [request] (try (let [token (get-token request) diff --git a/backend/src/app/http/awsns.clj b/backend/src/app/http/awsns.clj index 7508be8a2..88060bb20 100644 --- a/backend/src/app/http/awsns.clj +++ b/backend/src/app/http/awsns.clj @@ -13,6 +13,7 @@ [app.db.sql :as sql] [app.http.client :as http] [app.main :as-alias main] + [app.setup :as-alias setup] [app.tokens :as tokens] [app.worker :as-alias wrk] [clojure.spec.alpha :as s] @@ -30,7 +31,7 @@ (defmethod ig/pre-init-spec ::routes [_] (s/keys :req [::http/client - ::main/props + ::setup/props ::db/pool])) (defmethod ig/init-key ::routes @@ -106,7 +107,7 @@ [cfg headers] (let [tdata (get headers "x-penpot-data")] (when-not (str/empty? tdata) - (let [result (tokens/verify (::main/props cfg) {:token tdata :iss :profile-identity})] + (let [result (tokens/verify (::setup/props cfg) {:token tdata :iss :profile-identity})] (:profile-id result))))) (defn- parse-notification diff --git a/backend/src/app/http/client.clj b/backend/src/app/http/client.clj index 5b4a8541c..9ef4cc4b2 100644 --- a/backend/src/app/http/client.clj +++ b/backend/src/app/http/client.clj @@ -55,8 +55,8 @@ convention." ([cfg-or-client request] (let [client (resolve-client cfg-or-client)] - (send! client request {}))) + (send! client request {:sync? true}))) ([cfg-or-client request options] (let [client (resolve-client cfg-or-client)] - (send! client request options)))) + (send! client request (merge {:sync? true} options))))) diff --git a/backend/src/app/http/debug.clj b/backend/src/app/http/debug.clj index 1d2a129cf..a453c6872 100644 --- a/backend/src/app/http/debug.clj +++ b/backend/src/app/http/debug.clj @@ -20,6 +20,7 @@ [app.rpc.commands.auth :as auth] [app.rpc.commands.files-create :refer [create-file]] [app.rpc.commands.profile :as profile] + [app.setup :as-alias setup] [app.srepl.helpers :as srepl] [app.storage :as-alias sto] [app.storage.tmp :as tmp] @@ -340,7 +341,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defn- resend-email-notification - [{:keys [::db/pool ::main/props] :as cfg} {:keys [params] :as request}] + [{:keys [::db/pool ::setup/props] :as cfg} {:keys [params] :as request}] (when-not (contains? params :force) (ex/raise :type :validation diff --git a/backend/src/app/http/session.clj b/backend/src/app/http/session.clj index 7ff6dfa01..c4a3f0ba6 100644 --- a/backend/src/app/http/session.clj +++ b/backend/src/app/http/session.clj @@ -15,6 +15,7 @@ [app.db.sql :as sql] [app.http.session.tasks :as-alias tasks] [app.main :as-alias main] + [app.setup :as-alias setup] [app.tokens :as tokens] [app.util.time :as dt] [clojure.spec.alpha :as s] @@ -138,7 +139,7 @@ (declare ^:private gen-token) (defn create-fn - [{:keys [::manager ::main/props]} profile-id] + [{:keys [::manager ::setup/props]} profile-id] (us/assert! ::manager manager) (us/assert! ::us/uuid profile-id) @@ -196,7 +197,7 @@ (neg? (compare default-renewal-max-age elapsed))))) (defn- wrap-soft-auth - [handler {:keys [::manager ::main/props]}] + [handler {:keys [::manager ::setup/props]}] (us/assert! ::manager manager) (letfn [(handle-request [request] (try diff --git a/backend/src/app/loggers/audit.clj b/backend/src/app/loggers/audit.clj index 45c36334a..aead09110 100644 --- a/backend/src/app/loggers/audit.clj +++ b/backend/src/app/loggers/audit.clj @@ -24,6 +24,7 @@ [app.main :as-alias main] [app.rpc :as-alias rpc] [app.rpc.retry :as rtry] + [app.setup :as-alias setup] [app.tokens :as tokens] [app.util.services :as-alias sv] [app.util.time :as dt] @@ -261,7 +262,7 @@ (s/def ::tasks/uri ::us/string) (defmethod ig/pre-init-spec ::tasks/archive-task [_] - (s/keys :req [::db/pool ::main/props ::http.client/client])) + (s/keys :req [::db/pool ::setup/props ::http.client/client])) (defmethod ig/init-key ::tasks/archive [_ cfg] @@ -287,7 +288,7 @@ (px/sleep 100) (recur (+ total ^long n))) (when (pos? total) - (l/debug :hint "events archived" :total total))))))))) + (l/dbg :hint "events archived" :total total))))))))) (def ^:private sql:retrieve-batch-of-audit-log "select * @@ -322,7 +323,7 @@ :context])) (send [events] - (let [token (tokens/generate (::main/props cfg) + (let [token (tokens/generate (::setup/props cfg) {:iss "authentication" :iat (dt/now) :uid uuid/zero}) @@ -331,11 +332,11 @@ "origin" (cf/get :public-uri) "cookie" (u/map->query-string {:auth-token token})} params {:uri uri - :timeout 6000 + :timeout 12000 :method :post :headers headers :body body} - resp (http.client/req! cfg params {:sync? true})] + resp (http.client/req! cfg params)] (if (= (:status resp) 204) true (do @@ -355,7 +356,7 @@ (map row->event)) events (into [] xform rows)] (when-not (empty? events) - (l/trace :hint "archive events chunk" :uri uri :events (count events)) + (l/trc :hint "archive events chunk" :uri uri :events (count events)) (when (send events) (mark-as-archived conn rows) (count events))))))) diff --git a/backend/src/app/main.clj b/backend/src/app/main.clj index 47e43f5cf..e0177110f 100644 --- a/backend/src/app/main.clj +++ b/backend/src/app/main.clj @@ -221,7 +221,7 @@ {::db/pool (ig/ref ::db/pool)} ::http.awsns/routes - {::props (ig/ref ::setup/props) + {::setup/props (ig/ref ::setup/props) ::db/pool (ig/ref ::db/pool) ::http.client/client (ig/ref ::http.client/client)} @@ -262,7 +262,7 @@ ::oidc/routes {::http.client/client (ig/ref ::http.client/client) ::db/pool (ig/ref ::db/pool) - ::props (ig/ref ::setup/props) + ::setup/props (ig/ref ::setup/props) ::oidc/providers {:google (ig/ref ::oidc.providers/google) :github (ig/ref ::oidc.providers/github) :gitlab (ig/ref ::oidc.providers/gitlab) @@ -274,7 +274,7 @@ ::db/pool (ig/ref ::db/pool) ::rpc/routes (ig/ref ::rpc/routes) ::rpc.doc/routes (ig/ref ::rpc.doc/routes) - ::props (ig/ref ::setup/props) + ::setup/props (ig/ref ::setup/props) ::mtx/routes (ig/ref ::mtx/routes) ::oidc/routes (ig/ref ::oidc/routes) ::http.debug/routes (ig/ref ::http.debug/routes) @@ -286,7 +286,7 @@ {::db/pool (ig/ref ::db/pool) ::session/manager (ig/ref ::session/manager) ::sto/storage (ig/ref ::sto/storage) - ::props (ig/ref ::setup/props)} + ::setup/props (ig/ref ::setup/props)} ::http.ws/routes {::db/pool (ig/ref ::db/pool) @@ -322,7 +322,7 @@ ::rpc/climit (ig/ref ::rpc/climit) ::rpc/rlimit (ig/ref ::rpc/rlimit) ::setup/templates (ig/ref ::setup/templates) - ::props (ig/ref ::setup/props)} + ::setup/props (ig/ref ::setup/props)} :app.rpc.doc/routes {:methods (ig/ref :app.rpc/methods)} @@ -331,7 +331,7 @@ {::rpc/methods (ig/ref :app.rpc/methods) ::db/pool (ig/ref ::db/pool) ::session/manager (ig/ref ::session/manager) - ::props (ig/ref ::setup/props)} + ::setup/props (ig/ref ::setup/props)} ::wrk/registry {::mtx/metrics (ig/ref ::mtx/metrics) @@ -388,7 +388,7 @@ :app.tasks.telemetry/handler {::db/pool (ig/ref ::db/pool) ::http.client/client (ig/ref ::http.client/client) - ::props (ig/ref ::setup/props)} + ::setup/props (ig/ref ::setup/props)} [::srepl/urepl ::srepl/server] {::srepl/port (cf/get :urepl-port 6062) @@ -402,7 +402,7 @@ ::setup/props {::db/pool (ig/ref ::db/pool) - ::key (cf/get :secret-key) + ::setup/key (cf/get :secret-key) ;; NOTE: this dependency is only necessary for proper initialization ordering, props ;; module requires the migrations to run before initialize. @@ -412,7 +412,7 @@ {} ::audit.tasks/archive - {::props (ig/ref ::setup/props) + {::setup/props (ig/ref ::setup/props) ::db/pool (ig/ref ::db/pool) ::http.client/client (ig/ref ::http.client/client)} diff --git a/backend/src/app/rpc.clj b/backend/src/app/rpc.clj index 8ae7a38d6..ea49b6b70 100644 --- a/backend/src/app/rpc.clj +++ b/backend/src/app/rpc.clj @@ -27,6 +27,7 @@ [app.rpc.helpers :as rph] [app.rpc.retry :as retry] [app.rpc.rlimit :as rlimit] + [app.setup :as-alias setup] [app.storage :as-alias sto] [app.util.services :as sv] [app.util.time :as dt] @@ -248,7 +249,7 @@ ::ldap/provider ::sto/storage ::mtx/metrics - ::main/props] + ::setup/props] :opt [::climit ::rlimit])) @@ -265,7 +266,7 @@ (defmethod ig/pre-init-spec ::routes [_] (s/keys :req [::methods ::db/pool - ::main/props + ::setup/props ::session/manager])) (defmethod ig/init-key ::routes diff --git a/backend/src/app/rpc/commands/access_token.clj b/backend/src/app/rpc/commands/access_token.clj index dd10f3371..06a6e516c 100644 --- a/backend/src/app/rpc/commands/access_token.clj +++ b/backend/src/app/rpc/commands/access_token.clj @@ -13,6 +13,7 @@ [app.rpc :as-alias rpc] [app.rpc.doc :as-alias doc] [app.rpc.quotes :as quotes] + [app.setup :as-alias setup] [app.tokens :as tokens] [app.util.services :as sv] [app.util.time :as dt] @@ -23,7 +24,7 @@ (dissoc row :perms)) (defn create-access-token - [{:keys [::db/conn ::main/props]} profile-id name expiration] + [{:keys [::db/conn ::setup/props]} profile-id name expiration] (let [created-at (dt/now) token-id (uuid/next) token (tokens/generate props {:iss "access-token" @@ -47,7 +48,7 @@ [{:keys [::db/pool] :as system} profile-id name expiration] (db/with-atomic [conn pool] (let [props (:app.setup/props system)] - (create-access-token {::db/conn conn ::main/props props} + (create-access-token {::db/conn conn ::setup/props props} profile-id name expiration)))) diff --git a/backend/src/app/rpc/commands/auth.clj b/backend/src/app/rpc/commands/auth.clj index 8e9671e59..e87979007 100644 --- a/backend/src/app/rpc/commands/auth.clj +++ b/backend/src/app/rpc/commands/auth.clj @@ -26,6 +26,7 @@ [app.rpc.commands.teams :as teams] [app.rpc.doc :as-alias doc] [app.rpc.helpers :as rph] + [app.setup :as-alias setup] [app.tokens :as tokens] [app.util.services :as sv] [app.util.time :as dt] @@ -88,7 +89,7 @@ (profile/strip-private-attrs)) invitation (when-let [token (:invitation-token params)] - (tokens/verify (::main/props cfg) {:token token :iss :team-invitation})) + (tokens/verify (::setup/props cfg) {:token token :iss :team-invitation})) ;; If invitation member-id does not matches the profile-id, we just proceed to ignore the ;; invitation because invitations matches exactly; and user can't login with other email and @@ -133,7 +134,7 @@ (defn recover-profile [{:keys [::db/pool] :as cfg} {:keys [token password]}] (letfn [(validate-token [token] - (let [tdata (tokens/verify (::main/props cfg) {:token token :iss :password-recovery})] + (let [tdata (tokens/verify (::setup/props cfg) {:token token :iss :password-recovery})] (:profile-id tdata))) (update-password [conn profile-id] @@ -170,7 +171,7 @@ :code :registration-disabled))) (when (contains? params :invitation-token) - (let [invitation (tokens/verify (::main/props cfg) {:token (:invitation-token params) :iss :team-invitation})] + (let [invitation (tokens/verify (::setup/props cfg) {:token (:invitation-token params) :iss :team-invitation})] (when-not (= (:email params) (:member-email invitation)) (ex/raise :type :restriction :code :email-does-not-match-invitation @@ -233,7 +234,7 @@ params (d/without-nils params) - token (tokens/generate (::main/props cfg) params)] + token (tokens/generate (::setup/props cfg) params)] (with-meta {:token token} {::audit/profile-id uuid/zero}))) @@ -340,7 +341,7 @@ (defn register-profile [{:keys [::db/conn] :as cfg} {:keys [token fullname] :as params}] - (let [claims (tokens/verify (::main/props cfg) {:token token :iss :prepared-register}) + (let [claims (tokens/verify (::setup/props cfg) {:token token :iss :prepared-register}) params (-> claims (into params) (assoc :fullname fullname)) @@ -357,7 +358,7 @@ (create-profile-rels! conn)))) invitation (when-let [token (:invitation-token params)] - (tokens/verify (::main/props cfg) {:token token :iss :team-invitation}))] + (tokens/verify (::setup/props cfg) {:token token :iss :team-invitation}))] ;; If profile is filled in claims, means it tries to register ;; again, so we proceed to update the modified-at attr @@ -377,7 +378,7 @@ ;; email. (and (some? invitation) (= (:email profile) (:member-email invitation))) (let [claims (assoc invitation :member-id (:id profile)) - token (tokens/generate (::main/props cfg) claims) + token (tokens/generate (::setup/props cfg) claims) resp {:invitation-token token}] (-> resp (rph/with-transform (session/create-fn cfg (:id profile))) @@ -404,7 +405,7 @@ ;; In all other cases, send a verification email. :else (do - (send-email-verification! conn (::main/props cfg) profile) + (send-email-verification! conn (::setup/props cfg) profile) (rph/with-meta profile {::audit/replace-props (audit/profile->props profile) ::audit/profile-id (:id profile)}))))) @@ -429,14 +430,14 @@ (defn request-profile-recovery [{:keys [::db/pool] :as cfg} {:keys [email] :as params}] (letfn [(create-recovery-token [{:keys [id] :as profile}] - (let [token (tokens/generate (::main/props cfg) + (let [token (tokens/generate (::setup/props cfg) {:iss :password-recovery :exp (dt/in-future "15m") :profile-id id})] (assoc profile :token token))) (send-email-notification [conn profile] - (let [ptoken (tokens/generate (::main/props cfg) + (let [ptoken (tokens/generate (::setup/props cfg) {:iss :profile-identity :profile-id (:id profile) :exp (dt/in-future {:days 30})})] diff --git a/backend/src/app/rpc/commands/ldap.clj b/backend/src/app/rpc/commands/ldap.clj index bb86aec90..780f0e100 100644 --- a/backend/src/app/rpc/commands/ldap.clj +++ b/backend/src/app/rpc/commands/ldap.clj @@ -18,6 +18,7 @@ [app.rpc.commands.profile :as profile] [app.rpc.doc :as-alias doc] [app.rpc.helpers :as rph] + [app.setup :as-alias setup] [app.tokens :as tokens] [app.util.services :as sv] [clojure.spec.alpha :as s])) @@ -40,7 +41,7 @@ {::rpc/auth false ::doc/added "1.15" ::doc/module :auth} - [{:keys [::main/props ::ldap/provider] :as cfg} params] + [{:keys [::setup/props ::ldap/provider] :as cfg} params] (when-not provider (ex/raise :type :restriction :code :ldap-not-initialized diff --git a/backend/src/app/rpc/commands/profile.clj b/backend/src/app/rpc/commands/profile.clj index 6ef2ef90d..ccb6a8b2e 100644 --- a/backend/src/app/rpc/commands/profile.clj +++ b/backend/src/app/rpc/commands/profile.clj @@ -23,6 +23,7 @@ [app.rpc.climit :as climit] [app.rpc.doc :as-alias doc] [app.rpc.helpers :as rph] + [app.setup :as-alias setup] [app.storage :as sto] [app.tokens :as tokens] [app.util.services :as sv] @@ -296,12 +297,12 @@ (defn- request-email-change! [{:keys [::conn] :as cfg} {:keys [profile email] :as params}] - (let [token (tokens/generate (::main/props cfg) + (let [token (tokens/generate (::setup/props cfg) {:iss :change-email :exp (dt/in-future "15m") :profile-id (:id profile) :email email}) - ptoken (tokens/generate (::main/props cfg) + ptoken (tokens/generate (::setup/props cfg) {:iss :profile-identity :profile-id (:id profile) :exp (dt/in-future {:days 30})})] diff --git a/backend/src/app/rpc/commands/teams.clj b/backend/src/app/rpc/commands/teams.clj index 4b5f07700..f62f8bc6a 100644 --- a/backend/src/app/rpc/commands/teams.clj +++ b/backend/src/app/rpc/commands/teams.clj @@ -26,6 +26,7 @@ [app.rpc.helpers :as rph] [app.rpc.permissions :as perms] [app.rpc.quotes :as quotes] + [app.setup :as-alias setup] [app.storage :as sto] [app.tokens :as tokens] [app.util.services :as sv] @@ -691,7 +692,7 @@ (defn- create-invitation-token [cfg {:keys [profile-id valid-until team-id member-id member-email role]}] - (tokens/generate (::main/props cfg) + (tokens/generate (::setup/props cfg) {:iss :team-invitation :exp valid-until :profile-id profile-id @@ -702,7 +703,7 @@ (defn- create-profile-identity-token [cfg profile] - (tokens/generate (::main/props cfg) + (tokens/generate (::setup/props cfg) {:iss :profile-identity :profile-id (:id profile) :exp (dt/in-future {:days 30})})) diff --git a/backend/src/app/rpc/commands/verify_token.clj b/backend/src/app/rpc/commands/verify_token.clj index 49c76c110..e072c90d6 100644 --- a/backend/src/app/rpc/commands/verify_token.clj +++ b/backend/src/app/rpc/commands/verify_token.clj @@ -18,6 +18,7 @@ [app.rpc.doc :as-alias doc] [app.rpc.helpers :as rph] [app.rpc.quotes :as quotes] + [app.setup :as-alias setup] [app.tokens :as tokens] [app.tokens.spec.team-invitation :as-alias spec.team-invitation] [app.util.services :as sv] @@ -38,7 +39,7 @@ ::doc/module :auth} [{:keys [::db/pool] :as cfg} {:keys [token] :as params}] (db/with-atomic [conn pool] - (let [claims (tokens/verify (::main/props cfg) {:token token}) + (let [claims (tokens/verify (::setup/props cfg) {:token token}) cfg (assoc cfg :conn conn)] (process-token cfg params claims)))) diff --git a/backend/src/app/setup.clj b/backend/src/app/setup.clj index 8e889e2b4..d187f3e5f 100644 --- a/backend/src/app/setup.clj +++ b/backend/src/app/setup.clj @@ -50,16 +50,15 @@ :cause cause)))) instance-id))) -(s/def ::main/key ::us/string) -(s/def ::main/props - (s/map-of ::us/keyword some?)) +(s/def ::key ::us/string) +(s/def ::props (s/map-of ::us/keyword some?)) (defmethod ig/pre-init-spec ::props [_] (s/keys :req [::db/pool] - :opt [::main/key])) + :opt [::key])) (defmethod ig/init-key ::props - [_ {:keys [::db/pool ::main/key] :as cfg}] + [_ {:keys [::db/pool ::key] :as cfg}] (db/with-atomic [conn pool] (db/xact-lock! conn 0) (when-not key diff --git a/backend/src/app/tasks/telemetry.clj b/backend/src/app/tasks/telemetry.clj index d040a08f9..43c0b26f9 100644 --- a/backend/src/app/tasks/telemetry.clj +++ b/backend/src/app/tasks/telemetry.clj @@ -15,6 +15,7 @@ [app.db :as db] [app.http.client :as http] [app.main :as-alias main] + [app.setup :as-alias setup] [app.util.json :as json] [clojure.spec.alpha :as s] [integrant.core :as ig] @@ -32,10 +33,10 @@ (defmethod ig/pre-init-spec ::handler [_] (s/keys :req [::http/client ::db/pool - ::main/props])) + ::setup/props])) (defmethod ig/init-key ::handler - [_ {:keys [::db/pool ::main/props] :as cfg}] + [_ {:keys [::db/pool ::setup/props] :as cfg}] (fn [{:keys [send? enabled?] :or {send? true enabled? false}}] (let [subs {:newsletter-updates (get-subscriptions-newsletter-updates pool) :newsletter-news (get-subscriptions-newsletter-news pool)} diff --git a/backend/test/backend_tests/bounce_handling_test.clj b/backend/test/backend_tests/bounce_handling_test.clj index 61a322084..13774e042 100644 --- a/backend/test/backend_tests/bounce_handling_test.clj +++ b/backend/test/backend_tests/bounce_handling_test.clj @@ -102,7 +102,7 @@ (t/deftest test-parse-bounce-report (let [profile (th/create-profile* 1) props (:app.setup/props th/*system*) - cfg {:app.main/props props} + cfg {:app.setup/props props} report (bounce-report {:token (tokens/generate props {:iss :profile-identity :profile-id (:id profile)})}) @@ -118,7 +118,7 @@ (t/deftest test-parse-complaint-report (let [profile (th/create-profile* 1) props (:app.setup/props th/*system*) - cfg {:app.main/props props} + cfg {:app.setup/props props} report (complaint-report {:token (tokens/generate props {:iss :profile-identity :profile-id (:id profile)})}) @@ -132,7 +132,7 @@ (t/deftest test-parse-complaint-report-without-token (let [props (:app.setup/props th/*system*) - cfg {:app.main/props props} + cfg {:app.setup/props props} report (complaint-report {:token ""}) result (#'awsns/parse-notification cfg report)] (t/is (= "complaint" (:type result))) @@ -145,7 +145,7 @@ (let [profile (th/create-profile* 1) props (:app.setup/props th/*system*) pool (:app.db/pool th/*system*) - cfg {:app.main/props props :app.db/pool pool} + cfg {:app.setup/props props :app.db/pool pool} report (bounce-report {:token (tokens/generate props {:iss :profile-identity :profile-id (:id profile)})}) @@ -172,7 +172,7 @@ (let [profile (th/create-profile* 1) props (:app.setup/props th/*system*) pool (:app.db/pool th/*system*) - cfg {:app.main/props props + cfg {:app.setup/props props :app.db/pool pool} report (complaint-report {:token (tokens/generate props {:iss :profile-identity @@ -202,7 +202,7 @@ (let [profile (th/create-profile* 1) props (:app.setup/props th/*system*) pool (:app.db/pool th/*system*) - cfg {:app.main/props props :app.db/pool pool} + cfg {:app.setup/props props :app.db/pool pool} report (bounce-report {:email (:email profile) :token (tokens/generate props {:iss :profile-identity @@ -224,7 +224,7 @@ (let [profile (th/create-profile* 1) props (:app.setup/props th/*system*) pool (:app.db/pool th/*system*) - cfg {:app.main/props props :app.db/pool pool} + cfg {:app.setup/props props :app.db/pool pool} report (complaint-report {:email (:email profile) :token (tokens/generate props {:iss :profile-identity -- Gitee From 4e9710ddfa0326b7e32867d4e1067f49101a7db5 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Thu, 14 Mar 2024 12:15:01 +0100 Subject: [PATCH 0050/1266] :bug: Fix dashboard comment title --- frontend/src/app/main/ui/comments.cljs | 6 ++++-- frontend/src/app/main/ui/comments.scss | 4 ++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/main/ui/comments.cljs b/frontend/src/app/main/ui/comments.cljs index c1c1b5685..2fd50ec86 100644 --- a/frontend/src/app/main/ui/comments.cljs +++ b/frontend/src/app/main/ui/comments.cljs @@ -604,11 +604,13 @@ [{:keys [group users on-thread-click]}] [:div {:class (stl/css :thread-group)} (if (:file-name group) - [:div {:class (stl/css :section-title)} + [:div {:class (stl/css :section-title) + :title (str (:file-name group) ", " (:page-name group))} [:span {:class (stl/css :file-name)} (:file-name group) ", "] [:span {:class (stl/css :page-name)} (:page-name group)]] - [:div {:class (stl/css :section-title)} + [:div {:class (stl/css :section-title) + :title (:page-name group)} [:span {:class (stl/css :icon)} i/document] [:span {:class (stl/css :page-name)} (:page-name group)]]) diff --git a/frontend/src/app/main/ui/comments.scss b/frontend/src/app/main/ui/comments.scss index 2b10eb9e5..51e6ddadb 100644 --- a/frontend/src/app/main/ui/comments.scss +++ b/frontend/src/app/main/ui/comments.scss @@ -19,6 +19,8 @@ } .section-title { + display: grid; + grid-template-columns: auto auto; @include bodySmallTypography; height: $s-32; display: flex; @@ -27,10 +29,12 @@ } .file-name { + @include textEllipsis; color: var(--comment-subtitle-color); } .page-name { + @include textEllipsis; color: var(--comment-subtitle-color); } -- Gitee From d5b2a91bce1ac905b7cbb50ab3b3b2c41df4af3f Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 14 Mar 2024 12:42:07 +0100 Subject: [PATCH 0051/1266] :bug: Fix problem with fast change between numeric inputs --- frontend/src/app/main/ui/components/numeric_input.cljs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/components/numeric_input.cljs b/frontend/src/app/main/ui/components/numeric_input.cljs index 54965605e..134a01440 100644 --- a/frontend/src/app/main/ui/components/numeric_input.cljs +++ b/frontend/src/app/main/ui/components/numeric_input.cljs @@ -169,6 +169,13 @@ (update-input value-str) (dom/blur! node))))) + handle-change + (mf/use-fn + (mf/deps parse-value) + (fn [] + ;; Store the last value inputed + (reset! last-value* (parse-value)))) + handle-mouse-wheel (mf/use-fn (mf/deps set-delta) @@ -218,7 +225,7 @@ (obj/unset! "selectOnFocus") (obj/unset! "nillable") (obj/set! "value" mf/undefined) - (obj/set! "onChange" mf/undefined) + (obj/set! "onChange" handle-change) (obj/set! "className" class) (obj/set! "type" "text") (obj/set! "ref" ref) -- Gitee From 3bc6d2b0a790b6e4079d588ade07300eab141b8b Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 14 Mar 2024 13:35:56 +0100 Subject: [PATCH 0052/1266] :bug: Fix migrating old components should not clip the content --- backend/src/app/features/components_v2.clj | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/backend/src/app/features/components_v2.clj b/backend/src/app/features/components_v2.clj index 8c7933160..e24cbc469 100644 --- a/backend/src/app/features/components_v2.clj +++ b/backend/src/app/features/components_v2.clj @@ -806,7 +806,8 @@ :width (:width (:selrect root-shape)) :height (:height (:selrect root-shape)) :name (:name component) - :shapes [new-id]}) + :shapes [new-id] + :show-content true}) (assoc :frame-id nil :parent-id nil)) root-shape' (assoc root-shape @@ -846,13 +847,15 @@ (fix-shape [shape] (if (or (nil? (:parent-id shape)) (ctk/instance-head? shape)) - (assoc shape - :type :frame ; Old groups must be converted - :fills (or (:fills shape) []) ; to frames and conform to spec - :shapes (or (:shapes shape) []) - :hide-in-viewer (or (:hide-in-viewer shape) true) - :rx (or (:rx shape) 0) - :ry (or (:ry shape) 0)) + (let [frame? (= :frame (:type shape))] + (assoc shape + :type :frame ; Old groups must be converted + :fills (or (:fills shape) []) ; to frames and conform to spec + :shapes (or (:shapes shape) []) + :hide-in-viewer (if frame? (boolean (:hide-in-viewer shape)) true) + :show-content (if frame? (boolean (:show-content shape)) true) + :rx (or (:rx shape) 0) + :ry (or (:ry shape) 0))) shape))] (-> file-data (update :pages-index update-vals fix-container) -- Gitee From 6bf336342948b3470344c7f3eb8d9ee964fbeb0f Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 14 Mar 2024 14:19:55 +0100 Subject: [PATCH 0053/1266] :bug: Fix scroll when file menu open --- frontend/src/app/main/ui/dashboard.cljs | 4 ++++ frontend/src/app/main/ui/dashboard/grid.cljs | 21 +++++++++++--------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/frontend/src/app/main/ui/dashboard.cljs b/frontend/src/app/main/ui/dashboard.cljs index 29c41f8e9..4adec8d15 100644 --- a/frontend/src/app/main/ui/dashboard.cljs +++ b/frontend/src/app/main/ui/dashboard.cljs @@ -58,6 +58,9 @@ project-id (:id project) team-id (:id team) + dashboard-local (mf/deref refs/dashboard-local) + file-menu-open? (:menu-open dashboard-local) + default-project-id (mf/with-memo [projects] (->> (vals projects) @@ -83,6 +86,7 @@ [:div {:class (stl/css :dashboard-content) + :style {:pointer-events (when file-menu-open? "none")} :on-click clear-selected-fn :ref container} (case section :dashboard-projects diff --git a/frontend/src/app/main/ui/dashboard/grid.cljs b/frontend/src/app/main/ui/dashboard/grid.cljs index bb2f44b2b..6f5565611 100644 --- a/frontend/src/app/main/ui/dashboard/grid.cljs +++ b/frontend/src/app/main/ui/dashboard/grid.cljs @@ -388,15 +388,18 @@ (on-menu-click event)))} menu-icon (when (and selected? file-menu-open?) - [:& file-menu {:files (vals selected-files) - :show? (:menu-open dashboard-local) - :left (+ 24 (:x (:menu-pos dashboard-local))) - :top (:y (:menu-pos dashboard-local)) - :navigate? true - :on-edit on-edit - :on-menu-close on-menu-close - :origin origin - :parent-id (str file-id "-action-menu")}])]]]]])) + ;; When the menu is open we disable events in the dashboard. We need to force pointer events + ;; so the menu can be handled + [:div {:style {:pointer-events "all"}} + [:& file-menu {:files (vals selected-files) + :show? (:menu-open dashboard-local) + :left (+ 24 (:x (:menu-pos dashboard-local))) + :top (:y (:menu-pos dashboard-local)) + :navigate? true + :on-edit on-edit + :on-menu-close on-menu-close + :origin origin + :parent-id (str file-id "-action-menu")}]])]]]]])) (mf/defc grid [{:keys [files project origin limit library-view? create-fn] :as props}] -- Gitee From e1e05e6de8551167d846dcc4fa92117402621e15 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 14 Mar 2024 14:52:20 +0000 Subject: [PATCH 0054/1266] Update README.md Link in the footer https://kaleidos.net/products returns 404 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0b6628017..26bae9ea3 100644 --- a/README.md +++ b/README.md @@ -141,4 +141,4 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. Copyright (c) KALEIDOS INC ``` -Penpot is a Kaleidos’ [open source project](https://kaleidos.net/products) +Penpot is a Kaleidos’ [open source project](https://kaleidos.net/) -- Gitee From 5c33bc689291798e66351b40db74bbfcf087938d Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 14 Mar 2024 15:52:26 +0100 Subject: [PATCH 0055/1266] :bug: Make the layout boards export as responsive markup --- frontend/src/app/main/data/preview.cljs | 2 +- .../src/app/main/ui/viewer/inspect/code.cljs | 4 +- frontend/src/app/util/code_gen.cljs | 4 +- frontend/src/app/util/code_gen/style_css.cljs | 40 +++---- .../app/util/code_gen/style_css_values.cljs | 101 ++++++++++-------- 5 files changed, 82 insertions(+), 69 deletions(-) diff --git a/frontend/src/app/main/data/preview.cljs b/frontend/src/app/main/data/preview.cljs index 519ed96d3..7510fb089 100644 --- a/frontend/src/app/main/data/preview.cljs +++ b/frontend/src/app/main/data/preview.cljs @@ -76,7 +76,7 @@ (let [style-code (dm/str fontfaces-css "\n" - (-> (cg/generate-style-code objects style-type all-children) + (-> (cg/generate-style-code objects style-type [shape] all-children) (cb/format-code style-type))) markup-code diff --git a/frontend/src/app/main/ui/viewer/inspect/code.cljs b/frontend/src/app/main/ui/viewer/inspect/code.cljs index 747d06204..c1e5ebcd2 100644 --- a/frontend/src/app/main/ui/viewer/inspect/code.cljs +++ b/frontend/src/app/main/ui/viewer/inspect/code.cljs @@ -124,11 +124,11 @@ style-code (mf/use-memo - (mf/deps fontfaces-css style-type all-children cg/generate-style-code) + (mf/deps fontfaces-css style-type shapes all-children cg/generate-style-code) (fn [] (dm/str fontfaces-css "\n" - (-> (cg/generate-style-code objects style-type all-children) + (-> (cg/generate-style-code objects style-type shapes all-children) (cb/format-code style-type))))) markup-code diff --git a/frontend/src/app/util/code_gen.cljs b/frontend/src/app/util/code_gen.cljs index e1c35d169..1c8e255b9 100644 --- a/frontend/src/app/util/code_gen.cljs +++ b/frontend/src/app/util/code_gen.cljs @@ -19,8 +19,8 @@ (generate-markup objects shapes))) (defn generate-style-code - [objects type shapes] + [objects type root-shapes all-shapes] (let [generate-style (case type "css" css/generate-style)] - (generate-style objects shapes))) + (generate-style objects root-shapes all-shapes))) diff --git a/frontend/src/app/util/code_gen/style_css.cljs b/frontend/src/app/util/code_gen/style_css.cljs index 197e883ff..5f1776044 100644 --- a/frontend/src/app/util/code_gen/style_css.cljs +++ b/frontend/src/app/util/code_gen/style_css.cljs @@ -35,8 +35,8 @@ body { display: flex; flex-direction: column; align-items: center; - padding: 2rem; - gap: 2rem; + width: 100vw; + min-height: 100vh; } * { @@ -94,6 +94,7 @@ body { :flex-direction :flex-wrap :flex + :flex-grow ;; Grid related properties :grid-template-rows @@ -117,8 +118,8 @@ body { :grid-area]) (defn shape->css-property - [shape objects property] - (when-let [value (get-value property shape objects)] + [shape objects property options] + (when-let [value (get-value property shape objects options)] [property value])) (defn shape->wrapper-css-properties @@ -155,10 +156,10 @@ body { (defn shape->css-properties "Given a shape extract the CSS properties in the format of list [property value]" - [shape objects properties] + [shape objects properties options] (->> properties (keep (fn [property] - (when-let [value (get-value property shape objects)] + (when-let [value (get-value property shape objects options)] [property value]))))) (defn format-css-value @@ -189,7 +190,7 @@ body { ([objects shape properties options] (-> shape - (shape->css-properties objects properties) + (shape->css-properties objects properties options) (format-css-properties options)))) (defn format-js-styles @@ -248,13 +249,13 @@ body { properties (-> shape - (shape->css-properties objects css-properties) + (shape->css-properties objects css-properties options) (format-css-properties options)) wrapper-properties (when wrapper? (-> (d/concat-vec - (shape->css-properties shape objects shape-wrapper-css-properties) + (shape->css-properties shape objects shape-wrapper-css-properties options) (shape->wrapper-css-properties shape objects)) (format-css-properties options))) @@ -285,7 +286,7 @@ body { ([objects shape property options] (-> shape - (shape->css-property objects property) + (shape->css-property objects property options) (format-css-property options)))) (defn get-css-value @@ -293,18 +294,19 @@ body { (get-css-value objects shape property nil)) ([objects shape property options] - (when-let [prop (shape->css-property shape objects property)] + (when-let [prop (shape->css-property shape objects property options)] (format-css-value prop options)))) (defn generate-style - ([objects shapes] - (generate-style objects shapes nil)) - ([objects shapes options] - (dm/str - prelude - (->> shapes - (keep #(get-shape-css-selector % objects options)) - (str/join "\n\n"))))) + ([objects root-shapes all-shapes] + (generate-style objects root-shapes all-shapes nil)) + ([objects root-shapes all-shapes options] + (let [options (assoc options :root-shapes (into #{} (map :id) root-shapes))] + (dm/str + prelude + (->> all-shapes + (keep #(get-shape-css-selector % objects options)) + (str/join "\n\n")))))) (defn shadow->css [shadow] diff --git a/frontend/src/app/util/code_gen/style_css_values.cljs b/frontend/src/app/util/code_gen/style_css_values.cljs index 3659d33a2..fe2179c8d 100644 --- a/frontend/src/app/util/code_gen/style_css_values.cljs +++ b/frontend/src/app/util/code_gen/style_css_values.cljs @@ -25,10 +25,10 @@ :image fill-image}) (defmulti get-value - (fn [property _shape _objects] property)) + (fn [property _shape _objects _options] property)) (defmethod get-value :position - [_ shape objects] + [_ shape objects _] (cond (or (and (ctl/any-layout-immediate-child? objects shape) (not (ctl/position-absolute? shape)) @@ -65,15 +65,15 @@ (- shape-value parent-value)))) (defmethod get-value :left - [_ shape objects] + [_ shape objects _] (get-shape-position shape objects :x)) (defmethod get-value :top - [_ shape objects] + [_ shape objects _] (get-shape-position shape objects :y)) (defmethod get-value :flex - [_ shape objects] + [_ shape objects _] (let [parent (cfh/get-parent objects (:id shape))] (when (and (ctl/flex-layout-immediate-child? objects shape) (or (and (contains? #{:row :row-reverse} (:layout-flex-dir parent)) @@ -112,15 +112,26 @@ (get shape type)))) (defmethod get-value :width - [_ shape objects] - (get-shape-size shape objects :width)) + [_ shape objects options] + (let [root? (contains? (:root-shapes options) (:id shape))] + (if (and root? (ctl/any-layout? shape)) + :fill + (get-shape-size shape objects :width)))) (defmethod get-value :height - [_ shape objects] - (get-shape-size shape objects :height)) + [_ shape objects options] + (let [root? (contains? (:root-shapes options) (:id shape))] + (when-not (and root? (ctl/any-layout? shape)) + (get-shape-size shape objects :height)))) + +(defmethod get-value :flex-grow + [_ shape _ options] + (let [root? (contains? (:root-shapes options) (:id shape))] + (when (and root? (ctl/any-layout? shape)) + 1))) (defmethod get-value :transform - [_ shape objects] + [_ shape objects _] (if (cgc/svg-markup? shape) (let [parent (get objects (:parent-id shape)) transform @@ -145,7 +156,7 @@ transform-str)))) (defmethod get-value :background - [_ {:keys [fills] :as shape} _] + [_ {:keys [fills] :as shape} _ _] (let [single-fill? (= (count fills) 1)] (when (and (not (cgc/svg-markup? shape)) (not (cfh/group-shape? shape)) single-fill?) (fill->color (first fills))))) @@ -164,12 +175,12 @@ :width width}))) (defmethod get-value :border - [_ shape _] + [_ shape _ _] (when-not (cgc/svg-markup? shape) (get-stroke-data (first (:strokes shape))))) (defmethod get-value :border-radius - [_ {:keys [rx r1 r2 r3 r4] :as shape} _] + [_ {:keys [rx r1 r2 r3 r4] :as shape} _ _] (cond (cfh/circle-shape? shape) "50%" @@ -181,76 +192,76 @@ [r1 r2 r3 r4])) (defmethod get-value :box-shadow - [_ shape _] + [_ shape _ _] (when-not (cgc/svg-markup? shape) (:shadow shape))) (defmethod get-value :filter - [_ shape _] + [_ shape _ _] (when-not (cgc/svg-markup? shape) (get-in shape [:blur :value]))) (defmethod get-value :display - [_ shape _] + [_ shape _ _] (cond (:hidden shape) "none" (ctl/flex-layout? shape) "flex" (ctl/grid-layout? shape) "grid")) (defmethod get-value :opacity - [_ shape _] + [_ shape _ _] (when (< (:opacity shape) 1) (:opacity shape))) (defmethod get-value :overflow - [_ shape _] + [_ shape _ _] (when (and (cfh/frame-shape? shape) (not (cgc/svg-markup? shape)) (not (:show-content shape))) "hidden")) (defmethod get-value :flex-direction - [_ shape _] + [_ shape _ _] (:layout-flex-dir shape)) (defmethod get-value :align-items - [_ shape _] + [_ shape _ _] (:layout-align-items shape)) (defmethod get-value :align-content - [_ shape _] + [_ shape _ _] (:layout-align-content shape)) (defmethod get-value :justify-items - [_ shape _] + [_ shape _ _] (:layout-justify-items shape)) (defmethod get-value :justify-content - [_ shape _] + [_ shape _ _] (:layout-justify-content shape)) (defmethod get-value :flex-wrap - [_ shape _] + [_ shape _ _] (:layout-wrap-type shape)) (defmethod get-value :gap - [_ shape _] + [_ shape _ _] (let [[g1 g2] (ctl/gaps shape)] (when (and (= g1 g2) (or (not= g1 0) (not= g2 0))) [g1]))) (defmethod get-value :row-gap - [_ shape _] + [_ shape _ _] (let [[g1 g2] (ctl/gaps shape)] (when (and (not= g1 g2) (not= g1 0)) [g1]))) (defmethod get-value :column-gap - [_ shape _] + [_ shape _ _] (let [[g1 g2] (ctl/gaps shape)] (when (and (not= g1 g2) (not= g2 0)) [g2]))) (defmethod get-value :padding - [_ {:keys [layout-padding]} _] + [_ {:keys [layout-padding]} _ _] (when (some? layout-padding) (let [default-padding {:p1 0 :p2 0 :p3 0 :p4 0} {:keys [p1 p2 p3 p4]} (merge default-padding layout-padding)] @@ -258,11 +269,11 @@ [p1 p2 p3 p4])))) (defmethod get-value :grid-template-rows - [_ shape _] + [_ shape _ _] (:layout-grid-rows shape)) (defmethod get-value :grid-template-columns - [_ shape _] + [_ shape _ _] (:layout-grid-columns shape)) (defn area-cell? @@ -270,7 +281,7 @@ (and (= position :area) (d/not-empty? area-name))) (defmethod get-value :grid-template-areas - [_ shape _] + [_ shape _ _] (when (and (ctl/grid-layout? shape) (some area-cell? (vals (:layout-grid-cells shape)))) (let [result @@ -304,15 +315,15 @@ (get cell prop)))))) (defmethod get-value :grid-column - [_ shape objects] + [_ shape objects _] (get-grid-coord shape objects :column :column-span)) (defmethod get-value :grid-row - [_ shape objects] + [_ shape objects _] (get-grid-coord shape objects :row :row-span)) (defmethod get-value :grid-area - [_ shape objects] + [_ shape objects _] (when (and (ctl/grid-layout-immediate-child? objects shape) (not (ctl/position-absolute? shape))) (let [parent (get objects (:parent-id shape)) @@ -321,7 +332,7 @@ (str/replace (:area-name cell) " " "-"))))) (defmethod get-value :flex-shrink - [_ shape objects] + [_ shape objects _] (when (and (ctl/flex-layout-immediate-child? objects shape) (not (and (contains? #{:row :reverse-row} (:layout-flex-dir shape)) @@ -337,7 +348,7 @@ 0)) (defmethod get-value :margin - [_ {:keys [layout-item-margin] :as shape} objects] + [_ {:keys [layout-item-margin] :as shape} objects _] (when (ctl/any-layout-immediate-child? objects shape) (let [default-margin {:m1 0 :m2 0 :m3 0 :m4 0} @@ -346,7 +357,7 @@ [m1 m2 m3 m4])))) (defmethod get-value :z-index - [_ {:keys [layout-item-z-index] :as shape} objects] + [_ {:keys [layout-item-z-index] :as shape} objects _] (cond (cfh/root-frame? shape) 0 @@ -355,13 +366,13 @@ layout-item-z-index)) (defmethod get-value :max-height - [_ shape objects] + [_ shape objects _] (cond (ctl/any-layout-immediate-child? objects shape) (:layout-item-max-h shape))) (defmethod get-value :min-height - [_ shape objects] + [_ shape objects _] (cond (and (ctl/any-layout-immediate-child? objects shape) (some? (:layout-item-min-h shape))) (:layout-item-min-h shape) @@ -370,13 +381,13 @@ (-> shape :selrect :height))) (defmethod get-value :max-width - [_ shape objects] + [_ shape objects _] (cond (ctl/any-layout-immediate-child? objects shape) (:layout-item-max-w shape))) (defmethod get-value :min-width - [_ shape objects] + [_ shape objects _] (cond (and (ctl/any-layout-immediate-child? objects shape) (some? (:layout-item-min-w shape))) (:layout-item-min-w shape) @@ -385,7 +396,7 @@ (-> shape :selrect :width))) (defmethod get-value :align-self - [_ shape objects] + [_ shape objects _] (cond (ctl/flex-layout-immediate-child? objects shape) (:layout-item-align-self shape) @@ -397,7 +408,7 @@ (when (not= align-self :auto) align-self)))) (defmethod get-value :justify-self - [_ shape objects] + [_ shape objects _] (cond (ctl/grid-layout-immediate-child? objects shape) (let [parent (get objects (:parent-id shape)) @@ -406,10 +417,10 @@ (when (not= justify-self :auto) justify-self)))) (defmethod get-value :grid-auto-flow - [_ shape _] + [_ shape _ _] (when (and (ctl/grid-layout? shape) (= (:layout-grid-dir shape) :column)) "column")) (defmethod get-value :default - [property shape _] + [property shape _ _] (get shape property)) -- Gitee From 1a12e630274c3c352712036a06f448c6528e8eb8 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 14 Mar 2024 12:53:26 +0100 Subject: [PATCH 0056/1266] :recycle: Simplify audit events code --- frontend/deps.edn | 4 +- frontend/src/app/main/data/comments.cljs | 124 +++++++++----- frontend/src/app/main/data/dashboard.cljs | 73 ++++++--- frontend/src/app/main/data/events.cljs | 152 ++++-------------- frontend/src/app/main/data/fonts.cljs | 37 ++++- frontend/src/app/main/data/modal.cljs | 9 +- frontend/src/app/main/data/users.cljs | 25 ++- frontend/src/app/main/data/workspace.cljs | 7 +- .../src/app/main/data/workspace/comments.cljs | 4 +- .../src/app/main/data/workspace/guides.cljs | 20 ++- .../src/app/main/data/workspace/layout.cljs | 4 +- .../app/main/data/workspace/libraries.cljs | 56 +++++-- .../app/main/data/workspace/selection.cljs | 4 + .../src/app/main/ui/dashboard/projects.cljs | 20 +-- frontend/src/app/util/router.cljs | 11 +- 15 files changed, 320 insertions(+), 230 deletions(-) diff --git a/frontend/deps.edn b/frontend/deps.edn index f4a152eae..3cd46d85a 100644 --- a/frontend/deps.edn +++ b/frontend/deps.edn @@ -9,8 +9,8 @@ funcool/okulary {:mvn/version "2022.04.11-16"} funcool/potok2 - {:git/tag "v2.0" - :git/sha "2bb377b" + {:git/tag "v2.1" + :git/sha "84c97b9" :git/url "https://github.com/funcool/potok.git"} funcool/beicon2 diff --git a/frontend/src/app/main/data/comments.cljs b/frontend/src/app/main/data/comments.cljs index 5762229d4..981f78336 100644 --- a/frontend/src/app/main/data/comments.cljs +++ b/frontend/src/app/main/data/comments.cljs @@ -12,6 +12,7 @@ [app.common.schema :as sm] [app.common.types.shape-tree :as ctst] [app.common.uuid :as uuid] + [app.main.data.events :as ev] [app.main.data.workspace.state-helpers :as wsh] [app.main.repo :as rp] [beicon.v2.core :as rx] @@ -61,13 +62,23 @@ (ptk/reify ::created-thread-on-workspace ptk/UpdateEvent (update [_ state] - (-> state - (update :comment-threads assoc id (dissoc thread :comment)) - (update-in [:workspace-data :pages-index page-id :options :comment-threads-position] assoc id (select-keys thread [:position :frame-id])) - (update :comments-local assoc :open id) - (update :comments-local dissoc :draft) - (update :workspace-drawing dissoc :comment) - (update-in [:comments id] assoc (:id comment) comment))))) + (let [position (select-keys thread [:position :frame-id])] + (-> state + (update :comment-threads assoc id (dissoc thread :comment)) + (update-in [:workspace-data :pages-index page-id :options :comment-threads-position] assoc id position) + (update :comments-local assoc :open id) + (update :comments-local dissoc :draft) + (update :workspace-drawing dissoc :comment) + (update-in [:comments id] assoc (:id comment) comment)))) + + ptk/WatchEvent + (watch [_ _ _] + (rx/of (ptk/data-event ::ev/event + {::ev/name "create-comment-thread" + ::ev/origin "workspace" + :id id + :content-size (count (:content comment))}))))) + (def ^:private @@ -81,8 +92,7 @@ (defn create-thread-on-workspace [params] - (dm/assert! - (sm/check! schema:create-thread-on-workspace params)) + (dm/assert! (sm/check! schema:create-thread-on-workspace params)) (ptk/reify ::create-thread-on-workspace ptk/WatchEvent @@ -105,13 +115,22 @@ (ptk/reify ::created-thread-on-viewer ptk/UpdateEvent (update [_ state] - (-> state - (update :comment-threads assoc id (dissoc thread :comment)) - (update-in [:viewer :pages page-id :options :comment-threads-position] assoc id (select-keys thread [:position :frame-id])) - (update :comments-local assoc :open id) - (update :comments-local dissoc :draft) - (update :workspace-drawing dissoc :comment) - (update-in [:comments id] assoc (:id comment) comment))))) + (let [position (select-keys thread [:position :frame-id])] + (-> state + (update :comment-threads assoc id (dissoc thread :comment)) + (update-in [:viewer :pages page-id :options :comment-threads-position] assoc id position) + (update :comments-local assoc :open id) + (update :comments-local dissoc :draft) + (update :workspace-drawing dissoc :comment) + (update-in [:comments id] assoc (:id comment) comment)))) + + ptk/WatchEvent + (watch [_ _ _] + (rx/of (ptk/data-event ::ev/event + {::ev/name "create-comment-thread" + ::ev/origin "viewer" + :id id + :content-size (count (:content comment))}))))) (def ^:private schema:create-thread-on-viewer @@ -191,21 +210,27 @@ "expected valid content" (string? content)) - (letfn [(created [comment state] - (update-in state [:comments (:id thread)] assoc (:id comment) comment))] - (ptk/reify ::create-comment - ptk/WatchEvent - (watch [_ state _] - (let [share-id (-> state :viewer-local :share-id)] - (rx/concat - (->> (rp/cmd! :create-comment {:thread-id (:id thread) :content content :share-id share-id}) - (rx/map #(partial created %)) - (rx/catch (fn [{:keys [type code] :as cause}] - (if (and (= type :restriction) - (= code :max-quote-reached)) - (rx/throw cause) - (rx/throw {:type :comment-error}))))) - (rx/of (refresh-comment-thread thread)))))))) + (ptk/reify ::create-comment + ev/Event + (-data [_] + {:thread-id (:id thread) + :file-id (:file-id thread) + :content-size (count content)}) + + ptk/WatchEvent + (watch [_ state _] + (let [share-id (-> state :viewer-local :share-id) + created (fn [comment state] + (update-in state [:comments (:id thread)] assoc (:id comment) comment))] + (rx/concat + (->> (rp/cmd! :create-comment {:thread-id (:id thread) :content content :share-id share-id}) + (rx/map (fn [comment] (partial created comment))) + (rx/catch (fn [{:keys [type code] :as cause}] + (if (and (= type :restriction) + (= code :max-quote-reached)) + (rx/throw cause) + (rx/throw {:type :comment-error}))))) + (rx/of (refresh-comment-thread thread))))))) (defn update-comment [{:keys [id content thread-id] :as comment}] @@ -214,6 +239,12 @@ (check-comment! comment)) (ptk/reify ::update-comment + ev/Event + (-data [_] + {:thread-id thread-id + :id id + :content-size (count content)}) + ptk/UpdateEvent (update [_ state] (d/update-in-when state [:comments thread-id id] assoc :content content)) @@ -241,9 +272,14 @@ ptk/WatchEvent (watch [_ _ _] - (->> (rp/cmd! :delete-comment-thread {:id id}) - (rx/catch #(rx/throw {:type :comment-error})) - (rx/ignore))))) + (rx/concat + (->> (rp/cmd! :delete-comment-thread {:id id}) + (rx/catch #(rx/throw {:type :comment-error})) + (rx/ignore)) + (rx/of (ptk/data-event ::ev/event + {::ev/name "delete-comment-thread" + ::ev/origin "workspace" + :id id})))))) (defn delete-comment-thread-on-viewer [{:keys [id] :as thread}] @@ -262,16 +298,24 @@ ptk/WatchEvent (watch [_ state _] (let [share-id (-> state :viewer-local :share-id)] - (->> (rp/cmd! :delete-comment-thread {:id id :share-id share-id}) - (rx/catch #(rx/throw {:type :comment-error})) - (rx/ignore)))))) - + (rx/concat + (->> (rp/cmd! :delete-comment-thread {:id id :share-id share-id}) + (rx/catch #(rx/throw {:type :comment-error})) + (rx/ignore)) + (rx/of (ptk/data-event ::ev/event + {::ev/name "delete-comment-thread" + ::ev/origin "viewer" + :id id}))))))) (defn delete-comment [{:keys [id thread-id] :as comment}] (dm/assert! "expected valid comment" (check-comment! comment)) (ptk/reify ::delete-comment + ev/Event + (-data [_] + {:thread-id thread-id}) + ptk/UpdateEvent (update [_ state] (-> state @@ -375,6 +419,10 @@ "expected valid comment thread" (check-comment-thread! thread)) (ptk/reify ::open-comment-thread + ev/Event + (-data [_] + {:thread-id id}) + ptk/UpdateEvent (update [_ state] (-> state diff --git a/frontend/src/app/main/data/dashboard.cljs b/frontend/src/app/main/data/dashboard.cljs index b75fddfc9..bde91339d 100644 --- a/frontend/src/app/main/data/dashboard.cljs +++ b/frontend/src/app/main/data/dashboard.cljs @@ -469,7 +469,11 @@ (rx/map prepare) (rx/mapcat #(rp/cmd! :update-team-photo %)) (rx/tap on-success) - (rx/map du/fetch-teams) + (rx/mapcat (fn [_] + (rx/of (du/fetch-teams) + (ptk/data-event ::ev/event + {::ev/name "update-team-photo" + :team-id team-id})))) (rx/catch on-error)))))) (defn update-team-member-role @@ -484,7 +488,12 @@ (->> (rp/cmd! :update-team-member-role params) (rx/mapcat (fn [_] (rx/of (fetch-team-members team-id) - (du/fetch-teams))))))))) + (du/fetch-teams) + (ptk/data-event ::ev/event + {::ev/name "update-team-member-role" + :team-id team-id + :role role + :member-id member-id}))))))))) (defn delete-team-member [{:keys [member-id] :as params}] @@ -497,7 +506,11 @@ (->> (rp/cmd! :delete-team-member params) (rx/mapcat (fn [_] (rx/of (fetch-team-members team-id) - (du/fetch-teams))))))))) + (du/fetch-teams) + (ptk/data-event ::ev/event + {::ev/name "delete-team-member" + :team-id team-id + :member-id member-id}))))))))) (defn leave-team [{:keys [reassign-to] :as params}] @@ -516,6 +529,11 @@ (assoc :reassign-to reassign-to))] (->> (rp/cmd! :leave-team params) (rx/tap #(tm/schedule on-success)) + (rx/map (fn [_] + (ptk/data-event ::ev/event + {::ev/name "leave-team" + :reassign-to reassign-to + :team-id team-id}))) (rx/catch on-error)))))) (defn invite-team-members @@ -528,8 +546,11 @@ (sm/check-set-of-emails! emails)) (ptk/reify ::invite-team-members - IDeref - (-deref [_] {:role role :team-id team-id :resend? resend?}) + ev/Event + (-data [_] + {:role role + :team-id team-id + :resend resend?}) ptk/WatchEvent (watch [_ _ _] @@ -727,6 +748,11 @@ [{:keys [id name] :as params}] (dm/assert! (uuid? id)) (ptk/reify ::duplicate-project + ev/Event + (-data [_] + {:project-id id + :name name}) + ptk/WatchEvent (watch [_ _ _] (let [{:keys [on-success on-error] @@ -744,10 +770,12 @@ [{:keys [id team-id] :as params}] (dm/assert! (uuid? id)) (dm/assert! (uuid? team-id)) + (ptk/reify ::move-project - IDeref - (-deref [_] - {:id id :team-id team-id}) + ev/Event + (-data [_] + {:id id + :team-id team-id}) ptk/WatchEvent (watch [_ _ _] @@ -834,9 +862,11 @@ (defn rename-file [{:keys [id name] :as params}] (ptk/reify ::rename-file - IDeref - (-deref [_] - {::ev/origin "dashboard" :id id :name name}) + ev/Event + (-data [_] + {::ev/origin "dashboard" + :id id + :name name}) ptk/UpdateEvent (update [_ state] @@ -856,9 +886,11 @@ (defn set-file-shared [{:keys [id is-shared] :as params}] (ptk/reify ::set-file-shared - IDeref - (-deref [_] - {::ev/origin "dashboard" :id id :shared is-shared}) + ev/Event + (-data [_] + {::ev/origin "dashboard" + :id id + :shared is-shared}) ptk/UpdateEvent (update [_ state] @@ -912,9 +944,8 @@ [{:keys [project-id] :as params}] (dm/assert! (uuid? project-id)) (ptk/reify ::create-file - - IDeref - (-deref [_] {:project-id project-id}) + ev/Event + (-data [_] {:project-id project-id}) ptk/WatchEvent (watch [it state _] @@ -967,8 +998,8 @@ (sm/check-set-of-uuid! ids)) (ptk/reify ::move-files - IDeref - (-deref [_] + ev/Event + (-data [_] {:num-files (count ids) :project-id project-id}) @@ -998,8 +1029,8 @@ [{:keys [template-id project-id] :as params}] (dm/assert! (uuid? project-id)) (ptk/reify ::clone-template - IDeref - (-deref [_] + ev/Event + (-data [_] {:template-id template-id :project-id project-id}) diff --git a/frontend/src/app/main/data/events.cljs b/frontend/src/app/main/data/events.cljs index f80883672..ec217339c 100644 --- a/frontend/src/app/main/data/events.cljs +++ b/frontend/src/app/main/data/events.cljs @@ -75,71 +75,23 @@ ;; --- EVENT TRANSLATION -(derive :app.main.data.comments/create-comment ::generic-action) -(derive :app.main.data.comments/create-comment-thread ::generic-action) -(derive :app.main.data.comments/delete-comment ::generic-action) -(derive :app.main.data.comments/delete-comment-thread ::generic-action) -(derive :app.main.data.comments/open-comment-thread ::generic-action) -(derive :app.main.data.comments/update-comment ::generic-action) -(derive :app.main.data.comments/update-comment-thread ::generic-action) -(derive :app.main.data.comments/update-comment-thread-status ::generic-action) -(derive :app.main.data.dashboard/delete-team-member ::generic-action) -(derive :app.main.data.dashboard/duplicate-project ::generic-action) -(derive :app.main.data.dashboard/create-file ::generic-action) -(derive :app.main.data.dashboard/invite-team-members ::generic-action) -(derive :app.main.data.dashboard/leave-team ::generic-action) -(derive :app.main.data.dashboard/move-files ::generic-action) -(derive :app.main.data.dashboard/move-project ::generic-action) -(derive :app.main.data.dashboard/rename-file ::generic-action) -(derive :app.main.data.dashboard/set-file-shared ::generic-action) -(derive :app.main.data.dashboard/update-team-member-role ::generic-action) -(derive :app.main.data.dashboard/update-team-photo ::generic-action) -(derive :app.main.data.dashboard/clone-template ::generic-action) -(derive :app.main.data.fonts/add-font ::generic-action) -(derive :app.main.data.fonts/delete-font ::generic-action) -(derive :app.main.data.fonts/delete-font-variant ::generic-action) -(derive :app.main.data.modal/show-modal ::generic-action) -(derive :app.main.data.users/logout ::generic-action) -(derive :app.main.data.users/request-email-change ::generic-action) -(derive :app.main.data.users/update-password ::generic-action) -(derive :app.main.data.users/update-photo ::generic-action) -(derive :app.main.data.workspace.comments/open-comment-thread ::generic-action) -(derive :app.main.data.workspace.guides/update-guides ::generic-action) -(derive :app.main.data.workspace.libraries/add-color ::generic-action) -(derive :app.main.data.workspace.libraries/add-media ::generic-action) -(derive :app.main.data.workspace.libraries/add-typography ::generic-action) -(derive :app.main.data.workspace.libraries/delete-color ::generic-action) -(derive :app.main.data.workspace.libraries/delete-media ::generic-action) -(derive :app.main.data.workspace.libraries/delete-typography ::generic-action) -(derive :app.main.data.workspace.persistence/attach-library ::generic-action) -(derive :app.main.data.workspace.persistence/detach-library ::generic-action) -(derive :app.main.data.workspace.persistence/set-file-shard ::generic-action) -(derive :app.main.data.workspace.selection/toggle-focus-mode ::generic-action) -(derive :app.main.data.workspace/create-page ::generic-action) -(derive :app.main.data.workspace/set-workspace-layout ::generic-action) -(derive :app.main.data.workspace/toggle-layout-flag ::generic-action) - (defprotocol Event (-data [_] "Get event data")) (defn- simplify-props "Removes complex data types from props." [data] - (into {} - (comp - (remove (fn [[_ v]] (nil? v))) - (map (fn [[k v :as kv]] - (cond - (map? v) [k :placeholder/map] - (vector? v) [k :placeholder/vec] - (set? v) [k :placeholder/set] - (coll? v) [k :placeholder/coll] - (fn? v) [k :placeholder/fn] - :else kv)))) - data)) - - -(defmulti process-event-by-type ptk/type) + (reduce-kv (fn [data k v] + (cond + (map? v) (assoc data k :placeholder/map) + (vector? v) (assoc data k :placeholder/vec) + (set? v) (assoc data k :placeholder/set) + (coll? v) (assoc data k :placeholder/coll) + (fn? v) (assoc data k :placeholder/fn) + (nil? v) (dissoc data k) + :else data)) + data + data)) (defn- process-event-by-proto [event] @@ -158,72 +110,30 @@ :context context :props props})) -(defn- process-event +(defn- process-data-event [event] - (if (satisfies? Event event) - (process-event-by-proto event) - (process-event-by-type event))) - -(defmethod process-event-by-type :default [_] nil) + (let [data (deref event) + name (::name data)] + + (when (string? name) + (let [type (::type data "action") + context (-> (::context data) + (assoc :event-origin (::origin data)) + (d/without-nils)) + props (-> data d/without-qualified simplify-props)] + {:type type + :name name + :context context + :props props})))) -(defmethod process-event-by-type ::event - [event] - (let [data (deref event) - context (-> (::context data) - (assoc :event-origin (::origin data)) - (d/without-nils)) - props (-> data d/without-qualified simplify-props)] - - {:type (::type data "action") - :name (::name data "unnamed") - :context context - :props props})) - -(defmethod process-event-by-type ::generic-action - [event] - (let [type (ptk/type event) - data (if (satisfies? IDeref event) - (deref event) - {}) - data (d/deep-merge data (meta event))] - - {:type "action" - :name (or (::name data) (name type)) - :props (-> (d/without-qualified data) - (simplify-props)) - :context (d/without-nils - {:event-origin (::origin data) - :event-namespace (namespace type) - :event-symbol (name type)})})) - -(defmethod process-event-by-type :app.util.router/navigated - [event] - (let [match (deref event) - route (get-in match [:data :name]) - props {:route (name route) - :team-id (get-in match [:path-params :team-id]) - :file-id (get-in match [:path-params :file-id]) - :project-id (get-in match [:path-params :project-id])}] - {:name "navigate" - :type "action" - :props (simplify-props props)})) - -(defmethod process-event-by-type :app.main.data.users/logged-in +(defn- process-event [event] - (let [data (deref event) - mdata (meta data) - props {:signin-source (::source mdata) - :email (:email data) - :auth-backend (:auth-backend data) - :fullname (:fullname data) - :is-muted (:is-muted data) - :default-team-id (str (:default-team-id data)) - :default-project-id (str (:default-project-id data))}] + (cond + (satisfies? Event event) + (process-event-by-proto event) - {:name "signin" - :type "identify" - :profile-id (:id data) - :props (simplify-props props)})) + (ptk/data-event? event) + (process-data-event event))) ;; --- MAIN LOOP diff --git a/frontend/src/app/main/data/fonts.cljs b/frontend/src/app/main/data/fonts.cljs index bb8fe193f..b7150b033 100644 --- a/frontend/src/app/main/data/fonts.cljs +++ b/frontend/src/app/main/data/fonts.cljs @@ -12,6 +12,7 @@ [app.common.logging :as log] [app.common.media :as cm] [app.common.uuid :as uuid] + [app.main.data.events :as ev] [app.main.data.messages :as msg] [app.main.fonts :as fonts] [app.main.repo :as rp] @@ -236,12 +237,19 @@ (defn add-font [font] (ptk/reify ::add-font - IDeref - (-deref [_] (select-keys font [:font-family :font-style :font-weight])) - ptk/UpdateEvent (update [_ state] - (update state :dashboard-fonts assoc (:id font) font)))) + (update state :dashboard-fonts assoc (:id font) font)) + + ptk/WatchEvent + (watch [_ state _] + (let [team-id (:current-team-id state)] + (rx/of (ptk/data-event ::ev/event {::ev/name "add-font" + :team-id team-id + :font-id (:id font) + :font-family (:font-family font) + :font-style (:font-style font) + :font-weight (:font-weight font)})))))) (defn update-font [{:keys [id name] :as params}] @@ -271,6 +279,10 @@ [font-id] (dm/assert! (uuid? font-id)) (ptk/reify ::delete-font + ev/Event + (-data [_] + {:id font-id}) + ptk/UpdateEvent (update [_ state] (update state :dashboard-fonts @@ -280,8 +292,12 @@ ptk/WatchEvent (watch [_ state _] (let [team-id (:current-team-id state)] - (->> (rp/cmd! :delete-font {:id font-id :team-id team-id}) - (rx/ignore)))))) + (rx/concat + (->> (rp/cmd! :delete-font {:id font-id :team-id team-id}) + (rx/ignore)) + (rx/of (ptk/data-event ::ev/event {::ev/name "delete-font" + :team-id team-id + :font-id font-id}))))))) (defn delete-font-variant [id] @@ -297,8 +313,13 @@ ptk/WatchEvent (watch [_ state _] (let [team-id (:current-team-id state)] - (->> (rp/cmd! :delete-font-variant {:id id :team-id team-id}) - (rx/ignore)))))) + (rx/concat + (->> (rp/cmd! :delete-font-variant {:id id :team-id team-id}) + (rx/ignore)) + (rx/of (ptk/data-event ::ev/event {::ev/name "delete-font-variant" + :id id + :team-id team-id}))))))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Workspace related events diff --git a/frontend/src/app/main/data/modal.cljs b/frontend/src/app/main/data/modal.cljs index 5b5b79524..1055014c2 100644 --- a/frontend/src/app/main/data/modal.cljs +++ b/frontend/src/app/main/data/modal.cljs @@ -8,6 +8,7 @@ (:refer-clojure :exclude [update]) (:require [app.common.uuid :as uuid] + [app.main.data.events :as ev] [app.main.store :as st] [cljs.core :as c] [potok.v2.core :as ptk])) @@ -23,9 +24,11 @@ (show (uuid/next) type props)) ([id type props] (ptk/reify ::show-modal - IDeref - (-deref [_] - (merge (dissoc props :type) {:name type})) + ev/Event + (-data [_] + (-> props + (dissoc :type) + (assoc :name type))) ptk/UpdateEvent (update [_ state] diff --git a/frontend/src/app/main/data/users.cljs b/frontend/src/app/main/data/users.cljs index 64142d327..392c6e055 100644 --- a/frontend/src/app/main/data/users.cljs +++ b/frontend/src/app/main/data/users.cljs @@ -161,8 +161,16 @@ (rt/nav' :dashboard-projects {:team-id team-id}))))] (ptk/reify ::logged-in - IDeref - (-deref [_] profile) + ev/Event + (-data [_] + {::ev/name "signing" + ::ev/type "identify" + :email (:email profile) + :auth-backend (:auth-backend profile) + :fullname (:fullname profile) + :is-muted (:is-muted profile) + :default-team-id (:default-team-id profile) + :default-project-id (:default-project-id profile)}) ptk/WatchEvent (watch [_ _ _] @@ -288,6 +296,9 @@ ([] (logout {})) ([params] (ptk/reify ::logout + ev/Event + (-data [_] {}) + ptk/WatchEvent (watch [_ _ _] (->> (rp/cmd! :logout) @@ -360,6 +371,10 @@ [{:keys [email] :as data}] (dm/assert! ::us/email email) (ptk/reify ::request-email-change + ev/Event + (-data [_] + {:email email}) + ptk/WatchEvent (watch [_ _ _] (let [{:keys [on-error on-success] @@ -395,6 +410,9 @@ (sm/check! schema:update-password data)) (ptk/reify ::update-password + ev/Event + (-data [_] {}) + ptk/WatchEvent (watch [_ _ _] (let [{:keys [on-error on-success] @@ -458,6 +476,9 @@ (di/blob? file)) (ptk/reify ::update-photo + ev/Event + (-data [_] {}) + ptk/WatchEvent (watch [_ _ _] (let [on-success di/notify-finished-loading diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index 41fdb90ba..da8ac8eab 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -458,9 +458,10 @@ [{:keys [file-id]}] (let [id (uuid/next)] (ptk/reify ::create-page - IDeref - (-deref [_] - {:id id :file-id file-id}) + ev/Event + (-data [_] + {:id id + :file-id file-id}) ptk/WatchEvent (watch [it state _] diff --git a/frontend/src/app/main/data/workspace/comments.cljs b/frontend/src/app/main/data/workspace/comments.cljs index 3d1457d56..246034878 100644 --- a/frontend/src/app/main/data/workspace/comments.cljs +++ b/frontend/src/app/main/data/workspace/comments.cljs @@ -13,6 +13,7 @@ [app.common.schema :as sm] [app.common.types.shape-tree :as ctst] [app.main.data.comments :as dcm] + [app.main.data.events :as ev] [app.main.data.workspace.changes :as dch] [app.main.data.workspace.common :as dwco] [app.main.data.workspace.drawing :as dwd] @@ -118,7 +119,8 @@ (rx/take 1) (rx/mapcat #(rx/of (center-to-comment-thread thread) (dwd/select-for-drawing :comments) - (dcm/open-thread thread))))))))) + (with-meta (dcm/open-thread thread) + {::ev/origin "workspace"}))))))))) (defn update-comment-thread-position ([thread [new-x new-y]] diff --git a/frontend/src/app/main/data/workspace/guides.cljs b/frontend/src/app/main/data/workspace/guides.cljs index 222921010..2c7c6c2c0 100644 --- a/frontend/src/app/main/data/workspace/guides.cljs +++ b/frontend/src/app/main/data/workspace/guides.cljs @@ -11,23 +11,30 @@ [app.common.geom.point :as gpt] [app.common.geom.shapes :as gsh] [app.common.types.page :as ctp] + [app.main.data.events :as ev] [app.main.data.workspace.changes :as dch] [app.main.data.workspace.state-helpers :as wsh] [beicon.v2.core :as rx] [potok.v2.core :as ptk])) -(defn make-update-guide [guide] +(defn make-update-guide + [guide] (fn [other] (cond-> other (= (:id other) (:id guide)) (merge guide)))) -(defn update-guides [guide] +(defn update-guides + [guide] (dm/assert! "expected valid guide" (ctp/check-page-guide! guide)) (ptk/reify ::update-guides + ev/Event + (-data [_] + (assoc guide ::ev/name "update-guide")) + ptk/WatchEvent (watch [it state _] (let [page (wsh/lookup-page state) @@ -37,17 +44,20 @@ (pcb/update-page-option :guides assoc (:id guide) guide))] (rx/of (dch/commit-changes changes)))))) -(defn remove-guide [guide] +(defn remove-guide + [guide] (dm/assert! "expected valid guide" (ctp/check-page-guide! guide)) (ptk/reify ::remove-guide + ev/Event + (-data [_] guide) + ptk/UpdateEvent (update [_ state] (let [sdisj (fnil disj #{})] - (-> state - (update-in [:workspace-guides :hover] sdisj (:id guide))))) + (update-in state [:workspace-guides :hover] sdisj (:id guide)))) ptk/WatchEvent (watch [it state _] diff --git a/frontend/src/app/main/data/workspace/layout.cljs b/frontend/src/app/main/data/workspace/layout.cljs index 24cfc6779..750653c2a 100644 --- a/frontend/src/app/main/data/workspace/layout.cljs +++ b/frontend/src/app/main/data/workspace/layout.cljs @@ -82,8 +82,8 @@ (defn toggle-layout-flag [flag & {:keys [force?] :as opts}] (ptk/reify ::toggle-layout-flag - IDeref - (-deref [_] {:name flag}) + ev/Event + (-data [_] {:name flag}) ptk/UpdateEvent (update [_ state] diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index 448997208..9f4867ace 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -108,8 +108,8 @@ (uc/gradient-type->string (get-in color [:gradient :type])))))] (dm/assert! ::ctc/color color) (ptk/reify ::add-color - IDeref - (-deref [_] color) + ev/Event + (-data [_] color) ptk/WatchEvent (watch [it _ _] @@ -185,6 +185,9 @@ [{:keys [id] :as params}] (dm/assert! (uuid? id)) (ptk/reify ::delete-color + ev/Event + (-data [_] {:id id}) + ptk/WatchEvent (watch [it state _] (let [data (get state :workspace-data) @@ -200,6 +203,9 @@ (ctf/check-media-object! media)) (ptk/reify ::add-media + ev/Event + (-data [_] media) + ptk/WatchEvent (watch [it _ _] (let [obj (select-keys media [:id :name :width :height :mtype]) @@ -230,6 +236,9 @@ [{:keys [id] :as params}] (dm/assert! (uuid? id)) (ptk/reify ::delete-media + ev/Event + (-data [_] {:id id}) + ptk/WatchEvent (watch [it state _] (let [data (get state :workspace-data) @@ -247,8 +256,8 @@ (ctt/check-typography! typography)) (ptk/reify ::add-typography - IDeref - (-deref [_] typography) + ev/Event + (-data [_] typography) ptk/WatchEvent (watch [it _ _] @@ -291,6 +300,9 @@ (dm/assert! (uuid? id)) (dm/assert! (string? new-name)) (ptk/reify ::rename-typography + ev/Event + (-data [_] {:id id :name new-name}) + ptk/WatchEvent (watch [it state _] (when (and (some? new-name) (not= "" new-name)) @@ -304,6 +316,9 @@ [id] (dm/assert! (uuid? id)) (ptk/reify ::delete-typography + ev/Event + (-data [_] {:id id}) + ptk/WatchEvent (watch [it state _] (let [data (get state :workspace-data) @@ -316,8 +331,10 @@ "This is the second step of the component creation." [selected components-v2] (ptk/reify ::add-component2 - IDeref - (-deref [_] {:num-shapes (count selected)}) + ev/Event + (-data [_] + {::ev/name "add-component" + :shapes (count selected)}) ptk/WatchEvent (watch [it state _] @@ -369,9 +386,10 @@ selected-objects (map #(get objects %) selected) ;; We don't want to change the structure of component copies can-make-component (every? true? (map #(ctn/valid-shape-for-component? objects %) selected-objects)) - added-components (map - #(add-component2 [%] components-v2) - selected) + added-components (map (fn [id] + (with-meta (add-component2 [id] components-v2) + {:multiple true})) + selected) undo-id (js/Symbol)] (when can-make-component (rx/concat @@ -1266,9 +1284,11 @@ [id is-shared] {:pre [(uuid? id) (boolean? is-shared)]} (ptk/reify ::set-file-shared - IDeref - (-deref [_] - {::ev/origin "workspace" :id id :shared is-shared}) + ev/Event + (-data [_] + {::ev/origin "workspace" + :id id + :shared is-shared}) ptk/UpdateEvent (update [_ state] @@ -1302,6 +1322,12 @@ (defn link-file-to-library [file-id library-id] (ptk/reify ::attach-library + ev/Event + (-data [_] + {::ev/name "attach-library" + :file-id file-id + :library-id library-id}) + ;; NOTE: this event implements UpdateEvent protocol for perform an ;; optimistic update state for make the UI feel more responsive. ptk/UpdateEvent @@ -1331,6 +1357,12 @@ (defn unlink-file-from-library [file-id library-id] (ptk/reify ::detach-library + ev/Event + (-data [_] + {::ev/name "detach-library" + :file-id file-id + :library-id library-id}) + ptk/UpdateEvent (update [_ state] (d/dissoc-in state [:workspace-libraries library-id])) diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index 56b4e6800..825cfedab 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -24,6 +24,7 @@ [app.common.types.shape.interactions :as ctsi] [app.common.types.shape.layout :as ctl] [app.common.uuid :as uuid] + [app.main.data.events :as ev] [app.main.data.modal :as md] [app.main.data.workspace.changes :as dch] [app.main.data.workspace.collapse :as dwc] @@ -791,6 +792,9 @@ (defn toggle-focus-mode [] (ptk/reify ::toggle-focus-mode + ev/Event + (-data [_] {}) + ptk/UpdateEvent (update [_ state] (let [selected (wsh/lookup-selected state)] diff --git a/frontend/src/app/main/ui/dashboard/projects.cljs b/frontend/src/app/main/ui/dashboard/projects.cljs index 931ac0604..fd855f4b1 100644 --- a/frontend/src/app/main/ui/dashboard/projects.cljs +++ b/frontend/src/app/main/ui/dashboard/projects.cljs @@ -385,24 +385,24 @@ (mf/use-fn (fn [] (st/emit! (du/update-profile-props {:team-hero? false}) - (ptk/event ::ev/event {::ev/name "dont-show-team-up-hero" - ::ev/origin "dashboard"})))) + (ptk/data-event ::ev/event {::ev/name "dont-show-team-up-hero" + ::ev/origin "dashboard"})))) close-tutorial (mf/use-fn (fn [] (st/emit! (du/update-profile-props {:viewed-tutorial? true}) - (ptk/event ::ev/event {::ev/name "dont-show" - ::ev/origin "get-started-hero-block" - :type "tutorial" - :section "dashboard"})))) + (ptk/data-event ::ev/event {::ev/name "dont-show-tutorial" + ::ev/origin "get-started-hero" + :type "tutorial" + :section "dashboard"})))) close-walkthrough (mf/use-fn (fn [] (st/emit! (du/update-profile-props {:viewed-walkthrough? true}) - (ptk/event ::ev/event {::ev/name "dont-show" - ::ev/origin "get-started-hero-block" - :type "walkthrough" - :section "dashboard"}))))] + (ptk/data-event ::ev/event {::ev/name "dont-show-walkthrough" + ::ev/origin "get-started-hero" + :type "walkthrough" + :section "dashboard"}))))] (mf/with-effect [team] (let [tname (if (:is-default team) diff --git a/frontend/src/app/util/router.cljs b/frontend/src/app/util/router.cljs index 50a9bb0fd..c4d541cfd 100644 --- a/frontend/src/app/util/router.cljs +++ b/frontend/src/app/util/router.cljs @@ -7,8 +7,10 @@ (ns app.util.router (:refer-clojure :exclude [resolve]) (:require + [app.common.data.macros :as dm] [app.common.uri :as u] [app.config :as cf] + [app.main.data.events :as ev] [app.util.browser-history :as bhistory] [app.util.dom :as dom] [app.util.timers :as ts] @@ -59,8 +61,13 @@ (defn navigated [match] (ptk/reify ::navigated - IDeref - (-deref [_] match) + ev/Event + (-data [_] + (let [route (dm/get-in match [:data :name]) + params (get match :path-params)] + (assoc params + ::ev/name "navigate" + :route (name route)))) ptk/UpdateEvent (update [_ state] -- Gitee From b5fe07d5ee28f84c2d8b340a146b248cf4e8b472 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Thu, 14 Mar 2024 15:15:14 +0100 Subject: [PATCH 0057/1266] :bug: Fix projects & teams dashboard pages --- frontend/src/app/main/ui/dashboard.scss | 2 +- .../src/app/main/ui/dashboard/projects.cljs | 57 ++++++++++--------- .../src/app/main/ui/dashboard/projects.scss | 5 ++ 3 files changed, 35 insertions(+), 29 deletions(-) diff --git a/frontend/src/app/main/ui/dashboard.scss b/frontend/src/app/main/ui/dashboard.scss index ed79f5362..064694ec9 100644 --- a/frontend/src/app/main/ui/dashboard.scss +++ b/frontend/src/app/main/ui/dashboard.scss @@ -21,7 +21,7 @@ .dashboard-content { display: grid; - grid-template-rows: $s-64 auto auto 1fr; + grid-template-rows: $s-64 1fr; position: relative; grid-row: 1 / span 2; padding: $s-16 $s-16 0 0; diff --git a/frontend/src/app/main/ui/dashboard/projects.cljs b/frontend/src/app/main/ui/dashboard/projects.cljs index 931ac0604..7cf1ef2b4 100644 --- a/frontend/src/app/main/ui/dashboard/projects.cljs +++ b/frontend/src/app/main/ui/dashboard/projects.cljs @@ -417,31 +417,32 @@ (when (seq projects) [:* [:& header] - - (when team-hero? - [:& team-hero {:team team :close-fn close-banner}]) - - (when (and (contains? cf/flags :dashboard-templates-section) - (or (not tutorial-viewed?) - (not walkthrough-viewed?))) - [:div {:class (stl/css :hero-projects)} - (when (and (not tutorial-viewed?) (:is-default team)) - [:& tutorial-project - {:close-tutorial close-tutorial - :default-project-id default-project-id}]) - - (when (and (not walkthrough-viewed?) (:is-default team)) - [:& interface-walkthrough - {:close-walkthrough close-walkthrough}])]) - - [:div {:class (stl/css :dashboard-container :no-bg :dashboard-projects)} - (for [{:keys [id] :as project} projects] - (let [files (when recent-map - (->> (vals recent-map) - (filterv #(= id (:project-id %))) - (sort-by :modified-at #(compare %2 %1))))] - [:& project-item {:project project - :team team - :files files - :first? (= project (first projects)) - :key id}]))]]))) + [:div {:class (stl/css :projects-container)} + [:* + (when team-hero? + [:& team-hero {:team team :close-fn close-banner}]) + + (when (and (contains? cf/flags :dashboard-templates-section) + (or (not tutorial-viewed?) + (not walkthrough-viewed?))) + [:div {:class (stl/css :hero-projects)} + (when (and (not tutorial-viewed?) (:is-default team)) + [:& tutorial-project + {:close-tutorial close-tutorial + :default-project-id default-project-id}]) + + (when (and (not walkthrough-viewed?) (:is-default team)) + [:& interface-walkthrough + {:close-walkthrough close-walkthrough}])]) + + [:div {:class (stl/css :dashboard-container :no-bg :dashboard-projects)} + (for [{:keys [id] :as project} projects] + (let [files (when recent-map + (->> (vals recent-map) + (filterv #(= id (:project-id %))) + (sort-by :modified-at #(compare %2 %1))))] + [:& project-item {:project project + :team team + :files files + :first? (= project (first projects)) + :key id}]))]]]]))) diff --git a/frontend/src/app/main/ui/dashboard/projects.scss b/frontend/src/app/main/ui/dashboard/projects.scss index 735f4e7ee..105dabd50 100644 --- a/frontend/src/app/main/ui/dashboard/projects.scss +++ b/frontend/src/app/main/ui/dashboard/projects.scss @@ -44,6 +44,11 @@ --actions-opacity: 1; } +.projects-container { + display: grid; + grid-auto-rows: min-content; +} + .project { display: flex; flex-direction: row; -- Gitee From 55b6df0ae4adb34e490a761885f5338d99ede447 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 14 Mar 2024 16:16:33 +0100 Subject: [PATCH 0058/1266] :bug: Make opacity override same color recent-color --- common/src/app/common/files/changes.cljc | 14 +++++++++----- common/src/app/common/types/color.cljc | 6 ++++++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/common/src/app/common/files/changes.cljc b/common/src/app/common/files/changes.cljc index c200749d8..978cc8edf 100644 --- a/common/src/app/common/files/changes.cljc +++ b/common/src/app/common/files/changes.cljc @@ -609,11 +609,15 @@ (defmethod process-change :add-recent-color [data {:keys [color]}] ;; Moves the color to the top of the list and then truncates up to 15 - (update data :recent-colors (fn [rc] - (let [rc (conj (filterv (comp not #{color}) (or rc [])) color)] - (if (> (count rc) 15) - (subvec rc 1) - rc))))) + (update + data + :recent-colors + (fn [rc] + (let [rc (->> rc (d/removev (partial ctc/eq-recent-color? color))) + rc (-> rc (conj color))] + (cond-> rc + (> (count rc) 15) + (subvec 1)))))) ;; -- Media diff --git a/common/src/app/common/types/color.cljc b/common/src/app/common/types/color.cljc index 382530ac2..7bded1492 100644 --- a/common/src/app/common/types/color.cljc +++ b/common/src/app/common/types/color.cljc @@ -358,3 +358,9 @@ (process-shape-colors shape sync-color))) +(defn eq-recent-color? + [c1 c2] + (or (= c1 c2) + (and (some? (:color c1)) + (some? (:color c2)) + (= (:color c1) (:color c2))))) -- Gitee From affa37f0c5dec55cc5c1b1ae353af6fd9149236b Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 14 Mar 2024 16:54:15 +0100 Subject: [PATCH 0059/1266] :bug: Fix problem with scroll style in windows --- .../ui/workspace/sidebar/options/menus/layout_container.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/layout_container.scss b/frontend/src/app/main/ui/workspace/sidebar/options/menus/layout_container.scss index 62ce26e4f..a51118e29 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/layout_container.scss +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/layout_container.scss @@ -113,7 +113,7 @@ .padding-simple { @extend .input-element; - width: $s-108; + max-width: $s-108; } } @@ -124,7 +124,7 @@ .padding-multiple { @extend .input-element; - width: $s-108; + max-width: $s-108; } } -- Gitee From a3ca905f37259eb33ff4d8b0b2061939c2a4209f Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 14 Mar 2024 16:18:10 +0100 Subject: [PATCH 0060/1266] :bug: Fix uneven layer opacities --- frontend/src/app/main/ui/shapes/attrs.cljs | 14 +------------- frontend/src/app/main/ui/shapes/custom_stroke.cljs | 3 +-- frontend/src/app/main/ui/shapes/frame.cljs | 6 ++++-- frontend/src/app/main/ui/shapes/shape.cljs | 2 ++ frontend/src/app/main/ui/shapes/text/fo_text.cljs | 2 -- 5 files changed, 8 insertions(+), 19 deletions(-) diff --git a/frontend/src/app/main/ui/shapes/attrs.cljs b/frontend/src/app/main/ui/shapes/attrs.cljs index 43fb21123..5c148d26d 100644 --- a/frontend/src/app/main/ui/shapes/attrs.cljs +++ b/frontend/src/app/main/ui/shapes/attrs.cljs @@ -148,17 +148,6 @@ attrs)) -(defn add-layer-styles! - [props shape] - (let [opacity (:opacity shape)] - (if (some? opacity) - (obj/set! props "opacity" opacity) - props))) - -(defn get-layer-styles - [shape] - (add-layer-styles! #js {} shape)) - (defn get-svg-props [shape render-id] (let [attrs (get shape :svg-attrs {}) @@ -195,8 +184,7 @@ style (-> (obj/get props "style") (obj/clone) - (obj/merge! svg-styles) - (add-layer-styles! shape)) + (obj/merge! svg-styles)) url-fill? (or ^boolean (some? (:fill-image shape)) ^boolean (cfh/image-shape? shape) diff --git a/frontend/src/app/main/ui/shapes/custom_stroke.cljs b/frontend/src/app/main/ui/shapes/custom_stroke.cljs index e855405a1..43c9d607a 100644 --- a/frontend/src/app/main/ui/shapes/custom_stroke.cljs +++ b/frontend/src/app/main/ui/shapes/custom_stroke.cljs @@ -476,8 +476,7 @@ svg-attrs (attrs/get-svg-props shape render-id) style (-> (obj/get props "style") - (obj/clone) - (attrs/add-layer-styles! shape)) + (obj/clone)) props (mf/spread-props svg-attrs {:id stroke-id diff --git a/frontend/src/app/main/ui/shapes/frame.cljs b/frontend/src/app/main/ui/shapes/frame.cljs index 64bd709f9..970e1ce7f 100644 --- a/frontend/src/app/main/ui/shapes/frame.cljs +++ b/frontend/src/app/main/ui/shapes/frame.cljs @@ -69,6 +69,7 @@ y (dm/get-prop shape :y) w (dm/get-prop shape :width) h (dm/get-prop shape :height) + opacity (dm/get-prop shape :opacity) transform (gsh/transform-str shape) show-content? (get shape :show-content) @@ -92,7 +93,8 @@ ;; transparent). It may have been changed to default black ;; if a shape coming from an imported SVG file is ;; rendered. See main.ui.shapes.attrs/add-style-attrs. - :fill "none"} + :fill "none" + :opacity opacity} [:& shape-fills {:shape shape} (if ^boolean path? @@ -171,7 +173,7 @@ (ctl/sort-layout-children-z-index))] [:> frame-container props - [:g.frame-children {:opacity (:opacity shape)} + [:g.frame-children (for [item childs] (let [id (dm/get-prop item :id)] (when (some? id) diff --git a/frontend/src/app/main/ui/shapes/shape.cljs b/frontend/src/app/main/ui/shapes/shape.cljs index 39e13482d..47b32bf52 100644 --- a/frontend/src/app/main/ui/shapes/shape.cljs +++ b/frontend/src/app/main/ui/shapes/shape.cljs @@ -70,6 +70,8 @@ filter-id (dm/str "filter-" render-id) styles (-> (obj/create) (obj/set! "pointerEvents" pointer-events) + (cond-> (not (cfh/frame-shape? shape)) + (obj/set! "opacity" (:opacity shape))) (cond-> (and blend-mode (not= blend-mode :normal)) (obj/set! "mixBlendMode" (d/name blend-mode)))) diff --git a/frontend/src/app/main/ui/shapes/text/fo_text.cljs b/frontend/src/app/main/ui/shapes/text/fo_text.cljs index 7e2ebc504..1f7836cc0 100644 --- a/frontend/src/app/main/ui/shapes/text/fo_text.cljs +++ b/frontend/src/app/main/ui/shapes/text/fo_text.cljs @@ -10,7 +10,6 @@ [app.common.data :as d] [app.common.data.macros :as dm] [app.common.geom.shapes :as gsh] - [app.main.ui.shapes.attrs :as attrs] [app.main.ui.shapes.text.styles :as sts] [app.util.object :as obj] [cuerdas.core :as str] @@ -192,7 +191,6 @@ :transform transform :width (if (#{:auto-width} grow-type) 100000 width) :height (if (#{:auto-height :auto-width} grow-type) 100000 height) - :style (attrs/get-layer-styles shape) :ref ref} ;; We use a class here because react has a bug that won't use the appropriate selector for ;; `background-clip` -- Gitee From 1e9c6f3ebe89b36b8ff9d2a8758f9be3712e89b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Fri, 15 Mar 2024 11:19:37 +0100 Subject: [PATCH 0061/1266] :bug: Fix main toolbar positioning when rulers are hidden --- .../app/main/ui/workspace/top_toolbar.cljs | 2 +- .../app/main/ui/workspace/top_toolbar.scss | 24 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/top_toolbar.cljs b/frontend/src/app/main/ui/workspace/top_toolbar.cljs index 406d28fcb..979c84e19 100644 --- a/frontend/src/app/main/ui/workspace/top_toolbar.cljs +++ b/frontend/src/app/main/ui/workspace/top_toolbar.cljs @@ -119,7 +119,7 @@ (when-not ^boolean read-only? [:aside {:class (stl/css-case :main-toolbar true - :not-rulers-present (not rulers?) + :main-toolbar-no-rulers (not rulers?) :main-toolbar-hidden hide-toolbar?)} [:ul {:class (stl/css :main-toolbar-options)} [:li diff --git a/frontend/src/app/main/ui/workspace/top_toolbar.scss b/frontend/src/app/main/ui/workspace/top_toolbar.scss index bc7850c72..625e5384e 100644 --- a/frontend/src/app/main/ui/workspace/top_toolbar.scss +++ b/frontend/src/app/main/ui/workspace/top_toolbar.scss @@ -9,7 +9,8 @@ .main-toolbar { cursor: initial; position: absolute; - left: calc(50% - $s-160); + left: 50%; + transform: translateX(-50%); display: flex; align-items: center; flex-direction: column; @@ -23,13 +24,19 @@ top 0.3s, height 0.3s, opacity 0.3s; - &:not(.main-toolbar-hidden) { - top: $s-28; - } + + --toolbar-position-y: #{$s-28}; + --toolbar-offset-y: 0px; + top: calc(var(--toolbar-position-y) + var(--toolbar-offset-y)); +} + +.main-toolbar-no-rulers { + --toolbar-position-y: 0px; + --toolbar-offset-y: #{$s-8}; } .main-toolbar-hidden { - top: $s-24; + --toolbar-offset-y: -#{$s-4}; height: $s-16; z-index: $z-index-1; border-radius: 0 0 $s-8 $s-8; @@ -88,13 +95,6 @@ } } -.main-toolbar.not-rulers-present { - top: $s-8; - &.hidden-toolbar { - top: $s-0; - } -} - ul.main-toolbar-panels { display: none; } -- Gitee From 51c2269c84a657a7f223ee4d3e155a454bc13bc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Fri, 15 Mar 2024 12:21:51 +0100 Subject: [PATCH 0062/1266] :bug: Fix subactions toolbar positioning --- .../src/app/main/ui/workspace/viewport/path_actions.scss | 3 ++- frontend/src/app/main/ui/workspace/viewport/top_bar.cljs | 3 ++- frontend/src/app/main/ui/workspace/viewport/top_bar.scss | 9 ++++++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/viewport/path_actions.scss b/frontend/src/app/main/ui/workspace/viewport/path_actions.scss index c4d346603..e64aa4ffd 100644 --- a/frontend/src/app/main/ui/workspace/viewport/path_actions.scss +++ b/frontend/src/app/main/ui/workspace/viewport/path_actions.scss @@ -11,7 +11,8 @@ pointer-events: initial; position: absolute; top: $s-12; - left: calc(50% - 240px); + left: 50%; + transform: translateX(-50%); display: flex; align-items: center; height: $s-56; diff --git a/frontend/src/app/main/ui/workspace/viewport/top_bar.cljs b/frontend/src/app/main/ui/workspace/viewport/top_bar.cljs index 0c7d6b01b..2e6b5d498 100644 --- a/frontend/src/app/main/ui/workspace/viewport/top_bar.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/top_bar.cljs @@ -41,6 +41,7 @@ (let [edition (mf/deref refs/selected-edition) selected (mf/deref refs/selected-objects) drawing (mf/deref refs/workspace-drawing) + rulers? (mf/deref refs/rulers?) drawing-obj (:object drawing) shape (or drawing-obj (-> selected first)) @@ -69,7 +70,7 @@ [:& view-only-actions] path-edition? - [:div {:class (stl/css :viewport-actions)} + [:div {:class (stl/css-case :viewport-actions true :viewport-actions-no-rulers (not rulers?))} [:& path-actions {:shape shape}]] grid-edition? diff --git a/frontend/src/app/main/ui/workspace/viewport/top_bar.scss b/frontend/src/app/main/ui/workspace/viewport/top_bar.scss index b83e795d6..7d922dcfc 100644 --- a/frontend/src/app/main/ui/workspace/viewport/top_bar.scss +++ b/frontend/src/app/main/ui/workspace/viewport/top_bar.scss @@ -9,7 +9,10 @@ .viewport-actions { pointer-events: none; position: absolute; - top: $s-44; + --actions-toolbar-position-y: #{$s-28}; + --actions-toolbar-offset-y: #{$s-6}; + + top: calc(var(--actions-toolbar-position-y) + var(--actions-toolbar-offset-y)); left: 50%; z-index: $z-index-20; @@ -47,3 +50,7 @@ } } } + +.viewport-actions-no-rulers { + --actions-toolbar-position-y: 0px; +} -- Gitee From 80370e39b590f6f281d6f06d6fc07851a416960e Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Fri, 15 Mar 2024 13:56:51 +0100 Subject: [PATCH 0063/1266] :sparkles: Add new copies to the release modal --- .../resources/images/features/2.0-html.gif | Bin 0 -> 325556 bytes frontend/src/app/main/ui/releases/v2_0.cljs | 149 +++++++++++------- frontend/src/app/main/ui/releases/v2_0.scss | 8 + 3 files changed, 101 insertions(+), 56 deletions(-) create mode 100644 frontend/resources/images/features/2.0-html.gif diff --git a/frontend/resources/images/features/2.0-html.gif b/frontend/resources/images/features/2.0-html.gif new file mode 100644 index 0000000000000000000000000000000000000000..6e10f5ad787f1a117273b02aae1a408def8565dc GIT binary patch literal 325556 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 wk!^|Yo*jV0@do(= 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

INE^U5$sa>bzbs^I( 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 z

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 Date: Fri, 15 Mar 2024 14:15:49 +0100 Subject: [PATCH 0064/1266] :bug: Fix duplicate board --- frontend/src/app/main/data/workspace/selection.cljs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index 56b4e6800..3f22275b9 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -434,7 +434,9 @@ moved-component (gsh/move component-root delta) pos (gpt/point (:x moved-component) (:y moved-component)) origin-frame (get-in page [:objects frame-id]) - delta (gpt/subtract delta (-> origin-frame :selrect gpt/point)) + delta (cond-> delta + (some? origin-frame) + (gpt/subtract (-> origin-frame :selrect gpt/point))) instantiate-component #(dwlh/generate-instantiate-component changes -- Gitee From 895f649ef1c02eb1477d44acb0ffb7da096c4e37 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Fri, 15 Mar 2024 14:01:37 +0100 Subject: [PATCH 0065/1266] :bug: Stop drag events when the user focus out the application --- .../app/main/data/workspace/drawing/box.cljs | 8 +------ .../main/data/workspace/drawing/curve.cljs | 19 ++++++---------- .../app/main/data/workspace/interactions.cljs | 8 ++----- .../app/main/data/workspace/path/drawing.cljs | 12 +++------- .../app/main/data/workspace/path/edition.cljs | 8 ++----- .../main/data/workspace/path/selection.cljs | 13 +++-------- .../app/main/data/workspace/path/streams.cljs | 4 +--- .../app/main/data/workspace/selection.cljs | 13 ++++------- .../app/main/data/workspace/transforms.cljs | 19 ++++------------ .../app/main/ui/workspace/viewport/hooks.cljs | 7 ++++-- frontend/src/app/util/mouse.cljs | 22 ++++++++++++++++++- 11 files changed, 53 insertions(+), 80 deletions(-) diff --git a/frontend/src/app/main/data/workspace/drawing/box.cljs b/frontend/src/app/main/data/workspace/drawing/box.cljs index 76a6c3ce8..a595a8c3f 100644 --- a/frontend/src/app/main/data/workspace/drawing/box.cljs +++ b/frontend/src/app/main/data/workspace/drawing/box.cljs @@ -78,13 +78,7 @@ (ptk/reify ::handle-drawing ptk/WatchEvent (watch [_ state stream] - (let [stopper (rx/merge - (->> stream - (rx/filter mse/mouse-event?) - (rx/filter mse/mouse-up-event?)) - (->> stream - (rx/filter #(= % :interrupt)))) - + (let [stopper (mse/drag-stopper stream) layout (get state :workspace-layout) zoom (dm/get-in state [:workspace-local :zoom] 1) diff --git a/frontend/src/app/main/data/workspace/drawing/curve.cljs b/frontend/src/app/main/data/workspace/drawing/curve.cljs index 8a2194962..5c0d98898 100644 --- a/frontend/src/app/main/data/workspace/drawing/curve.cljs +++ b/frontend/src/app/main/data/workspace/drawing/curve.cljs @@ -28,11 +28,6 @@ (def simplify-tolerance 0.3) -(defn stopper-event? - [{:keys [type] :as event}] - (and (mse/mouse-event? event) - (= type :up))) - (defn- insert-point [point] (ptk/reify ::insert-point @@ -104,13 +99,13 @@ (ptk/reify ::handle-drawing ptk/WatchEvent (watch [_ _ stream] - (let [stopper (rx/filter stopper-event? stream) - mouse (rx/sample 10 ms/mouse-position) - shape (cts/setup-shape {:type :path - :initialized? true - :frame-id uuid/zero - :parent-id uuid/zero - :segments []})] + (let [stopper (mse/drag-stopper stream) + mouse (rx/sample 10 ms/mouse-position) + shape (cts/setup-shape {:type :path + :initialized? true + :frame-id uuid/zero + :parent-id uuid/zero + :segments []})] (rx/concat (rx/of #(update % :workspace-drawing assoc :object shape)) (->> mouse diff --git a/frontend/src/app/main/data/workspace/interactions.cljs b/frontend/src/app/main/data/workspace/interactions.cljs index 5708ca3c4..1aad31f2f 100644 --- a/frontend/src/app/main/data/workspace/interactions.cljs +++ b/frontend/src/app/main/data/workspace/interactions.cljs @@ -193,9 +193,7 @@ (watch [_ state stream] (let [initial-pos @ms/mouse-position selected (wsh/lookup-selected state) - stopper (->> stream - (rx/filter mse/mouse-event?) - (rx/filter mse/mouse-up-event?))] + stopper (mse/drag-stopper stream)] (when (= 1 (count selected)) (rx/concat (->> ms/mouse-position @@ -305,9 +303,7 @@ (watch [_ state stream] (let [initial-pos @ms/mouse-position selected (wsh/lookup-selected state) - stopper (->> stream - (rx/filter mse/mouse-event?) - (rx/filter mse/mouse-up-event?))] + stopper (mse/drag-stopper stream)] (when (= 1 (count selected)) (let [page-id (:current-page-id state) objects (wsh/lookup-page-objects state page-id) diff --git a/frontend/src/app/main/data/workspace/path/drawing.cljs b/frontend/src/app/main/data/workspace/path/drawing.cljs index af492bc0f..f536f3369 100644 --- a/frontend/src/app/main/data/workspace/path/drawing.cljs +++ b/frontend/src/app/main/data/workspace/path/drawing.cljs @@ -139,9 +139,7 @@ (rx/map #(drag-handler position idx prefix %)) (rx/take-until (rx/merge - (->> stream - (rx/filter mse/mouse-event?) - (rx/filter mse/mouse-up-event?)) + (mse/drag-stopper stream) (->> stream (rx/filter helpers/end-path-event?)))))] @@ -166,9 +164,7 @@ ptk/WatchEvent (watch [_ state stream] (let [stopper (rx/merge - (->> stream - (rx/filter mse/mouse-event?) - (rx/filter mse/mouse-up-event?)) + (mse/drag-stopper stream) (->> stream (rx/filter helpers/end-path-event?))) @@ -197,9 +193,7 @@ (gpt/point? down-event)) (let [stopper (rx/merge - (->> stream - (rx/filter mse/mouse-event?) - (rx/filter mse/mouse-up-event?)) + (mse/drag-stopper stream) (->> stream (rx/filter helpers/end-path-event?))) diff --git a/frontend/src/app/main/data/workspace/path/edition.cljs b/frontend/src/app/main/data/workspace/path/edition.cljs index 51d688707..164e37acb 100644 --- a/frontend/src/app/main/data/workspace/path/edition.cljs +++ b/frontend/src/app/main/data/workspace/path/edition.cljs @@ -150,9 +150,7 @@ (ptk/reify ::drag-selected-points ptk/WatchEvent (watch [_ state stream] - (let [stopper (->> stream - (rx/filter mse/mouse-event?) - (rx/filter mse/mouse-up-event?)) + (let [stopper (mse/drag-stopper stream) id (dm/get-in state [:workspace-local :edition]) @@ -279,9 +277,7 @@ (not alt?))))) (rx/take-until (rx/merge - (->> stream - (rx/filter mse/mouse-event?) - (rx/filter mse/mouse-up-event?)) + (mse/drag-stopper stream) (->> stream (rx/filter streams/finish-edition?))))) diff --git a/frontend/src/app/main/data/workspace/path/selection.cljs b/frontend/src/app/main/data/workspace/path/selection.cljs index 028a6ec3b..b2256b3c9 100644 --- a/frontend/src/app/main/data/workspace/path/selection.cljs +++ b/frontend/src/app/main/data/workspace/path/selection.cljs @@ -10,7 +10,6 @@ [app.common.geom.point :as gpt] [app.common.geom.rect :as grc] [app.common.geom.shapes :as gsh] - [app.main.data.workspace.common :as dwc] [app.main.data.workspace.path.state :as st] [app.main.streams :as ms] [app.util.mouse :as mse] @@ -119,15 +118,9 @@ (ptk/reify ::handle-area-selection ptk/WatchEvent (watch [_ state stream] - (let [zoom (get-in state [:workspace-local :zoom] 1) - stopper (rx/merge - (->> stream - (rx/filter mse/mouse-event?) - (rx/filter mse/mouse-up-event?)) - (->> stream - (rx/filter dwc/interrupt?))) - - from-p @ms/mouse-position] + (let [zoom (get-in state [:workspace-local :zoom] 1) + stopper (mse/drag-stopper stream) + from-p @ms/mouse-position] (rx/concat (->> ms/mouse-position (rx/map #(grc/points->rect [from-p %])) diff --git a/frontend/src/app/main/data/workspace/path/streams.cljs b/frontend/src/app/main/data/workspace/path/streams.cljs index 9f55e92a0..38d0efd50 100644 --- a/frontend/src/app/main/data/workspace/path/streams.cljs +++ b/frontend/src/app/main/data/workspace/path/streams.cljs @@ -53,9 +53,7 @@ start (-> @ms/mouse-position to-pixel-snap) stopper (rx/merge - (->> st/stream - (rx/filter mse/mouse-event?) - (rx/filter mse/mouse-up-event?)) + (mse/drag-stopper st/stream) (->> st/stream (rx/filter finish-edition?))) diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index 3f22275b9..ca4200c11 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -27,6 +27,7 @@ [app.main.data.modal :as md] [app.main.data.workspace.changes :as dch] [app.main.data.workspace.collapse :as dwc] + [app.main.data.workspace.edition :as dwe] [app.main.data.workspace.libraries-helpers :as dwlh] [app.main.data.workspace.specialized-panel :as-alias dwsp] [app.main.data.workspace.state-helpers :as wsh] @@ -63,14 +64,8 @@ (ptk/reify ::handle-area-selection ptk/WatchEvent (watch [_ state stream] - (let [zoom (dm/get-in state [:workspace-local :zoom] 1) - stopper (rx/merge - (->> stream - (rx/filter mse/mouse-event?) - (rx/filter mse/mouse-up-event?)) - (->> stream - (rx/filter interrupt?))) - + (let [zoom (dm/get-in state [:workspace-local :zoom] 1) + stopper (mse/drag-stopper stream) init-position @ms/mouse-position init-selrect (grc/make-rect @@ -155,7 +150,7 @@ objects (wsh/lookup-page-objects state page-id)] (rx/of (dwc/expand-all-parents [id] objects) - :interrupt + (dwe/clear-edition-mode) ::dwsp/interrupt)))))) (defn select-prev-shape diff --git a/frontend/src/app/main/data/workspace/transforms.cljs b/frontend/src/app/main/data/workspace/transforms.cljs index fc8ee350d..c52cd2fbb 100644 --- a/frontend/src/app/main/data/workspace/transforms.cljs +++ b/frontend/src/app/main/data/workspace/transforms.cljs @@ -257,9 +257,7 @@ (watch [_ state stream] (let [initial-position @ms/mouse-position - stopper (->> stream - (rx/filter mse/mouse-event?) - (rx/filter mse/mouse-up-event?)) + stopper (mse/drag-stopper stream) layout (:workspace-layout state) page-id (:current-page-id state) focus (:workspace-focus-selected state) @@ -370,10 +368,7 @@ ptk/WatchEvent (watch [_ _ stream] - (let [stopper (->> stream - (rx/filter mse/mouse-event?) - (rx/filter mse/mouse-up-event?)) - + (let [stopper (mse/drag-stopper stream) group (gsh/shapes->rect shapes) group-center (grc/rect->center group) initial-angle (gpt/angle @ms/mouse-position group-center) @@ -436,10 +431,7 @@ (watch [_ state stream] (let [initial (deref ms/mouse-position) - stopper (->> stream - (rx/filter mse/mouse-event?) - (rx/filter mse/mouse-up-event?)) - + stopper (mse/drag-stopper stream) zoom (get-in state [:workspace-local :zoom] 1) ;; We toggle the selection so we don't have to wait for the event @@ -518,10 +510,7 @@ duplicate-move-started? (get-in state [:workspace-local :duplicate-move-started?] false) - stopper (->> stream - (rx/filter mse/mouse-event?) - (rx/filter mse/mouse-up-event?)) - + stopper (mse/drag-stopper stream) layout (get state :workspace-layout) zoom (get-in state [:workspace-local :zoom] 1) focus (:workspace-focus-selected state) diff --git a/frontend/src/app/main/ui/workspace/viewport/hooks.cljs b/frontend/src/app/main/ui/workspace/viewport/hooks.cljs index 1a8c45567..c2d4ab55b 100644 --- a/frontend/src/app/main/ui/workspace/viewport/hooks.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/hooks.cljs @@ -32,6 +32,7 @@ [app.util.dom :as dom] [app.util.globals :as globals] [app.util.keyboard :as kbd] + [app.util.mouse :as mse] [beicon.v2.core :as rx] [beicon.v2.operators :as rxo] [goog.events :as events] @@ -42,7 +43,8 @@ (let [on-key-down (actions/on-key-down) on-key-up (actions/on-key-up) on-mouse-wheel (actions/on-mouse-wheel zoom) - on-paste (actions/on-paste disable-paste in-viewport? workspace-read-only?)] + on-paste (actions/on-paste disable-paste in-viewport? workspace-read-only?) + on-blur (mf/use-fn #(st/emit! (mse/->BlurEvent)))] (mf/use-layout-effect (mf/deps on-key-down on-key-up on-mouse-wheel on-paste workspace-read-only?) @@ -52,7 +54,8 @@ ;; bind with passive=false to allow the event to be cancelled ;; https://stackoverflow.com/a/57582286/3219895 (events/listen js/window EventType.WHEEL on-mouse-wheel #js {:passive false}) - (events/listen js/window EventType.PASTE on-paste)]] + (events/listen js/window EventType.PASTE on-paste) + (events/listen js/window EventType.BLUR on-blur)]] (fn [] (doseq [key keys] (events/unlistenByKey key)))))))) diff --git a/frontend/src/app/util/mouse.cljs b/frontend/src/app/util/mouse.cljs index b7771eba2..4576ed325 100644 --- a/frontend/src/app/util/mouse.cljs +++ b/frontend/src/app/util/mouse.cljs @@ -4,11 +4,14 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns app.util.mouse) +(ns app.util.mouse + (:require + [beicon.v2.core :as rx])) (defrecord MouseEvent [type ctrl shift alt meta]) (defrecord PointerEvent [source pt ctrl shift alt meta]) (defrecord ScrollEvent [point]) +(defrecord BlurEvent []) (defn mouse-event? [v] @@ -22,6 +25,10 @@ [v] (instance? ScrollEvent v)) +(defn blur-event? + [v] + (instance? BlurEvent v)) + (defn mouse-down-event? [^MouseEvent v] (= :down (.-type v))) @@ -61,3 +68,16 @@ (defn get-pointer-shift-mod [^PointerEvent ev] (.-shift ev)) + +(defn drag-stopper + "Creates a stream to stop drag events. Takes into account the mouse and also + if the window loses focus or the esc key is pressed." + [stream] + (rx/merge + (->> stream + (rx/filter blur-event?)) + (->> stream + (rx/filter mouse-event?) + (rx/filter mouse-up-event?)) + (->> stream + (rx/filter #(= % :interrupt))))) -- Gitee From b097f73b135e937ace9b4e7b24148cc5b6515f74 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Fri, 15 Mar 2024 14:18:17 +0100 Subject: [PATCH 0066/1266] :bug: Fix problem with snap to frame guides --- frontend/src/app/worker/snaps.cljs | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/app/worker/snaps.cljs b/frontend/src/app/worker/snaps.cljs index ceecc5b89..77bf5d8f5 100644 --- a/frontend/src/app/worker/snaps.cljs +++ b/frontend/src/app/worker/snaps.cljs @@ -29,6 +29,7 @@ (let [match-bounds? (fn [[_ data]] (some #(or (= :guide (:type %)) + (= :layout (:type %)) (grc/contains-point? bounds (:pt %))) data))] (->> (into [] (comp (mapcat #(sd/query @state page-id frame-id axis %)) -- Gitee From 8850fd88948ce7aa622ee6bd707adbd740abfa10 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Fri, 15 Mar 2024 14:52:38 +0100 Subject: [PATCH 0067/1266] :bug: Fix problem dragging in draft/projects screen --- frontend/src/app/main/ui/dashboard/grid.cljs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/main/ui/dashboard/grid.cljs b/frontend/src/app/main/ui/dashboard/grid.cljs index 6f5565611..276fa7ce4 100644 --- a/frontend/src/app/main/ui/dashboard/grid.cljs +++ b/frontend/src/app/main/ui/dashboard/grid.cljs @@ -419,8 +419,9 @@ on-drag-enter (mf/use-fn (fn [e] - (when (or (dnd/has-type? e "Files") - (dnd/has-type? e "application/x-moz-file")) + (when (and (not (dnd/has-type? e "penpot/files")) + (or (dnd/has-type? e "Files") + (dnd/has-type? e "application/x-moz-file"))) (dom/prevent-default e) (reset! dragging? true)))) @@ -440,8 +441,9 @@ on-drop (mf/use-fn (fn [e] - (when (or (dnd/has-type? e "Files") - (dnd/has-type? e "application/x-moz-file")) + (when (and (not (dnd/has-type? e "penpot/files")) + (or (dnd/has-type? e "Files") + (dnd/has-type? e "application/x-moz-file"))) (dom/prevent-default e) (reset! dragging? false) (import-files (.-files (.-dataTransfer e))))))] -- Gitee From db7ed75a91cedf12009d9b634c905fa2421d4e3c Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Fri, 15 Mar 2024 15:02:29 +0100 Subject: [PATCH 0068/1266] :bug: Add mime-type otf to color picker --- common/src/app/common/media.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/app/common/media.cljc b/common/src/app/common/media.cljc index 212d43f2a..a342a227f 100644 --- a/common/src/app/common/media.cljc +++ b/common/src/app/common/media.cljc @@ -10,7 +10,7 @@ [cuerdas.core :as str])) ;; We have added ".ttf" as string to solve a problem with chrome input selector -(def valid-font-types #{"font/ttf", ".ttf", "font/woff", "application/font-woff", "font/otf"}) +(def valid-font-types #{"font/ttf" ".ttf" "font/woff", "application/font-woff" "woff" "font/otf" ".otf" "font/opentype"}) (def valid-image-types #{"image/jpeg", "image/png", "image/webp", "image/gif", "image/svg+xml"}) (def str-image-types (str/join "," valid-image-types)) (def str-font-types (str/join "," valid-font-types)) -- Gitee From dd69762b311b6c4d3e918966f6f7d491da7a68e1 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Fri, 15 Mar 2024 15:13:57 +0100 Subject: [PATCH 0069/1266] :bug: Fix problem with dismiss fonts --- frontend/src/app/main/ui/dashboard/fonts.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/dashboard/fonts.cljs b/frontend/src/app/main/ui/dashboard/fonts.cljs index 17aa4a8d4..be6cd908f 100644 --- a/frontend/src/app/main/ui/dashboard/fonts.cljs +++ b/frontend/src/app/main/ui/dashboard/fonts.cljs @@ -161,7 +161,7 @@ (mf/use-fn (mf/deps fonts) (fn [_] - (run! on-delete (vals fonts))))] + (run! #(swap! fonts* dissoc (:id %)) (vals fonts))))] [:div {:class (stl/css :dashboard-fonts-upload)} [:div {:class (stl/css :dashboard-fonts-hero)} -- Gitee From dc7d279e9dd803cd580270e66caa2ac298c59eb4 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Fri, 15 Mar 2024 15:33:51 +0100 Subject: [PATCH 0070/1266] :bug: Fix problem with interactions over frames --- frontend/src/app/main/ui/viewer/shapes.cljs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/frontend/src/app/main/ui/viewer/shapes.cljs b/frontend/src/app/main/ui/viewer/shapes.cljs index 6a739d320..5832f28ce 100644 --- a/frontend/src/app/main/ui/viewer/shapes.cljs +++ b/frontend/src/app/main/ui/viewer/shapes.cljs @@ -265,8 +265,7 @@ (mf/defc interaction [{:keys [shape interactions interactions-show?]}] - (let [{:keys [x y width height]} (:selrect shape) - frame? (= :frame (:type shape))] + (let [{:keys [x y width height]} (:selrect shape)] (when-not (empty? interactions) [:rect {:x (- x 1) :y (- y 1) @@ -276,7 +275,6 @@ :stroke "var(--color-accent-tertiary)" :stroke-width (if interactions-show? 1 0) :fill-opacity (if interactions-show? 0.2 0) - :style {:pointer-events (when frame? "none")} :transform (gsh/transform-str shape)}]))) -- Gitee From 8e7471509cb4c267e23d15089bd70f8e074ede63 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Fri, 15 Mar 2024 15:54:40 +0100 Subject: [PATCH 0071/1266] :bug: Fix problem on modal transfer owner --- frontend/src/app/main/ui/dashboard/change_owner.cljs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/main/ui/dashboard/change_owner.cljs b/frontend/src/app/main/ui/dashboard/change_owner.cljs index 0af37045d..b3a8e04d2 100644 --- a/frontend/src/app/main/ui/dashboard/change_owner.cljs +++ b/frontend/src/app/main/ui/dashboard/change_owner.cljs @@ -29,10 +29,13 @@ members-map (mf/deref refs/dashboard-team-members) members (vals members-map) - options (into [{:value "" - :label (tr "modals.leave-and-reassign.select-member-to-promote")}] - (filter #(not= (:label %) (:fullname profile)) - (map #(hash-map :label (:name %) :value (str (:id %))) members))) + options + (into [{:value "" + :label (tr "modals.leave-and-reassign.select-member-to-promote")}] + (comp + (filter #(not= (:email %) (:email profile))) + (map #(hash-map :label (:name %) :value (str (:id %))))) + members) on-cancel #(st/emit! (modal/hide)) on-accept -- Gitee From cdab615cbb3f6b90d5c60ec6de90cdc7127a304e Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Thu, 14 Mar 2024 14:12:58 +0100 Subject: [PATCH 0072/1266] :bug: Fix copies of snap to grid and show hide grid --- .../src/app/main/data/workspace/layout.cljs | 13 +-- .../app/main/data/workspace/shortcuts.cljs | 100 +++++++++--------- frontend/src/app/main/snap.cljs | 6 +- frontend/src/app/main/ui/dashboard.scss | 1 + .../src/app/main/ui/workspace/main_menu.cljs | 36 +++---- .../main/ui/workspace/sidebar/shortcuts.cljs | 6 +- .../src/app/main/ui/workspace/viewport.cljs | 4 +- frontend/translations/ar.po | 22 ---- frontend/translations/ca.po | 25 ----- frontend/translations/cs.po | 25 ----- frontend/translations/de.po | 25 ----- frontend/translations/el.po | 16 --- frontend/translations/en.po | 38 +++---- frontend/translations/es.po | 36 +++---- frontend/translations/eu.po | 28 ----- frontend/translations/fa.po | 4 - frontend/translations/fr.po | 25 ----- frontend/translations/ha.po | 25 ----- frontend/translations/he.po | 25 ----- frontend/translations/hr.po | 29 ----- frontend/translations/id.po | 25 ----- frontend/translations/lv.po | 25 ----- frontend/translations/nb_NO.po | 8 -- frontend/translations/nl.po | 25 ----- frontend/translations/pl.po | 25 ----- frontend/translations/pt_BR.po | 25 ----- frontend/translations/pt_PT.po | 25 ----- frontend/translations/ro.po | 25 ----- frontend/translations/ru.po | 19 ---- frontend/translations/tr.po | 25 ----- frontend/translations/zh_CN.po | 25 ----- frontend/translations/zh_Hant.po | 3 - 32 files changed, 121 insertions(+), 623 deletions(-) diff --git a/frontend/src/app/main/data/workspace/layout.cljs b/frontend/src/app/main/data/workspace/layout.cljs index 24cfc6779..66eb0605a 100644 --- a/frontend/src/app/main/data/workspace/layout.cljs +++ b/frontend/src/app/main/data/workspace/layout.cljs @@ -23,12 +23,12 @@ :colorpalette :element-options :rulers - :display-grid - :snap-grid + :display-guides + :snap-guides :scale-text :dynamic-alignment :display-artboard-names - :snap-guides + :snap-ruler-guides :show-pixel-grid :snap-pixel-grid}) @@ -53,11 +53,11 @@ :layers :element-options :rulers - :display-grid - :snap-grid + :display-guides + :snap-guides :dynamic-alignment :display-artboard-names - :snap-guides + :snap-ruler-guides :show-pixel-grid :snap-pixel-grid}) @@ -89,6 +89,7 @@ (update [_ state] (update state :workspace-layout (fn [flags] + (prn flags) (if force? (conj flags flag) (if (contains? flags flag) diff --git a/frontend/src/app/main/data/workspace/shortcuts.cljs b/frontend/src/app/main/data/workspace/shortcuts.cljs index 66ad43b6e..b8d10264d 100644 --- a/frontend/src/app/main/data/workspace/shortcuts.cljs +++ b/frontend/src/app/main/data/workspace/shortcuts.cljs @@ -364,19 +364,12 @@ :subsections [:main-menu] :fn #(st/emit! (dw/select-all))} - :toggle-grid {:tooltip (ds/meta "'") + :toggle-guides {:tooltip (ds/meta "'") ;;https://github.com/ccampbell/mousetrap/issues/85 :command [(ds/c-mod "'") (ds/c-mod "219")] :show-command (ds/c-mod "'") :subsections [:main-menu] - :fn #(st/emit! (toggle-layout-flag :display-grid))} - - :toggle-snap-grid {:tooltip (ds/meta-shift "'") - ;;https://github.com/ccampbell/mousetrap/issues/85 - :command [(ds/c-mod "shift+'") (ds/c-mod "shift+219")] - :show-command (ds/c-mod "shift+'") - :subsections [:main-menu] - :fn #(st/emit! (toggle-layout-flag :snap-grid))} + :fn #(st/emit! (toggle-layout-flag :display-guides))} :toggle-alignment {:tooltip (ds/meta "\\") :command (ds/c-mod "\\") @@ -404,10 +397,17 @@ :fn #(st/emit! (de/show-workspace-export-dialog))} - :toggle-snap-guide {:tooltip (ds/meta-shift "G") - :command (ds/c-mod "shift+g") - :subsections [:main-menu] - :fn #(st/emit! (toggle-layout-flag :snap-guides))} + :toggle-snap-ruler-guide {:tooltip (ds/meta-shift "G") + :command (ds/c-mod "shift+g") + :subsections [:main-menu] + :fn #(st/emit! (toggle-layout-flag :snap-ruler-guides))} + + :toggle-snap-guides {:tooltip (ds/meta-shift "'") + ;;https://github.com/ccampbell/mousetrap/issues/85 + :command [(ds/c-mod "shift+'") (ds/c-mod "shift+219")] + :show-command (ds/c-mod "shift+'") + :subsections [:main-menu] + :fn #(st/emit! (toggle-layout-flag :snap-guides))} :show-shortcuts {:tooltip "?" :command "?" @@ -416,34 +416,34 @@ ;; PANELS - :toggle-layers {:tooltip (ds/alt "L") - :command (ds/a-mod "l") - :subsections [:panels] - :fn #(st/emit! (dw/go-to-layout :layers))} - - :toggle-assets {:tooltip (ds/alt "I") - :command (ds/a-mod "i") - :subsections [:panels] - :fn #(st/emit! (dw/go-to-layout :assets))} - - :toggle-history {:tooltip (ds/alt "H") - :command (ds/a-mod "h") - :subsections [:panels] - :fn #(emit-when-no-readonly (dw/go-to-layout :document-history))} - - :toggle-colorpalette {:tooltip (ds/alt "P") - :command (ds/a-mod "p") - :subsections [:panels] - :fn #(do (r/set-resize-type! :bottom) - (emit-when-no-readonly (dw/remove-layout-flag :textpalette) - (toggle-layout-flag :colorpalette)))} - - :toggle-textpalette {:tooltip (ds/alt "T") - :command (ds/a-mod "t") - :subsections [:panels] - :fn #(do (r/set-resize-type! :bottom) - (emit-when-no-readonly (dw/remove-layout-flag :colorpalette) - (toggle-layout-flag :textpalette)))} + :toggle-layers {:tooltip (ds/alt "L") + :command (ds/a-mod "l") + :subsections [:panels] + :fn #(st/emit! (dw/go-to-layout :layers))} + + :toggle-assets {:tooltip (ds/alt "I") + :command (ds/a-mod "i") + :subsections [:panels] + :fn #(st/emit! (dw/go-to-layout :assets))} + + :toggle-history {:tooltip (ds/alt "H") + :command (ds/a-mod "h") + :subsections [:panels] + :fn #(emit-when-no-readonly (dw/go-to-layout :document-history))} + + :toggle-colorpalette {:tooltip (ds/alt "P") + :command (ds/a-mod "p") + :subsections [:panels] + :fn #(do (r/set-resize-type! :bottom) + (emit-when-no-readonly (dw/remove-layout-flag :textpalette) + (toggle-layout-flag :colorpalette)))} + + :toggle-textpalette {:tooltip (ds/alt "T") + :command (ds/a-mod "t") + :subsections [:panels] + :fn #(do (r/set-resize-type! :bottom) + (emit-when-no-readonly (dw/remove-layout-flag :colorpalette) + (toggle-layout-flag :textpalette)))} :hide-ui {:tooltip "\\" :command "\\" @@ -482,10 +482,10 @@ :subsections [:zoom-workspace] :fn identity} - :zoom-lense-decrease {:tooltip (ds/alt "Z") - :command "alt+z" - :subsections [:zoom-workspace] - :fn identity} + :zoom-lense-decrease {:tooltip (ds/alt "Z") + :command "alt+z" + :subsections [:zoom-workspace] + :fn identity} ;; NAVIGATION @@ -553,11 +553,11 @@ :fn #(emit-when-no-readonly (dp/open-preview-selected))} ;; THEME - :toggle-theme {:tooltip (ds/alt "M") - :command (ds/a-mod "m") - :subsections [:basics] - :fn #(st/emit! (with-meta (du/toggle-theme) - {::ev/origin "workspace:shortcut"}))}}) + :toggle-theme {:tooltip (ds/alt "M") + :command (ds/a-mod "m") + :subsections [:basics] + :fn #(st/emit! (with-meta (du/toggle-theme) + {::ev/origin "workspace:shortcut"}))}}) (def opacity-shortcuts (into {} (->> diff --git a/frontend/src/app/main/snap.cljs b/frontend/src/app/main/snap.cljs index 5e8f14431..d5ec5a6cf 100644 --- a/frontend/src/app/main/snap.cljs +++ b/frontend/src/app/main/snap.cljs @@ -40,14 +40,14 @@ (fn [{:keys [type id frame-id]}] (cond (= type :layout) - (or (not (contains? layout :display-grid)) - (not (contains? layout :snap-grid)) + (or (not (contains? layout :display-guides)) + (not (contains? layout :snap-guides)) (and (d/not-empty? focus) (not (contains? focus id)))) (= type :guide) (or (not (contains? layout :rulers)) - (not (contains? layout :snap-guides)) + (not (contains? layout :snap-ruler-guides)) (and (d/not-empty? focus) (not (contains? focus frame-id)))) diff --git a/frontend/src/app/main/ui/dashboard.scss b/frontend/src/app/main/ui/dashboard.scss index ed79f5362..96db3bf55 100644 --- a/frontend/src/app/main/ui/dashboard.scss +++ b/frontend/src/app/main/ui/dashboard.scss @@ -7,6 +7,7 @@ @use "refactor/common-refactor.scss" as *; .dashboard { + @extend .new-scrollbar; background-color: var(--app-background); display: grid; grid-template-columns: $s-40 $s-256 1fr; diff --git a/frontend/src/app/main/ui/workspace/main_menu.cljs b/frontend/src/app/main/ui/workspace/main_menu.cljs index 9c6c83418..d144706c3 100644 --- a/frontend/src/app/main/ui/workspace/main_menu.cljs +++ b/frontend/src/app/main/ui/workspace/main_menu.cljs @@ -192,15 +192,15 @@ :on-key-down (fn [event] (when (kbd/enter? event) (toggle-flag event))) - :data-test "snap-guides" - :id "file-menu-snap-guides"} + :data-test "snap-ruler-guides" + :id "file-menu-snap-ruler-guides"} [:span {:class (stl/css :item-name)} - (if (contains? layout :snap-guides) - (tr "workspace.header.menu.disable-snap-guides") - (tr "workspace.header.menu.enable-snap-guides"))] + (if (contains? layout :snap-ruler-guides) + (tr "workspace.header.menu.disable-snap-ruler-guides") + (tr "workspace.header.menu.enable-snap-ruler-guides"))] [:span {:class (stl/css :shortcut)} - (for [sc (scd/split-sc (sc/get-tooltip :toggle-snap-guide))] + (for [sc (scd/split-sc (sc/get-tooltip :toggle-snap-ruler-guide))] [:span {:class (stl/css :shortcut-key) :key sc} sc])]] [:> dropdown-menu-item* {:on-click toggle-flag @@ -208,14 +208,14 @@ :on-key-down (fn [event] (when (kbd/enter? event) (toggle-flag event))) - :data-test "snap-grid" - :id "file-menu-snap-grid"} + :data-test "snap-guides" + :id "file-menu-snap-guides"} [:span {:class (stl/css :item-name)} - (if (contains? layout :snap-grid) - (tr "workspace.header.menu.disable-snap-grid") - (tr "workspace.header.menu.enable-snap-grid"))] + (if (contains? layout :snap-guides) + (tr "workspace.header.menu.disable-snap-guides") + (tr "workspace.header.menu.enable-snap-guides"))] [:span {:class (stl/css :shortcut)} - (for [sc (scd/split-sc (sc/get-tooltip :toggle-snap-grid))] + (for [sc (scd/split-sc (sc/get-tooltip :toggle-snap-guides))] [:span {:class (stl/css :shortcut-key) :key sc} sc])]] [:> dropdown-menu-item* {:on-click toggle-flag @@ -321,14 +321,14 @@ :on-key-down (fn [event] (when (kbd/enter? event) (toggle-flag event))) - :data-test "display-grid" - :id "file-menu-grid"} + :data-test "display-guides" + :id "file-menu-guides"} [:span {:class (stl/css :item-name)} - (if (contains? layout :display-grid) - (tr "workspace.header.menu.hide-grid") - (tr "workspace.header.menu.show-grid"))] + (if (contains? layout :display-guides) + (tr "workspace.header.menu.hide-guides") + (tr "workspace.header.menu.show-guides"))] [:span {:class (stl/css :shortcut)} - (for [sc (scd/split-sc (sc/get-tooltip :toggle-grid))] + (for [sc (scd/split-sc (sc/get-tooltip :toggle-guides))] [:span {:class (stl/css :shortcut-key) :key sc} sc])]] diff --git a/frontend/src/app/main/ui/workspace/sidebar/shortcuts.cljs b/frontend/src/app/main/ui/workspace/sidebar/shortcuts.cljs index f9499f91e..4fde27d0c 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/shortcuts.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/shortcuts.cljs @@ -171,15 +171,15 @@ ;; shortcuts.toggle-assets ;; shortcuts.toggle-colorpalette ;; shortcuts.toggle-focus-mode - ;; shortcuts.toggle-grid + ;; shortcuts.toggle-guides ;; shortcuts.toggle-history ;; shortcuts.toggle-layers ;; shortcuts.toggle-lock ;; shortcuts.toggle-lock-size ;; shortcuts.toggle-rules ;; shortcuts.scale - ;; shortcuts.toggle-snap-grid - ;; shortcuts.toggle-snap-guide + ;; shortcuts.toggle-snap-guides + ;; shortcuts.toggle-snap-ruler-guide ;; shortcuts.toggle-textpalette ;; shortcuts.toggle-visibility ;; shortcuts.toggle-zoom-style diff --git a/frontend/src/app/main/ui/workspace/viewport.cljs b/frontend/src/app/main/ui/workspace/viewport.cljs index 0894f0b84..2a808e627 100644 --- a/frontend/src/app/main/ui/workspace/viewport.cljs +++ b/frontend/src/app/main/ui/workspace/viewport.cljs @@ -200,7 +200,7 @@ show-cursor-tooltip? tooltip show-draw-area? drawing-obj show-gradient-handlers? (= (count selected) 1) - show-grids? (contains? layout :display-grid) + show-grids? (contains? layout :display-guides) show-frame-outline? (= transform :move) show-outlines? (and (nil? transform) @@ -223,7 +223,7 @@ (= transform :move) (seq selected)) show-snap-points? (and (or (contains? layout :dynamic-alignment) - (contains? layout :snap-grid)) + (contains? layout :snap-guides)) (or drawing-obj transform)) show-selrect? (and selrect (empty? drawing) (not text-editing?)) show-measures? (and (not transform) diff --git a/frontend/translations/ar.po b/frontend/translations/ar.po index b455dde95..9bc152ac5 100644 --- a/frontend/translations/ar.po +++ b/frontend/translations/ar.po @@ -2534,10 +2534,6 @@ msgstr "إبطال المحاذاة الدينماكية" msgid "workspace.header.menu.disable-scale-text" msgstr "إبطال المقياس النسبي" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "إبطال الفرقعة للتشبيك" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-dynamic-alignment" msgstr "تككين المحاذاة الدينماكية" @@ -2546,14 +2542,6 @@ msgstr "تككين المحاذاة الدينماكية" msgid "workspace.header.menu.enable-scale-text" msgstr "تمكين نص المقياس" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "الفرقعة للتشبيك" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-grid" -msgstr "إخفاء التشبيك" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "إخفاء لون اللوحة" @@ -2566,10 +2554,6 @@ msgstr "إخفاء المسطرات" msgid "workspace.header.menu.select-all" msgstr "حدد الجميع" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "أظهر التشبيك" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "أظهر لون اللوحة" @@ -3742,9 +3726,6 @@ msgstr "أصل الرسومات" msgid "workspace.options.layout.packed" msgstr "معباة" -msgid "shortcuts.toggle-snap-guide" -msgstr "تبديل الفرقعة للمرشد" - msgid "workspace.header.menu.enable-snap-pixel-grid" msgstr "تمكين الفرقعة للبكسل" @@ -4198,9 +4179,6 @@ msgstr "أقصى ارتفاع" msgid "workspace.shape.menu.restore-main" msgstr "استعادة العنصر الرئيسي" -msgid "shortcuts.toggle-snap-grid" -msgstr "تبديل الفرقعة للتشبيك" - #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs msgid "workspace.options.layer-options.blend-mode.saturation" msgstr "التشبع" diff --git a/frontend/translations/ca.po b/frontend/translations/ca.po index a71c294e8..b75496da4 100644 --- a/frontend/translations/ca.po +++ b/frontend/translations/ca.po @@ -2242,9 +2242,6 @@ msgstr "Activa/desactiva el mode de concentració" msgid "shortcuts.toggle-fullscreen" msgstr "Activa/desactiva la pantalla completa" -msgid "shortcuts.toggle-grid" -msgstr "Mostra/Amaga la graella" - msgid "shortcuts.toggle-history" msgstr "Mostra/Amaga l'historial" @@ -2260,12 +2257,6 @@ msgstr "Bloqueja les proporcions" msgid "shortcuts.toggle-rules" msgstr "Mostra/Amaga les regles" -msgid "shortcuts.toggle-snap-grid" -msgstr "Ajusta a la graella" - -msgid "shortcuts.toggle-snap-guide" -msgstr "Ajusta a les guies" - msgid "shortcuts.toggle-textpalette" msgstr "Mostra/amaga la paleta de text" @@ -2594,10 +2585,6 @@ msgstr "Desactiva l'alineació dinàmica" msgid "workspace.header.menu.disable-scale-text" msgstr "Desactiva l'escalat del text" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "No ajustis a la quadrícula" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-snap-guides" msgstr "No ajustis a les guies" @@ -2613,10 +2600,6 @@ msgstr "Activa l'alineació dinàmica" msgid "workspace.header.menu.enable-scale-text" msgstr "Activa l'escalat del text" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "Ajusta a la quadrícula" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-guides" msgstr "Ajusta a les guies" @@ -2628,10 +2611,6 @@ msgstr "Ajusta als píxels" msgid "workspace.header.menu.hide-artboard-names" msgstr "Amaga els noms dels taulers" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-grid" -msgstr "Amaga la quadrícula" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "Amaga la paleta de colors" @@ -2675,10 +2654,6 @@ msgstr "Selecciona-ho tot" msgid "workspace.header.menu.show-artboard-names" msgstr "Mostra els noms dels taulers" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "Mostra la quadrícula" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Mostra la paleta de colors" diff --git a/frontend/translations/cs.po b/frontend/translations/cs.po index 8fd299f42..b2f2225f4 100644 --- a/frontend/translations/cs.po +++ b/frontend/translations/cs.po @@ -2556,9 +2556,6 @@ msgstr "Přepnout režim soustředění" msgid "shortcuts.toggle-fullscreen" msgstr "Přepnout zobrazení na celou obrazovku" -msgid "shortcuts.toggle-grid" -msgstr "Zobrazit/skrýt mřížku" - msgid "shortcuts.toggle-history" msgstr "Přepnout historii" @@ -2577,12 +2574,6 @@ msgstr "Uzamknout proporce" msgid "shortcuts.toggle-rules" msgstr "Zobrazit/skrýt pravítka" -msgid "shortcuts.toggle-snap-grid" -msgstr "Přichytit k mřížce" - -msgid "shortcuts.toggle-snap-guide" -msgstr "Přichytit k vodicím lištám" - msgid "shortcuts.toggle-textpalette" msgstr "Přepnout paletu textu" @@ -2940,10 +2931,6 @@ msgstr "Zakázat proporcionální měřítko" msgid "workspace.header.menu.disable-scale-text" msgstr "Zakázat měřítko textu" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "Zakázat přichycení k mřížce" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-snap-guides" msgstr "Zakázat přichycení k vodicím lištám" @@ -2962,10 +2949,6 @@ msgstr "Povolit proporcionální měřítko" msgid "workspace.header.menu.enable-scale-text" msgstr "Povolit měřítko textu" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "Přichytit k mřížce" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-guides" msgstr "Přichytit k vodicím lištám" @@ -2977,10 +2960,6 @@ msgstr "Povolit přichycení k pixelu" msgid "workspace.header.menu.hide-artboard-names" msgstr "Skrýt názvy tabulí" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-grid" -msgstr "Skrýt mřížky" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "Skrýt paletu barev" @@ -3027,10 +3006,6 @@ msgstr "Vybrat vše" msgid "workspace.header.menu.show-artboard-names" msgstr "Zobrazit názvy tabulí" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "Zobrazit mřížku" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Zobrazit paletu barev" diff --git a/frontend/translations/de.po b/frontend/translations/de.po index 3a5d167b0..fe563da32 100644 --- a/frontend/translations/de.po +++ b/frontend/translations/de.po @@ -2777,9 +2777,6 @@ msgstr "Fokusmodus umschalten" msgid "shortcuts.toggle-fullscreen" msgstr "Vollbild aktivieren/deaktivieren" -msgid "shortcuts.toggle-grid" -msgstr "Raster ein-/ausblenden" - msgid "shortcuts.toggle-history" msgstr "Verlauf ein-/ausblenden" @@ -2798,12 +2795,6 @@ msgstr "Seitenverhältnis sperren/entsperren" msgid "shortcuts.toggle-rules" msgstr "Lineale ein-/ausblenden" -msgid "shortcuts.toggle-snap-grid" -msgstr "Am Raster ausrichten" - -msgid "shortcuts.toggle-snap-guide" -msgstr "An Hilfslinien ausrichten" - msgid "shortcuts.toggle-textpalette" msgstr "Textpalette ein-/ausblenden" @@ -3173,10 +3164,6 @@ msgstr "Proportionale Skalierung deaktivieren" msgid "workspace.header.menu.disable-scale-text" msgstr "Textskalierung deaktivieren" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "Am Raster ausrichten deaktivieren" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-snap-guides" msgstr "Ausrichten an Hilfslinien deaktivieren" @@ -3195,10 +3182,6 @@ msgstr "Proportionale Skalierung aktivieren" msgid "workspace.header.menu.enable-scale-text" msgstr "Textskalierung aktivieren" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "Am Raster ausrichten" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-guides" msgstr "An Hilfslinien ausrichten" @@ -3210,10 +3193,6 @@ msgstr "Ausrichten am Pixel aktivieren" msgid "workspace.header.menu.hide-artboard-names" msgstr "Namen von Zeichenflächen ausblenden" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-grid" -msgstr "Raster ausblenden" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "Farbpalette ausblenden" @@ -3260,10 +3239,6 @@ msgstr "Alles auswählen" msgid "workspace.header.menu.show-artboard-names" msgstr "Namen der Zeichenflächen anzeigen" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "Raster einblenden" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Farbpalette einblenden" diff --git a/frontend/translations/el.po b/frontend/translations/el.po index d8c1acc11..cc62a2301 100644 --- a/frontend/translations/el.po +++ b/frontend/translations/el.po @@ -1348,22 +1348,10 @@ msgstr "Ακτινική κλίση" msgid "workspace.header.menu.disable-dynamic-alignment" msgstr "Απενεργοποίηση δυναμικής ευθυγράμμισης" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "Απενεργοποιήστε τη σύνδεση στο πλέγμα" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-dynamic-alignment" msgstr "Ενεργοποίηση δυναμικής ευθυγράμμισης" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "Σύνδεση στο πλέγμα" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-grid" -msgstr "Απόκρυψη πλεγμάτων" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "Απόκρυψη παλέτας χρωμάτων" @@ -1376,10 +1364,6 @@ msgstr "Απόκρυψη κανόνες" msgid "workspace.header.menu.select-all" msgstr "Επιλογή όλων" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "Εμφάνιση πλέγματος" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Εμφάνιση παλέτας χρωμάτων" diff --git a/frontend/translations/en.po b/frontend/translations/en.po index a894c3360..fa989a0c7 100644 --- a/frontend/translations/en.po +++ b/frontend/translations/en.po @@ -2949,8 +2949,8 @@ msgstr "Toggle focus mode" msgid "shortcuts.toggle-fullscreen" msgstr "Toggle fullscreen" -msgid "shortcuts.toggle-grid" -msgstr "Show / Hide grid" +msgid "shortcuts.toggle-guides" +msgstr "Show / Hide guides" msgid "shortcuts.toggle-history" msgstr "Toggle history" @@ -2967,18 +2967,18 @@ msgstr "Lock / Unlock" msgid "shortcuts.toggle-lock-size" msgstr "Lock proportions" -msgid "shortcuts.toggle-rules" +msgid "shortcuts.toggle-rulers" msgstr "Show / Hide rulers" msgid "shortcuts.scale" msgstr "Scale" -msgid "shortcuts.toggle-snap-grid" -msgstr "Snap to grid" - -msgid "shortcuts.toggle-snap-guide" +msgid "shortcuts.toggle-snap-guides" msgstr "Snap to guides" +msgid "shortcuts.toggle-snap-ruler-guide" +msgstr "Snap to ruler guides" + msgid "shortcuts.toggle-textpalette" msgstr "Toggle text palette" @@ -3339,14 +3339,14 @@ msgstr "Disable proportional scale" msgid "workspace.header.menu.disable-scale-text" msgstr "Disable scale text" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "Disable snap to grid" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-snap-guides" msgstr "Disable snap to guides" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-ruler-guides" +msgstr "Disable snap to ruler guides" + msgid "workspace.header.menu.disable-snap-pixel-grid" msgstr "Disable snap to pixel" @@ -3361,14 +3361,14 @@ msgstr "Enable proportional scale" msgid "workspace.header.menu.enable-scale-text" msgstr "Enable scale text" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "Snap to grid" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-guides" msgstr "Snap to guides" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-ruler-guides" +msgstr "Snap to ruler guides" + msgid "workspace.header.menu.enable-snap-pixel-grid" msgstr "Enable snap to pixel" @@ -3377,8 +3377,8 @@ msgid "workspace.header.menu.hide-artboard-names" msgstr "Hide board names" #: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-grid" -msgstr "Hide grids" +msgid "workspace.header.menu.hide-guides" +msgstr "Hide guides" #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" @@ -3427,8 +3427,8 @@ msgid "workspace.header.menu.show-artboard-names" msgstr "Show boards names" #: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "Show grid" +msgid "workspace.header.menu.show-guides" +msgstr "Show guides" #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" diff --git a/frontend/translations/es.po b/frontend/translations/es.po index 8d9831183..73140e72c 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -2995,8 +2995,8 @@ msgstr "Mostrar/ocultar focus mode" msgid "shortcuts.toggle-fullscreen" msgstr "Activar/desactivar pantalla completa" -msgid "shortcuts.toggle-grid" -msgstr "Mostrar/ocultar rejilla" +msgid "shortcuts.toggle-guides" +msgstr "Mostrar/ocultar guías" msgid "shortcuts.toggle-history" msgstr "Mostrar/ocultar histórico" @@ -3013,17 +3013,17 @@ msgstr "Bloquear/Desbloquear" msgid "shortcuts.toggle-lock-size" msgstr "Bloquear/Desbloquear proporciones" -msgid "shortcuts.toggle-rules" +msgid "shortcuts.toggle-rulers" msgstr "Mostrar/ocultar reglas" msgid "shortcuts.scale" msgstr "Escalado" -msgid "shortcuts.toggle-snap-grid" -msgstr "Alinear a la rejilla" +msgid "shortcuts.toggle-snap-guides" +msgstr "Alinear a las guías" -msgid "shortcuts.toggle-snap-guide" -msgstr "Alinear a las guias" +msgid "shortcuts.toggle-snap-ruler-guide" +msgstr "Alinear a las guías de reglas" msgid "shortcuts.toggle-textpalette" msgstr "Mostrar/ocultar paleta de textos" @@ -3401,14 +3401,14 @@ msgstr "Desactivar escala proporcional" msgid "workspace.header.menu.disable-scale-text" msgstr "Desactivar escalar texto" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "Desactivar alinear a la rejilla" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-snap-guides" msgstr "Desactivar alinear a las guias" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-ruler-guides" +msgstr "Desactivar alinear a las guias de reglas" + msgid "workspace.header.menu.disable-snap-pixel-grid" msgstr "Desactivar ajuste al pixel" @@ -3423,14 +3423,14 @@ msgstr "Activar escala proporcional" msgid "workspace.header.menu.enable-scale-text" msgstr "Activar escalar texto" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "Alinear a la rejilla" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-guides" msgstr "Alinear a las guias" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-ruler-guides" +msgstr "Alinear a las guias de reglas" + msgid "workspace.header.menu.enable-snap-pixel-grid" msgstr "Activar ajuste al pixel" @@ -3439,8 +3439,8 @@ msgid "workspace.header.menu.hide-artboard-names" msgstr "Ocultar nombres de tableros" #: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-grid" -msgstr "Ocultar rejillas" +msgid "workspace.header.menu.hide-guides" +msgstr "Ocultar guías" #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" @@ -3489,7 +3489,7 @@ msgid "workspace.header.menu.show-artboard-names" msgstr "Mostrar nombres de tableros" #: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" +msgid "workspace.header.menu.show-g" msgstr "Mostrar rejilla" #: src/app/main/ui/workspace/header.cljs diff --git a/frontend/translations/eu.po b/frontend/translations/eu.po index 5be03e1d3..9436e9d85 100644 --- a/frontend/translations/eu.po +++ b/frontend/translations/eu.po @@ -2553,9 +2553,6 @@ msgstr "Erakutsi/ezkutatu foko-modua" msgid "shortcuts.toggle-fullscreen" msgstr "Aktibatu/desaktibatu pantaila osoa" -msgid "shortcuts.toggle-grid" -msgstr "Erakutsi/ezkutatu sarea" - msgid "shortcuts.toggle-history" msgstr "Erakutsi/Ezkutatu historikoa" @@ -2574,12 +2571,6 @@ msgstr "Blokeatu/Desblokeatu proportzioak" msgid "shortcuts.toggle-rules" msgstr "Erakutsi/ezkutatu erregelak" -msgid "shortcuts.toggle-snap-grid" -msgstr "Lerrokatu sarera" - -msgid "shortcuts.toggle-snap-guide" -msgstr "Lerroatu gidetara" - msgid "shortcuts.toggle-textpalette" msgstr "Erakutsi/Ezkutatu testuen paleta" @@ -2938,10 +2929,6 @@ msgstr "Desaktibatu eskala proportzionala" msgid "workspace.header.menu.disable-scale-text" msgstr "Desaktibatu testu eskala" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "Desaktibatu sarera atxikitzea" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-snap-guides" msgstr "Desaktibatu gidetara atxikitzea" @@ -2960,10 +2947,6 @@ msgstr "Aktibatu eskala proportzionala" msgid "workspace.header.menu.enable-scale-text" msgstr "Aktibatu testua eskalatzea" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "Atxikitu sarera" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-guides" msgstr "Atxikitu gidetara" @@ -2975,10 +2958,6 @@ msgstr "Aktibatu pixelera atxikitzea" msgid "workspace.header.menu.hide-artboard-names" msgstr "Ezkutatu arbelen izenak" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-grid" -msgstr "Ezkutatu saretak" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "Ezkutatu kolore-paleta" @@ -3025,17 +3004,10 @@ msgstr "Guztiak aukeratu" msgid "workspace.header.menu.show-artboard-names" msgstr "Erakutsi arbelen izenak" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "Erakutsi sareta" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Erakutsi kolore-paleta" -msgid "workspace.header.menu.show-pixel-grid" -msgstr "Erakutsi pixelen sarea" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-rules" msgstr "Erakutsi erregelak" diff --git a/frontend/translations/fa.po b/frontend/translations/fa.po index e93886d64..f010b9a74 100644 --- a/frontend/translations/fa.po +++ b/frontend/translations/fa.po @@ -1876,10 +1876,6 @@ msgstr "انتقال" msgid "shortcuts.paste" msgstr "چسباندن" -#, fuzzy -msgid "shortcuts.toggle-grid" -msgstr "نمایش/پنهان کردن شبکه‌بندی" - msgid "shortcuts.toggle-rules" msgstr "نمایش/پنهان کردن خط‌کش‌ها" diff --git a/frontend/translations/fr.po b/frontend/translations/fr.po index 9c0f87d06..87d06e573 100644 --- a/frontend/translations/fr.po +++ b/frontend/translations/fr.po @@ -2771,9 +2771,6 @@ msgstr "Activer/désactiver le mode focus" msgid "shortcuts.toggle-fullscreen" msgstr "Activer/désactiver le plein écran" -msgid "shortcuts.toggle-grid" -msgstr "Afficher/masquer la grille" - msgid "shortcuts.toggle-history" msgstr "Activer/désactiver l'historique" @@ -2792,12 +2789,6 @@ msgstr "Verrouiller les proportions" msgid "shortcuts.toggle-rules" msgstr "Afficher/masquer les règles" -msgid "shortcuts.toggle-snap-grid" -msgstr "Aligner sur la grille" - -msgid "shortcuts.toggle-snap-guide" -msgstr "Aligner sur les guides" - msgid "shortcuts.toggle-textpalette" msgstr "Afficher/masquer la palette de texte" @@ -3136,10 +3127,6 @@ msgstr "Désactiver l’alignement dynamique" msgid "workspace.header.menu.disable-scale-text" msgstr "Désactiver la mise à l'échelle du texte" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "Désactiver l’alignement sur la grille" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-snap-guides" msgstr "Désactiver l’alignement sur les guides" @@ -3155,10 +3142,6 @@ msgstr "Activer l’alignement dynamique" msgid "workspace.header.menu.enable-scale-text" msgstr "Activer le redimensionnement du texte" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "Aligner sur la grille" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-guides" msgstr "Aligner sur les guides" @@ -3170,10 +3153,6 @@ msgstr "Activer l’alignement au pixel" msgid "workspace.header.menu.hide-artboard-names" msgstr "Masquer le nom des plans de travail" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-grid" -msgstr "Masquer la grille" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "Masquer la palette de couleurs" @@ -3217,10 +3196,6 @@ msgstr "Tout sélectionner" msgid "workspace.header.menu.show-artboard-names" msgstr "Afficher le nom des plans de travail" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "Montrer la grille" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Montrer la palette de couleurs" diff --git a/frontend/translations/ha.po b/frontend/translations/ha.po index 5f2773ae9..27661a3aa 100644 --- a/frontend/translations/ha.po +++ b/frontend/translations/ha.po @@ -1908,10 +1908,6 @@ msgstr "kulle" msgid "labels.help-center" msgstr "sashen taimako" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-grid" -msgstr "Boye akwati" - #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.entry.modify" msgstr "gyaggyarawa %s" @@ -1946,10 +1942,6 @@ msgstr "" msgid "errors.email-has-permanent-bounces" msgstr "imel «%s» na da bayanan matsaloli na dindindin." -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "kashe tsinkewa zuwa akwati" - msgid "errors.webhooks.unexpected-status" msgstr "matsayin da ba zato %s" @@ -2966,9 +2958,6 @@ msgstr "tsarin salo" msgid "dashboard.import.analyze-error" msgstr "kash! mun gaza shigo da kundinka" -msgid "shortcuts.toggle-snap-guide" -msgstr "Tsinke zuwa mai jagora" - #: src/app/main/ui/auth/recovery_request.cljs msgid "auth.recovery-request-subtitle" msgstr "za mu aika maka da saqon qa'idoji ta imel" @@ -3307,10 +3296,6 @@ msgstr "kammala aiki" msgid "ds.confirm-ok" msgstr "haka" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "nuna akwati" - #: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs msgid "auth.name.not-all-space" msgstr "dole suna ya qumshi waxansu alamimon rubutu, sannan tazara." @@ -3722,9 +3707,6 @@ msgstr "fadi" msgid "inspect.empty.select" msgstr "zabar zubi, hukumar masu sa ido akan bangarorinsu da lambobinsu" -msgid "shortcuts.toggle-grid" -msgstr "Nuna/boye akwati" - #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.expires-on" msgstr "gama aiki kan %s" @@ -4023,10 +4005,6 @@ msgstr "yanayin kallo (%s)" msgid "workspace.path.actions.make-curve" msgstr "Ta lankwasa (%s)" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "Tsinke zuwa akwati" - msgid "workspace.options.search-font" msgstr "nemo jerin harufa" @@ -4501,9 +4479,6 @@ msgstr "Upload custom fonts" msgid "shortcuts.flip-horizontal" msgstr "kifa shi dai dai" -msgid "shortcuts.toggle-snap-grid" -msgstr "Tsinke akwati" - msgid "dashboard.import.progress.process-components" msgstr "aikin sassa" diff --git a/frontend/translations/he.po b/frontend/translations/he.po index 7f75d5c40..eafd1cd44 100644 --- a/frontend/translations/he.po +++ b/frontend/translations/he.po @@ -2802,9 +2802,6 @@ msgstr "החלפת מצב מיקוד" msgid "shortcuts.toggle-fullscreen" msgstr "החלפת מילוי מסך" -msgid "shortcuts.toggle-grid" -msgstr "הצגת/הסתרת רשת" - msgid "shortcuts.toggle-history" msgstr "החלפת הצגת היסטוריה" @@ -2823,12 +2820,6 @@ msgstr "נעילת יחס" msgid "shortcuts.toggle-rules" msgstr "הצגת/הסתרת סרגלים" -msgid "shortcuts.toggle-snap-grid" -msgstr "הצמדה לרשת" - -msgid "shortcuts.toggle-snap-guide" -msgstr "הצמדה לקווים מנחים" - msgid "shortcuts.toggle-textpalette" msgstr "החלפת לוח טקסט" @@ -3202,10 +3193,6 @@ msgstr "השבתת קנה מידה יחסי" msgid "workspace.header.menu.disable-scale-text" msgstr "השבתת שינוי גודל טקסט" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "השבתת הצמדה לרשת" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-snap-guides" msgstr "השבתת הצמדה לקווים המנחים" @@ -3224,10 +3211,6 @@ msgstr "הפעלת קנה מידה יחסי" msgid "workspace.header.menu.enable-scale-text" msgstr "הפעלת שינוי גודל טקסט" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "הצמדה לרשת" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-guides" msgstr "הצמדה לקווים מנחים" @@ -3239,10 +3222,6 @@ msgstr "הפעלת הצמדה לפיקסל" msgid "workspace.header.menu.hide-artboard-names" msgstr "הסתרת שמות לוחות" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-grid" -msgstr "הסתרת רשתות" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "הסתרת ערכת צבעים" @@ -3289,10 +3268,6 @@ msgstr "לבחור הכול" msgid "workspace.header.menu.show-artboard-names" msgstr "הצגת שמות לוחות" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "הצגת רשת" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "הצגת ערכת צבעים" diff --git a/frontend/translations/hr.po b/frontend/translations/hr.po index 7fc04586d..a0e38637e 100644 --- a/frontend/translations/hr.po +++ b/frontend/translations/hr.po @@ -2333,10 +2333,6 @@ msgstr "Promijena fokus moda" msgid "shortcuts.toggle-fullscreen" msgstr "Promijeni cijeli zaslon" -#, fuzzy -msgid "shortcuts.toggle-grid" -msgstr "Promijena \"grida\"" - msgid "shortcuts.toggle-history" msgstr "Promijena povijesti" @@ -2353,14 +2349,6 @@ msgstr "Zaključaj proporcije" msgid "shortcuts.toggle-rules" msgstr "Prikaži/sakrij \"rules\"" -#, fuzzy -msgid "shortcuts.toggle-snap-grid" -msgstr "Poravnanje s \"gridom\"" - -#, fuzzy -msgid "shortcuts.toggle-snap-guide" -msgstr "Pričvrsti na guides" - msgid "shortcuts.toggle-textpalette" msgstr "Promijeni paletu teksta" @@ -2692,10 +2680,6 @@ msgstr "Onemogući dinamičko poravnanje" msgid "workspace.header.menu.disable-scale-text" msgstr "Onemogući skaliranje teksta" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "Onemogući \"snap to grid\"" - #: src/app/main/ui/workspace/header.cljs #, fuzzy msgid "workspace.header.menu.disable-snap-guides" @@ -2713,10 +2697,6 @@ msgstr "Omogući dinamičko poravnanje" msgid "workspace.header.menu.enable-scale-text" msgstr "Omogući skaliranje teksta" -#: src/app/main/ui/workspace/header.cljs -#, fuzzy -msgid "workspace.header.menu.enable-snap-grid" -msgstr "Poravnanje s \"gridom\"" #: src/app/main/ui/workspace/header.cljs #, fuzzy @@ -2731,11 +2711,6 @@ msgstr "Omogući \"snap to pixel\"" msgid "workspace.header.menu.hide-artboard-names" msgstr "Sakrij nazive ploča" -#: src/app/main/ui/workspace/header.cljs -#, fuzzy -msgid "workspace.header.menu.hide-grid" -msgstr "Sakrij \"grid\"" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "Sakrij paletu boja" @@ -2780,10 +2755,6 @@ msgstr "Odaberi sve" msgid "workspace.header.menu.show-artboard-names" msgstr "Prikaži nazive ploča" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "Prikaži \"grid\"" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Prikaži paletu boja" diff --git a/frontend/translations/id.po b/frontend/translations/id.po index 551cd6091..037737bdd 100644 --- a/frontend/translations/id.po +++ b/frontend/translations/id.po @@ -2910,9 +2910,6 @@ msgstr "Alih mode fokus" msgid "shortcuts.toggle-fullscreen" msgstr "Alih layar penuh" -msgid "shortcuts.toggle-grid" -msgstr "Tampilkan/sembunyikan kisi" - msgid "shortcuts.toggle-history" msgstr "Alih riwayat" @@ -2931,12 +2928,6 @@ msgstr "Kunci proporsi" msgid "shortcuts.toggle-rules" msgstr "Tampilkan/sembunyikan penggaris" -msgid "shortcuts.toggle-snap-grid" -msgstr "Tancap ke kisi" - -msgid "shortcuts.toggle-snap-guide" -msgstr "Tancap ke pemandu" - msgid "shortcuts.toggle-textpalette" msgstr "Alih palet teks" @@ -3307,10 +3298,6 @@ msgstr "Nonaktifkan skala proporsional" msgid "workspace.header.menu.disable-scale-text" msgstr "Nonaktifkan skala teks" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "Nonaktifkan tancapan ke kisi" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-snap-guides" msgstr "Nonaktifkan tancapan ke pemandu" @@ -3329,10 +3316,6 @@ msgstr "Aktifkan skala proporsional" msgid "workspace.header.menu.enable-scale-text" msgstr "Aktifkan skala teks" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "Tancapkan ke kisi" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-guides" msgstr "Tancapkan ke pemandu" @@ -3344,10 +3327,6 @@ msgstr "Aktifkan tancapkan ke piksel" msgid "workspace.header.menu.hide-artboard-names" msgstr "Sembunyikan nama papan" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-grid" -msgstr "Sembunyikan kisi" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "Sembunyikan palet warna" @@ -3394,10 +3373,6 @@ msgstr "Pilih semua" msgid "workspace.header.menu.show-artboard-names" msgstr "Tampilkan nama papan" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "Tampilkan kisi" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Tampilkan palet warna" diff --git a/frontend/translations/lv.po b/frontend/translations/lv.po index e786756ee..72c325638 100644 --- a/frontend/translations/lv.po +++ b/frontend/translations/lv.po @@ -2897,9 +2897,6 @@ msgstr "Pārslēgt fokusa režīmu" msgid "shortcuts.toggle-fullscreen" msgstr "Pārslēgt pilnekrāna režīmu" -msgid "shortcuts.toggle-grid" -msgstr "Rādīt/paslēpt režģi" - msgid "shortcuts.toggle-history" msgstr "Pārslēgt vēsturi" @@ -2918,12 +2915,6 @@ msgstr "Slēgt proporcijas" msgid "shortcuts.toggle-rules" msgstr "Rādīt/paslēpt mērjoslas" -msgid "shortcuts.toggle-snap-grid" -msgstr "Pieķerties režģim" - -msgid "shortcuts.toggle-snap-guide" -msgstr "Pieķerties vadotnēm" - msgid "shortcuts.toggle-textpalette" msgstr "Pārslēgt teksta paleti" @@ -3293,10 +3284,6 @@ msgstr "Atspējot proporcionālo mērogu" msgid "workspace.header.menu.disable-scale-text" msgstr "Deaktivizēt teksta mērogošanu" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "Atspējot pieķeršanos režģim" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-snap-guides" msgstr "Atspējot pieķeršanos vadotnēm" @@ -3315,10 +3302,6 @@ msgstr "Iespējot proporcionālo mērogu" msgid "workspace.header.menu.enable-scale-text" msgstr "Aktivizēt teksta mērogošanu" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "Pieķerties režģim" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-guides" msgstr "Pieķerties vadotnēm" @@ -3330,10 +3313,6 @@ msgstr "Iespējot pieķeršanos pikselim" msgid "workspace.header.menu.hide-artboard-names" msgstr "Paslēpt plātņu nosaukumus" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-grid" -msgstr "Paslēpt režģus" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "Paslēpt krāsu paleti" @@ -3380,10 +3359,6 @@ msgstr "Atlasīt visu" msgid "workspace.header.menu.show-artboard-names" msgstr "Rādīt plātņu nosaukumus" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "Rādīt režģi" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Rādīt krāsu paleti" diff --git a/frontend/translations/nb_NO.po b/frontend/translations/nb_NO.po index 0d8307fa2..33b0e4b1d 100644 --- a/frontend/translations/nb_NO.po +++ b/frontend/translations/nb_NO.po @@ -602,14 +602,6 @@ msgstr "Størrelse" msgid "workspace.assets.typography.font-variant-id" msgstr "Variant" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "Fest til rutenett" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "Vis rutenett" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-rules" msgstr "Vis regler" diff --git a/frontend/translations/nl.po b/frontend/translations/nl.po index ad9b4beff..3e7a9bc04 100644 --- a/frontend/translations/nl.po +++ b/frontend/translations/nl.po @@ -2959,9 +2959,6 @@ msgstr "Focusmodus in/uitschakelen" msgid "shortcuts.toggle-fullscreen" msgstr "Volledig scherm in/uitschakelen" -msgid "shortcuts.toggle-grid" -msgstr "Raster tonen/verbergen" - msgid "shortcuts.toggle-history" msgstr "Geschiedenis in/uitschakelen" @@ -2980,12 +2977,6 @@ msgstr "Proporties vergrendelen" msgid "shortcuts.toggle-rules" msgstr "Linialen tonen/verbergen" -msgid "shortcuts.toggle-snap-grid" -msgstr "Uitlijnen op raster" - -msgid "shortcuts.toggle-snap-guide" -msgstr "Uitlijnen op hulplijnen" - msgid "shortcuts.toggle-textpalette" msgstr "Tekstpalet in/uitschakelen" @@ -3357,10 +3348,6 @@ msgstr "Proportionele schaal uitschakelen" msgid "workspace.header.menu.disable-scale-text" msgstr "Tekstschaal uitschakelen" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "Uitlijnen op raster uitschakelen" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-snap-guides" msgstr "Uitlijnen op hulplijnen uitschakelen" @@ -3379,10 +3366,6 @@ msgstr "Proportionele schaal inschakelen" msgid "workspace.header.menu.enable-scale-text" msgstr "Tekstschaal inschakelen" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "Uitlijnen op raster" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-guides" msgstr "Uitlijnen op hulplijnen" @@ -3394,10 +3377,6 @@ msgstr "Uitlijnen op pixel" msgid "workspace.header.menu.hide-artboard-names" msgstr "Bordnamen verbergen" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-grid" -msgstr "Rasters verbergen" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "Kleurenpalet verbergen" @@ -3444,10 +3423,6 @@ msgstr "Alles selecteren" msgid "workspace.header.menu.show-artboard-names" msgstr "Bordnamen tonen" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "Raster tonen" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Kleurenpalet tonen" diff --git a/frontend/translations/pl.po b/frontend/translations/pl.po index b460b8b14..839c34218 100644 --- a/frontend/translations/pl.po +++ b/frontend/translations/pl.po @@ -2451,9 +2451,6 @@ msgstr "Przełącz tryb skupienia" msgid "shortcuts.toggle-fullscreen" msgstr "Przełącz tryb pełnoekranowy" -msgid "shortcuts.toggle-grid" -msgstr "Pokaż/ukryj siatkę" - msgid "shortcuts.toggle-history" msgstr "Przełącz historię" @@ -2472,12 +2469,6 @@ msgstr "Zablokuj proporcje" msgid "shortcuts.toggle-rules" msgstr "Pokaż/ukryj linijki" -msgid "shortcuts.toggle-snap-grid" -msgstr "Przyciągaj do siatki" - -msgid "shortcuts.toggle-snap-guide" -msgstr "Przyciągaj do prowadnic" - msgid "shortcuts.toggle-textpalette" msgstr "Przełącz paletę tekstu" @@ -2805,10 +2796,6 @@ msgstr "Wyłącz wyrównanie dynamiczne" msgid "workspace.header.menu.disable-scale-text" msgstr "Wyłącz skalowanie tekstu" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "Wyłącz przyciąganie do siatki" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-snap-guides" msgstr "Wyłącz przyciąganie do prowadnic" @@ -2824,10 +2811,6 @@ msgstr "Włącz dynamiczne wyrównanie" msgid "workspace.header.menu.enable-scale-text" msgstr "Włącz skalowanie tekstu" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "Przyciągaj do siatki" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-guides" msgstr "Przyciągaj do prowadnic" @@ -2839,10 +2822,6 @@ msgstr "Włącz przyciąganie do piksela" msgid "workspace.header.menu.hide-artboard-names" msgstr "Ukryj nazwy obszarów kompozycji" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-grid" -msgstr "Ukryj siatki" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "Ukryj paletę kolorów" @@ -2886,10 +2865,6 @@ msgstr "Zaznacz wszystko" msgid "workspace.header.menu.show-artboard-names" msgstr "Pokaz nazwy obszarów kompozycji" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "Pokaż siatkę" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Pokaż paletę kolorów" diff --git a/frontend/translations/pt_BR.po b/frontend/translations/pt_BR.po index 91ff93e5d..9610c9f4f 100644 --- a/frontend/translations/pt_BR.po +++ b/frontend/translations/pt_BR.po @@ -2442,9 +2442,6 @@ msgstr "Entrar/Sair do modo de foco" msgid "shortcuts.toggle-fullscreen" msgstr "Entrar/Sair da tela cheia" -msgid "shortcuts.toggle-grid" -msgstr "Mostrar/Esconder grade" - msgid "shortcuts.toggle-history" msgstr "Mostrar/Esconder histórico" @@ -2463,12 +2460,6 @@ msgstr "Fixar proporções" msgid "shortcuts.toggle-rules" msgstr "Mostrar/ocultar réguas" -msgid "shortcuts.toggle-snap-grid" -msgstr "Aderir a grade" - -msgid "shortcuts.toggle-snap-guide" -msgstr "Aderir as réguas" - msgid "shortcuts.toggle-textpalette" msgstr "Mostrar/Esconder paleta de tipografias" @@ -2795,10 +2786,6 @@ msgstr "Desabilitar alinhamento dinâmico" msgid "workspace.header.menu.disable-scale-text" msgstr "Desativar escalonamento de texto" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "Desativar aderência a grade" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-snap-guides" msgstr "Desativar aderência as réguas" @@ -2814,10 +2801,6 @@ msgstr "Habilitar alinhamento dinâmico" msgid "workspace.header.menu.enable-scale-text" msgstr "Ativar escalonamento de texto" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "Aderir a grade de pixels" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-guides" msgstr "Aderir as réguas" @@ -2829,10 +2812,6 @@ msgstr "Habilitar aderência a grade de pixels" msgid "workspace.header.menu.hide-artboard-names" msgstr "Esconder nomes das telas" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-grid" -msgstr "Ocultar grades" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "Esconder paleta de cores" @@ -2876,10 +2855,6 @@ msgstr "Selecionar tudo" msgid "workspace.header.menu.show-artboard-names" msgstr "Mostrar nomes das telas" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "Mostrar grade" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Mostrar paleta de cores" diff --git a/frontend/translations/pt_PT.po b/frontend/translations/pt_PT.po index 7e7c16ffc..3bd8735be 100644 --- a/frontend/translations/pt_PT.po +++ b/frontend/translations/pt_PT.po @@ -2903,9 +2903,6 @@ msgstr "Alternar modo de foco" msgid "shortcuts.toggle-fullscreen" msgstr "Alternar tela cheia" -msgid "shortcuts.toggle-grid" -msgstr "Mostrar/ocultar grade" - msgid "shortcuts.toggle-history" msgstr "Alternar histórico" @@ -2924,12 +2921,6 @@ msgstr "Bloquear proporções" msgid "shortcuts.toggle-rules" msgstr "Mostrar/ocultar regras" -msgid "shortcuts.toggle-snap-grid" -msgstr "Ajustar à grade" - -msgid "shortcuts.toggle-snap-guide" -msgstr "Ajustar às guias" - msgid "shortcuts.toggle-textpalette" msgstr "Alternar paleta de texto" @@ -3303,10 +3294,6 @@ msgstr "Desativar escala proporcional" msgid "workspace.header.menu.disable-scale-text" msgstr "Desativar escala de texto" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "Desativar ajuste à grade" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-snap-guides" msgstr "Desativar ajuste às guias" @@ -3325,10 +3312,6 @@ msgstr "Ativar escala proporcional" msgid "workspace.header.menu.enable-scale-text" msgstr "Ativar escalar texto" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "Ajustar à grade" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-guides" msgstr "Ajustar às guias" @@ -3340,10 +3323,6 @@ msgstr "Ativar ajuste ao pixel" msgid "workspace.header.menu.hide-artboard-names" msgstr "Ocultar nome das pranchetas" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-grid" -msgstr "Ocultar grades" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "Ocultar paleta de cor" @@ -3390,10 +3369,6 @@ msgstr "Selecionar tudo" msgid "workspace.header.menu.show-artboard-names" msgstr "Mostrar nomes das pranchetas" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "Mostrar grade" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Mostrar paleta de cor" diff --git a/frontend/translations/ro.po b/frontend/translations/ro.po index 82698e7ef..232fc9a6c 100644 --- a/frontend/translations/ro.po +++ b/frontend/translations/ro.po @@ -2943,9 +2943,6 @@ msgstr "Comutați modul de focus" msgid "shortcuts.toggle-fullscreen" msgstr "Comutați la ecran complet" -msgid "shortcuts.toggle-grid" -msgstr "Afișați/ascundeți grila" - msgid "shortcuts.toggle-history" msgstr "Comutați istoricul" @@ -2964,12 +2961,6 @@ msgstr "Blocați proporțiile" msgid "shortcuts.toggle-rules" msgstr "Afișați/ascundeți rigle" -msgid "shortcuts.toggle-snap-grid" -msgstr "Fixare la grilă" - -msgid "shortcuts.toggle-snap-guide" -msgstr "Fixare la ghiduri" - msgid "shortcuts.toggle-textpalette" msgstr "Comutați paleta de text" @@ -3342,10 +3333,6 @@ msgstr "Dezactivare scară proporțională" msgid "workspace.header.menu.disable-scale-text" msgstr "Dezactivează dimensionarea textului" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "Dezactivați snap-ul la grilă" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-snap-guides" msgstr "Dezactivați fixarea la ghiduri" @@ -3364,10 +3351,6 @@ msgstr "Activare scară proporțională" msgid "workspace.header.menu.enable-scale-text" msgstr "Activează scalarea textului" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "Aliniază per grilă" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-guides" msgstr "Fixare la ghiduri" @@ -3379,10 +3362,6 @@ msgstr "Activați fixarea la pixel" msgid "workspace.header.menu.hide-artboard-names" msgstr "Ascundeți numele tablelor" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-grid" -msgstr "Ascunde grila de ghidaj" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "Ascunde paleta de culori" @@ -3429,10 +3408,6 @@ msgstr "Selectează tot" msgid "workspace.header.menu.show-artboard-names" msgstr "Afișați numele tablelor" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "Afişează sistemul grid" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Afişează paleta de culori" diff --git a/frontend/translations/ru.po b/frontend/translations/ru.po index 9bbb8f993..5a68e36df 100644 --- a/frontend/translations/ru.po +++ b/frontend/translations/ru.po @@ -1973,9 +1973,6 @@ msgstr "Переключить палитру цветов" msgid "shortcuts.toggle-focus-mode" msgstr "Переключить режим фокуса" -msgid "shortcuts.toggle-grid" -msgstr "Показать/скрыть сетку" - msgid "shortcuts.toggle-history" msgstr "Переключить историю" @@ -2251,26 +2248,14 @@ msgstr "Разгруппировать" msgid "workspace.header.menu.disable-dynamic-alignment" msgstr "Отключить активное выравнивание" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "Отключить привязку к сетке" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-dynamic-alignment" msgstr "Включить активное выравнивание" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "Привяка к сетке" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-artboard-names" msgstr "Скрыть имена кадров" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-grid" -msgstr "Скрыть сетки" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "Скрыть палитру цветов" @@ -2302,10 +2287,6 @@ msgstr "" msgid "workspace.header.menu.show-artboard-names" msgstr "Показать имена кадров" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "Показать сетку" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Показать палитру цветов" diff --git a/frontend/translations/tr.po b/frontend/translations/tr.po index 717b1bda0..f1ef022f9 100644 --- a/frontend/translations/tr.po +++ b/frontend/translations/tr.po @@ -2482,9 +2482,6 @@ msgstr "Odak modunu değiştir" msgid "shortcuts.toggle-fullscreen" msgstr "Tam ekranı değiştir" -msgid "shortcuts.toggle-grid" -msgstr "Izgarayı göster/gizle" - msgid "shortcuts.toggle-history" msgstr "Geçmişi değiştir" @@ -2503,12 +2500,6 @@ msgstr "Oranları kilitle" msgid "shortcuts.toggle-rules" msgstr "Cetvelleri göster/gizle" -msgid "shortcuts.toggle-snap-grid" -msgstr "Izgaraya tuttur" - -msgid "shortcuts.toggle-snap-guide" -msgstr "Kılavuzlara tuttur" - msgid "shortcuts.toggle-textpalette" msgstr "Metin paletini değiştir" @@ -2847,10 +2838,6 @@ msgstr "Dinamik hizalamayı devre dışı bırak" msgid "workspace.header.menu.disable-scale-text" msgstr "Metin ölçeklendirmeyi devre dışı bırak" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "Izgaraya tutturmayı devre dışı bırak" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-snap-guides" msgstr "Kılavuzlara tutturmayı devre dışı bırak" @@ -2866,10 +2853,6 @@ msgstr "Dinamik hizalamayı etkinleştir" msgid "workspace.header.menu.enable-scale-text" msgstr "Metin ölçeklendirmeyi etkinleştir" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "Izgaraya tuttur" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-guides" msgstr "Kılavuzlara tuttur" @@ -2881,10 +2864,6 @@ msgstr "Piksele tutturmayı etkinleştir" msgid "workspace.header.menu.hide-artboard-names" msgstr "Çalışma yüzeyi adlarını gizle" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-grid" -msgstr "Izgaraları gizle" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "Renk paletini gizle" @@ -2928,10 +2907,6 @@ msgstr "Tümünü seç" msgid "workspace.header.menu.show-artboard-names" msgstr "Çalışma yüzeylerinin adlarını göster" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "Izgarayı göster" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Renk paletini göster" diff --git a/frontend/translations/zh_CN.po b/frontend/translations/zh_CN.po index ebb12eca6..c7f736a1f 100644 --- a/frontend/translations/zh_CN.po +++ b/frontend/translations/zh_CN.po @@ -2456,9 +2456,6 @@ msgstr "切换焦点模式" msgid "shortcuts.toggle-fullscreen" msgstr "切换全屏" -msgid "shortcuts.toggle-grid" -msgstr "显示/隐藏网格" - msgid "shortcuts.toggle-history" msgstr "切换历史" @@ -2477,12 +2474,6 @@ msgstr "锁定比例" msgid "shortcuts.toggle-rules" msgstr "显示/隐藏规则" -msgid "shortcuts.toggle-snap-grid" -msgstr "网络对齐" - -msgid "shortcuts.toggle-snap-guide" -msgstr "辅助线对齐" - msgid "shortcuts.toggle-textpalette" msgstr "切换文本调色板" @@ -2837,10 +2828,6 @@ msgstr "禁用比例尺" msgid "workspace.header.menu.disable-scale-text" msgstr "禁用缩放文本" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "禁用吸附到网格" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-snap-guides" msgstr "禁用与参考线对齐" @@ -2859,10 +2846,6 @@ msgstr "启用比例尺" msgid "workspace.header.menu.enable-scale-text" msgstr "启用缩放文本" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "吸附到网格" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-guides" msgstr "与参考线对齐" @@ -2874,10 +2857,6 @@ msgstr "启用像素对齐" msgid "workspace.header.menu.hide-artboard-names" msgstr "隐藏画板名称" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-grid" -msgstr "隐藏网格" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "隐藏调色盘" @@ -2924,10 +2903,6 @@ msgstr "全选" msgid "workspace.header.menu.show-artboard-names" msgstr "显示画板名称" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "显示网格" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "显示调色盘" diff --git a/frontend/translations/zh_Hant.po b/frontend/translations/zh_Hant.po index c6151391e..ad1fe9a14 100644 --- a/frontend/translations/zh_Hant.po +++ b/frontend/translations/zh_Hant.po @@ -1584,9 +1584,6 @@ msgstr "切換調色板" msgid "shortcuts.toggle-focus-mode" msgstr "切換專注模式" -msgid "shortcuts.toggle-grid" -msgstr "顯示/隱藏網格" - msgid "shortcuts.toggle-history" msgstr "切換歷史記錄" -- Gitee From 3f316ca9c908e947b9f09ae2676f3e36de3cd18b Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 12 Mar 2024 14:14:47 +0100 Subject: [PATCH 0073/1266] :bug: Fix swap on anidated frames --- frontend/src/app/main/data/workspace/libraries.cljs | 3 ++- .../src/app/main/data/workspace/libraries_helpers.cljs | 10 +++++++--- frontend/src/app/main/data/workspace/selection.cljs | 3 ++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index 448997208..2d69cf7b6 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -901,7 +901,8 @@ libraries nil (:parent-id shape) - (:frame-id shape)) + (:frame-id shape) + {:force-frame? true}) new-shape (cond-> new-shape (nil? (ctk/get-swap-slot new-shape)) diff --git a/frontend/src/app/main/data/workspace/libraries_helpers.cljs b/frontend/src/app/main/data/workspace/libraries_helpers.cljs index b75f13e00..b3aa937db 100644 --- a/frontend/src/app/main/data/workspace/libraries_helpers.cljs +++ b/frontend/src/app/main/data/workspace/libraries_helpers.cljs @@ -152,9 +152,11 @@ (defn generate-instantiate-component "Generate changes to create a new instance from a component." ([changes objects file-id component-id position page libraries] - (generate-instantiate-component changes objects file-id component-id position page libraries nil nil nil)) + (generate-instantiate-component changes objects file-id component-id position page libraries nil nil nil {})) - ([changes objects file-id component-id position page libraries old-id parent-id frame-id] + ([changes objects file-id component-id position page libraries old-id parent-id frame-id + {:keys [force-frame?] + :or {force-frame? false}}] (let [component (ctf/get-component libraries file-id component-id) parent (when parent-id (get objects parent-id)) library (get libraries file-id) @@ -166,7 +168,9 @@ component (:data library) position - components-v2) + components-v2 + (cond-> {} + force-frame? (assoc :force-frame-id frame-id))) first-shape (cond-> (first new-shapes) (not (nil? parent-id)) diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index ca4200c11..975e21704 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -443,7 +443,8 @@ libraries (:id component-root) parent-id - frame-id) + frame-id + {}) restore-component #(let [restore (dwlh/prepare-restore-component changes library-data (:component-id component-root) it page delta (:id component-root) parent-id frame-id)] -- Gitee From ca5e2c345b936320d8cda6a4022f974e12cf652f Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Fri, 15 Mar 2024 10:30:09 +0100 Subject: [PATCH 0074/1266] :tada: Improve naming of components for Main components page on v1 to v2 migration --- backend/src/app/features/components_v2.clj | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/src/app/features/components_v2.clj b/backend/src/app/features/components_v2.clj index e24cbc469..46d04636f 100644 --- a/backend/src/app/features/components_v2.clj +++ b/backend/src/app/features/components_v2.clj @@ -1092,7 +1092,12 @@ (let [shapes (cfh/get-children-with-self (:objects component) (:id component)) - root-shape (first shapes) + ;; Let's calculate the top shame name from the components path and name + root-shape (-> (first shapes) + (assoc :name (cfh/merge-path-item (:path component) (:name component)))) + + shapes (assoc shapes 0 root-shape) + orig-pos (gpt/point (:x root-shape) (:y root-shape)) delta (gpt/subtract position orig-pos) -- Gitee From b999057be107b8e02acdba52ffcb9e39319e4bef Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Fri, 15 Mar 2024 11:39:16 +0100 Subject: [PATCH 0075/1266] :bug: Fix path top bat z-index --- .../ui/workspace/viewport/path_actions.cljs | 164 +++++++++++------- .../ui/workspace/viewport/path_actions.scss | 63 +++---- .../main/ui/workspace/viewport/top_bar.cljs | 5 +- .../main/ui/workspace/viewport/top_bar.scss | 68 ++++---- 4 files changed, 168 insertions(+), 132 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/viewport/path_actions.cljs b/frontend/src/app/main/ui/workspace/viewport/path_actions.cljs index e337d4b17..69597f5a1 100644 --- a/frontend/src/app/main/ui/workspace/viewport/path_actions.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/path_actions.cljs @@ -16,6 +16,38 @@ [app.util.path.tools :as upt] [rumext.v2 :as mf])) + +(def ^:private pentool-icon + (i/icon-xref :pentool (stl/css :pentool-icon :pathbar-icon))) + +(def ^:private move-icon + (i/icon-xref :move (stl/css :move-icon :pathbar-icon))) + +(def ^:private add-icon + (i/icon-xref :add (stl/css :add-icon :pathbar-icon))) + +(def ^:private remove-icon + (i/icon-xref :remove-icon (stl/css :remove-icon :pathbar-icon))) + +(def ^:private merge-nodes-icon + (i/icon-xref :merge-nodes (stl/css :merge-nodes-icon :pathbar-icon))) + +(def ^:private join-nodes-icon + (i/icon-xref :join-nodes (stl/css :join-nodes-icon :pathbar-icon))) + +(def ^:private separate-nodes-icon + (i/icon-xref :separate-nodes (stl/css :separate-nodes-icon :pathbar-icon))) + +(def ^:private to-corner-icon + (i/icon-xref :to-corner (stl/css :to-corner-icon :pathbar-icon))) + +(def ^:private to-curve-icon + (i/icon-xref :to-curve (stl/css :to-curve-icon :pathbar-icon))) + +(def ^:private snap-nodes-icon + (i/icon-xref :snap-nodes (stl/css :snap-nodes-icon :pathbar-icon))) + + (defn check-enabled [content selected-points] (let [segments (upt/get-segments content selected-points) num-segments (count segments) @@ -36,6 +68,7 @@ :join-nodes (and points-selected? (>= num-points 2) (< num-segments max-segments)) :separate-nodes segments-selected?})) + (mf/defc path-actions [{:keys [shape]}] (let [{:keys [edit-mode selected-points snap-toggled] :as all} (mf/deref pc/current-edit-path-ref) content (:content shape) @@ -112,77 +145,76 @@ [:div {:class (stl/css :sub-actions)} [:div {:class (stl/css :sub-actions-group)} - ;; Draw Mode - [:button - {:class (stl/css-case :is-toggled (= edit-mode :draw)) - :title (tr "workspace.path.actions.draw-nodes" (sc/get-tooltip :draw-nodes)) - :on-click on-select-draw-mode} - i/pentool] + ;; Draw Mode + [:button {:class (stl/css-case :is-toggled (= edit-mode :draw) + :topbar-btn true) + :title (tr "workspace.path.actions.draw-nodes" (sc/get-tooltip :draw-nodes)) + :on-click on-select-draw-mode} + pentool-icon] - ;; Edit mode - [:button - {:class (stl/css-case :is-toggled (= edit-mode :move)) - :title (tr "workspace.path.actions.move-nodes" (sc/get-tooltip :move-nodes)) - :on-click on-select-edit-mode} - i/move]] + ;; Edit mode + [:button {:class (stl/css-case :is-toggled (= edit-mode :move) + :topbar-btn true) + :title (tr "workspace.path.actions.move-nodes" (sc/get-tooltip :move-nodes)) + :on-click on-select-edit-mode} + move-icon]] [:div {:class (stl/css :sub-actions-group)} - ;; Add Node - [:button - {:disabled (not (:add-node enabled-buttons)) - :title (tr "workspace.path.actions.add-node" (sc/get-tooltip :add-node)) - :on-click on-add-node} - i/add] - - ;; Remove node - [:button - {:disabled (not (:remove-node enabled-buttons)) - :title (tr "workspace.path.actions.delete-node" (sc/get-tooltip :delete-node)) - :on-click on-remove-node} - i/remove-icon]] + ;; Add Node + [:button {:disabled (not (:add-node enabled-buttons)) + :class (stl/css :topbar-btn) + :title (tr "workspace.path.actions.add-node" (sc/get-tooltip :add-node)) + :on-click on-add-node} + add-icon] + + ;; Remove node + [:button {:disabled (not (:remove-node enabled-buttons)) + :class (stl/css :topbar-btn) + :title (tr "workspace.path.actions.delete-node" (sc/get-tooltip :delete-node)) + :on-click on-remove-node} + remove-icon]] [:div {:class (stl/css :sub-actions-group)} - ;; Merge Nodes - [:button - {:disabled (not (:merge-nodes enabled-buttons)) - :title (tr "workspace.path.actions.merge-nodes" (sc/get-tooltip :merge-nodes)) - :on-click on-merge-nodes} - i/merge-nodes] - - ;; Join Nodes - [:button - {:disabled (not (:join-nodes enabled-buttons)) - :title (tr "workspace.path.actions.join-nodes" (sc/get-tooltip :join-nodes)) - :on-click on-join-nodes} - i/join-nodes] - - ;; Separate Nodes - [:button - {:disabled (not (:separate-nodes enabled-buttons)) - :title (tr "workspace.path.actions.separate-nodes" (sc/get-tooltip :separate-nodes)) - :on-click on-separate-nodes} - i/separate-nodes]] - - ;; Make Corner + ;; Merge Nodes + [:button {:disabled (not (:merge-nodes enabled-buttons)) + :class (stl/css :topbar-btn) + :title (tr "workspace.path.actions.merge-nodes" (sc/get-tooltip :merge-nodes)) + :on-click on-merge-nodes} + merge-nodes-icon] + + ;; Join Nodes + [:button {:disabled (not (:join-nodes enabled-buttons)) + :class (stl/css :topbar-btn) + :title (tr "workspace.path.actions.join-nodes" (sc/get-tooltip :join-nodes)) + :on-click on-join-nodes} + join-nodes-icon] + + ;; Separate Nodes + [:button {:disabled (not (:separate-nodes enabled-buttons)) + :class (stl/css :topbar-btn) + :title (tr "workspace.path.actions.separate-nodes" (sc/get-tooltip :separate-nodes)) + :on-click on-separate-nodes} + separate-nodes-icon]] + [:div {:class (stl/css :sub-actions-group)} - [:button - {:disabled (not (:make-corner enabled-buttons)) - :title (tr "workspace.path.actions.make-corner" (sc/get-tooltip :make-corner)) - :on-click on-make-corner} - i/to-corner] - - ;; Make Curve - [:button - {:disabled (not (:make-curve enabled-buttons)) - :title (tr "workspace.path.actions.make-curve" (sc/get-tooltip :make-curve)) - :on-click on-make-curve} - i/to-curve]] - - ;; Toggle snap + ; Make Corner + [:button {:disabled (not (:make-corner enabled-buttons)) + :class (stl/css :topbar-btn) + :title (tr "workspace.path.actions.make-corner" (sc/get-tooltip :make-corner)) + :on-click on-make-corner} + to-corner-icon] + + ;; Make Curve + [:button {:disabled (not (:make-curve enabled-buttons)) + :class (stl/css :topbar-btn) + :title (tr "workspace.path.actions.make-curve" (sc/get-tooltip :make-curve)) + :on-click on-make-curve} + to-curve-icon]] [:div {:class (stl/css :sub-actions-group)} - [:button - {:class (stl/css-case :is-toggled snap-toggled) - :title (tr "workspace.path.actions.snap-nodes" (sc/get-tooltip :snap-nodes)) - :on-click on-toggle-snap} - i/snap-nodes]]])) + ;; Toggle snap + [:button {:class (stl/css-case :is-toggled snap-toggled + :topbar-btn true) + :title (tr "workspace.path.actions.snap-nodes" (sc/get-tooltip :snap-nodes)) + :on-click on-toggle-snap} + snap-nodes-icon]]])) diff --git a/frontend/src/app/main/ui/workspace/viewport/path_actions.scss b/frontend/src/app/main/ui/workspace/viewport/path_actions.scss index e64aa4ffd..205cfa367 100644 --- a/frontend/src/app/main/ui/workspace/viewport/path_actions.scss +++ b/frontend/src/app/main/ui/workspace/viewport/path_actions.scss @@ -19,41 +19,44 @@ padding: $s-8 $s-16; border-radius: $s-8; gap: $s-16; - z-index: $z-index-10; + border: $s-2 solid var(--panel-border-color); + z-index: $z-index-3; background-color: var(--color-background-primary); transition: top 0.3s, height 0.3s, opacity 0.3s; +} + +.sub-actions-group { + position: relative; + display: flex; + align-items: center; + margin: 0; + opacity: $op-10; + transition: opacity 0.3s ease; +} - .sub-actions-group { - position: relative; - display: flex; - align-items: center; - margin: 0; - opacity: $op-10; - transition: opacity 0.3s ease; - - button { - @extend .button-tertiary; - height: $s-36; - width: $s-36; - flex-shrink: 0; - background-color: transparent; - border-radius: $s-8; - border: none; - margin: 0 $s-2; - &.is-toggled { - background-color: var(--button-radio-background-color-active); - svg { - stroke: var(--button-radio-foreground-color-active); - } - } - - svg { - @extend .button-icon; - stroke: var(--color-foreground-secondary); - } - } +.topbar-btn { + --pathbar-icon-color: var(--color-foreground-secondary); + @extend .button-tertiary; + height: $s-36; + width: $s-36; + flex-shrink: 0; + background-color: transparent; + border-radius: $s-8; + border: none; + margin: 0 $s-2; + + &.is-toggled { + --pathbar-icon-color: var(--button-radio-foreground-color-active); + background-color: var(--button-radio-background-color-active); + } + + .pathbar-icon { + @extend .button-icon; + stroke: var(--pathbar-icon-color); } } + + diff --git a/frontend/src/app/main/ui/workspace/viewport/top_bar.cljs b/frontend/src/app/main/ui/workspace/viewport/top_bar.cljs index 2e6b5d498..1cbd37d1c 100644 --- a/frontend/src/app/main/ui/workspace/viewport/top_bar.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/top_bar.cljs @@ -33,7 +33,8 @@ [:& i18n/tr-html {:tag-name "span" :label "workspace.top-bar.view-only"}]] [:button {:class (stl/css :done-btn) - :on-click handle-close-view-mode} (tr "workspace.top-bar.read-only.done")]]])) + :on-click handle-close-view-mode} + (tr "workspace.top-bar.read-only.done")]]])) (mf/defc top-bar {::mf/wrap [mf/memo]} @@ -70,7 +71,7 @@ [:& view-only-actions] path-edition? - [:div {:class (stl/css-case :viewport-actions true :viewport-actions-no-rulers (not rulers?))} + [:div {:class (stl/css-case :viewport-actions-path true :viewport-actions-no-rulers (not rulers?))} [:& path-actions {:shape shape}]] grid-edition? diff --git a/frontend/src/app/main/ui/workspace/viewport/top_bar.scss b/frontend/src/app/main/ui/workspace/viewport/top_bar.scss index 7d922dcfc..9109d8e8b 100644 --- a/frontend/src/app/main/ui/workspace/viewport/top_bar.scss +++ b/frontend/src/app/main/ui/workspace/viewport/top_bar.scss @@ -6,7 +6,8 @@ @import "refactor/common-refactor.scss"; -.viewport-actions { +.viewport-actions, +.viewport-actions-path { pointer-events: none; position: absolute; --actions-toolbar-position-y: #{$s-28}; @@ -15,40 +16,39 @@ top: calc(var(--actions-toolbar-position-y) + var(--actions-toolbar-offset-y)); left: 50%; z-index: $z-index-20; +} + +.viewport-actions-path { + z-index: $z-index-3; +} + +.viewport-actions-container { + @include flexRow; + background: var(--panel-background-color); + border-radius: $br-12; + box-shadow: 0 0 $s-12 0 var(--menu-shadow-color); + gap: $s-8; + height: $s-48; + margin-left: -50%; + padding: $s-8; + cursor: initial; + pointer-events: initial; + width: $s-400; + border: $s-2 solid var(--panel-border-color); +} + +.viewport-actions-title { + flex: 1; + font-size: $fs-12; + color: var(--color-foreground-secondary); + padding-left: $s-8; +} - .viewport-actions-container { - @include flexRow; - background: var(--panel-background-color); - border-radius: $br-12; - box-shadow: 0 0 $s-12 0 var(--menu-shadow-color); - gap: $s-8; - height: $s-48; - margin-left: -50%; - padding: $s-8; - cursor: initial; - pointer-events: initial; - width: $s-400; - } - - .viewport-actions-title { - flex: 1; - font-size: $fs-12; - color: var(--color-foreground-secondary); - padding-left: $s-8; - } - - .done-btn { - @extend .button-primary; - text-transform: uppercase; - padding: $s-8 $s-20; - font-size: $fs-11; - } - .close-btn { - @extend .button-tertiary; - svg { - @extend .button-icon; - } - } +.done-btn { + @extend .button-primary; + text-transform: uppercase; + padding: $s-8 $s-20; + font-size: $fs-11; } .viewport-actions-no-rulers { -- Gitee From 440495a1d0391b68bbe1e12abd8774af98937775 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Fri, 15 Mar 2024 17:27:51 +0100 Subject: [PATCH 0076/1266] :bug: Fix submenu positioning in context menu --- .../app/main/ui/workspace/context_menu.cljs | 25 +++++++++---------- .../app/main/ui/workspace/context_menu.scss | 18 ++++++++----- .../ui/workspace/viewport/path_actions.scss | 2 -- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/context_menu.cljs b/frontend/src/app/main/ui/workspace/context_menu.cljs index 21f06b71c..987052774 100644 --- a/frontend/src/app/main/ui/workspace/context_menu.cljs +++ b/frontend/src/app/main/ui/workspace/context_menu.cljs @@ -652,16 +652,15 @@ [:& dropdown {:show (boolean mdata) :on-close #(st/emit! dw/hide-context-menu)} - [:ul {:class (stl/css :workspace-context-menu) - :ref dropdown-ref - :style {:top top :left left} - :on-context-menu prevent-default} - - (case (:kind mdata) - :shape [:& shape-context-menu {:mdata mdata}] - :page [:& page-item-context-menu {:mdata mdata}] - :grid-track [:& grid-track-context-menu {:mdata mdata}] - :grid-cells [:& grid-cells-context-menu {:mdata mdata}] - [:& viewport-context-menu {:mdata mdata}])]])) - - + [:div {:class (stl/css :workspace-context-menu) + :ref dropdown-ref + :style {:top top :left left} + :on-context-menu prevent-default} + + [:ul {:class (stl/css :context-list)} + (case (:kind mdata) + :shape [:& shape-context-menu {:mdata mdata}] + :page [:& page-item-context-menu {:mdata mdata}] + :grid-track [:& grid-track-context-menu {:mdata mdata}] + :grid-cells [:& grid-cells-context-menu {:mdata mdata}] + [:& viewport-context-menu {:mdata mdata}])]]])) diff --git a/frontend/src/app/main/ui/workspace/context_menu.scss b/frontend/src/app/main/ui/workspace/context_menu.scss index 94b7060a0..b7ea96aa4 100644 --- a/frontend/src/app/main/ui/workspace/context_menu.scss +++ b/frontend/src/app/main/ui/workspace/context_menu.scss @@ -6,24 +6,30 @@ @import "refactor/common-refactor.scss"; -.workspace-context-menu, -.workspace-context-submenu { - @include menuShadow; +.workspace-context-menu { position: absolute; top: $s-40; left: $s-736; - display: flex; - flex-direction: column; + z-index: $z-index-4; +} + +.context-list, +.workspace-context-submenu { + @include menuShadow; + display: grid; width: $s-240; padding: $s-4; border-radius: $br-8; border: $s-2 solid var(--panel-border-color); background-color: var(--menu-background-color); - z-index: $z-index-4; max-height: 100vh; overflow-y: auto; } +.workspace-context-submenu { + position: absolute; +} + .separator { height: $s-12; } diff --git a/frontend/src/app/main/ui/workspace/viewport/path_actions.scss b/frontend/src/app/main/ui/workspace/viewport/path_actions.scss index 205cfa367..c5e5ecc1b 100644 --- a/frontend/src/app/main/ui/workspace/viewport/path_actions.scss +++ b/frontend/src/app/main/ui/workspace/viewport/path_actions.scss @@ -58,5 +58,3 @@ stroke: var(--pathbar-icon-color); } } - - -- Gitee From d6b60ce43acf318cc3603199ad56794fa7281453 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 15 Feb 2024 10:57:52 +0100 Subject: [PATCH 0077/1266] :bug: Fix rmap shape refs on components v2 migration --- backend/src/app/features/components_v2.clj | 94 +++++++++++++--------- 1 file changed, 56 insertions(+), 38 deletions(-) diff --git a/backend/src/app/features/components_v2.clj b/backend/src/app/features/components_v2.clj index 46d04636f..a798b54c7 100644 --- a/backend/src/app/features/components_v2.clj +++ b/backend/src/app/features/components_v2.clj @@ -731,43 +731,61 @@ (fn [file-data] ;; Remap shape-refs so that they point to the near main. ;; At the same time, if there are any dangling ref, detach the shape and its children. - (letfn [(fix-container [container] - (reduce fix-shape container (ctn/shapes-seq container))) - - (fix-shape [container shape] - (if (ctk/in-component-copy? shape) - ;; First look for the direct shape. - (let [root (ctn/get-component-shape (:objects container) shape) - libraries (assoc-in libraries [(:id file-data) :data] file-data) - library (get libraries (:component-file root)) - component (ctkl/get-component (:data library) (:component-id root) true) - direct-shape (ctf/get-component-shape (:data library) component (:shape-ref shape))] - (if (some? direct-shape) - ;; If it exists, there is nothing else to do. - container - ;; If not found, find the near shape. - (let [near-shape (d/seek #(= (:shape-ref %) (:shape-ref shape)) - (ctf/get-component-shapes (:data library) component))] - (if (some? near-shape) - ;; If found, update the ref to point to the near shape. - (ctn/update-shape container (:id shape) #(assoc % :shape-ref (:id near-shape))) - ;; If not found, it may be a fostered component. Try to locate a direct shape - ;; in the head component. - (let [head (ctn/get-head-shape (:objects container) shape) - library-2 (get libraries (:component-file head)) - component-2 (ctkl/get-component (:data library-2) (:component-id head) true) - direct-shape-2 (ctf/get-component-shape (:data library-2) component-2 (:shape-ref shape))] - (if (some? direct-shape-2) - ;; If it exists, there is nothing else to do. - container - ;; If not found, detach shape and all children. - ;; container - (detach-shape container shape))))))) - container))] - - (-> file-data - (update :pages-index update-vals fix-container) - (d/update-when :components update-vals fix-container)))) + (let [count (volatile! 0) + + fix-shape + (fn [container shape] + (if (ctk/in-component-copy? shape) + ;; First look for the direct shape. + (let [root (ctn/get-component-shape (:objects container) shape) + libraries (assoc-in libraries [(:id file-data) :data] file-data) + library (get libraries (:component-file root)) + component (ctkl/get-component (:data library) (:component-id root) true) + direct-shape (ctf/get-component-shape (:data library) component (:shape-ref shape))] + (if (some? direct-shape) + ;; If it exists, there is nothing else to do. + container + ;; If not found, find the near shape. + (let [near-shape (d/seek #(= (:shape-ref %) (:shape-ref shape)) + (ctf/get-component-shapes (:data library) component))] + (if (some? near-shape) + ;; If found, update the ref to point to the near shape. + (do + (vswap! count inc) + (ctn/update-shape container (:id shape) #(assoc % :shape-ref (:id near-shape)))) + ;; If not found, it may be a fostered component. Try to locate a direct shape + ;; in the head component. + (let [head (ctn/get-head-shape (:objects container) shape) + library-2 (get libraries (:component-file head)) + component-2 (ctkl/get-component (:data library-2) (:component-id head) true) + direct-shape-2 (ctf/get-component-shape (:data library-2) component-2 (:shape-ref shape))] + (if (some? direct-shape-2) + ;; If it exists, there is nothing else to do. + container + ;; If not found, detach shape and all children. + ;; container + (do + (vswap! count inc) + (detach-shape container shape)))))))) + container)) + + fix-container + (fn [container] + (reduce fix-shape container (ctn/shapes-seq container)))] + + [(-> file-data + (update :pages-index update-vals fix-container) + (d/update-when :components update-vals fix-container)) + @count])) + + remap-refs-recur + ;; remapping refs can generate cascade changes so we call it until no changes are done + (fn [file-data] + (loop [f-data file-data] + (let [[f-data count] (remap-refs f-data)] + (if (= count 0) + f-data + (recur f-data))))) fix-converted-copies (fn [file-data] @@ -993,8 +1011,8 @@ (remove-nested-roots) (add-not-nested-roots) (fix-components-without-id) - (remap-refs) (fix-converted-copies) + (remap-refs-recur) (wrap-non-group-component-roots) (detach-non-group-instance-roots) (transform-to-frames) -- Gitee From a5b156e0d609fd00bf94c2980c6628f8f4125742 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Wed, 13 Mar 2024 21:29:11 +0100 Subject: [PATCH 0078/1266] :bug: Fix change structure of comp doesn't update copies on another file --- .../src/app/common/files/changes_builder.cljc | 3 +- .../src/app/common/types/components_list.cljc | 7 +++- .../app/main/data/workspace/libraries.cljs | 40 +++++++++++++++---- 3 files changed, 40 insertions(+), 10 deletions(-) diff --git a/common/src/app/common/files/changes_builder.cljc b/common/src/app/common/files/changes_builder.cljc index d219fc365..b0ab2b5bd 100644 --- a/common/src/app/common/files/changes_builder.cljc +++ b/common/src/app/common/files/changes_builder.cljc @@ -732,7 +732,8 @@ :main-instance-id (:main-instance-id new-component) :main-instance-page (:main-instance-page new-component) :annotation (:annotation new-component) - :objects (:objects new-component)}) ;; this won't exist in components-v2 (except for deleted components) + :objects (:objects new-component) ;; this won't exist in components-v2 (except for deleted components) + :modified-at (:modified-at new-component)}) (update :undo-changes conj {:type :mod-component :id id :name (:name prev-component) diff --git a/common/src/app/common/types/components_list.cljc b/common/src/app/common/types/components_list.cljc index 1eefe3021..8165c2d23 100644 --- a/common/src/app/common/types/components_list.cljc +++ b/common/src/app/common/types/components_list.cljc @@ -48,7 +48,7 @@ (wrap-object-fn))))))) (defn mod-component - [file-data {:keys [id name path main-instance-id main-instance-page objects annotation]}] + [file-data {:keys [id name path main-instance-id main-instance-page objects annotation modified-at]}] (let [wrap-objects-fn cfeat/*wrap-with-objects-map-fn*] (d/update-in-when file-data [:components id] (fn [component] @@ -69,6 +69,9 @@ (some? objects) (assoc :objects objects) + (some? modified-at) + (assoc :modified-at modified-at) + (some? annotation) (assoc :annotation annotation) @@ -76,7 +79,7 @@ (dissoc :annotation)) diff (set/difference (ctk/diff-components component new-comp) - #{:annotation})] ;; The set of properties that doesn't mark a component as touched + #{:annotation :modified-at})] ;; The set of properties that doesn't mark a component as touched (if (empty? diff) new-comp diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index 2f0961b78..e9ea4ee5e 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -1186,6 +1186,26 @@ :callback do-update}] :tag :sync-dialog))))))) + +(defn touch-component + "Update the modified-at attribute of the component to now" + [id] + (dm/verify! (uuid? id)) + (ptk/reify ::touch-component + cljs.core/IDeref + (-deref [_] [id]) + + ptk/WatchEvent + (watch [it state _] + (let [data (get state :workspace-data) + changes (-> (pcb/empty-changes it) + (pcb/with-library-data data) + (pcb/update-component id #(assoc % :modified-at (dt/now))))] + (rx/of (dch/commit-changes {:origin it + :redo-changes (:redo-changes changes) + :undo-changes [] + :save-undo? false})))))) + (defn component-changed "Notify that the component with the given id has changed, so it needs to be updated in the current file and in the copies. And also update its thumbnails." @@ -1197,6 +1217,7 @@ ptk/WatchEvent (watch [_ _ _] (rx/of + (touch-component component-id) (launch-component-sync component-id file-id undo-group))))) (defn watch-component-changes @@ -1244,13 +1265,18 @@ (map (partial ch/components-changed old-data)) (reduce into #{})))] - (if (and (d/not-empty? changed-components) save-undo?) - (do (log/info :msg "DETECTED COMPONENTS CHANGED" - :ids (map str changed-components) - :undo-group undo-group) - - (->> (rx/from changed-components) - (rx/map #(component-changed % (:id old-data) undo-group)))) + (if (d/not-empty? changed-components) + (if save-undo? + (do (log/info :msg "DETECTED COMPONENTS CHANGED" + :ids (map str changed-components) + :undo-group undo-group) + + (->> (rx/from changed-components) + (rx/map #(component-changed % (:id old-data) undo-group)))) + ;; even if save-undo? is false, we need to update the :modified-date of the component + ;; (for example, for undos) + (->> (rx/from changed-components) + (rx/map #(touch-component %)))) (rx/empty))))) changes-s -- Gitee From 8363b86cfa87ff56dd0c0aa33292fce084ed8451 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Mon, 18 Mar 2024 15:48:22 +0100 Subject: [PATCH 0079/1266] :bug: Fix shadows lost on import export --- common/src/app/common/files/migrations.cljc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/common/src/app/common/files/migrations.cljc b/common/src/app/common/files/migrations.cljc index 8ba085780..105b64e5b 100644 --- a/common/src/app/common/files/migrations.cljc +++ b/common/src/app/common/files/migrations.cljc @@ -853,11 +853,11 @@ (defn migrate-up-44 [data] (letfn [(fix-shadow [shadow] - (if (string? (:color shadow)) - (let [color {:color (:color shadow) - :opacity 1}] - (assoc shadow :color color)) - shadow)) + (let [color (if (string? (:color shadow)) + {:color (:color shadow) + :opacity 1} + (d/without-nils (:color shadow)))] + (assoc shadow :color color))) (update-object [object] (d/update-when object :shadow -- Gitee From 0590336c71aacb0dda4530c8b26a180eb352cbd7 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 18 Mar 2024 15:40:46 +0100 Subject: [PATCH 0080/1266] :bug: Fix problem with order of operations --- .../src/app/main/data/workspace/modifiers.cljs | 5 +---- .../src/app/main/data/workspace/transforms.cljs | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/frontend/src/app/main/data/workspace/modifiers.cljs b/frontend/src/app/main/data/workspace/modifiers.cljs index b552bee67..302f3e6b2 100644 --- a/frontend/src/app/main/data/workspace/modifiers.cljs +++ b/frontend/src/app/main/data/workspace/modifiers.cljs @@ -546,10 +546,7 @@ :layout-padding-type :layout-gap :layout-item-margin - :layout-item-margin-type - :layout-grid-cells - :layout-grid-columns - :layout-grid-rows]}) + :layout-item-margin-type]}) ;; We've applied the text-modifier so we can dissoc the temporary data (fn [state] (update state :workspace-text-modifier #(apply dissoc % ids))) diff --git a/frontend/src/app/main/data/workspace/transforms.cljs b/frontend/src/app/main/data/workspace/transforms.cljs index c52cd2fbb..10515ac9c 100644 --- a/frontend/src/app/main/data/workspace/transforms.cljs +++ b/frontend/src/app/main/data/workspace/transforms.cljs @@ -606,11 +606,11 @@ (->> move-stream (rx/last) (rx/mapcat - (fn [[_ target-frame drop-index]] + (fn [[_ target-frame drop-index cell-data]] (let [undo-id (js/Symbol)] (rx/of (dwu/start-undo-transaction undo-id) - (move-shapes-to-frame ids target-frame drop-index) (dwm/apply-modifiers {:undo-transation? false}) + (move-shapes-to-frame ids target-frame drop-index cell-data) (finish-transform) (dwu/commit-undo-transaction undo-id)))))))))))))) @@ -832,7 +832,7 @@ :ignore-snap-pixel true})))))) (defn- move-shapes-to-frame - [ids frame-id drop-index] + [ids frame-id drop-index [row column :as cell]] (ptk/reify ::move-shapes-to-frame ptk/WatchEvent (watch [it state _] @@ -924,7 +924,16 @@ (pcb/update-shapes shape-ids-to-detach ctk/detach-shape) (pcb/change-parent frame-id moving-shapes drop-index) (cond-> (ctl/grid-layout? objects frame-id) - (-> (pcb/update-shapes [frame-id] ctl/assign-cell-positions {:with-objects? true}) + (-> (pcb/update-shapes + [frame-id] + (fn [frame objects] + (-> frame + ;; Assign the cell when pushing into a specific grid cell + (cond-> (some? cell) + (-> (ctl/push-into-cell moving-shapes-ids row column) + (ctl/assign-cells objects))) + (ctl/assign-cell-positions objects))) + {:with-objects? true}) (pcb/reorder-grid-children [frame-id]))) (pcb/remove-objects empty-parents))] -- Gitee From 5e89b1c1d0a8e92bdc22c42ffbba385f1316ad04 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 18 Mar 2024 16:02:52 +0100 Subject: [PATCH 0081/1266] :bug: Fix problem when dragging template to the dashboard --- frontend/src/app/main/ui/dashboard/templates.cljs | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/app/main/ui/dashboard/templates.cljs b/frontend/src/app/main/ui/dashboard/templates.cljs index 7fb943a88..7d2dd5a87 100644 --- a/frontend/src/app/main/ui/dashboard/templates.cljs +++ b/frontend/src/app/main/ui/dashboard/templates.cljs @@ -118,6 +118,7 @@ :id id :data-index index :on-click on-click + :on-mouse-down dom/prevent-default :on-key-down on-key-down} [:div {:class (stl/css :template-card)} [:div {:class (stl/css :img-container)} -- Gitee From 19b5baf7ee000d70c1f92e8a16464a3adfdf4734 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 18 Mar 2024 16:04:29 +0100 Subject: [PATCH 0082/1266] :bug: Fix scroll for import modal --- frontend/src/app/main/ui/dashboard/import.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/frontend/src/app/main/ui/dashboard/import.scss b/frontend/src/app/main/ui/dashboard/import.scss index a89dda6da..7708be6ef 100644 --- a/frontend/src/app/main/ui/dashboard/import.scss +++ b/frontend/src/app/main/ui/dashboard/import.scss @@ -12,6 +12,8 @@ .modal-container { @extend .modal-container-base; + display: flex; + flex-direction: column; } .modal-header { @@ -29,6 +31,9 @@ .modal-content { @include bodySmallTypography; + flex: 1; + overflow-y: auto; + overflow-x: hidden; display: grid; grid-template-columns: 1fr; gap: $s-16; -- Gitee From 38b72abf32f403859a63583f4a837267c51851a4 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Fri, 15 Mar 2024 11:57:17 +0100 Subject: [PATCH 0083/1266] :bug: Fix allow modify component copy structure under some circumstances --- .../src/app/main/data/workspace/shapes.cljs | 15 +-- .../app/main/ui/workspace/context_menu.cljs | 119 ++++++++++-------- 2 files changed, 72 insertions(+), 62 deletions(-) diff --git a/frontend/src/app/main/data/workspace/shapes.cljs b/frontend/src/app/main/data/workspace/shapes.cljs index 7febfef6f..4fabc4e80 100644 --- a/frontend/src/app/main/data/workspace/shapes.cljs +++ b/frontend/src/app/main/data/workspace/shapes.cljs @@ -353,13 +353,14 @@ (ptk/reify ::create-artboard-from-selection ptk/WatchEvent (watch [it state _] - (let [page-id (:current-page-id state) - objects (wsh/lookup-page-objects state page-id) - selected (wsh/lookup-selected state) - selected (cfh/clean-loops objects selected) - - changes (-> (pcb/empty-changes it page-id) - (pcb/with-objects objects)) + (let [page-id (:current-page-id state) + objects (wsh/lookup-page-objects state page-id) + selected (->> (wsh/lookup-selected state) + (cfh/clean-loops objects) + (remove #(ctn/has-any-copy-parent? objects (get objects %)))) + + changes (-> (pcb/empty-changes it page-id) + (pcb/with-objects objects)) [frame-shape changes] (cfsh/prepare-create-artboard-from-selection changes diff --git a/frontend/src/app/main/ui/workspace/context_menu.cljs b/frontend/src/app/main/ui/workspace/context_menu.cljs index 987052774..7f899e947 100644 --- a/frontend/src/app/main/ui/workspace/context_menu.cljs +++ b/frontend/src/app/main/ui/workspace/context_menu.cljs @@ -228,48 +228,54 @@ (mf/defc context-menu-group [{:keys [shapes]}] - (let [multiple? (> (count shapes) 1) - single? (= (count shapes) 1) - do-create-artboard-from-selection #(st/emit! (dwsh/create-artboard-from-selection)) + (let [multiple? (> (count shapes) 1) + single? (= (count shapes) 1) + + objects (deref refs/workspace-page-objects) + any-in-copy? (some true? (map #(ctn/has-any-copy-parent? objects %) shapes)) ;; components can't be ungrouped has-frame? (->> shapes (d/seek #(and (cfh/frame-shape? %) (not (ctk/instance-head? %))))) has-group? (->> shapes (d/seek #(and (cfh/group-shape? %) (not (ctk/instance-head? %))))) - has-bool? (->> shapes (d/seek cfh/bool-shape?)) - has-mask? (->> shapes (d/seek :masked-group)) + has-bool? (->> shapes (d/seek cfh/bool-shape?)) + has-mask? (->> shapes (d/seek :masked-group)) - is-group? (and single? has-group?) - is-bool? (and single? has-bool?) + is-group? (and single? has-group?) + is-bool? (and single? has-bool?) do-create-group #(st/emit! dw/group-selected) do-mask-group #(st/emit! dw/mask-group) do-remove-group #(st/emit! dw/ungroup-selected) - do-unmask-group #(st/emit! dw/unmask-group)] + do-unmask-group #(st/emit! dw/unmask-group) + do-create-artboard-from-selection + #(st/emit! (dwsh/create-artboard-from-selection))] [:* - (when (or has-bool? has-group? has-mask? has-frame?) - [:& menu-entry {:title (tr "workspace.shape.menu.ungroup") - :shortcut (sc/get-tooltip :ungroup) - :on-click do-remove-group}]) - - [:& menu-entry {:title (tr "workspace.shape.menu.group") - :shortcut (sc/get-tooltip :group) - :on-click do-create-group}] - - (when (or multiple? (and is-group? (not has-mask?)) is-bool?) - [:& menu-entry {:title (tr "workspace.shape.menu.mask") - :shortcut (sc/get-tooltip :mask) - :on-click do-mask-group}]) - - (when has-mask? - [:& menu-entry {:title (tr "workspace.shape.menu.unmask") - :shortcut (sc/get-tooltip :unmask) - :on-click do-unmask-group}]) - - [:& menu-entry {:title (tr "workspace.shape.menu.create-artboard-from-selection") - :shortcut (sc/get-tooltip :artboard-selection) - :on-click do-create-artboard-from-selection}] - [:& menu-separator]])) + (when (not any-in-copy?) + [:* + (when (or has-bool? has-group? has-mask? has-frame?) + [:& menu-entry {:title (tr "workspace.shape.menu.ungroup") + :shortcut (sc/get-tooltip :ungroup) + :on-click do-remove-group}]) + + [:& menu-entry {:title (tr "workspace.shape.menu.group") + :shortcut (sc/get-tooltip :group) + :on-click do-create-group}] + + (when (or multiple? (and is-group? (not has-mask?)) is-bool?) + [:& menu-entry {:title (tr "workspace.shape.menu.mask") + :shortcut (sc/get-tooltip :mask) + :on-click do-mask-group}]) + + (when has-mask? + [:& menu-entry {:title (tr "workspace.shape.menu.unmask") + :shortcut (sc/get-tooltip :unmask) + :on-click do-unmask-group}]) + + [:& menu-entry {:title (tr "workspace.shape.menu.create-artboard-from-selection") + :shortcut (sc/get-tooltip :artboard-selection) + :on-click do-create-artboard-from-selection}] + [:& menu-separator]])])) (mf/defc context-focus-mode-menu [{:keys []}] @@ -391,7 +397,9 @@ (mf/defc context-menu-layout {::mf/props :obj} [{:keys [shapes]}] - (let [single? (= (count shapes) 1) + (let [single? (= (count shapes) 1) + objects (deref refs/workspace-page-objects) + any-in-copy? (some true? (map #(ctn/has-any-copy-parent? objects %) shapes)) has-flex? (and single? (every? ctl/flex-layout? shapes)) @@ -414,29 +422,30 @@ (fn [_event] (let [ids (map :id shapes)] (st/emit! (dwsl/remove-layout ids)))))] - - (if (or ^boolean has-flex? - ^boolean has-grid?) - [:div - [:& menu-separator] - (if has-flex? - [:& menu-entry {:title (tr "workspace.shape.menu.remove-flex") - :shortcut (sc/get-tooltip :toggle-layout-flex) - :on-click on-remove-layout}] - [:& menu-entry {:title (tr "workspace.shape.menu.remove-grid") - :shortcut (sc/get-tooltip :toggle-layout-grid) - :on-click on-remove-layout}])] - - [:div - [:& menu-separator] - [:& menu-entry {:title (tr "workspace.shape.menu.add-flex") - :shortcut (sc/get-tooltip :toggle-layout-flex) - :value "flex" - :on-click on-add-layout}] - [:& menu-entry {:title (tr "workspace.shape.menu.add-grid") - :shortcut (sc/get-tooltip :toggle-layout-grid) - :value "grid" - :on-click on-add-layout}]]))) + [:* + (when (not any-in-copy?) + (if (or ^boolean has-flex? + ^boolean has-grid?) + [:div + [:& menu-separator] + (if has-flex? + [:& menu-entry {:title (tr "workspace.shape.menu.remove-flex") + :shortcut (sc/get-tooltip :toggle-layout-flex) + :on-click on-remove-layout}] + [:& menu-entry {:title (tr "workspace.shape.menu.remove-grid") + :shortcut (sc/get-tooltip :toggle-layout-grid) + :on-click on-remove-layout}])] + + [:div + [:& menu-separator] + [:& menu-entry {:title (tr "workspace.shape.menu.add-flex") + :shortcut (sc/get-tooltip :toggle-layout-flex) + :value "flex" + :on-click on-add-layout}] + [:& menu-entry {:title (tr "workspace.shape.menu.add-grid") + :shortcut (sc/get-tooltip :toggle-layout-grid) + :value "grid" + :on-click on-add-layout}]]))])) (mf/defc context-menu-component [{:keys [shapes]}] -- Gitee From 65fa434388e07fc38fa0b6b072c82cebf80be310 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Mon, 18 Mar 2024 14:16:19 +0100 Subject: [PATCH 0084/1266] :bug: Fix dahsboard project scroll --- .../src/app/main/ui/dashboard/projects.cljs | 20 +++++++++++++++---- .../src/app/main/ui/dashboard/projects.scss | 6 ++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/main/ui/dashboard/projects.cljs b/frontend/src/app/main/ui/dashboard/projects.cljs index 97667fef6..fc0a51f97 100644 --- a/frontend/src/app/main/ui/dashboard/projects.cljs +++ b/frontend/src/app/main/ui/dashboard/projects.cljs @@ -378,6 +378,7 @@ tutorial-viewed? (:viewed-tutorial? props true) walkthrough-viewed? (:viewed-walkthrough? props true) + is-my-penpot (= (:default-team-id profile) (:id team)) team-id (:id team) @@ -387,6 +388,7 @@ (st/emit! (du/update-profile-props {:team-hero? false}) (ptk/data-event ::ev/event {::ev/name "dont-show-team-up-hero" ::ev/origin "dashboard"})))) + close-tutorial (mf/use-fn (fn [] @@ -395,6 +397,7 @@ ::ev/origin "get-started-hero" :type "tutorial" :section "dashboard"})))) + close-walkthrough (mf/use-fn (fn [] @@ -402,7 +405,13 @@ (ptk/data-event ::ev/event {::ev/name "dont-show-walkthrough" ::ev/origin "get-started-hero" :type "walkthrough" - :section "dashboard"}))))] + :section "dashboard"})))) + + show-hero? (and is-my-penpot + (or (not tutorial-viewed?) + (not walkthrough-viewed?))) + + show-team-hero? (and (not is-my-penpot) team-hero?)] (mf/with-effect [team] (let [tname (if (:is-default team) @@ -423,8 +432,7 @@ [:& team-hero {:team team :close-fn close-banner}]) (when (and (contains? cf/flags :dashboard-templates-section) - (or (not tutorial-viewed?) - (not walkthrough-viewed?))) + show-hero?) [:div {:class (stl/css :hero-projects)} (when (and (not tutorial-viewed?) (:is-default team)) [:& tutorial-project @@ -435,7 +443,11 @@ [:& interface-walkthrough {:close-walkthrough close-walkthrough}])]) - [:div {:class (stl/css :dashboard-container :no-bg :dashboard-projects)} + [:div {:class (stl/css-case :dashboard-container true + :no-bg true + :dashboard-projects true + :with-hero show-hero? + :with-team-hero show-team-hero?)} (for [{:keys [id] :as project} projects] (let [files (when recent-map (->> (vals recent-map) diff --git a/frontend/src/app/main/ui/dashboard/projects.scss b/frontend/src/app/main/ui/dashboard/projects.scss index 105dabd50..eb73b2e89 100644 --- a/frontend/src/app/main/ui/dashboard/projects.scss +++ b/frontend/src/app/main/ui/dashboard/projects.scss @@ -17,6 +17,12 @@ .dashboard-projects { user-select: none; + height: calc(100vh - $s-64); +} + +.with-hero, +.with-team-hero { + height: calc(100vh - $s-280); } .dashboard-shared { -- Gitee From 0204cc5d407b216c7a6e2b233c418b4064189147 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Mon, 18 Mar 2024 16:28:54 +0100 Subject: [PATCH 0085/1266] :bug: Fix components background color --- frontend/resources/styles/common/refactor/design-tokens.scss | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/frontend/resources/styles/common/refactor/design-tokens.scss b/frontend/resources/styles/common/refactor/design-tokens.scss index a1527bf05..0088956e4 100644 --- a/frontend/resources/styles/common/refactor/design-tokens.scss +++ b/frontend/resources/styles/common/refactor/design-tokens.scss @@ -237,7 +237,7 @@ --assets-item-border-color: var(--color-accent-primary); --assets-item-background-color-drag: transparent; --assets-item-border-color-drag: var(--color-accent-primary-muted); - --assets-component-background-color: var(--color-foreground-secondary); + --assets-component-background-color: var(--color-canvas); --assets-component-background-color-disabled: var(--df-secondary;); --assets-component-border-color: var(--color-background-tertiary); --assets-component-border-selected: var(--color-accent-tertiary); @@ -419,8 +419,6 @@ } .light { - --assets-component-background-color: var(--color-background-secondary); - --tabs-background-color: var(--color-background-tertiary); --tab-background-color-selected: var(--color-background-primary); --tab-border-color: var(--color-background-tertiary); -- Gitee From 6b0314552430eb89239a7eb3cda253c54294ba92 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Mon, 18 Mar 2024 16:29:16 +0100 Subject: [PATCH 0086/1266] :bug: Fix height of v2 modal --- frontend/src/app/main/ui/workspace/libraries.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/app/main/ui/workspace/libraries.scss b/frontend/src/app/main/ui/workspace/libraries.scss index 6c430b0d8..fbd82a1f9 100644 --- a/frontend/src/app/main/ui/workspace/libraries.scss +++ b/frontend/src/app/main/ui/workspace/libraries.scss @@ -254,6 +254,7 @@ .modal-v2-info { width: $s-664; height: fit-content; + max-height: fit-content; } .modal-v2-title { -- Gitee From 94a0c1204901dab93b496df1b92d950c0ba10ef3 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 19 Mar 2024 08:22:47 +0100 Subject: [PATCH 0087/1266] :bug: Fix error when update email --- frontend/src/app/main/ui/settings/change_email.cljs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/main/ui/settings/change_email.cljs b/frontend/src/app/main/ui/settings/change_email.cljs index 5543f7d18..daeaf8bf8 100644 --- a/frontend/src/app/main/ui/settings/change_email.cljs +++ b/frontend/src/app/main/ui/settings/change_email.cljs @@ -39,8 +39,8 @@ (s/keys :req-un [::email-1 ::email-2])) (defn- on-error - [form {:keys [code] :as error}] - (case code + [form error] + (case (:code (ex-data error)) :email-already-exists (swap! form (fn [data] (let [error {:message (tr "errors.email-already-exists")}] @@ -93,7 +93,6 @@ (let [different-emails-error? (= (dma/get-in @form [:errors :email-2 :code]) :different-emails) email-1 (dma/get-in @form [:clean-data :email-1]) email-2 (dma/get-in @form [:clean-data :email-2])] - (println "different-emails-error?" (and different-emails-error? (= email-1 email-2))) (when (and different-emails-error? (= email-1 email-2)) (swap! form d/dissoc-in [:errors :email-2])))))] -- Gitee From cfe6fae77d416d0a587b0b61955c4b563b7c0113 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 19 Mar 2024 09:03:08 +0100 Subject: [PATCH 0088/1266] :bug: Fix incorrect version handling on file migration --- common/src/app/common/files/migrations.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/app/common/files/migrations.cljc b/common/src/app/common/files/migrations.cljc index 105b64e5b..b62521b8f 100644 --- a/common/src/app/common/files/migrations.cljc +++ b/common/src/app/common/files/migrations.cljc @@ -73,7 +73,7 @@ [{:keys [version] :as file}] (if (int? version) file - (let [version (or version (-> file :data :version))] + (let [version (or (-> file :data :version) 0)] (-> file (assoc :version version) (update :data dissoc :version))))) -- Gitee From ab0b3c71a8fad0cd2bd32b32bf9bfc6e32d51293 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 19 Mar 2024 07:32:13 +0100 Subject: [PATCH 0089/1266] :bug: Improve fixing root shapes for v1 components on migration to v2 --- backend/src/app/features/components_v2.clj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/src/app/features/components_v2.clj b/backend/src/app/features/components_v2.clj index a798b54c7..8e548466e 100644 --- a/backend/src/app/features/components_v2.clj +++ b/backend/src/app/features/components_v2.clj @@ -433,7 +433,8 @@ (letfn [(fix-component [components id component] (let [root-shape (ctst/get-shape component (:id component))] (if (or (empty? (:objects component)) - (nil? root-shape)) + (nil? root-shape) + (nil? (:type root-shape))) (dissoc components id) components)))] -- Gitee From 126bab3ce49b31601cb359e75f32dabf9d526bcf Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 19 Mar 2024 09:15:04 +0100 Subject: [PATCH 0090/1266] :bug: Fix invalid page name on compv2 migration --- backend/src/app/features/components_v2.clj | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/backend/src/app/features/components_v2.clj b/backend/src/app/features/components_v2.clj index 8e548466e..565d00320 100644 --- a/backend/src/app/features/components_v2.clj +++ b/backend/src/app/features/components_v2.clj @@ -215,10 +215,15 @@ (update :pages-index update-vals fix-container) (d/update-when :components update-vals fix-container)))) - fix-page-invalid-options + fix-invalid-page (fn [file-data] (letfn [(update-page [page] - (update page :options fix-options)) + (-> page + (update :name (fn [name] + (if (nil? name) + "Page" + name))) + (update :options fix-options))) (fix-background [options] (if (and (contains? options :background) @@ -993,7 +998,7 @@ (-> file-data (fix-file-data) - (fix-page-invalid-options) + (fix-invalid-page) (fix-misc-shape-issues) (fix-recent-colors) (fix-missing-image-metadata) -- Gitee From 67cdaa397caae2a8042c4cad03b121a81a713518 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 19 Mar 2024 11:21:16 +0100 Subject: [PATCH 0091/1266] :sparkles: Add minor improvements to devenv initial flags --- backend/scripts/repl | 6 ++---- backend/scripts/start-dev | 5 ++--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/backend/scripts/repl b/backend/scripts/repl index 4e454b761..6336331e4 100755 --- a/backend/scripts/repl +++ b/backend/scripts/repl @@ -4,7 +4,7 @@ export PENPOT_HOST=devenv export PENPOT_TENANT=dev export PENPOT_FLAGS="\ $PENPOT_FLAGS \ - enable-registration + enable-login-with-ldap \ enable-login-with-password enable-login-with-oidc \ enable-login-with-google \ @@ -28,9 +28,7 @@ export PENPOT_FLAGS="\ enable-access-tokens \ disable-feature-components-v2 \ enable-file-validation \ - enable-file-schema-validation \ - disable-soft-file-schema-validation \ - disable-soft-file-validation"; + enable-file-schema-validation"; # Setup default upload media file size to 100MiB diff --git a/backend/scripts/start-dev b/backend/scripts/start-dev index 89df83d96..1a2fa2842 100755 --- a/backend/scripts/start-dev +++ b/backend/scripts/start-dev @@ -15,13 +15,12 @@ export PENPOT_FLAGS="\ enable-feature-fdata-pointer-map \ enable-feature-fdata-objects-map \ disable-secure-session-cookies \ + enable-rpc-climit \ enable-smtp \ enable-access-tokens \ disable-feature-components-v2 \ enable-file-validation \ - enable-file-schema-validation \ - disable-soft-file-schema-validation \ - disable-soft-file-validation"; + enable-file-schema-validation"; export OPTIONS=" -A:jmx-remote -A:dev \ -- Gitee From e3f508d8d4b8d1c62425b0521dc7b478304574ca Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 19 Mar 2024 09:28:10 +0100 Subject: [PATCH 0092/1266] :bug: Fix problem with rendering SVG fills --- common/src/app/common/svg/shapes_builder.cljc | 7 ++- frontend/src/app/main/ui/shapes/attrs.cljs | 54 ++++++++++--------- .../src/app/main/ui/shapes/custom_stroke.cljs | 3 +- 3 files changed, 37 insertions(+), 27 deletions(-) diff --git a/common/src/app/common/svg/shapes_builder.cljc b/common/src/app/common/svg/shapes_builder.cljc index 1796d08a5..619a81b94 100644 --- a/common/src/app/common/svg/shapes_builder.cljc +++ b/common/src/app/common/svg/shapes_builder.cljc @@ -383,13 +383,16 @@ (update :svg-attrs dissoc :fill) (assoc-in [:fills 0 :fill-color] (clr/parse color-style))) - (dm/get-in shape [:svg-attrs :fillOpacity]) + ;; Only create an opacity if the color is setted. Othewise can create problems down the line + (and (or (clr/color-string? color-attr) (clr/color-string? color-style)) + (dm/get-in shape [:svg-attrs :fillOpacity])) (-> (update :svg-attrs dissoc :fillOpacity) (update-in [:svg-attrs :style] dissoc :fillOpacity) (assoc-in [:fills 0 :fill-opacity] (-> (dm/get-in shape [:svg-attrs :fillOpacity]) (d/parse-double 1)))) - (dm/get-in shape [:svg-attrs :style :fillOpacity]) + (and (or (clr/color-string? color-attr) (clr/color-string? color-style)) + (dm/get-in shape [:svg-attrs :style :fillOpacity])) (-> (update-in [:svg-attrs :style] dissoc :fillOpacity) (update :svg-attrs dissoc :fillOpacity) (assoc-in [:fills 0 :fill-opacity] (-> (dm/get-in shape [:svg-attrs :style :fillOpacity]) diff --git a/frontend/src/app/main/ui/shapes/attrs.cljs b/frontend/src/app/main/ui/shapes/attrs.cljs index 5c148d26d..15f99ddf4 100644 --- a/frontend/src/app/main/ui/shapes/attrs.cljs +++ b/frontend/src/app/main/ui/shapes/attrs.cljs @@ -62,32 +62,34 @@ (obj/merge! props (get-border-props shape))) (defn add-fill! - [attrs fill-data render-id index type] - (let [index (if (some? index) (dm/str "-" index) "")] - (cond - (contains? fill-data :fill-image) - (let [id (dm/str "fill-image-" render-id)] - (obj/set! attrs "fill" (dm/str "url(#" id ")"))) + ([attrs fill-data render-id index type] + (add-fill! attrs fill-data render-id index type "none")) + ([attrs fill-data render-id index type fill-default] + (let [index (if (some? index) (dm/str "-" index) "")] + (cond + (contains? fill-data :fill-image) + (let [id (dm/str "fill-image-" render-id)] + (obj/set! attrs "fill" (dm/str "url(#" id ")"))) - (some? (:fill-color-gradient fill-data)) - (let [id (dm/str "fill-color-gradient-" render-id index)] - (obj/set! attrs "fill" (dm/str "url(#" id ")"))) + (some? (:fill-color-gradient fill-data)) + (let [id (dm/str "fill-color-gradient-" render-id index)] + (obj/set! attrs "fill" (dm/str "url(#" id ")"))) - (contains? fill-data :fill-color) - (obj/set! attrs "fill" (:fill-color fill-data)) + (contains? fill-data :fill-color) + (obj/set! attrs "fill" (:fill-color fill-data)) - :else - (obj/set! attrs "fill" "none")) + :else + (obj/set! attrs "fill" fill-default)) - (when (contains? fill-data :fill-opacity) - (obj/set! attrs "fillOpacity" (:fill-opacity fill-data))) + (when (contains? fill-data :fill-opacity) + (obj/set! attrs "fillOpacity" (:fill-opacity fill-data))) - (when (and (= :text type) - (nil? (:fill-color-gradient fill-data)) - (nil? (:fill-color fill-data))) - (obj/set! attrs "fill" "black")) + (when (and (= :text type) + (nil? (:fill-color-gradient fill-data)) + (nil? (:fill-color fill-data))) + (obj/set! attrs "fill" "black")) - attrs)) + attrs))) (defn add-stroke! [attrs data render-id index open-path?] @@ -165,8 +167,10 @@ (obj/map->obj))))) (defn get-fill-style - [fill-data index render-id type] - (add-fill! #js {} fill-data render-id index type)) + ([fill-data index render-id type] + (add-fill! #js {} fill-data render-id index type)) + ([fill-data index render-id type fill-default] + (add-fill! #js {} fill-data render-id index type fill-default))) (defn add-fill-props! ([props shape render-id] @@ -242,8 +246,10 @@ (obj/set! style "fillOpacity" opacity))) ^boolean (d/not-empty? shape-fills) - (let [fill (nth shape-fills 0)] - (obj/merge! style (get-fill-style fill render-id 0 shape-type))) + (let [fill (nth shape-fills 0) + svg-fill (obj/get svg-attrs "fill") + fill-default (d/nilv svg-fill "none")] + (obj/merge! style (get-fill-style fill render-id 0 shape-type fill-default))) (and ^boolean (cfh/path-shape? shape) ^boolean (empty? shape-fills)) diff --git a/frontend/src/app/main/ui/shapes/custom_stroke.cljs b/frontend/src/app/main/ui/shapes/custom_stroke.cljs index 43c9d607a..11c430a2d 100644 --- a/frontend/src/app/main/ui/shapes/custom_stroke.cljs +++ b/frontend/src/app/main/ui/shapes/custom_stroke.cljs @@ -476,7 +476,8 @@ svg-attrs (attrs/get-svg-props shape render-id) style (-> (obj/get props "style") - (obj/clone)) + (obj/clone) + (obj/merge! (obj/get svg-attrs "style"))) props (mf/spread-props svg-attrs {:id stroke-id -- Gitee From ab3e2fd9c2123a393032f743667349f2e6e712d2 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Tue, 19 Mar 2024 11:02:59 +0100 Subject: [PATCH 0093/1266] :recycle: Remove unused CSS files --- .../styles/common/refactor/mixins.scss | 12 + frontend/resources/styles/main-default.scss | 14 - .../styles/main/layouts/inspect.scss | 161 ----- .../resources/styles/main/layouts/login.scss | 250 -------- .../resources/styles/main/layouts/viewer.scss | 101 --- .../styles/main/partials/activity-bar.scss | 77 --- .../styles/main/partials/context-menu.scss | 104 ---- .../styles/main/partials/dropdown.scss | 70 --- .../styles/main/partials/editable-label.scss | 30 - .../styles/main/partials/exception-page.scss | 83 --- .../resources/styles/main/partials/forms.scss | 390 ------------ .../styles/main/partials/project-bar.scss | 94 --- .../styles/main/partials/sidebar.scss | 575 ------------------ .../main/partials/signup-questions.scss | 190 ------ .../styles/main/partials/tab-container.scss | 45 -- .../styles/main/partials/user-settings.scss | 188 ------ .../src/app/main/ui/dashboard/sidebar.scss | 2 +- .../main/ui/viewer/inspect/right_sidebar.scss | 2 +- 18 files changed, 14 insertions(+), 2374 deletions(-) delete mode 100644 frontend/resources/styles/main/layouts/inspect.scss delete mode 100644 frontend/resources/styles/main/layouts/login.scss delete mode 100644 frontend/resources/styles/main/layouts/viewer.scss delete mode 100644 frontend/resources/styles/main/partials/activity-bar.scss delete mode 100644 frontend/resources/styles/main/partials/context-menu.scss delete mode 100644 frontend/resources/styles/main/partials/dropdown.scss delete mode 100644 frontend/resources/styles/main/partials/editable-label.scss delete mode 100644 frontend/resources/styles/main/partials/exception-page.scss delete mode 100644 frontend/resources/styles/main/partials/forms.scss delete mode 100644 frontend/resources/styles/main/partials/project-bar.scss delete mode 100644 frontend/resources/styles/main/partials/sidebar.scss delete mode 100644 frontend/resources/styles/main/partials/signup-questions.scss delete mode 100644 frontend/resources/styles/main/partials/tab-container.scss delete mode 100644 frontend/resources/styles/main/partials/user-settings.scss diff --git a/frontend/resources/styles/common/refactor/mixins.scss b/frontend/resources/styles/common/refactor/mixins.scss index 992380e57..1a9c06ab8 100644 --- a/frontend/resources/styles/common/refactor/mixins.scss +++ b/frontend/resources/styles/common/refactor/mixins.scss @@ -4,6 +4,18 @@ // // Copyright (c) KALEIDOS INC +@mixin font-face($style-name, $file, $weight: unquote("normal"), $style: unquote("normal")) { + $filepath: "/fonts/" + $file; + @font-face { + font-family: "#{$style-name}"; + src: + url($filepath + ".woff2") format("woff2"), + url($filepath + ".ttf") format("truetype"); + font-weight: unquote($weight); + font-style: unquote($style); + } +} + @mixin flexCenter { display: flex; justify-content: center; diff --git a/frontend/resources/styles/main-default.scss b/frontend/resources/styles/main-default.scss index 48c342b70..0f4f8e621 100644 --- a/frontend/resources/styles/main-default.scss +++ b/frontend/resources/styles/main-default.scss @@ -33,34 +33,20 @@ //################################################# @import "common/base"; -@import "main/layouts/login"; @import "main/layouts/main-layout"; @import "main/layouts/not-found"; -@import "main/layouts/viewer"; -@import "main/layouts/inspect"; //################################################# // Commons //################################################# @import "common/framework"; -@import "main/partials/forms"; @import "main/partials/texts"; -@import "main/partials/context-menu"; -@import "main/partials/dropdown"; //################################################# // Partials //################################################# -@import "main/partials/activity-bar"; @import "main/partials/debug-icons-preview"; -@import "main/partials/editable-label"; @import "main/partials/loader"; -@import "main/partials/project-bar"; -@import "main/partials/sidebar"; -@import "main/partials/tab-container"; -@import "main/partials/user-settings"; @import "main/partials/workspace"; -@import "main/partials/exception-page"; -@import "main/partials/signup-questions"; diff --git a/frontend/resources/styles/main/layouts/inspect.scss b/frontend/resources/styles/main/layouts/inspect.scss deleted file mode 100644 index bbf4d1556..000000000 --- a/frontend/resources/styles/main/layouts/inspect.scss +++ /dev/null @@ -1,161 +0,0 @@ -$width-left-toolbar: 48px; -$width-settings-bar: 256px; - -.inspect-layout { - height: 100vh; - display: grid; - grid-template-rows: 48px auto; - grid-template-columns: 1fr; - user-select: none; - - .viewer-header { - grid-column: 1 / span 1; - grid-row: 1 / span 1; - } - - .viewer-content { - grid-column: 1 / span 1; - grid-row: 2 / span 1; - } -} - -.fullscreen.inspect-layout.force-visible { - display: grid; - grid-template-rows: 1fr; - - & .viewer-header { - position: fixed; - top: 0; - transition: top 400ms ease 300ms; - margin-bottom: 0; - z-index: 10; - } - - & .viewer-bottom { - position: fixed; - bottom: 0; - transition: bottom 400ms ease 300ms; - z-index: 2; - } -} - -.fullscreen.inspect-layout:not(.force-visible) { - & .viewer-header { - width: 100%; - position: fixed; - top: -48px; - left: 0; - transition: top 400ms ease 300ms; - z-index: 10; - margin-bottom: 48px; - - &::after { - content: " "; - position: absolute; - width: 100%; - height: 1rem; - left: 0; - top: 48px; - } - } - - & .viewer-header:hover { - top: 0; - transition: top 200ms; - } - - & .viewer-bottom { - width: 100%; - position: fixed; - bottom: -48px; - left: 0; - transition: bottom 400ms ease 300ms; - z-index: 2; - &::after { - content: " "; - position: absolute; - width: 100%; - height: 1rem; - left: 0; - bottom: 0px; - } - } - - & .viewer-bottom:hover { - bottom: 0px; - transition: bottom 200ms; - } - - & .viewer-content { - grid-row: 1 / span 2; - } -} - -.inspect-layout { - .viewer-section { - flex-wrap: nowrap; - margin-top: 0; - &.fullscreen { - .settings-bar, - .settings-bar { - padding-top: 48px; - } - } - } - - .settings-bar { - width: $width-settings-bar; - - &.settings-bar-right, - &.settings-bar-left { - height: 100%; - position: relative; - left: unset; - right: unset; - - .settings-bar-inside { - padding-top: 0.5rem; - overflow-y: auto; - } - } - - &.settings-bar-right { - width: 100%; - grid-area: right-sidebar; - } - } - - .inspect-svg-wrapper { - flex: 1; - overflow: hidden; - flex-direction: column; - justify-content: flex-start; - position: relative; - } - - .inspect-svg-container { - display: grid; - width: 100%; - height: 100%; - overflow: auto; - align-items: center; - justify-content: safe center; - margin: 0 auto; - } -} - -.sidebar-container { - display: flex; - flex-direction: column; - width: var(--width, $width-settings-bar); - height: 100%; - overflow: hidden; - - & > .resize-area { - position: absolute; - width: 8px; - height: 100%; - z-index: 10; - cursor: ew-resize; - } -} diff --git a/frontend/resources/styles/main/layouts/login.scss b/frontend/resources/styles/main/layouts/login.scss deleted file mode 100644 index cee660c18..000000000 --- a/frontend/resources/styles/main/layouts/login.scss +++ /dev/null @@ -1,250 +0,0 @@ -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. -// -// Copyright (c) KALEIDOS INC - -// TODO: rename to auth.scss - -.auth { - display: grid; - grid-template-rows: auto; - grid-template-columns: 33% auto; - height: 100vh; - overflow-y: scroll; -} - -.auth-sidebar { - grid-column: 1 / span 1; - height: 100vh; - display: flex; - padding-top: 7vh; - flex-direction: column; - align-items: center; - justify-content: flex-start; - background-color: #151035; - background-image: url("/images/login-penpot.svg"); - background-position: center 30vh; - background-size: 96%; - background-repeat: no-repeat; - - .tagline { - text-align: center; - width: 280px; - font-size: $fs18; - margin-top: 2vh; - color: white; - } - - .logo { - svg { - fill: white; - max-width: 11vw; - height: 80px; - } - .hidden-name { - visibility: hidden; - width: 0; - height: 0; - float: left; - } - } -} - -.auth-content { - grid-column: 2 / span 1; - background-color: $color-white; - display: flex; - align-items: center; - justify-content: center; - position: relative; - - .form-container { - width: 412px; - flex-direction: column; - margin-bottom: 30px; - .auth-buttons { - margin: $size-6 0 $size-4 0; - display: flex; - justify-content: center; - column-gap: 17px; - } - - form { - margin: 2rem 0 0.5rem 0; - .accept-terms-and-privacy-wrapper { - position: relative; - .input-checkbox { - margin-bottom: 0; - } - .input-checkbox input[type="checkbox"] { - position: absolute; - display: block; - width: 20px; - height: 20px; - opacity: 0; - top: 22px; - } - label { - margin-left: 40px; - } - label:before { - position: absolute; - top: 15px; - left: -36px; - } - label:after { - position: absolute; - top: 15px; - left: -33px; - } - .input-checkbox input[type="checkbox"]:focus { - opacity: 100%; - } - .auth-links { - margin-left: 40px; - font-size: 0.75rem; - } - } - } - } - - input { - margin-bottom: 0px; - } - - .buttons-stack { - display: flex; - flex-direction: column; - width: 100%; - - *:not(:last-child) { - margin-bottom: $size-4; - } - } - - .btn-large { - flex-grow: 1; - font-size: $fs14; - font-style: normal; - font-weight: $fw400; - } - - .btn-google-auth { - background-color: #4285f4; - color: $color-white; - margin-bottom: $size-4; - text-decoration: none; - .logo { - width: 20px; - height: 20px; - margin-right: 1rem; - } - &:hover, - &:focus { - background-color: #2065d7; - color: $color-white; - } - } - - .btn-gitlab-auth { - background-color: #fc6d26; - color: $color-white; - margin-bottom: $size-4; - text-decoration: none; - - .logo { - width: 20px; - height: 20px; - margin-right: 1rem; - } - - &:hover, - &:focus { - background-color: #ee5f18; - color: $color-white; - } - } - - .btn-github-auth { - background-color: #4c4c4c; - color: $color-white; - margin-bottom: $size-4; - text-decoration: none; - - .logo { - width: 20px; - height: 20px; - margin-right: 1rem; - } - - &:hover, - &:focus { - background-color: #2f2f2f; - color: $color-white; - } - } - - .link-oidc { - text-align: center; - } - - .separator { - display: flex; - justify-content: center; - width: 100%; - text-transform: uppercase; - text-align: center; - - .text { - margin: 0 10px; - color: $color-gray-40; - } - - .line { - border: 1px solid $color-gray-10; - flex-grow: 10; - margin: auto; - } - } - - .links { - display: flex; - font-size: $fs14; - flex-direction: column; - justify-content: space-between; - margin-top: $size-4; - margin-bottom: $size-4; - - &.demo { - justify-content: center; - margin-top: $size-5; - } - - .link-entry { - font-size: $fs14; - color: $color-gray-40; - margin-bottom: 10px; - a { - font-size: $fs14; - font-weight: $fw500; - color: $color-gray-50; - &:hover, - &:focus { - text-decoration: underline; - } - } - } - } - - .terms-login { - bottom: $size-5; - font-size: $fs14; - position: absolute; - - span { - margin: 0 $size-2; - color: $color-gray-40; - } - } -} diff --git a/frontend/resources/styles/main/layouts/viewer.scss b/frontend/resources/styles/main/layouts/viewer.scss deleted file mode 100644 index 840c2b559..000000000 --- a/frontend/resources/styles/main/layouts/viewer.scss +++ /dev/null @@ -1,101 +0,0 @@ -.viewer-layout { - height: 100vh; - display: grid; - grid-template-rows: 48px auto; - grid-template-columns: 1fr; - user-select: none; - - .viewer-header { - grid-column: 1 / span 1; - grid-row: 1 / span 1; - } - - .viewer-content { - grid-column: 1 / span 1; - grid-row: 2 / span 1; - } -} - -.fullscreen.viewer-layout.force-visible { - grid-template-rows: 1fr; - & .viewer-header { - position: fixed; - top: 0; - transition: top 400ms ease 300ms; - margin-bottom: 0; - z-index: 2; - } - - & .viewer-bottom { - position: fixed; - bottom: 0; - transition: bottom 400ms ease 300ms; - z-index: 2; - } -} - -.fullscreen.viewer-layout:not(.force-visible) { - grid-template-rows: 1fr; - & .viewer-header { - width: 100%; - position: fixed; - top: -48px; - left: 0; - transition: top 400ms ease 300ms; - z-index: 2; - margin-bottom: 48px; - &::after { - content: " "; - position: absolute; - width: 100%; - height: 1rem; - left: 0; - top: 48px; - } - } - - & .viewer-header:hover { - top: 0; - transition: top 200ms; - } - - & .viewer-bottom { - width: 100%; - position: fixed; - bottom: -48px; - left: 0; - transition: bottom 400ms ease 300ms; - z-index: 2; - &::after { - content: " "; - position: absolute; - width: 100%; - height: 1rem; - left: 0; - bottom: 0px; - } - } - - & .viewer-bottom:hover { - bottom: 0px; - transition: bottom 200ms; - } - - & .viewer-content { - grid-row: 1 / span 2; - } -} - -.viewer-overlay { - position: absolute; -} - -.viewer-overlay-background { - position: absolute; - top: 0; - left: 0; - - &.visible { - background-color: rgb(0, 0, 0, 0.2); - } -} diff --git a/frontend/resources/styles/main/partials/activity-bar.scss b/frontend/resources/styles/main/partials/activity-bar.scss deleted file mode 100644 index 5e5ad957b..000000000 --- a/frontend/resources/styles/main/partials/activity-bar.scss +++ /dev/null @@ -1,77 +0,0 @@ -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. -// -// Copyright (c) KALEIDOS INC - -.activity-bar { - background-color: $color-gray-50; - bottom: 0; - height: 100%; - position: fixed; - right: 0; - width: 250px; - - .activity-bar-inside { - align-items: center; - display: flex; - flex-direction: column; - overflow-y: auto; - padding-top: 70px; - } - - h4 { - color: $color-gray-40; - font-size: $fs16; - font-weight: $fw700; - margin-bottom: $size-1; - } - - .date-ribbon { - background-color: lighten($color-gray-20, 12%); - color: $color-white; - font-size: $fs12; - font-weight: $fw700; - padding: 2px; - text-align: center; - width: 100%; - } - - .activity-input { - border-bottom: 1px solid $color-gray-10; - display: flex; - font-size: $fs12; - padding: $size-2; - width: 100%; - - img.activity-author { - border-radius: 50%; - flex-shrink: 0; - height: 30px; - margin-right: $size-4; - width: 30px; - } - - .activity-content { - display: flex; - flex-direction: column; - - .activity-project { - align-items: center; - display: flex; - flex-wrap: wrap; - - a { - font-weight: $fw700; - margin: 0 3px; - } - } - - .activity-time { - color: $color-gray-20; - font-size: $fs12; - font-style: italic; - } - } - } -} diff --git a/frontend/resources/styles/main/partials/context-menu.scss b/frontend/resources/styles/main/partials/context-menu.scss deleted file mode 100644 index 3f4e3f0dd..000000000 --- a/frontend/resources/styles/main/partials/context-menu.scss +++ /dev/null @@ -1,104 +0,0 @@ -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. -// -// Copyright (c) KALEIDOS INC - -.context-menu { - position: relative; - visibility: hidden; - opacity: 0; - z-index: 3; -} - -.context-menu.is-open { - position: relative; - display: block; - opacity: 1; - visibility: visible; -} - -.context-menu.fixed { - position: fixed; -} - -.context-menu-items { - background: $color-white; - border-radius: $br3; - box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.25); - left: -$size-4; - max-height: 30rem; - min-width: 7rem; - overflow: auto; - position: absolute; - top: $size-3; - - & .separator { - border-top: 1px solid $color-gray-10; - padding: 0px; - margin: 2px; - } - - &.min-width { - min-width: 13rem; - } -} - -.context-menu-action { - color: $color-black; - display: block; - font-size: $fs14; - font-weight: $fw400; - padding: $size-2 $size-4; - text-align: left; - white-space: nowrap; - - &:hover { - color: $color-black; - background-color: $color-primary-lighter; - text-decoration: none; - } - - &.submenu { - display: flex; - align-items: center; - justify-content: space-between; - - & span { - margin-left: 0.5rem; - } - - & svg { - height: 10px; - width: 10px; - } - } - - &.submenu-back { - color: $color-black; - display: flex; - font-weight: $fw700; - align-items: center; - - & svg { - height: 10px; - width: 10px; - transform: rotate(180deg); - margin-right: $size-2; - } - } -} - -.context-menu.is-selectable { - & .context-menu-action { - padding-left: 1.5rem; - } - - & .context-menu-item.is-selected .context-menu-action { - background-image: url(/images/icons/tick.svg); - background-repeat: no-repeat; - background-position: 5% 48%; - background-size: 10px; - font-weight: $fw700; - } -} diff --git a/frontend/resources/styles/main/partials/dropdown.scss b/frontend/resources/styles/main/partials/dropdown.scss deleted file mode 100644 index ed3a2817f..000000000 --- a/frontend/resources/styles/main/partials/dropdown.scss +++ /dev/null @@ -1,70 +0,0 @@ -.dropdown { - position: absolute; - max-height: 30rem; - background-color: $color-white; - border-radius: $br2; - box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.25); - z-index: 3; - - hr { - margin: 0 !important; - border-color: $color-gray-10; - } - - > li { - display: flex; - align-items: center; - color: $color-gray-60; - cursor: pointer; - font-size: $fs14; - height: 40px; - padding: 5px 16px; - - &.warning { - color: $color-danger; - } - - svg { - fill: $color-gray-20; - height: 12px; - width: 12px; - } - - &.title { - font-weight: $fw600; - cursor: default; - } - - &:hover { - background-color: $color-primary-lighter; - } - - &:focus { - border: 1px black solid; - } - } - - &.with-check { - > li { - padding: 5px 10px; - } - - > li:not(.selected) { - svg { - display: none; - } - } - - svg { - fill: $color-gray-50; - } - - .icon { - display: flex; - align-items: center; - width: 20px; - height: 20px; - margin-right: 7px; - } - } -} diff --git a/frontend/resources/styles/main/partials/editable-label.scss b/frontend/resources/styles/main/partials/editable-label.scss deleted file mode 100644 index db2d42a89..000000000 --- a/frontend/resources/styles/main/partials/editable-label.scss +++ /dev/null @@ -1,30 +0,0 @@ -.editable-label { - display: flex; - - &.is-hidden { - display: none; - } -} - -.editable-label-input { - border: 0; - height: 30px; - padding: 5px; - margin: 0; - width: 100%; - background-color: $color-white; -} - -.editable-label-close { - background-color: $color-white; - cursor: pointer; - padding: 3px 5px; - - & svg { - fill: $color-gray-30; - height: 15px; - transform: rotate(45deg) translateY(7px); - width: 15px; - margin: 0; - } -} diff --git a/frontend/resources/styles/main/partials/exception-page.scss b/frontend/resources/styles/main/partials/exception-page.scss deleted file mode 100644 index 30686023a..000000000 --- a/frontend/resources/styles/main/partials/exception-page.scss +++ /dev/null @@ -1,83 +0,0 @@ -.exception-layout { - display: grid; - - grid-template-rows: 120px auto; - grid-template-columns: 1fr; -} - -.exception-header { - grid-column: 1 / span 1; - grid-row: 1 / span 1; - - display: flex; - align-items: center; - padding: 32px; - z-index: 40; - - cursor: pointer; - - svg { - height: 55px; - width: 170px; - } -} - -.exception-content { - grid-column: 1 / span 1; - grid-row: 1 / span 2; - height: 100vh; - - display: flex; - justify-content: center; - align-items: center; - - .container { - max-width: 600px; - } - - .image { - align-items: center; - display: flex; - justify-content: center; - margin-bottom: 2rem; - - svg { - height: 220px; - width: 220px; - } - } - - .main-message { - color: $color-black; - font-size: $fs80; - line-height: $lh-188; // Original value was 150px; 150px/80px = 187.5 % => $lh-188 (rounded) - text-align: center; - } - - .desc-message { - color: $color-black; - font-size: $fs26; - font-weight: $fw300; - text-align: center; - } - - .sign-info { - margin-top: 20px; - color: $color-black; - font-size: $fs16; - font-weight: $fw200; - text-align: center; - - display: flex; - flex-direction: column; - align-items: center; - - b { - font-weight: $fw400; - } - - .btn-primary { - margin-top: 15px; - } - } -} diff --git a/frontend/resources/styles/main/partials/forms.scss b/frontend/resources/styles/main/partials/forms.scss deleted file mode 100644 index 4d42d4c31..000000000 --- a/frontend/resources/styles/main/partials/forms.scss +++ /dev/null @@ -1,390 +0,0 @@ -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. -// -// Copyright (c) KALEIDOS INC - -input, -select, -textarea { - &.invalid { - border-color: $color-danger; - color: $color-danger; - } -} - -.form-container, -.generic-form { - display: flex; - justify-content: center; - flex-direction: column; - - .forms-container { - display: flex; - margin-top: 40px; - width: 536px; - justify-content: center; - } - - form { - display: flex; - flex-direction: column; - // flex-basis: 368px; - } - - .fields-row { - margin-bottom: 20px; - flex-direction: column; - - .options { - display: flex; - justify-content: flex-end; - font-size: $fs14; - margin-top: 13px; - } - } - - .field { - margin-bottom: 20px; - } - - h1 { - font-size: $fs36; - color: #2c233e; - margin-bottom: 20px; - } - - .subtitle { - font-size: $fs24; - color: #2c233e; - margin-bottom: 20px; - } - - .notification-icon { - justify-content: center; - display: flex; - margin-bottom: 3rem; - - svg { - fill: $color-gray-60; - height: 40%; - width: 40%; - } - } - - .notification-text { - font-size: $fs18; - color: $color-gray-60; - margin-bottom: 20px; - } - - .notification-text-email { - background: $color-gray-10; - border-radius: $br3; - color: $color-gray-60; - font-size: $fs18; - font-weight: $fw500; - margin: 1.5rem 0 2.5rem 0; - padding: 1rem; - text-align: center; - } - - h2 { - font-size: $fs24; - color: $color-gray-60; - // height: 40px; - display: flex; - align-items: center; - } - - a { - &:hover { - text-decoration: underline; - } - } - - p { - color: $color-gray-60; - } - - hr { - border-color: $color-gray-20; - } -} - -.custom-input { - display: flex; - flex-direction: column; - position: relative; - - input, - textarea { - background-color: $color-white; - border-radius: $br2; - border: 1px solid $color-gray-20; - color: $color-gray-60; - font-size: $fs14; - height: 40px; - margin: 0; - padding: 15px 15px 0 15px; - width: 100%; - } - - textarea { - height: auto; - font-size: $fs14; - font-family: "worksans", sans-serif; - padding-top: 20px; - } - - // Makes the background for autocomplete white - input:-webkit-autofill, - input:-webkit-autofill:hover, - input:-webkit-autofill:focus, - input:-webkit-autofill:active { - -webkit-box-shadow: 0 0 0 30px $color-white inset !important; - } - - label { - font-size: $fs12; - color: $color-gray-50; - position: absolute; - left: 15px; - top: 6px; - } - - &.invalid { - input { - border-color: $color-danger; - } - label { - color: $color-danger; - } - } - - &.valid { - input { - border-color: $color-success; - } - } - - &.focus { - input { - border-color: $color-gray-60; - } - } - - &.disabled { - input { - background-color: lighten($color-gray-10, 5%); - user-select: none; - } - } - - &.empty { - input { - padding-top: 0; - } - - label { - clip: rect(0 0 0 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - width: 1px; - } - } - - &.with-icon { - input { - padding-right: 50px; - } - } - - .help-icon { - position: absolute; - right: 15px; - top: 12px; - display: flex; - justify-content: center; - align-items: center; - svg { - fill: $color-gray-30; - width: 15px; - height: 15px; - } - } - - .hint { - color: $color-gray-40; - padding: 4px; - font-size: $fs12; - } - - .error { - color: $color-danger; - padding: 4px; - font-size: $fs12; - } -} - -.custom-multi-input { - border-radius: $br2; - border: 1px solid $color-gray-20; - max-height: 300px; - overflow-y: auto; - - &.invalid { - label { - color: unset; - } - } - - input { - border: 0px; - - &.no-padding { - padding-top: 0px; - } - } - - .selected-items { - padding-top: 25px; - padding-left: 15px; - display: flex; - flex-wrap: wrap; - } - - .selected-item { - width: 100%; - - &:not(:last-child) { - margin-right: 3px; - } - - .around { - border: 1px solid $color-gray-20; - padding-left: 5px; - border-radius: $br4; - &.invalid { - border: 1px solid $color-danger; - } - &.caution { - border: 1px solid $color-warning; - } - - .text { - display: inline-block; - max-width: 85%; - overflow: hidden; - text-overflow: ellipsis; - line-height: $lh-115; // Original value was 16px; 16px/14px = 114.285714286% => $lh-115 (rounded) - font-size: $fs14; - color: $color-black; - } - .icon { - cursor: pointer; - margin-left: 10px; - margin-right: 5px; - } - } - } -} - -.custom-select { - display: flex; - flex-direction: column; - position: relative; - justify-content: center; - - label { - font-size: $fs12; - color: $color-gray-30; - } - - select { - cursor: pointer; - font-size: $fs14; - border: 0px; - opacity: 0; - z-index: 10; - padding: 0px; - margin: 0px; - background-color: transparent; - position: absolute; - width: calc(100% - 1px); - height: 100%; - padding: 15px; - } - - .main-content { - flex-grow: 1; - display: flex; - flex-direction: column; - font-family: "worksans", sans-serif; - justify-content: center; - padding-top: 6px; - padding-bottom: 6px; - padding-left: 15px; - } - - .input-container { - display: flex; - flex-direction: row; - - background-color: $color-white; - border-radius: $br2; - border: 1px solid $color-gray-20; - height: 40px; - - &.focus { - border-color: $color-gray-60; - } - - &.invalid { - border-color: $color-danger; - label { - color: $color-danger; - } - } - - &.valid { - border-color: $color-success; - } - - &.focus { - border-color: $color-gray-60; - } - - &.disabled { - background-color: $color-gray-10; - user-select: none; - } - } - - .value { - color: $color-gray-60; - font-size: $fs14; - width: 100%; - border: 0px; - padding: 0px; - margin: 0px; - } - - .icon { - display: flex; - justify-content: center; - align-items: center; - padding-left: 10px; - padding-right: 10px; - pointer-events: none; - - svg { - fill: $color-gray-30; - transform: rotate(90deg); - width: 15px; - height: 15px; - } - } -} diff --git a/frontend/resources/styles/main/partials/project-bar.scss b/frontend/resources/styles/main/partials/project-bar.scss deleted file mode 100644 index dc8e76130..000000000 --- a/frontend/resources/styles/main/partials/project-bar.scss +++ /dev/null @@ -1,94 +0,0 @@ -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. -// -// Copyright (c) KALEIDOS INC - -.project-bar { - background-color: $color-gray-50; - border-right: 1px solid $color-gray-10; - bottom: 0; - height: 100%; - left: 50px; - position: fixed; - width: 200px; - z-index: 9; - - &.toggle { - left: -201px; - } - - .project-bar-inside { - align-items: center; - display: flex; - flex-direction: column; - overflow-y: auto; - padding-top: 60px; - - .project-name { - border-bottom: 1px solid $color-gray-10; - font-size: $fs14; - font-weight: $fw700; - padding: 0 $size-2; - width: 100%; - } - - .btn-primary, - .btn-warning, - .btn-danger { - font-size: $fs12; - margin-bottom: 0.5rem; - padding: 8px $size-2; - width: 90%; - } - } -} - -.tree-view { - width: 100%; - - li { - align-items: center; - cursor: pointer; - display: flex; - padding: $size-1 $size-2; - position: relative; - - svg { - fill: $color-gray-20; - height: 12px; - margin-right: $size-1; - width: 12px; - } - - span { - font-size: $fs12; - } - - &:hover, - &.current { - span { - color: $color-primary; - } - } - - .options { - align-items: center; - position: absolute; - display: flex; - right: 0; - top: 40%; - - svg { - fill: $color-gray-20; - height: 12px; - margin-right: $size-2; - width: 12px; - - &:hover { - fill: $color-gray-40; - } - } - } - } -} diff --git a/frontend/resources/styles/main/partials/sidebar.scss b/frontend/resources/styles/main/partials/sidebar.scss deleted file mode 100644 index 241682f4c..000000000 --- a/frontend/resources/styles/main/partials/sidebar.scss +++ /dev/null @@ -1,575 +0,0 @@ -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. -// -// Copyright (c) KALEIDOS INC - -.settings-bar { - background-color: $color-gray-50; - border-left: 1px solid $color-gray-60; - position: relative; - - &.settings-bar-left { - border-left: none; - border-right: 1px solid $color-gray-60; - - & .tab-container-tabs { - padding-left: 1.5rem; - } - } - - .settings-bar-inside { - display: grid; - grid-template-columns: 100%; - grid-template-rows: 100%; - height: calc(100% - 2px); - - .tool-window { - position: relative; - border-bottom: 1px solid $color-gray-60; - display: flex; - flex-direction: column; - flex: 1; - width: 100%; - height: 100%; - - .tool-window-bar { - align-items: center; - display: flex; - flex-shrink: 0; - padding: $size-2; - overflow: hidden; - margin: 0; - - svg { - fill: $color-gray-20; - height: 12px; - width: 12px; - } - - button, - div { - border: none; - background-color: transparent; - color: $color-gray-10; - font-size: $fs14; - max-width: 100%; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - - span.pages-title { - color: #e3e3e3; - font-size: 0.875rem; - max-width: 100%; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - - span.tool-badge { - border: 1px solid $color-primary; - border-radius: $br2; - font-size: $fs10; - color: $color-primary; - padding: 2px 4px; - margin-left: auto; - } - - span.tool-link, - span.shared-library { - margin-left: auto; - padding-left: 17px; - display: flex; - - svg { - fill: $color-gray-30; - height: 20px; - width: 20px; - } - } - - span.tool-link:hover svg { - fill: $color-primary; - } - - span.library-title { - color: $color-gray-10; - font-size: $fs14; - max-width: 100%; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - &:first-letter { - text-transform: uppercase; - } - } - - .tool-window-bar-icon { - height: 21px; - display: flex; - align-items: center; - justify-content: center; - - svg { - width: 15px; - height: 15px; - } - } - - &.big { - height: 3rem; - padding-bottom: 1rem; - } - - .tool-window-bar-title { - font-size: $fs14; - margin-left: 0.5rem; - } - - .tool-window-icon { - margin-right: $size-2; - display: none; - } - - .tool-window-close { - cursor: pointer; - margin-left: auto; - transform: rotate(45deg); - - &:hover { - svg { - fill: $color-danger; - } - } - } - - & .view-only-mode { - color: $color-primary; - border: 1px solid $color-primary; - border-radius: $br3; - font-size: $fs10; - text-transform: uppercase; - display: flex; - align-items: center; - justify-content: center; - margin-left: auto; - padding: 0.25rem; - } - } - } - } - - .empty { - color: $color-gray-20; - font-size: $fs12; - line-height: $lh-150; - text-align: center; - padding: 0 15px; - display: flex; - flex-direction: column; - gap: 20px; - margin-top: 12px; - - .tool-window-bar-icon { - height: 32px; - display: flex; - align-items: center; - justify-content: center; - margin-top: 16px; - } - - svg { - width: 32px; - height: 32px; - fill: $color-gray-30; - } - - .btn-primary { - margin-top: 10px; - background-color: $color-gray-60; - color: $color-gray-10; - &:hover { - background-color: $color-primary; - color: $color-black; - } - } - } - - & > .resize-area { - position: absolute; - width: 8px; - height: 100%; - z-index: 10; - cursor: ew-resize; - } - - &.settings-bar-left > .resize-area { - right: -8px; - } - - &.settings-bar-right > .resize-area { - left: -4px; - } -} - -.tool-window-content { - display: flex; - flex-direction: column; - height: 100%; - width: 100%; - overflow-y: auto; - overflow-x: hidden; - &.inspect { - .tab-container-tabs { - padding-bottom: 0.5rem; - background-color: $color-gray-50; - border-bottom: 1px solid $color-gray-60; - height: 3rem; - } - - .tab-container-tab-title { - border-radius: $br4; - - &.current { - background-color: $color-primary; - color: black; - } - } - } -} - -.element-list { - margin: 0; - width: 100%; - - ul { - border-left: 9px solid $color-gray-50; - margin: 0 0 0 0.4rem; - - li { - border-left: 1px solid $color-gray-40; - } - } - - li { - cursor: pointer; - display: flex; - flex-direction: column; - width: 100%; - padding-top: 1px; - padding-bottom: 1px; - - &.open { - ul { - li { - .element-list-body { - border-style: dashed; - } - } - } - } - } -} - -.element-list.pages-list { - max-height: 10rem; - - .context-menu { - position: fixed; - } - - .context-menu-items { - border: none; - margin: none; - } - - .context-menu-action { - width: 100%; - } -} - -button.collapse-sidebar { - background: none; - border: none; - cursor: pointer; - height: 2.5rem; - padding-top: 0.75rem; - position: absolute; - width: 1rem; - - & svg { - width: 12px; - height: 12px; - fill: $color-gray-20; - transform: rotate(180deg); - } - - &.collapsed { - background: $color-gray-60; - left: 48px; - top: 48px; - width: 28px; - height: 48px; - padding: 0; - border-radius: 0 $br4 $br4 0; - border-left: 1px solid $color-gray-50; - - & svg { - transform: rotate(0deg); - } - } -} - -.layers-tab { - display: grid; - grid-template-rows: auto 1fr; - grid-template-columns: 100%; - height: 100%; - overflow: hidden; - position: relative; - .resize-area-horiz { - position: absolute; - top: var(--height, 200px); - left: 0; - height: 8px; - width: 100%; - z-index: 10; - cursor: ns-resize; - } -} - -.shortcuts, -.debug-panel { - .shortcuts-header, - .debug-panel-header { - display: flex; - height: 40px; - background-color: $color-gray-60; - - .shortcuts-title, - .debug-panel-title { - color: $color-white; - font-size: $fs12; - display: flex; - justify-content: center; - align-items: center; - flex-grow: 1; - svg { - height: 18px; - width: 18px; - transform: rotate(45deg); - fill: $color-gray-20; - } - } - - .shortcuts-close-button, - .debug-panel-close-button { - display: flex; - justify-content: center; - background-color: transparent; - border: none; - cursor: pointer; - padding: 2px 0 2px 15px; - position: absolute; - top: 8px; - svg { - height: 18px; - width: 18px; - transform: rotate(45deg); - fill: $color-gray-20; - } - } - } - - .search-field { - height: 60px; - display: flex; - justify-content: center; - align-items: center; - padding: 12px 10px; - - .search-box { - display: flex; - justify-content: space-between; - align-items: center; - border: 1px solid $color-gray-30; - border-radius: $br2; - width: 100%; - &:focus-within { - border: 1px solid $color-primary; - } - .input-text { - margin: 0; - background: $color-gray-50; - width: 100%; - color: $color-white; - &:focus { - border-bottom: none; - } - } - .icon-wrapper { - display: flex; - justify-content: center; - align-items: center; - border: none; - background-color: transparent; - padding: 0; - .icon { - display: flex; - justify-content: center; - align-items: center; - &.close { - transform: rotate(45deg); - } - } - } - svg { - width: 16px; - height: 16px; - margin: 0 7px; - cursor: pointer; - fill: $color-gray-20; - } - } - } - - .shortcut-list { - border-top: 1px solid $color-gray-60; - padding: 10px; - overflow-y: auto; - height: 90%; - margin-bottom: 15px; - .section-title { - background-color: $color-gray-60; - padding: 4px 0; - } - .section-title, - .subsection-title { - display: flex; - cursor: pointer; - margin-top: 4px; - font-size: $fs12; - - .section-name { - color: $color-white; - } - .collapesed-shortcuts { - padding: 0 10px; - svg { - height: 8px; - width: 8px; - fill: $color-gray-20; - } - &.open { - svg { - transform: rotate(90deg); - } - } - } - .shortcut-count { - padding-left: 5px; - color: $color-white; - } - } - .subsection-title { - padding: 4px 0px; - .subsection-name { - color: $color-white; - } - } - - .section-title, - .subsection-title { - &:hover { - background-color: $color-primary; - .subsection-name, - .section-name { - color: $color-gray-60; - } - svg { - fill: $color-gray-60; - } - } - } - - .shortcut-name { - border: 1px solid $color-gray-60; - border-radius: $br4; - padding: 7px; - display: flex; - justify-content: space-between; - margin-top: 4px; - color: $color-white; - font-size: $fs12; - .command-name { - display: flex; - align-items: center; - } - .keys { - flex-grow: 1; - display: flex; - align-items: center; - justify-content: flex-end; - } - .char-box { - min-width: 15px; - background-color: $color-white; - color: $color-black; - border-radius: $br3; - padding: 2px 5px; - font-size: $fs11; - font-weight: $fw600; - margin: 0 2px; - text-transform: capitalize; - display: inline-block; - text-align: center; - } - .space { - margin: 0 3px; - } - } - } - .not-found { - background-color: $color-gray-60; - padding: 4px 0; - color: $color-white; - display: flex; - justify-content: center; - margin-top: 4px; - font-size: $fs12; - } -} - -.debug-panel { - .debug-panel-inner { - padding: 8px; - } - .debug-option { - display: flex; - gap: 8px; - margin: 4px 0; - cursor: pointer; - - label { - font-size: 80%; - cursor: pointer; - } - - svg { - width: 15px; - height: 15px; - background: white; - } - - &:hover { - svg { - stroke: $color-primary; - } - label { - color: $color-primary; - } - } - } -} diff --git a/frontend/resources/styles/main/partials/signup-questions.scss b/frontend/resources/styles/main/partials/signup-questions.scss deleted file mode 100644 index 373cae531..000000000 --- a/frontend/resources/styles/main/partials/signup-questions.scss +++ /dev/null @@ -1,190 +0,0 @@ -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. -// -// Copyright (c) KALEIDOS INC - -.signup-questions { - background-color: $color-white; - color: $color-gray-60; - max-width: 646px; - overflow-y: auto; - padding: 1.5rem 1rem; - position: relative; - width: 100%; - form { - display: flex; - flex-direction: column; - height: 100%; - } - - h1, - h3 { - font-family: "worksans", sans-serif; - font-weight: $fw500; - } - - h1 { - font-size: $fs36; - padding-top: 2.5rem; - } - - h3 { - font-size: $fs23; - } - - .step-header { - height: 2.5rem; - width: 100%; - } - .custom-select { - margin-bottom: 10px; - } - - .step-number { - background-color: $color-gray-10; - border: none; - border-radius: 1rem; // Need to be investigated, before we can use variable - color: $color-gray-40; - float: right; - font-family: "worksans", sans-serif; - font-size: $fs12; - height: 1.5rem; - line-height: $lh-200; // Original value was 1.5rem = 24px; 24px/12px = 200% => lh-200 - text-align: center; - width: 2.5rem; - } - - .header-image { - width: 240px; - } - - .intro { - font-size: $fs16; - padding: 0.5rem 0 1rem 0; - color: $color-gray-40; - } - .section { - display: block; - font-weight: $fw500; - font-size: $fs18; - margin: 0 0 0.3em 0; - padding: 0.8rem 0 0 0; - font-family: "worksans", sans-serif !important; - } - - .other { - .custom-input { - margin: 0.75rem 0 2rem 0; - } - } - .buttons { - flex-grow: 1; - display: grid; - grid-template-columns: 50% 50%; - grid-template-areas: "previous next"; - .step-prev { - display: flex; - align-items: flex-end; - justify-content: flex-start; - grid-area: previous; - button { - background-color: transparent; - border: none; - cursor: pointer; - height: 40px; - font-size: $fs15; - } - } - - .step-next { - display: flex; - align-items: flex-end; - justify-content: flex-end; - grid-area: next; - input { - font-size: $fs15; - color: $color-black; - background-color: $color-primary; - width: 11rem; - margin-left: auto; - margin: 0; - } - } - } - - .custom-radio { - display: flex; - justify-content: space-between; - flex-wrap: wrap; - - .input-radio { - margin: 0; - max-width: 12rem; - width: 100%; - - &.with-image { - display: block; - padding: 0; - } - - label { - font-family: "worksans", sans-serif !important; - color: $color-gray-60; - font-size: $fs15; - padding-left: 0; - position: relative; - text-align: center; - height: 4rem; - margin: 0; - - &.with-image { - min-height: 120px; - display: flex; - padding-top: 4rem; - justify-content: center; - background-size: 50px; - background-repeat: no-repeat; - background-position: center 0.75rem; - } - } - - input[type="radio"] { - /*We need it to be accesible so we can't use display none*/ - display: inline; - opacity: 0; - } - - input[type="radio"] + label:before { - background-color: $color-white; - border: 1px solid $color-gray-10; - } - - input[type="radio"] + label.with-image:before { - background-color: transparent; - border-radius: 4px; - min-width: 100%; - min-height: 100%; - position: absolute; - top: 0; - left: 0; - margin: 0; - } - - input[type="radio"]:focus + label:before { - border: 1px solid $color-gray-60; - } - - input[type="radio"]:checked + label:before { - box-shadow: inset 0 0 0 4px $color-white; - background-color: $color-primary; - border: 1px solid $color-gray-30; - } - - input[type="radio"]:checked + label.with-image:before { - border: 1px solid $color-primary; - background-color: transparent; - } - } - } -} diff --git a/frontend/resources/styles/main/partials/tab-container.scss b/frontend/resources/styles/main/partials/tab-container.scss deleted file mode 100644 index 33c759e0a..000000000 --- a/frontend/resources/styles/main/partials/tab-container.scss +++ /dev/null @@ -1,45 +0,0 @@ -.tab-container { - display: grid; - grid-template-rows: auto 1fr; - grid-template-columns: 100%; - height: 100%; -} - -.tab-container-tabs { - background: $color-gray-60; - cursor: pointer; - display: flex; - flex-direction: row; - font-size: $fs12; - height: 2.5rem; - padding: 0 0.25rem; -} - -.tab-container-tab-title { - align-items: center; - background: $color-gray-60; - border-radius: $br2 $br2 0 0; - color: $color-white; - display: flex; - justify-content: center; - margin: 0.5rem 0.25rem 0 0.25rem; - width: 100%; - - &.current { - background: $color-gray-50; - } -} - -.tab-container-content { - overflow-y: auto; - overflow-x: hidden; -} - -.inspect .tab-container-content { - overflow: hidden; -} - -.tab-element, -.tab-element-content { - height: 100%; -} diff --git a/frontend/resources/styles/main/partials/user-settings.scss b/frontend/resources/styles/main/partials/user-settings.scss deleted file mode 100644 index 8fd19383f..000000000 --- a/frontend/resources/styles/main/partials/user-settings.scss +++ /dev/null @@ -1,188 +0,0 @@ -.settings-content { - header { - display: flex; - flex-direction: column; - height: 160px; - background-color: $color-white; - - .secondary-menu { - display: flex; - justify-content: space-between; - height: 40px; - font-size: $fs14; - color: $color-gray-60; - - .icon { - display: flex; - align-items: center; - } - - .left { - margin-left: 30px; - display: flex; - align-items: center; - justify-content: center; - cursor: pointer; - - .label { - margin-left: 15px; - } - - svg { - fill: $color-gray-60; - width: 14px; - height: 14px; - transform: rotate(180deg); - } - } - .right { - align-items: center; - cursor: pointer; - display: flex; - justify-content: center; - margin-right: 30px; - - .label { - color: $color-primary-dark; - margin-right: 15px; - } - - svg { - fill: $color-primary-dark; - width: 14px; - height: 14px; - } - - &:hover { - .label { - color: $color-danger; - } - svg { - fill: $color-danger; - } - } - } - } - - h1 { - align-items: top; - color: $color-gray-60; - display: flex; - flex-grow: 1; - font-size: $fs24; - font-weight: $fw400; - justify-content: center; - } - - nav { - display: flex; - justify-content: center; - height: 40px; - - .nav-item { - align-items: center; - color: $color-gray-40; - display: flex; - flex-basis: 140px; - justify-content: center; - - &.current { - border-bottom: 3px solid $color-primary; - } - } - } - } - - .settings-profile { - .forms-container { - margin-top: 80px; - } - } - - .avatar-form { - flex-basis: 168px; - height: 100vh; - display: flex; - position: relative; - - .image-change-field { - position: relative; - width: 120px; - height: 120px; - - .update-overlay { - opacity: 0; - cursor: pointer; - position: absolute; - width: 121px; - height: 121px; - border-radius: 50%; - font-size: $fs24; - color: $color-white; - line-height: $lh-500; // Original value was 120px; 120px/24px =500% => $lh-500 - text-align: center; - background: $color-primary-dark; - z-index: 14; - } - - input[type="file"] { - width: 120px; - height: 120px; - position: absolute; - opacity: 0; - cursor: pointer; - top: 0; - z-index: 15; - } - - &:hover { - img { - display: none; - } - .update-overlay { - opacity: 1; - } - } - } - } - - .profile-form { - flex-grow: 1; - flex-basis: 390px; - display: flex; - - flex-direction: column; - - .change-email { - display: flex; - flex-direction: row; - font-size: $fs14; - color: $color-primary-dark; - justify-content: flex-end; - margin-bottom: 20px; - } - } - - .avatar-form { - img { - border-radius: 50%; - flex-shrink: 0; - height: 120px; - margin-right: $size-4; - width: 120px; - } - } - - .options-form, - .password-form { - display: flex; - flex-direction: column; - flex-basis: 368px; - - h2 { - font-size: $fs14; - font-weight: $fw400; - margin-bottom: $size-4; - } - } -} diff --git a/frontend/src/app/main/ui/dashboard/sidebar.scss b/frontend/src/app/main/ui/dashboard/sidebar.scss index 1a5c627e6..f939c8d44 100644 --- a/frontend/src/app/main/ui/dashboard/sidebar.scss +++ b/frontend/src/app/main/ui/dashboard/sidebar.scss @@ -339,7 +339,7 @@ .profile-fullname { @include smallTitleTipography; - @include text-ellipsis; + @include textEllipsis; align-self: center; max-width: $s-160; color: var(--profile-foreground-color); diff --git a/frontend/src/app/main/ui/viewer/inspect/right_sidebar.scss b/frontend/src/app/main/ui/viewer/inspect/right_sidebar.scss index 694d43e0f..a542a2a1b 100644 --- a/frontend/src/app/main/ui/viewer/inspect/right_sidebar.scss +++ b/frontend/src/app/main/ui/viewer/inspect/right_sidebar.scss @@ -51,7 +51,7 @@ .layer-title { @include bodySmallTypography; - @include text-ellipsis; + @include textEllipsis; height: $s-32; padding: $s-8 0; color: var(--assets-item-name-foreground-color-rest); -- Gitee From edb0408300746c314e90e41488103a18a9a4aa88 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 19 Mar 2024 11:35:58 +0100 Subject: [PATCH 0094/1266] :bug: Fix issue on climit when it is not enabled --- backend/src/app/rpc/climit.clj | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/backend/src/app/rpc/climit.clj b/backend/src/app/rpc/climit.clj index 988fe29ad..3c23a7402 100644 --- a/backend/src/app/rpc/climit.clj +++ b/backend/src/app/rpc/climit.clj @@ -21,7 +21,6 @@ [app.worker :as-alias wrk] [clojure.edn :as edn] [clojure.spec.alpha :as s] - [cuerdas.core :as str] [datoteka.fs :as fs] [integrant.core :as ig] [promesa.exec :as px] @@ -241,16 +240,15 @@ [{:keys [::label ::profile-id ::rpc/climit ::mtx/metrics] :as cfg} f] (let [config (get climit ::config) cache (get climit ::cache)] - (reduce (fn [handler [limit-id limit-key :as ckey]] - (let [config (get config limit-id)] - (when-not config - (throw (IllegalArgumentException. - (str/ffmt "config not found for: %" limit-id)))) - + (if-let [config (get config limit-id)] (fn [& params] (let [limiter (cache/get cache ckey (partial create-limiter config))] - (invoke limiter metrics limit-id limit-key label profile-id handler params))))) + (invoke limiter metrics limit-id limit-key label profile-id handler params))) + + (do + (l/wrn :hint "config not found" :label label :id limit-id) + f))) f (get-limits cfg)))) -- Gitee From dec3478024a55f6011b492f8d96092daff0f4e6c Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 19 Mar 2024 11:03:36 +0100 Subject: [PATCH 0095/1266] :bug: Fix problem with sticky selection on hovering sidebars --- .../src/app/main/ui/workspace/viewport/viewport_ref.cljs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/workspace/viewport/viewport_ref.cljs b/frontend/src/app/main/ui/workspace/viewport/viewport_ref.cljs index 41c379d02..44d0ffbde 100644 --- a/frontend/src/app/main/ui/workspace/viewport/viewport_ref.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/viewport_ref.cljs @@ -11,7 +11,10 @@ [app.common.geom.point :as gpt] [app.main.store :as st] [app.util.dom :as dom] - [rumext.v2 :as mf])) + [app.util.mouse :as mse] + [goog.events :as events] + [rumext.v2 :as mf]) + (:import goog.events.EventType)) (defonce viewport-ref (atom nil)) (defonce current-observer (atom nil)) @@ -45,6 +48,8 @@ #(fn [node] (mf/set-ref-val! ref node) (reset! viewport-ref node) + (when (some? node) + (events/listen node EventType.MOUSEOUT (fn [] (st/emit! (mse/->BlurEvent))))) (init-observer node on-change-bounds)))])) (defn point->viewport -- Gitee From 121876110a9a4d768db4c3391dc8c051dd3d06a0 Mon Sep 17 00:00:00 2001 From: AzazelN28 Date: Tue, 19 Mar 2024 11:42:18 +0100 Subject: [PATCH 0096/1266] :bug: Fix imposters rendering with strokes --- frontend/src/app/main/render.cljs | 2 +- frontend/src/app/main/ui/workspace/shapes/frame.cljs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/main/render.cljs b/frontend/src/app/main/render.cljs index 60fc6f6be..16c961b5d 100644 --- a/frontend/src/app/main/render.cljs +++ b/frontend/src/app/main/render.cljs @@ -625,7 +625,7 @@ (if (some? shape) (let [fonts (ff/shape->fonts shape objects) - bounds (gsb/get-object-bounds objects shape) + bounds (gsb/get-object-bounds objects shape {:ignore-margin? false}) background (when (str/ends-with? object-id "component") (or (:background options) (dom/get-css-variable "--assets-component-background-color") "#fff")) diff --git a/frontend/src/app/main/ui/workspace/shapes/frame.cljs b/frontend/src/app/main/ui/workspace/shapes/frame.cljs index cd60ec811..70e46664a 100644 --- a/frontend/src/app/main/ui/workspace/shapes/frame.cljs +++ b/frontend/src/app/main/ui/workspace/shapes/frame.cljs @@ -130,7 +130,7 @@ container-ref (mf/use-ref nil) content-ref (mf/use-ref nil) - bounds (gsb/get-object-bounds objects shape) + bounds (gsb/get-object-bounds objects shape {:ignore-margin? false}) x (dm/get-prop bounds :x) y (dm/get-prop bounds :y) -- Gitee From aae4c13231bd29a6ba0711a9e8f07bc7e7bbaf04 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Tue, 19 Mar 2024 13:21:30 +0100 Subject: [PATCH 0097/1266] :bug: Fix add page paddings and margins --- frontend/src/app/main/ui/workspace/sidebar/layers.scss | 4 ++-- frontend/src/app/main/ui/workspace/sidebar/sitemap.scss | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/sidebar/layers.scss b/frontend/src/app/main/ui/workspace/sidebar/layers.scss index 4c0823ddf..2dbde9595 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/layers.scss +++ b/frontend/src/app/main/ui/workspace/sidebar/layers.scss @@ -13,10 +13,10 @@ height: $s-32; min-height: $s-32; margin: $s-8 0 $s-4 $s-8; - padding-right: $s-8; + padding-right: $s-12; &.search { - padding: 0 $s-8 0 $s-12; + padding: 0 $s-12 0 $s-8; gap: $s-4; .filter-button { @include flexCenter; diff --git a/frontend/src/app/main/ui/workspace/sidebar/sitemap.scss b/frontend/src/app/main/ui/workspace/sidebar/sitemap.scss index 1363ea1c5..cd12ae572 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/sitemap.scss +++ b/frontend/src/app/main/ui/workspace/sidebar/sitemap.scss @@ -227,5 +227,5 @@ .title-spacing-sitemap { padding-inline-start: $s-8; margin-block-start: $s-8; - padding-inline-end: $s-20; + margin-block-end: $s-4; } -- Gitee From 151421c8db66a1cafd866db1a7011d39e59fa262 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Tue, 19 Mar 2024 13:39:48 +0100 Subject: [PATCH 0098/1266] :bug: Fix toggle comments and history states --- frontend/src/app/main/data/workspace/layout.cljs | 1 - frontend/src/app/main/ui/workspace/right_header.cljs | 9 ++++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/main/data/workspace/layout.cljs b/frontend/src/app/main/data/workspace/layout.cljs index 1c7582a59..157de23f7 100644 --- a/frontend/src/app/main/data/workspace/layout.cljs +++ b/frontend/src/app/main/data/workspace/layout.cljs @@ -89,7 +89,6 @@ (update [_ state] (update state :workspace-layout (fn [flags] - (prn flags) (if force? (conj flags flag) (if (contains? flags flag) diff --git a/frontend/src/app/main/ui/workspace/right_header.cljs b/frontend/src/app/main/ui/workspace/right_header.cljs index 1fae7d76c..f2e1b53f0 100644 --- a/frontend/src/app/main/ui/workspace/right_header.cljs +++ b/frontend/src/app/main/ui/workspace/right_header.cljs @@ -179,6 +179,10 @@ (mf/use-fn (mf/deps selected-drawtool) (fn [_] + (when (contains? layout :document-history) + (st/emit! (-> (dw/remove-layout-flag :document-history) + (vary-meta assoc ::ev/origin "workspace-header")))) + (if (= :comments selected-drawtool) (st/emit! :interrupt) (active-comments)))) @@ -187,8 +191,11 @@ (mf/use-fn (mf/deps selected-drawtool) (fn [] + (when (= :comments selected-drawtool) - (st/emit! :interrupt)) + (st/emit! :interrupt + (-> (dw/toggle-layout-flag :comments) + (vary-meta assoc ::ev/origin "workspace-header")))) (st/emit! (-> (dw/toggle-layout-flag :document-history) (vary-meta assoc ::ev/origin "workspace-header")))))] -- Gitee From 190e022c29f0d3db2963ccc3d3ccb3b1dc198e43 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Tue, 19 Mar 2024 13:56:58 +0100 Subject: [PATCH 0099/1266] :bug: Fix Vertical scroll inside the action menu works badly with nested menu --- frontend/src/app/main/ui/workspace/context_menu.scss | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/context_menu.scss b/frontend/src/app/main/ui/workspace/context_menu.scss index b7ea96aa4..66e58c890 100644 --- a/frontend/src/app/main/ui/workspace/context_menu.scss +++ b/frontend/src/app/main/ui/workspace/context_menu.scss @@ -62,14 +62,11 @@ } } - .submenu-icon { - position: absolute; - right: $s-16; - svg { - @extend .button-icon-small; - stroke: var(--menu-foreground-color); - } + .submenu-icon svg { + @extend .button-icon-small; + stroke: var(--menu-foreground-color); } + &:hover { background-color: var(--menu-background-color-hover); .title { -- Gitee From b31683fe728606c3a22bdc3294c8c1c0cee5bb7d Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 19 Mar 2024 15:57:16 +0100 Subject: [PATCH 0100/1266] :bug: Fix problem with mouse out events --- frontend/src/app/main/ui/workspace/viewport/viewport_ref.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/workspace/viewport/viewport_ref.cljs b/frontend/src/app/main/ui/workspace/viewport/viewport_ref.cljs index 44d0ffbde..4ba3d44fe 100644 --- a/frontend/src/app/main/ui/workspace/viewport/viewport_ref.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/viewport_ref.cljs @@ -49,7 +49,7 @@ (mf/set-ref-val! ref node) (reset! viewport-ref node) (when (some? node) - (events/listen node EventType.MOUSEOUT (fn [] (st/emit! (mse/->BlurEvent))))) + (events/listen node EventType.MOUSELEAVE (fn [] (st/emit! (mse/->BlurEvent))))) (init-observer node on-change-bounds)))])) (defn point->viewport -- Gitee From ea73e1d3651157826097446adcfe6150e9644260 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Tue, 19 Mar 2024 16:19:05 +0100 Subject: [PATCH 0101/1266] :bug: Fix interaction icons --- .../ui/workspace/sidebar/options/menus/interactions.cljs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs index 515c109eb..3a1ba4bd9 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs @@ -187,15 +187,15 @@ (def ^:private corner-bottom-icon (i/icon-xref :corner-bottom (stl/css :corner-icon))) (def ^:private corner-bottomleft-icon - (i/icon-xref :corner-bottomleft (stl/css :corner-icon))) + (i/icon-xref :corner-bottom-left (stl/css :corner-icon))) (def ^:private corner-bottomright-icon - (i/icon-xref :corner-bottomright (stl/css :corner-icon))) + (i/icon-xref :corner-bottom-right (stl/css :corner-icon))) (def ^:private corner-top-icon (i/icon-xref :corner-top (stl/css :corner-icon))) (def ^:private corner-topleft-icon - (i/icon-xref :corner-topleft (stl/css :corner-icon))) + (i/icon-xref :corner-top-left (stl/css :corner-icon))) (def ^:private corner-topright-icon - (i/icon-xref :corner-topright (stl/css :corner-icon))) + (i/icon-xref :corner-top-right (stl/css :corner-icon))) (mf/defc interaction-entry [{:keys [index shape interaction update-interaction remove-interaction]}] -- Gitee From 02ff228f2977466c739aad2d488b912bf3467ee3 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Tue, 19 Mar 2024 16:35:44 +0100 Subject: [PATCH 0102/1266] :bug: Fix flow dropdown paddings --- frontend/src/app/main/ui/viewer/interactions.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/viewer/interactions.scss b/frontend/src/app/main/ui/viewer/interactions.scss index 74e7969b0..3cd9751b4 100644 --- a/frontend/src/app/main/ui/viewer/interactions.scss +++ b/frontend/src/app/main/ui/viewer/interactions.scss @@ -36,7 +36,7 @@ width: $s-272; padding: $s-6; max-height: calc(100vh - 3 * ($s-2 + $s-48)); - overflow: scroll; + overflow: auto; } .dropdown-element { -- Gitee From 4378f132b499dc4d1996fb2104137ac747ea9fea Mon Sep 17 00:00:00 2001 From: AzazelN28 Date: Tue, 19 Mar 2024 16:18:24 +0100 Subject: [PATCH 0103/1266] :bug: Fix dashboard thumbnails with strokes --- common/src/app/common/geom/shapes/bounds.cljc | 5 +++++ frontend/src/app/main/render.cljs | 16 ++++++++++++++++ frontend/src/app/main/ui/dashboard/grid.cljs | 19 ++++--------------- frontend/src/app/main/ui/shapes/frame.cljs | 4 ++-- 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/common/src/app/common/geom/shapes/bounds.cljc b/common/src/app/common/geom/shapes/bounds.cljc index 6935c0d97..5612837b4 100644 --- a/common/src/app/common/geom/shapes/bounds.cljc +++ b/common/src/app/common/geom/shapes/bounds.cljc @@ -190,3 +190,8 @@ (get-rect-filter-bounds children-bounds filters blur-value)))) +(defn get-frame-bounds + ([shape] + (get-frame-bounds shape nil)) + ([shape {:keys [ignore-margin?] :or {ignore-margin? false}}] + (get-object-bounds [] shape {:ignore-margin? ignore-margin?}))) diff --git a/frontend/src/app/main/render.cljs b/frontend/src/app/main/render.cljs index 16c961b5d..45d6868a7 100644 --- a/frontend/src/app/main/render.cljs +++ b/frontend/src/app/main/render.cljs @@ -28,7 +28,9 @@ [app.common.types.shape-tree :as ctst] [app.common.types.shape.layout :as ctl] [app.config :as cfg] + [app.main.features :as features] [app.main.fonts :as fonts] + [app.main.store :as st] [app.main.ui.context :as muc] [app.main.ui.shapes.bool :as bool] [app.main.ui.shapes.circle :as circle] @@ -44,6 +46,7 @@ [app.main.ui.shapes.svg-raw :as svg-raw] [app.main.ui.shapes.text :as text] [app.main.ui.shapes.text.fontfaces :as ff] + [app.main.worker :as wrk] [app.util.dom :as dom] [app.util.http :as http] [app.util.strings :as ust] @@ -668,3 +671,16 @@ (do (l/warn :msg "imposter shape is nil") (rx/empty))))) + +(defn render-thumbnail + [file-id revn] + (->> (wrk/ask! {:cmd :thumbnails/generate-for-file + :revn revn + :file-id file-id + :features (features/get-team-enabled-features @st/state)}) + (rx/mapcat (fn [{:keys [fonts] :as result}] + (->> (fonts/render-font-styles fonts) + (rx/map (fn [styles] + (assoc result + :styles styles + :width 252)))))))) diff --git a/frontend/src/app/main/ui/dashboard/grid.cljs b/frontend/src/app/main/ui/dashboard/grid.cljs index 276fa7ce4..765d91fc1 100644 --- a/frontend/src/app/main/ui/dashboard/grid.cljs +++ b/frontend/src/app/main/ui/dashboard/grid.cljs @@ -13,11 +13,10 @@ [app.common.logging :as log] [app.main.data.dashboard :as dd] [app.main.data.messages :as msg] - [app.main.features :as features] [app.main.fonts :as fonts] [app.main.rasterizer :as thr] [app.main.refs :as refs] - [app.main.render :refer [component-svg]] + [app.main.render :as render] [app.main.repo :as rp] [app.main.store :as st] [app.main.ui.components.color-bullet :as bc] @@ -27,7 +26,6 @@ [app.main.ui.dashboard.placeholder :refer [empty-placeholder loading-placeholder]] [app.main.ui.hooks :as h] [app.main.ui.icons :as i] - [app.main.worker :as wrk] [app.util.color :as uc] [app.util.dom :as dom] [app.util.dom.dnd :as dnd] @@ -52,16 +50,7 @@ (defn- ask-for-thumbnail "Creates some hooks to handle the files thumbnails cache" [file-id revn] - (->> (wrk/ask! {:cmd :thumbnails/generate-for-file - :revn revn - :file-id file-id - :features (features/get-team-enabled-features @st/state)}) - (rx/mapcat (fn [{:keys [fonts] :as result}] - (->> (fonts/render-font-styles fonts) - (rx/map (fn [styles] - (assoc result - :styles styles - :width 252)))))) + (->> (render/render-thumbnail file-id revn) (rx/mapcat thr/render) (rx/mapcat (partial persist-thumbnail file-id revn)))) @@ -141,8 +130,8 @@ (let [root-id (or (:main-instance-id component) (:id component))] ;; Check for components-v2 in library [:div {:class (stl/css :asset-list-item) :key (str "assets-component-" (:id component))} - [:& component-svg {:root-shape (get-in component [:objects root-id]) - :objects (:objects component)}] ;; Components in the summary come loaded with objects, even in v2 + [:& render/component-svg {:root-shape (get-in component [:objects root-id]) + :objects (:objects component)}] ;; Components in the summary come loaded with objects, even in v2 [:div {:class (stl/css :name-block)} [:span {:class (stl/css :item-name) :title (:name component)} diff --git a/frontend/src/app/main/ui/shapes/frame.cljs b/frontend/src/app/main/ui/shapes/frame.cljs index 970e1ce7f..c907291ad 100644 --- a/frontend/src/app/main/ui/shapes/frame.cljs +++ b/frontend/src/app/main/ui/shapes/frame.cljs @@ -8,8 +8,8 @@ (:require [app.common.data.macros :as dm] [app.common.files.helpers :as cfh] - [app.common.geom.rect :as grc] [app.common.geom.shapes :as gsh] + [app.common.geom.shapes.bounds :as gsb] [app.common.types.shape.layout :as ctl] [app.config :as cf] [app.main.ui.context :as muc] @@ -119,7 +119,7 @@ points (dm/get-prop shape :points) bounds (mf/with-memo [bounds points] - (or bounds (grc/points->rect points))) + (or bounds (gsb/get-frame-bounds shape))) thumb (:thumbnail shape) -- Gitee From 5c6e8366c10bf7deb3dbf66d7f09c8cf472aa8ca Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 20 Mar 2024 09:33:53 +0100 Subject: [PATCH 0104/1266] :bug: Fix unexpected exception on fix-percent functions --- common/src/app/common/svg.cljc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/common/src/app/common/svg.cljc b/common/src/app/common/svg.cljc index d400f01f1..1b50a9dde 100644 --- a/common/src/app/common/svg.cljc +++ b/common/src/app/common/svg.cljc @@ -995,6 +995,9 @@ (= key :style) attrs + (= key :unicode) + attrs + (str/starts-with? (d/name key) "data-") attrs -- Gitee From 526f6ef841e19fa3c8790a1bedd26ed9c2e64756 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 20 Mar 2024 16:12:00 +0100 Subject: [PATCH 0105/1266] :bug: Fix release build issue Caused by an unsolved corner case of the interaction of code-move between modules and types defined with reify. Mainly moves some definition of protocol to one module and the definition of the type to other, and as the definition of the type is conditional to the function execution, the whole build fails to initialize because the second protocol extension implementation can't find the type initialized on application startup. --- frontend/src/app/main/render.cljs | 16 ---------------- frontend/src/app/main/ui/dashboard/grid.cljs | 17 ++++++++++++++++- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/frontend/src/app/main/render.cljs b/frontend/src/app/main/render.cljs index 45d6868a7..16c961b5d 100644 --- a/frontend/src/app/main/render.cljs +++ b/frontend/src/app/main/render.cljs @@ -28,9 +28,7 @@ [app.common.types.shape-tree :as ctst] [app.common.types.shape.layout :as ctl] [app.config :as cfg] - [app.main.features :as features] [app.main.fonts :as fonts] - [app.main.store :as st] [app.main.ui.context :as muc] [app.main.ui.shapes.bool :as bool] [app.main.ui.shapes.circle :as circle] @@ -46,7 +44,6 @@ [app.main.ui.shapes.svg-raw :as svg-raw] [app.main.ui.shapes.text :as text] [app.main.ui.shapes.text.fontfaces :as ff] - [app.main.worker :as wrk] [app.util.dom :as dom] [app.util.http :as http] [app.util.strings :as ust] @@ -671,16 +668,3 @@ (do (l/warn :msg "imposter shape is nil") (rx/empty))))) - -(defn render-thumbnail - [file-id revn] - (->> (wrk/ask! {:cmd :thumbnails/generate-for-file - :revn revn - :file-id file-id - :features (features/get-team-enabled-features @st/state)}) - (rx/mapcat (fn [{:keys [fonts] :as result}] - (->> (fonts/render-font-styles fonts) - (rx/map (fn [styles] - (assoc result - :styles styles - :width 252)))))))) diff --git a/frontend/src/app/main/ui/dashboard/grid.cljs b/frontend/src/app/main/ui/dashboard/grid.cljs index 765d91fc1..dfffc9c66 100644 --- a/frontend/src/app/main/ui/dashboard/grid.cljs +++ b/frontend/src/app/main/ui/dashboard/grid.cljs @@ -13,6 +13,7 @@ [app.common.logging :as log] [app.main.data.dashboard :as dd] [app.main.data.messages :as msg] + [app.main.features :as features] [app.main.fonts :as fonts] [app.main.rasterizer :as thr] [app.main.refs :as refs] @@ -26,6 +27,7 @@ [app.main.ui.dashboard.placeholder :refer [empty-placeholder loading-placeholder]] [app.main.ui.hooks :as h] [app.main.ui.icons :as i] + [app.main.worker :as wrk] [app.util.color :as uc] [app.util.dom :as dom] [app.util.dom.dnd :as dnd] @@ -47,10 +49,23 @@ (->> (rp/cmd! :create-file-thumbnail params) (rx/map :uri)))) +(defn render-thumbnail + [file-id revn] + (->> (wrk/ask! {:cmd :thumbnails/generate-for-file + :revn revn + :file-id file-id + :features (features/get-team-enabled-features @st/state)}) + (rx/mapcat (fn [{:keys [fonts] :as result}] + (->> (fonts/render-font-styles fonts) + (rx/map (fn [styles] + (assoc result + :styles styles + :width 252)))))))) + (defn- ask-for-thumbnail "Creates some hooks to handle the files thumbnails cache" [file-id revn] - (->> (render/render-thumbnail file-id revn) + (->> (render-thumbnail file-id revn) (rx/mapcat thr/render) (rx/mapcat (partial persist-thumbnail file-id revn)))) -- Gitee From 4606785e5f7203507186bfccc32cf344fd453b63 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Fri, 15 Mar 2024 13:33:32 +0100 Subject: [PATCH 0106/1266] :bug: Fix move anidated structures withc component copies to other component copies --- frontend/src/app/main/data/workspace/transforms.cljs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/data/workspace/transforms.cljs b/frontend/src/app/main/data/workspace/transforms.cljs index 10515ac9c..15622d4dd 100644 --- a/frontend/src/app/main/data/workspace/transforms.cljs +++ b/frontend/src/app/main/data/workspace/transforms.cljs @@ -905,6 +905,11 @@ moving-shapes-ids (map :id moving-shapes) + moving-shapes-children-ids + (->> moving-shapes + (mapcat #(cfh/get-children-with-self objects (:id %))) + (map :id)) + changes (-> (pcb/empty-changes it page-id) (pcb/with-objects objects) @@ -913,7 +918,7 @@ (pcb/update-shapes moving-shapes-ids ctl/remove-layout-item-data)) ;; Remove component-root property when moving a shape inside a component (cond-> (ctn/get-instance-root objects frame) - (pcb/update-shapes moving-shapes-ids #(dissoc % :component-root))) + (pcb/update-shapes moving-shapes-children-ids #(dissoc % :component-root))) ;; Add component-root property when moving a component outside a component (cond-> (not (ctn/get-instance-root objects frame)) (pcb/update-shapes moving-shapes-ids (fn [shape] -- Gitee From f8bfe249aae93eb1b24c519021abfbd9e8f9c1bc Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 21 Mar 2024 10:17:43 +0100 Subject: [PATCH 0107/1266] :fire: Remove login illustration flag It is now a permament configuration --- common/src/app/common/flags.cljc | 1 - frontend/src/app/main/ui/auth.cljs | 53 +++++++++++++++--------------- frontend/src/app/main/ui/auth.scss | 5 --- 3 files changed, 26 insertions(+), 33 deletions(-) diff --git a/common/src/app/common/flags.cljc b/common/src/app/common/flags.cljc index ee86f729a..bd3afed23 100644 --- a/common/src/app/common/flags.cljc +++ b/common/src/app/common/flags.cljc @@ -13,7 +13,6 @@ "A common flags that affects both: backend and frontend." [:enable-registration :enable-login-with-password - :enable-login-illustration :enable-feature-styles-v2]) (defn parse diff --git a/frontend/src/app/main/ui/auth.cljs b/frontend/src/app/main/ui/auth.cljs index fe8473252..61fe0271b 100644 --- a/frontend/src/app/main/ui/auth.cljs +++ b/frontend/src/app/main/ui/auth.cljs @@ -7,6 +7,7 @@ (ns app.main.ui.auth (:require-macros [app.main.style :as stl]) (:require + [app.common.data.macros :as dm] [app.config :as cf] [app.main.ui.auth.login :refer [login-page]] [app.main.ui.auth.recovery :refer [recovery-page]] @@ -35,41 +36,39 @@ [:a {:href cf/privacy-policy-uri :target "_blank"} (tr "auth.privacy-policy")])]))) (mf/defc auth - [{:keys [route] :as props}] - (let [section (get-in route [:data :name]) - params (:query-params route) - show-illustration? (contains? cf/flags :login-illustration)] + {::mf/props :obj} + [{:keys [route]}] + (let [section (dm/get-in route [:data :name]) + params (:query-params route)] - (mf/use-effect - #(dom/set-html-title (tr "title.default"))) + (mf/with-effect [] + (dom/set-html-title (tr "title.default"))) - [:main {:class (stl/css-case :auth-section true - :no-illustration (not show-illustration?))} - (when show-illustration? - [:div {:class (stl/css :login-illustration)} - i/login-illustration]) + [:main {:class (stl/css :auth-section)} + [:div {:class (stl/css :login-illustration)} + i/login-illustration] [:section {:class (stl/css :auth-content)} - [:* - [:a {:href "#/" :class (stl/css :logo-btn)} i/logo] - (case section - :auth-register - [:& register-page {:params params}] + [:a {:href "#/" :class (stl/css :logo-btn)} i/logo] + (case section + :auth-register + [:& register-page {:params params}] - :auth-register-validate - [:& register-validate-page {:params params}] + :auth-register-validate + [:& register-validate-page {:params params}] - :auth-register-success - [:& register-success-page {:params params}] + :auth-register-success + [:& register-success-page {:params params}] - :auth-login - [:& login-page {:params params}] + :auth-login + [:& login-page {:params params}] - :auth-recovery-request - [:& recovery-request-page] + :auth-recovery-request + [:& recovery-request-page] - :auth-recovery - [:& recovery-page {:params params}])] + :auth-recovery + [:& recovery-page {:params params}]) - (when (contains? #{:auth-login :auth-register} section) + (when (or (= section :auth-login) + (= section :auth-register)) [:& terms-login])]])) diff --git a/frontend/src/app/main/ui/auth.scss b/frontend/src/app/main/ui/auth.scss index 2e5d45fc7..f993d5b7f 100644 --- a/frontend/src/app/main/ui/auth.scss +++ b/frontend/src/app/main/ui/auth.scss @@ -17,11 +17,6 @@ width: 100%; overflow: auto; - &.no-illustration { - display: flex; - justify-content: center; - } - @media (max-width: 992px) { display: flex; justify-content: center; -- Gitee From 64dc58c2590c13f6e47b954d22328590115e4a35 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 21 Mar 2024 10:35:18 +0100 Subject: [PATCH 0108/1266] :bug: Set correctly the default features --- common/src/app/common/features.cljc | 4 +++- common/src/app/common/flags.cljc | 5 +---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/common/src/app/common/features.cljc b/common/src/app/common/features.cljc index f4751da8f..90b27587f 100644 --- a/common/src/app/common/features.cljc +++ b/common/src/app/common/features.cljc @@ -56,7 +56,9 @@ ;; migrations process, so all features referenced in migrations should ;; be here. (def default-enabled-features - #{"fdata/shape-data-type"}) + #{"fdata/shape-data-type" + "styles/v2" + "layout/grid"}) ;; A set of features which only affects on frontend and can be enabled ;; and disabled freely by the user any time. This features does not diff --git a/common/src/app/common/flags.cljc b/common/src/app/common/flags.cljc index bd3afed23..93b88f87e 100644 --- a/common/src/app/common/flags.cljc +++ b/common/src/app/common/flags.cljc @@ -12,8 +12,7 @@ (def default "A common flags that affects both: backend and frontend." [:enable-registration - :enable-login-with-password - :enable-feature-styles-v2]) + :enable-login-with-password]) (defn parse [& flags] @@ -34,5 +33,3 @@ :else (recur (rest flags) result))))))) - - -- Gitee From 9a0bb36a207f8c5ed5379b6d636488e669e6eb3e Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 21 Mar 2024 10:43:25 +0100 Subject: [PATCH 0109/1266] :sparkles: Set proper internal version number --- frontend/src/app/main/ui/releases.cljs | 2 +- frontend/src/app/main/ui/releases/v2_0.cljs | 4 ---- version.txt | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/frontend/src/app/main/ui/releases.cljs b/frontend/src/app/main/ui/releases.cljs index 50f87648f..562c1eab2 100644 --- a/frontend/src/app/main/ui/releases.cljs +++ b/frontend/src/app/main/ui/releases.cljs @@ -91,4 +91,4 @@ (defmethod rc/render-release-notes "0.0" [params] - (rc/render-release-notes (assoc params :version "1.21"))) + (rc/render-release-notes (assoc params :version "2.0"))) diff --git a/frontend/src/app/main/ui/releases/v2_0.cljs b/frontend/src/app/main/ui/releases/v2_0.cljs index 116a4c172..0c3af3060 100644 --- a/frontend/src/app/main/ui/releases/v2_0.cljs +++ b/frontend/src/app/main/ui/releases/v2_0.cljs @@ -11,10 +11,6 @@ [app.main.ui.releases.common :as c] [rumext.v2 :as mf])) -(defmethod c/render-release-notes "1.21" - [data] - (c/render-release-notes (assoc data :version "2.0"))) - ;; TODO: Review all copies and alt text (defmethod c/render-release-notes "2.0" [{:keys [slide klass next finish navigate version]}] diff --git a/version.txt b/version.txt index 3500250a4..227cea215 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.21.0 +2.0.0 -- Gitee From b4c78e11f48c00a89a3378412bde99508a10de67 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Wed, 20 Mar 2024 11:06:10 +0100 Subject: [PATCH 0110/1266] :bug: Fix inspecting mode text --- frontend/translations/en.po | 2 +- frontend/translations/es.po | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/translations/en.po b/frontend/translations/en.po index fa989a0c7..a0ad7a087 100644 --- a/frontend/translations/en.po +++ b/frontend/translations/en.po @@ -5064,7 +5064,7 @@ msgstr "Click to close the path" #, markdown msgid "workspace.top-bar.view-only" -msgstr "**Inspecting mode** (View Only)" +msgstr "**Inspecting code** (View Only)" msgid "workspace.top-bar.read-only.done" msgstr "Done" diff --git a/frontend/translations/es.po b/frontend/translations/es.po index 73140e72c..30b388b04 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -5149,7 +5149,7 @@ msgstr "Pulsar para cerrar la ruta" #, markdown msgid "workspace.top-bar.view-only" -msgstr "**Modo inspección** (View only)" +msgstr "**Inspeccionando código** (View only)" msgid "workspace.top-bar.read-only.done" msgstr "Hecho" -- Gitee From 1c65df69f3cfcf897e1bd276a573c00ab169adf8 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Wed, 20 Mar 2024 11:29:26 +0100 Subject: [PATCH 0111/1266] :bug: Fix pinned project on creation --- backend/src/app/rpc/commands/projects.clj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/app/rpc/commands/projects.clj b/backend/src/app/rpc/commands/projects.clj index b8a555f44..caa3fe7a0 100644 --- a/backend/src/app/rpc/commands/projects.clj +++ b/backend/src/app/rpc/commands/projects.clj @@ -190,8 +190,8 @@ {:project-id (:id project) :profile-id profile-id :team-id team-id - :is-pinned true}) - (assoc project :is-pinned true)))) + :is-pinned false}) + (assoc project :is-pinned false)))) ;; --- MUTATION: Toggle Project Pin -- Gitee From d14565437c05d671283194618e394d6d369b896a Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Wed, 20 Mar 2024 11:36:31 +0100 Subject: [PATCH 0112/1266] :bug: Fix color asset tooltip --- frontend/src/app/main/ui/workspace/sidebar/assets/colors.cljs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/workspace/sidebar/assets/colors.cljs b/frontend/src/app/main/ui/workspace/sidebar/assets/colors.cljs index 1f0004462..02c3fe55b 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/assets/colors.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/assets/colors.cljs @@ -219,7 +219,9 @@ :auto-focus true :default-value (cfh/merge-path-item (:path color) (:name color))}] - [:div {:title (:name color) + [:div {:title (if (= (:name color) default-name) + default-name + (dm/str (:name color) " (" default-name ")")) :class (stl/css :name-block) :on-double-click rename-color-clicked} -- Gitee From f697f32707053765c253f3573750adfcbfd3dee2 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 21 Mar 2024 11:34:55 +0100 Subject: [PATCH 0113/1266] :bug: Add demo warning to login --- frontend/src/app/main/ui/auth/login.cljs | 11 ++++++++++ frontend/src/app/main/ui/auth/register.cljs | 24 ++++++++------------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/frontend/src/app/main/ui/auth/login.cljs b/frontend/src/app/main/ui/auth/login.cljs index b4d02fb11..cfd9d1d11 100644 --- a/frontend/src/app/main/ui/auth/login.cljs +++ b/frontend/src/app/main/ui/auth/login.cljs @@ -35,6 +35,14 @@ :login-with-gitlab :login-with-oidc])) +(mf/defc demo-warning + {::mf/props :obj} + [] + [:div {:class (stl/css :banner)} + [:& context-notification + {:type :warning + :content (tr "auth.demo-warning")}]]) + (defn- login-with-oidc [event provider params] (dom/prevent-default event) @@ -284,6 +292,9 @@ [:h1 {:class (stl/css :auth-title) :data-test "login-title"} (tr "auth.login-title")] + (when (contains? cf/flags :demo-warning) + [:& demo-warning]) + [:hr {:class (stl/css :separator)}] [:& login-methods {:params params}] diff --git a/frontend/src/app/main/ui/auth/register.cljs b/frontend/src/app/main/ui/auth/register.cljs index 6789b99dc..1143d5928 100644 --- a/frontend/src/app/main/ui/auth/register.cljs +++ b/frontend/src/app/main/ui/auth/register.cljs @@ -18,20 +18,12 @@ [app.main.ui.components.forms :as fm] [app.main.ui.components.link :as lk] [app.main.ui.icons :as i] - [app.main.ui.notifications.context-notification :refer [context-notification]] [app.util.i18n :refer [tr tr-html]] [app.util.router :as rt] [beicon.v2.core :as rx] [cljs.spec.alpha :as s] [rumext.v2 :as mf])) -(mf/defc demo-warning - [_] - [:div {:class (stl/css :banner)} - [:& context-notification - {:type :warning - :content (tr "auth.demo-warning")}]]) - ;; --- PAGE: Register (defn- validate @@ -86,7 +78,7 @@ (st/emit! (rt/nav :auth-register-validate {} params))) (mf/defc register-form - [{:keys [params on-success-callback] :as props}] + [{:keys [params on-success-callback]}] (let [initial (mf/use-memo (mf/deps params) (constantly params)) form (fm/use-form :spec ::register-form :validators [validate @@ -136,7 +128,8 @@ (mf/defc register-methods - [{:keys [params on-success-callback] :as props}] + {::mf/props :obj} + [{:keys [params on-success-callback]}] [:* (when login/show-alt-login-buttons? [:* @@ -146,14 +139,15 @@ [:& register-form {:params params :on-success-callback on-success-callback}]]) (mf/defc register-page - [{:keys [params] :as props}] + {::mf/props :obj} + [{:keys [params]}] [:div {:class (stl/css :auth-form)} [:h1 {:class (stl/css :auth-title) :data-test "registration-title"} (tr "auth.register-title")] [:div {:class (stl/css :auth-subtitle)} (tr "auth.register-subtitle")] (when (contains? cf/flags :demo-warning) - [:& demo-warning]) + [:& login/demo-warning]) [:& register-methods {:params params}] @@ -212,7 +206,7 @@ ::accept-newsletter-subscription]))) (mf/defc register-validate-form - [{:keys [params on-success-callback] :as props}] + [{:keys [params on-success-callback]}] (let [form (fm/use-form :spec ::register-validate-form :validators [(fm/validate-not-empty :fullname (tr "auth.name.not-all-space")) (fm/validate-length :fullname fm/max-length-allowed (tr "auth.name.too-long"))] @@ -263,7 +257,7 @@ (mf/defc register-validate-page - [{:keys [params] :as props}] + [{:keys [params]}] [:div {:class (stl/css :auth-form)} [:h1 {:class (stl/css :auth-title) :data-test "register-title"} (tr "auth.register-title")] @@ -279,7 +273,7 @@ (tr "labels.go-back")]]]]) (mf/defc register-success-page - [{:keys [params] :as props}] + [{:keys [params]}] [:div {:class (stl/css :auth-form :register-success)} [:div {:class (stl/css :notification-icon)} i/icon-verify] [:div {:class (stl/css :notification-text)} (tr "auth.verification-email-sent")] -- Gitee From 0cd44f55401feb400bf5a1d782f7b5adce2e2ff6 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Thu, 21 Mar 2024 13:08:56 +0100 Subject: [PATCH 0114/1266] :paperclip: Add two more debug options :display-touched and :show-ids --- .../src/app/main/ui/workspace/sidebar/layer_name.cljs | 4 +++- .../ui/workspace/sidebar/options/menus/component.cljs | 5 ++++- frontend/src/app/util/debug.cljs | 8 +++++++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/sidebar/layer_name.cljs b/frontend/src/app/main/ui/workspace/sidebar/layer_name.cljs index 862b59410..45d0a9015 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/layer_name.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/layer_name.cljs @@ -109,6 +109,8 @@ :style {"--depth" depth "--parent-size" parent-size} :ref ref :on-double-click start-edit} - (d/nilv shape-name "")] + (if (dbg/enabled? :show-ids) + (str (d/nilv shape-name "") " | " (str/slice (str shape-id) 24)) + (d/nilv shape-name ""))] (when (and (dbg/enabled? :show-touched) ^boolean shape-touched?) [:span {:class (stl/css :element-name-touched)} "*"])]))) diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.cljs index 49c077daa..d5170a8b5 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.cljs @@ -26,6 +26,7 @@ [app.main.ui.hooks :as h] [app.main.ui.icons :as i] [app.main.ui.workspace.sidebar.assets.common :as cmm] + [app.util.debug :as dbg] [app.util.dom :as dom] [app.util.i18n :as i18n :refer [tr]] [app.util.timers :as tm] @@ -639,4 +640,6 @@ [:& component-swap {:shapes copies}]) (when (and (not swap-opened?) (not multi) components-v2) - [:& component-annotation {:id id :shape shape :component component}])])]))) + [:& component-annotation {:id id :shape shape :component component}]) + (when (dbg/enabled? :display-touched) + [:div ":touched " (str (:touched shape))])])]))) diff --git a/frontend/src/app/util/debug.cljs b/frontend/src/app/util/debug.cljs index 3129e856f..067ac8a54 100644 --- a/frontend/src/app/util/debug.cljs +++ b/frontend/src/app/util/debug.cljs @@ -73,6 +73,9 @@ ;; Show an asterisk for touched copies :show-touched + ;; Show the id with the name + :show-ids + ;; :grid-layout @@ -80,7 +83,10 @@ :grid-cells ;; Show info about shapes - :shape-panel}) + :shape-panel + + ;; Show what is touched in copies + :display-touched}) (defn enable! [option] -- Gitee From ef2dfe58887582a568258ab7918ce04fd31fe8ea Mon Sep 17 00:00:00 2001 From: AzazelN28 Date: Thu, 21 Mar 2024 12:58:38 +0100 Subject: [PATCH 0115/1266] :bug: Fix library horizontal scroll --- frontend/src/app/main/ui/workspace/libraries.scss | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/libraries.scss b/frontend/src/app/main/ui/workspace/libraries.scss index fbd82a1f9..6d5143d73 100644 --- a/frontend/src/app/main/ui/workspace/libraries.scss +++ b/frontend/src/app/main/ui/workspace/libraries.scss @@ -81,11 +81,6 @@ height: fit-content; } -.item-name { - @include bodyLargeTypography; - color: var(--library-name-foreground-color); -} - .item-publish, .item-unpublish { @extend .button-primary; @@ -216,8 +211,11 @@ } .item-name { + @include bodyLargeTypography; @include textEllipsis; margin: 0; + max-width: $s-244; + color: var(--library-name-foreground-color); } .item-update { -- Gitee From 8f156a7fd04a4c75b8253ddd93224fda82b63e00 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Wed, 20 Mar 2024 07:34:39 +0100 Subject: [PATCH 0116/1266] :bug: Limit reset overrides on swapped components to affected subtree --- .../app/main/data/workspace/libraries.cljs | 49 ++++++++++++++++--- .../state_components_sync_test.cljs | 2 +- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index e9ea4ee5e..6f08743c9 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -706,6 +706,38 @@ (rx/take-until stopper-s)))))) +(defn sync-head + [id] + (ptk/reify ::sync-head + ptk/WatchEvent + (watch [it state _] + (log/info :msg "SYNC-head of shape" :id (str id)) + (let [file (wsh/get-local-file state) + file-full (wsh/get-local-file-full state) + libraries (wsh/get-libraries state) + + page-id (:current-page-id state) + container (cfh/get-container file :page page-id) + objects (:objects container) + + shape-inst (ctn/get-shape container id) + parent (get objects (:parent-id shape-inst)) + head (ctn/get-component-shape container parent) + + components-v2 + (features/active-feature? state "components/v2") + + changes + (-> (pcb/empty-changes it) + (pcb/with-container container) + (pcb/with-objects (:objects container)) + (dwlh/generate-sync-shape-direct file-full libraries container (:id head) false components-v2))] + + (log/debug :msg "SYNC-head finished" :js/rchanges (log-changes + (:redo-changes changes) + file)) + (rx/of (dch/commit-changes changes)))))) + (defn reset-component "Cancels all modifications in the shape with the given id, and all its children, in the current page. Set all attributes equal to the ones in the linked component, @@ -726,23 +758,26 @@ components-v2 (features/active-feature? state "components/v2") - shape-inst (ctn/get-shape container id) swap-slot (-> (ctn/get-shape container id) (ctk/get-swap-slot)) + + undo-id (js/Symbol) + changes (-> (pcb/empty-changes it) (pcb/with-container container) (pcb/with-objects (:objects container)) - (dwlh/generate-sync-shape-direct file-full libraries container id true components-v2) - (cond-> - (some? swap-slot) - ;; We need to propagate parent changes - (dwlh/generate-sync-shape-direct file-full libraries container (:parent-id shape-inst) true components-v2)))] + (dwlh/generate-sync-shape-direct file-full libraries container id true components-v2))] (log/debug :msg "RESET-COMPONENT finished" :js/rchanges (log-changes (:redo-changes changes) file)) - (rx/of (dch/commit-changes changes)))))) + (rx/of + (dwu/start-undo-transaction undo-id) + (dch/commit-changes changes) + (when (some? swap-slot) + (sync-head id)) + (dwu/commit-undo-transaction undo-id)))))) (defn reset-components "Cancels all modifications in the shapes with the given ids" diff --git a/frontend/test/frontend_tests/state_components_sync_test.cljs b/frontend/test/frontend_tests/state_components_sync_test.cljs index 1751fe9a5..4928ad74c 100644 --- a/frontend/test/frontend_tests/state_components_sync_test.cljs +++ b/frontend/test/frontend_tests/state_components_sync_test.cljs @@ -588,7 +588,7 @@ (t/is (= (:fill-color shape1) clr/black)) (t/is (= (:fill-opacity shape1) 0)) (t/is (= (:name shape2) "Rect 1")) - (t/is (= (:touched shape2) nil)) + (t/is (= (:touched shape2) #{:fill-group})) (t/is (= (:fill-color shape2) clr/test)) (t/is (= (:fill-opacity shape2) 0.5)) (t/is (= (:name c-instance2) "Board")) -- Gitee From b9743891bbc4a69c8414579ee54bc90e65b50a1c Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 21 Mar 2024 10:48:47 +0100 Subject: [PATCH 0117/1266] :bug: Fix is-main-of? calculation for v2 components --- backend/src/app/srepl/fixes.clj | 2 +- common/src/app/common/types/component.cljc | 8 ++--- .../data/workspace/libraries_helpers.cljs | 34 +++++++++++-------- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/backend/src/app/srepl/fixes.clj b/backend/src/app/srepl/fixes.clj index 2d50bd8a8..ee40421df 100644 --- a/backend/src/app/srepl/fixes.clj +++ b/backend/src/app/srepl/fixes.clj @@ -179,7 +179,7 @@ component-child (first component-children)] (if (or (nil? child) (nil? component-child)) container - (let [container (if (and (not (ctk/is-main-of? component-child child)) + (let [container (if (and (not (ctk/is-main-of? component-child child true)) (nil? (ctk/get-swap-slot child)) (ctk/instance-head? child)) (let [slot (guess-swap-slot component-child component-container)] diff --git a/common/src/app/common/types/component.cljc b/common/src/app/common/types/component.cljc index 205454d71..8491462b3 100644 --- a/common/src/app/common/types/component.cljc +++ b/common/src/app/common/types/component.cljc @@ -138,10 +138,10 @@ (= (:component-file shape) file-id))) (defn is-main-of? - [shape-main shape-inst] - (and (:shape-ref shape-inst) - (or (= (:shape-ref shape-inst) (:id shape-main)) - (= (:shape-ref shape-inst) (:shape-ref shape-main))))) + [shape-main shape-inst components-v2] + (or (= (:shape-ref shape-inst) (:id shape-main)) + (and (= (:shape-ref shape-inst) (:shape-ref shape-main)) + (not components-v2)))) (defn main-instance? "Check if this shape is the root of the main instance of some diff --git a/frontend/src/app/main/data/workspace/libraries_helpers.cljs b/frontend/src/app/main/data/workspace/libraries_helpers.cljs index b3aa937db..f6de7fb46 100644 --- a/frontend/src/app/main/data/workspace/libraries_helpers.cljs +++ b/frontend/src/app/main/data/workspace/libraries_helpers.cljs @@ -759,7 +759,8 @@ root-inst root-main omit-touched? - set-remote-synced?) + set-remote-synced? + components-v2) changes)) both (fn [changes child-inst child-main] @@ -813,7 +814,8 @@ swapped moved false - reset?)))) + reset? + components-v2)))) (defn- generate-rename-component @@ -948,7 +950,8 @@ component-container container root-inst - root-main)) + root-main + components-v2)) only-main (fn [changes child-main] (remove-shape changes @@ -1001,7 +1004,8 @@ swapped moved true - true) + true + components-v2) ;; The inverse sync may be made on a component that is inside a ;; remote library. We need to separate changes that are from @@ -1019,7 +1023,7 @@ ;; ---- Operation generation helpers ---- (defn- compare-children - [changes children-inst children-main container-inst container-main file libraries only-inst-cb only-main-cb both-cb swapped-cb moved-cb inverse? reset?] + [changes children-inst children-main container-inst container-main file libraries only-inst-cb only-main-cb both-cb swapped-cb moved-cb inverse? reset? components-v2] (log/trace :msg "Compare children") (loop [children-inst (seq (or children-inst [])) children-main (seq (or children-main [])) @@ -1039,18 +1043,18 @@ (reduce only-inst-cb changes children-inst) :else - (if (or (ctk/is-main-of? child-main child-inst) + (if (or (ctk/is-main-of? child-main child-inst components-v2) (and (ctf/match-swap-slot? child-main child-inst container-inst container-main file libraries) (not reset?))) (recur (next children-inst) (next children-main) - (if (ctk/is-main-of? child-main child-inst) + (if (ctk/is-main-of? child-main child-inst components-v2) (both-cb changes child-inst child-main) (swapped-cb changes child-inst child-main))) - (let [child-inst' (d/seek #(or (ctk/is-main-of? child-main %) + (let [child-inst' (d/seek #(or (ctk/is-main-of? child-main % components-v2) (and (ctf/match-swap-slot? child-main % container-inst container-main file libraries) (not reset?))) children-inst) - child-main' (d/seek #(or (ctk/is-main-of? % child-inst) + child-main' (d/seek #(or (ctk/is-main-of? % child-inst components-v2) (and (ctf/match-swap-slot? % child-inst container-inst container-main file libraries) (not reset?))) children-main)] (cond @@ -1066,7 +1070,7 @@ :else (if inverse? - (let [is-main? (ctk/is-main-of? child-inst child-main')] + (let [is-main? (ctk/is-main-of? child-inst child-main' components-v2)] (recur (next children-inst) (remove #(= (:id %) (:id child-main')) children-main) (cond-> changes @@ -1076,7 +1080,7 @@ (swapped-cb child-inst child-main') :always (moved-cb child-inst child-main')))) - (let [is-main? (ctk/is-main-of? child-inst' child-main)] + (let [is-main? (ctk/is-main-of? child-inst' child-main components-v2)] (recur (remove #(= (:id %) (:id child-inst')) children-inst) (next children-main) (cond-> changes @@ -1088,13 +1092,13 @@ (moved-cb child-inst' child-main)))))))))))) (defn- add-shape-to-instance - [changes component-shape index component-page container root-instance root-main omit-touched? set-remote-synced?] + [changes component-shape index component-page container root-instance root-main omit-touched? set-remote-synced? components-v2] (log/info :msg (str "ADD [P " (pretty-uuid (:id container)) "] " (:name component-shape) " " (pretty-uuid (:id component-shape)))) (let [component-parent-shape (ctn/get-shape component-page (:parent-id component-shape)) - parent-shape (d/seek #(ctk/is-main-of? component-parent-shape %) + parent-shape (d/seek #(ctk/is-main-of? component-parent-shape % components-v2) (cfh/get-children-with-self (:objects container) (:id root-instance))) all-parents (into [(:id parent-shape)] @@ -1163,13 +1167,13 @@ changes'))) (defn- add-shape-to-main - [changes shape index component component-container page root-instance root-main] + [changes shape index component component-container page root-instance root-main components-v2] (log/info :msg (str "ADD [C " (pretty-uuid (:id component-container)) "] " (:name shape) " " (pretty-uuid (:id shape)))) (let [parent-shape (ctn/get-shape page (:parent-id shape)) - component-parent-shape (d/seek #(ctk/is-main-of? % parent-shape) + component-parent-shape (d/seek #(ctk/is-main-of? % parent-shape components-v2) (cfh/get-children-with-self (:objects component-container) (:id root-main))) all-parents (into [(:id component-parent-shape)] -- Gitee From 9a7a99e67acf7176ebb019d7d5c421c7947fbb25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Tue, 19 Mar 2024 17:31:24 +0100 Subject: [PATCH 0118/1266] :bug: Advance nested copies when duplicated --- common/src/app/common/types/container.cljc | 25 ++++++++++++++++ common/src/app/common/types/file.cljc | 14 ++++----- frontend/src/app/main/data/workspace.cljs | 30 +++++++++++++++++++ .../app/main/data/workspace/selection.cljs | 21 ++++++++----- 4 files changed, 75 insertions(+), 15 deletions(-) diff --git a/common/src/app/common/types/container.cljc b/common/src/app/common/types/container.cljc index ee2be1ae6..92f2969e0 100644 --- a/common/src/app/common/types/container.cljc +++ b/common/src/app/common/types/container.cljc @@ -154,6 +154,17 @@ :else (get-head-shape objects (get objects (:parent-id shape)) options)))) +(defn get-child-heads + "Get all recursive childs that are heads (when a head is found, do not + continue down looking for subsequent nested heads)." + [objects shape-id] + (let [shape (get objects shape-id)] + (if (nil? shape) + [] + (if (ctk/instance-head? shape) + [shape] + (mapcat #(get-child-heads objects %) (:shapes shape)))))) + (defn get-parent-heads "Get all component heads that are ancestors of the shape, in top-down order (include self if it's also a head)." @@ -170,6 +181,20 @@ (filter #(and (ctk/instance-head? %) (ctk/in-component-copy? %))) (reverse))) +(defn get-nesting-level-delta + "Get how many levels a shape will 'go up' if moved under the new parent." + [objects shape new-parent] + (let [orig-heads (->> (get-parent-copy-heads objects shape) + (remove #(= (:id %) (:id shape)))) + dest-heads (get-parent-copy-heads objects new-parent) + + ;; Calculate how many parent heads share in common the original + ;; shape and the new parent. + pairs (map vector orig-heads dest-heads) + common-count (count (take-while (fn [a b] (= a b)) pairs))] + + (- (count orig-heads) common-count))) + (defn get-instance-root "Get the parent shape at the top of the component instance (main or copy)." [objects shape] diff --git a/common/src/app/common/types/file.cljc b/common/src/app/common/types/file.cljc index 3afb89c24..12775f322 100644 --- a/common/src/app/common/types/file.cljc +++ b/common/src/app/common/types/file.cljc @@ -216,14 +216,14 @@ (some find-ref-shape-in-head (ctn/get-parent-heads (:objects container) shape)))) -(defn find-original-ref-shape - "Recursively call to find-ref-shape until find the original shape of the original component" - [file container libraries shape & options] +(defn advance-shape-ref + "Get the shape-ref of the near main of the shape, recursively repeated as many times + as the given levels." + [file container libraries shape levels & options] (let [ref-shape (find-ref-shape file container libraries shape options)] - (if (nil? (:shape-ref ref-shape)) - ref-shape - (find-original-ref-shape file container libraries ref-shape options)))) - + (if (or (nil? (:shape-ref ref-shape)) (not (pos? levels))) + (:id ref-shape) + (advance-shape-ref file container libraries ref-shape (dec levels) options)))) (defn find-ref-component "Locate the nearest component in the local file or libraries that is referenced by the diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index da8ac8eab..e2bf369b6 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -25,6 +25,7 @@ [app.common.types.component :as ctk] [app.common.types.components-list :as ctkl] [app.common.types.container :as ctn] + [app.common.types.file :as ctf] [app.common.types.shape :as cts] [app.common.types.shape-tree :as ctst] [app.common.types.shape.layout :as ctl] @@ -1598,6 +1599,34 @@ (let [frame (get objects parent-frame-id)] (gsh/translate-to-frame shape frame)))) + ;; When copying an instance that is nested inside another one, we need to + ;; advance the shape refs to one or more levels of remote mains. + (advance-copies [state selected data] + (let [file (wsh/get-local-file-full state) + libraries (wsh/get-libraries state) + page (wsh/lookup-page state) + heads (mapcat #(ctn/get-child-heads (:objects data) %) selected)] + (update data :objects + #(reduce (partial advance-copy file libraries page) + % + heads)))) + + (advance-copy [file libraries page objects shape] + (if (and (ctk/instance-head? shape) (not (ctk/main-instance? shape))) + (let [level-delta (ctn/get-nesting-level-delta (:objects page) shape uuid/zero)] + (if (pos? level-delta) + (reduce (partial advance-shape file libraries page level-delta) + objects + (cfh/get-children-with-self objects (:id shape))) + objects)) + objects)) + + (advance-shape [file libraries page level-delta objects shape] + (let [new-shape-ref (ctf/advance-shape-ref file page libraries shape level-delta {:include-deleted? true})] + (cond-> objects + (and (some? new-shape-ref) (not= new-shape-ref (:shape-ref shape))) + (assoc-in [(:id shape) :shape-ref] new-shape-ref)))) + (on-copy-error [error] (js/console.error "clipboard blocked:" error) (rx/empty))] @@ -1636,6 +1665,7 @@ (rx/merge-map (partial prepare-object objects frame-id)) (rx/reduce collect-data initial) (rx/map (partial sort-selected state)) + (rx/map (partial advance-copies state selected)) (rx/map #(t/encode-str % {:type :json-verbose})) (rx/map wapi/write-to-clipboard) (rx/catch on-copy-error) diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index 5fa17a631..22ec299c0 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -404,6 +404,7 @@ ids-map %2 delta + nil libraries library-data it @@ -459,10 +460,10 @@ ;; TODO: move to common.files.shape-helpers (defn- prepare-duplicate-shape-change - ([changes objects page unames update-unames! ids-map obj delta libraries library-data it file-id] - (prepare-duplicate-shape-change changes objects page unames update-unames! ids-map obj delta libraries library-data it file-id (:frame-id obj) (:parent-id obj) false false)) + ([changes objects page unames update-unames! ids-map obj delta level-delta libraries library-data it file-id] + (prepare-duplicate-shape-change changes objects page unames update-unames! ids-map obj delta level-delta libraries library-data it file-id (:frame-id obj) (:parent-id obj) false false)) - ([changes objects page unames update-unames! ids-map obj delta libraries library-data it file-id frame-id parent-id duplicating-component? child?] + ([changes objects page unames update-unames! ids-map obj delta level-delta libraries library-data it file-id frame-id parent-id duplicating-component? child?] (cond (nil? obj) changes @@ -486,11 +487,14 @@ duplicating-component? (or duplicating-component? (ctk/instance-head? obj)) is-component-main? (ctk/main-instance? obj) - original-ref-shape (-> (ctf/find-original-ref-shape nil page libraries obj {:include-deleted? true}) - :id) into-component? (and duplicating-component? (ctn/in-any-component? objects parent)) + level-delta (if (some? level-delta) + level-delta + (ctn/get-nesting-level-delta objects obj parent)) + new-shape-ref (ctf/advance-shape-ref nil page libraries obj level-delta {:include-deleted? true}) + regenerate-component (fn [changes shape] (let [components-v2 (dm/get-in library-data [:options :components-v2]) @@ -518,9 +522,9 @@ (cond-> (or frame? group? bool?) (assoc :shapes [])) - (cond-> (and (some? original-ref-shape) - (not= original-ref-shape (:shape-ref obj))) - (assoc :shape-ref original-ref-shape)) + (cond-> (and (some? new-shape-ref) + (not= new-shape-ref (:shape-ref obj))) + (assoc :shape-ref new-shape-ref)) (gsh/move delta) (d/update-when :interactions #(ctsi/remap-interactions % ids-map objects)) @@ -561,6 +565,7 @@ ids-map child delta + level-delta libraries library-data it -- Gitee From bd9874cf281c06a7cee5282f02eaa2b8beef3a62 Mon Sep 17 00:00:00 2001 From: AzazelN28 Date: Wed, 20 Mar 2024 16:42:20 +0100 Subject: [PATCH 0119/1266] :bug: Fix exit edit path mode --- frontend/src/app/main/data/workspace/common.cljs | 14 +++++++------- .../app/main/data/workspace/path/shortcuts.cljs | 8 ++------ 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/frontend/src/app/main/data/workspace/common.cljs b/frontend/src/app/main/data/workspace/common.cljs index 063c1e50a..d140bdb6b 100644 --- a/frontend/src/app/main/data/workspace/common.cljs +++ b/frontend/src/app/main/data/workspace/common.cljs @@ -168,13 +168,6 @@ ;; Toolbar ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defn toggle-toolbar-visibility - [] - (ptk/reify ::toggle-toolbar-visibility - ptk/UpdateEvent - (update [_ state] - (update-in state [:workspace-local :hide-toolbar] not)))) - (defn hide-toolbar [] (ptk/reify ::hide-toolbar @@ -188,3 +181,10 @@ ptk/UpdateEvent (update [_ state] (assoc-in state [:workspace-local :hide-toolbar] false)))) + +(defn toggle-toolbar-visibility + [] + (ptk/reify ::toggle-toolbar-visibility + ptk/UpdateEvent + (update [_ state] + (update-in state [:workspace-local :hide-toolbar] not)))) diff --git a/frontend/src/app/main/data/workspace/path/shortcuts.cljs b/frontend/src/app/main/data/workspace/path/shortcuts.cljs index 653b6659e..07fb3b1fa 100644 --- a/frontend/src/app/main/data/workspace/path/shortcuts.cljs +++ b/frontend/src/app/main/data/workspace/path/shortcuts.cljs @@ -22,13 +22,9 @@ (defn esc-pressed [] (ptk/reify ::esc-pressed ptk/WatchEvent - (watch [_ state _] + (watch [_ _ _] ;; Not interrupt when we're editing a path - (let [edition-id (or (get-in state [:workspace-drawing :object :id]) - (get-in state [:workspace-local :edition])) - path-edit-mode (get-in state [:workspace-local :edit-path edition-id :edit-mode])] - (when-not (= :draw path-edit-mode) - (rx/of :interrupt)))))) + (rx/of :interrupt)))) (def shortcuts {:move-nodes {:tooltip "M" -- Gitee From c0fa766b64761e5cb0e8a01e59e609286dfb4520 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 22 Mar 2024 08:40:31 +0100 Subject: [PATCH 0120/1266] :paperclip: Update version.txt file --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 227cea215..7ec1d6db4 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.0.0 +2.1.0 -- Gitee From 0d751b0e20b9622e707c94de2d16820f711c897e Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Thu, 21 Mar 2024 19:42:42 +0100 Subject: [PATCH 0121/1266] :bug: Fix Crash on moving a frame with copy outside a component --- frontend/src/app/main/data/workspace/transforms.cljs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/main/data/workspace/transforms.cljs b/frontend/src/app/main/data/workspace/transforms.cljs index 15622d4dd..80e38ab3e 100644 --- a/frontend/src/app/main/data/workspace/transforms.cljs +++ b/frontend/src/app/main/data/workspace/transforms.cljs @@ -910,6 +910,11 @@ (mapcat #(cfh/get-children-with-self objects (:id %))) (map :id)) + child-heads + (->> moving-shapes-ids + (mapcat #(ctn/get-child-heads objects %)) + (map :id)) + changes (-> (pcb/empty-changes it page-id) (pcb/with-objects objects) @@ -921,10 +926,7 @@ (pcb/update-shapes moving-shapes-children-ids #(dissoc % :component-root))) ;; Add component-root property when moving a component outside a component (cond-> (not (ctn/get-instance-root objects frame)) - (pcb/update-shapes moving-shapes-ids (fn [shape] - (if (ctk/instance-head? shape) - (assoc shape :component-root true) - shape)))) + (pcb/update-shapes child-heads #(assoc % :component-root true))) (pcb/update-shapes moving-shapes-ids #(cond-> % (cfh/frame-shape? %) (assoc :hide-in-viewer true))) (pcb/update-shapes shape-ids-to-detach ctk/detach-shape) (pcb/change-parent frame-id moving-shapes drop-index) -- Gitee From d8a6abfb88b68f1aeb1f2545596138cf22909ac1 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Thu, 21 Mar 2024 16:23:59 +0100 Subject: [PATCH 0122/1266] :bug: Fix image layer filter --- frontend/src/app/main/ui/workspace/sidebar/layers.cljs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/sidebar/layers.cljs b/frontend/src/app/main/ui/workspace/sidebar/layers.cljs index 4ab174a38..debc36252 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/layers.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/layers.cljs @@ -10,6 +10,7 @@ [app.common.data :as d] [app.common.data.macros :as dm] [app.common.files.helpers :as cfh] + [app.common.types.shape :as cts] [app.common.uuid :as uuid] [app.main.data.workspace :as dw] [app.main.refs :as refs] @@ -147,7 +148,10 @@ (or (empty? filters) (and (contains? filters :component) (contains? shape :component-id)) - (let [direct-filters (into #{} (filter #{:frame :rect :circle :path :bool :image :text}) filters)] + (and (contains? filters :image) + (some? (cts/has-images? shape))) + + (let [direct-filters (into #{} (filter #{:frame :rect :circle :path :bool :text}) filters)] (contains? direct-filters (:type shape))) (and (contains? filters :group) (and (cfh/group-shape? shape) @@ -166,7 +170,6 @@ :filters #{} :num-items 100}) state (deref state*) - current-filters (:filters state) current-items (:num-items state) current-search (:search-text state) -- Gitee From 87146bea855c4589f5fb8bf5cdabb42e1734300a Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Thu, 21 Mar 2024 17:25:15 +0100 Subject: [PATCH 0123/1266] :bug: Fix collapse group shadow independently --- .../app/main/ui/workspace/sidebar/options/shapes/group.cljs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/shapes/group.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/shapes/group.cljs index a892a87e0..f605ac544 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/shapes/group.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/shapes/group.cljs @@ -59,7 +59,7 @@ [layer-ids layer-values] (get-attrs [shape] objects :layer) [constraint-ids constraint-values] (get-attrs [shape] objects :constraint) [fill-ids fill-values] (get-attrs [shape] objects :fill) - [shadow-ids shadow-values] (get-attrs [shape] objects :shadow) + [shadow-ids _] (get-attrs [shape] objects :shadow) [blur-ids blur-values] (get-attrs [shape] objects :blur) [stroke-ids stroke-values] (get-attrs [shape] objects :stroke) [text-ids text-values] (get-attrs [shape] objects :text) @@ -108,7 +108,7 @@ :shared-libs shared-libs}] (when-not (empty? shadow-ids) - [:& shadow-menu {:type type :ids shadow-ids :values shadow-values}]) + [:& shadow-menu {:type type :ids ids :values (select-keys shape [:shadow])}]) (when-not (empty? blur-ids) [:& blur-menu {:type type :ids blur-ids :values blur-values}]) -- Gitee From 3d6eb9d4bb7ba4b821fdaf168f814d7015ea481a Mon Sep 17 00:00:00 2001 From: AzazelN28 Date: Fri, 22 Mar 2024 09:23:30 +0100 Subject: [PATCH 0124/1266] :bug: Fix check thumbnails size --- frontend/src/app/main/ui/workspace/shapes/frame.cljs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/workspace/shapes/frame.cljs b/frontend/src/app/main/ui/workspace/shapes/frame.cljs index 70e46664a..f4bd1f9d3 100644 --- a/frontend/src/app/main/ui/workspace/shapes/frame.cljs +++ b/frontend/src/app/main/ui/workspace/shapes/frame.cljs @@ -155,7 +155,8 @@ task-ref (mf/use-ref nil) on-load (mf/use-fn (fn [] - (check-thumbnail-size (mf/ref-val imposter-ref) bounds file-id page-id frame-id) + ;; We need to check if this is the culprit of the thumbnail regeneration. + ;; (check-thumbnail-size (mf/ref-val imposter-ref) bounds file-id page-id frame-id) (mf/set-ref-val! tries-ref 0) (reset! imposter-loaded true))) on-error (mf/use-fn -- Gitee From b3f4f389ff8c38090e646524bc1d4ea57ac388cf Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Fri, 22 Mar 2024 11:33:05 +0100 Subject: [PATCH 0125/1266] :sparkles: Add tooltips to some buttons --- .../src/app/main/ui/workspace/libraries.cljs | 2 ++ .../app/main/ui/workspace/sidebar/assets.cljs | 2 ++ frontend/translations/en.po | 16 ++++++++++++++++ frontend/translations/es.po | 16 ++++++++++++++++ 4 files changed, 36 insertions(+) diff --git a/frontend/src/app/main/ui/workspace/libraries.cljs b/frontend/src/app/main/ui/workspace/libraries.cljs index 564093850..ddbfe354a 100644 --- a/frontend/src/app/main/ui/workspace/libraries.cljs +++ b/frontend/src/app/main/ui/workspace/libraries.cljs @@ -239,6 +239,7 @@ [:button {:class (stl/css :item-button) :type "button" + :title (tr "workspace.libraries.unlink-library-btn") :data-library-id (dm/str id) :on-click unlink-library} detach-icon]])]] @@ -270,6 +271,7 @@ :typography-count typography-count}])]] [:button {:class (stl/css :item-button-shared) :data-library-id (dm/str id) + :title (tr "workspace.libraries.shared-library-btn") :on-click link-library} add-icon]])] diff --git a/frontend/src/app/main/ui/workspace/sidebar/assets.cljs b/frontend/src/app/main/ui/workspace/sidebar/assets.cljs index da7ed67fe..b3f755fc5 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/assets.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/assets.cljs @@ -168,6 +168,7 @@ :placeholder (tr "workspace.assets.search")} [:button {:on-click on-open-menu + :title (tr "workspace.assets.filter") :class (stl/css-case :section-button true :opened menu-open?)} i/filter-icon]] @@ -184,6 +185,7 @@ :options options :workspace? true}] [:button {:class (stl/css :sort-button) + :title (tr "workspace.assets.sort") :on-click toggle-ordering} (if reverse-sort? i/asc-sort diff --git a/frontend/translations/en.po b/frontend/translations/en.po index a0ad7a087..b94cd8fb4 100644 --- a/frontend/translations/en.po +++ b/frontend/translations/en.po @@ -3255,6 +3255,14 @@ msgstr "Rename group" msgid "workspace.assets.search" msgstr "Search assets" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.filter" +msgstr "Filter" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "Sort" + #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.selected-count" msgid_plural "workspace.assets.selected-count" @@ -3611,6 +3619,14 @@ msgstr "Search shared libraries" msgid "workspace.libraries.shared-libraries" msgstr "SHARED LIBRARIES" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.shared-library-btn" +msgstr "Connect library" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.unlink-library-btn" +msgstr "Disconnect library" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.loading" msgstr "Loading…" diff --git a/frontend/translations/es.po b/frontend/translations/es.po index 30b388b04..cec823c04 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -3312,6 +3312,14 @@ msgstr "Renombrar grupo" msgid "workspace.assets.search" msgstr "Buscar recursos" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.filter" +msgstr "Filtrar" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "Ordenar" + #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.selected-count" msgid_plural "workspace.assets.selected-count" @@ -3675,6 +3683,14 @@ msgstr "Buscar bibliotecas compartidas" msgid "workspace.libraries.shared-libraries" msgstr "BIBLIOTECAS COMPARTIDAS" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.shared-library-btn" +msgstr "Conectar biblioteca" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.unlink-library-btn" +msgstr "Desconectar biblioteca" + #: src/app/main/ui/workspace/sidebar/options/menus/text.cljs msgid "workspace.libraries.text.multiple-typography" msgstr "Varias tipografías" -- Gitee From bf5d95e069cbb9a16d6c0048d378c876287f7233 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Fri, 22 Mar 2024 10:46:06 +0100 Subject: [PATCH 0126/1266] :bug: Fix problem with fit-content on coponent copies --- common/src/app/common/types/container.cljc | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/common/src/app/common/types/container.cljc b/common/src/app/common/types/container.cljc index 92f2969e0..2034ab58c 100644 --- a/common/src/app/common/types/container.cljc +++ b/common/src/app/common/types/container.cljc @@ -311,6 +311,19 @@ [new-root-shape (map remap-frame-id new-shapes) updated-shapes])) +(defn remove-swap-keep-attrs + "Remove flex children properties except the fit-content for flex layouts. These are properties + that we don't have to propagate to copies but will be respected when swapping components" + [shape] + (let [layout-item-h-sizing (when (and (ctl/flex-layout? shape) (ctl/auto-width? shape)) :auto) + layout-item-v-sizing (when (and (ctl/flex-layout? shape) (ctl/auto-height? shape)) :auto)] + (-> shape + (d/without-keys ctk/swap-keep-attrs) + (cond-> (some? layout-item-h-sizing) + (assoc :layout-item-h-sizing layout-item-h-sizing)) + (cond-> (some? layout-item-v-sizing) + (assoc :layout-item-v-sizing layout-item-v-sizing))))) + (defn make-component-instance "Generate a new instance of the component inside the given container. @@ -331,7 +344,7 @@ (-> (get-shape component-page (:main-instance-id component)) (assoc :parent-id nil) ;; On v2 we force parent-id to nil in order to behave like v1 (assoc :frame-id uuid/zero) - (d/without-keys ctk/swap-keep-attrs)) + (remove-swap-keep-attrs)) (get-shape component (:id component))) orig-pos (gpt/point (:x component-shape) (:y component-shape)) -- Gitee From 2735229ffea0d5cbc977fde45a11eba1b1629912 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Fri, 22 Mar 2024 11:00:06 +0100 Subject: [PATCH 0127/1266] :bug: Fix problem with new line in comments --- frontend/src/app/main/ui/comments.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/app/main/ui/comments.scss b/frontend/src/app/main/ui/comments.scss index 51e6ddadb..c41dcd306 100644 --- a/frontend/src/app/main/ui/comments.scss +++ b/frontend/src/app/main/ui/comments.scss @@ -108,6 +108,7 @@ word-wrap: break-word; overflow-wrap: break-word; hyphens: auto; + white-space: pre-wrap; } .replies { -- Gitee From 9c2cbb2a4800d29d6d9dc4c26f6882a908cabd42 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Fri, 22 Mar 2024 12:08:34 +0100 Subject: [PATCH 0128/1266] :bug: Fix problem with scaling constraints --- common/src/app/common/geom/shapes/constraints.cljc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/common/src/app/common/geom/shapes/constraints.cljc b/common/src/app/common/geom/shapes/constraints.cljc index 3a2ab58b2..120d22290 100644 --- a/common/src/app/common/geom/shapes/constraints.cljc +++ b/common/src/app/common/geom/shapes/constraints.cljc @@ -326,7 +326,9 @@ reset-modifiers? (and (gpo/axis-aligned? parent-bounds) (gpo/axis-aligned? child-bounds) - (gpo/axis-aligned? transformed-parent-bounds)) + (gpo/axis-aligned? transformed-parent-bounds) + (not= :scale constraints-h) + (not= :scale constraints-v)) modifiers (if reset-modifiers? -- Gitee From 4ef62cc2dc2092e42d3dc86e6b9385ce9102e606 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Fri, 22 Mar 2024 12:22:17 +0100 Subject: [PATCH 0129/1266] :bug: Add gap between library elements modal --- frontend/src/app/main/ui/workspace/libraries.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/frontend/src/app/main/ui/workspace/libraries.scss b/frontend/src/app/main/ui/workspace/libraries.scss index 6d5143d73..0762d3b48 100644 --- a/frontend/src/app/main/ui/workspace/libraries.scss +++ b/frontend/src/app/main/ui/workspace/libraries.scss @@ -182,6 +182,11 @@ margin-block-start: $s-16; } +.libraries-updates-column { + display: grid; + gap: $s-4; +} + .libraries-updates-item { @include bodyLargeTypography; display: grid; -- Gitee From 7e803eeca8538ad6e623b9ac3033e20cacde4584 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 22 Mar 2024 12:58:50 +0100 Subject: [PATCH 0130/1266] :sparkles: Add minor improvements for fdata logging --- backend/src/app/features/fdata.clj | 6 ++++++ backend/src/app/util/pointer_map.clj | 3 --- backend/src/app/worker.clj | 1 - 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/backend/src/app/features/fdata.clj b/backend/src/app/features/fdata.clj index 3ec5fdfb5..baa63f693 100644 --- a/backend/src/app/features/fdata.clj +++ b/backend/src/app/features/fdata.clj @@ -62,6 +62,12 @@ {:id id :file-id file-id} {::sql/columns [:content] ::db/check-deleted false})] + + (l/trc :hint "load pointer" + :file-id (str file-id) + :id (str id) + :found (some? content)) + (when-not content (ex/raise :type :internal :code :fragment-not-found diff --git a/backend/src/app/util/pointer_map.clj b/backend/src/app/util/pointer_map.clj index f5933ecd6..16ce73bb0 100644 --- a/backend/src/app/util/pointer_map.clj +++ b/backend/src/app/util/pointer_map.clj @@ -37,7 +37,6 @@ (:require [app.common.fressian :as fres] - [app.common.logging :as l] [app.common.transit :as t] [app.common.uuid :as uuid] [app.util.time :as dt] @@ -78,8 +77,6 @@ IPointerMap (load! [_] - (l/trace :hint "pointer-map:load" :id (str id)) - (when-not *load-fn* (throw (UnsupportedOperationException. "load is not supported when *load-fn* is not bind"))) diff --git a/backend/src/app/worker.clj b/backend/src/app/worker.clj index 3a6bfe897..5c63ecfa0 100644 --- a/backend/src/app/worker.clj +++ b/backend/src/app/worker.clj @@ -683,7 +683,6 @@ deleted (when dedupe (-> (db/exec-one! conn [sql:remove-not-started-tasks task queue label]) :next.jdbc/update-count))] - (l/trc :hint "submit task" :name task :queue queue -- Gitee From a6c9ced5b39bd21a763de2701952c04807bb01a5 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 22 Mar 2024 12:59:16 +0100 Subject: [PATCH 0131/1266] :bug: Fix minor issue on internal srepl helpers --- backend/src/app/srepl/helpers.clj | 19 +++++++++++-------- backend/src/app/srepl/main.clj | 4 +++- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/backend/src/app/srepl/helpers.clj b/backend/src/app/srepl/helpers.clj index 010a0aa7a..38ea61dd8 100644 --- a/backend/src/app/srepl/helpers.clj +++ b/backend/src/app/srepl/helpers.clj @@ -35,15 +35,18 @@ (defn get-file "Get the migrated data of one file." - ([id] (get-file (or *system* main/system) id)) - ([system id] + ([id] (get-file (or *system* main/system) id nil)) + ([system id & {:keys [raw?] :as opts}] (db/run! system (fn [system] - (binding [pmap/*load-fn* (partial feat.fdata/load-pointer system id)] - (-> (files/get-file system id :migrate? false) - (update :data feat.fdata/process-pointers deref) - (update :data feat.fdata/process-objects (partial into {})) - (fmg/migrate-file))))))) + (let [file (files/get-file system id :migrate? false)] + (if raw? + file + (binding [pmap/*load-fn* (partial feat.fdata/load-pointer system id)] + (-> file + (update :data feat.fdata/process-pointers deref) + (update :data feat.fdata/process-objects (partial into {})) + (fmg/migrate-file))))))))) (defn update-file! [system {:keys [id] :as file}] @@ -166,7 +169,7 @@ (fsnap/take-file-snapshot! system {:file-id file-id :label label})) (let [conn (db/get-connection system) - file (get-file system file-id) + file (get-file system file-id opts) libs (when with-libraries? (->> (files/get-file-libraries conn file-id) (into [file] (map (fn [{:keys [id]}] diff --git a/backend/src/app/srepl/main.clj b/backend/src/app/srepl/main.clj index 17df79a9a..2f538d6f6 100644 --- a/backend/src/app/srepl/main.clj +++ b/backend/src/app/srepl/main.clj @@ -429,7 +429,9 @@ (try (l/trc :hint "process:file:start" :file-id (str file-id) :index idx) (let [system (assoc main/system ::db/rollback rollback?)] - (db/tx-run! system h/process-file! file-id update-fn opts)) + (db/tx-run! system (fn [system] + (binding [h/*system* system] + (h/process-file! system file-id update-fn opts))))) (catch Throwable cause (l/wrn :hint "unexpected error on processing file (skiping)" -- Gitee From a6562619a337205f4ffad4a093fc98f840e867e3 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 22 Mar 2024 12:59:36 +0100 Subject: [PATCH 0132/1266] :bug: Fix incorrect fragment cleaning on file-gc task --- backend/src/app/tasks/file_gc.clj | 88 ++++++++++++++++--------------- 1 file changed, 45 insertions(+), 43 deletions(-) diff --git a/backend/src/app/tasks/file_gc.clj b/backend/src/app/tasks/file_gc.clj index 29c07f78b..ed7815f68 100644 --- a/backend/src/app/tasks/file_gc.clj +++ b/backend/src/app/tasks/file_gc.clj @@ -65,19 +65,8 @@ :features (:features file) :version (:version file) :data (:data file)} - {:id id}))) - -(defn- process-file! - [cfg file] - (try - (let [file (decode-file cfg file) - file (clean-file! cfg file)] - (cfv/validate-file-schema! file) - (update-file! cfg file)) - (catch Throwable cause - (l/err :hint "error on cleaning file (skiping)" - :file-id (str (:id file)) - :cause cause)))) + {:id id} + {::db/return-keys true}))) (def ^:private sql:get-candidates @@ -118,13 +107,15 @@ unused (->> (db/exec! conn [sql:mark-file-media-object-deleted id ids]) (into #{} (map :id)))] + (l/dbg :hint "clean" :rel "file-media-object" :file-id (str id) :total (count unused)) + (doseq [id unused] (l/trc :hint "mark deleted" :rel "file-media-object" :id (str id) :file-id (str id))) - [(count unused) file])) + file)) (def ^:private sql:mark-file-object-thumbnails-deleted "UPDATE file_tagged_object_thumbnail @@ -149,13 +140,15 @@ unused (->> (db/exec! conn [sql:mark-file-object-thumbnails-deleted file-id ids]) (into #{} (map :object-id)))] + (l/dbg :hint "clean" :rel "file-object-thumbnail" :file-id (str file-id) :total (count unused)) + (doseq [object-id unused] (l/trc :hint "mark deleted" :rel "file-tagged-object-thumbnail" :object-id object-id :file-id (str file-id))) - [(count unused) file])) + file)) (def ^:private sql:mark-file-thumbnails-deleted "UPDATE file_thumbnail @@ -168,13 +161,15 @@ (let [unused (->> (db/exec! conn [sql:mark-file-thumbnails-deleted id revn]) (into #{} (map :revn)))] + (l/dbg :hint "clean" :rel "file-thumbnail" :file-id (str id) :total (count unused)) + (doseq [revn unused] (l/trc :hint "mark deleted" :rel "file-thumbnail" :revn revn :file-id (str id))) - [(count unused) file])) + file)) (def ^:private sql:get-files-for-library @@ -230,7 +225,9 @@ file (update file :data process-fdata unused)] - [(count unused) file])) + + (l/dbg :hint "clean" :rel "components" :file-id (str file-id) :total (count unused)) + file)) (def ^:private sql:get-changes "SELECT id, data FROM file_change @@ -242,47 +239,52 @@ SET deleted_at = now() WHERE file_id = ? AND id != ALL(?::uuid[]) + AND deleted_at IS NULL RETURNING id") +(def ^:private xf:collect-pointers + (comp (map :data) + (map blob/decode) + (mapcat feat.fdata/get-used-pointer-ids))) + (defn- clean-data-fragments! - [{:keys [::db/conn]} {:keys [id data] :as file}] - (let [used (->> (db/cursor conn [sql:get-changes id]) - (into (feat.fdata/get-used-pointer-ids data) - (comp (map :data) - (map blob/decode) - (mapcat feat.fdata/get-used-pointer-ids)))) + [{:keys [::db/conn]} {:keys [id] :as file}] + (let [used (into #{} xf:collect-pointers + (cons file (db/cursor conn [sql:get-changes id]))) unused (let [ids (db/create-array conn "uuid" used)] (->> (db/exec! conn [sql:mark-deleted-data-fragments id ids]) (into #{} (map :id))))] + (l/dbg :hint "clean" :rel "file-data-fragment" :file-id (str id) :total (count unused)) (doseq [id unused] (l/trc :hint "mark deleted" :rel "file-data-fragment" :id (str id) - :file-id (str id))) - - [(count unused) file])) - -(defn- clean-file! - [cfg {:keys [id] :as file}] - (let [[n1 file] (clean-file-media! cfg file) - [n2 file] (clean-file-thumbnails! cfg file) - [n3 file] (clean-file-object-thumbnails! cfg file) - [n4 file] (clean-deleted-components! cfg file) - [n5 file] (clean-data-fragments! cfg file)] - - (l/dbg :hint "file clened" - :file-id (str id) - :modified-at (dt/format-instant (:modified-at file)) - :media-objects n1 - :thumbnails n2 - :object-thumbnails n3 - :components n4 - :data-fragments n5) + :file-id (str id))))) +(defn- clean-media! + [cfg file] + (let [file (->> file + (clean-file-media! cfg) + (clean-file-thumbnails! cfg) + (clean-file-object-thumbnails! cfg) + (clean-deleted-components! cfg))] + (cfv/validate-file-schema! file) file)) +(defn- process-file! + [cfg file] + (try + (let [file (decode-file cfg file) + file (clean-media! cfg file) + file (update-file! cfg file)] + (clean-data-fragments! cfg file)) + (catch Throwable cause + (l/err :hint "error on cleaning file (skiping)" + :file-id (str (:id file)) + :cause cause)))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; HANDLER ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -- Gitee From 835c29fbeac0af449f03722b299804c89f73bf65 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 22 Mar 2024 13:05:22 +0100 Subject: [PATCH 0133/1266] :bug: Add missing audit event on copy-all-code --- frontend/src/app/main/ui/viewer/inspect/code.cljs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/viewer/inspect/code.cljs b/frontend/src/app/main/ui/viewer/inspect/code.cljs index c1e5ebcd2..bceac31ad 100644 --- a/frontend/src/app/main/ui/viewer/inspect/code.cljs +++ b/frontend/src/app/main/ui/viewer/inspect/code.cljs @@ -189,7 +189,14 @@ (mf/use-fn (mf/deps style-code markup-code images-data) (fn [] - (wapi/write-to-clipboard (gen-all-code style-code markup-code images-data)))) + (wapi/write-to-clipboard (gen-all-code style-code markup-code images-data)) + (let [origin (if (= :workspace from) + "workspace" + "viewer")] + (st/emit! (ptk/event ::ev/event + {::ev/name "copy-inspect-code" + ::ev/origin origin + :type "all"}))))) ;;handle-open-review ;;(mf/use-fn -- Gitee From 30e1c3b4fff10881334dfc834a963f45a778ccec Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Fri, 22 Mar 2024 16:45:51 +0100 Subject: [PATCH 0134/1266] :recycle: Add tagline and some refactor to login page --- .../resources/images/icons/brand-github.svg | 4 +- .../resources/images/icons/brand-gitlab.svg | 2 +- .../resources/images/icons/brand-google.svg | 2 +- .../resources/images/icons/brand-openid.svg | 2 +- frontend/src/app/main/ui/auth.cljs | 8 +- frontend/src/app/main/ui/auth.scss | 16 ++- frontend/src/app/main/ui/auth/common.scss | 104 ++++++++++-------- frontend/src/app/main/ui/auth/login.cljs | 46 ++++---- frontend/src/app/main/ui/auth/recovery.cljs | 8 +- .../app/main/ui/auth/recovery_request.cljs | 7 +- frontend/src/app/main/ui/auth/register.cljs | 30 ++--- .../src/app/main/ui/components/forms.scss | 4 +- .../src/app/main/ui/dashboard/team_form.scss | 1 + .../src/app/main/ui/onboarding/questions.scss | 1 + frontend/src/app/main/ui/viewer/login.cljs | 8 +- .../ui/workspace/sidebar/assets/groups.scss | 1 + frontend/translations/en.po | 8 +- frontend/translations/es.po | 8 +- 18 files changed, 147 insertions(+), 113 deletions(-) diff --git a/frontend/resources/images/icons/brand-github.svg b/frontend/resources/images/icons/brand-github.svg index 91ce17a60..cfb34953e 100644 --- a/frontend/resources/images/icons/brand-github.svg +++ b/frontend/resources/images/icons/brand-github.svg @@ -1,3 +1 @@ - - - \ No newline at end of file + \ No newline at end of file diff --git a/frontend/resources/images/icons/brand-gitlab.svg b/frontend/resources/images/icons/brand-gitlab.svg index 04993577b..591427ec6 100644 --- a/frontend/resources/images/icons/brand-gitlab.svg +++ b/frontend/resources/images/icons/brand-gitlab.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/frontend/resources/images/icons/brand-google.svg b/frontend/resources/images/icons/brand-google.svg index dba95de0f..eb61aab34 100644 --- a/frontend/resources/images/icons/brand-google.svg +++ b/frontend/resources/images/icons/brand-google.svg @@ -1 +1 @@ - + \ No newline at end of file diff --git a/frontend/resources/images/icons/brand-openid.svg b/frontend/resources/images/icons/brand-openid.svg index a335b6664..28dd05ed8 100644 --- a/frontend/resources/images/icons/brand-openid.svg +++ b/frontend/resources/images/icons/brand-openid.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/frontend/src/app/main/ui/auth.cljs b/frontend/src/app/main/ui/auth.cljs index 61fe0271b..636be2cd6 100644 --- a/frontend/src/app/main/ui/auth.cljs +++ b/frontend/src/app/main/ui/auth.cljs @@ -30,7 +30,7 @@ [:a {:href cf/terms-of-service-uri :target "_blank"} (tr "auth.terms-of-service")]) (when show-all? - [:span (tr "labels.and")]) + [:span (dm/str " " (tr "labels.and") " ")]) (when show-privacy? [:a {:href cf/privacy-policy-uri :target "_blank"} (tr "auth.privacy-policy")])]))) @@ -45,11 +45,12 @@ (dom/set-html-title (tr "title.default"))) [:main {:class (stl/css :auth-section)} + [:a {:href "#/" :class (stl/css :logo-btn)} i/logo] [:div {:class (stl/css :login-illustration)} i/login-illustration] [:section {:class (stl/css :auth-content)} - [:a {:href "#/" :class (stl/css :logo-btn)} i/logo] + (case section :auth-register [:& register-page {:params params}] @@ -69,6 +70,5 @@ :auth-recovery [:& recovery-page {:params params}]) - (when (or (= section :auth-login) - (= section :auth-register)) + (when (= section :auth-register) [:& terms-login])]])) diff --git a/frontend/src/app/main/ui/auth.scss b/frontend/src/app/main/ui/auth.scss index f993d5b7f..3c81a7c43 100644 --- a/frontend/src/app/main/ui/auth.scss +++ b/frontend/src/app/main/ui/auth.scss @@ -7,6 +7,7 @@ @use "common/refactor/common-refactor.scss" as *; .auth-section { + position: relative; align-items: center; background: var(--panel-background-color); display: grid; @@ -43,8 +44,9 @@ .auth-content { grid-column: 4 / 6; - display: flex; - flex-direction: column; + display: grid; + grid-template-rows: 1fr auto; + gap: $s-24; height: fit-content; max-width: $s-412; padding-bottom: $s-8; @@ -53,6 +55,9 @@ } .logo-btn { + position: absolute; + top: $s-20; + left: $s-20; display: flex; justify-content: flex-start; margin-bottom: $s-52; @@ -68,8 +73,6 @@ .terms-login { font-size: $fs-11; - position: absolute; - bottom: 0; width: 100%; display: flex; gap: $s-4; @@ -77,7 +80,10 @@ a { font-weight: $fw700; - color: $df-secondary; + color: $da-primary; + &:hover { + text-decoration: underline; + } } span { border-bottom: $s-1 solid transparent; diff --git a/frontend/src/app/main/ui/auth/common.scss b/frontend/src/app/main/ui/auth/common.scss index 23e2ba11c..a6b9e2f74 100644 --- a/frontend/src/app/main/ui/auth/common.scss +++ b/frontend/src/app/main/ui/auth/common.scss @@ -6,21 +6,21 @@ @use "common/refactor/common-refactor.scss" as *; -.auth-form { +.auth-form-wrapper { width: 100%; - padding-block-end: $s-16; - + padding-block-end: 0; + display: grid; + gap: $s-24; form { display: flex; flex-direction: column; gap: $s-12; - margin-block-end: $s-24; } } .separator { border-color: $db-quaternary; - margin: $s-24 0; + margin: 0; } .error-wrapper { @@ -33,11 +33,16 @@ } .auth-subtitle { - margin-top: $s-24; font-size: $fs-14; color: $df-secondary; } +.auth-tagline { + @include smallTitleTipography; + margin: 0; + color: $df-secondary; +} + .form-field { --input-width: 100%; --input-height: #{$s-40}; @@ -63,7 +68,6 @@ display: flex; flex-direction: column; gap: $s-12; - padding: $s-24 0; border-top: $s-1 solid $db-quaternary; span { @@ -77,8 +81,49 @@ text-transform: uppercase; font-size: $fs-11; } - &.register a { - @extend .button-primary; +} + +.go-back { + border-top: none; +} + +.demo-account { + padding: 0; + border-top: none; +} + +.links { + display: grid; + gap: $s-24; +} + +.register, +.account { + display: flex; + justify-content: center; + gap: $s-8; + padding: 0; +} + +.register-text, +.account-text { + text-align: right; + font-size: $fs-14; + color: $df-secondary; +} + +.register-link, +.account-link { + text-align: left; + background-color: transparent; + border: none; + display: inline; + font-size: $fs-14; + color: $da-primary; + font-weight: $fw400; + + &:hover { + text-decoration: underline; } } @@ -87,9 +132,12 @@ justify-content: flex-end; a { font-size: $fs-14; - color: $df-secondary; + color: $da-primary; font-weight: $fw400; } + &:hover { + text-decoration: underline; + } } .submit-btn, @@ -109,13 +157,15 @@ align-items: center; gap: $s-6; width: 100%; - + background-color: $db-tertiary; + color: var(--app-white); span { padding-top: $s-2; } &:hover { color: var(--app-white); + background-color: $db-quaternary; } } @@ -124,38 +174,6 @@ gap: $s-8; } -.btn-google-auth { - color: var(--google-login-foreground); - background-color: var(--google-login-background); - &:hover { - background: var(--google-login-background-hover); - } -} - -.btn-github-auth { - color: var(--github-login-foreground); - background: var(--github-login-background); - &:hover { - background: var(--github-login-background-hover); - } -} - -.btn-oidc-auth { - color: var(--oidc-login-foreground); - background: var(--oidc-login-background); - &:hover { - background: var(--oidc-login-background-hover); - } -} - -.btn-gitlab-auth { - color: var(--gitlab-login-foreground); - background: var(--gitlab-login-background); - &:hover { - background: var(--gitlab-login-background-hover); - } -} - .banner { margin: $s-16 0; } diff --git a/frontend/src/app/main/ui/auth/login.cljs b/frontend/src/app/main/ui/auth/login.cljs index cfd9d1d11..530dc2142 100644 --- a/frontend/src/app/main/ui/auth/login.cljs +++ b/frontend/src/app/main/ui/auth/login.cljs @@ -173,7 +173,9 @@ :data-test "login-banner" :role "alert"}]]) - [:& fm/form {:on-submit on-submit :form form} + [:& fm/form {:on-submit on-submit + :class (stl/css :login-form) + :form form} [:div {:class (stl/css :fields-row)} [:& fm/input {:name :email @@ -255,11 +257,11 @@ (when (k/enter? event) (login-oidc event))))] (when (contains? cf/flags :login-with-oidc) - [:div {:class (stl/css :link-entry :link-oidc)} - [:a {:tab-index "0" - :on-key-down handle-key-down - :on-click login-oidc} - (tr "auth.login-with-oidc-submit")]]))) + [:button {:tab-index "0" + :class (stl/css :link-entry :link-oidc) + :on-key-down handle-key-down + :on-click login-oidc} + (tr "auth.login-with-oidc-submit")]))) (mf/defc login-methods [{:keys [params on-success-callback origin] :as props}] @@ -282,35 +284,29 @@ [{:keys [params] :as props}] (let [go-register (mf/use-fn - #(st/emit! (rt/nav :auth-register {} params))) + #(st/emit! (rt/nav :auth-register {} params)))] - on-create-demo-profile - (mf/use-fn - #(st/emit! (du/create-demo-profile)))] - - [:div {:class (stl/css :auth-form)} + [:div {:class (stl/css :auth-form-wrapper)} [:h1 {:class (stl/css :auth-title) - :data-test "login-title"} (tr "auth.login-title")] + :data-test "login-title"} (tr "auth.login-account-title")] + + [:p {:class (stl/css :auth-tagline)} + (tr "auth.login-tagline")] (when (contains? cf/flags :demo-warning) [:& demo-warning]) - [:hr {:class (stl/css :separator)}] - [:& login-methods {:params params}] + [:hr {:class (stl/css :separator)}] + [:div {:class (stl/css :links)} (when (contains? cf/flags :registration) - [:div {:class (stl/css :link-entry :register)} - [:span (tr "auth.register") " "] + [:div {:class (stl/css :register)} + [:span {:class (stl/css :register-text)} + (tr "auth.register") " "] [:& lk/link {:action go-register + :class (stl/css :register-link) :data-test "register-submit"} - (tr "auth.register-submit")]])] - - (when (contains? cf/flags :demo-users) - [:div {:class (stl/css :link-entry :demo-account)} - [:span (tr "auth.create-demo-profile") " "] - [:& lk/link {:action on-create-demo-profile - :data-test "demo-account-link"} - (tr "auth.create-demo-account")]])])) + (tr "auth.register-submit")]])]])) diff --git a/frontend/src/app/main/ui/auth/recovery.cljs b/frontend/src/app/main/ui/auth/recovery.cljs index 1425d9d1e..a17ab8b0e 100644 --- a/frontend/src/app/main/ui/auth/recovery.cljs +++ b/frontend/src/app/main/ui/auth/recovery.cljs @@ -61,7 +61,9 @@ (fm/validate-not-empty :password-1 (tr "auth.password-not-empty")) (fm/validate-not-empty :password-2 (tr "auth.password-not-empty"))] :initial params)] - [:& fm/form {:on-submit on-submit :form form} + [:& fm/form {:on-submit on-submit + :class (stl/css :recovery-form) + :form form} [:div {:class (stl/css :fields-row)} [:& fm/input {:type "password" :name :password-1 @@ -84,13 +86,13 @@ (mf/defc recovery-page [{:keys [params] :as props}] - [:div {:class (stl/css :auth-form)} + [:div {:class (stl/css :auth-form-wrapper)} [:h1 {:class (stl/css :auth-title)} "Forgot your password?"] [:div {:class (stl/css :auth-subtitle)} "Please enter your new password"] [:hr {:class (stl/css :separator)}] [:& recovery-form {:params params}] [:div {:class (stl/css :links)} - [:div {:class (stl/css :link-entry)} + [:div {:class (stl/css :link-entry :go-back)} [:a {:on-click #(st/emit! (rt/nav :auth-login))} (tr "profile.recovery.go-to-login")]]]]) diff --git a/frontend/src/app/main/ui/auth/recovery_request.cljs b/frontend/src/app/main/ui/auth/recovery_request.cljs index d1d72ed2d..4e2bbff99 100644 --- a/frontend/src/app/main/ui/auth/recovery_request.cljs +++ b/frontend/src/app/main/ui/auth/recovery_request.cljs @@ -76,6 +76,7 @@ (st/emit! (du/request-profile-recovery params)))))] [:& fm/form {:on-submit on-submit + :class (stl/css :recovery-request-form) :form form} [:div {:class (stl/css :fields-row)} [:& fm/input {:name :email @@ -95,14 +96,14 @@ [{:keys [params on-success-callback go-back-callback] :as props}] (let [default-go-back #(st/emit! (rt/nav :auth-login)) go-back (or go-back-callback default-go-back)] - [:div {:class (stl/css :auth-form)} + [:div {:class (stl/css :auth-form-wrapper)} [:h1 {:class (stl/css :auth-title)} (tr "auth.recovery-request-title")] [:div {:class (stl/css :auth-subtitle)} (tr "auth.recovery-request-subtitle")] [:hr {:class (stl/css :separator)}] [:& recovery-form {:params params :on-success-callback on-success-callback}] - - [:div {:class (stl/css :link-entry)} + [:hr {:class (stl/css :separator)}] + [:div {:class (stl/css :link-entry :go-back)} [:& lk/link {:action go-back :data-test "go-back-link"} (tr "labels.go-back")]]])) diff --git a/frontend/src/app/main/ui/auth/register.cljs b/frontend/src/app/main/ui/auth/register.cljs index 1143d5928..51327de3f 100644 --- a/frontend/src/app/main/ui/auth/register.cljs +++ b/frontend/src/app/main/ui/auth/register.cljs @@ -132,19 +132,18 @@ [{:keys [params on-success-callback]}] [:* (when login/show-alt-login-buttons? - [:* - [:hr {:class (stl/css :separator)}] - [:& login/login-buttons {:params params}]]) + [:& login/login-buttons {:params params}]) [:hr {:class (stl/css :separator)}] [:& register-form {:params params :on-success-callback on-success-callback}]]) (mf/defc register-page {::mf/props :obj} [{:keys [params]}] - [:div {:class (stl/css :auth-form)} + [:div {:class (stl/css :auth-form-wrapper)} [:h1 {:class (stl/css :auth-title) :data-test "registration-title"} (tr "auth.register-title")] - [:div {:class (stl/css :auth-subtitle)} (tr "auth.register-subtitle")] + [:p {:class (stl/css :auth-tagline)} + (tr "auth.login-tagline")] (when (contains? cf/flags :demo-warning) [:& login/demo-warning]) @@ -152,18 +151,20 @@ [:& register-methods {:params params}] [:div {:class (stl/css :links)} - [:div {:class (stl/css :link-entry :account)} - [:span (tr "auth.already-have-account") " "] + [:div {:class (stl/css :account)} + [:span {:class (stl/css :account-text)} (tr "auth.already-have-account") " "] [:& lk/link {:action #(st/emit! (rt/nav :auth-login {} params)) + :class (stl/css :account-link) :data-test "login-here-link"} (tr "auth.login-here")]] (when (contains? cf/flags :demo-users) - [:div {:class (stl/css :link-entry :demo-users)} - [:span (tr "auth.create-demo-profile") " "] - [:& lk/link {:action #(st/emit! (du/create-demo-profile))} - (tr "auth.create-demo-account")]])]]) + [:* + [:hr {:class (stl/css :separator)}] + [:div {:class (stl/css :link-entry :demo-account)} + [:& lk/link {:action #(st/emit! (du/create-demo-profile))} + (tr "auth.create-demo-account")]]])]]) ;; --- PAGE: register validation @@ -228,7 +229,8 @@ (rx/subs! on-success (partial handle-register-error form))))))] - [:& fm/form {:on-submit on-submit :form form} + [:& fm/form {:on-submit on-submit :form form + :class (stl/css :register-validate-form)} [:div {:class (stl/css :fields-row)} [:& fm/input {:name :fullname :label (tr "auth.fullname") @@ -258,7 +260,7 @@ (mf/defc register-validate-page [{:keys [params]}] - [:div {:class (stl/css :auth-form)} + [:div {:class (stl/css :auth-form-wrapper)} [:h1 {:class (stl/css :auth-title) :data-test "register-title"} (tr "auth.register-title")] [:div {:class (stl/css :auth-subtitle)} (tr "auth.register-subtitle")] @@ -274,7 +276,7 @@ (mf/defc register-success-page [{:keys [params]}] - [:div {:class (stl/css :auth-form :register-success)} + [:div {:class (stl/css :auth-form-wrapper :register-success)} [:div {:class (stl/css :notification-icon)} i/icon-verify] [:div {:class (stl/css :notification-text)} (tr "auth.verification-email-sent")] [:div {:class (stl/css :notification-text-email)} (:email params "")] diff --git a/frontend/src/app/main/ui/components/forms.scss b/frontend/src/app/main/ui/components/forms.scss index 53db07493..d29571542 100644 --- a/frontend/src/app/main/ui/components/forms.scss +++ b/frontend/src/app/main/ui/components/forms.scss @@ -50,7 +50,6 @@ cursor: pointer; color: var(--modal-title-foreground-color); text-transform: uppercase; - margin-bottom: $s-8; input { @extend .input-element; color: var(--input-foreground-color-active); @@ -144,8 +143,9 @@ .hint { @include bodySmallTypography; - color: var(--modal-text-foreground-color); width: 99%; + margin-block-start: $s-8; + color: var(--modal-text-foreground-color); } .checkbox { diff --git a/frontend/src/app/main/ui/dashboard/team_form.scss b/frontend/src/app/main/ui/dashboard/team_form.scss index 2545950f8..d94cb4c28 100644 --- a/frontend/src/app/main/ui/dashboard/team_form.scss +++ b/frontend/src/app/main/ui/dashboard/team_form.scss @@ -37,6 +37,7 @@ .group-name-input { @extend .input-element-label; + margin-bottom: $s-8; label { @include flexColumn; @include bodySmallTypography; diff --git a/frontend/src/app/main/ui/onboarding/questions.scss b/frontend/src/app/main/ui/onboarding/questions.scss index c225e3ae6..1496215eb 100644 --- a/frontend/src/app/main/ui/onboarding/questions.scss +++ b/frontend/src/app/main/ui/onboarding/questions.scss @@ -127,6 +127,7 @@ height: $s-32; width: calc(100% - $s-24); margin-inline-start: $s-24; + margin-block-end: $s-8; } // STEP-4 diff --git a/frontend/src/app/main/ui/viewer/login.cljs b/frontend/src/app/main/ui/viewer/login.cljs index a4f2c2f65..3649d0195 100644 --- a/frontend/src/app/main/ui/viewer/login.cljs +++ b/frontend/src/app/main/ui/viewer/login.cljs @@ -84,11 +84,11 @@ [:div {:class (stl/css :form-container)} [:& login-methods {:on-success-callback success-login :origin :viewer}] [:div {:class (stl/css :links)} - [:div {:class (stl/css :link-entry)} + [:div {:class (stl/css :link-entry :recovery-request)} [:a {:on-click set-section :data-value "recovery-request"} (tr "auth.forgot-password")]] - [:div {:class (stl/css :link-entry)} + [:div {:class (stl/css :link-entry :register)} [:span (tr "auth.register") " "] [:a {:on-click set-section :data-value "register"} @@ -98,7 +98,7 @@ [:div {:class (stl/css :form-container)} [:& register-methods {:on-success-callback success-register}] [:div {:class (stl/css :links)} - [:div {:class (stl/css :link-entry)} + [:div {:class (stl/css :link-entry :account)} [:span (tr "auth.already-have-account") " "] [:a {:on-click set-section :data-value "login"} @@ -109,7 +109,7 @@ [:& register-validate-form {:params {:token @register-token} :on-success-callback success-email-sent}] [:div {:class (stl/css :links)} - [:div {:class (stl/css :link-entry)} + [:div {:class (stl/css :link-entry :register)} [:a {:on-click set-section :data-value "register"} (tr "labels.go-back")]]]] diff --git a/frontend/src/app/main/ui/workspace/sidebar/assets/groups.scss b/frontend/src/app/main/ui/workspace/sidebar/assets/groups.scss index aeafdfeca..1756829e3 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/assets/groups.scss +++ b/frontend/src/app/main/ui/workspace/sidebar/assets/groups.scss @@ -49,6 +49,7 @@ } .input-wrapper { @extend .input-with-label; + margin-bottom: $s-8; } .action-buttons { @extend .modal-action-btns; diff --git a/frontend/translations/en.po b/frontend/translations/en.po index a0ad7a087..466ffd5e4 100644 --- a/frontend/translations/en.po +++ b/frontend/translations/en.po @@ -58,8 +58,12 @@ msgid "auth.login-submit" msgstr "Login" #: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Great to see you again!" +msgid "auth.login-account-title" +msgstr "Log into my account" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-tagline" +msgstr "Penpot is the free open-source design tool for Design and Code collaboration" #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" diff --git a/frontend/translations/es.po b/frontend/translations/es.po index 30b388b04..fe5569327 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -61,8 +61,12 @@ msgid "auth.login-submit" msgstr "Entrar" #: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "¡Un placer verte de nuevo!" +msgid "auth.login-account-title" +msgstr "Entrar en mi cuenta" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-tagline" +msgstr "Penpot es la herramienta de diseño libre y open-source para la colaboración entre Diseño y Código" #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" -- Gitee From 83ac6024a22d946f8819f822de9bd2a7d7b7ac7b Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 1 Mar 2024 15:24:53 +0100 Subject: [PATCH 0135/1266] :fire: Remove old and unused scripts from frontend directory --- frontend/scripts/compress-png | 62 ----------------------------------- frontend/scripts/jvm-repl | 11 ------- 2 files changed, 73 deletions(-) delete mode 100755 frontend/scripts/compress-png delete mode 100755 frontend/scripts/jvm-repl diff --git a/frontend/scripts/compress-png b/frontend/scripts/compress-png deleted file mode 100755 index b18a64b96..000000000 --- a/frontend/scripts/compress-png +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env bash - -# This script automates compressing PNG images using the lossless Zopfli -# Compression Algorithm. The process is slow but can produce significantly -# better compression and, thus, smaller file sizes. -# -# This script is meant to be run manually, for example, before making a new -# release. -# -# Requirements -# -# zopflipng - https://github.com/google/zopfli -# Debian/Ubuntu: sudo apt install zopfli -# Fedora: sudo dnf install zopfli -# macOS: brew install zopfli -# -# Usage -# -# This script takes a single positional argument which is the path where to -# search for PNG files. By default, the target path is the current working -# directory. Run from the root of the repository to compress all PNG images. Run -# from the `frontend` subdirectory to compress all PNG images within that -# directory. Alternatively, run from any directory and pass an explicit path to -# `compress-png` to limit the script to that path/directory. - -set -o errexit -set -o nounset -set -o pipefail - -readonly TARGET="${1:-.}" -readonly ABS_TARGET="$(command -v realpath &>/dev/null && realpath "$TARGET")" - -function png_total_size() { - find "$TARGET" -type f -iname '*.png' -exec du -ch {} + | tail -1 -} - -echo "Compressing PNGs in ${ABS_TARGET:-$TARGET}" - -echo "Before" -png_total_size - -readonly opts=( - # More iterations means slower, potentially better compression. - #--iterations=500 - -m - # Try all filter strategies (slow). - #--filters=01234mepb - # According to docs, remove colors behind alpha channel 0. No visual - # difference, removes hidden information. - --lossy_transparent - # Avoid information loss that could affect how images are rendered, see - # https://github.com/penpot/penpot/issues/1533#issuecomment-1030005203 - # https://github.com/google/zopfli/issues/113 - --keepchunks=cHRM,gAMA,pHYs,iCCP,sRGB,oFFs,sTER - # Since we have git behind our back, overwrite PNG files in-place (only - # when result is smaller). - -y -) -time find "$TARGET" -type f -iname '*.png' -exec zopflipng "${opts[@]}" {} {} \; - -echo "After" -png_total_size diff --git a/frontend/scripts/jvm-repl b/frontend/scripts/jvm-repl deleted file mode 100755 index b59aaaca8..000000000 --- a/frontend/scripts/jvm-repl +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - -# A repl useful for debug macros. - -export OPTIONS="\ - -J-XX:-OmitStackTraceInFastThrow \ - -J-Xms50m -J-Xmx512m \ - -M:dev:jvm-repl"; - -set -ex; -exec clojure $OPTIONS; -- Gitee From ec9d67ae1e38b355c5adf62f0368f25573c843d6 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 1 Mar 2024 15:23:35 +0100 Subject: [PATCH 0136/1266] :tada: Add node scripts based compile & watch alternative to gulp --- docker/devenv/files/bashrc | 2 +- docker/devenv/files/start-tmux.sh | 6 +- frontend/package.json | 23 +- frontend/resources/templates/index.mustache | 5 +- frontend/resources/templates/render.mustache | 1 - frontend/scripts/_helpers.js | 405 +++++++++++++++++++ frontend/scripts/_worker.js | 97 +++++ frontend/scripts/build | 12 +- frontend/scripts/compile.js | 10 + frontend/scripts/watch.js | 74 ++++ frontend/yarn.lock | 284 ++++++++++++- 11 files changed, 895 insertions(+), 24 deletions(-) create mode 100644 frontend/scripts/_helpers.js create mode 100644 frontend/scripts/_worker.js create mode 100644 frontend/scripts/compile.js create mode 100644 frontend/scripts/watch.js diff --git a/docker/devenv/files/bashrc b/docker/devenv/files/bashrc index bb53eb472..745e3f901 100644 --- a/docker/devenv/files/bashrc +++ b/docker/devenv/files/bashrc @@ -1,7 +1,7 @@ #!/usr/bin/env bash export PATH=/usr/lib/jvm/openjdk/bin:/usr/local/nodejs/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin -export JAVA_OPTS="-Xmx900m -Xms50m" +export JAVA_OPTS="-Xmx1000m -Xms50m" alias l='ls --color -GFlh' alias rm='rm -r' diff --git a/docker/devenv/files/start-tmux.sh b/docker/devenv/files/start-tmux.sh index cb3048ddc..eb7bb39f4 100755 --- a/docker/devenv/files/start-tmux.sh +++ b/docker/devenv/files/start-tmux.sh @@ -19,12 +19,12 @@ popd tmux -2 new-session -d -s penpot -tmux rename-window -t penpot:0 'gulp' +tmux rename-window -t penpot:0 'frontend watch' tmux select-window -t penpot:0 tmux send-keys -t penpot 'cd penpot/frontend' enter C-l -tmux send-keys -t penpot 'npx gulp watch' enter +tmux send-keys -t penpot 'yarn run watch' enter -tmux new-window -t penpot:1 -n 'shadow watch' +tmux new-window -t penpot:1 -n 'frontend shadow' tmux select-window -t penpot:1 tmux send-keys -t penpot 'cd penpot/frontend' enter C-l tmux send-keys -t penpot 'clojure -M:dev:shadow-cljs watch main' enter diff --git a/frontend/package.json b/frontend/package.json index 7ed94d214..b17f98bde 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -19,21 +19,17 @@ "scripts": { "fmt:clj:check": "cljfmt check --parallel=false src/ test/", "fmt:clj": "cljfmt fix --parallel=true src/ test/", - "test:compile": "clojure -M:dev:shadow-cljs compile test --config-merge '{:autorun false}'", "lint:scss": "yarn run prettier -c resources/styles -c src/**/*.scss", "lint:scss:fix": "yarn run prettier -c resources/styles -c src/**/*.scss -w", "lint:clj": "clj-kondo --parallel --lint src/", + "test:compile": "clojure -M:dev:shadow-cljs compile test --config-merge '{:autorun false}'", "test:run": "node target/tests.cjs", "test:watch": "clojure -M:dev:shadow-cljs watch test", "test": "yarn run test:compile && yarn run test:run", - "gulp:watch": "gulp watch", - "watch": "shadow-cljs watch main", - "validate-translations": "node ./scripts/validate-translations.js", - "find-unused-translations": "node ./scripts/find-unused-translations.js", - "build:clean": "gulp clean:output && gulp clean:dist", - "build:styles": "gulp build:styles", - "build:assets": "gulp build:assets", - "build:copy": "gulp build:copy", + "translations:validate": "node ./scripts/validate-translations.js", + "translations:find-unused": "node ./scripts/find-unused-translations.js", + "compile": "node ./scripts/compile.js", + "watch": "node ./scripts/watch.js", "storybook:compile": "gulp template:storybook && clojure -M:dev:shadow-cljs compile storybook", "storybook:watch": "npm run storybook:compile && concurrently \"clojure -M:dev:shadow-cljs watch storybook\" \"storybook dev -p 6006\"", "storybook:build": "npm run storybook:compile && storybook build" @@ -67,19 +63,26 @@ "map-stream": "0.0.7", "marked": "^12.0.0", "mkdirp": "^3.0.1", + "mustache": "^4.2.0", "nodemon": "^3.1.0", "npm-run-all": "^4.1.5", + "p-limit": "^5.0.0", "postcss": "^8.4.35", "postcss-clean": "^1.2.2", "prettier": "^3.2.5", + "pretty-time": "^1.1.0", "prop-types": "^15.8.1", "rimraf": "^5.0.5", "sass": "^1.71.1", + "sass-embedded": "^1.71.1", "shadow-cljs": "2.27.4", "storybook": "^7.6.17", + "svg-sprite": "^2.0.2", "typescript": "^5.3.3", "vite": "^5.1.4", - "vitest": "^1.3.1" + "vitest": "^1.3.1", + "watcher": "^2.3.0", + "workerpool": "^9.1.0" }, "dependencies": { "date-fns": "^3.3.1", diff --git a/frontend/resources/templates/index.mustache b/frontend/resources/templates/index.mustache index 77475d7e3..ffaaa9be8 100644 --- a/frontend/resources/templates/index.mustache +++ b/frontend/resources/templates/index.mustache @@ -26,7 +26,6 @@ @@ -39,8 +38,8 @@ - {{>../public/images/sprites/symbol/icons.svg}} - {{>../public/images/sprites/symbol/cursors.svg}} + {{> ../public/images/sprites/symbol/icons.svg }} + {{> ../public/images/sprites/symbol/cursors.svg }}

{{# manifest}} diff --git a/frontend/resources/templates/render.mustache b/frontend/resources/templates/render.mustache index 5221030ae..cbaad7514 100644 --- a/frontend/resources/templates/render.mustache +++ b/frontend/resources/templates/render.mustache @@ -7,7 +7,6 @@ diff --git a/frontend/scripts/_helpers.js b/frontend/scripts/_helpers.js new file mode 100644 index 000000000..b086ce5ec --- /dev/null +++ b/frontend/scripts/_helpers.js @@ -0,0 +1,405 @@ +import proc from "node:child_process"; +import fs from "node:fs/promises"; +import ph from "node:path"; +import os from "node:os"; +import url from "node:url"; + +import * as marked from "marked"; +import SVGSpriter from "svg-sprite"; +import Watcher from "watcher"; +import gettext from "gettext-parser"; +import l from "lodash"; +import log from "fancy-log"; +import mustache from "mustache"; +import pLimit from "p-limit"; +import ppt from "pretty-time"; +import wpool from "workerpool"; + +function getCoreCount() { + return os.cpus().length; +} + +// const __filename = url.fileURLToPath(import.meta.url); +export const dirname = url.fileURLToPath(new URL(".", import.meta.url)); + +export function startWorker() { + return wpool.pool(dirname + "/_worker.js", { + maxWorkers: getCoreCount() + }); +} + +async function findFiles(basePath, predicate, options={}) { + predicate = predicate ?? function() { return true; } + + let files = await fs.readdir(basePath, {recursive: options.recursive ?? false}) + files = files.filter((path) => path.endsWith(".svg")); + files = files.map((path) => ph.join(basePath, path)); + + return files; +} + +function syncDirs(originPath, destPath) { + const command = `rsync -ar --delete ${originPath} ${destPath}`; + + return new Promise((resolve, reject) => { + proc.exec(command, (cause, stdout) => { + if (cause) { reject(cause); } + else { resolve(); } + }); + }); +} + +export function isSassFile(path) { + return path.endsWith(".scss"); +} + +export function isSvgFile(path) { + return path.endsWith(".scss"); +} + +export async function compileSass(worker, path, options) { + path = ph.resolve(path); + + log.info("compile:", path); + return worker.exec("compileSass", [path, options]); +} + +export async function compileSassAll(worker) { + const limitFn = pLimit(4); + const sourceDir = "src"; + + let files = await fs.readdir(sourceDir, { recursive: true }) + files = files.filter((path) => path.endsWith(".scss")); + files = files.map((path) => ph.join(sourceDir, path)); + // files = files.slice(0, 10); + + const procs = [ + compileSass(worker, "resources/styles/main-default.scss", {}), + compileSass(worker, "resources/styles/debug.scss", {}) + ]; + + for (let path of files) { + const proc = limitFn(() => compileSass(worker, path, {modules: true})); + procs.push(proc); + } + + const result = await Promise.all(procs); + + return result.reduce((acc, item, index) => { + acc.index[item.outputPath] = item.css; + acc.items.push(item.outputPath); + return acc; + }, {index:{}, items: []}); +} + +function compare(a, b) { + if (a < b) { + return -1; + } else if (a > b) { + return 1; + } else { + return 0; + } +} + +export function concatSass(data) { + const output = [] + + for (let path of data.items) { + output.push(data.index[path]); + } + + return output.join("\n"); +} + +export async function watch(baseDir, predicate, callback) { + predicate = predicate ?? (() => true); + + + const watcher = new Watcher(baseDir, { + persistent: true, + recursive: true + }); + + watcher.on("change", (path) => { + if (predicate(path)) { + callback(path); + } + }); +} + +async function readShadowManifest() { + try { + const manifestPath = "resources/public/js/manifest.json" + let content = await fs.readFile(manifestPath, { encoding: "utf8" }); + content = JSON.parse(content); + + const index = { + config: "js/config.js?ts=" + Date.now(), + polyfills: "js/polyfills.js?ts=" + Date.now(), + }; + + for (let item of content) { + index[item.name] = "js/" + item["output-name"]; + } + + return index; + } catch (cause) { + // log.error("error on reading manifest (using default)", cause); + return { + config: "js/config.js", + polyfills: "js/polyfills.js", + main: "js/main.js", + shared: "js/shared.js", + worker: "js/worker.js", + rasterizer: "js/rasterizer.js", + }; + } +} + +async function renderTemplate(path, context={}, partials={}) { + const content = await fs.readFile(path, {encoding: "utf-8"}); + + const ts = Math.floor(new Date()); + + context = Object.assign({}, context, { + ts: ts, + isDebug: process.env.NODE_ENV !== "production" + }); + + return mustache.render(content, context, partials); +} + +const renderer = { + link(href, title, text) { + return `${text}`; + }, +}; + +marked.use({ renderer }); + +async function readTranslations() { + const langs = [ + "ar", + "ca", + "de", + "el", + "en", + "eu", + "it", + "es", + "fa", + "fr", + "he", + "nb_NO", + "pl", + "pt_BR", + "ro", + "id", + "ru", + "tr", + "zh_CN", + "zh_Hant", + "hr", + "gl", + "pt_PT", + "cs", + "fo", + "ko", + "lv", + "nl", + // this happens when file does not matches correct + // iso code for the language. + ["ja_jp", "jpn_JP"], + // ["fi", "fin_FI"], + ["uk", "ukr_UA"], + "ha" + ]; + const result = {}; + + for (let lang of langs) { + let filename = `${lang}.po`; + if (l.isArray(lang)) { + filename = `${lang[1]}.po`; + lang = lang[0]; + } + + const content = await fs.readFile(`./translations/${filename}`, { encoding: "utf-8" }); + + lang = lang.toLowerCase(); + + const data = gettext.po.parse(content, "utf-8"); + const trdata = data.translations[""]; + + for (let key of Object.keys(trdata)) { + if (key === "") continue; + const comments = trdata[key].comments || {}; + + if (l.isNil(result[key])) { + result[key] = {}; + } + + const isMarkdown = l.includes(comments.flag, "markdown"); + + const msgs = trdata[key].msgstr; + if (msgs.length === 1) { + let message = msgs[0]; + if (isMarkdown) { + message = marked.parseInline(message); + } + + result[key][lang] = message; + } else { + result[key][lang] = msgs.map((item) => { + if (isMarkdown) { + return marked.parseInline(item); + } else { + return item; + } + }); + } + // if (key === "modals.delete-font.title") { + // console.dir(trdata[key], {depth:10}); + // console.dir(result[key], {depth:10}); + // } + } + } + + return JSON.stringify(result); +} + +async function generateSvgSprite(files, prefix) { + const spriter = new SVGSpriter({ + mode: { + symbol: { inline: true } + } + }); + + for (let path of files) { + const name = `${prefix}${ph.basename(path)}` + const content = await fs.readFile(path, {encoding: "utf-8"}); + spriter.add(name, name, content); + } + + const { result } = await spriter.compileAsync(); + const resource = result.symbol.sprite; + return resource.contents; +} + +async function generateSvgSprites() { + await fs.mkdir("resources/public/images/sprites/symbol/", { recursive: true }); + + const icons = await findFiles("resources/images/icons/", isSvgFile); + const iconsSprite = await generateSvgSprite(icons, "icon-"); + await fs.writeFile("resources/public/images/sprites/symbol/icons.svg", iconsSprite); + + const cursors = await findFiles("resources/images/cursors/", isSvgFile); + const cursorsSprite = await generateSvgSprite(icons, "cursor-"); + await fs.writeFile("resources/public/images/sprites/symbol/cursors.svg", cursorsSprite); +} + +async function generateTemplates() { + await fs.mkdir("./resources/public/", { recursive: true }); + + const translations = await readTranslations(); + const manifest = await readShadowManifest(); + let content; + + const iconsSprite = await fs.readFile("resources/public/images/sprites/symbol/icons.svg", "utf8"); + const cursorsSprite = await fs.readFile("resources/public/images/sprites/symbol/cursors.svg", "utf8"); + const partials = { + "../public/images/sprites/symbol/icons.svg": iconsSprite, + "../public/images/sprites/symbol/cursors.svg": cursorsSprite, + }; + + content = await renderTemplate("resources/templates/index.mustache", { + manifest: manifest, + translations: JSON.stringify(translations), + }, partials); + + await fs.writeFile("./resources/public/index.html", content); + + content = await renderTemplate("resources/templates/preview-body.mustache", { + manifest: manifest, + translations: JSON.stringify(translations), + }); + + await fs.writeFile("./.storybook/preview-body.html", content); + + content = await renderTemplate("resources/templates/render.mustache", { + manifest: manifest, + translations: JSON.stringify(translations), + }); + + await fs.writeFile("./resources/public/render.html", content); + + content = await renderTemplate("resources/templates/rasterizer.mustache", { + manifest: manifest, + translations: JSON.stringify(translations), + }); + + await fs.writeFile("./resources/public/rasterizer.html", content); +} + +export async function compileStyles() { + const worker = startWorker(); + const start = process.hrtime(); + + log.info("init: compile styles") + let result = await compileSassAll(worker); + result = concatSass(result); + + await fs.mkdir("./resources/public/css", { recursive: true }); + await fs.writeFile("./resources/public/css/main.css", result); + + const end = process.hrtime(start); + log.info("done: compile styles", `(${ppt(end)})`); + worker.terminate(); +} + +export async function compileSvgSprites() { + const start = process.hrtime(); + log.info("init: compile svgsprite") + await generateSvgSprites(); + const end = process.hrtime(start); + log.info("done: compile svgsprite", `(${ppt(end)})`); +} + +export async function compileTemplates() { + const start = process.hrtime(); + log.info("init: compile templates") + await generateTemplates(); + const end = process.hrtime(start); + log.info("done: compile templates", `(${ppt(end)})`); +} + +export async function compilePolyfills() { + const start = process.hrtime(); + log.info("init: compile polyfills") + + + const files = await findFiles("resources/polyfills/"); + let result = []; + for (let path of files) { + const content = await fs.readFile(path, {encoding:"utf-8"}); + result.push(content); + } + + await fs.mkdir("./resources/public/js", { recursive: true }); + fs.writeFile("resources/public/js/polyfills.js", result.join("\n")); + + const end = process.hrtime(start); + log.info("done: compile polyfills", `(${ppt(end)})`); +} + +export async function copyAssets() { + const start = process.hrtime(); + log.info("init: copy assets") + + await syncDirs("resources/images/", "resources/public/images/"); + await syncDirs("resources/fonts/", "resources/public/fonts/"); + + const end = process.hrtime(start); + log.info("done: copy assets", `(${ppt(end)})`); +} + diff --git a/frontend/scripts/_worker.js b/frontend/scripts/_worker.js new file mode 100644 index 000000000..eab272fbf --- /dev/null +++ b/frontend/scripts/_worker.js @@ -0,0 +1,97 @@ +import proc from "node:child_process"; +import fs from "node:fs/promises"; +import ph from "node:path"; +import url from "node:url"; +import * as sass from "sass-embedded"; +import log from "fancy-log"; + +import wpool from "workerpool"; +import postcss from "postcss"; +import modulesProcessor from "postcss-modules"; +import autoprefixerProcessor from "autoprefixer"; + +const compiler = await sass.initAsyncCompiler(); + +async function compileFile(path) { + const dir = ph.dirname(path); + const name = ph.basename(path, ".scss"); + const dest = `${dir}${ph.sep}${name}.css`; + + + return new Promise(async (resolve, reject) => { + try { + const result = await compiler.compileAsync(path, { + loadPaths: ["node_modules/animate.css", "resources/styles/common/", "resources/styles"], + sourceMap: false + }); + // console.dir(result); + resolve({ + inputPath: path, + outputPath: dest, + css: result.css + }); + } catch (cause) { + // console.error(cause); + reject(cause); + } + }); +} + +function configureModulesProcessor(options) { + const ROOT_NAME = "app"; + + return modulesProcessor({ + getJSON: (cssFileName, json, outputFileName) => { + // We do nothing because we don't want the generated JSON files + }, + // Calculates the whole css-module selector name. + // Should be the same as the one in the file `/src/app/main/style.clj` + generateScopedName: (selector, filename, css) => { + const dir = ph.dirname(filename); + const name = ph.basename(filename, ".css"); + const parts = dir.split("/"); + const rootIdx = parts.findIndex((s) => s === ROOT_NAME); + return parts.slice(rootIdx + 1).join("_") + "_" + name + "__" + selector; + }, + }); +} + +function configureProcessor(options={}) { + const processors = []; + + if (options.modules) { + processors.push(configureModulesProcessor(options)); + } + processors.push(autoprefixerProcessor); + + return postcss(processors); +} + +async function postProcessFile(data, options) { + const proc = configureProcessor(options); + + // We compile to the same path (all in memory) + const result = await proc.process(data.css, { + from: data.outputPath, + to: data.outputPath, + map: false, + }); + + return Object.assign(data, { + css: result.css + }); +} + +async function compile(path, options) { + let result = await compileFile(path); + return await postProcessFile(result, options); +} + +wpool.worker({ + compileSass: compile +}, { + onTerminate: async (code) => { + // log.info("worker: terminate"); + await compiler.dispose(); + } +}); diff --git a/frontend/scripts/build b/frontend/scripts/build index ccb9236b7..4254b5e22 100755 --- a/frontend/scripts/build +++ b/frontend/scripts/build @@ -1,4 +1,6 @@ #!/usr/bin/env bash +# NOTE: this script should be called from the parent directory to +# properly work. set -ex @@ -12,13 +14,13 @@ export EXTRA_PARAMS=$SHADOWCLJS_EXTRA_PARAMS; export NODE_ENV=production; yarn install || exit 1; -yarn run build:clean || exit 1; -yarn run build:styles || exit 1; +rm -rf resources/public; +rm -rf target/dist; -clojure -J-Xms100M -J-Xmx1000M -J-XX:+UseSerialGC -M:dev:shadow-cljs release main --config-merge "{:release-version \"${CURRENT_HASH}\"}" $EXTRA_PARAMS || exit 1 +clojure -M:dev:shadow-cljs release main --config-merge "{:release-version \"${CURRENT_HASH}\"}" $EXTRA_PARAMS || exit 1 -yarn run build:assets || exit 1; -yarn run build:copy || exit 1; +yarn run compile || exit 1; +rsync -avr resources/public/ target/dist/ sed -i -re "s/\%version\%/$CURRENT_VERSION/g" ./target/dist/index.html; sed -i -re "s/\%buildDate\%/$BUILD_DATE/g" ./target/dist/index.html; diff --git a/frontend/scripts/compile.js b/frontend/scripts/compile.js new file mode 100644 index 000000000..e04d07001 --- /dev/null +++ b/frontend/scripts/compile.js @@ -0,0 +1,10 @@ +import fs from "node:fs/promises"; +import ppt from "pretty-time"; +import log from "fancy-log"; +import * as h from "./_helpers.js"; + +await h.compileStyles(); +await h.copyAssets() +await h.compileSvgSprites() +await h.compileTemplates(); +await h.compilePolyfills(); diff --git a/frontend/scripts/watch.js b/frontend/scripts/watch.js new file mode 100644 index 000000000..80dda26b5 --- /dev/null +++ b/frontend/scripts/watch.js @@ -0,0 +1,74 @@ +import proc from "node:child_process"; +import fs from "node:fs/promises"; +import ph from "node:path"; + +import log from "fancy-log"; +import * as h from "./_helpers.js"; +import ppt from "pretty-time"; + +const worker = h.startWorker(); +let sass = null; + +async function compileSassAll() { + const start = process.hrtime(); + log.info("init: compile styles") + + sass = await h.compileSassAll(worker); + let output = await h.concatSass(sass); + await fs.writeFile("./resources/public/css/main.css", output); + + const end = process.hrtime(start); + log.info("done: compile styles", `(${ppt(end)})`); +} + +async function compileSass(path) { + const start = process.hrtime(); + log.info("changed:", path); + const result = await h.compileSass(worker, path, {modules:true}); + sass.index[result.outputPath] = result.css; + + const output = h.concatSass(sass); + + await fs.writeFile("./resources/public/css/main.css", output); + + const end = process.hrtime(start); + log.info("done:", `(${ppt(end)})`); +} + +await compileSassAll(); +await h.copyAssets() +await h.compileSvgSprites() +await h.compileTemplates(); +await h.compilePolyfills(); + +log.info("watch: scss src (~)") + +h.watch("src", h.isSassFile, async function (path) { + if (path.includes("common")) { + await compileSassAll(path); + } else { + await compileSass(path); + } +}); + +log.info("watch: scss: resources (~)") +h.watch("resources/styles", h.isSassFile, async function (path) { + log.info("changed:", path); + await compileSassAll() +}); + +log.info("watch: templates (~)") +h.watch("resources/templates", null, async function (path) { + log.info("changed:", path); + await h.compileTemplates(); +}); + +log.info("watch: assets (~)") +h.watch(["resources/images", "resources/fonts"], null, async function (path) { + log.info("changed:", path); + await h.compileSvgSprites(); + await h.copyAssets(); + await h.compileTemplates(); +}); + +worker.terminate(); diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 00770f86d..d4531a5c9 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -1471,6 +1471,13 @@ __metadata: languageName: node linkType: hard +"@bufbuild/protobuf@npm:^1.0.0": + version: 1.7.2 + resolution: "@bufbuild/protobuf@npm:1.7.2" + checksum: 37a968b7d314c1f2e2b996bb287c72dbeaacd5bc0d92e2f706437a51c4e483ff85b97994428e252d6acf99bd7b16435471413ae3af1bd9b416d72ab3f0decd22 + languageName: node + linkType: hard + "@colors/colors@npm:1.5.0": version: 1.5.0 resolution: "@colors/colors@npm:1.5.0" @@ -5333,6 +5340,13 @@ __metadata: languageName: node linkType: hard +"buffer-builder@npm:^0.2.0": + version: 0.2.0 + resolution: "buffer-builder@npm:0.2.0" + checksum: e50c3a379f4acaea75ade1ee3e8c07ed6d7c5dfc3f98adbcf0159bfe1a4ce8ca1fe3689e861fcdb3fcef0012ebd4345a6112a5b8a1185295452bb66d7b6dc8a1 + languageName: node + linkType: hard + "buffer-crc32@npm:~0.2.3": version: 0.2.13 resolution: "buffer-crc32@npm:0.2.13" @@ -6601,6 +6615,13 @@ __metadata: languageName: node linkType: hard +"dettle@npm:^1.0.1": + version: 1.0.1 + resolution: "dettle@npm:1.0.1" + checksum: 116a101aff93b2e1d5e505adbe53c4b898d924bc16f12f5ac629055ed8a8a19c86f916b834b178b7bfb352dd601bbfe01e49ccd56144a5a2f780f4bd374ef112 + languageName: node + linkType: hard + "diff-sequences@npm:^29.6.3": version: 29.6.3 resolution: "diff-sequences@npm:29.6.3" @@ -7939,13 +7960,16 @@ __metadata: marked: "npm:^12.0.0" mkdirp: "npm:^3.0.1" mousetrap: "npm:^1.6.5" + mustache: "npm:^4.2.0" nodemon: "npm:^3.1.0" npm-run-all: "npm:^4.1.5" opentype.js: "npm:^1.3.4" + p-limit: "npm:^5.0.0" postcss: "npm:^8.4.35" postcss-clean: "npm:^1.2.2" postcss-modules: "npm:^6.0.0" prettier: "npm:^3.2.5" + pretty-time: "npm:^1.1.0" prop-types: "npm:^15.8.1" randomcolor: "npm:^0.6.2" react: "npm:^18.2.0" @@ -7954,15 +7978,19 @@ __metadata: rimraf: "npm:^5.0.5" rxjs: "npm:8.0.0-alpha.14" sass: "npm:^1.71.1" + sass-embedded: "npm:^1.71.1" sax: "npm:^1.3.0" shadow-cljs: "npm:2.27.4" source-map-support: "npm:^0.5.21" storybook: "npm:^7.6.17" + svg-sprite: "npm:^2.0.2" tdigest: "npm:^0.1.2" typescript: "npm:^5.3.3" ua-parser-js: "npm:^1.0.37" vite: "npm:^5.1.4" vitest: "npm:^1.3.1" + watcher: "npm:^2.3.0" + workerpool: "npm:^9.1.0" xregexp: "npm:^5.1.1" languageName: unknown linkType: soft @@ -12087,6 +12115,13 @@ __metadata: languageName: node linkType: hard +"pretty-time@npm:^1.1.0": + version: 1.1.0 + resolution: "pretty-time@npm:1.1.0" + checksum: ba9d7af19cd43838fb2b147654990949575e400dc2cc24bf71ec4a6c4033a38ba8172b1014b597680c6d4d3c075e94648b2c13a7206c5f0c90b711c7388726f3 + languageName: node + linkType: hard + "prettysize@npm:^2.0.0": version: 2.0.0 resolution: "prettysize@npm:2.0.0" @@ -12122,6 +12157,13 @@ __metadata: languageName: node linkType: hard +"promise-make-naked@npm:^2.1.1": + version: 2.1.1 + resolution: "promise-make-naked@npm:2.1.1" + checksum: 97bc0a3eeae59f75e8716d5f511edb4ed7558fa304f93407a7c9de3645a19135abfc87d4bca0b570619d3314fa87db67ea3463c4a5068c4bbe7f8889c6883f1d + languageName: node + linkType: hard + "promise-retry@npm:^2.0.1": version: 2.0.1 resolution: "promise-retry@npm:2.0.1" @@ -13126,7 +13168,7 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:^7.8.1": +"rxjs@npm:^7.4.0, rxjs@npm:^7.8.1": version: 7.8.1 resolution: "rxjs@npm:7.8.1" dependencies: @@ -13195,6 +13237,205 @@ __metadata: languageName: node linkType: hard +"sass-embedded-android-arm64@npm:1.71.1": + version: 1.71.1 + resolution: "sass-embedded-android-arm64@npm:1.71.1" + bin: + sass: dart-sass/sass + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"sass-embedded-android-arm@npm:1.71.1": + version: 1.71.1 + resolution: "sass-embedded-android-arm@npm:1.71.1" + bin: + sass: dart-sass/sass + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"sass-embedded-android-ia32@npm:1.71.1": + version: 1.71.1 + resolution: "sass-embedded-android-ia32@npm:1.71.1" + bin: + sass: dart-sass/sass + conditions: os=android & cpu=ia32 + languageName: node + linkType: hard + +"sass-embedded-android-x64@npm:1.71.1": + version: 1.71.1 + resolution: "sass-embedded-android-x64@npm:1.71.1" + bin: + sass: dart-sass/sass + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"sass-embedded-darwin-arm64@npm:1.71.1": + version: 1.71.1 + resolution: "sass-embedded-darwin-arm64@npm:1.71.1" + bin: + sass: dart-sass/sass + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"sass-embedded-darwin-x64@npm:1.71.1": + version: 1.71.1 + resolution: "sass-embedded-darwin-x64@npm:1.71.1" + bin: + sass: dart-sass/sass + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"sass-embedded-linux-arm64@npm:1.71.1": + version: 1.71.1 + resolution: "sass-embedded-linux-arm64@npm:1.71.1" + bin: + sass: dart-sass/sass + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"sass-embedded-linux-arm@npm:1.71.1": + version: 1.71.1 + resolution: "sass-embedded-linux-arm@npm:1.71.1" + bin: + sass: dart-sass/sass + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"sass-embedded-linux-ia32@npm:1.71.1": + version: 1.71.1 + resolution: "sass-embedded-linux-ia32@npm:1.71.1" + bin: + sass: dart-sass/sass + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"sass-embedded-linux-musl-arm64@npm:1.71.1": + version: 1.71.1 + resolution: "sass-embedded-linux-musl-arm64@npm:1.71.1" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"sass-embedded-linux-musl-arm@npm:1.71.1": + version: 1.71.1 + resolution: "sass-embedded-linux-musl-arm@npm:1.71.1" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"sass-embedded-linux-musl-ia32@npm:1.71.1": + version: 1.71.1 + resolution: "sass-embedded-linux-musl-ia32@npm:1.71.1" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"sass-embedded-linux-musl-x64@npm:1.71.1": + version: 1.71.1 + resolution: "sass-embedded-linux-musl-x64@npm:1.71.1" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"sass-embedded-linux-x64@npm:1.71.1": + version: 1.71.1 + resolution: "sass-embedded-linux-x64@npm:1.71.1" + bin: + sass: dart-sass/sass + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"sass-embedded-win32-ia32@npm:1.71.1": + version: 1.71.1 + resolution: "sass-embedded-win32-ia32@npm:1.71.1" + bin: + sass: dart-sass/sass.bat + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"sass-embedded-win32-x64@npm:1.71.1": + version: 1.71.1 + resolution: "sass-embedded-win32-x64@npm:1.71.1" + bin: + sass: dart-sass/sass.bat + conditions: os=win32 & (cpu=arm64 | cpu=x64) + languageName: node + linkType: hard + +"sass-embedded@npm:^1.71.1": + version: 1.71.1 + resolution: "sass-embedded@npm:1.71.1" + dependencies: + "@bufbuild/protobuf": "npm:^1.0.0" + buffer-builder: "npm:^0.2.0" + immutable: "npm:^4.0.0" + rxjs: "npm:^7.4.0" + sass-embedded-android-arm: "npm:1.71.1" + sass-embedded-android-arm64: "npm:1.71.1" + sass-embedded-android-ia32: "npm:1.71.1" + sass-embedded-android-x64: "npm:1.71.1" + sass-embedded-darwin-arm64: "npm:1.71.1" + sass-embedded-darwin-x64: "npm:1.71.1" + sass-embedded-linux-arm: "npm:1.71.1" + sass-embedded-linux-arm64: "npm:1.71.1" + sass-embedded-linux-ia32: "npm:1.71.1" + sass-embedded-linux-musl-arm: "npm:1.71.1" + sass-embedded-linux-musl-arm64: "npm:1.71.1" + sass-embedded-linux-musl-ia32: "npm:1.71.1" + sass-embedded-linux-musl-x64: "npm:1.71.1" + sass-embedded-linux-x64: "npm:1.71.1" + sass-embedded-win32-ia32: "npm:1.71.1" + sass-embedded-win32-x64: "npm:1.71.1" + supports-color: "npm:^8.1.1" + varint: "npm:^6.0.0" + dependenciesMeta: + sass-embedded-android-arm: + optional: true + sass-embedded-android-arm64: + optional: true + sass-embedded-android-ia32: + optional: true + sass-embedded-android-x64: + optional: true + sass-embedded-darwin-arm64: + optional: true + sass-embedded-darwin-x64: + optional: true + sass-embedded-linux-arm: + optional: true + sass-embedded-linux-arm64: + optional: true + sass-embedded-linux-ia32: + optional: true + sass-embedded-linux-musl-arm: + optional: true + sass-embedded-linux-musl-arm64: + optional: true + sass-embedded-linux-musl-ia32: + optional: true + sass-embedded-linux-musl-x64: + optional: true + sass-embedded-linux-x64: + optional: true + sass-embedded-win32-ia32: + optional: true + sass-embedded-win32-x64: + optional: true + checksum: 637b00398b92b88db6b6dc8906d1c6e42c6907cd26afbda05ff3cdc19360eb2efeeaa8591c995f14e05aa8a08314bf7af219a4cbe1172a95365ca6b442b799d5 + languageName: node + linkType: hard + "sass@npm:^1.71.1": version: 1.71.1 resolution: "sass@npm:1.71.1" @@ -14038,6 +14279,13 @@ __metadata: languageName: node linkType: hard +"stubborn-fs@npm:^1.2.5": + version: 1.2.5 + resolution: "stubborn-fs@npm:1.2.5" + checksum: 0676befd9901d4dd4e162700fa0396f11d523998589cd6b61b06d1021db811dc4c1e6713869748c6cfa49d58beb9b6f0dc5b6aca6b075811b949e1602ce1e26f + languageName: node + linkType: hard + "supports-color@npm:^5.3.0, supports-color@npm:^5.4.0, supports-color@npm:^5.5.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" @@ -14316,6 +14564,15 @@ __metadata: languageName: node linkType: hard +"tiny-readdir@npm:^2.2.0": + version: 2.4.0 + resolution: "tiny-readdir@npm:2.4.0" + dependencies: + promise-make-naked: "npm:^2.1.1" + checksum: 0fd05eb677a9bf25f6ace33ad2eeaeb8555303321e18cd22c7a96391f099c1dd900d745738a1c6ba276540b1dc117f72fbbf60cc47bf1c7a73840745e3ea42f8 + languageName: node + linkType: hard + "tinybench@npm:^2.5.1": version: 2.5.1 resolution: "tinybench@npm:2.5.1" @@ -15071,6 +15328,13 @@ __metadata: languageName: node linkType: hard +"varint@npm:^6.0.0": + version: 6.0.0 + resolution: "varint@npm:6.0.0" + checksum: 737fc37088a62ed3bd21466e318d21ca7ac4991d0f25546f518f017703be4ed0f9df1c5559f1dd533dddba4435a1b758fd9230e4772c1a930ef72b42f5c750fd + languageName: node + linkType: hard + "vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" @@ -15311,6 +15575,17 @@ __metadata: languageName: node linkType: hard +"watcher@npm:^2.3.0": + version: 2.3.0 + resolution: "watcher@npm:2.3.0" + dependencies: + dettle: "npm:^1.0.1" + stubborn-fs: "npm:^1.2.5" + tiny-readdir: "npm:^2.2.0" + checksum: 7b1e47321ddf96882ebee6f619211b085f98bc0c3bceb94a58938e8d8d209f83283b30b645bdae148e063c3bc165eeafd73e3a14bdb7c3bfe519bd7536172257 + languageName: node + linkType: hard + "watchpack@npm:^2.2.0": version: 2.4.0 resolution: "watchpack@npm:2.4.0" @@ -15521,6 +15796,13 @@ __metadata: languageName: node linkType: hard +"workerpool@npm:^9.1.0": + version: 9.1.0 + resolution: "workerpool@npm:9.1.0" + checksum: 32d0807962be58a98ec22f5630be4a90f779f5faab06d5b4f000d32c11c8d5feb66be9bc5c73fdc49c91519e391db55c9e2e63392854b3df945744b2436a7efd + languageName: node + linkType: hard + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" -- Gitee From a75c32fa673f67ebf6e3871b2efb0c8ec1dd43d0 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Fri, 22 Mar 2024 17:16:32 +0100 Subject: [PATCH 0137/1266] :recycle: Refactor css --- frontend/src/app/main/ui/auth/common.scss | 110 +++++++----------- frontend/src/app/main/ui/auth/login.cljs | 20 ++-- frontend/src/app/main/ui/auth/recovery.cljs | 5 +- .../app/main/ui/auth/recovery_request.cljs | 3 +- frontend/src/app/main/ui/auth/register.cljs | 11 +- frontend/src/app/main/ui/viewer/login.cljs | 14 ++- 6 files changed, 70 insertions(+), 93 deletions(-) diff --git a/frontend/src/app/main/ui/auth/common.scss b/frontend/src/app/main/ui/auth/common.scss index a6b9e2f74..0075c7f14 100644 --- a/frontend/src/app/main/ui/auth/common.scss +++ b/frontend/src/app/main/ui/auth/common.scss @@ -19,28 +19,24 @@ } .separator { - border-color: $db-quaternary; + border-color: var(--modal-separator-backogrund-color); margin: 0; } -.error-wrapper { - padding-block-end: $s-8; -} - .auth-title { @include bigTitleTipography; - color: $df-primary; + color: var(--title-foreground-color-hover); } .auth-subtitle { - font-size: $fs-14; - color: $df-secondary; + @include smallTitleTipography; + color: var(--title-foreground-color); } .auth-tagline { @include smallTitleTipography; margin: 0; - color: $df-secondary; + color: var(--title-foreground-color); } .form-field { @@ -50,46 +46,32 @@ } .buttons-stack { - display: flex; - flex-direction: column; + display: grid; gap: $s-8; +} - button, - :global(.btn-primary) { - @extend .button-primary; - font-size: $fs-11; - height: $s-40; - text-transform: uppercase; - width: 100%; - } +.login-button, +.login-ldap-button { + @extend .button-primary; + @include uppercaseTitleTipography; + height: $s-40; + width: 100%; } -.link-entry { +.demo-account, +.go-back { display: flex; flex-direction: column; gap: $s-12; - border-top: $s-1 solid $db-quaternary; - - span { - text-align: center; - font-size: $fs-14; - color: $df-secondary; - } - a { - @extend .button-secondary; - height: $s-40; - text-transform: uppercase; - font-size: $fs-11; - } -} - -.go-back { - border-top: none; + padding: 0; + border-block-start: none; } -.demo-account { - padding: 0; - border-top: none; +.demo-account-link, +.go-back-link { + @extend .button-secondary; + @include uppercaseTitleTipography; + height: $s-40; } .links { @@ -98,7 +80,8 @@ } .register, -.account { +.account, +.recovery-request { display: flex; justify-content: center; gap: $s-8; @@ -106,21 +89,23 @@ } .register-text, -.account-text { +.account-text, +.recovery-text { + @include smallTitleTipography; text-align: right; - font-size: $fs-14; - color: $df-secondary; + color: var(--title-foreground-color); } .register-link, -.account-link { +.account-link, +.recovery-link, +.forgot-pass-link { + @include smallTitleTipography; text-align: left; background-color: transparent; border: none; display: inline; - font-size: $fs-14; - color: $da-primary; - font-weight: $fw400; + color: var(--link-foreground-color); &:hover { text-decoration: underline; @@ -130,42 +115,33 @@ .forgot-password { display: flex; justify-content: flex-end; - a { - font-size: $fs-14; - color: $da-primary; - font-weight: $fw400; - } - &:hover { - text-decoration: underline; - } } .submit-btn, .register-btn, .recover-btn { @extend .button-primary; - font-size: $fs-11; + @include uppercaseTitleTipography; height: $s-40; - text-transform: uppercase; width: 100%; } .login-btn { - border-radius: $br-8; - font-size: $fs-14; + @include smallTitleTipography; display: flex; align-items: center; gap: $s-6; width: 100%; - background-color: $db-tertiary; - color: var(--app-white); + border-radius: $br-8; + background-color: var(--button-secondary-background-color-rest); + color: var(--button-foreground-color-focus); span { - padding-top: $s-2; + padding-block-start: $s-2; } &:hover { - color: var(--app-white); - background-color: $db-quaternary; + color: var(--button-foreground-color-focus); + background-color: var(--button-secondary-background-color-hover); } } @@ -173,7 +149,3 @@ display: flex; gap: $s-8; } - -.banner { - margin: $s-16 0; -} diff --git a/frontend/src/app/main/ui/auth/login.cljs b/frontend/src/app/main/ui/auth/login.cljs index 530dc2142..79a8c599a 100644 --- a/frontend/src/app/main/ui/auth/login.cljs +++ b/frontend/src/app/main/ui/auth/login.cljs @@ -38,10 +38,9 @@ (mf/defc demo-warning {::mf/props :obj} [] - [:div {:class (stl/css :banner)} - [:& context-notification - {:type :warning - :content (tr "auth.demo-warning")}]]) + [:& context-notification + {:type :warning + :content (tr "auth.demo-warning")}]) (defn- login-with-oidc [event provider params] @@ -166,12 +165,11 @@ [:* (when-let [message @error] - [:div {:class (stl/css :error-wrapper)} - [:& context-notification - {:type :warning - :content message - :data-test "login-banner" - :role "alert"}]]) + [:& context-notification + {:type :warning + :content message + :data-test "login-banner" + :role "alert"}]) [:& fm/form {:on-submit on-submit :class (stl/css :login-form) @@ -195,6 +193,7 @@ (contains? cf/flags :login-with-password))) [:div {:class (stl/css :fields-row :forgot-password)} [:& lk/link {:action on-recovery-request + :class (stl/css :forgot-pass-link) :data-test "forgot-password"} (tr "auth.forgot-password")]]) @@ -209,6 +208,7 @@ (when (contains? cf/flags :login-with-ldap) [:> fm/submit-button* {:label (tr "auth.login-with-ldap-submit") + :class (stl/css :login-ldap-button) :on-click on-submit-ldap}])]]])) (mf/defc login-buttons diff --git a/frontend/src/app/main/ui/auth/recovery.cljs b/frontend/src/app/main/ui/auth/recovery.cljs index a17ab8b0e..85657eef6 100644 --- a/frontend/src/app/main/ui/auth/recovery.cljs +++ b/frontend/src/app/main/ui/auth/recovery.cljs @@ -93,6 +93,7 @@ [:& recovery-form {:params params}] [:div {:class (stl/css :links)} - [:div {:class (stl/css :link-entry :go-back)} - [:a {:on-click #(st/emit! (rt/nav :auth-login))} + [:div {:class (stl/css :go-back)} + [:a {:on-click #(st/emit! (rt/nav :auth-login)) + :class (stl/css :go-back-link)} (tr "profile.recovery.go-to-login")]]]]) diff --git a/frontend/src/app/main/ui/auth/recovery_request.cljs b/frontend/src/app/main/ui/auth/recovery_request.cljs index 4e2bbff99..b2d116daf 100644 --- a/frontend/src/app/main/ui/auth/recovery_request.cljs +++ b/frontend/src/app/main/ui/auth/recovery_request.cljs @@ -103,7 +103,8 @@ [:& recovery-form {:params params :on-success-callback on-success-callback}] [:hr {:class (stl/css :separator)}] - [:div {:class (stl/css :link-entry :go-back)} + [:div {:class (stl/css :go-back)} [:& lk/link {:action go-back + :class (stl/css :go-back-link) :data-test "go-back-link"} (tr "labels.go-back")]]])) diff --git a/frontend/src/app/main/ui/auth/register.cljs b/frontend/src/app/main/ui/auth/register.cljs index 51327de3f..633ac1177 100644 --- a/frontend/src/app/main/ui/auth/register.cljs +++ b/frontend/src/app/main/ui/auth/register.cljs @@ -153,7 +153,6 @@ [:div {:class (stl/css :links)} [:div {:class (stl/css :account)} [:span {:class (stl/css :account-text)} (tr "auth.already-have-account") " "] - [:& lk/link {:action #(st/emit! (rt/nav :auth-login {} params)) :class (stl/css :account-link) :data-test "login-here-link"} @@ -162,8 +161,9 @@ (when (contains? cf/flags :demo-users) [:* [:hr {:class (stl/css :separator)}] - [:div {:class (stl/css :link-entry :demo-account)} - [:& lk/link {:action #(st/emit! (du/create-demo-profile))} + [:div {:class (stl/css :demo-account)} + [:& lk/link {:action #(st/emit! (du/create-demo-profile)) + :class (stl/css :demo-account-link)} (tr "auth.create-demo-account")]]])]]) ;; --- PAGE: register validation @@ -270,8 +270,9 @@ [:& register-validate-form {:params params}] [:div {:class (stl/css :links)} - [:div {:class (stl/css :link-entry :go-back)} - [:& lk/link {:action #(st/emit! (rt/nav :auth-register {} {}))} + [:div {:class (stl/css :go-back)} + [:& lk/link {:action #(st/emit! (rt/nav :auth-register {} {})) + :class (stl/css :go-back-link)} (tr "labels.go-back")]]]]) (mf/defc register-success-page diff --git a/frontend/src/app/main/ui/viewer/login.cljs b/frontend/src/app/main/ui/viewer/login.cljs index 3649d0195..1a1e692dc 100644 --- a/frontend/src/app/main/ui/viewer/login.cljs +++ b/frontend/src/app/main/ui/viewer/login.cljs @@ -78,19 +78,21 @@ :on-click close} i/close]] [:div {:class (stl/css :modal-content)} - (case current-section :login [:div {:class (stl/css :form-container)} [:& login-methods {:on-success-callback success-login :origin :viewer}] [:div {:class (stl/css :links)} - [:div {:class (stl/css :link-entry :recovery-request)} + [:div {:class (stl/css :recovery-request)} [:a {:on-click set-section + :class (stl/css :recovery-link) :data-value "recovery-request"} (tr "auth.forgot-password")]] - [:div {:class (stl/css :link-entry :register)} - [:span (tr "auth.register") " "] + [:div {:class (stl/css :register)} + [:span {:class (stl/css :register-text)} + (tr "auth.register") " "] [:a {:on-click set-section + :class (stl/css :register-link) :data-value "register"} (tr "auth.register-submit")]]]] @@ -98,7 +100,7 @@ [:div {:class (stl/css :form-container)} [:& register-methods {:on-success-callback success-register}] [:div {:class (stl/css :links)} - [:div {:class (stl/css :link-entry :account)} + [:div {:class (stl/css :account)} [:span (tr "auth.already-have-account") " "] [:a {:on-click set-section :data-value "login"} @@ -109,7 +111,7 @@ [:& register-validate-form {:params {:token @register-token} :on-success-callback success-email-sent}] [:div {:class (stl/css :links)} - [:div {:class (stl/css :link-entry :register)} + [:div {:class (stl/css :register)} [:a {:on-click set-section :data-value "register"} (tr "labels.go-back")]]]] -- Gitee From 94f9551b923890d113574dd31ebc8010f87529ca Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 25 Mar 2024 09:20:12 +0100 Subject: [PATCH 0138/1266] :bug: Fix problem with gradient fill text --- frontend/src/app/main/ui/shapes/shape.cljs | 7 +++++-- frontend/src/app/main/ui/shapes/text/svg_text.cljs | 5 +++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/main/ui/shapes/shape.cljs b/frontend/src/app/main/ui/shapes/shape.cljs index 47b32bf52..cbda63671 100644 --- a/frontend/src/app/main/ui/shapes/shape.cljs +++ b/frontend/src/app/main/ui/shapes/shape.cljs @@ -121,7 +121,10 @@ [:& filters/filters {:shape shape :filter-id filter-id}] [:& filters/filters {:shape shape-without-blur :filter-id (dm/fmt "filter-shadow-%" render-id)}] [:& filters/filters {:shape shape-without-shadows :filter-id (dm/fmt "filter-blur-%" render-id)}] - [:& fills/fills {:shape shape :render-id render-id}] - [:& frame/frame-clip-def {:shape shape :render-id render-id}]] + [:& frame/frame-clip-def {:shape shape :render-id render-id}] + + ;; Text fills need to be defined afterwards because they are specified per text-block + (when-not (cfh/text-shape? shape) + [:& fills/fills {:shape shape :render-id render-id}])] children]])) diff --git a/frontend/src/app/main/ui/shapes/text/svg_text.cljs b/frontend/src/app/main/ui/shapes/text/svg_text.cljs index bb5fe3e0c..20c8e8edc 100644 --- a/frontend/src/app/main/ui/shapes/text/svg_text.cljs +++ b/frontend/src/app/main/ui/shapes/text/svg_text.cljs @@ -13,6 +13,7 @@ [app.main.ui.context :as muc] [app.main.ui.shapes.attrs :as attrs] [app.main.ui.shapes.custom-stroke :refer [shape-custom-strokes]] + [app.main.ui.shapes.fills :as fills] [app.main.ui.shapes.gradients :as grad] [app.util.object :as obj] [rumext.v2 :as mf])) @@ -103,5 +104,9 @@ render-id (dm/str render-id "-" index)] [:& (mf/provider muc/render-id) {:key index :value render-id} + ;; Text fills definition. Need to be defined per-text block + [:defs + [:& fills/fills {:shape shape :render-id render-id}]] + [:& shape-custom-strokes {:shape shape :position index :render-id render-id} [:> :text props (:text data)]]]))]])) -- Gitee From 33c12117ccc1792f062be65357f4322820662aed Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 25 Mar 2024 09:49:38 +0100 Subject: [PATCH 0139/1266] :bug: Fix problem with gradients and borders --- frontend/src/app/main/ui/shapes/custom_stroke.cljs | 6 ++++-- frontend/src/app/main/ui/shapes/gradients.cljs | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/main/ui/shapes/custom_stroke.cljs b/frontend/src/app/main/ui/shapes/custom_stroke.cljs index 11c430a2d..35d2bd7f0 100644 --- a/frontend/src/app/main/ui/shapes/custom_stroke.cljs +++ b/frontend/src/app/main/ui/shapes/custom_stroke.cljs @@ -209,7 +209,8 @@ props #js {:id (dm/str "stroke-color-gradient-" render-id "-" index) :gradient gradient - :shape shape} + :shape shape + :force-transform (cfh/path-shape? shape)} stroke-image (:stroke-image stroke) uri (when stroke-image (cf/resolve-file-media stroke-image)) @@ -248,7 +249,8 @@ :width (/ w (dm/get-prop selrect :width)) :height (/ h (dm/get-prop selrect :height)) :viewBox "0 0 1 1" - :preserveAspectRatio "xMidYMid slice"} + :preserveAspectRatio "xMidYMid slice" + :patternTransform (when (cfh/path-shape? shape) (gsh/transform-str shape))} [:> :image image-props]]) (cond diff --git a/frontend/src/app/main/ui/shapes/gradients.cljs b/frontend/src/app/main/ui/shapes/gradients.cljs index 1b44a76c3..d2a74a119 100644 --- a/frontend/src/app/main/ui/shapes/gradients.cljs +++ b/frontend/src/app/main/ui/shapes/gradients.cljs @@ -30,9 +30,9 @@ (mf/defc linear-gradient {::mf/wrap-props false} - [{:keys [id gradient shape]}] + [{:keys [id gradient shape force-transform]}] (let [transform (mf/with-memo [shape] - (when (cfh/frame-shape? shape) + (when force-transform (gsh/transform-matrix shape nil (gpt/point 0.5 0.5)))) metadata? (mf/use-ctx ed/include-metadata-ctx) -- Gitee From fd24831c7122b97f57c40f18546ca475d24a9610 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 25 Mar 2024 10:46:15 +0100 Subject: [PATCH 0140/1266] :sparkles: Move audit tasks to separated namespace files --- backend/src/app/loggers/audit.clj | 141 ------------------ .../src/app/loggers/audit/archive_task.clj | 140 +++++++++++++++++ backend/src/app/loggers/audit/gc_task.clj | 31 ++++ backend/src/app/main.clj | 9 +- 4 files changed, 175 insertions(+), 146 deletions(-) create mode 100644 backend/src/app/loggers/audit/archive_task.clj create mode 100644 backend/src/app/loggers/audit/gc_task.clj diff --git a/backend/src/app/loggers/audit.clj b/backend/src/app/loggers/audit.clj index aead09110..211799d30 100644 --- a/backend/src/app/loggers/audit.clj +++ b/backend/src/app/loggers/audit.clj @@ -9,31 +9,24 @@ (:require [app.common.data :as d] [app.common.data.macros :as dm] - [app.common.exceptions :as ex] [app.common.logging :as l] [app.common.spec :as us] - [app.common.transit :as t] [app.common.uuid :as uuid] [app.config :as cf] [app.db :as db] [app.http :as-alias http] [app.http.access-token :as-alias actoken] - [app.http.client :as http.client] [app.loggers.audit.tasks :as-alias tasks] [app.loggers.webhooks :as-alias webhooks] - [app.main :as-alias main] [app.rpc :as-alias rpc] [app.rpc.retry :as rtry] [app.setup :as-alias setup] - [app.tokens :as tokens] [app.util.services :as-alias sv] [app.util.time :as dt] [app.worker :as wrk] [clojure.spec.alpha :as s] [cuerdas.core :as str] [integrant.core :as ig] - [lambdaisland.uri :as u] - [promesa.exec :as px] [ring.request :as rreq])) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -249,137 +242,3 @@ (rtry/invoke! cfg db/tx-run! handle-event! event)) (catch Throwable cause (l/error :hint "unexpected error processing event" :cause cause)))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; TASK: ARCHIVE -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;; This is a task responsible to send the accumulated events to -;; external service for archival. - -(declare archive-events) - -(s/def ::tasks/uri ::us/string) - -(defmethod ig/pre-init-spec ::tasks/archive-task [_] - (s/keys :req [::db/pool ::setup/props ::http.client/client])) - -(defmethod ig/init-key ::tasks/archive - [_ cfg] - (fn [params] - ;; NOTE: this let allows overwrite default configured values from - ;; the repl, when manually invoking the task. - (let [enabled (or (contains? cf/flags :audit-log-archive) - (:enabled params false)) - uri (cf/get :audit-log-archive-uri) - uri (or uri (:uri params)) - cfg (assoc cfg ::uri uri)] - - (when (and enabled (not uri)) - (ex/raise :type :internal - :code :task-not-configured - :hint "archive task not configured, missing uri")) - - (when enabled - (loop [total 0] - (let [n (archive-events cfg)] - (if n - (do - (px/sleep 100) - (recur (+ total ^long n))) - (when (pos? total) - (l/dbg :hint "events archived" :total total))))))))) - -(def ^:private sql:retrieve-batch-of-audit-log - "select * - from audit_log - where archived_at is null - order by created_at asc - limit 128 - for update skip locked;") - -(defn archive-events - [{:keys [::db/pool ::uri] :as cfg}] - (letfn [(decode-row [{:keys [props ip-addr context] :as row}] - (cond-> row - (db/pgobject? props) - (assoc :props (db/decode-transit-pgobject props)) - - (db/pgobject? context) - (assoc :context (db/decode-transit-pgobject context)) - - (db/pgobject? ip-addr "inet") - (assoc :ip-addr (db/decode-inet ip-addr)))) - - (row->event [row] - (select-keys row [:type - :name - :source - :created-at - :tracked-at - :profile-id - :ip-addr - :props - :context])) - - (send [events] - (let [token (tokens/generate (::setup/props cfg) - {:iss "authentication" - :iat (dt/now) - :uid uuid/zero}) - body (t/encode {:events events}) - headers {"content-type" "application/transit+json" - "origin" (cf/get :public-uri) - "cookie" (u/map->query-string {:auth-token token})} - params {:uri uri - :timeout 12000 - :method :post - :headers headers - :body body} - resp (http.client/req! cfg params)] - (if (= (:status resp) 204) - true - (do - (l/error :hint "unable to archive events" - :resp-status (:status resp) - :resp-body (:body resp)) - false)))) - - (mark-as-archived [conn rows] - (db/exec-one! conn ["update audit_log set archived_at=now() where id = ANY(?)" - (->> (map :id rows) - (db/create-array conn "uuid"))]))] - - (db/with-atomic [conn pool] - (let [rows (db/exec! conn [sql:retrieve-batch-of-audit-log]) - xform (comp (map decode-row) - (map row->event)) - events (into [] xform rows)] - (when-not (empty? events) - (l/trc :hint "archive events chunk" :uri uri :events (count events)) - (when (send events) - (mark-as-archived conn rows) - (count events))))))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; GC Task -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(def ^:private sql:clean-archived - "delete from audit_log - where archived_at is not null") - -(defn- clean-archived - [{:keys [::db/pool]}] - (let [result (db/exec-one! pool [sql:clean-archived]) - result (:next.jdbc/update-count result)] - (l/debug :hint "delete archived audit log entries" :deleted result) - result)) - -(defmethod ig/pre-init-spec ::tasks/gc [_] - (s/keys :req [::db/pool])) - -(defmethod ig/init-key ::tasks/gc - [_ cfg] - (fn [_] - (clean-archived cfg))) diff --git a/backend/src/app/loggers/audit/archive_task.clj b/backend/src/app/loggers/audit/archive_task.clj new file mode 100644 index 000000000..046fb8068 --- /dev/null +++ b/backend/src/app/loggers/audit/archive_task.clj @@ -0,0 +1,140 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.loggers.audit.archive-task + (:require + [app.common.exceptions :as ex] + [app.common.logging :as l] + [app.common.transit :as t] + [app.common.uuid :as uuid] + [app.config :as cf] + [app.db :as db] + [app.http.client :as http] + [app.setup :as-alias setup] + [app.tokens :as tokens] + [app.util.time :as dt] + [clojure.spec.alpha :as s] + [integrant.core :as ig] + [lambdaisland.uri :as u] + [promesa.exec :as px])) + +;; This is a task responsible to send the accumulated events to +;; external service for archival. + +(defn- decode-row + [{:keys [props ip-addr context] :as row}] + (cond-> row + (db/pgobject? props) + (assoc :props (db/decode-transit-pgobject props)) + + (db/pgobject? context) + (assoc :context (db/decode-transit-pgobject context)) + + (db/pgobject? ip-addr "inet") + (assoc :ip-addr (db/decode-inet ip-addr)))) + +(def ^:private event-keys + [:type + :name + :source + :created-at + :tracked-at + :profile-id + :ip-addr + :props + :context]) + +(defn- row->event + [row] + (select-keys row event-keys)) + +(defn- send! + [{:keys [::uri] :as cfg} events] + (let [token (tokens/generate (::setup/props cfg) + {:iss "authentication" + :iat (dt/now) + :uid uuid/zero}) + body (t/encode {:events events}) + headers {"content-type" "application/transit+json" + "origin" (cf/get :public-uri) + "cookie" (u/map->query-string {:auth-token token})} + params {:uri uri + :timeout 12000 + :method :post + :headers headers + :body body} + resp (http/req! cfg params)] + (if (= (:status resp) 204) + true + (do + (l/error :hint "unable to archive events" + :resp-status (:status resp) + :resp-body (:body resp)) + false)))) + +(defn- mark-archived! + [{:keys [::db/conn]} rows] + (let [ids (db/create-array conn "uuid" (map :id rows))] + (db/exec-one! conn ["update audit_log set archived_at=now() where id = ANY(?)" ids]))) + +(def ^:private xf:create-event + (comp (map decode-row) + (map row->event))) + +(def ^:private sql:get-audit-log-chunk + "SELECT * + FROM audit_log + WHERE archived_at is null + ORDER BY created_at ASC + LIMIT 128 + FOR UPDATE + SKIP LOCKED") + +(defn- get-event-rows + [{:keys [::db/conn] :as cfg}] + (->> (db/exec! conn [sql:get-audit-log-chunk]) + (not-empty))) + +(defn- archive-events! + [{:keys [::uri] :as cfg}] + (db/tx-run! cfg (fn [cfg] + (when-let [rows (get-event-rows cfg)] + (let [events (into [] xf:create-event rows)] + (l/trc :hint "archive events chunk" :uri uri :events (count events)) + (when (send! cfg events) + (mark-archived! cfg rows) + (count events))))))) + +(defmethod ig/pre-init-spec ::handler [_] + (s/keys :req [::db/pool ::setup/props ::http/client])) + +(defmethod ig/init-key ::handler + [_ cfg] + (fn [params] + ;; NOTE: this let allows overwrite default configured values from + ;; the repl, when manually invoking the task. + (let [enabled (or (contains? cf/flags :audit-log-archive) + (:enabled params false)) + + uri (cf/get :audit-log-archive-uri) + uri (or uri (:uri params)) + cfg (assoc cfg ::uri uri)] + + (when (and enabled (not uri)) + (ex/raise :type :internal + :code :task-not-configured + :hint "archive task not configured, missing uri")) + + (when enabled + (loop [total 0] + (if-let [n (archive-events! cfg)] + (do + (px/sleep 100) + (recur (+ total ^long n))) + + (when (pos? total) + (l/dbg :hint "events archived" :total total)))))))) + diff --git a/backend/src/app/loggers/audit/gc_task.clj b/backend/src/app/loggers/audit/gc_task.clj new file mode 100644 index 000000000..7f94217a4 --- /dev/null +++ b/backend/src/app/loggers/audit/gc_task.clj @@ -0,0 +1,31 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.loggers.audit.gc-task + (:require + [app.common.logging :as l] + [app.db :as db] + [clojure.spec.alpha :as s] + [integrant.core :as ig])) + +(def ^:private sql:clean-archived + "DELETE FROM audit_log + WHERE archived_at IS NOT NULL") + +(defn- clean-archived! + [{:keys [::db/pool]}] + (let [result (db/exec-one! pool [sql:clean-archived]) + result (db/get-update-count result)] + (l/debug :hint "delete archived audit log entries" :deleted result) + result)) + +(defmethod ig/pre-init-spec ::handler [_] + (s/keys :req [::db/pool])) + +(defmethod ig/init-key ::handler + [_ cfg] + (fn [_] + (clean-archived! cfg))) diff --git a/backend/src/app/main.clj b/backend/src/app/main.clj index e0177110f..056c99cc8 100644 --- a/backend/src/app/main.clj +++ b/backend/src/app/main.clj @@ -21,7 +21,6 @@ [app.http.session :as-alias session] [app.http.session.tasks :as-alias session.tasks] [app.http.websocket :as http.ws] - [app.loggers.audit.tasks :as-alias audit.tasks] [app.loggers.webhooks :as-alias webhooks] [app.metrics :as-alias mtx] [app.metrics.definition :as-alias mdef] @@ -346,8 +345,8 @@ :storage-gc-deleted (ig/ref ::sto.gc-deleted/handler) :storage-gc-touched (ig/ref ::sto.gc-touched/handler) :session-gc (ig/ref ::session.tasks/gc) - :audit-log-archive (ig/ref ::audit.tasks/archive) - :audit-log-gc (ig/ref ::audit.tasks/gc) + :audit-log-archive (ig/ref :app.loggers.audit.archive-task/handler) + :audit-log-gc (ig/ref :app.loggers.audit.gc-task/handler) :process-webhook-event (ig/ref ::webhooks/process-event-handler) @@ -411,12 +410,12 @@ ::svgo/optimizer {} - ::audit.tasks/archive + :app.loggers.audit.archive-task/handler {::setup/props (ig/ref ::setup/props) ::db/pool (ig/ref ::db/pool) ::http.client/client (ig/ref ::http.client/client)} - ::audit.tasks/gc + :app.loggers.audit.gc-task/handler {::db/pool (ig/ref ::db/pool)} ::webhooks/process-event-handler -- Gitee From 6f2f2291c228129328c05615d1b6c36e339e4444 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 25 Mar 2024 13:12:47 +0100 Subject: [PATCH 0141/1266] :bug: Fix problem when importing SVG --- frontend/src/app/main/ui/shapes/svg_defs.cljs | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/app/main/ui/shapes/svg_defs.cljs b/frontend/src/app/main/ui/shapes/svg_defs.cljs index c2f0fa2be..f636bf205 100644 --- a/frontend/src/app/main/ui/shapes/svg_defs.cljs +++ b/frontend/src/app/main/ui/shapes/svg_defs.cljs @@ -37,6 +37,7 @@ (= "userSpaceOnUse" (get attrs :gradientUnits "objectBoundingBox"))) transform-pattern? (and (= :pattern tag) + (= "userSpaceOnUse" (get attrs :patternContentUnits "userSpaceOnUse")) (= "userSpaceOnUse" (get attrs :patternUnits "userSpaceOnUse"))) transform-clippath? (and (= :clipPath tag) -- Gitee From f66f168a99dc2ab91a44861106e4484a83b1265d Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Fri, 22 Mar 2024 16:29:30 +0100 Subject: [PATCH 0142/1266] :bug: Relax file validation for anidated components from other files --- common/src/app/common/files/validate.cljc | 40 ++++++++++++++--------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/common/src/app/common/files/validate.cljc b/common/src/app/common/files/validate.cljc index a5ce2e1da..17c0f130c 100644 --- a/common/src/app/common/files/validate.cljc +++ b/common/src/app/common/files/validate.cljc @@ -69,6 +69,11 @@ (def ^:dynamic ^:private *errors* nil) +(defn- library-exists? + [file libraries shape] + (or (= (:component-file shape) (:id file)) + (contains? libraries (:component-file shape)))) + (defn- report-error [code hint shape file page & {:as args}] (let [error {:code code @@ -218,12 +223,11 @@ "Shape not expected to be main instance" shape file page)) - (let [library-exists? (or (= (:component-file shape) (:id file)) - (contains? libraries (:component-file shape))) - component (when library-exists? + (let [library-exists (library-exists? file libraries shape) + component (when library-exists (ctf/resolve-component shape file libraries {:include-deleted? true}))] (if (nil? component) - (when library-exists? + (when library-exists (report-error :component-not-found (str/ffmt "Component % not found in file %" (:component-id shape) (:component-file shape)) shape file page)) @@ -265,11 +269,10 @@ (defn- check-component-ref "Validate that the referenced shape exists in the near component." [shape file page libraries] - (let [library-exists? (or (= (:component-file shape) (:id file)) - (contains? libraries (:component-file shape))) - ref-shape (when library-exists? + (let [library-exists (library-exists? file libraries shape) + ref-shape (when library-exists (ctf/find-ref-shape file page libraries shape :include-deleted? true))] - (when (and library-exists? (nil? ref-shape)) + (when (and library-exists (nil? ref-shape)) (report-error :ref-shape-not-found (str/ffmt "Referenced shape % not found in near component" (:shape-ref shape)) shape file page)))) @@ -313,20 +316,25 @@ - :component-root - :shape-ref" [shape file page libraries] - (check-component-not-main-head shape file page libraries) - (check-component-root shape file page) - (check-component-ref shape file page libraries) - (run! #(check-shape % file page libraries :context :copy-top) (:shapes shape))) + ;; We propagate have to propagate to nested shapes if library is valid or not + (let [library-exists (library-exists? file libraries shape)] + (check-component-not-main-head shape file page libraries) + (check-component-root shape file page) + (check-component-ref shape file page libraries) + (run! #(check-shape % file page libraries :context :copy-top :library-exists library-exists) (:shapes shape)))) (defn- check-shape-copy-root-nested "Root shape of a nested copy instance - :component-id - :component-file - :shape-ref" - [shape file page libraries] + [shape file page libraries library-exists] (check-component-not-main-head shape file page libraries) (check-component-not-root shape file page) - (check-component-ref shape file page libraries) + ;; We can have situations where the nested copy and the ancestor copy come from different libraries and some of them have been dettached + ;; so we only validate the shape-ref if the ancestor is from a valid library + (when library-exists + (check-component-ref shape file page libraries)) (run! #(check-shape % file page libraries :context :copy-nested) (:shapes shape))) (defn- check-shape-main-not-root @@ -367,7 +375,7 @@ - :main-any - :copy-any " - [shape-id file page libraries & {:keys [context] :or {context :not-component}}] + [shape-id file page libraries & {:keys [context library-exists] :or {context :not-component library-exists false}}] (let [shape (ctst/get-shape page shape-id)] (when (some? shape) (check-geometry shape file page) @@ -406,7 +414,7 @@ (report-error :nested-copy-not-allowed "Nested copy component only allowed inside other component" shape file page) - (check-shape-copy-root-nested shape file page libraries))))) + (check-shape-copy-root-nested shape file page libraries library-exists))))) (if (ctk/in-component-copy? shape) (if-not (#{:copy-top :copy-nested :copy-any} context) -- Gitee From 22fd0ae306cab482e03b475df9d2cce1d9a31529 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Mon, 25 Mar 2024 12:52:17 +0100 Subject: [PATCH 0143/1266] :bug: Update modification date on publish/unpublish file as library --- backend/src/app/rpc/commands/files.clj | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/backend/src/app/rpc/commands/files.clj b/backend/src/app/rpc/commands/files.clj index b2a97c6cc..601907e10 100644 --- a/backend/src/app/rpc/commands/files.clj +++ b/backend/src/app/rpc/commands/files.clj @@ -868,7 +868,8 @@ (db/delete! conn :file-library-rel {:library-file-id id}) (db/update! conn :file - {:is-shared false} + {:is-shared false + :modified-at (dt/now)} {:id id}) file) @@ -876,7 +877,8 @@ (true? (:is-shared params))) (let [file (assoc file :is-shared true)] (db/update! conn :file - {:is-shared true} + {:is-shared true + :modified-at (dt/now)} {:id id}) file) -- Gitee From eaf546ba5e04d5ec7fd587d9cc8f16271fa048d1 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 25 Mar 2024 11:28:24 +0100 Subject: [PATCH 0144/1266] :sparkles: Add improvements to telemetry task --- backend/src/app/loggers/audit.clj | 23 ++- backend/src/app/tasks/telemetry.clj | 268 +++++++++++++++------------- 2 files changed, 167 insertions(+), 124 deletions(-) diff --git a/backend/src/app/loggers/audit.clj b/backend/src/app/loggers/audit.clj index 211799d30..d89809f37 100644 --- a/backend/src/app/loggers/audit.clj +++ b/backend/src/app/loggers/audit.clj @@ -188,14 +188,14 @@ :profile-id (::profile-id event) :ip-addr (::ip-addr event) :context (::context event) - :props (::props event)}] + :props (::props event)} + tnow (dt/now)] (when (contains? cf/flags :audit-log) ;; NOTE: this operation may cause primary key conflicts on inserts ;; because of the timestamp precission (two concurrent requests), in ;; this case we just retry the operation. - (let [tnow (dt/now) - params (-> params + (let [params (-> params (assoc :created-at tnow) (assoc :tracked-at tnow) (update :props db/tjson) @@ -204,6 +204,23 @@ (assoc :source "backend"))] (db/insert! cfg :audit-log params))) + (when (and (or (contains? cf/flags :telemetry) + (cf/get :telemetry-enabled)) + (not (contains? cf/flags :audit-log))) + ;; NOTE: this operation may cause primary key conflicts on inserts + ;; because of the timestamp precission (two concurrent requests), in + ;; this case we just retry the operation. + ;; + ;; NOTE: this is only executed when general audit log is disabled + (let [params (-> params + (assoc :created-at tnow) + (assoc :tracked-at tnow) + (assoc :props (db/tjson {})) + (assoc :context (db/tjson {})) + (assoc :ip-addr (db/inet "0.0.0.0")) + (assoc :source "backend"))] + (db/insert! cfg :audit-log params))) + (when (and (contains? cf/flags :webhooks) (::webhooks/event? event)) (let [batch-key (::webhooks/batch-key event) diff --git a/backend/src/app/tasks/telemetry.clj b/backend/src/app/tasks/telemetry.clj index 43c0b26f9..ec07c67b3 100644 --- a/backend/src/app/tasks/telemetry.clj +++ b/backend/src/app/tasks/telemetry.clj @@ -21,58 +21,6 @@ [integrant.core :as ig] [promesa.exec :as px])) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; TASK ENTRY POINT -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(declare get-stats) -(declare send!) -(declare get-subscriptions-newsletter-updates) -(declare get-subscriptions-newsletter-news) - -(defmethod ig/pre-init-spec ::handler [_] - (s/keys :req [::http/client - ::db/pool - ::setup/props])) - -(defmethod ig/init-key ::handler - [_ {:keys [::db/pool ::setup/props] :as cfg}] - (fn [{:keys [send? enabled?] :or {send? true enabled? false}}] - (let [subs {:newsletter-updates (get-subscriptions-newsletter-updates pool) - :newsletter-news (get-subscriptions-newsletter-news pool)} - - enabled? (or enabled? - (contains? cf/flags :telemetry) - (cf/get :telemetry-enabled)) - - data {:subscriptions subs - :version (:full cf/version) - :instance-id (:instance-id props)}] - (cond - ;; If we have telemetry enabled, then proceed the normal - ;; operation. - enabled? - (let [data (merge data (get-stats pool))] - (when send? - (px/sleep (rand-int 10000)) - (send! cfg data)) - data) - - ;; If we have telemetry disabled, but there are users that are - ;; explicitly checked the newsletter subscription on the - ;; onboarding dialog or the profile section, then proceed to - ;; send a limited telemetry data, that consists in the list of - ;; subscribed emails and the running penpot version. - (seq subs) - (do - (when send? - (px/sleep (rand-int 10000)) - (send! cfg data)) - data) - - :else - data)))) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; IMPL ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -92,94 +40,94 @@ (defn- get-subscriptions-newsletter-updates [conn] - (let [sql "select email from profile where props->>'~:newsletter-updates' = 'true'"] + (let [sql "SELECT email FROM profile where props->>'~:newsletter-updates' = 'true'"] (->> (db/exec! conn [sql]) (mapv :email)))) (defn- get-subscriptions-newsletter-news [conn] - (let [sql "select email from profile where props->>'~:newsletter-news' = 'true'"] + (let [sql "SELECT email FROM profile where props->>'~:newsletter-news' = 'true'"] (->> (db/exec! conn [sql]) (mapv :email)))) -(defn- retrieve-num-teams +(defn- get-num-teams [conn] - (-> (db/exec-one! conn ["select count(*) as count from team;"]) :count)) + (-> (db/exec-one! conn ["SELECT count(*) AS count FROM team"]) :count)) -(defn- retrieve-num-projects +(defn- get-num-projects [conn] - (-> (db/exec-one! conn ["select count(*) as count from project;"]) :count)) + (-> (db/exec-one! conn ["SELECT count(*) AS count FROM project"]) :count)) -(defn- retrieve-num-files +(defn- get-num-files [conn] - (-> (db/exec-one! conn ["select count(*) as count from file;"]) :count)) + (-> (db/exec-one! conn ["SELECT count(*) AS count FROM file"]) :count)) -(defn- retrieve-num-file-changes +(defn- get-num-file-changes [conn] - (let [sql (str "select count(*) as count " - " from file_change " + (let [sql (str "SELECT count(*) AS count " + " FROM file_change " " where date_trunc('day', created_at) = date_trunc('day', now())")] (-> (db/exec-one! conn [sql]) :count))) -(defn- retrieve-num-touched-files +(defn- get-num-touched-files [conn] - (let [sql (str "select count(distinct file_id) as count " - " from file_change " + (let [sql (str "SELECT count(distinct file_id) AS count " + " FROM file_change " " where date_trunc('day', created_at) = date_trunc('day', now())")] (-> (db/exec-one! conn [sql]) :count))) -(defn- retrieve-num-users +(defn- get-num-users [conn] - (-> (db/exec-one! conn ["select count(*) as count from profile;"]) :count)) + (-> (db/exec-one! conn ["SELECT count(*) AS count FROM profile"]) :count)) -(defn- retrieve-num-fonts +(defn- get-num-fonts [conn] - (-> (db/exec-one! conn ["select count(*) as count from team_font_variant;"]) :count)) + (-> (db/exec-one! conn ["SELECT count(*) AS count FROM team_font_variant"]) :count)) -(defn- retrieve-num-comments +(defn- get-num-comments [conn] - (-> (db/exec-one! conn ["select count(*) as count from comment;"]) :count)) + (-> (db/exec-one! conn ["SELECT count(*) AS count FROM comment"]) :count)) (def sql:team-averages - "with projects_by_team as ( - select t.id, count(p.id) as num_projects - from team as t - left join project as p on (p.team_id = t.id) - group by 1 - ), files_by_project as ( - select p.id, count(f.id) as num_files - from project as p - left join file as f on (f.project_id = p.id) - group by 1 - ), comment_threads_by_file as ( - select f.id, count(ct.id) as num_comment_threads - from file as f - left join comment_thread as ct on (ct.file_id = f.id) - group by 1 - ), users_by_team as ( - select t.id, count(tp.profile_id) as num_users - from team as t - left join team_profile_rel as tp on(tp.team_id = t.id) - group by 1 + "with projects_by_team AS ( + SELECT t.id, count(p.id) AS num_projects + FROM team AS t + LEFT JOIN project AS p ON (p.team_id = t.id) + GROUP BY 1 + ), files_by_project AS ( + SELECT p.id, count(f.id) AS num_files + FROM project AS p + LEFT JOIN file AS f ON (f.project_id = p.id) + GROUP BY 1 + ), comment_threads_by_file AS ( + SELECT f.id, count(ct.id) AS num_comment_threads + FROM file AS f + LEFT JOIN comment_thread AS ct ON (ct.file_id = f.id) + GROUP BY 1 + ), users_by_team AS ( + SELECT t.id, count(tp.profile_id) AS num_users + FROM team AS t + LEFT JOIN team_profile_rel AS tp ON(tp.team_id = t.id) + GROUP BY 1 ) - select (select avg(num_projects)::integer from projects_by_team) as avg_projects_on_team, - (select max(num_projects)::integer from projects_by_team) as max_projects_on_team, - (select avg(num_files)::integer from files_by_project) as avg_files_on_project, - (select max(num_files)::integer from files_by_project) as max_files_on_project, - (select avg(num_comment_threads)::integer from comment_threads_by_file) as avg_comment_threads_on_file, - (select max(num_comment_threads)::integer from comment_threads_by_file) as max_comment_threads_on_file, - (select avg(num_users)::integer from users_by_team) as avg_users_on_team, - (select max(num_users)::integer from users_by_team) as max_users_on_team;") - -(defn- retrieve-team-averages + SELECT (SELECT avg(num_projects)::integer FROM projects_by_team) AS avg_projects_on_team, + (SELECT max(num_projects)::integer FROM projects_by_team) AS max_projects_on_team, + (SELECT avg(num_files)::integer FROM files_by_project) AS avg_files_on_project, + (SELECT max(num_files)::integer FROM files_by_project) AS max_files_on_project, + (SELECT avg(num_comment_threads)::integer FROM comment_threads_by_file) AS avg_comment_threads_on_file, + (SELECT max(num_comment_threads)::integer FROM comment_threads_by_file) AS max_comment_threads_on_file, + (SELECT avg(num_users)::integer FROM users_by_team) AS avg_users_on_team, + (SELECT max(num_users)::integer FROM users_by_team) AS max_users_on_team") + +(defn- get-team-averages [conn] (->> [sql:team-averages] (db/exec-one! conn))) -(defn- retrieve-enabled-auth-providers +(defn- get-enabled-auth-providers [conn] - (let [sql (str "select auth_backend as backend, count(*) as total " - " from profile group by 1") + (let [sql (str "SELECT auth_backend AS backend, count(*) AS total " + " FROM profile GROUP BY 1") rows (db/exec! conn [sql])] (->> rows (map (fn [{:keys [backend total]}] @@ -188,7 +136,7 @@ total]))) (into {})))) -(defn- retrieve-jvm-stats +(defn- get-jvm-stats [] (let [^Runtime runtime (Runtime/getRuntime)] {:jvm-heap-current (.totalMemory runtime) @@ -199,24 +147,102 @@ :os-version (System/getProperty "os.version") :user-tz (System/getProperty "user.timezone")})) -(defn get-stats +(def ^:private sql:get-counters + "SELECT name, count(*) AS count + FROM audit_log + WHERE source = 'backend' + AND tracked_at >= date_trunc('day', now()) + GROUP BY 1 + ORDER BY 2 DESC") + +(defn- get-action-counters + [conn] + (let [counters (->> (db/exec! conn [sql:get-counters]) + (d/index-by (comp keyword :name) :count)) + total (reduce + 0 (vals counters))] + {:total-accomulated-events total + :event-counters counters})) + +(def ^:private sql:clean-counters + "DELETE FROM audit_log + WHERE ip_addr = '0.0.0.0'::inet -- we know this is from telemetry + AND tracked_at < (date_trunc('day', now()) - '1 day'::interval)") + +(defn- clean-counters-data! + [conn] + (when-not (contains? cf/flags :audit-log) + (db/exec-one! conn [sql:clean-counters]))) + +(defn- get-stats [conn] (let [referer (if (cf/get :telemetry-with-taiga) "taiga" (cf/get :telemetry-referer))] - (-> {:referer referer - :public-uri (cf/get :public-uri) - :total-teams (retrieve-num-teams conn) - :total-projects (retrieve-num-projects conn) - :total-files (retrieve-num-files conn) - :total-users (retrieve-num-users conn) - :total-fonts (retrieve-num-fonts conn) - :total-comments (retrieve-num-comments conn) - :total-file-changes (retrieve-num-file-changes conn) - :total-touched-files (retrieve-num-touched-files conn)} - (d/merge - (retrieve-team-averages conn) - (retrieve-jvm-stats) - (retrieve-enabled-auth-providers conn)) + (-> {:referer referer + :public-uri (cf/get :public-uri) + :total-teams (get-num-teams conn) + :total-projects (get-num-projects conn) + :total-files (get-num-files conn) + :total-users (get-num-users conn) + :total-fonts (get-num-fonts conn) + :total-comments (get-num-comments conn) + :total-file-changes (get-num-file-changes conn) + :total-touched-files (get-num-touched-files conn)} + (merge + (get-team-averages conn) + (get-jvm-stats) + (get-enabled-auth-providers conn) + (get-action-counters conn)) (d/without-nils)))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; TASK ENTRY POINT +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defmethod ig/pre-init-spec ::handler [_] + (s/keys :req [::http/client + ::db/pool + ::setup/props])) + +(defmethod ig/init-key ::handler + [_ {:keys [::db/pool ::setup/props] :as cfg}] + (fn [{:keys [send? enabled?] :or {send? true enabled? false}}] + (let [subs {:newsletter-updates (get-subscriptions-newsletter-updates pool) + :newsletter-news (get-subscriptions-newsletter-news pool)} + + enabled? (or enabled? + (contains? cf/flags :telemetry) + (cf/get :telemetry-enabled)) + + data {:subscriptions subs + :version (:full cf/version) + :instance-id (:instance-id props)}] + + (when enabled? + (clean-counters-data! pool)) + + (cond + ;; If we have telemetry enabled, then proceed the normal + ;; operation. + enabled? + (let [data (merge data (get-stats pool))] + (when send? + (px/sleep (rand-int 10000)) + (send! cfg data)) + data) + + ;; If we have telemetry disabled, but there are users that are + ;; explicitly checked the newsletter subscription on the + ;; onboarding dialog or the profile section, then proceed to + ;; send a limited telemetry data, that consists in the list of + ;; subscribed emails and the running penpot version. + (or (seq (:newsletter-updates subs)) + (seq (:newsletter-news subs))) + (do + (when send? + (px/sleep (rand-int 10000)) + (send! cfg data)) + data) + + :else + data)))) -- Gitee From 4b846b17f0f1a149f68d2b3235c2d07e7d0fc84c Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 25 Mar 2024 15:35:04 +0100 Subject: [PATCH 0145/1266] :bug: Fix problem when exporting html texts --- .../app/main/ui/shapes/text/html_text.cljs | 9 ++++---- .../src/app/main/ui/shapes/text/styles.cljs | 22 ++++++++++--------- frontend/src/app/util/code_gen/style_css.cljs | 2 +- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/frontend/src/app/main/ui/shapes/text/html_text.cljs b/frontend/src/app/main/ui/shapes/text/html_text.cljs index da23426c2..fd3995c38 100644 --- a/frontend/src/app/main/ui/shapes/text/html_text.cljs +++ b/frontend/src/app/main/ui/shapes/text/html_text.cljs @@ -21,10 +21,9 @@ shape (obj/get props "shape") code? (obj/get props "code?") text (:text node) - style (when-not code? - (if (= text "") - (sts/generate-text-styles shape parent) - (sts/generate-text-styles shape node))) + style (if (= text "") + (sts/generate-text-styles shape parent) + (sts/generate-text-styles shape node)) class (when code? (:$id node))] [:span.text-node {:style style :class class} (if (= text "") "\u00A0" text)])) @@ -36,7 +35,7 @@ children (obj/get props "children") shape (obj/get props "shape") code? (obj/get props "code?") - style (when-not code? (sts/generate-root-styles shape node)) + style (sts/generate-root-styles shape node code?) class (when code? (:$id node))] [:div.root.rich-text {:style style diff --git a/frontend/src/app/main/ui/shapes/text/styles.cljs b/frontend/src/app/main/ui/shapes/text/styles.cljs index 534b786e4..c8fbf2053 100644 --- a/frontend/src/app/main/ui/shapes/text/styles.cljs +++ b/frontend/src/app/main/ui/shapes/text/styles.cljs @@ -17,16 +17,18 @@ [cuerdas.core :as str])) (defn generate-root-styles - [{:keys [width height]} node] - (let [valign (:vertical-align node "top") - base #js {:height (fmt/format-pixels height) - :width (fmt/format-pixels width) - :display "flex" - :whiteSpace "break-spaces"}] - (cond-> base - (= valign "top") (obj/set! "alignItems" "flex-start") - (= valign "center") (obj/set! "alignItems" "center") - (= valign "bottom") (obj/set! "alignItems" "flex-end")))) + ([props node] + (generate-root-styles props node false)) + ([{:keys [width height]} node code?] + (let [valign (:vertical-align node "top") + base #js {:height (when-not code? (fmt/format-pixels height)) + :width (when-not code? (fmt/format-pixels width)) + :display "flex" + :whiteSpace "break-spaces"}] + (cond-> base + (= valign "top") (obj/set! "alignItems" "flex-start") + (= valign "center") (obj/set! "alignItems" "center") + (= valign "bottom") (obj/set! "alignItems" "flex-end"))))) (defn generate-paragraph-set-styles [{:keys [grow-type] :as shape}] diff --git a/frontend/src/app/util/code_gen/style_css.cljs b/frontend/src/app/util/code_gen/style_css.cljs index 5f1776044..3a1ace59f 100644 --- a/frontend/src/app/util/code_gen/style_css.cljs +++ b/frontend/src/app/util/code_gen/style_css.cljs @@ -207,7 +207,7 @@ body { (let [properties (case (:type node) (:root "root") - (sts/generate-root-styles shape node) + (sts/generate-root-styles shape node true) (:paragraph-set "paragraph-set") (sts/generate-paragraph-set-styles shape) -- Gitee From e10c96fa8b0d9f38bfb55b34d74bf848476b8a0f Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 25 Mar 2024 16:10:25 +0100 Subject: [PATCH 0146/1266] :bug: Fix problem with grid edition --- frontend/src/app/main/data/workspace/modifiers.cljs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/data/workspace/modifiers.cljs b/frontend/src/app/main/data/workspace/modifiers.cljs index 302f3e6b2..b552bee67 100644 --- a/frontend/src/app/main/data/workspace/modifiers.cljs +++ b/frontend/src/app/main/data/workspace/modifiers.cljs @@ -546,7 +546,10 @@ :layout-padding-type :layout-gap :layout-item-margin - :layout-item-margin-type]}) + :layout-item-margin-type + :layout-grid-cells + :layout-grid-columns + :layout-grid-rows]}) ;; We've applied the text-modifier so we can dissoc the temporary data (fn [state] (update state :workspace-text-modifier #(apply dissoc % ids))) -- Gitee From 763fc3532e44d32e8838b289391c600547ec4b15 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 25 Mar 2024 15:39:01 +0100 Subject: [PATCH 0147/1266] :sparkles: Simplify local audit table Remove unnecessary partitioning --- backend/src/app/migrations.clj | 5 ++++- .../app/migrations/sql/0120-mod-audit-log-table.sql | 11 +++++++++++ backend/test/backend_tests/helpers.clj | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 backend/src/app/migrations/sql/0120-mod-audit-log-table.sql diff --git a/backend/src/app/migrations.clj b/backend/src/app/migrations.clj index 87f3d90b9..86f0fa6f5 100644 --- a/backend/src/app/migrations.clj +++ b/backend/src/app/migrations.clj @@ -376,7 +376,10 @@ :fn (mg/resource "app/migrations/sql/0118-mod-task-table.sql")} {:name "0119-mod-file-table" - :fn (mg/resource "app/migrations/sql/0119-mod-file-table.sql")}]) + :fn (mg/resource "app/migrations/sql/0119-mod-file-table.sql")} + + {:name "0120-mod-audit-log-table" + :fn (mg/resource "app/migrations/sql/0120-mod-audit-log-table.sql")}]) (defn apply-migrations! [pool name migrations] diff --git a/backend/src/app/migrations/sql/0120-mod-audit-log-table.sql b/backend/src/app/migrations/sql/0120-mod-audit-log-table.sql new file mode 100644 index 000000000..e9b4b83c5 --- /dev/null +++ b/backend/src/app/migrations/sql/0120-mod-audit-log-table.sql @@ -0,0 +1,11 @@ +CREATE TABLE new_audit_log (LIKE audit_log INCLUDING ALL); +INSERT INTO new_audit_log SELECT * FROM audit_log; +ALTER TABLE audit_log RENAME TO old_audit_log; +ALTER TABLE new_audit_log RENAME TO audit_log; +DROP TABLE old_audit_log; + +DROP INDEX new_audit_log_id_archived_at_idx; +ALTER TABLE audit_log DROP CONSTRAINT new_audit_log_pkey; +ALTER TABLE audit_log ADD PRIMARY KEY (id); +ALTER TABLE audit_log ALTER COLUMN created_at SET DEFAULT now(); +ALTER TABLE audit_log ALTER COLUMN tracked_at SET DEFAULT now(); diff --git a/backend/test/backend_tests/helpers.clj b/backend/test/backend_tests/helpers.clj index 987b55304..27544c4fa 100644 --- a/backend/test/backend_tests/helpers.clj +++ b/backend/test/backend_tests/helpers.clj @@ -112,7 +112,7 @@ ;; "alter table task set unlogged;\n" ;; "alter table task_default set unlogged;\n" ;; "alter table task_completed set unlogged;\n" - "alter table audit_log_default set unlogged ;\n" + "alter table audit_log set unlogged ;\n" "alter table storage_object set unlogged;\n" "alter table server_error_report set unlogged;\n" "alter table server_prop set unlogged;\n" -- Gitee From b85c3bec18c12b4a8f8f54e51e81413224d2a51b Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 25 Mar 2024 15:41:34 +0100 Subject: [PATCH 0148/1266] :sparkles: Add better timestamp control on audit handler --- backend/src/app/rpc/commands/audit.clj | 41 +++++++++++++++++++++----- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/backend/src/app/rpc/commands/audit.clj b/backend/src/app/rpc/commands/audit.clj index 76bd6e188..5db758b46 100644 --- a/backend/src/app/rpc/commands/audit.clj +++ b/backend/src/app/rpc/commands/audit.clj @@ -19,7 +19,20 @@ [app.rpc.climit :as-alias climit] [app.rpc.doc :as-alias doc] [app.rpc.helpers :as rph] - [app.util.services :as sv])) + [app.util.services :as sv] + [app.util.time :as dt])) + +(def ^:private event-columns + [:id + :name + :source + :type + :tracked-at + :created-at + :profile-id + :ip-addr + :props + :context]) (defn- event->row [event] [(uuid/next) @@ -27,24 +40,38 @@ (:source event) (:type event) (:timestamp event) + (:created-at event) (:profile-id event) (db/inet (:ip-addr event)) (db/tjson (:props event)) (db/tjson (d/without-nils (:context event)))]) -(def ^:private event-columns - [:id :name :source :type :tracked-at - :profile-id :ip-addr :props :context]) +(defn- adjust-timestamp + [{:keys [timestamp created-at] :as event}] + (let [margin (inst-ms (dt/diff timestamp created-at))] + (if (or (neg? margin) + (> margin 3600000)) + ;; If event is in future or lags more than 1 hour, we reasign + ;; timestamp to the server creation date + (-> event + (assoc :timestamp created-at) + (update :context assoc :original-timestamp timestamp)) + event))) (defn- handle-events [{:keys [::db/pool]} {:keys [::rpc/profile-id events] :as params}] (let [request (-> params meta ::http/request) ip-addr (audit/parse-client-ip request) + tnow (dt/now) xform (comp - (map #(assoc % :profile-id profile-id)) - (map #(assoc % :ip-addr ip-addr)) - (map #(assoc % :source "frontend")) + (map (fn [event] + (-> event + (assoc :created-at tnow) + (assoc :profile-id profile-id) + (assoc :ip-addr ip-addr) + (assoc :source "frontend")))) (filter :profile-id) + (map adjust-timestamp) (map event->row)) events (sequence xform events)] (when (seq events) -- Gitee From 1d2110b68c6b39ab7be5c1427bc560ed4605740a Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Mon, 25 Mar 2024 14:37:48 +0100 Subject: [PATCH 0149/1266] :bug: Fix component layer color --- frontend/src/app/main/ui/viewer/inspect/left_sidebar.cljs | 3 ++- frontend/src/app/main/ui/workspace/sidebar/layer_item.cljs | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/main/ui/viewer/inspect/left_sidebar.cljs b/frontend/src/app/main/ui/viewer/inspect/left_sidebar.cljs index f546a9352..f6c234bd4 100644 --- a/frontend/src/app/main/ui/viewer/inspect/left_sidebar.cljs +++ b/frontend/src/app/main/ui/viewer/inspect/left_sidebar.cljs @@ -9,6 +9,7 @@ (:require [app.common.data :as d] [app.common.data.macros :as dm] + [app.common.types.component :as ctk] [app.main.data.viewer :as dv] [app.main.store :as st] [app.main.ui.workspace.sidebar.layer-item :refer [layer-item-inner]] @@ -30,7 +31,7 @@ item-ref (mf/use-ref nil) depth (+ depth 1) - component-tree? (or component-child? (:component-root item)) + component-tree? (or component-child? (ctk/instance-root? item) (ctk/instance-head? item)) collapsed-iref (mf/use-memo diff --git a/frontend/src/app/main/ui/workspace/sidebar/layer_item.cljs b/frontend/src/app/main/ui/workspace/sidebar/layer_item.cljs index be6a1fffb..a2e008fa9 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/layer_item.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/layer_item.cljs @@ -10,6 +10,7 @@ [app.common.data :as d] [app.common.data.macros :as dm] [app.common.files.helpers :as cfh] + [app.common.types.component :as ctk] [app.common.types.container :as ctn] [app.common.types.shape.layout :as ctl] [app.common.uuid :as uuid] @@ -61,7 +62,7 @@ :class (stl/css-case :layer-row true :highlight highlighted? - :component (some? (:component-id item)) + :component (ctk/instance-head? item) :masked (:masked-group item) :selected selected? :type-frame (cfh/frame-shape? item) @@ -321,7 +322,7 @@ ref (mf/use-ref) depth (+ depth 1) - component-tree? (or component-child? (:component-root item)) + component-tree? (or component-child? (ctk/instance-root? item) (ctk/instance-head? item)) enable-drag (mf/use-fn #(reset! drag-disabled* false)) disable-drag (mf/use-fn #(reset! drag-disabled* true))] -- Gitee From 5a30c5e584d427b6b017ed9ad23a07fe572bbc8c Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 25 Mar 2024 09:20:12 +0100 Subject: [PATCH 0150/1266] :bug: Fix problem with gradient fill text --- frontend/src/app/main/ui/shapes/shape.cljs | 7 +++++-- frontend/src/app/main/ui/shapes/text/svg_text.cljs | 5 +++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/main/ui/shapes/shape.cljs b/frontend/src/app/main/ui/shapes/shape.cljs index 47b32bf52..cbda63671 100644 --- a/frontend/src/app/main/ui/shapes/shape.cljs +++ b/frontend/src/app/main/ui/shapes/shape.cljs @@ -121,7 +121,10 @@ [:& filters/filters {:shape shape :filter-id filter-id}] [:& filters/filters {:shape shape-without-blur :filter-id (dm/fmt "filter-shadow-%" render-id)}] [:& filters/filters {:shape shape-without-shadows :filter-id (dm/fmt "filter-blur-%" render-id)}] - [:& fills/fills {:shape shape :render-id render-id}] - [:& frame/frame-clip-def {:shape shape :render-id render-id}]] + [:& frame/frame-clip-def {:shape shape :render-id render-id}] + + ;; Text fills need to be defined afterwards because they are specified per text-block + (when-not (cfh/text-shape? shape) + [:& fills/fills {:shape shape :render-id render-id}])] children]])) diff --git a/frontend/src/app/main/ui/shapes/text/svg_text.cljs b/frontend/src/app/main/ui/shapes/text/svg_text.cljs index bb5fe3e0c..20c8e8edc 100644 --- a/frontend/src/app/main/ui/shapes/text/svg_text.cljs +++ b/frontend/src/app/main/ui/shapes/text/svg_text.cljs @@ -13,6 +13,7 @@ [app.main.ui.context :as muc] [app.main.ui.shapes.attrs :as attrs] [app.main.ui.shapes.custom-stroke :refer [shape-custom-strokes]] + [app.main.ui.shapes.fills :as fills] [app.main.ui.shapes.gradients :as grad] [app.util.object :as obj] [rumext.v2 :as mf])) @@ -103,5 +104,9 @@ render-id (dm/str render-id "-" index)] [:& (mf/provider muc/render-id) {:key index :value render-id} + ;; Text fills definition. Need to be defined per-text block + [:defs + [:& fills/fills {:shape shape :render-id render-id}]] + [:& shape-custom-strokes {:shape shape :position index :render-id render-id} [:> :text props (:text data)]]]))]])) -- Gitee From d83787d714beaa0d1fc54ffe7ab906ccb5493c1a Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 25 Mar 2024 09:49:38 +0100 Subject: [PATCH 0151/1266] :bug: Fix problem with gradients and borders --- frontend/src/app/main/ui/shapes/custom_stroke.cljs | 6 ++++-- frontend/src/app/main/ui/shapes/gradients.cljs | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/main/ui/shapes/custom_stroke.cljs b/frontend/src/app/main/ui/shapes/custom_stroke.cljs index 11c430a2d..35d2bd7f0 100644 --- a/frontend/src/app/main/ui/shapes/custom_stroke.cljs +++ b/frontend/src/app/main/ui/shapes/custom_stroke.cljs @@ -209,7 +209,8 @@ props #js {:id (dm/str "stroke-color-gradient-" render-id "-" index) :gradient gradient - :shape shape} + :shape shape + :force-transform (cfh/path-shape? shape)} stroke-image (:stroke-image stroke) uri (when stroke-image (cf/resolve-file-media stroke-image)) @@ -248,7 +249,8 @@ :width (/ w (dm/get-prop selrect :width)) :height (/ h (dm/get-prop selrect :height)) :viewBox "0 0 1 1" - :preserveAspectRatio "xMidYMid slice"} + :preserveAspectRatio "xMidYMid slice" + :patternTransform (when (cfh/path-shape? shape) (gsh/transform-str shape))} [:> :image image-props]]) (cond diff --git a/frontend/src/app/main/ui/shapes/gradients.cljs b/frontend/src/app/main/ui/shapes/gradients.cljs index 1b44a76c3..d2a74a119 100644 --- a/frontend/src/app/main/ui/shapes/gradients.cljs +++ b/frontend/src/app/main/ui/shapes/gradients.cljs @@ -30,9 +30,9 @@ (mf/defc linear-gradient {::mf/wrap-props false} - [{:keys [id gradient shape]}] + [{:keys [id gradient shape force-transform]}] (let [transform (mf/with-memo [shape] - (when (cfh/frame-shape? shape) + (when force-transform (gsh/transform-matrix shape nil (gpt/point 0.5 0.5)))) metadata? (mf/use-ctx ed/include-metadata-ctx) -- Gitee From 588410bbb186112330a2653d29da72adbf6c31b5 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 25 Mar 2024 13:12:47 +0100 Subject: [PATCH 0152/1266] :bug: Fix problem when importing SVG --- frontend/src/app/main/ui/shapes/svg_defs.cljs | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/app/main/ui/shapes/svg_defs.cljs b/frontend/src/app/main/ui/shapes/svg_defs.cljs index c2f0fa2be..f636bf205 100644 --- a/frontend/src/app/main/ui/shapes/svg_defs.cljs +++ b/frontend/src/app/main/ui/shapes/svg_defs.cljs @@ -37,6 +37,7 @@ (= "userSpaceOnUse" (get attrs :gradientUnits "objectBoundingBox"))) transform-pattern? (and (= :pattern tag) + (= "userSpaceOnUse" (get attrs :patternContentUnits "userSpaceOnUse")) (= "userSpaceOnUse" (get attrs :patternUnits "userSpaceOnUse"))) transform-clippath? (and (= :clipPath tag) -- Gitee From ecc61130ec2571ca883506a36827ae72d85fa4ef Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 25 Mar 2024 15:35:04 +0100 Subject: [PATCH 0153/1266] :bug: Fix problem when exporting html texts --- .../app/main/ui/shapes/text/html_text.cljs | 9 ++++---- .../src/app/main/ui/shapes/text/styles.cljs | 22 ++++++++++--------- frontend/src/app/util/code_gen/style_css.cljs | 2 +- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/frontend/src/app/main/ui/shapes/text/html_text.cljs b/frontend/src/app/main/ui/shapes/text/html_text.cljs index da23426c2..fd3995c38 100644 --- a/frontend/src/app/main/ui/shapes/text/html_text.cljs +++ b/frontend/src/app/main/ui/shapes/text/html_text.cljs @@ -21,10 +21,9 @@ shape (obj/get props "shape") code? (obj/get props "code?") text (:text node) - style (when-not code? - (if (= text "") - (sts/generate-text-styles shape parent) - (sts/generate-text-styles shape node))) + style (if (= text "") + (sts/generate-text-styles shape parent) + (sts/generate-text-styles shape node)) class (when code? (:$id node))] [:span.text-node {:style style :class class} (if (= text "") "\u00A0" text)])) @@ -36,7 +35,7 @@ children (obj/get props "children") shape (obj/get props "shape") code? (obj/get props "code?") - style (when-not code? (sts/generate-root-styles shape node)) + style (sts/generate-root-styles shape node code?) class (when code? (:$id node))] [:div.root.rich-text {:style style diff --git a/frontend/src/app/main/ui/shapes/text/styles.cljs b/frontend/src/app/main/ui/shapes/text/styles.cljs index 534b786e4..c8fbf2053 100644 --- a/frontend/src/app/main/ui/shapes/text/styles.cljs +++ b/frontend/src/app/main/ui/shapes/text/styles.cljs @@ -17,16 +17,18 @@ [cuerdas.core :as str])) (defn generate-root-styles - [{:keys [width height]} node] - (let [valign (:vertical-align node "top") - base #js {:height (fmt/format-pixels height) - :width (fmt/format-pixels width) - :display "flex" - :whiteSpace "break-spaces"}] - (cond-> base - (= valign "top") (obj/set! "alignItems" "flex-start") - (= valign "center") (obj/set! "alignItems" "center") - (= valign "bottom") (obj/set! "alignItems" "flex-end")))) + ([props node] + (generate-root-styles props node false)) + ([{:keys [width height]} node code?] + (let [valign (:vertical-align node "top") + base #js {:height (when-not code? (fmt/format-pixels height)) + :width (when-not code? (fmt/format-pixels width)) + :display "flex" + :whiteSpace "break-spaces"}] + (cond-> base + (= valign "top") (obj/set! "alignItems" "flex-start") + (= valign "center") (obj/set! "alignItems" "center") + (= valign "bottom") (obj/set! "alignItems" "flex-end"))))) (defn generate-paragraph-set-styles [{:keys [grow-type] :as shape}] diff --git a/frontend/src/app/util/code_gen/style_css.cljs b/frontend/src/app/util/code_gen/style_css.cljs index 5f1776044..3a1ace59f 100644 --- a/frontend/src/app/util/code_gen/style_css.cljs +++ b/frontend/src/app/util/code_gen/style_css.cljs @@ -207,7 +207,7 @@ body { (let [properties (case (:type node) (:root "root") - (sts/generate-root-styles shape node) + (sts/generate-root-styles shape node true) (:paragraph-set "paragraph-set") (sts/generate-paragraph-set-styles shape) -- Gitee From 5d200a70d617136ec2146a48bc6ec45415cf54ea Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 25 Mar 2024 16:10:25 +0100 Subject: [PATCH 0154/1266] :bug: Fix problem with grid edition --- frontend/src/app/main/data/workspace/modifiers.cljs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/data/workspace/modifiers.cljs b/frontend/src/app/main/data/workspace/modifiers.cljs index 302f3e6b2..b552bee67 100644 --- a/frontend/src/app/main/data/workspace/modifiers.cljs +++ b/frontend/src/app/main/data/workspace/modifiers.cljs @@ -546,7 +546,10 @@ :layout-padding-type :layout-gap :layout-item-margin - :layout-item-margin-type]}) + :layout-item-margin-type + :layout-grid-cells + :layout-grid-columns + :layout-grid-rows]}) ;; We've applied the text-modifier so we can dissoc the temporary data (fn [state] (update state :workspace-text-modifier #(apply dissoc % ids))) -- Gitee From 8bf8a28439943798c2d6e02c5fb0655420996d18 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 26 Mar 2024 09:41:41 +0100 Subject: [PATCH 0155/1266] :bug: Fix copy paste images on different environments --- frontend/src/app/main/data/workspace.cljs | 30 ++++++++++++++--------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index e2bf369b6..d0c6f3a74 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -1573,7 +1573,9 @@ (->> (:strokes obj) (keep :stroke-image)) (when (cfh/image-shape? obj) - [(:metadata obj)]))] + [(:metadata obj)]) + (when (:fill-image obj) + [(:fill-image obj)]))] (if (seq imgdata) (->> (rx/from imgdata) @@ -1833,13 +1835,19 @@ (defn paste-shapes [{in-viewport? :in-viewport :as pdata}] (letfn [(translate-media [mdata media-idx attr-path] - (let [id (get-in mdata attr-path) + (let [id (-> (get-in mdata attr-path) + (:id)) mobj (get media-idx id)] (if mobj - (update-in mdata attr-path (fn [value] - (-> value - (assoc :id (:id mobj)) - (assoc :path (:path mobj))))) + (if (empty? attr-path) + (-> mdata + (assoc :id (:id mobj)) + (assoc :path (:path mobj))) + (update-in mdata attr-path (fn [value] + (-> value + (assoc :id (:id mobj)) + (assoc :path (:path mobj)))))) + mdata))) (add-obj? [chg] @@ -1849,15 +1857,15 @@ ;; references to the new uploaded media-objects. (process-rchange [media-idx change] (let [;; Texts can have different fills for pieces of the text - tr-fill-xf (map #(translate-media % media-idx [:fill-image :id])) - tr-stroke-xf (map #(translate-media % media-idx [:stroke-image :id]))] - + tr-fill-xf (map #(translate-media % media-idx [:fill-image])) + tr-stroke-xf (map #(translate-media % media-idx [:stroke-image]))] (if (add-obj? change) (update change :obj (fn [obj] (-> obj (update :fills #(into [] tr-fill-xf %)) (update :strokes #(into [] tr-stroke-xf %)) - (d/update-when :metadata translate-media media-idx [:id]) + (d/update-when :metadata translate-media media-idx []) + (d/update-when :fill-image translate-media media-idx []) (d/update-when :content (fn [content] (txt/xform-nodes tr-fill-xf content))) @@ -1983,7 +1991,7 @@ (let [file-id (:current-file-id state) page (wsh/lookup-page state) - media-idx (->> (:media pdata) + media-idx (->> (:images pdata) (d/index-by :prev-id)) selected (:selected pdata) -- Gitee From 4212b46835c2712252bd8f97303a828b7f288eae Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Tue, 26 Mar 2024 09:04:38 +0100 Subject: [PATCH 0156/1266] :bug: Add tooltip to select elements by color --- .../app/main/ui/workspace/sidebar/options/rows/color_row.cljs | 1 + frontend/translations/en.po | 4 ++++ frontend/translations/es.po | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs index 31dd285cb..dcbabace6 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs @@ -268,6 +268,7 @@ :on-click on-remove} i/remove-icon]) (when select-only [:button {:class (stl/css :select-btn) + :title (tr "settings.select-this-color") :on-click handle-select} i/move])])) diff --git a/frontend/translations/en.po b/frontend/translations/en.po index dd5e69fea..52ee7dd65 100644 --- a/frontend/translations/en.po +++ b/frontend/translations/en.po @@ -2527,6 +2527,10 @@ msgstr "Detach" msgid "settings.multiple" msgstr "Mixed" +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs +msgid "settings.select-this-color" +msgstr "Select items using this style" + # SECTIONS msgid "shortcut-section.basics" msgstr "Basics" diff --git a/frontend/translations/es.po b/frontend/translations/es.po index 601bd792f..8195efe3b 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -2573,6 +2573,10 @@ msgstr "Desacoplar" msgid "settings.multiple" msgstr "Varios" +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs +msgid "settings.select-this-color" +msgstr "Seleccionar elementos que usan este estilo" + # SECTIONS msgid "shortcut-section.basics" msgstr "Básicos" -- Gitee From 6a0768b490c01b21b3f0e6aa62b8c4768975f04a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Tue, 26 Mar 2024 14:45:03 +0100 Subject: [PATCH 0157/1266] :bug: Fix helper to compile polyfills --- frontend/scripts/_helpers.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/frontend/scripts/_helpers.js b/frontend/scripts/_helpers.js index b086ce5ec..cb2d36ac9 100644 --- a/frontend/scripts/_helpers.js +++ b/frontend/scripts/_helpers.js @@ -32,7 +32,6 @@ async function findFiles(basePath, predicate, options={}) { predicate = predicate ?? function() { return true; } let files = await fs.readdir(basePath, {recursive: options.recursive ?? false}) - files = files.filter((path) => path.endsWith(".svg")); files = files.map((path) => ph.join(basePath, path)); return files; @@ -54,7 +53,11 @@ export function isSassFile(path) { } export function isSvgFile(path) { - return path.endsWith(".scss"); + return path.endsWith(".svg"); +} + +export function isJsFile(path) { + return path.endsWith(".js"); } export async function compileSass(worker, path, options) { @@ -378,7 +381,7 @@ export async function compilePolyfills() { log.info("init: compile polyfills") - const files = await findFiles("resources/polyfills/"); + const files = await findFiles("resources/polyfills/", isJsFile); let result = []; for (let path of files) { const content = await fs.readFile(path, {encoding:"utf-8"}); -- Gitee From 5315dc18afc0764d59dee70da0450000bd5be32e Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 26 Mar 2024 14:42:13 +0100 Subject: [PATCH 0158/1266] :bug: Fix problems with bool shapes --- common/src/app/common/geom/shapes/path.cljc | 4 +- .../app/main/ui/workspace/shapes/debug.cljs | 93 ++++++++++++++++++- .../ui/workspace/viewport/path_actions.cljs | 2 +- frontend/src/app/util/debug.cljs | 5 +- 4 files changed, 97 insertions(+), 7 deletions(-) diff --git a/common/src/app/common/geom/shapes/path.cljc b/common/src/app/common/geom/shapes/path.cljc index 941b3ffc2..9295c421d 100644 --- a/common/src/app/common/geom/shapes/path.cljc +++ b/common/src/app/common/geom/shapes/path.cljc @@ -845,13 +845,11 @@ (defn close-content [content] (into [] - (comp (filter sp/is-closed?) - (mapcat :data)) + (mapcat :data) (->> content (sp/close-subpaths) (sp/get-subpaths)))) - (defn ray-overlaps? [ray-point {selrect :selrect}] (and (>= (:y ray-point) (:y1 selrect)) diff --git a/frontend/src/app/main/ui/workspace/shapes/debug.cljs b/frontend/src/app/main/ui/workspace/shapes/debug.cljs index e1353644b..8844d18bc 100644 --- a/frontend/src/app/main/ui/workspace/shapes/debug.cljs +++ b/frontend/src/app/main/ui/workspace/shapes/debug.cljs @@ -10,8 +10,12 @@ [app.common.data.macros :as dm] [app.common.files.helpers :as cfh] [app.common.geom.shapes :as gsh] + [app.common.geom.shapes.path :as gsp] [app.common.geom.shapes.text :as gst] [app.common.math :as mth] + [app.common.svg.path.bool :as pb] + [app.common.svg.path.shapes-to-path :as stp] + [app.common.svg.path.subpath :as ups] [app.main.refs :as refs] [app.util.color :as uc] [app.util.debug :as dbg] @@ -87,13 +91,98 @@ :style {:stroke "green" :stroke-width (/ 2 zoom)}}]]))])) +(mf/defc debug-bool-shape + {::mf/wrap-props false} + [{:keys [shape]}] + + (let [objects (mf/deref refs/workspace-page-objects) + zoom (mf/deref refs/selected-zoom) + + radius (/ 3 zoom) + + c1 (-> (get objects (first (:shapes shape))) + (stp/convert-to-path objects)) + c2 (-> (get objects (second (:shapes shape))) + (stp/convert-to-path objects)) + + content-a (:content c1) + content-b (:content c2) + + bool-type (:bool-type shape) + should-reverse? (and (not= :union bool-type) + (= (ups/clockwise? content-b) + (ups/clockwise? content-a))) + + content-a (-> (:content c1) + (pb/close-paths) + (pb/add-previous)) + + content-b (-> (:content c2) + (pb/close-paths) + (cond-> should-reverse? (ups/reverse-content)) + (pb/add-previous)) + + + sr-a (gsp/content->selrect content-a) + sr-b (gsp/content->selrect content-b) + + [content-a-split content-b-split] (pb/content-intersect-split content-a content-b sr-a sr-b) + + ;;content-a-geom (gsp/content->geom-data content-a) + ;;content-b-geom (gsp/content->geom-data content-b) + ;;content-a-split (->> content-a-split #_(filter #(pb/contains-segment? % content-b sr-b content-b-geom))) + ;;content-b-split (->> content-b-split #_(filter #(pb/contains-segment? % content-a sr-a content-a-geom))) + ] + [:* + (for [[i cmd] (d/enumerate content-a-split)] + (let [p1 (:prev cmd) + p2 (gsp/command->point cmd) + + hp (case (:command cmd) + :line-to (-> (gsp/command->line cmd) + (gsp/line-values 0.5)) + + :curve-to (-> (gsp/command->bezier cmd) + (gsp/curve-values 0.5)) + nil)] + [:* + (when p1 + [:circle {:data-i i :key (dm/str "c11-" i) :cx (:x p1) :cy (:y p1) :r radius :fill "red"}]) + [:circle {:data-i i :key (dm/str "c12-" i) :cx (:x p2) :cy (:y p2) :r radius :fill "red"}] + + (when hp + [:circle {:data-i i :key (dm/str "c13-" i) :cx (:x hp) :cy (:y hp) :r radius :fill "orange"}])])) + + (for [[i cmd] (d/enumerate content-b-split)] + (let [p1 (:prev cmd) + p2 (gsp/command->point cmd) + + hp (case (:command cmd) + :line-to (-> (gsp/command->line cmd) + (gsp/line-values 0.5)) + + :curve-to (-> (gsp/command->bezier cmd) + (gsp/curve-values 0.5)) + nil)] + [:* + (when p1 + [:circle {:key (dm/str "c21-" i) :cx (:x p1) :cy (:y p1) :r radius :fill "blue"}]) + [:circle {:key (dm/str "c22-" i) :cx (:x p2) :cy (:y p2) :r radius :fill "blue"}] + + (when hp + [:circle {:data-i i :key (dm/str "c13-" i) :cx (:x hp) :cy (:y hp) :r radius :fill "green"}])]))])) + (mf/defc shape-debug [{:keys [shape]}] [:* (when ^boolean (dbg/enabled? :bounding-boxes) [:& debug-bounding-boxes {:shape shape}]) - (when (and ^boolean (cfh/text-shape? shape) - ^boolean (dbg/enabled? :text-outline) + (when (and ^boolean (dbg/enabled? :bool-shapes) + ^boolean (cfh/bool-shape? shape)) + [:& debug-bool-shape {:shape shape}]) + + (when (and ^boolean (dbg/enabled? :text-outline) + ^boolean (cfh/text-shape? shape) ^boolean (seq (:position-data shape))) [:& debug-text-bounds {:shape shape}])]) diff --git a/frontend/src/app/main/ui/workspace/viewport/path_actions.cljs b/frontend/src/app/main/ui/workspace/viewport/path_actions.cljs index 69597f5a1..0da613105 100644 --- a/frontend/src/app/main/ui/workspace/viewport/path_actions.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/path_actions.cljs @@ -27,7 +27,7 @@ (i/icon-xref :add (stl/css :add-icon :pathbar-icon))) (def ^:private remove-icon - (i/icon-xref :remove-icon (stl/css :remove-icon :pathbar-icon))) + (i/icon-xref :remove (stl/css :remove :pathbar-icon))) (def ^:private merge-nodes-icon (i/icon-xref :merge-nodes (stl/css :merge-nodes-icon :pathbar-icon))) diff --git a/frontend/src/app/util/debug.cljs b/frontend/src/app/util/debug.cljs index 067ac8a54..094550cef 100644 --- a/frontend/src/app/util/debug.cljs +++ b/frontend/src/app/util/debug.cljs @@ -86,7 +86,10 @@ :shape-panel ;; Show what is touched in copies - :display-touched}) + :display-touched + + ;; Show some visual indicators for bool shape + :bool-shapes}) (defn enable! [option] -- Gitee From 4dac2221e778d5f8e59c0d7849020d71ccbb91b9 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 26 Mar 2024 15:29:12 +0100 Subject: [PATCH 0159/1266] :bug: Fix problem with proportional scaling --- .../src/app/common/geom/shapes/effects.cljc | 6 ++++ .../src/app/common/geom/shapes/strokes.cljc | 6 ++++ common/src/app/common/types/modifiers.cljc | 36 ++++++++++--------- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/common/src/app/common/geom/shapes/effects.cljc b/common/src/app/common/geom/shapes/effects.cljc index 912b2de6c..8cac7e25b 100644 --- a/common/src/app/common/geom/shapes/effects.cljc +++ b/common/src/app/common/geom/shapes/effects.cljc @@ -1,3 +1,9 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + (ns app.common.geom.shapes.effects) (defn update-shadow-scale diff --git a/common/src/app/common/geom/shapes/strokes.cljc b/common/src/app/common/geom/shapes/strokes.cljc index 272e5e12b..905aac030 100644 --- a/common/src/app/common/geom/shapes/strokes.cljc +++ b/common/src/app/common/geom/shapes/strokes.cljc @@ -1,3 +1,9 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + (ns app.common.geom.shapes.strokes) (defn update-stroke-width diff --git a/common/src/app/common/types/modifiers.cljc b/common/src/app/common/types/modifiers.cljc index 7967d0379..d0669a024 100644 --- a/common/src/app/common/types/modifiers.cljc +++ b/common/src/app/common/types/modifiers.cljc @@ -737,30 +737,32 @@ (apply-scale-content [shape value] - (cond-> shape - (cfh/text-shape? shape) - (update-text-content scale-text-content value) + ;; Scale can only be positive + (let [value (mth/abs value)] + (cond-> shape + (cfh/text-shape? shape) + (update-text-content scale-text-content value) - :always - (gsc/update-corners-scale value) + :always + (gsc/update-corners-scale value) - (d/not-empty? (:strokes shape)) - (gss/update-strokes-width value) + (d/not-empty? (:strokes shape)) + (gss/update-strokes-width value) - (d/not-empty? (:shadow shape)) - (gse/update-shadows-scale value) + (d/not-empty? (:shadow shape)) + (gse/update-shadows-scale value) - (some? (:blur shape)) - (gse/update-blur-scale value) + (some? (:blur shape)) + (gse/update-blur-scale value) - (ctl/flex-layout? shape) - (ctl/update-flex-scale value) + (ctl/flex-layout? shape) + (ctl/update-flex-scale value) - (ctl/grid-layout? shape) - (ctl/update-grid-scale value) + (ctl/grid-layout? shape) + (ctl/update-grid-scale value) - :always - (ctl/update-flex-child value)))] + :always + (ctl/update-flex-child value))))] (let [remove-children (fn [shapes children-to-remove] -- Gitee From bd88b872c7a47e5e78601befe90da4859bc64563 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 26 Mar 2024 15:34:28 +0100 Subject: [PATCH 0160/1266] :bug: Fix problem with flip horizontal/vertical --- frontend/src/app/main/data/workspace/transforms.cljs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/main/data/workspace/transforms.cljs b/frontend/src/app/main/data/workspace/transforms.cljs index 80e38ab3e..a69805cdc 100644 --- a/frontend/src/app/main/data/workspace/transforms.cljs +++ b/frontend/src/app/main/data/workspace/transforms.cljs @@ -971,7 +971,7 @@ selrect (gsh/shapes->rect shapes) center (grc/rect->center selrect) modifiers (dwm/create-modif-tree selected (ctm/resize-modifiers (gpt/point -1.0 1.0) center))] - (rx/of (dwm/apply-modifiers {:modifiers modifiers})))))) + (rx/of (dwm/apply-modifiers {:modifiers modifiers :ignore-snap-pixel true})))))) (defn flip-vertical-selected [] (ptk/reify ::flip-vertical-selected @@ -983,4 +983,4 @@ selrect (gsh/shapes->rect shapes) center (grc/rect->center selrect) modifiers (dwm/create-modif-tree selected (ctm/resize-modifiers (gpt/point 1.0 -1.0) center))] - (rx/of (dwm/apply-modifiers {:modifiers modifiers})))))) + (rx/of (dwm/apply-modifiers {:modifiers modifiers :ignore-snap-pixel true})))))) -- Gitee From af5d05b460e0fddadb4abd0ce6a38b1b1f3168e2 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Tue, 26 Mar 2024 16:55:50 +0100 Subject: [PATCH 0161/1266] :bug: Fix stroke cap dropdown --- .../workspace/sidebar/options/rows/stroke_row.cljs | 2 ++ .../workspace/sidebar/options/rows/stroke_row.scss | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/rows/stroke_row.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/rows/stroke_row.cljs index 9f545aed7..7bcd264a9 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/rows/stroke_row.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/rows/stroke_row.cljs @@ -196,6 +196,7 @@ [:div {:class (stl/css :cap-select)} [:& select {:default-value (:stroke-cap-start stroke) + :dropdown-class (stl/css :stroke-cap-dropdown-start) :options stroke-caps-options :on-change on-caps-start-change}]] @@ -206,5 +207,6 @@ [:div {:class (stl/css :cap-select)} [:& select {:default-value (:stroke-cap-end stroke) + :dropdown-class (stl/css :stroke-cap-dropdown) :options stroke-caps-options :on-change on-caps-end-change}]]])])) diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/rows/stroke_row.scss b/frontend/src/app/main/ui/workspace/sidebar/options/rows/stroke_row.scss index b315fc28c..5f49ab167 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/rows/stroke_row.scss +++ b/frontend/src/app/main/ui/workspace/sidebar/options/rows/stroke_row.scss @@ -23,6 +23,19 @@ .cap-select { width: $s-124; } + .stroke-cap-dropdown, + .stroke-cap-dropdown-start { + min-width: $s-124; + width: fit-content; + max-width: $s-252; + right: 0; + left: unset; + } + + .stroke-cap-dropdown-start { + left: 0; + right: unset; + } .swap-caps-btn { @extend .button-secondary; height: $s-32; -- Gitee From ef0abc14980a92083748ec7ce1063a9bb0f52f1d Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 26 Mar 2024 17:02:03 +0100 Subject: [PATCH 0162/1266] :bug: Fix problem with rulers in Firefox --- .../app/main/ui/workspace/viewport/rulers.cljs | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/viewport/rulers.cljs b/frontend/src/app/main/ui/workspace/viewport/rulers.cljs index ff9624638..423701445 100644 --- a/frontend/src/app/main/ui/workspace/viewport/rulers.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/rulers.cljs @@ -101,13 +101,13 @@ rulers-size (* rulers-size zoom-inverse)] (if (= axis :x) {:text-x val - :text-y (+ (:y vbox) (- rulers-pos (* 4 zoom-inverse))) + :text-y (+ (:y vbox) rulers-pos (* -1 zoom-inverse)) :line-x1 val :line-y1 (+ (:y vbox) rulers-pos (* 2 zoom-inverse)) :line-x2 val :line-y2 (+ (:y vbox) rulers-pos (* 2 zoom-inverse) rulers-size)} - {:text-x (+ (:x vbox) (- rulers-pos (* 4 zoom-inverse))) + {:text-x (+ (:x vbox) rulers-pos (* -1 zoom-inverse)) :text-y val :line-x1 (+ (:x vbox) rulers-pos (* 2 zoom-inverse)) :line-y1 val @@ -171,7 +171,6 @@ [:text {:x text-x :y text-y :text-anchor "middle" - :dominant-baseline "middle" :transform (when (= axis :y) (str "rotate(-90 " text-x "," text-y ")")) :style {:font-size (* font-size zoom-inverse) :font-family font-family @@ -250,18 +249,16 @@ :fill-opacity selection-area-opacity}}] [:text {:x (- (:x1 selection-rect) (* 4 zoom-inverse)) - :y (+ (:y vbox) (* 10.6 zoom-inverse)) + :y (+ (:y vbox) (* 13.6 zoom-inverse)) :text-anchor "end" - :dominant-baseline "middle" :style {:font-size (* font-size zoom-inverse) :font-family font-family :fill selection-area-color}} (fmt/format-number (- (:x1 selection-rect) offset-x))] [:text {:x (+ (:x2 selection-rect) (* 4 zoom-inverse)) - :y (+ (:y vbox) (* 10.6 zoom-inverse)) + :y (+ (:y vbox) (* 13.6 zoom-inverse)) :text-anchor "start" - :dominant-baseline "middle" :style {:font-size (* font-size zoom-inverse) :font-family font-family :fill selection-area-color}} @@ -293,18 +290,16 @@ :fill-opacity over-number-opacity}}] [:text {:x (- center-x (/ (:height selection-rect) 2) (* 15 zoom-inverse)) - :y center-y + :y (+ center-y (* 4 zoom-inverse)) :text-anchor "end" - :dominant-baseline "middle" :style {:font-size (* font-size zoom-inverse) :font-family font-family :fill selection-area-color}} (fmt/format-number (- (:y2 selection-rect) offset-y))] [:text {:x (+ center-x (/ (:height selection-rect) 2)) - :y center-y + :y (+ center-y (* 4 zoom-inverse)) :text-anchor "start" - :dominant-baseline "middle" :style {:font-size (* font-size zoom-inverse) :font-family font-family :fill selection-area-color}} -- Gitee From 4ef7af104da264956a631d3c825314a114d2fc4c Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 27 Mar 2024 08:41:43 +0100 Subject: [PATCH 0163/1266] :bug: Fix problem with show guides config --- frontend/src/app/main/ui/workspace/viewport.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/workspace/viewport.cljs b/frontend/src/app/main/ui/workspace/viewport.cljs index 2a808e627..8539def89 100644 --- a/frontend/src/app/main/ui/workspace/viewport.cljs +++ b/frontend/src/app/main/ui/workspace/viewport.cljs @@ -553,7 +553,7 @@ :offset-y offset-y :show-rulers? show-rulers?}]) - (when show-rulers? + (when (and show-rulers? show-grids?) [:& guides/viewport-guides {:zoom zoom :vbox vbox -- Gitee From 7fa026da1563d8c8e17f9b2ea341e687e859aa82 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 27 Mar 2024 11:08:59 +0100 Subject: [PATCH 0164/1266] :bug: Fix issue on frontend build script --- frontend/scripts/build | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/scripts/build b/frontend/scripts/build index 4254b5e22..2b462db6a 100755 --- a/frontend/scripts/build +++ b/frontend/scripts/build @@ -20,6 +20,7 @@ rm -rf target/dist; clojure -M:dev:shadow-cljs release main --config-merge "{:release-version \"${CURRENT_HASH}\"}" $EXTRA_PARAMS || exit 1 yarn run compile || exit 1; +mkdir -p target/dist; rsync -avr resources/public/ target/dist/ sed -i -re "s/\%version\%/$CURRENT_VERSION/g" ./target/dist/index.html; -- Gitee From 315be268a44bb7af4d39eb6119241a37829bf09c Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Wed, 27 Mar 2024 11:31:23 +0100 Subject: [PATCH 0165/1266] :bug: Fix component element count while dragging --- .../styles/common/refactor/design-tokens.scss | 4 +-- .../ui/workspace/sidebar/assets/common.cljs | 6 ++--- .../ui/workspace/sidebar/assets/common.scss | 18 +++++++++++++ .../workspace/sidebar/assets/components.scss | 25 ++++++++++++++----- frontend/translations/en.po | 6 +++++ frontend/translations/es.po | 6 +++++ 6 files changed, 54 insertions(+), 11 deletions(-) diff --git a/frontend/resources/styles/common/refactor/design-tokens.scss b/frontend/resources/styles/common/refactor/design-tokens.scss index 0088956e4..72435730b 100644 --- a/frontend/resources/styles/common/refactor/design-tokens.scss +++ b/frontend/resources/styles/common/refactor/design-tokens.scss @@ -229,7 +229,7 @@ --assets-title-background-color: var(--color-background-primary); --assets-item-background-color: var(--color-background-tertiary); --assets-item-background-color-hover: var(--color-background-quaternary); - --assets-item-name-background-color: var(--db-secondary-80); // TODO: penpot file has a non-existing token + --assets-item-name-background-color: var(--color-background-primary); --assets-item-name-foreground-color-rest: var(--color-foreground-secondary); --assets-item-name-foreground-color: var(--color-foreground-primary); --assets-item-name-foreground-color-hover: var(--color-foreground-primary); @@ -241,6 +241,7 @@ --assets-component-background-color-disabled: var(--df-secondary;); --assets-component-border-color: var(--color-background-tertiary); --assets-component-border-selected: var(--color-accent-tertiary); + --assets-component-second-border-selected: var(--color-background-primary); --radio-btns-background-color: var(--color-background-tertiary); --radio-btn-background-color-selected: var(--color-background-quaternary); @@ -434,7 +435,6 @@ --button-icon-background-color-selected: var(--color-background-primary); --button-icon-border-color-selected: var(--color-background-secondary); - --assets-item-name-background-color: var(--color-background-primary); --assets-item-name-foreground-color: var(--color-foreground-primary); --text-editor-selection-background-color: var(--la-tertiary-70); diff --git a/frontend/src/app/main/ui/workspace/sidebar/assets/common.cljs b/frontend/src/app/main/ui/workspace/sidebar/assets/common.cljs index 4c6fa807c..d99e9dcac 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/assets/common.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/assets/common.cljs @@ -28,7 +28,7 @@ [app.util.array :as array] [app.util.dom :as dom] [app.util.dom.dnd :as dnd] - [app.util.i18n :as i18n :refer [tr]] + [app.util.i18n :as i18n :refer [tr c]] [app.util.strings :refer [matches-search]] [app.util.timers :as ts] [cljs.spec.alpha :as s] @@ -216,8 +216,8 @@ (defn create-counter-element [asset-count] (let [counter-el (dom/create-element "div")] - (dom/set-property! counter-el "class" "drag-counter") - (dom/set-text! counter-el (str asset-count)) + (dom/set-property! counter-el "class" (stl/css :drag-counter)) + (dom/set-text! counter-el (tr "workspace.assets.sidebar.components" (c asset-count))) counter-el)) (defn set-drag-image diff --git a/frontend/src/app/main/ui/workspace/sidebar/assets/common.scss b/frontend/src/app/main/ui/workspace/sidebar/assets/common.scss index 1b33dcf6a..bbc0c7d70 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/assets/common.scss +++ b/frontend/src/app/main/ui/workspace/sidebar/assets/common.scss @@ -45,3 +45,21 @@ .asset-section.opened { margin-bottom: $s-12; } + +.drag-counter { + @include bodySmallTypography; + @include textEllipsis; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: calc($s-24 - $s-2); + background-color: var(--assets-item-name-background-color); + color: var(--assets-item-name-foreground-color); + display: flex; + justify-content: flex-start; + align-items: center; + margin: $s-4; + padding-inline: $s-4; + z-index: 2; +} diff --git a/frontend/src/app/main/ui/workspace/sidebar/assets/components.scss b/frontend/src/app/main/ui/workspace/sidebar/assets/components.scss index f426c5547..1fad7eeb8 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/assets/components.scss +++ b/frontend/src/app/main/ui/workspace/sidebar/assets/components.scss @@ -35,12 +35,13 @@ position: absolute; left: $s-4; bottom: $s-4; - height: $s-20; + height: calc($s-24 - $s-2); width: calc(100% - 2 * $s-4); - padding: $s-2; + padding: $s-2 $s-6; column-gap: $s-4; - border-radius: $br-2; + border-radius: $br-4; background-color: var(--assets-item-name-background-color); + border: $s-1 solid transparent; color: var(--assets-item-name-foreground-color); input { @include textEllipsis; @@ -55,7 +56,7 @@ height: 100%; } &.editing { - border: $s-1 solid var(--input-border-color-focus); + border-color: var(--input-border-color-focus); border-radius: $br-4; display: flex; align-items: center; @@ -65,12 +66,24 @@ &:hover { .cell-name { - display: block; + display: grid; + grid-template-columns: 1fr auto; } } &.selected { - border: $s-1 solid var(--assets-item-border-color); + border: $s-2 solid var(--assets-item-border-color); + &::before { + content: " "; + position: absolute; + z-index: $z-index-2; + top: 0; + left: 0; + right: 0; + bottom: 0; + border: $s-4 solid var(--assets-component-second-border-selected); + border-radius: $br-8; + } } } diff --git a/frontend/translations/en.po b/frontend/translations/en.po index 52ee7dd65..498fd2597 100644 --- a/frontend/translations/en.po +++ b/frontend/translations/en.po @@ -3711,6 +3711,12 @@ msgstr "Swap component" msgid "workspace.options.component.swap.empty" msgstr "There are no assets in this library yet" +#: src/app/main/ui/workspace/sidebar/assets/common.cljs +msgid "workspace.assets.sidebar.components" +msgid_plural "workspace.assets.sidebar.components" +msgstr[0] "1 component" +msgstr[1] "%s components" + #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Constraints" diff --git a/frontend/translations/es.po b/frontend/translations/es.po index 8195efe3b..02f484954 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -3711,6 +3711,12 @@ msgstr "Desvincular todas las tipografías" msgid "workspace.libraries.typography" msgstr "%s tipografías" +#: src/app/main/ui/workspace/sidebar/assets/common.cljs +msgid "workspace.assets.sidebar.components" +msgid_plural "workspace.assets.sidebar.components" +msgstr[0] "1 componente" +msgstr[1] "%s componentes" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.update" msgstr "Actualizar" -- Gitee From 78aafa4635349e1d526d6ceff4f4bb92a2a7231f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Wed, 27 Mar 2024 11:55:17 +0100 Subject: [PATCH 0166/1266] :bug: Fix layer and component names inputs not having their text selectable on Firefox --- frontend/src/app/main/ui/hooks.cljs | 5 ++- .../workspace/sidebar/assets/components.cljs | 37 ++++++++++--------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/frontend/src/app/main/ui/hooks.cljs b/frontend/src/app/main/ui/hooks.cljs index 944d32ac7..bb05d2b1c 100644 --- a/frontend/src/app/main/ui/hooks.cljs +++ b/frontend/src/app/main/ui/hooks.cljs @@ -177,8 +177,9 @@ on-mount (fn [] (let [dom (mf/ref-val ref)] - (.setAttribute dom "draggable" true) ;; In firefox it needs to be draggable for problems with event handling. - ;; It will stop the drag operation in on-drag-start + ;; In firefox it needs to be draggable for problems with event handling. + ;; It will stop the drag operation in on-drag-start + (.setAttribute dom "draggable" (and draggable? (not disabled))) ;; Register all events in the (default) bubble mode, so that they ;; are captured by the most leaf item. The handler will stop diff --git a/frontend/src/app/main/ui/workspace/sidebar/assets/components.cljs b/frontend/src/app/main/ui/workspace/sidebar/assets/components.cljs index 65a109333..72e01e609 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/assets/components.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/assets/components.cljs @@ -141,14 +141,16 @@ on-context-menu (mf/use-fn (mf/deps on-context-menu component-id) - (partial on-context-menu component-id))] + (partial on-context-menu component-id)) + + renaming? (= renaming (:id component))] [:div {:ref item-ref :class (stl/css-case :selected (contains? selected (:id component)) :grid-cell listing-thumbs? :enum-item (not listing-thumbs?)) :id (dm/str "component-shape-id-" (:id component)) - :draggable (not read-only?) + :draggable (and (not read-only?) (not renaming?)) :on-click on-component-click :on-double-click on-component-double-click :on-context-menu on-context-menu @@ -160,22 +162,21 @@ (when (and (some? root-shape) (some? container)) [:* - (let [renaming? (= renaming (:id component))] - [:* - [:& editable-label - {:class (stl/css-case :cell-name listing-thumbs? - :item-name (not listing-thumbs?) - :editing renaming?) - :value (cfh/merge-path-item (:path component) (:name component)) - :tooltip (cfh/merge-path-item (:path component) (:name component)) - :display-value (:name component) - :editing renaming? - :disable-dbl-click true - :on-change do-rename - :on-cancel cancel-rename}] - - (when ^boolean dragging? - [:div {:class (stl/css :dragging)}])]) + [:* + [:& editable-label + {:class (stl/css-case :cell-name listing-thumbs? + :item-name (not listing-thumbs?) + :editing renaming?) + :value (cfh/merge-path-item (:path component) (:name component)) + :tooltip (cfh/merge-path-item (:path component) (:name component)) + :display-value (:name component) + :editing renaming? + :disable-dbl-click true + :on-change do-rename + :on-cancel cancel-rename}] + + (when ^boolean dragging? + [:div {:class (stl/css :dragging)}])] (when visible? [:& cmm/component-item-thumbnail {:file-id file-id -- Gitee From 2396b54e15908b88a5e14b7f494cc9bb3a599840 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Wed, 27 Mar 2024 13:24:44 +0100 Subject: [PATCH 0167/1266] :bug: Fix view only reset --- frontend/src/app/main/ui/workspace/left_header.cljs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/workspace/left_header.cljs b/frontend/src/app/main/ui/workspace/left_header.cljs index 64d8e068d..7fe2d8e3c 100644 --- a/frontend/src/app/main/ui/workspace/left_header.cljs +++ b/frontend/src/app/main/ui/workspace/left_header.cljs @@ -72,7 +72,9 @@ (mf/deps project) (fn [] (close-modals) - (st/emit! (dw/go-to-dashboard project)))) + (st/emit! (dw/set-options-mode :design) + (dw/set-workspace-read-only false) + (dw/go-to-dashboard project)))) nav-to-project (mf/use-fn -- Gitee From f24323148b66a828b77ad9216213ffb6fcbea068 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Mon, 1 Apr 2024 09:24:29 +0200 Subject: [PATCH 0168/1266] :bug: Fix auth links font-size --- frontend/src/app/main/ui/auth.cljs | 9 ++++++--- frontend/src/app/main/ui/auth.scss | 31 +++++++++++++++--------------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/frontend/src/app/main/ui/auth.cljs b/frontend/src/app/main/ui/auth.cljs index 636be2cd6..218fc21ce 100644 --- a/frontend/src/app/main/ui/auth.cljs +++ b/frontend/src/app/main/ui/auth.cljs @@ -27,13 +27,16 @@ (when show-all? [:div {:class (stl/css :terms-login)} (when show-terms? - [:a {:href cf/terms-of-service-uri :target "_blank"} (tr "auth.terms-of-service")]) + [:a {:href cf/terms-of-service-uri :target "_blank" :class (stl/css :auth-link)} + (tr "auth.terms-of-service")]) (when show-all? - [:span (dm/str " " (tr "labels.and") " ")]) + [:span {:class (stl/css :and-text)} + (dm/str " " (tr "labels.and") " ")]) (when show-privacy? - [:a {:href cf/privacy-policy-uri :target "_blank"} (tr "auth.privacy-policy")])]))) + [:a {:href cf/privacy-policy-uri :target "_blank" :class (stl/css :auth-link)} + (tr "auth.privacy-policy")])]))) (mf/defc auth {::mf/props :obj} diff --git a/frontend/src/app/main/ui/auth.scss b/frontend/src/app/main/ui/auth.scss index 3c81a7c43..81e418e9c 100644 --- a/frontend/src/app/main/ui/auth.scss +++ b/frontend/src/app/main/ui/auth.scss @@ -49,7 +49,7 @@ gap: $s-24; height: fit-content; max-width: $s-412; - padding-bottom: $s-8; + padding-block-end: $s-8; position: relative; width: 100%; } @@ -60,33 +60,32 @@ left: $s-20; display: flex; justify-content: flex-start; - margin-bottom: $s-52; width: $s-120; + margin-block-end: $s-52; svg { width: $s-120; height: $s-40; - fill: $df-primary; - stroke: $df-primary; + fill: var(--main-icon-foreground); } } .terms-login { - font-size: $fs-11; - width: 100%; + @include bodySmallTypography; display: flex; gap: $s-4; justify-content: center; + width: 100%; +} - a { - font-weight: $fw700; - color: $da-primary; - &:hover { - text-decoration: underline; - } - } - span { - border-bottom: $s-1 solid transparent; - color: $df-secondary; +.and-text { + border-bottom: $s-1 solid transparent; + color: var(--title-foreground-color); +} + +.auth-link { + color: var(--link-foreground-color); + &:hover { + text-decoration: underline; } } -- Gitee From 08c5cdb2dd63bb4067e17eb89a843e608fd8fb10 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Tue, 2 Apr 2024 09:05:18 +0200 Subject: [PATCH 0169/1266] :bug: Fix guides color in both themes --- frontend/src/app/main/ui/workspace/viewport/guides.cljs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/viewport/guides.cljs b/frontend/src/app/main/ui/workspace/viewport/guides.cljs index 23d8de43f..79321b508 100644 --- a/frontend/src/app/main/ui/workspace/viewport/guides.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/guides.cljs @@ -26,7 +26,7 @@ (def guide-width 1) (def guide-opacity 0.7) (def guide-opacity-hover 1) -(def guide-color colors/new-primary) +(def guide-color colors/new-danger) (def guide-pill-width 34) (def guide-pill-height 20) (def guide-pill-corner-radius 4) @@ -378,7 +378,7 @@ :transform (when (= axis :y) (str "rotate(-90 " text-x "," text-y ")")) :style {:font-size (/ rulers/font-size zoom) :font-family rulers/font-family - :fill colors/black}} + :fill colors/white}} ;; If the guide is associated to a frame we show the position relative to the frame (fmt/format-number (- pos (if (= axis :x) (:x frame) (:y frame))))]]))]))) -- Gitee From 193df9ce1ecac07f043f12a9c83ce7cba8e3bcdb Mon Sep 17 00:00:00 2001 From: AzazelN28 Date: Tue, 2 Apr 2024 12:54:44 +0200 Subject: [PATCH 0170/1266] :bug: Fix horizontal resize comment textarea --- frontend/src/app/main/ui/comments.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/app/main/ui/comments.scss b/frontend/src/app/main/ui/comments.scss index c41dcd306..6cfe14e7c 100644 --- a/frontend/src/app/main/ui/comments.scss +++ b/frontend/src/app/main/ui/comments.scss @@ -238,6 +238,7 @@ margin-bottom: $s-8; padding: $s-8; color: var(--input-foreground-color-active); + resize: vertical; &:focus { border: $s-1 solid var(--input-border-color-active); outline: none; -- Gitee From 411af023d55dea330927e9c41ad7695b40b1eff7 Mon Sep 17 00:00:00 2001 From: AzazelN28 Date: Tue, 2 Apr 2024 13:19:16 +0200 Subject: [PATCH 0171/1266] :bug: Fix comment reply menu --- frontend/src/app/main/data/comments.cljs | 18 +++++++++++++++++- frontend/src/app/main/ui/comments.cljs | 16 ++++++++++------ frontend/src/app/main/ui/comments.scss | 3 ++- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/frontend/src/app/main/data/comments.cljs b/frontend/src/app/main/data/comments.cljs index 981f78336..807db96e8 100644 --- a/frontend/src/app/main/data/comments.cljs +++ b/frontend/src/app/main/data/comments.cljs @@ -67,6 +67,7 @@ (update :comment-threads assoc id (dissoc thread :comment)) (update-in [:workspace-data :pages-index page-id :options :comment-threads-position] assoc id position) (update :comments-local assoc :open id) + (update :comments-local assoc :options nil) (update :comments-local dissoc :draft) (update :workspace-drawing dissoc :comment) (update-in [:comments id] assoc (:id comment) comment)))) @@ -120,6 +121,7 @@ (update :comment-threads assoc id (dissoc thread :comment)) (update-in [:viewer :pages page-id :options :comment-threads-position] assoc id position) (update :comments-local assoc :open id) + (update :comments-local assoc :options nil) (update :comments-local dissoc :draft) (update :workspace-drawing dissoc :comment) (update-in [:comments id] assoc (:id comment) comment)))) @@ -427,6 +429,7 @@ (update [_ state] (-> state (update :comments-local assoc :open id) + (update :comments-local assoc :options nil) (update :workspace-drawing dissoc :comment))))) (defn close-thread @@ -435,7 +438,7 @@ ptk/UpdateEvent (update [_ state] (-> state - (update :comments-local dissoc :open :draft) + (update :comments-local dissoc :open :draft :options) (update :workspace-drawing dissoc :comment))))) (defn update-filters @@ -490,6 +493,19 @@ (d/update-in-when [:workspace-drawing :comment] merge data) (d/update-in-when [:comments-local :draft] merge data))))) +(defn toggle-comment-options + [comment] + (ptk/reify ::toggle-comment-options + ptk/UpdateEvent + (update [_ state] + (update-in state [:comments-local :options] #(if (= (:id comment) %) nil (:id comment)))))) + +(defn hide-comment-options + [] + (ptk/reify ::hide-comment-options + ptk/UpdateEvent + (update [_ state] + (update-in state [:comments-local :options] (constantly nil))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Helpers diff --git a/frontend/src/app/main/ui/comments.cljs b/frontend/src/app/main/ui/comments.cljs index 2fd50ec86..3ff852fcf 100644 --- a/frontend/src/app/main/ui/comments.cljs +++ b/frontend/src/app/main/ui/comments.cljs @@ -27,6 +27,8 @@ [okulary.core :as l] [rumext.v2 :as mf])) +(def comments-local-options (l/derived :options refs/comments-local)) + (mf/defc resizing-textarea {::mf/wrap-props false} [props] @@ -248,25 +250,28 @@ [{:keys [comment thread users origin] :as props}] (let [owner (get users (:owner-id comment)) profile (mf/deref refs/profile) - options (mf/use-state false) + options (mf/deref comments-local-options) edition? (mf/use-state false) on-toggle-options (mf/use-fn + (mf/deps options) (fn [event] (dom/stop-propagation event) - (swap! options not))) + (st/emit! (dcm/toggle-comment-options comment)))) on-hide-options (mf/use-fn + (mf/deps options) (fn [event] (dom/stop-propagation event) - (reset! options false))) + (st/emit! (dcm/hide-comment-options)))) on-edit-clicked (mf/use-fn + (mf/deps options) (fn [] - (reset! options false) + (st/emit! (dcm/hide-comment-options)) (reset! edition? true))) on-delete-comment @@ -282,7 +287,6 @@ (dcm/delete-comment-thread-on-viewer thread) (dcm/delete-comment-thread-on-workspace thread)))) - on-delete-thread (mf/use-fn (mf/deps thread) @@ -337,7 +341,7 @@ :on-cancel on-cancel}] [:span {:class (stl/css :text)} (:content comment)])]] - [:& dropdown {:show @options + [:& dropdown {:show (= options (:id comment)) :on-close on-hide-options} [:ul {:class (stl/css :comment-options-dropdown)} [:li {:class (stl/css :context-menu-option) diff --git a/frontend/src/app/main/ui/comments.scss b/frontend/src/app/main/ui/comments.scss index 6cfe14e7c..35682c766 100644 --- a/frontend/src/app/main/ui/comments.scss +++ b/frontend/src/app/main/ui/comments.scss @@ -216,7 +216,8 @@ .comment-options-dropdown { @extend .dropdown-wrapper; position: absolute; - width: $s-120; + width: fit-content; + max-width: $s-200; right: 0; left: unset; .context-menu-option { -- Gitee From cfb5e9aa6676cdfe5ee08292bb3fb47d18422a3d Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Wed, 3 Apr 2024 10:24:27 +0200 Subject: [PATCH 0172/1266] :sparkles: On migration to v2, add the component path to the copy name --- backend/src/app/features/components_v2.clj | 24 ++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/backend/src/app/features/components_v2.clj b/backend/src/app/features/components_v2.clj index 565d00320..221997ec8 100644 --- a/backend/src/app/features/components_v2.clj +++ b/backend/src/app/features/components_v2.clj @@ -978,6 +978,29 @@ (-> file-data (update :pages-index update-vals fix-container)))) + + fix-copies-names + (fn [file-data] + ;; Rename component heads to add the component path to the name + (letfn [(fix-container [container] + (d/update-when container :objects #(cfh/reduce-objects % fix-shape %))) + + (fix-shape [objects shape] + (let [root (ctn/get-component-shape objects shape) + libraries (assoc-in libraries [(:id file-data) :data] file-data) + library (get libraries (:component-file root)) + component (ctkl/get-component (:data library) (:component-id root) true) + path (str/trim (:path component))] + (if (and (ctk/instance-head? shape) + (some? component) + (= (:name component) (:name shape)) + (not (str/empty? path))) + (update objects (:id shape) assoc :name (str path " / " (:name component))) + objects)))] + + (-> file-data + (update :pages-index update-vals fix-container)))) + fix-copies-of-detached (fn [file-data] ;; Find any copy that is referencing a shape inside a component that have @@ -1027,6 +1050,7 @@ (fix-component-nil-objects) (fix-false-copies) (fix-component-root-without-component) + (fix-copies-names) (fix-copies-of-detached); <- Do not add fixes after this and fix-orphan-copies call ))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -- Gitee From 9c9d09a816bad139a11fb16c47136ed7b7752979 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 2 Apr 2024 14:01:42 +0200 Subject: [PATCH 0173/1266] :sparkles: Add better logging of elapsed time for cron tasks --- backend/src/app/worker.clj | 61 +++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/backend/src/app/worker.clj b/backend/src/app/worker.clj index 5c63ecfa0..be00edd10 100644 --- a/backend/src/app/worker.clj +++ b/backend/src/app/worker.clj @@ -69,8 +69,8 @@ ;; TASKS REGISTRY ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defn- wrap-task-handler - [metrics tname f] +(defn- wrap-with-metrics + [f metrics tname] (let [labels (into-array String [tname])] (fn [params] (let [tp (dt/tpoint)] @@ -90,10 +90,10 @@ (defmethod ig/init-key ::registry [_ {:keys [::mtx/metrics ::tasks]}] (l/inf :hint "registry initialized" :tasks (count tasks)) - (reduce-kv (fn [registry k v] + (reduce-kv (fn [registry k f] (let [tname (name k)] (l/trc :hint "register task" :name tname) - (assoc registry tname (wrap-task-handler metrics tname v)))) + (assoc registry tname (wrap-with-metrics f metrics tname)))) {} tasks)) @@ -157,7 +157,7 @@ (px/interrupt! thread)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; SCHEDULER +;; DISPATCHER ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defn- decode-task-row @@ -252,7 +252,7 @@ (if (db/read-only? pool) (l/wrn :hint "dispatcher: not started (db is read-only)") - (px/fn->thread dispatcher :name "penpot/worker/dispatcher" :virtual true)))) + (px/fn->thread dispatcher :name "penpot/worker/dispatcher" :virtual false)))) (defmethod ig/halt-key! ::dispatcher [_ thread] @@ -579,29 +579,34 @@ (some? (db/exec-one! conn [sql (d/name id)])))) (defn- execute-cron-task - [{:keys [::db/pool] :as cfg} {:keys [id] :as task}] + [cfg {:keys [id] :as task}] (px/thread - {:name (str "penpot/cront-task/" id)} - (try - (db/with-atomic [conn pool] - (db/exec-one! conn ["SET statement_timeout=0;"]) - (db/exec-one! conn ["SET idle_in_transaction_session_timeout=0;"]) - (when (lock-scheduled-task! conn id) - (l/dbg :hint "cron: execute task" :task-id id) - ((:fn task) task)) - (db/rollback! conn)) - - (catch InterruptedException _ - (l/debug :hint "cron: task interrupted" :task-id id)) + {:name (str "penpot/cron-task/" id)} + (let [tpoint (dt/tpoint)] + (try + (db/tx-run! cfg (fn [{:keys [::db/conn]}] + (db/exec-one! conn ["SET LOCAL statement_timeout=0;"]) + (db/exec-one! conn ["SET LOCAL idle_in_transaction_session_timeout=0;"]) + (when (lock-scheduled-task! conn id) + (l/dbg :hint "cron: start task" :task-id id) + ((:fn task) task) + (let [elapsed (dt/format-duration (tpoint))] + (l/dbg :hint "cron: end task" :task-id id :elapsed elapsed))))) + + (catch InterruptedException _ + (let [elapsed (dt/format-duration (tpoint))] + (l/debug :hint "cron: task interrupted" :task-id id :elapsed elapsed))) - (catch Throwable cause - (binding [l/*context* (get-error-context cause task)] - (l/err :hint "cron: unhandled exception on running task" - :task-id id - :cause cause))) - (finally - (when-not (px/interrupted? :current) - (schedule-cron-task cfg task)))))) + (catch Throwable cause + (let [elapsed (dt/format-duration (tpoint))] + (binding [l/*context* (get-error-context cause task)] + (l/err :hint "cron: unhandled exception on running task" + :task-id id + :elapsed elapsed + :cause cause)))) + (finally + (when-not (px/interrupted? :current) + (schedule-cron-task cfg task))))))) (defn- ms-until-valid [cron] @@ -618,8 +623,8 @@ (l/dbg :hint "cron: schedule task" :task-id id :ts (dt/format-duration ts) :at (dt/format-instant (dt/in-future ts))) - (swap! running #(into #{ft} (filter p/pending?) %)))) + (swap! running #(into #{ft} (filter p/pending?) %)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; SUBMIT API -- Gitee From e2ddb3e31e27aad97b060a2278025f00c071bf29 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 2 Apr 2024 14:13:37 +0200 Subject: [PATCH 0174/1266] :sparkles: Move worker cron related code to a separated namespace --- backend/src/app/worker.clj | 140 +--------------------------- backend/src/app/worker/cron.clj | 156 ++++++++++++++++++++++++++++++++ 2 files changed, 157 insertions(+), 139 deletions(-) create mode 100644 backend/src/app/worker/cron.clj diff --git a/backend/src/app/worker.clj b/backend/src/app/worker.clj index be00edd10..7e8f1a67c 100644 --- a/backend/src/app/worker.clj +++ b/backend/src/app/worker.clj @@ -22,11 +22,9 @@ [clojure.spec.alpha :as s] [cuerdas.core :as str] [integrant.core :as ig] - [promesa.core :as p] [promesa.exec :as px]) (:import java.util.concurrent.Executor - java.util.concurrent.Future java.util.concurrent.ThreadPoolExecutor)) (set! *warn-on-reflection* true) @@ -486,146 +484,10 @@ (l/err :hint "worker: unhandled exception" :cause cause)))))) -(defn- get-error-context +(defn get-error-context [_ item] {:params item}) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; CRON -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(declare schedule-cron-task) -(declare synchronize-cron-entries!) - -(s/def ::fn (s/or :var var? :fn fn?)) -(s/def ::id keyword?) -(s/def ::cron dt/cron?) -(s/def ::props (s/nilable map?)) -(s/def ::task keyword?) - -(s/def ::cron-task - (s/keys :req-un [::cron ::task] - :opt-un [::props ::id])) - -(s/def ::entries (s/coll-of (s/nilable ::cron-task))) - -(defmethod ig/pre-init-spec ::cron [_] - (s/keys :req [::db/pool ::entries ::registry])) - -(defmethod ig/init-key ::cron - [_ {:keys [::entries ::registry ::db/pool] :as cfg}] - (if (db/read-only? pool) - (l/wrn :hint "cron: not started (db is read-only)") - (let [running (atom #{}) - entries (->> entries - (filter some?) - ;; If id is not defined, use the task as id. - (map (fn [{:keys [id task] :as item}] - (if (some? id) - (assoc item :id (d/name id)) - (assoc item :id (d/name task))))) - (map (fn [item] - (update item :task d/name))) - (map (fn [{:keys [task] :as item}] - (let [f (get registry task)] - (when-not f - (ex/raise :type :internal - :code :task-not-found - :hint (str/fmt "task %s not configured" task))) - (-> item - (dissoc :task) - (assoc :fn f)))))) - - cfg (assoc cfg ::entries entries ::running running)] - - (l/inf :hint "cron: started" :tasks (count entries)) - (synchronize-cron-entries! cfg) - - (->> (filter some? entries) - (run! (partial schedule-cron-task cfg))) - - (reify - clojure.lang.IDeref - (deref [_] @running) - - java.lang.AutoCloseable - (close [_] - (l/inf :hint "cron: terminated") - (doseq [item @running] - (when-not (.isDone ^Future item) - (.cancel ^Future item true)))))))) - -(defmethod ig/halt-key! ::cron - [_ instance] - (some-> instance d/close!)) - -(def sql:upsert-cron-task - "insert into scheduled_task (id, cron_expr) - values (?, ?) - on conflict (id) - do update set cron_expr=?") - -(defn- synchronize-cron-entries! - [{:keys [::db/pool ::entries]}] - (db/with-atomic [conn pool] - (doseq [{:keys [id cron]} entries] - (l/trc :hint "register cron task" :id id :cron (str cron)) - (db/exec-one! conn [sql:upsert-cron-task id (str cron) (str cron)])))) - -(defn- lock-scheduled-task! - [conn id] - (let [sql (str "SELECT id FROM scheduled_task " - " WHERE id=? FOR UPDATE SKIP LOCKED")] - (some? (db/exec-one! conn [sql (d/name id)])))) - -(defn- execute-cron-task - [cfg {:keys [id] :as task}] - (px/thread - {:name (str "penpot/cron-task/" id)} - (let [tpoint (dt/tpoint)] - (try - (db/tx-run! cfg (fn [{:keys [::db/conn]}] - (db/exec-one! conn ["SET LOCAL statement_timeout=0;"]) - (db/exec-one! conn ["SET LOCAL idle_in_transaction_session_timeout=0;"]) - (when (lock-scheduled-task! conn id) - (l/dbg :hint "cron: start task" :task-id id) - ((:fn task) task) - (let [elapsed (dt/format-duration (tpoint))] - (l/dbg :hint "cron: end task" :task-id id :elapsed elapsed))))) - - (catch InterruptedException _ - (let [elapsed (dt/format-duration (tpoint))] - (l/debug :hint "cron: task interrupted" :task-id id :elapsed elapsed))) - - (catch Throwable cause - (let [elapsed (dt/format-duration (tpoint))] - (binding [l/*context* (get-error-context cause task)] - (l/err :hint "cron: unhandled exception on running task" - :task-id id - :elapsed elapsed - :cause cause)))) - (finally - (when-not (px/interrupted? :current) - (schedule-cron-task cfg task))))))) - -(defn- ms-until-valid - [cron] - (s/assert dt/cron? cron) - (let [now (dt/now) - next (dt/next-valid-instant-from cron now)] - (dt/diff now next))) - -(defn- schedule-cron-task - [{:keys [::running] :as cfg} {:keys [cron id] :as task}] - (let [ts (ms-until-valid cron) - ft (px/schedule! ts (partial execute-cron-task cfg task))] - - (l/dbg :hint "cron: schedule task" :task-id id - :ts (dt/format-duration ts) - :at (dt/format-instant (dt/in-future ts))) - - (swap! running #(into #{ft} (filter p/pending?) %)))) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; SUBMIT API ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/backend/src/app/worker/cron.clj b/backend/src/app/worker/cron.clj new file mode 100644 index 000000000..0f44dcaae --- /dev/null +++ b/backend/src/app/worker/cron.clj @@ -0,0 +1,156 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.worker.cron + (:require + [app.common.data :as d] + [app.common.exceptions :as ex] + [app.common.logging :as l] + [app.db :as db] + [app.util.time :as dt] + [app.worker :as wrk] + [clojure.spec.alpha :as s] + [cuerdas.core :as str] + [integrant.core :as ig] + [promesa.core :as p] + [promesa.exec :as px]) + (:import + java.util.concurrent.Future)) + +(set! *warn-on-reflection* true) + +(def sql:upsert-cron-task + "insert into scheduled_task (id, cron_expr) + values (?, ?) + on conflict (id) + do update set cron_expr=?") + +(defn- synchronize-cron-entries! + [{:keys [::db/pool ::entries]}] + (db/with-atomic [conn pool] + (doseq [{:keys [id cron]} entries] + (l/trc :hint "register cron task" :id id :cron (str cron)) + (db/exec-one! conn [sql:upsert-cron-task id (str cron) (str cron)])))) + +(defn- lock-scheduled-task! + [conn id] + (let [sql (str "SELECT id FROM scheduled_task " + " WHERE id=? FOR UPDATE SKIP LOCKED")] + (some? (db/exec-one! conn [sql (d/name id)])))) + +(declare ^:private schedule-cron-task) + +(defn- execute-cron-task + [cfg {:keys [id] :as task}] + (px/thread + {:name (str "penpot/cron-task/" id)} + (let [tpoint (dt/tpoint)] + (try + (db/tx-run! cfg (fn [{:keys [::db/conn]}] + (db/exec-one! conn ["SET LOCAL statement_timeout=0;"]) + (db/exec-one! conn ["SET LOCAL idle_in_transaction_session_timeout=0;"]) + (when (lock-scheduled-task! conn id) + (l/dbg :hint "start task" :task-id id) + ((:fn task) task) + (let [elapsed (dt/format-duration (tpoint))] + (l/dbg :hint "end task" :task-id id :elapsed elapsed))))) + + (catch InterruptedException _ + (let [elapsed (dt/format-duration (tpoint))] + (l/debug :hint "task interrupted" :task-id id :elapsed elapsed))) + + (catch Throwable cause + (let [elapsed (dt/format-duration (tpoint))] + (binding [l/*context* (wrk/get-error-context cause task)] + (l/err :hint "unhandled exception on running task" + :task-id id + :elapsed elapsed + :cause cause)))) + (finally + (when-not (px/interrupted? :current) + (schedule-cron-task cfg task))))))) + +(defn- ms-until-valid + [cron] + (s/assert dt/cron? cron) + (let [now (dt/now) + next (dt/next-valid-instant-from cron now)] + (dt/diff now next))) + +(defn- schedule-cron-task + [{:keys [::running] :as cfg} {:keys [cron id] :as task}] + (let [ts (ms-until-valid cron) + ft (px/schedule! ts (partial execute-cron-task cfg task))] + + (l/dbg :hint "schedule task" :task-id id + :ts (dt/format-duration ts) + :at (dt/format-instant (dt/in-future ts))) + + (swap! running #(into #{ft} (filter p/pending?) %)))) + + +(s/def ::fn (s/or :var var? :fn fn?)) +(s/def ::id keyword?) +(s/def ::cron dt/cron?) +(s/def ::props (s/nilable map?)) +(s/def ::task keyword?) + +(s/def ::wrk/task + (s/keys :req-un [::cron ::task] + :opt-un [::props ::id])) + +(s/def ::wrk/entries (s/coll-of (s/nilable ::wrk/task))) + +(defmethod ig/pre-init-spec ::wrk/cron [_] + (s/keys :req [::db/pool ::wrk/entries ::wrk/registry])) + +(defmethod ig/init-key ::wrk/cron + [_ {:keys [::wrk/entries ::wrk/registry ::db/pool] :as cfg}] + (if (db/read-only? pool) + (l/wrn :hint "service not started (db is read-only)") + (let [running (atom #{}) + entries (->> entries + (filter some?) + ;; If id is not defined, use the task as id. + (map (fn [{:keys [id task] :as item}] + (if (some? id) + (assoc item :id (d/name id)) + (assoc item :id (d/name task))))) + (map (fn [item] + (update item :task d/name))) + (map (fn [{:keys [task] :as item}] + (let [f (get registry task)] + (when-not f + (ex/raise :type :internal + :code :task-not-found + :hint (str/fmt "task %s not configured" task))) + (-> item + (dissoc :task) + (assoc :fn f)))))) + + cfg (assoc cfg ::entries entries ::running running)] + + (l/inf :hint "started" :tasks (count entries)) + (synchronize-cron-entries! cfg) + + (->> (filter some? entries) + (run! (partial schedule-cron-task cfg))) + + (reify + clojure.lang.IDeref + (deref [_] @running) + + java.lang.AutoCloseable + (close [_] + (l/inf :hint "terminated") + (doseq [item @running] + (when-not (.isDone ^Future item) + (.cancel ^Future item true)))))))) + +(defmethod ig/halt-key! ::wrk/cron + [_ instance] + (some-> instance d/close!)) + -- Gitee From 9c724c8e950cb2afd487125b496536b75fc77245 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 2 Apr 2024 14:27:33 +0200 Subject: [PATCH 0175/1266] :sparkles: Set better log level on some rpc middlewares --- backend/src/app/rpc.clj | 2 +- backend/src/app/rpc/climit.clj | 2 +- backend/src/app/rpc/cond.clj | 2 +- backend/src/app/rpc/retry.clj | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/src/app/rpc.clj b/backend/src/app/rpc.clj index ea49b6b70..89eee548d 100644 --- a/backend/src/app/rpc.clj +++ b/backend/src/app/rpc.clj @@ -201,7 +201,7 @@ (defn- wrap [cfg f mdata] - (l/debug :hint "register method" :name (::sv/name mdata)) + (l/trc :hint "register method" :name (::sv/name mdata)) (let [f (wrap-all cfg f mdata)] (partial f cfg))) diff --git a/backend/src/app/rpc/climit.clj b/backend/src/app/rpc/climit.clj index 3c23a7402..7dbec0861 100644 --- a/backend/src/app/rpc/climit.clj +++ b/backend/src/app/rpc/climit.clj @@ -200,7 +200,7 @@ (reduce (fn [handler [limit-id key-fn]] (if-let [config (get config limit-id)] (let [key-fn (or key-fn noop-fn)] - (l/dbg :hint "instrumenting method" + (l/trc :hint "instrumenting method" :method label :limit (id->str limit-id) :timeout (:timeout config) diff --git a/backend/src/app/rpc/cond.clj b/backend/src/app/rpc/cond.clj index a7db513b8..3fe03c821 100644 --- a/backend/src/app/rpc/cond.clj +++ b/backend/src/app/rpc/cond.clj @@ -51,7 +51,7 @@ [_ f {:keys [::get-object ::key-fn ::reuse-key?] :as mdata}] (if (and (ifn? get-object) (ifn? key-fn)) (do - (l/debug :hint "instrumenting method" :service (::sv/name mdata)) + (l/trc :hint "instrumenting method" :service (::sv/name mdata)) (fn [cfg {:keys [::key] :as params}] (if *enabled* (let [key' (when (or key reuse-key?) diff --git a/backend/src/app/rpc/retry.clj b/backend/src/app/rpc/retry.clj index 3745b9d8f..5e2d62013 100644 --- a/backend/src/app/rpc/retry.clj +++ b/backend/src/app/rpc/retry.clj @@ -44,7 +44,7 @@ (if (::enabled mdata) (let [max-retries (get mdata ::max-retries 3) matches? (get mdata ::when always-false)] - (l/dbg :hint "wrapping retry" :name name :max-retries max-retries) + (l/trc :hint "wrapping retry" :name name :max-retries max-retries) (fn [cfg params] (-> cfg (assoc ::max-retries max-retries) -- Gitee From d2998e1767441628f7d7dfd066d79eb9b70181fa Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 2 Apr 2024 14:29:59 +0200 Subject: [PATCH 0176/1266] :sparkles: Move executor service initialization to a separared ns --- backend/src/app/worker.clj | 98 +---------------------- backend/src/app/worker/executor.clj | 116 ++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+), 97 deletions(-) create mode 100644 backend/src/app/worker/executor.clj diff --git a/backend/src/app/worker.clj b/backend/src/app/worker.clj index 7e8f1a67c..fbb445353 100644 --- a/backend/src/app/worker.clj +++ b/backend/src/app/worker.clj @@ -22,47 +22,10 @@ [clojure.spec.alpha :as s] [cuerdas.core :as str] [integrant.core :as ig] - [promesa.exec :as px]) - (:import - java.util.concurrent.Executor - java.util.concurrent.ThreadPoolExecutor)) + [promesa.exec :as px])) (set! *warn-on-reflection* true) -(s/def ::executor #(instance? Executor %)) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Executor -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defmethod ig/pre-init-spec ::executor [_] - (s/keys :req [])) - -(defmethod ig/init-key ::executor - [_ _] - (let [factory (px/thread-factory :prefix "penpot/default/") - executor (px/cached-executor :factory factory :keepalive 60000)] - (l/inf :hint "starting executor") - (reify - java.lang.AutoCloseable - (close [_] - (l/inf :hint "stoping executor") - (px/shutdown! executor)) - - clojure.lang.IDeref - (deref [_] - {:active (.getPoolSize ^ThreadPoolExecutor executor) - :running (.getActiveCount ^ThreadPoolExecutor executor) - :completed (.getCompletedTaskCount ^ThreadPoolExecutor executor)}) - - Executor - (execute [_ runnable] - (.execute ^Executor executor ^Runnable runnable))))) - -(defmethod ig/halt-key! ::executor - [_ instance] - (.close ^java.lang.AutoCloseable instance)) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; TASKS REGISTRY ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -95,65 +58,6 @@ {} tasks)) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; EXECUTOR MONITOR -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(s/def ::name ::us/keyword) - -(defmethod ig/pre-init-spec ::monitor [_] - (s/keys :req [::name ::executor ::mtx/metrics])) - -(defmethod ig/prep-key ::monitor - [_ cfg] - (merge {::interval (dt/duration "2s")} - (d/without-nils cfg))) - -(defmethod ig/init-key ::monitor - [_ {:keys [::executor ::mtx/metrics ::interval ::name]}] - (letfn [(monitor! [executor prev-completed] - (let [labels (into-array String [(d/name name)]) - stats (deref executor) - - completed (:completed stats) - completed-inc (- completed prev-completed) - completed-inc (if (neg? completed-inc) 0 completed-inc)] - - (mtx/run! metrics - :id :executor-active-threads - :labels labels - :val (:active stats)) - - (mtx/run! metrics - :id :executor-running-threads - :labels labels - :val (:running stats)) - - (mtx/run! metrics - :id :executors-completed-tasks - :labels labels - :inc completed-inc) - - completed-inc))] - - (px/thread - {:name "penpot/executors-monitor" :virtual true} - (l/inf :hint "monitor: started" :name name) - (try - (loop [completed 0] - (px/sleep interval) - (recur (long (monitor! executor completed)))) - (catch InterruptedException _cause - (l/trc :hint "monitor: interrupted" :name name)) - (catch Throwable cause - (l/err :hint "monitor: unexpected error" :name name :cause cause)) - (finally - (l/inf :hint "monitor: terminated" :name name)))))) - -(defmethod ig/halt-key! ::monitor - [_ thread] - (px/interrupt! thread)) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; DISPATCHER ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/backend/src/app/worker/executor.clj b/backend/src/app/worker/executor.clj new file mode 100644 index 000000000..c1d10122c --- /dev/null +++ b/backend/src/app/worker/executor.clj @@ -0,0 +1,116 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.worker.executor + "Async tasks abstraction (impl)." + (:require + [app.common.data :as d] + [app.common.logging :as l] + [app.common.spec :as us] + [app.metrics :as mtx] + [app.util.time :as dt] + [app.worker :as-alias wrk] + [clojure.spec.alpha :as s] + [integrant.core :as ig] + [promesa.exec :as px]) + (:import + java.util.concurrent.Executor + java.util.concurrent.ThreadPoolExecutor)) + +(set! *warn-on-reflection* true) + +(s/def ::wrk/executor #(instance? Executor %)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; EXECUTOR +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defmethod ig/pre-init-spec ::wrk/executor [_] + (s/keys :req [])) + +(defmethod ig/init-key ::wrk/executor + [_ _] + (let [factory (px/thread-factory :prefix "penpot/default/") + executor (px/cached-executor :factory factory :keepalive 60000)] + (l/inf :hint "executor started") + (reify + java.lang.AutoCloseable + (close [_] + (l/inf :hint "stoping executor") + (px/shutdown! executor)) + + clojure.lang.IDeref + (deref [_] + {:active (.getPoolSize ^ThreadPoolExecutor executor) + :running (.getActiveCount ^ThreadPoolExecutor executor) + :completed (.getCompletedTaskCount ^ThreadPoolExecutor executor)}) + + Executor + (execute [_ runnable] + (.execute ^Executor executor ^Runnable runnable))))) + +(defmethod ig/halt-key! ::wrk/executor + [_ instance] + (.close ^java.lang.AutoCloseable instance)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; MONITOR +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(s/def ::name ::us/keyword) + +(defmethod ig/pre-init-spec ::wrk/monitor [_] + (s/keys :req [::wrk/name ::wrk/executor ::mtx/metrics])) + +(defmethod ig/prep-key ::wrk/monitor + [_ cfg] + (merge {::interval (dt/duration "2s")} + (d/without-nils cfg))) + +(defmethod ig/init-key ::wrk/monitor + [_ {:keys [::wrk/executor ::mtx/metrics ::interval ::wrk/name]}] + (letfn [(monitor! [executor prev-completed] + (let [labels (into-array String [(d/name name)]) + stats (deref executor) + + completed (:completed stats) + completed-inc (- completed prev-completed) + completed-inc (if (neg? completed-inc) 0 completed-inc)] + + (mtx/run! metrics + :id :executor-active-threads + :labels labels + :val (:active stats)) + + (mtx/run! metrics + :id :executor-running-threads + :labels labels + :val (:running stats)) + + (mtx/run! metrics + :id :executors-completed-tasks + :labels labels + :inc completed-inc) + + completed-inc))] + + (px/thread + {:name "penpot/executors-monitor" :virtual true} + (l/inf :hint "monitor started" :name name) + (try + (loop [completed 0] + (px/sleep interval) + (recur (long (monitor! executor completed)))) + (catch InterruptedException _cause + (l/trc :hint "monitor: interrupted" :name name)) + (catch Throwable cause + (l/err :hint "monitor: unexpected error" :name name :cause cause)) + (finally + (l/inf :hint "monitor: terminated" :name name)))))) + +(defmethod ig/halt-key! ::wrk/monitor + [_ thread] + (px/interrupt! thread)) -- Gitee From 4ccea6b2cf30c556f7064030b9365ccc1630cb02 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 2 Apr 2024 14:36:49 +0200 Subject: [PATCH 0177/1266] :sparkles: Move worker dispatcher code to a separated ns --- backend/src/app/worker.clj | 99 +---------------------- backend/src/app/worker/dispatcher.clj | 110 ++++++++++++++++++++++++++ 2 files changed, 112 insertions(+), 97 deletions(-) create mode 100644 backend/src/app/worker/dispatcher.clj diff --git a/backend/src/app/worker.clj b/backend/src/app/worker.clj index fbb445353..9614a3fa4 100644 --- a/backend/src/app/worker.clj +++ b/backend/src/app/worker.clj @@ -44,6 +44,7 @@ :labels labels}))))))) (s/def ::registry (s/map-of ::us/string fn?)) +(s/def ::tasks (s/map-of keyword? fn?)) (defmethod ig/pre-init-spec ::registry [_] (s/keys :req [::mtx/metrics ::tasks])) @@ -59,7 +60,7 @@ tasks)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; DISPATCHER +;; WORKER ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defn- decode-task-row @@ -68,102 +69,6 @@ (db/pgobject? props) (assoc :props (db/decode-transit-pgobject props)))) -(s/def ::wait-duration ::dt/duration) - -(defmethod ig/pre-init-spec ::dispatcher [_] - (s/keys :req [::mtx/metrics - ::db/pool - ::rds/redis] - :opt [::wait-duration - ::batch-size])) - -(defmethod ig/prep-key ::dispatcher - [_ cfg] - (merge {::batch-size 100 - ::wait-duration (dt/duration "5s")} - (d/without-nils cfg))) - -(def ^:private sql:select-next-tasks - "select id, queue from task as t - where t.scheduled_at <= now() - and (t.status = 'new' or t.status = 'retry') - and queue ~~* ?::text - order by t.priority desc, t.scheduled_at - limit ? - for update skip locked") - -(defmethod ig/init-key ::dispatcher - [_ {:keys [::db/pool ::rds/redis ::batch-size] :as cfg}] - (letfn [(get-tasks [conn] - (let [prefix (str (cf/get :tenant) ":%")] - (seq (db/exec! conn [sql:select-next-tasks prefix batch-size])))) - - (push-tasks! [conn rconn [queue tasks]] - (let [ids (mapv :id tasks) - key (str/ffmt "taskq:%" queue) - res (rds/rpush! rconn key (mapv t/encode ids)) - sql [(str "update task set status = 'scheduled'" - " where id = ANY(?)") - (db/create-array conn "uuid" ids)]] - - (db/exec-one! conn sql) - (l/trc :hist "dispatcher: queue tasks" - :queue queue - :tasks (count ids) - :queued res))) - - (run-batch! [rconn] - (try - (db/with-atomic [conn pool] - (if-let [tasks (get-tasks conn)] - (->> (group-by :queue tasks) - (run! (partial push-tasks! conn rconn))) - (px/sleep (::wait-duration cfg)))) - (catch InterruptedException cause - (throw cause)) - (catch Exception cause - (cond - (rds/exception? cause) - (do - (l/wrn :hint "dispatcher: redis exception (will retry in an instant)" :cause cause) - (px/sleep (::rds/timeout rconn))) - - (db/sql-exception? cause) - (do - (l/wrn :hint "dispatcher: database exception (will retry in an instant)" :cause cause) - (px/sleep (::rds/timeout rconn))) - - :else - (do - (l/err :hint "dispatcher: unhandled exception (will retry in an instant)" :cause cause) - (px/sleep (::rds/timeout rconn))))))) - - (dispatcher [] - (l/inf :hint "dispatcher: started") - (try - (dm/with-open [rconn (rds/connect redis)] - (loop [] - (run-batch! rconn) - (recur))) - (catch InterruptedException _ - (l/trc :hint "dispatcher: interrupted")) - (catch Throwable cause - (l/err :hint "dispatcher: unexpected exception" :cause cause)) - (finally - (l/inf :hint "dispatcher: terminated"))))] - - (if (db/read-only? pool) - (l/wrn :hint "dispatcher: not started (db is read-only)") - (px/fn->thread dispatcher :name "penpot/worker/dispatcher" :virtual false)))) - -(defmethod ig/halt-key! ::dispatcher - [_ thread] - (some-> thread px/interrupt!)) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; WORKER -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - (declare ^:private run-worker-loop!) (declare ^:private start-worker!) (declare ^:private get-error-context) diff --git a/backend/src/app/worker/dispatcher.clj b/backend/src/app/worker/dispatcher.clj new file mode 100644 index 000000000..dbdb06042 --- /dev/null +++ b/backend/src/app/worker/dispatcher.clj @@ -0,0 +1,110 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.worker.dispatcher + (:require + [app.common.data :as d] + [app.common.data.macros :as dm] + [app.common.logging :as l] + [app.common.transit :as t] + [app.config :as cf] + [app.db :as db] + [app.metrics :as mtx] + [app.redis :as rds] + [app.util.time :as dt] + [app.worker :as-alias wrk] + [clojure.spec.alpha :as s] + [cuerdas.core :as str] + [integrant.core :as ig] + [promesa.exec :as px])) + +(set! *warn-on-reflection* true) + +(defmethod ig/pre-init-spec ::wrk/dispatcher [_] + (s/keys :req [::mtx/metrics ::db/pool ::rds/redis])) + +(defmethod ig/prep-key ::wrk/dispatcher + [_ cfg] + (merge {::batch-size 100 + ::wait-duration (dt/duration "5s")} + (d/without-nils cfg))) + +(def ^:private sql:select-next-tasks + "select id, queue from task as t + where t.scheduled_at <= now() + and (t.status = 'new' or t.status = 'retry') + and queue ~~* ?::text + order by t.priority desc, t.scheduled_at + limit ? + for update skip locked") + +(defmethod ig/init-key ::wrk/dispatcher + [_ {:keys [::db/pool ::rds/redis ::batch-size] :as cfg}] + (letfn [(get-tasks [conn] + (let [prefix (str (cf/get :tenant) ":%")] + (seq (db/exec! conn [sql:select-next-tasks prefix batch-size])))) + + (push-tasks! [conn rconn [queue tasks]] + (let [ids (mapv :id tasks) + key (str/ffmt "taskq:%" queue) + res (rds/rpush! rconn key (mapv t/encode ids)) + sql [(str "update task set status = 'scheduled'" + " where id = ANY(?)") + (db/create-array conn "uuid" ids)]] + + (db/exec-one! conn sql) + (l/trc :hist "queue tasks" + :queue queue + :tasks (count ids) + :queued res))) + + (run-batch! [rconn] + (try + (db/with-atomic [conn pool] + (if-let [tasks (get-tasks conn)] + (->> (group-by :queue tasks) + (run! (partial push-tasks! conn rconn))) + (px/sleep (::wait-duration cfg)))) + (catch InterruptedException cause + (throw cause)) + (catch Exception cause + (cond + (rds/exception? cause) + (do + (l/wrn :hint "redis exception (will retry in an instant)" :cause cause) + (px/sleep (::rds/timeout rconn))) + + (db/sql-exception? cause) + (do + (l/wrn :hint "database exception (will retry in an instant)" :cause cause) + (px/sleep (::rds/timeout rconn))) + + :else + (do + (l/err :hint "unhandled exception (will retry in an instant)" :cause cause) + (px/sleep (::rds/timeout rconn))))))) + + (dispatcher [] + (l/inf :hint "started") + (try + (dm/with-open [rconn (rds/connect redis)] + (loop [] + (run-batch! rconn) + (recur))) + (catch InterruptedException _ + (l/trc :hint "interrupted")) + (catch Throwable cause + (l/err :hint " unexpected exception" :cause cause)) + (finally + (l/inf :hint "terminated"))))] + + (if (db/read-only? pool) + (l/wrn :hint "not started (db is read-only)") + (px/fn->thread dispatcher :name "penpot/worker/dispatcher" :virtual false)))) + +(defmethod ig/halt-key! ::wrk/dispatcher + [_ thread] + (some-> thread px/interrupt!)) -- Gitee From 3a67e51f2fe01bb53a5a63a3a21219176352838d Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 2 Apr 2024 15:22:46 +0200 Subject: [PATCH 0178/1266] :sparkles: Move worker runner to a separated namespace --- backend/resources/log4j2-devenv.xml | 2 +- backend/src/app/main.clj | 4 +- backend/src/app/worker.clj | 246 +--------------------- backend/src/app/worker/cron.clj | 9 +- backend/src/app/worker/runner.clj | 272 +++++++++++++++++++++++++ backend/test/backend_tests/helpers.clj | 4 +- 6 files changed, 284 insertions(+), 253 deletions(-) create mode 100644 backend/src/app/worker/runner.clj diff --git a/backend/resources/log4j2-devenv.xml b/backend/resources/log4j2-devenv.xml index 31e196829..3cf7ab00b 100644 --- a/backend/resources/log4j2-devenv.xml +++ b/backend/resources/log4j2-devenv.xml @@ -40,7 +40,7 @@ - + diff --git a/backend/src/app/main.clj b/backend/src/app/main.clj index 056c99cc8..3c61e6b35 100644 --- a/backend/src/app/main.clj +++ b/backend/src/app/main.clj @@ -493,7 +493,7 @@ ::mtx/metrics (ig/ref ::mtx/metrics) ::db/pool (ig/ref ::db/pool)} - [::default ::wrk/worker] + [::default ::wrk/runner] {::wrk/parallelism (cf/get ::worker-default-parallelism 1) ::wrk/queue :default ::rds/redis (ig/ref ::rds/redis) @@ -501,7 +501,7 @@ ::mtx/metrics (ig/ref ::mtx/metrics) ::db/pool (ig/ref ::db/pool)} - [::webhook ::wrk/worker] + [::webhook ::wrk/runner] {::wrk/parallelism (cf/get ::worker-webhook-parallelism 1) ::wrk/queue :webhooks ::rds/redis (ig/ref ::rds/redis) diff --git a/backend/src/app/worker.clj b/backend/src/app/worker.clj index 9614a3fa4..a648080f3 100644 --- a/backend/src/app/worker.clj +++ b/backend/src/app/worker.clj @@ -8,21 +8,16 @@ "Async tasks abstraction (impl)." (:require [app.common.data :as d] - [app.common.data.macros :as dm] - [app.common.exceptions :as ex] [app.common.logging :as l] [app.common.spec :as us] - [app.common.transit :as t] [app.common.uuid :as uuid] [app.config :as cf] [app.db :as db] [app.metrics :as mtx] - [app.redis :as rds] [app.util.time :as dt] [clojure.spec.alpha :as s] [cuerdas.core :as str] - [integrant.core :as ig] - [promesa.exec :as px])) + [integrant.core :as ig])) (set! *warn-on-reflection* true) @@ -59,244 +54,6 @@ {} tasks)) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; WORKER -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defn- decode-task-row - [{:keys [props] :as row}] - (cond-> row - (db/pgobject? props) - (assoc :props (db/decode-transit-pgobject props)))) - -(declare ^:private run-worker-loop!) -(declare ^:private start-worker!) -(declare ^:private get-error-context) - -(defmethod ig/pre-init-spec ::worker [_] - (s/keys :req [::parallelism - ::mtx/metrics - ::db/pool - ::rds/redis - ::queue - ::registry])) - -(defmethod ig/prep-key ::worker - [_ cfg] - (merge {::parallelism 1} - (d/without-nils cfg))) - -(defmethod ig/init-key ::worker - [_ {:keys [::db/pool ::queue ::parallelism] :as cfg}] - (let [queue (d/name queue) - cfg (assoc cfg ::queue queue)] - (if (db/read-only? pool) - (l/wrn :hint "worker: not started (db is read-only)" :queue queue :parallelism parallelism) - (doall - (->> (range parallelism) - (map #(assoc cfg ::worker-id %)) - (map start-worker!)))))) - -(defmethod ig/halt-key! ::worker - [_ threads] - (run! px/interrupt! threads)) - -(defn- start-worker! - [{:keys [::rds/redis ::worker-id ::queue] :as cfg}] - (px/thread - {:name (format "penpot/worker/runner:%s" worker-id)} - (l/inf :hint "worker: started" :worker-id worker-id :queue queue) - (try - (dm/with-open [rconn (rds/connect redis)] - (let [tenant (cf/get :tenant "main") - cfg (-> cfg - (assoc ::queue (str/ffmt "taskq:%:%" tenant queue)) - (assoc ::rds/rconn rconn) - (assoc ::timeout (dt/duration "5s")))] - (loop [] - (when (px/interrupted?) - (throw (InterruptedException. "interrupted"))) - - (run-worker-loop! cfg) - (recur)))) - - (catch InterruptedException _ - (l/debug :hint "worker: interrupted" - :worker-id worker-id - :queue queue)) - (catch Throwable cause - (l/err :hint "worker: unexpected exception" - :worker-id worker-id - :queue queue - :cause cause)) - (finally - (l/inf :hint "worker: terminated" - :worker-id worker-id - :queue queue))))) - -(defn- run-worker-loop! - [{:keys [::db/pool ::rds/rconn ::timeout ::queue ::registry ::worker-id]}] - (letfn [(handle-task-retry [{:keys [task error inc-by delay] :or {inc-by 1 delay 1000}}] - (let [explain (ex-message error) - nretry (+ (:retry-num task) inc-by) - now (dt/now) - delay (->> (iterate #(* % 2) delay) (take nretry) (last))] - (db/update! pool :task - {:error explain - :status "retry" - :modified-at now - :scheduled-at (dt/plus now delay) - :retry-num nretry} - {:id (:id task)}) - nil)) - - (handle-task-failure [{:keys [task error]}] - (let [explain (ex-message error)] - (db/update! pool :task - {:error explain - :modified-at (dt/now) - :status "failed"} - {:id (:id task)}) - nil)) - - (handle-task-completion [{:keys [task]}] - (let [now (dt/now)] - (db/update! pool :task - {:completed-at now - :modified-at now - :status "completed"} - {:id (:id task)}) - nil)) - - (decode-payload [^bytes payload] - (try - (let [task-id (t/decode payload)] - (if (uuid? task-id) - task-id - (l/err :hint "worker: received unexpected payload (uuid expected)" - :payload task-id))) - (catch Throwable cause - (l/err :hint "worker: unable to decode payload" - :payload payload - :length (alength payload) - :cause cause)))) - - (handle-task [{:keys [name] :as task}] - (let [task-fn (get registry name)] - (if task-fn - (task-fn task) - (l/wrn :hint "no task handler found" :name name)) - {:status :completed :task task})) - - (handle-task-exception [cause task] - (let [edata (ex-data cause)] - (if (and (< (:retry-num task) - (:max-retries task)) - (= ::retry (:type edata))) - (cond-> {:status :retry :task task :error cause} - (dt/duration? (:delay edata)) - (assoc :delay (:delay edata)) - - (= ::noop (:strategy edata)) - (assoc :inc-by 0)) - (do - (l/err :hint "worker: unhandled exception on task" - ::l/context (get-error-context cause task) - :cause cause) - (if (>= (:retry-num task) (:max-retries task)) - {:status :failed :task task :error cause} - {:status :retry :task task :error cause}))))) - - (get-task [task-id] - (ex/try! - (some-> (db/get* pool :task {:id task-id}) - (decode-task-row)))) - - (run-task [task-id] - (loop [task (get-task task-id)] - (cond - (ex/exception? task) - (if (or (db/connection-error? task) - (db/serialization-error? task)) - (do - (l/wrn :hint "worker: connection error on retrieving task from database (retrying in some instants)" - :worker-id worker-id - :cause task) - (px/sleep (::rds/timeout rconn)) - (recur (get-task task-id))) - (do - (l/err :hint "worker: unhandled exception on retrieving task from database (retrying in some instants)" - :worker-id worker-id - :cause task) - (px/sleep (::rds/timeout rconn)) - (recur (get-task task-id)))) - - (nil? task) - (l/wrn :hint "worker: no task found on the database" - :worker-id worker-id - :task-id task-id) - - :else - (try - (l/trc :hint "executing task" - :name (:name task) - :id (str (:id task)) - :queue queue - :worker-id worker-id - :retry (:retry-num task)) - (handle-task task) - (catch InterruptedException cause - (throw cause)) - (catch Throwable cause - (handle-task-exception cause task)))))) - - (process-result [{:keys [status] :as result}] - (ex/try! - (case status - :retry (handle-task-retry result) - :failed (handle-task-failure result) - :completed (handle-task-completion result) - nil))) - - (run-task-loop [task-id] - (loop [result (run-task task-id)] - (when-let [cause (process-result result)] - (if (or (db/connection-error? cause) - (db/serialization-error? cause)) - (do - (l/wrn :hint "worker: database exeption on processing task result (retrying in some instants)" - :cause cause) - (px/sleep (::rds/timeout rconn)) - (recur result)) - (do - (l/err :hint "worker: unhandled exception on processing task result (retrying in some instants)" - :cause cause) - (px/sleep (::rds/timeout rconn)) - (recur result))))))] - - (try - (let [[_ payload] (rds/blpop! rconn timeout queue)] - (some-> payload - decode-payload - run-task-loop)) - - (catch InterruptedException cause - (throw cause)) - - (catch Exception cause - (if (rds/timeout-exception? cause) - (do - (l/err :hint "worker: redis pop operation timeout, consider increasing redis timeout (will retry in some instants)" - :timeout timeout - :cause cause) - (px/sleep timeout)) - - (l/err :hint "worker: unhandled exception" :cause cause)))))) - -(defn get-error-context - [_ item] - {:params item}) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; SUBMIT API ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -348,6 +105,7 @@ [& {:keys [::task ::delay ::queue ::priority ::max-retries ::conn ::dedupe ::label] :or {delay 0 queue :default priority 100 max-retries 3 label ""} :as options}] + (us/verify! ::submit-options options) (let [duration (dt/duration delay) interval (db/interval duration) diff --git a/backend/src/app/worker/cron.clj b/backend/src/app/worker/cron.clj index 0f44dcaae..689fcba90 100644 --- a/backend/src/app/worker/cron.clj +++ b/backend/src/app/worker/cron.clj @@ -11,7 +11,8 @@ [app.common.logging :as l] [app.db :as db] [app.util.time :as dt] - [app.worker :as wrk] + [app.worker :as-alias wrk] + [app.worker.runner :refer [get-error-context]] [clojure.spec.alpha :as s] [cuerdas.core :as str] [integrant.core :as ig] @@ -64,7 +65,7 @@ (catch Throwable cause (let [elapsed (dt/format-duration (tpoint))] - (binding [l/*context* (wrk/get-error-context cause task)] + (binding [l/*context* (get-error-context cause task)] (l/err :hint "unhandled exception on running task" :task-id id :elapsed elapsed @@ -98,11 +99,11 @@ (s/def ::props (s/nilable map?)) (s/def ::task keyword?) -(s/def ::wrk/task +(s/def ::task-item (s/keys :req-un [::cron ::task] :opt-un [::props ::id])) -(s/def ::wrk/entries (s/coll-of (s/nilable ::wrk/task))) +(s/def ::wrk/entries (s/coll-of (s/nilable ::task-item))) (defmethod ig/pre-init-spec ::wrk/cron [_] (s/keys :req [::db/pool ::wrk/entries ::wrk/registry])) diff --git a/backend/src/app/worker/runner.clj b/backend/src/app/worker/runner.clj new file mode 100644 index 000000000..40332ab23 --- /dev/null +++ b/backend/src/app/worker/runner.clj @@ -0,0 +1,272 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.worker.runner + "Async tasks abstraction (impl)." + (:require + [app.common.data :as d] + [app.common.data.macros :as dm] + [app.common.exceptions :as ex] + [app.common.logging :as l] + [app.common.transit :as t] + [app.config :as cf] + [app.db :as db] + [app.metrics :as mtx] + [app.redis :as rds] + [app.util.time :as dt] + [app.worker :as-alias wrk] + [clojure.spec.alpha :as s] + [cuerdas.core :as str] + [integrant.core :as ig] + [promesa.exec :as px])) + +(set! *warn-on-reflection* true) + +(defn- decode-task-row + [{:keys [props] :as row}] + (cond-> row + (db/pgobject? props) + (assoc :props (db/decode-transit-pgobject props)))) + +(defn get-error-context + [_ item] + {:params item}) + +(defn- run-worker-loop! + [{:keys [::db/pool ::rds/rconn ::wrk/registry ::timeout ::queue ::id]}] + (letfn [(handle-task-retry [{:keys [task error inc-by delay] :or {inc-by 1 delay 1000}}] + (let [explain (ex-message error) + nretry (+ (:retry-num task) inc-by) + now (dt/now) + delay (->> (iterate #(* % 2) delay) (take nretry) (last))] + (db/update! pool :task + {:error explain + :status "retry" + :modified-at now + :scheduled-at (dt/plus now delay) + :retry-num nretry} + {:id (:id task)}) + nil)) + + (handle-task-failure [{:keys [task error]}] + (let [explain (ex-message error)] + (db/update! pool :task + {:error explain + :modified-at (dt/now) + :status "failed"} + {:id (:id task)}) + nil)) + + (handle-task-completion [{:keys [task]}] + (let [now (dt/now)] + (db/update! pool :task + {:completed-at now + :modified-at now + :status "completed"} + {:id (:id task)}) + nil)) + + (decode-payload [^bytes payload] + (try + (let [task-id (t/decode payload)] + (if (uuid? task-id) + task-id + (l/err :hint "received unexpected payload (uuid expected)" + :payload task-id))) + (catch Throwable cause + (l/err :hint "unable to decode payload" + :payload payload + :length (alength payload) + :cause cause)))) + + (handle-task [{:keys [name] :as task}] + (let [task-fn (get registry name)] + (if task-fn + (task-fn task) + (l/wrn :hint "no task handler found" :name name)) + {:status :completed :task task})) + + (handle-task-exception [cause task] + (let [edata (ex-data cause)] + (if (and (< (:retry-num task) + (:max-retries task)) + (= ::retry (:type edata))) + (cond-> {:status :retry :task task :error cause} + (dt/duration? (:delay edata)) + (assoc :delay (:delay edata)) + + (= ::noop (:strategy edata)) + (assoc :inc-by 0)) + (do + (l/err :hint "unhandled exception on task" + ::l/context (get-error-context cause task) + :cause cause) + (if (>= (:retry-num task) (:max-retries task)) + {:status :failed :task task :error cause} + {:status :retry :task task :error cause}))))) + + (get-task [task-id] + (ex/try! + (some-> (db/get* pool :task {:id task-id}) + (decode-task-row)))) + + (run-task [task-id] + (loop [task (get-task task-id)] + (cond + (ex/exception? task) + (if (or (db/connection-error? task) + (db/serialization-error? task)) + (do + (l/wrn :hint "connection error on retrieving task from database (retrying in some instants)" + :id id + :cause task) + (px/sleep (::rds/timeout rconn)) + (recur (get-task task-id))) + (do + (l/err :hint "unhandled exception on retrieving task from database (retrying in some instants)" + :id id + :cause task) + (px/sleep (::rds/timeout rconn)) + (recur (get-task task-id)))) + + (nil? task) + (l/wrn :hint "no task found on the database" + :id id + :task-id task-id) + + :else + (try + (l/trc :hint "start task" + :queue queue + :runner-id id + :name (:name task) + :task-id (str task-id) + :retry (:retry-num task)) + (let [tpoint (dt/tpoint) + result (handle-task task) + elapsed (dt/format-duration (tpoint))] + + (l/trc :hint "end task" + :queue queue + :runner-id id + :name (:name task) + :task-id (str task-id) + :retry (:retry-num task) + :elapsed elapsed) + + result) + + (catch InterruptedException cause + (throw cause)) + (catch Throwable cause + (handle-task-exception cause task)))))) + + (process-result [{:keys [status] :as result}] + (ex/try! + (case status + :retry (handle-task-retry result) + :failed (handle-task-failure result) + :completed (handle-task-completion result) + nil))) + + (run-task-loop [task-id] + (loop [result (run-task task-id)] + (when-let [cause (process-result result)] + (if (or (db/connection-error? cause) + (db/serialization-error? cause)) + (do + (l/wrn :hint "database exeption on processing task result (retrying in some instants)" + :cause cause) + (px/sleep (::rds/timeout rconn)) + (recur result)) + (do + (l/err :hint "unhandled exception on processing task result (retrying in some instants)" + :cause cause) + (px/sleep (::rds/timeout rconn)) + (recur result))))))] + + (try + (let [queue (str/ffmt "taskq:%" queue) + [_ payload] (rds/blpop! rconn timeout queue)] + (some-> payload + decode-payload + run-task-loop)) + + (catch InterruptedException cause + (throw cause)) + + (catch Exception cause + (if (rds/timeout-exception? cause) + (do + (l/err :hint "redis pop operation timeout, consider increasing redis timeout (will retry in some instants)" + :timeout timeout + :cause cause) + (px/sleep timeout)) + + (l/err :hint "unhandled exception" :cause cause)))))) + +(defn- start-thread! + [{:keys [::rds/redis ::id ::queue] :as cfg}] + (px/thread + {:name (format "penpot/worker/runner:%s" id)} + (l/inf :hint "started" :id id :queue queue) + (try + (dm/with-open [rconn (rds/connect redis)] + (let [tenant (cf/get :tenant "main") + cfg (-> cfg + (assoc ::queue (str/ffmt "%:%" tenant queue)) + (assoc ::rds/rconn rconn) + (assoc ::timeout (dt/duration "5s")))] + (loop [] + (when (px/interrupted?) + (throw (InterruptedException. "interrupted"))) + + (run-worker-loop! cfg) + (recur)))) + + (catch InterruptedException _ + (l/debug :hint "interrupted" + :id id + :queue queue)) + (catch Throwable cause + (l/err :hint "unexpected exception" + :id id + :queue queue + :cause cause)) + (finally + (l/inf :hint "terminated" + :id id + :queue queue))))) + +(s/def ::wrk/queue keyword?) + +(defmethod ig/pre-init-spec ::runner [_] + (s/keys :req [::wrk/parallelism + ::mtx/metrics + ::db/pool + ::rds/redis + ::wrk/queue + ::wrk/registry])) + +(defmethod ig/prep-key ::wrk/runner + [_ cfg] + (merge {::wrk/parallelism 1} + (d/without-nils cfg))) + +(defmethod ig/init-key ::wrk/runner + [_ {:keys [::db/pool ::wrk/queue ::wrk/parallelism] :as cfg}] + (let [queue (d/name queue) + cfg (assoc cfg ::queue queue)] + (if (db/read-only? pool) + (l/wrn :hint "not started (db is read-only)" :queue queue :parallelism parallelism) + (doall + (->> (range parallelism) + (map #(assoc cfg ::id %)) + (map start-thread!)))))) + +(defmethod ig/halt-key! ::wrk/runner + [_ threads] + (run! px/interrupt! threads)) diff --git a/backend/test/backend_tests/helpers.clj b/backend/test/backend_tests/helpers.clj index 27544c4fa..61b5f42bf 100644 --- a/backend/test/backend_tests/helpers.clj +++ b/backend/test/backend_tests/helpers.clj @@ -156,8 +156,8 @@ :app.loggers.database/reporter :app.worker/cron :app.worker/dispatcher - [:app.main/default :app.worker/worker] - [:app.main/webhook :app.worker/worker])) + [:app.main/default :app.worker/runner] + [:app.main/webhook :app.worker/runner])) _ (ig/load-namespaces system) system (-> (ig/prep system) (ig/init))] -- Gitee From bd8fcfde28a2b8d97817037f1609c62a0e7d1866 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Thu, 21 Mar 2024 17:07:29 +0100 Subject: [PATCH 0179/1266] :bug: Fix sizes of migrated graphics --- backend/src/app/features/components_v2.clj | 80 +++++++++++++++++++--- 1 file changed, 70 insertions(+), 10 deletions(-) diff --git a/backend/src/app/features/components_v2.clj b/backend/src/app/features/components_v2.clj index 221997ec8..8e2c0fe00 100644 --- a/backend/src/app/features/components_v2.clj +++ b/backend/src/app/features/components_v2.clj @@ -32,6 +32,7 @@ [app.common.types.container :as ctn] [app.common.types.file :as ctf] [app.common.types.grid :as ctg] + [app.common.types.modifiers :as ctm] [app.common.types.page :as ctp] [app.common.types.pages-list :as ctpl] [app.common.types.shape :as cts] @@ -1051,8 +1052,8 @@ (fix-false-copies) (fix-component-root-without-component) (fix-copies-names) - (fix-copies-of-detached); <- Do not add fixes after this and fix-orphan-copies call - ))) + (fix-copies-of-detached)))); <- Do not add fixes after this and fix-orphan-copies call + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; COMPONENTS MIGRATION ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -1101,8 +1102,8 @@ {:type :frame :x (:x position) :y (:y position) - :width (+ width (* 2 grid-gap)) - :height (+ height (* 2 grid-gap)) + :width (+ width grid-gap) + :height (+ height grid-gap) :name name :frame-id uuid/zero :parent-id uuid/zero})) @@ -1388,7 +1389,7 @@ (sbuilder/create-svg-shapes svg-data position objects frame-id frame-id #{} false))) (defn- process-media-object - [fdata page-id frame-id mobj position] + [fdata page-id frame-id mobj position shape-cb] (let [page (ctpl/get-page fdata page-id) file-id (get fdata :id) @@ -1438,16 +1439,17 @@ cfsh/prepare-create-artboard-from-selection) changes (fcb/concat-changes changes changes2)] + (shape-cb shape) (:redo-changes changes))) (defn- create-media-grid - [fdata page-id frame-id grid media-group] + [fdata page-id frame-id grid media-group shape-cb] (letfn [(process [fdata mobj position] (let [position (gpt/add position (gpt/point grid-gap grid-gap)) tp (dt/tpoint) err (volatile! false)] (try - (let [changes (process-media-object fdata page-id frame-id mobj position)] + (let [changes (process-media-object fdata page-id frame-id mobj position shape-cb)] (cp/process-changes fdata changes false)) (catch Throwable cause @@ -1496,6 +1498,43 @@ (or (process fdata mobj position) fdata)) (assoc-in fdata [:options :components-v2] true))))) +(defn- fix-graphics-size + [fdata new-grid page-id frame-id] + (let [modify-shape (fn [page shape-id modifiers] + (ctn/update-shape page shape-id #(gsh/transform-shape % modifiers))) + + resize-frame (fn [page] + (let [{:keys [width height]} (meta new-grid) + + frame (ctst/get-shape page frame-id) + width (+ width grid-gap) + height (+ height grid-gap) + + modif-frame (ctm/resize nil + (gpt/point (/ width (:width frame)) + (/ height (:height frame))) + (gpt/point (:x frame) (:y frame)))] + + (modify-shape page frame-id modif-frame))) + + move-components (fn [page] + (let [frame (get (:objects page) frame-id) + shapes (map (d/getf (:objects page)) (:shapes frame))] + (->> (d/zip shapes new-grid) + (reduce (fn [page [shape position]] + (let [position (gpt/add position (gpt/point grid-gap grid-gap)) + modif-shape (ctm/move nil + (gpt/point (- (:x position) (:x (:selrect shape))) + (- (:y position) (:y (:selrect shape))))) + children-ids (cfh/get-children-ids-with-self (:objects page) (:id shape))] + (reduce #(modify-shape %1 %2 modif-shape) + page + children-ids))) + page))))] + (-> fdata + (ctpl/update-page page-id resize-frame) + (ctpl/update-page page-id move-components)))) + (defn- migrate-graphics [fdata] (if (empty? (:media fdata)) @@ -1533,12 +1572,33 @@ (:id frame) (:id frame) nil - true))] + true)) + new-shapes (volatile! []) + + add-shape (fn [shape] + (vswap! new-shapes conj shape)) + + fdata' (create-media-grid fdata page-id (:id frame) grid assets add-shape) + + ;; When svgs had different width&height and viewport, sometimes the old graphics + ;; importer didn't calculat well the media object size. So, after migration we + ;; recalculate grid size from the actual size of the created shapes. + new-grid (ctst/generate-shape-grid @new-shapes position grid-gap) + + {new-width :width new-height :height} (meta new-grid) + + fdata'' (if-not (and (mth/close? width new-width) (mth/close? height new-height)) + (do + (l/inf :hint "fixing graphics sizes" + :file-id (str (:id fdata)) + :group group-name) + (fix-graphics-size fdata' new-grid page-id (:id frame))) + fdata')] + (recur (next groups) - (create-media-grid fdata page-id (:id frame) grid assets) + fdata'' (gpt/add position (gpt/point 0 (+ height (* 2 grid-gap) frame-gap)))))))))) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; PRIVATE HELPERS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -- Gitee From 04fe8f89604f1c8b13b2ccae380ec6ca89b4514d Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Wed, 3 Apr 2024 14:14:14 +0200 Subject: [PATCH 0180/1266] :bug: Fix close viewer thumbnail clicking outside --- frontend/src/app/main/ui/viewer.cljs | 1 + frontend/src/app/main/ui/viewer/header.cljs | 31 +++++++++++++------ .../src/app/main/ui/viewer/thumbnails.cljs | 23 ++++++++------ 3 files changed, 36 insertions(+), 19 deletions(-) diff --git a/frontend/src/app/main/ui/viewer.cljs b/frontend/src/app/main/ui/viewer.cljs index 60480d5f6..6883a6d24 100644 --- a/frontend/src/app/main/ui/viewer.cljs +++ b/frontend/src/app/main/ui/viewer.cljs @@ -613,6 +613,7 @@ :permissions permissions :zoom zoom :section section + :shown-thumbnails (:show-thumbnails local) :interactions-mode interactions-mode}]])) ;; --- Component: Viewer diff --git a/frontend/src/app/main/ui/viewer/header.cljs b/frontend/src/app/main/ui/viewer/header.cljs index 1b1734dca..6e3051cf7 100644 --- a/frontend/src/app/main/ui/viewer/header.cljs +++ b/frontend/src/app/main/ui/viewer/header.cljs @@ -201,7 +201,7 @@ :class (stl/css :go-log-btn)} (tr "labels.log-or-sign")])])) (mf/defc header-sitemap - [{:keys [project file page frame] :as props}] + [{:keys [project file page frame toggle-thumbnails] :as props}] (let [project-name (:name project) file-name (:name file) page-name (:name page) @@ -209,11 +209,6 @@ frame-name (:name frame) show-dropdown? (mf/use-state false) - toggle-thumbnails - (mf/use-fn - (fn [] - (st/emit! dv/toggle-thumbnails-panel))) - open-dropdown (mf/use-fn (fn [] @@ -254,12 +249,13 @@ (when (= page-id id) [:span {:class (stl/css :icon-check)} i/tick])])]]] [:div {:class (stl/css :current-frame) + :id "current-frame" :on-click toggle-thumbnails} [:span {:class (stl/css :frame-name)} frame-name] [:span {:class (stl/css :icon)} i/arrow]]]])) (mf/defc header - [{:keys [project file page frame zoom section permissions index interactions-mode]}] + [{:keys [project file page frame zoom section permissions index interactions-mode shown-thumbnails]}] (let [go-to-dashboard (mf/use-fn #(st/emit! (dv/go-to-dashboard))) @@ -282,13 +278,27 @@ (keyword))] (if (or (= section :interactions) (:is-logged permissions)) (st/emit! (dv/go-to-section section)) - (open-login-dialog)))))] + (open-login-dialog))))) + + toggle-thumbnails + (mf/use-fn + (fn [] + (st/emit! dv/toggle-thumbnails-panel))) + + + close-thumbnails + (mf/use-fn + (mf/deps shown-thumbnails) + (fn [_] + (when shown-thumbnails + (st/emit! dv/close-thumbnails-panel))))] [:header {:class (stl/css-case :viewer-header true - :fullscreen (mf/deref fullscreen-ref))} + :fullscreen (mf/deref fullscreen-ref)) + :on-click close-thumbnails} [:div {:class (stl/css :nav-zone)} - ;; If the user doesn't have permission we disable the link + ;; If the user doesn't have permission we disable the link [:a {:class (stl/css :home-link) :on-click go-to-dashboard :style {:cursor (when-not (:can-edit permissions) "auto") @@ -300,6 +310,7 @@ :file file :page page :frame frame + :toggle-thumbnails toggle-thumbnails :index index}]] [:div {:class (stl/css :mode-zone)} diff --git a/frontend/src/app/main/ui/viewer/thumbnails.cljs b/frontend/src/app/main/ui/viewer/thumbnails.cljs index 7da49dfab..4a20d35fe 100644 --- a/frontend/src/app/main/ui/viewer/thumbnails.cljs +++ b/frontend/src/app/main/ui/viewer/thumbnails.cljs @@ -107,7 +107,8 @@ (mf/defc thumbnails-panel [{:keys [frames page index show? thumbnail-data] :as props}] - (let [expanded? (mf/use-state false) + (let [expanded-state (mf/use-state false) + expanded? (deref expanded-state) container (mf/use-ref) objects (:objects page) @@ -115,23 +116,27 @@ selected (mf/use-var false) on-item-click - (mf/use-callback - (mf/deps @expanded?) + (mf/use-fn + (mf/deps expanded?) (fn [_ index] (compare-and-set! selected false true) (st/emit! (dv/go-to-frame-by-index index)) - (when @expanded? - (on-close))))] + (when expanded? + (on-close)))) + + toggle-expand + (mf/use-fn + #(swap! expanded-state not))] [:section {:class (stl/css-case :viewer-thumbnails true - :expanded @expanded?) - ;; This is better as an inline-style so it won't make a reflow of every frame inside + :expanded expanded?) + ;; This is better as an inline-style so it won't make a reflow of every frame inside :style {:display (when (not show?) "none")} :ref container} - [:& thumbnails-summary {:on-toggle-expand #(swap! expanded? not) + [:& thumbnails-summary {:on-toggle-expand toggle-expand :on-close on-close :total (count frames)}] - [:& thumbnails-content {:expanded? @expanded? + [:& thumbnails-content {:expanded? expanded? :total (count frames)} (for [[i frame] (d/enumerate frames)] [:& thumbnail-item {:index i -- Gitee From 7c1e8a753f028c129b01c7c2eb31e53c8468113f Mon Sep 17 00:00:00 2001 From: AzazelN28 Date: Tue, 2 Apr 2024 15:47:54 +0200 Subject: [PATCH 0181/1266] :zap: Add lazy loading to dashboard templates --- .../src/app/main/ui/dashboard/templates.cljs | 56 ++++++------------- .../src/app/main/ui/dashboard/templates.scss | 14 ++++- frontend/src/app/util/dom.cljs | 6 ++ 3 files changed, 36 insertions(+), 40 deletions(-) diff --git a/frontend/src/app/main/ui/dashboard/templates.cljs b/frontend/src/app/main/ui/dashboard/templates.cljs index 7d2dd5a87..51cb089d3 100644 --- a/frontend/src/app/main/ui/dashboard/templates.cljs +++ b/frontend/src/app/main/ui/dashboard/templates.cljs @@ -123,7 +123,9 @@ [:div {:class (stl/css :template-card)} [:div {:class (stl/css :img-container)} [:img {:src (dm/str thb) - :alt (:name item)}]] + :alt (:name item) + :loading "lazy" + :decoding "async"}]] [:div {:class (stl/css :card-name)} [:span {:class (stl/css :card-text)} (:name item)] download-icon]]])) @@ -194,48 +196,25 @@ last-card (+ (- card-count 1) left-moves) content-ref (mf/use-ref) + move-left (fn [] (dom/scroll-by! (mf/ref-val content-ref) -300 0)) + move-right (fn [] (dom/scroll-by! (mf/ref-val content-ref) 300 0)) + + ;; TODO: Hacer que esta función detecte si etamos al final o al + ;; principio para hacer aparecer o desaparecer los botones del + ;; dashboard de templates + on-scroll (mf/use-fn #(js/console.log "scroll" %)) + on-move-left - (mf/use-fn - (mf/deps card-offset card-width) - (fn [_event] - (when-not (zero? card-offset) - (dom/animate! (mf/ref-val content-ref) - [#js {:left (dm/str card-offset "px")} - #js {:left (dm/str (+ card-offset card-width) "px")}] - #js {:duration 200 :easing "linear"}) - (reset! card-offset* (+ card-offset card-width))))) + (mf/use-fn #(move-left)) on-move-left-key-down - (mf/use-fn - (mf/deps on-move-left first-card) - (fn [event] - (when (kbd/enter? event) - (dom/stop-propagation event) - (on-move-left event) - (when-let [node (dom/get-element (dm/str "card-container-" first-card))] - (dom/focus! node))))) + (mf/use-fn #(move-left)) on-move-right - (mf/use-fn - (mf/deps more-cards card-offset card-width) - (fn [_event] - (when more-cards - (swap! card-offset* inc) - (dom/animate! (mf/ref-val content-ref) - [#js {:left (dm/str card-offset "px")} - #js {:left (dm/str (- card-offset card-width) "px")}] - #js {:duration 200 :easing "linear"}) - (reset! card-offset* (- card-offset card-width))))) + (mf/use-fn #(move-right)) on-move-right-key-down - (mf/use-fn - (mf/deps on-move-right last-card) - (fn [event] - (when (kbd/enter? event) - (dom/stop-propagation event) - (on-move-right event) - (when-let [node (dom/get-element (dm/str "card-container-" last-card))] - (dom/focus! node))))) + (mf/use-fn #(move-right)) on-import-template (mf/use-fn @@ -252,9 +231,8 @@ [:& title {:collapsed collapsed}] [:div {:class (stl/css :content) - :ref content-ref - :style {:left card-offset - :width (dm/str container-size "px")}} + :on-scroll on-scroll + :ref content-ref} (for [index (range (count templates))] [:& card-item diff --git a/frontend/src/app/main/ui/dashboard/templates.scss b/frontend/src/app/main/ui/dashboard/templates.scss index 2649d166b..2e13cf6b9 100644 --- a/frontend/src/app/main/ui/dashboard/templates.scss +++ b/frontend/src/app/main/ui/dashboard/templates.scss @@ -109,24 +109,36 @@ } .content { + display: grid; + grid-template-columns: repeat(auto-fill, minmax($s-276, $s-276)); + grid-auto-flow: column; pointer-events: all; + /* width: 200%; height: $s-228; margin-left: $s-6; position: absolute; border-top-left-radius: $s-8; background-color: $db-quaternary; + */ + overflow: scroll hidden; + + scroll-behavior: smooth; + scroll-snap-type: x mandatory; + scroll-snap-stop: always; } .card-container { width: $s-276; margin-top: $s-20; - display: inline-block; text-align: center; vertical-align: top; background-color: transparent; border: none; padding: 0; + + scroll-snap-align: center; + } .template-card { diff --git a/frontend/src/app/util/dom.cljs b/frontend/src/app/util/dom.cljs index 0a59c586e..efa0fb267 100644 --- a/frontend/src/app/util/dom.cljs +++ b/frontend/src/app/util/dom.cljs @@ -756,6 +756,12 @@ [] (.reload (.-location js/window))) +(defn scroll-by! + ([element x y] + (.scrollBy ^js element x y)) + ([x y] + (scroll-by! js/window x y))) + (defn animate! ([item keyframes duration] (animate! item keyframes duration nil)) ([item keyframes duration onfinish] -- Gitee From 357cdb807b4d82acd354fb418da9168f417e9b05 Mon Sep 17 00:00:00 2001 From: AzazelN28 Date: Tue, 2 Apr 2024 19:33:27 +0200 Subject: [PATCH 0182/1266] :recycle: Refactor carousel using scroll-snap --- .../src/app/main/ui/dashboard/templates.cljs | 45 ++++++++++--------- .../src/app/main/ui/dashboard/templates.scss | 9 +--- frontend/src/app/util/dom.cljs | 6 +++ 3 files changed, 32 insertions(+), 28 deletions(-) diff --git a/frontend/src/app/main/ui/dashboard/templates.cljs b/frontend/src/app/main/ui/dashboard/templates.cljs index 51cb089d3..f7a42454f 100644 --- a/frontend/src/app/main/ui/dashboard/templates.cljs +++ b/frontend/src/app/main/ui/dashboard/templates.cljs @@ -8,7 +8,6 @@ (:require-macros [app.main.style :as stl]) (:require [app.common.data.macros :as dm] - [app.common.math :as mth] [app.config :as cf] [app.main.data.dashboard :as dd] [app.main.data.events :as ev] @@ -166,7 +165,7 @@ (mf/defc templates-section {::mf/wrap-props false} - [{:keys [default-project-id profile project-id team-id content-width]}] + [{:keys [default-project-id profile project-id team-id]}] (let [templates (mf/deref builtin-templates) templates (mf/with-memo [templates] (filterv #(not= (:id %) "tutorial-for-beginners") templates)) @@ -181,28 +180,29 @@ props (:props profile) collapsed (:builtin-templates-collapsed-status props false) - card-offset* (mf/use-state 0) - card-offset (deref card-offset*) + can-move (mf/use-state {:left false :right true}) - card-width 275 total (count templates) - container-size (* (+ 2 total) card-width) ;; We need space for total plus the libraries&templates link - more-cards (> (+ card-offset (* (+ 1 total) card-width)) content-width) - card-count (mth/floor (/ content-width 275)) - left-moves (/ card-offset -275) - first-card left-moves - last-card (+ (- card-count 1) left-moves) content-ref (mf/use-ref) move-left (fn [] (dom/scroll-by! (mf/ref-val content-ref) -300 0)) move-right (fn [] (dom/scroll-by! (mf/ref-val content-ref) 300 0)) - ;; TODO: Hacer que esta función detecte si etamos al final o al - ;; principio para hacer aparecer o desaparecer los botones del - ;; dashboard de templates - on-scroll (mf/use-fn #(js/console.log "scroll" %)) + update-can-move + (fn [scroll-left scroll-available client-width] + (reset! can-move {:left (> scroll-left 0) + :right (> scroll-available client-width)})) + + on-scroll + (mf/use-fn + (fn [e] + (let [scroll (dom/get-target-scroll e) + scroll-left (:scroll-left scroll) + scroll-available (- (:scroll-width scroll) scroll-left) + client-rect (dom/get-client-size (dom/get-target e))] + (update-can-move scroll-left scroll-available (unchecked-get client-rect "width"))))) on-move-left (mf/use-fn #(move-left)) @@ -222,6 +222,12 @@ (fn [template _event] (import-template! template team-id project-id default-project-id section)))] + (mf/with-effect [content-ref templates] + (let [content (mf/ref-val content-ref)] + (when (and (some? content) (some? templates)) + (dom/scroll-to content #js {:behavior "instant" :left 0 :top 0}) + (.dispatchEvent content (js/Event. "scroll"))))) + (mf/with-effect [profile collapsed] (when (and profile (not collapsed)) (st/emit! (dd/fetch-builtin-templates)))) @@ -240,24 +246,23 @@ :item (nth templates index) :index index :key index - :is-visible (and (>= index first-card) - (<= index last-card)) + :is-visible true :collapsed collapsed}]) [:& card-item-link - {:is-visible (and (>= total first-card) (<= total last-card)) + {:is-visible true :collapsed collapsed :section section :total total}]] - (when (< card-offset 0) + (when (:left @can-move) [:button {:class (stl/css :move-button :move-left) :tab-index (if ^boolean collapsed "-1" "0") :on-click on-move-left :on-key-down on-move-left-key-down} arrow-icon]) - (when more-cards + (when (:right @can-move) [:button {:class (stl/css :move-button :move-right) :tab-index (if collapsed "-1" "0") :on-click on-move-right diff --git a/frontend/src/app/main/ui/dashboard/templates.scss b/frontend/src/app/main/ui/dashboard/templates.scss index 2e13cf6b9..76cf2f455 100644 --- a/frontend/src/app/main/ui/dashboard/templates.scss +++ b/frontend/src/app/main/ui/dashboard/templates.scss @@ -113,16 +113,11 @@ grid-template-columns: repeat(auto-fill, minmax($s-276, $s-276)); grid-auto-flow: column; pointer-events: all; - /* - width: 200%; height: $s-228; margin-left: $s-6; - position: absolute; border-top-left-radius: $s-8; background-color: $db-quaternary; - */ overflow: scroll hidden; - scroll-behavior: smooth; scroll-snap-type: x mandatory; scroll-snap-stop: always; @@ -136,9 +131,7 @@ background-color: transparent; border: none; padding: 0; - - scroll-snap-align: center; - + scroll-snap-align: start; } .template-card { diff --git a/frontend/src/app/util/dom.cljs b/frontend/src/app/util/dom.cljs index efa0fb267..01d34e582 100644 --- a/frontend/src/app/util/dom.cljs +++ b/frontend/src/app/util/dom.cljs @@ -645,6 +645,12 @@ (when (some? element) (.-scrollLeft element))) +(defn scroll-to + ([^js element options] + (.scrollTo element options)) + ([^js element x y] + (.scrollTo element x y))) + (defn set-scroll-pos! [^js element scroll] (when (some? element) -- Gitee From 6b84eef14b0f91e02bbd031248424ee3828162cd Mon Sep 17 00:00:00 2001 From: AzazelN28 Date: Wed, 3 Apr 2024 13:11:47 +0200 Subject: [PATCH 0183/1266] :bug: Fix toolbar hidden after path creation --- frontend/src/app/main/data/workspace/selection.cljs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index 22ec299c0..d260c5e0b 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -28,7 +28,6 @@ [app.main.data.modal :as md] [app.main.data.workspace.changes :as dch] [app.main.data.workspace.collapse :as dwc] - [app.main.data.workspace.edition :as dwe] [app.main.data.workspace.libraries-helpers :as dwlh] [app.main.data.workspace.specialized-panel :as-alias dwsp] [app.main.data.workspace.state-helpers :as wsh] @@ -151,7 +150,7 @@ objects (wsh/lookup-page-objects state page-id)] (rx/of (dwc/expand-all-parents [id] objects) - (dwe/clear-edition-mode) + :interrupt ::dwsp/interrupt)))))) (defn select-prev-shape -- Gitee From c4df29f2a640dea38514ae4fe98eeafe3643aa13 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Wed, 3 Apr 2024 17:04:14 +0200 Subject: [PATCH 0184/1266] :bug: Fix hover state on export button --- frontend/src/app/main/ui/components/title_bar.scss | 3 ++- frontend/src/app/main/ui/viewer/inspect/exports.scss | 5 ++++- frontend/src/app/main/ui/viewer/inspect/right_sidebar.scss | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/main/ui/components/title_bar.scss b/frontend/src/app/main/ui/components/title_bar.scss index c6882c4e0..20e25e233 100644 --- a/frontend/src/app/main/ui/components/title_bar.scss +++ b/frontend/src/app/main/ui/components/title_bar.scss @@ -14,6 +14,7 @@ width: 100%; min-height: $s-32; background-color: var(--title-background-color); + color: var(--title-foreground-color); } .title, @@ -26,7 +27,7 @@ grid-auto-flow: column; height: 100%; min-height: $s-32; - color: var(--title-foreground-color); + overflow: hidden; } diff --git a/frontend/src/app/main/ui/viewer/inspect/exports.scss b/frontend/src/app/main/ui/viewer/inspect/exports.scss index 600262c4e..95e674373 100644 --- a/frontend/src/app/main/ui/viewer/inspect/exports.scss +++ b/frontend/src/app/main/ui/viewer/inspect/exports.scss @@ -16,8 +16,10 @@ } .title-spacing-export-viewer { - @extend .attr-title; margin: 0; + color: var(--entry-foreground-color-hover); + margin-inline-start: calc(-1 * $s-8); + width: calc(100% + $s-8); } .add-export { @@ -26,6 +28,7 @@ width: $s-28; svg { @extend .button-icon; + stroke: var(--icon-foreground); } } diff --git a/frontend/src/app/main/ui/viewer/inspect/right_sidebar.scss b/frontend/src/app/main/ui/viewer/inspect/right_sidebar.scss index a542a2a1b..48bb94620 100644 --- a/frontend/src/app/main/ui/viewer/inspect/right_sidebar.scss +++ b/frontend/src/app/main/ui/viewer/inspect/right_sidebar.scss @@ -21,7 +21,7 @@ } .viewer-code { - padding: 0 $s-8; + padding-inline-start: $s-8; } .tool-windows { -- Gitee From dbe32fa980f0f14d4620ded670de1d7925461404 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Thu, 4 Apr 2024 09:55:50 +0200 Subject: [PATCH 0185/1266] :lipstick: Fix small typo. --- backend/src/app/features/components_v2.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/app/features/components_v2.clj b/backend/src/app/features/components_v2.clj index 8e2c0fe00..15d5221c8 100644 --- a/backend/src/app/features/components_v2.clj +++ b/backend/src/app/features/components_v2.clj @@ -1581,7 +1581,7 @@ fdata' (create-media-grid fdata page-id (:id frame) grid assets add-shape) ;; When svgs had different width&height and viewport, sometimes the old graphics - ;; importer didn't calculat well the media object size. So, after migration we + ;; importer didn't calculate well the media object size. So, after migration we ;; recalculate grid size from the actual size of the created shapes. new-grid (ctst/generate-shape-grid @new-shapes position grid-gap) -- Gitee From 61df70b3142364c150216f80ed0df0f6d1b947e7 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Tue, 2 Apr 2024 12:22:02 +0200 Subject: [PATCH 0186/1266] :bug: Fix go back close view only --- frontend/src/app/main/data/workspace.cljs | 30 ++++++++++--------- .../app/main/ui/workspace/left_header.cljs | 1 - 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index d0c6f3a74..044d133f9 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -355,20 +355,22 @@ (ptk/reify ::finalize-file ptk/UpdateEvent (update [_ state] - (dissoc state - :current-file-id - :current-project-id - :workspace-data - :workspace-editor-state - :workspace-file - :workspace-libraries - :workspace-ready? - :workspace-media-objects - :workspace-persistence - :workspace-presence - :workspace-project - :workspace-project - :workspace-undo)) + (-> state + (dissoc + :current-file-id + :current-project-id + :workspace-data + :workspace-editor-state + :workspace-file + :workspace-libraries + :workspace-media-objects + :workspace-persistence + :workspace-presence + :workspace-project + :workspace-ready? + :workspace-undo) + (update :workspace-global dissoc :read-only?) + (assoc-in [:workspace-global :options-mode] :design))) ptk/WatchEvent (watch [_ _ _] diff --git a/frontend/src/app/main/ui/workspace/left_header.cljs b/frontend/src/app/main/ui/workspace/left_header.cljs index 7fe2d8e3c..1055426db 100644 --- a/frontend/src/app/main/ui/workspace/left_header.cljs +++ b/frontend/src/app/main/ui/workspace/left_header.cljs @@ -73,7 +73,6 @@ (fn [] (close-modals) (st/emit! (dw/set-options-mode :design) - (dw/set-workspace-read-only false) (dw/go-to-dashboard project)))) nav-to-project -- Gitee From a4776cf27fcce34eb89ab59261d01347d35fe84b Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 2 Apr 2024 11:15:11 +0200 Subject: [PATCH 0187/1266] :bug: Fix problem with comment refreshing --- frontend/src/app/main/data/comments.cljs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/main/data/comments.cljs b/frontend/src/app/main/data/comments.cljs index 807db96e8..0a441068f 100644 --- a/frontend/src/app/main/data/comments.cljs +++ b/frontend/src/app/main/data/comments.cljs @@ -249,14 +249,16 @@ ptk/UpdateEvent (update [_ state] - (d/update-in-when state [:comments thread-id id] assoc :content content)) + (-> state + (d/update-in-when [:comments thread-id id] assoc :content content))) ptk/WatchEvent (watch [_ state _] - (let [share-id (-> state :viewer-local :share-id)] + (let [file-id (:current-file-id state) + share-id (-> state :viewer-local :share-id)] (->> (rp/cmd! :update-comment {:id id :content content :share-id share-id}) (rx/catch #(rx/throw {:type :comment-error})) - (rx/ignore)))))) + (rx/map #(retrieve-comment-threads file-id))))))) (defn delete-comment-thread-on-workspace [{:keys [id] :as thread}] -- Gitee From b258b05fb26918ce65e7dd37d12f089ba5fc8c3b Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 2 Apr 2024 11:31:13 +0200 Subject: [PATCH 0188/1266] :bug: Fix problem with rtl --- .../main/ui/workspace/sidebar/options/menus/component.cljs | 7 ++++--- .../main/ui/workspace/sidebar/options/menus/component.scss | 7 ++++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.cljs index d5170a8b5..570b25faf 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.cljs @@ -616,9 +616,10 @@ [:div {:class (stl/css :name-wrapper)} [:div {:class (stl/css :component-name)} - (if multi - (tr "settings.multiple") - (cfh/last-path shape-name))] + [:span {:class (stl/css :component-name-inside)} + (if multi + (tr "settings.multiple") + (cfh/last-path shape-name))]] (when (and can-swap? (not multi)) [:div {:class (stl/css :component-parent-name)} diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.scss b/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.scss index c36756069..d024187a7 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.scss +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.scss @@ -56,7 +56,6 @@ padding-right: 0.5rem; .component-name-wrapper { width: 100%; - border-radius: $br-8; } } @@ -93,6 +92,7 @@ min-height: $s-32; padding: $s-8 0 $s-8 $s-2; border-radius: $br-8 0 0 $br-8; + overflow: hidden; } .component-name { @@ -103,6 +103,11 @@ min-height: $s-16; } +.component-name-inside { + direction: ltr; + unicode-bidi: bidi-override; +} + .component-parent-name { @include bodySmallTypography; @include textEllipsis; -- Gitee From 5fd72cf9d904df0cc174b26a6b3eeaf922a6e968 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 3 Apr 2024 10:27:48 +0200 Subject: [PATCH 0189/1266] :bug: Fix problem with flip properties --- common/src/app/common/geom/shapes/transforms.cljc | 12 ++++++++---- common/src/app/common/types/shape.cljc | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/common/src/app/common/geom/shapes/transforms.cljc b/common/src/app/common/geom/shapes/transforms.cljc index e5eae48eb..ebde6bf80 100644 --- a/common/src/app/common/geom/shapes/transforms.cljc +++ b/common/src/app/common/geom/shapes/transforms.cljc @@ -299,12 +299,16 @@ (cond-> shape (neg? dot-x) - (-> (cr/update! :flip-x not) - (cr/update! :rotation -)) + (cr/update! :flip-x not) + + (neg? dot-x) + (cr/update! :rotation -) + + (neg? dot-y) + (cr/update! :flip-y not) (neg? dot-y) - (-> (cr/update! :flip-y not) - (cr/update! :rotation -))))) + (cr/update! :rotation -)))) (defn- apply-transform-move "Given a new set of points transformed, set up the rectangle so it keeps diff --git a/common/src/app/common/types/shape.cljc b/common/src/app/common/types/shape.cljc index 2101f90f7..e76fbe2a6 100644 --- a/common/src/app/common/types/shape.cljc +++ b/common/src/app/common/types/shape.cljc @@ -31,7 +31,7 @@ [app.common.uuid :as uuid] [clojure.set :as set])) -(cr/defrecord Shape [id name type x y width height rotation selrect points transform transform-inverse parent-id frame-id]) +(cr/defrecord Shape [id name type x y width height rotation selrect points transform transform-inverse parent-id frame-id flip-x flip-y]) (defn shape? [o] -- Gitee From 9c36d775732deefb1465a0228c37ba7d9acee6ef Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 3 Apr 2024 10:44:00 +0200 Subject: [PATCH 0190/1266] :bug: Fix problem with cursor when shapes flipped --- frontend/src/app/main/ui/workspace/viewport/selection.cljs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/viewport/selection.cljs b/frontend/src/app/main/ui/workspace/viewport/selection.cljs index ed91e2b6c..8d04c1ac2 100644 --- a/frontend/src/app/main/ui/workspace/viewport/selection.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/selection.cljs @@ -335,8 +335,8 @@ flip-x (get shape :flip-x) flip-y (get shape :flip-y) - half-flip? (or (and (some? flip-x) (not (some? flip-y))) - (and (some? flip-y) (not (some? flip-x))))] + half-flip? (or (and flip-x (not flip-y)) + (and flip-y (not flip-x)))] (when (and (not ^boolean read-only?) (not (:transforming shape)) @@ -357,7 +357,7 @@ (and ^boolean half-flip? (or (= position :top-right) (= position :bottom-left))) - (- rotation 90) + (+ rotation 90) :else rotation) -- Gitee From 4ba7bf664b5cb31b734c595dcfcc4bc4da405b2f Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 3 Apr 2024 16:22:36 +0200 Subject: [PATCH 0191/1266] :bug: Fix code generation format --- frontend/src/app/util/code_gen/style_css_formats.cljs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/src/app/util/code_gen/style_css_formats.cljs b/frontend/src/app/util/code_gen/style_css_formats.cljs index 69f841dc9..0a9cdd515 100644 --- a/frontend/src/app/util/code_gen/style_css_formats.cljs +++ b/frontend/src/app/util/code_gen/style_css_formats.cljs @@ -20,6 +20,8 @@ :height :size :min-width :size :min-height :size + :max-width :size + :max-height :size :background :color :border :border :border-radius :string-or-size-array -- Gitee From 677da04c43fb9e9776b8aa5f4dd397e39a88243a Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 3 Apr 2024 16:22:47 +0200 Subject: [PATCH 0192/1266] :bug: Fix component name ellipsis --- .../src/app/main/ui/workspace/sidebar/assets/components.scss | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/sidebar/assets/components.scss b/frontend/src/app/main/ui/workspace/sidebar/assets/components.scss index 1fad7eeb8..72706d601 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/assets/components.scss +++ b/frontend/src/app/main/ui/workspace/sidebar/assets/components.scss @@ -66,8 +66,7 @@ &:hover { .cell-name { - display: grid; - grid-template-columns: 1fr auto; + display: block; } } -- Gitee From d96902f61d77db1f9218974bba49888c9e0dd0f3 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 3 Apr 2024 16:40:01 +0200 Subject: [PATCH 0193/1266] :bug: Fix filter layers --- frontend/src/app/main/ui/workspace/sidebar/layers.cljs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/workspace/sidebar/layers.cljs b/frontend/src/app/main/ui/workspace/sidebar/layers.cljs index debc36252..afe62a2b1 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/layers.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/layers.cljs @@ -144,7 +144,10 @@ (conj :rect :circle :path :bool))] (or (= uuid/zero id) (and (or (str/includes? (str/lower (:name shape)) (str/lower search)) - (str/includes? (dm/str (:id shape)) (str/lower search))) + ;; Only for local development we allow search for ids. Otherwise will be hard + ;; search for numbers or single letter shape names (ie: "A") + (and *assert* + (str/includes? (dm/str (:id shape)) (str/lower search)))) (or (empty? filters) (and (contains? filters :component) (contains? shape :component-id)) -- Gitee From bd2630fa1ac961cb23dda08bee3ef90b1c33865d Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 4 Apr 2024 10:07:18 +0200 Subject: [PATCH 0194/1266] :bug: Add shortcut description for grid layout toggle --- frontend/src/app/main/ui/workspace/sidebar/shortcuts.cljs | 1 + frontend/translations/en.po | 3 +++ frontend/translations/es.po | 3 +++ 3 files changed, 7 insertions(+) diff --git a/frontend/src/app/main/ui/workspace/sidebar/shortcuts.cljs b/frontend/src/app/main/ui/workspace/sidebar/shortcuts.cljs index 4fde27d0c..20d41a9f7 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/shortcuts.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/shortcuts.cljs @@ -189,6 +189,7 @@ ;; shortcuts.unmask ;; shortcuts.v-distribute ;; shortcuts.zoom-selected + ;; shortcuts.toggle-layout-grid (let [translat-pre (case type :sc "shortcuts." :sec "shortcut-section." diff --git a/frontend/translations/en.po b/frontend/translations/en.po index 498fd2597..64d26fe66 100644 --- a/frontend/translations/en.po +++ b/frontend/translations/en.po @@ -3023,6 +3023,9 @@ msgstr "Zoom lense increase" msgid "shortcuts.zoom-selected" msgstr "Zoom to selected" +msgid "shortcuts.toggle-layout-grid" +msgstr "Add/remove grid layout" + #: src/app/main/ui/dashboard/team.cljs msgid "team.webhooks.max-length" msgstr "The webhook name must contain at most 2048 characters." diff --git a/frontend/translations/es.po b/frontend/translations/es.po index 02f484954..18ee3b030 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -3069,6 +3069,9 @@ msgstr "Incrementar zoom a objetivo" msgid "shortcuts.zoom-selected" msgstr "Zoom a selección" +msgid "shortcuts.toggle-layout-grid" +msgstr "Añadir/eliminar grid layout" + #: src/app/main/ui/dashboard/team.cljs msgid "team.webhooks.max-length" msgstr "El nombre del webhook debe contener como máximo 2048 caracteres." -- Gitee From 8541ddc598752943ebf7d2056f033bef50b3e329 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Tue, 2 Apr 2024 14:46:11 +0200 Subject: [PATCH 0195/1266] :bug: Fix comments padding --- frontend/src/app/main/ui/comments.cljs | 3 +-- frontend/src/app/main/ui/comments.scss | 8 ++++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/main/ui/comments.cljs b/frontend/src/app/main/ui/comments.cljs index 3ff852fcf..200427a1d 100644 --- a/frontend/src/app/main/ui/comments.cljs +++ b/frontend/src/app/main/ui/comments.cljs @@ -422,8 +422,7 @@ :id (str "thread-" thread-id) :style {:left (str pos-x "px") :top (str pos-y "px") - :max-height max-height - :overflow-y "scroll"} + :max-height max-height} :on-click dom/stop-propagation} [:div {:class (stl/css :comments)} diff --git a/frontend/src/app/main/ui/comments.scss b/frontend/src/app/main/ui/comments.scss index 35682c766..3c6e569ea 100644 --- a/frontend/src/app/main/ui/comments.scss +++ b/frontend/src/app/main/ui/comments.scss @@ -142,10 +142,14 @@ // thread-content .thread-content { position: absolute; - pointer-events: auto; - user-select: text; + overflow-y: scroll; + scrollbar-gutter: stable; width: $s-284; padding: $s-12; + padding-inline-end: 0; + + pointer-events: auto; + user-select: text; border-radius: $br-8; border: $s-2 solid var(--modal-border-color); background-color: var(--comment-modal-background-color); -- Gitee From ee4e1fbbf4e79ad2723dff227200de5318293a85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Tue, 2 Apr 2024 14:59:19 +0200 Subject: [PATCH 0196/1266] :bug: Fix comments not being visible on view mode --- frontend/src/app/main/ui/comments.cljs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/main/ui/comments.cljs b/frontend/src/app/main/ui/comments.cljs index 200427a1d..31cfd9a60 100644 --- a/frontend/src/app/main/ui/comments.cljs +++ b/frontend/src/app/main/ui/comments.cljs @@ -360,7 +360,8 @@ (l/derived (l/in [:comments thread-id]) st/state)) (defn- offset-position [position viewport zoom bubble-margin] - (let [base-x (+ (* (:x position) zoom) (:offset-x viewport)) + (let [viewport (or viewport {:offset-x 0 :offset-y 0 :width 0 :height 0}) + base-x (+ (* (:x position) zoom) (:offset-x viewport)) base-y (+ (* (:y position) zoom) (:offset-y viewport)) w (:width viewport) h (:height viewport) @@ -385,7 +386,7 @@ (some? position-modifier) (gpt/transform position-modifier)) - max-height (int (* (:height viewport) 0.75)) + max-height (when (some? viewport) (int (* (:height viewport) 0.75))) ;; We should probably look for a better way of doing this. bubble-margin {:x 24 :y 0} pos (offset-position base-pos viewport zoom bubble-margin) -- Gitee From ad3e44258a552ef9fc28e497801e6d389235418d Mon Sep 17 00:00:00 2001 From: AzazelN28 Date: Thu, 4 Apr 2024 11:41:22 +0200 Subject: [PATCH 0197/1266] :paperclip: Add cookie consent comment --- frontend/resources/templates/index.mustache | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/resources/templates/index.mustache b/frontend/resources/templates/index.mustache index ffaaa9be8..9090976a3 100644 --- a/frontend/resources/templates/index.mustache +++ b/frontend/resources/templates/index.mustache @@ -36,6 +36,7 @@ {{/manifest}} + {{> ../public/images/sprites/symbol/icons.svg }} -- Gitee From 065d481cb548fe92e97d617a0f3bcbd538e2127e Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Thu, 21 Mar 2024 17:36:43 +0100 Subject: [PATCH 0198/1266] :bug: Remove the swap slot on some operations with copies --- common/src/app/common/types/component.cljc | 6 +++ common/src/app/common/types/container.cljc | 37 +++++++++++++------ frontend/src/app/main/data/workspace.cljs | 22 +++++++++-- .../app/main/data/workspace/libraries.cljs | 18 +++++---- .../app/main/data/workspace/selection.cljs | 14 +++++-- .../app/main/data/workspace/transforms.cljs | 13 +++++-- 6 files changed, 82 insertions(+), 28 deletions(-) diff --git a/common/src/app/common/types/component.cljc b/common/src/app/common/types/component.cljc index 8491462b3..7c48e7f30 100644 --- a/common/src/app/common/types/component.cljc +++ b/common/src/app/common/types/component.cljc @@ -197,6 +197,12 @@ (or (= slot-main slot-inst) (= (:id shape-main) slot-inst))))) +(defn remove-swap-slot + [shape] + (update shape :touched + (fn [touched] + (into #{} (remove #(str/starts-with? (name %) "swap-slot-") touched))))) + (defn get-component-root [component] (if (true? (:main-instance-id component)) diff --git a/common/src/app/common/types/container.cljc b/common/src/app/common/types/container.cljc index 2034ab58c..d71390508 100644 --- a/common/src/app/common/types/container.cljc +++ b/common/src/app/common/types/container.cljc @@ -211,20 +211,33 @@ :else (get-instance-root objects (get objects (:parent-id shape))))) +(defn find-component-main + "If the shape is a component main instance or is inside one, return that instance" + ([objects shape] + (find-component-main objects shape true)) + ([objects shape only-direct-child?] + (cond + (or (nil? shape) (cfh/root? shape)) + nil + (nil? (:parent-id shape)) ; This occurs in the root of components v1 + shape + (ctk/main-instance? shape) + shape + (and only-direct-child? ;; If we are asking only for direct childs of a component-main, + (ctk/instance-head? shape)) ;; stop when we found a instance-head that isn't main-instance + nil + (and (not only-direct-child?) + (ctk/instance-root? shape)) + nil + :else + (find-component-main objects (get objects (:parent-id shape)))))) + (defn inside-component-main? "Check if the shape is a component main instance or is inside one." - [objects shape] - (cond - (or (nil? shape) (cfh/root? shape)) - false - (nil? (:parent-id shape)) ; This occurs in the root of components v1 - true - (ctk/main-instance? shape) - true - (ctk/instance-head? shape) - false - :else - (inside-component-main? objects (get objects (:parent-id shape))))) + ([objects shape] + (inside-component-main? objects shape true)) + ([objects shape only-direct-child?] + (some? (find-component-main objects shape only-direct-child?)))) (defn in-any-component? "Check if the shape is part of any component (main or copy), wether it's diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index 044d133f9..1dddf3f99 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -789,9 +789,14 @@ (defn relocate-shapes-changes [it objects parents parent-id page-id to-index ids groups-to-delete groups-to-unmask shapes-to-detach shapes-to-reroot shapes-to-deroot shapes-to-unconstraint] - (let [ordered-indexes (cfh/order-by-indexed-shapes objects ids) - shapes (map (d/getf objects) ordered-indexes) - parent (get objects parent-id)] + (let [ordered-indexes (cfh/order-by-indexed-shapes objects ids) + shapes (map (d/getf objects) ordered-indexes) + parent (get objects parent-id) + component-main-parent (ctn/find-component-main objects parent false) + child-heads + (->> ordered-indexes + (mapcat #(ctn/get-child-heads objects %)) + (map :id))] (-> (pcb/empty-changes it page-id) (pcb/with-objects objects) @@ -804,6 +809,17 @@ (cond-> (and (not= uuid/zero parent-id) (cfh/frame-shape? parent)) (pcb/update-shapes ordered-indexes #(cond-> % (cfh/frame-shape? %) (assoc :hide-in-viewer true)))) + ;; Remove the swap slots if it is moving to a different component + (pcb/update-shapes child-heads + (fn [shape] + (cond-> shape + (not= component-main-parent (ctn/find-component-main objects shape false)) + (ctk/remove-swap-slot)))) + + ;; Add component-root property when moving a component outside a component + (cond-> (not (ctn/get-instance-root objects parent)) + (pcb/update-shapes child-heads #(assoc % :component-root true))) + ;; Move the shapes (pcb/change-parent parent-id shapes diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index 6f08743c9..e055ea16e 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -937,12 +937,14 @@ (ptk/reify ::add-component-for-swap ptk/WatchEvent (watch [it _ _] - (let [objects (:objects page) - position (gpt/point (:x shape) (:y shape)) - changes (-> (pcb/empty-changes it (:id page)) - (pcb/set-undo-group undo-group) - (pcb/with-objects objects)) - position (-> position (with-meta {:cell target-cell})) + (let [objects (:objects page) + position (gpt/point (:x shape) (:y shape)) + changes (-> (pcb/empty-changes it (:id page)) + (pcb/set-undo-group undo-group) + (pcb/with-objects objects)) + position (-> position (with-meta {:cell target-cell})) + parent (get objects (:parent-id shape)) + inside-comp? (ctn/in-any-component? objects parent) [new-shape changes] (dwlh/generate-instantiate-component changes @@ -958,7 +960,9 @@ {:force-frame? true}) new-shape (cond-> new-shape - (nil? (ctk/get-swap-slot new-shape)) + ; if the shape isn't inside a main component, it shouldn't have a swap slot + (and (nil? (ctk/get-swap-slot new-shape)) + inside-comp?) (update :touched cfh/set-touched-group (-> (ctf/find-swap-slot shape page {:id (:id file) diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index d260c5e0b..acb0d2175 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -460,9 +460,9 @@ ;; TODO: move to common.files.shape-helpers (defn- prepare-duplicate-shape-change ([changes objects page unames update-unames! ids-map obj delta level-delta libraries library-data it file-id] - (prepare-duplicate-shape-change changes objects page unames update-unames! ids-map obj delta level-delta libraries library-data it file-id (:frame-id obj) (:parent-id obj) false false)) + (prepare-duplicate-shape-change changes objects page unames update-unames! ids-map obj delta level-delta libraries library-data it file-id (:frame-id obj) (:parent-id obj) false false true)) - ([changes objects page unames update-unames! ids-map obj delta level-delta libraries library-data it file-id frame-id parent-id duplicating-component? child?] + ([changes objects page unames update-unames! ids-map obj delta level-delta libraries library-data it file-id frame-id parent-id duplicating-component? child? remove-swap-slot?] (cond (nil? obj) changes @@ -485,6 +485,7 @@ (ctk/instance-root? obj)) duplicating-component? (or duplicating-component? (ctk/instance-head? obj)) is-component-main? (ctk/main-instance? obj) + subinstance-head? (ctk/subinstance-head? obj) into-component? (and duplicating-component? (ctn/in-any-component? objects parent)) @@ -507,6 +508,9 @@ :parent-id parent-id :frame-id frame-id) + (cond-> (and subinstance-head? remove-swap-slot?) + (ctk/remove-swap-slot)) + (dissoc :shapes :main-instance :use-for-thumbnail) @@ -572,7 +576,11 @@ (if frame? new-id frame-id) new-id duplicating-component? - true)) + true + (and remove-swap-slot? + ;; only remove swap slot of children when the current shape + ;; is not a subinstance head + (not subinstance-head?)))) changes (map (d/getf objects) (:shapes obj))))))) diff --git a/frontend/src/app/main/data/workspace/transforms.cljs b/frontend/src/app/main/data/workspace/transforms.cljs index a69805cdc..e96f8ba72 100644 --- a/frontend/src/app/main/data/workspace/transforms.cljs +++ b/frontend/src/app/main/data/workspace/transforms.cljs @@ -842,6 +842,8 @@ frame (get objects frame-id) layout? (:layout frame) + component-main-frame (ctn/find-component-main objects frame false) + shapes (->> ids (cfh/clean-loops objects) (keep lookup)) moving-shapes @@ -906,9 +908,8 @@ (map :id moving-shapes) moving-shapes-children-ids - (->> moving-shapes - (mapcat #(cfh/get-children-with-self objects (:id %))) - (map :id)) + (->> moving-shapes-ids + (mapcat #(cfh/get-children-ids-with-self objects %))) child-heads (->> moving-shapes-ids @@ -921,6 +922,12 @@ ;; Remove layout-item properties when moving a shape outside a layout (cond-> (not (ctl/any-layout? objects frame-id)) (pcb/update-shapes moving-shapes-ids ctl/remove-layout-item-data)) + ;; Remove the swap slots if it is moving to a different component + (pcb/update-shapes child-heads + (fn [shape] + (cond-> shape + (not= component-main-frame (ctn/find-component-main objects shape false)) + (ctk/remove-swap-slot)))) ;; Remove component-root property when moving a shape inside a component (cond-> (ctn/get-instance-root objects frame) (pcb/update-shapes moving-shapes-children-ids #(dissoc % :component-root))) -- Gitee From e33b08f47f7ac49b8f2e8497133fa23f8d8c86c5 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Thu, 4 Apr 2024 13:20:49 +0200 Subject: [PATCH 0199/1266] :bug: Fix crash on moving a copy outside a copy --- frontend/src/app/main/data/workspace/transforms.cljs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/data/workspace/transforms.cljs b/frontend/src/app/main/data/workspace/transforms.cljs index e96f8ba72..bd7dceb63 100644 --- a/frontend/src/app/main/data/workspace/transforms.cljs +++ b/frontend/src/app/main/data/workspace/transforms.cljs @@ -844,7 +844,11 @@ component-main-frame (ctn/find-component-main objects frame false) - shapes (->> ids (cfh/clean-loops objects) (keep lookup)) + shapes (->> ids + (cfh/clean-loops objects) + (keep lookup) + ;;remove shapes inside copies, because we can't change the structure of copies + (remove #(ctk/in-component-copy? (get objects (:parent-id %))))) moving-shapes (cond->> shapes -- Gitee From 8c72770fecdf5eb2d48b447b2b2014fb6ba80535 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Thu, 4 Apr 2024 13:36:40 +0200 Subject: [PATCH 0200/1266] :bug: Fix can't move a layer on a copy --- frontend/src/app/main/data/workspace/transforms.cljs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/data/workspace/transforms.cljs b/frontend/src/app/main/data/workspace/transforms.cljs index bd7dceb63..25e2660e6 100644 --- a/frontend/src/app/main/data/workspace/transforms.cljs +++ b/frontend/src/app/main/data/workspace/transforms.cljs @@ -505,7 +505,9 @@ ids (if (nil? ids) selected ids) shapes (into [] (comp (map (d/getf objects)) - (remove ctk/in-component-copy-not-head?)) + (remove #(let [parent (get objects (:parent-id %))] + (and (ctk/in-component-copy? parent) + (ctl/any-layout? parent))))) ids) duplicate-move-started? (get-in state [:workspace-local :duplicate-move-started?] false) -- Gitee From b1e226cdc6032853df6cd401d131edd5f37d4c94 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 4 Apr 2024 15:30:11 +0200 Subject: [PATCH 0201/1266] :bug: Fix problem with import zip files --- frontend/src/app/worker/import.cljs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/worker/import.cljs b/frontend/src/app/worker/import.cljs index 2130ff414..998459c60 100644 --- a/frontend/src/app/worker/import.cljs +++ b/frontend/src/app/worker/import.cljs @@ -614,14 +614,14 @@ (rx/tap #(rx/end! progress-str)))])) (defn create-files - [{:keys [features] :as context} files] + [{:keys [system-features] :as context} files] (let [data (group-by :file-id files)] (rx/concat (->> (rx/from files) (rx/map #(merge context %)) (rx/merge-map (fn [context] - (->> (create-file context features) + (->> (create-file context system-features) (rx/map #(vector % (first (get data (:file-id context))))))))) (->> (rx/from files) @@ -694,7 +694,7 @@ (let [context {:project-id project-id :resolve (resolve-factory) - :features features} + :system-features features} zip-files (filter #(= "application/zip" (:type %)) files) binary-files (filter #(= "application/octet-stream" (:type %)) files)] -- Gitee From e420be5e514d362ba71da22799ba9eb134bbed09 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 4 Apr 2024 16:11:59 +0200 Subject: [PATCH 0202/1266] :bug: Fix problem ordering layers in html markup --- common/src/app/common/types/shape/layout.cljc | 8 ++++--- frontend/src/app/main/ui/shapes/frame.cljs | 3 ++- .../src/app/util/code_gen/markup_html.cljs | 22 ++++++++++--------- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/common/src/app/common/types/shape/layout.cljc b/common/src/app/common/types/shape/layout.cljc index c39545041..73ae7c263 100644 --- a/common/src/app/common/types/shape/layout.cljc +++ b/common/src/app/common/types/shape/layout.cljc @@ -543,19 +543,21 @@ (or (:layout-item-z-index shape) 0))) (defn- comparator-layout-z-index - [[idx-a child-a] [idx-b child-b]] + [reverse? [idx-a child-a] [idx-b child-b]] (cond (> (layout-z-index child-a) (layout-z-index child-b)) 1 (< (layout-z-index child-a) (layout-z-index child-b)) -1 + (and (< idx-a idx-b) reverse?) -1 + (and (> idx-a idx-b) reverse?) 1 (< idx-a idx-b) 1 (> idx-a idx-b) -1 :else 0)) (defn sort-layout-children-z-index - [children] + [children reverse?] (->> children (d/enumerate) - (sort comparator-layout-z-index) + (sort (partial comparator-layout-z-index reverse?)) (mapv second))) (defn change-h-sizing? diff --git a/frontend/src/app/main/ui/shapes/frame.cljs b/frontend/src/app/main/ui/shapes/frame.cljs index c907291ad..291c27130 100644 --- a/frontend/src/app/main/ui/shapes/frame.cljs +++ b/frontend/src/app/main/ui/shapes/frame.cljs @@ -168,9 +168,10 @@ [props] (let [shape (unchecked-get props "shape") childs (unchecked-get props "childs") + reverse? (and (ctl/flex-layout? shape) (ctl/reverse? shape)) childs (cond-> childs (ctl/any-layout? shape) - (ctl/sort-layout-children-z-index))] + (ctl/sort-layout-children-z-index reverse?))] [:> frame-container props [:g.frame-children diff --git a/frontend/src/app/util/code_gen/markup_html.cljs b/frontend/src/app/util/code_gen/markup_html.cljs index 0f1c1ac24..cb21d00ed 100644 --- a/frontend/src/app/util/code_gen/markup_html.cljs +++ b/frontend/src/app/util/code_gen/markup_html.cljs @@ -25,7 +25,6 @@ ([objects shape level] (when (and (some? shape) (some? (:selrect shape))) (let [indent (str/repeat " " level) - maybe-reverse (if (ctl/any-layout? shape) reverse identity) shape-html (cond @@ -65,15 +64,18 @@ indent) :else - (dm/fmt "%
\n%\n%
" - indent - (dm/str (d/name (:type shape)) " " - (cgc/shape->selector shape)) - (->> (:shapes shape) - (maybe-reverse) - (map #(generate-html objects (get objects %) (inc level))) - (str/join "\n")) - indent)) + (let [children (->> shape :shapes (map #(get objects %))) + reverse? (ctl/any-layout? shape) + ;; The order for layout elements is the reverse of SVG order + children (cond-> children reverse? reverse)] + (dm/fmt "%
\n%\n%
" + indent + (dm/str (d/name (:type shape)) " " + (cgc/shape->selector shape)) + (->> children + (map #(generate-html objects % (inc level))) + (str/join "\n")) + indent))) shape-html (if (cgc/has-wrapper? objects shape) -- Gitee From c295680c89492dc788ee0243ec90c1766bf70d62 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 4 Apr 2024 16:22:08 +0200 Subject: [PATCH 0203/1266] :bug: Fix problem with grid ordering --- frontend/src/app/main/data/workspace/transforms.cljs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/main/data/workspace/transforms.cljs b/frontend/src/app/main/data/workspace/transforms.cljs index 25e2660e6..7f05c1bb0 100644 --- a/frontend/src/app/main/data/workspace/transforms.cljs +++ b/frontend/src/app/main/data/workspace/transforms.cljs @@ -608,11 +608,11 @@ (->> move-stream (rx/last) (rx/mapcat - (fn [[_ target-frame drop-index cell-data]] + (fn [[_ target-frame drop-index]] (let [undo-id (js/Symbol)] (rx/of (dwu/start-undo-transaction undo-id) (dwm/apply-modifiers {:undo-transation? false}) - (move-shapes-to-frame ids target-frame drop-index cell-data) + (move-shapes-to-frame ids target-frame drop-index nil) (finish-transform) (dwu/commit-undo-transaction undo-id)))))))))))))) -- Gitee From 02ea0374a38bca09013ba5085d9d813c2e053b40 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 4 Apr 2024 17:31:52 +0200 Subject: [PATCH 0204/1266] :bug: Fix problem moving shapes into grid --- common/src/app/common/types/shape/layout.cljc | 13 ++++++++----- .../src/app/main/data/workspace/transforms.cljs | 5 ++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/common/src/app/common/types/shape/layout.cljc b/common/src/app/common/types/shape/layout.cljc index 73ae7c263..efccf250c 100644 --- a/common/src/app/common/types/shape/layout.cljc +++ b/common/src/app/common/types/shape/layout.cljc @@ -1294,11 +1294,14 @@ (->> (range start-index (inc to-index)) (map vector shape-ids) (reduce (fn [[parent cells] [shape-id idx]] - (let [[parent cells] (free-cell-push parent cells idx)] - [(update-in parent [:layout-grid-cells (get-in cells [idx :id])] - assoc :position :manual - :shapes [shape-id]) - cells])) + ;; If the shape to put in a cell is the same that is already in the cell we do nothing + (if (= shape-id (get-in parent [:layout-grid-cells (get-in cells [idx :id]) :shapes 0])) + [parent cells] + (let [[parent cells] (free-cell-push parent cells idx)] + [(update-in parent [:layout-grid-cells (get-in cells [idx :id])] + assoc :position :manual + :shapes [shape-id]) + cells]))) [parent cells]) (first))) parent))) diff --git a/frontend/src/app/main/data/workspace/transforms.cljs b/frontend/src/app/main/data/workspace/transforms.cljs index 7f05c1bb0..7cea9cde9 100644 --- a/frontend/src/app/main/data/workspace/transforms.cljs +++ b/frontend/src/app/main/data/workspace/transforms.cljs @@ -585,7 +585,6 @@ :else [move-vector nil])] - (-> (dwm/create-modif-tree ids (ctm/move-modifiers move-vector)) (dwm/build-change-frame-modifiers objects selected target-frame drop-index cell-data) (dwm/set-modifiers false false {:snap-ignore-axis snap-ignore-axis})))))) @@ -608,11 +607,11 @@ (->> move-stream (rx/last) (rx/mapcat - (fn [[_ target-frame drop-index]] + (fn [[_ target-frame drop-index drop-cell]] (let [undo-id (js/Symbol)] (rx/of (dwu/start-undo-transaction undo-id) (dwm/apply-modifiers {:undo-transation? false}) - (move-shapes-to-frame ids target-frame drop-index nil) + (move-shapes-to-frame ids target-frame drop-index drop-cell) (finish-transform) (dwu/commit-undo-transaction undo-id)))))))))))))) -- Gitee From 3127a020a0aa8f9945a634959ed304bf3cc80970 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Thu, 4 Apr 2024 16:45:57 +0200 Subject: [PATCH 0205/1266] :bug: Remove fill from group heads when migrating to v2 --- backend/src/app/features/components_v2.clj | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/backend/src/app/features/components_v2.clj b/backend/src/app/features/components_v2.clj index 15d5221c8..aa8695ee8 100644 --- a/backend/src/app/features/components_v2.clj +++ b/backend/src/app/features/components_v2.clj @@ -872,10 +872,11 @@ (fix-shape [shape] (if (or (nil? (:parent-id shape)) (ctk/instance-head? shape)) - (let [frame? (= :frame (:type shape))] - (assoc shape - :type :frame ; Old groups must be converted - :fills (or (:fills shape) []) ; to frames and conform to spec + (let [frame? (= :frame (:type shape)) + not-group? (not= :group (:type shape))] + (assoc shape ; Old groups must be converted + :type :frame ; to frames and conform to spec + :fills (if not-group? (d/nilv (:fills shape) []) []) ; Groups never should have fill :shapes (or (:shapes shape) []) :hide-in-viewer (if frame? (boolean (:hide-in-viewer shape)) true) :show-content (if frame? (boolean (:show-content shape)) true) -- Gitee From ce7f1440fa849e41d2971fd03c3b9007326b7013 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Fri, 5 Apr 2024 09:25:50 +0200 Subject: [PATCH 0206/1266] :bug: Fix position of image grid on onboarding --- frontend/src/app/main/ui/components/forms.cljs | 5 ++++- frontend/src/app/main/ui/onboarding/questions.cljs | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/components/forms.cljs b/frontend/src/app/main/ui/components/forms.cljs index 7d1ad4a46..9aec3f302 100644 --- a/frontend/src/app/main/ui/components/forms.cljs +++ b/frontend/src/app/main/ui/components/forms.cljs @@ -239,6 +239,7 @@ (let [form (or (unchecked-get props "form") (mf/use-ctx form-ctx)) name (unchecked-get props "name") + image (unchecked-get props "image") current-value (or (dm/get-in @form [:data name] "") (unchecked-get props "value")) @@ -260,7 +261,9 @@ (when (fn? on-change) (on-change name value)))))] - [:div {:class (dm/str class " " (stl/css :custom-radio))} + [:div {:class (if image + class + (dm/str class " " (stl/css :custom-radio)))} (for [{:keys [image icon value label area]} options] (let [image? (some? image) icon? (some? icon) diff --git a/frontend/src/app/main/ui/onboarding/questions.cljs b/frontend/src/app/main/ui/onboarding/questions.cljs index f7d96dca4..ae9f5d427 100644 --- a/frontend/src/app/main/ui/onboarding/questions.cljs +++ b/frontend/src/app/main/ui/onboarding/questions.cljs @@ -167,6 +167,7 @@ {:label (tr "questions.never-used-one") :area "image6" :value "never-used-a-tool" :icon i/curve} {:label (tr "questions.other") :value "other" :area "other"}] :name :experience-design-tool + :image true :class (stl/css :image-radio) :on-change on-design-tool-change}] -- Gitee From c2737f2378bfffa77e1626c38e9f4e52771f76f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Fri, 5 Apr 2024 10:04:27 +0200 Subject: [PATCH 0207/1266] :bug: Avoid datatype problem calculating proportions --- backend/src/app/features/components_v2.clj | 2 +- common/src/app/common/geom/proportions.cljc | 14 +++++++------- common/src/app/common/types/shape.cljc | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/backend/src/app/features/components_v2.clj b/backend/src/app/features/components_v2.clj index aa8695ee8..db4ca2536 100644 --- a/backend/src/app/features/components_v2.clj +++ b/backend/src/app/features/components_v2.clj @@ -1255,7 +1255,7 @@ :frame-id frame-id :parent-id frame-id}) (assoc - :proportion (/ width height) + :proportion (float (/ width height)) :proportion-lock true)) img-shape (cts/setup-shape diff --git a/common/src/app/common/geom/proportions.cljc b/common/src/app/common/geom/proportions.cljc index c884aa369..342145b68 100644 --- a/common/src/app/common/geom/proportions.cljc +++ b/common/src/app/common/geom/proportions.cljc @@ -13,27 +13,27 @@ (defn assign-proportions [shape] (let [{:keys [width height]} (:selrect shape)] - (assoc shape :proportion (/ width height)))) - -;; --- Setup Proportions - + (assoc shape :proportion (float (/ width height))))) ; Note: we need to convert explicitly to float. + ; In Clojure (not clojurescript) when we divide +;; --- Setup Proportions ; two integers it does not create a float, but + ; a clojure.lang.Ratio object. (defn setup-proportions-image [{:keys [metadata] :as shape}] (let [{:keys [width height]} metadata] (assoc shape - :proportion (/ width height) + :proportion (float (/ width height)) :proportion-lock true))) (defn setup-proportions-size [{{:keys [width height]} :selrect :as shape}] (assoc shape - :proportion (/ width height) + :proportion (float (/ width height)) :proportion-lock true)) (defn setup-proportions-const [shape] (assoc shape - :proportion 1 + :proportion 1.0 :proportion-lock false)) (defn setup-proportions diff --git a/common/src/app/common/types/shape.cljc b/common/src/app/common/types/shape.cljc index e76fbe2a6..2b610ca45 100644 --- a/common/src/app/common/types/shape.cljc +++ b/common/src/app/common/types/shape.cljc @@ -483,8 +483,8 @@ (defn- setup-image [{:keys [metadata] :as shape}] (-> shape - (assoc :proportion (/ (:width metadata) - (:height metadata))) + (assoc :proportion (float (/ (:width metadata) + (:height metadata)))) (assoc :proportion-lock true))) (defn setup-shape -- Gitee From 520acfc82346e5cd608ea4c2d6dc7a660a5b9443 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Fri, 5 Apr 2024 11:25:00 +0200 Subject: [PATCH 0208/1266] :tada: Update libraries and templates section --- backend/resources/app/onboarding.edn | 46 +++++++++--------- .../template-black-white-mobile-templates.jpg | Bin 0 -> 93626 bytes .../thumbnails/template-font-awesome.jpg | Bin 0 -> 42229 bytes .../thumbnails/template-lucide-icons.jpg | Bin 0 -> 125750 bytes .../thumbnails/template-open-color-scheme.jpg | Bin 0 -> 40373 bytes .../images/thumbnails/template-plants-app.jpg | Bin 0 -> 137774 bytes .../images/thumbnails/template-ux-notes.jpg | Bin 0 -> 65360 bytes .../resources/images/walkthrough-cover.png | Bin 115991 -> 179746 bytes 8 files changed, 23 insertions(+), 23 deletions(-) create mode 100644 frontend/resources/images/thumbnails/template-black-white-mobile-templates.jpg create mode 100644 frontend/resources/images/thumbnails/template-font-awesome.jpg create mode 100644 frontend/resources/images/thumbnails/template-lucide-icons.jpg create mode 100644 frontend/resources/images/thumbnails/template-open-color-scheme.jpg create mode 100644 frontend/resources/images/thumbnails/template-plants-app.jpg create mode 100644 frontend/resources/images/thumbnails/template-ux-notes.jpg diff --git a/backend/resources/app/onboarding.edn b/backend/resources/app/onboarding.edn index 0438d25ba..9c65ac6ff 100644 --- a/backend/resources/app/onboarding.edn +++ b/backend/resources/app/onboarding.edn @@ -1,30 +1,30 @@ -[{:id "material-design-3" - :name "Material Design 3" - :file-uri "https://github.com/penpot/penpot-files/raw/main/Material%20Design%203.penpot"} - {:id "tutorial-for-beginners" +[{:id "tutorial-for-beginners" :name "Tutorial for beginners" :file-uri "https://github.com/penpot/penpot-files/raw/binary-files/tutorial-for-beginners.penpot"} - {:id "penpot-design-system" - :name "Penpot Design System" - :file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Penpot-Design-system.penpot"} - {:id "flex-layout-playground" - :name "Flex Layout Playground" - :file-uri "https://github.com/penpot/penpot-files/raw/main/Flex%20Layout%20Playground.penpot"} + {:id "lucide-icons" + :name "Lucide Icons" + :file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Lucide-icons.penpot"} + {:id "font-awesome" + :name "Font Awesome" + :file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Font-Awesome.penpot"} + {:id "plants-app" + :name "Plants app" + :file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Plants-app.penpot"} {:id "wireframing-kit" :name "Wireframing Kit" :file-uri "https://github.com/penpot/penpot-files/raw/binary-files/wireframing-kit.penpot"} - {:id "ant-design" - :name "Ant Design UI Kit (lite)" - :file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Ant-Design-UI-Kit-Lite.penpot"} - {:id "cocomaterial" - :name "Cocomaterial" - :file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Cocomaterial.penpot"} - {:id "circum-icons" - :name "Circum Icons pack" - :file-uri "https://github.com/penpot/penpot-files/raw/binary-files/CircumIcons.penpot"} - {:id "coreui" - :name "CoreUI" - :file-uri "https://github.com/penpot/penpot-files/raw/main/CoreUI%20DesignSystem%20(DEMO).penpot"} + {:id "black-white-mobile-templates" + :name "Black & White Mobile Templates" + :file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Black-White-Mobile-Templates.penpot"} + {:id "ux-notes" + :name "UX Notes" + :file-uri "https://github.com/penpot/penpot-files/raw/binary-files/UX-Notes.penpot"} {:id "whiteboarding-kit" :name "Whiteboarding Kit" - :file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Whiteboarding-mapping-kit.penpot"}] + :file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Whiteboarding-mapping-kit.penpot"} + {:id "open-color-scheme" + :name "Open Color Scheme" + :file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Open-Color-Scheme.penpot"} + {:id "flex-layout-playground" + :name "Flex Layout Playground" + :file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Flex-Layout-Playground.penpot"}] diff --git a/frontend/resources/images/thumbnails/template-black-white-mobile-templates.jpg b/frontend/resources/images/thumbnails/template-black-white-mobile-templates.jpg new file mode 100644 index 0000000000000000000000000000000000000000..16ce2001c89afcee7fe1877ab8c285fe81260849 GIT binary patch literal 93626 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 WK3d?T1wLBfqXqsiw7}=@$NnFd&d6N= literal 0 HcmV?d00001 diff --git a/frontend/resources/images/thumbnails/template-lucide-icons.jpg b/frontend/resources/images/thumbnails/template-lucide-icons.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0282b70a8e0621ba63733cf63c683d3bfc4d4b20 GIT binary patch literal 125750 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

y@-An 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 Bf9(JO literal 0 HcmV?d00001 diff --git a/frontend/resources/images/thumbnails/template-plants-app.jpg b/frontend/resources/images/thumbnails/template-plants-app.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d2dfbbcabd7463df2b7c9513aee658cebcb5f0cc GIT binary patch literal 137774 zcmb5Vbx<5#&@a3=gy8N@@Zbb@ci3GP*TohVcR~WeU4mqh1b11S4I13tAp{McARz<- zxjgTC>(=-0*EKaYb9&}XPuHCOwavekf8PMaT56hV05mkf|I)v8fHD9B{XhC|kMTs9 z*qHwjE;cq6HXiP?XLz`Hc+Z{_J%5Hzh>wRyKte!BL`+OV{Oma?87VQ@(=qXXlc4=~ zCk7_&(~ZRVc=%7F|3B$pFMtFWeE|!OfkpyACqcs?LHjoVU<3frFfq{npS({}qoHG9 zVqxRr;5~cddk_QAFwikEurM%jhzOqJ0r1fPPka(AY*H2+Aw^s=Rzq8IVXyGC!bS=< zQ6(cEBpxLdwTPIVw_kcjQ{U`7ySRk1F%SgyjmRw8=6Io^Y7$jk+WckiCk>~)1N7bd zk_)xSe)X1JE)D!VJ<0OF^nW!70HCA&ClJmPlb7U)1wg|BJZTaQ@ZSbNBY6^s zltqYKk<1W_RoE7r%}azrN%`Lz;Q13DodkmfAP*Sr3d;(9jYrbKz@e>muSExU9@5Ql z!^#R$bJ4DE96d9n+g|&PUzOUKlY;8-z9}%|wX8r_eQzR?ieHk00WBj#;aGT_f$t5t#v==UXU$vPm`l4J(z+EiNyXS*f)^RjB&#kJX?^S2>5b+y&D zjeBklDwLa~rZr z79|5^=wl_l)k?^0wUPH?z??aa+d|vWm~8zgnY%Owmh{=D?zNj69u9TAnpWTclpNOW zxH3|`bv9*4z=}JFPlMLZFOt89^Chjuek}dmzBZB{%U)BKk{6o{GSjikFPm`jQkTYK zu|>oCcu@C0M(AAq$I=VE2wsc#*d@fRVSsgrZNl2%uqdj<_x7@ zwOSRhN!{}5FbiI-(xj`e5Ej6)p6fcKYD^M0ehsTGK_Y7DeiO8w@M*tL*I;)FVsr0` z;L))p#&(AyIt0J|ScJ#1tuKvpSJE2bc3?&vmsnnxTGHJ3*e^PsgPvt0qGvmlgzBp>+6z%hM?fJHi4jLziPM$kW}%asCu+vm4{XCwsC)aHa1tXtF{rAf88*=RrK{~*=b-Qu%`5x`Lj)R^81ja z9Ug61FUdCFh#4KVROI# zF!xS~rJq;C*Ov`M3Ag(o(u{-`yjyR~>2^zte=dk-ELwQbuF}G(WN%J*=@KQo)=d{O zKNcY|4_B}(EP`G$OIQl!KsL-grp5#p*Ss01*>*|tY9v$&H3GM&m5P|!RVnH6U;*9>v6;dX?BZmKsK=*O zmlWeG@)rfJ_t3|3eebkP@#`KU_M%l&#on5>f~W?0&D8mq>U447A#D8iCqjS&UBMzomE;Bs z@H}{MS;HusoW>>_PL3KA+e;W1!TAID(6x^(tB>M$;}Ive242g1w3;grx=ez%*;qZZ zz+STXLr$NA#eQ6P16NBx`VK(OdCVT|g|E+qE=|K;6KKd4hE*$X6JGaTuvqlKL{3mN zArgqn%z0;VqCxloQXR}%5E_O;rrGMls&rS(pA78|)-pk6hR zL*2`SFQIAA^hy!JYPq$y>tfHNF3xXONupcbEy>JT)~3IeHQ{{?=FAD}QH`eG)L*Sd z)e7-)S22x=&J&UQ0nP`S(|B2Zuup_gA-X6|;RHTC>oZXYiK2BOL!Lp#U^GEnFQ7 z+1%+`w8@(!_c{rw^(fUQ{!9|_WxSk8voq%o^?`>zSmKi*%+ElmPdR%rPYQR_Kze9{ zCu>=c?%wI0SucQ&-!GNKm$)RDv zk#9-p7-Kfau3SVLZ^KtrNj3|^;cjUdR-eyyeUqcQ)OpbI`O@OdACfGnE}9ls97$*^ z7HoBb7@ttH``)sINJC=hzO5dNgY>}w#U~E)*LSs@2+_N$HaqN(pr%97yUGQgg;5y3 zkB(rfAV~;2>CrDUrt(F!@{ADlYgvC!X{t^_Q72F&bzq zzR<+7_)>?dBm01j0-GRzXG>Z2riTB3sT)}zwakp3y?e)NUU7-%G7HV|4fsl+*OM>$ z$VTg^4qrgC7rdKmB@Rmm-p%_NsO(j9e%qik_4R@Z9-pkyG%i%uPYCW9crotHA}EpRdY5SD_IGX>gmo78X)XKr30tvo50;fo%)+N z`X8V~rJLwfbrqjVR;imy)xhn$*M?E(BQIPzcnup)ENRol|3n$t+fI8XeXh=+I96kA zZO{#5qwgq)s{`MwtLhy&Q2kjb{|7L29AZN&E*cz-k-Wn`F)KDsXr;I#*q?}TCrm0!pxVBl_vAE^4dY(( zrFJ5Bvq1tf?O&Q%9R?12-@4hY7aO9a8R92hD5Ja9f|;F}w|sFg`6n?sZn!3;O^QUn z9ej#cuK7!nRjkfv;W=Q_6%K6nx{^W_y9~4yn!0xCVZa1jd6{5m*VTGsOf0P|pdh{z;?3jr zh0NE2t0$cu!e~q5m~+b($TEq^q~fi9D!LW!5h0;_PpA9+#g{{uu;KZ~XG_Om!`^<+ zUc{u&IlPj zG?*CJY{**2@r1x6^y;J65~^QWXX?Rl*=+6zGqTQqUt^`uHNnfu`jaigvsHUB4mxG% zTWe^HN#>_jixI~n0uCqM)+Ge4tKHyty# z4wNGs^QP}ku3%J2bvB+ShHn$TV8-TbPVeuC0dSWwO|sDz2V!@W4(mMUyAi+lWrf3G zt5iQoGA(-OyPsG&@i~;`{V?Qje2(p^BRCC4+PbalXnpqnQ>{H4$%y-L8Ol@J5={T~ zfPW)2tJXB}e6{;~mE@M6-81k+@9#(lDKk2v=7!o~%|Y;`XjVsOmgIaNN=Vv}+bk)r zm=R`Ir0;8iHKzl%r?LcVkGQaN`0Tr8<*Tf~Oox6uPZ7|WSuu=8$54l@HOmET~Edo4c~OG&&|}D&j2}< zcEje`X0dXY2TFR-+&SiVEv&8h*z2%9E2vFQIwFI9W9*lpQ(WmqMTu|IIFf)B-@b-e z2cR!ezg1u+#>GGhS1l@iPtv7}67c78`K3ZZf7+X@EcrQwl8gi5(@R2++Z>TnxL>AD};P@)IKFTE2RT(6Z$ie>bGk;cA_W2`t~u40RV zo^5hkCHicP_xWj4Gpp)Wv05P-s@hTQSIU`lnp}>3#{7>n-9BR@8w5EKMDp=sVb2np zS@%uJtcxm+n3sJ42V;V3sabL(4K85qgsSov4nS#LSzF9~(#C$* z$J|q(jV5-WaA-8KcR9J#Uc#t_HjR|TlT8oY5T24M%H3?3WzW)Z7j?vsaJ7r0KazGIjSUM^tqXv<9LC{fXgq7#pi6w z@7}g#s%wlIYmBlI!s-uDs#fZ6-oJ{+A*(6 z_6>>mYgnih{tFwTqaj~UXks+J&Duy78X!x@N*&P`!`}Yq+AQ<}_|S&}Q%65tqWIax z7zKB5(j`WN^FmZUp~pGc#37TIy+Ld?ANtbL_r2!!?GG+e-AbqKNd~KZ^#`^KDh9&K z5qPxm@vrg&n!?F~J|naf+aN`kSKi5>w8Ao?&U&gg=7#D!W!hjg)UsNSIr#1azT(e! z4!Q~e+=SB`{B{W0Pc^W20zS;%Ed$M`9d}B`FH}^hb+G}&DZsTuF;V8&W zj97IH@)>15NB<7XIzl#o&e7=b%lXv5LGxAXYiJk61P#}&n=XNK;{=(TnOaG|fiAlz zayo6PaY3kQ7vKR1+Y79*>|y7MV%JM;|4YF`zjUmw z;T6ALOxn9ck2Q<*N=KJW$!CCS5iG*^IqN}L$L_RUU`{j^-m>bX`TqJ@F%=>SUB&Hn zZ!>x(c${Mu8b{LEbbZ ztr41RJ$z3XM7R&FO=I_HH-&`0Gj~gKvky;JZ%(fI>zBzIX^@CZSH6htj?_6rjMo=D zSjI)kD(g=8n|&DA#(%p3FE@`$N}>M(%l}~f4$96}pw8k8&;7bpbQH#3>t!MO zzB4JRQyg6Pwm6KN`rep26yv(V+h(6%?$T02CD{@~s9jFkzu3%dPJy5=!No)uL2nZb z-@Xg>0afkzcj>CyiA?Hxm#9SIb9I=jxI#5ATKE0>obj=;?BW}6F`t9+tsQg?2a6b1 zg6OV!yoTQ|k$l%Gv;DSVNk8_aV0BSx1ZJ{a?5H61aQde6{BeUoM0kB-EBvF)y&=NOj1>wy|QtcyW*{RPUgQb4kEW z$tY~;1gp-qUQA@;{Qj<}aK<)c>_o;HcgYdgRGZrUEr8h}^QVZNmWXb0Vfshx-)c4C zUcOj0;l#K=?}6pk0eD&a>RF19wuK_4#cFI>z}mR`B+%}&wXGc`mi9 zRVqE8&sg$}8cN&T!Dj%T;}))}8ojMomU~9Xxdg00NWiEX%Qd~E#s83quj;2;)}T+i zsaFKmW&^>~n+49U1AcFBwdjm--nDb-Lp!ciHQ&lTP{0BwWMs$}iKWA|Ez)t^N6Ez^ zMP0Aej%zi$TFoGl_`e|gMomQfl)^8Y&p`Db}%Efz}IW*-z?f_=DSFZPLZH!hu zkmTDsY+)UufBMY4n0>&-76(TMtqSv#KAI_>^Np)?tT?aQYcnf0dh3D-gyk?m;`hUL(yBP^ z^q?IthQr8)@~s=OTBx4sh>WPIt~Y=I)VI@=)XbL#AMabQcDMK4H^Hq}45_va{ z7%g_a!7##PS?^Zqka69li1-32f56a2L4|5@k8GMlmRh5PO#WMQ=S44`a*&Q6UHGU^ zOIB6mMug;g%_CJzfI9`5$VcX+A)O;CnFukhx;kkW`?}z&43aVAWww@f^1emRKr>KS zZ_>N5_Y$wf;i%F+(z13_TNR|@iRNQJi!G(q!ReoSn%FFyu1@?t0b`MjilrPTAB!ae+X(SjenMFjPy3k~?h{mXs5t@qO&DRx)CX2SMDNN$pA{ zN~m3uxDu_TUNsM8)4k&>DU4XQsHt7>X+HwHwx=GWCVOT}(zUP6TqQKHIzmsxbDxK_ zuJFco7QK*NK4@Wdr1~r8CuS6J@JMXjcISi;@eHa?$ou3)`8#64;&IWzr@kp=s;tAz zDdcra#qA^Yyqu$EKw#5I+(^AOdJLhlS>kAzVbBM;?nym4NJ*4m!%D$ zZ6V5csaQ8quJvl<0Uf?r!aB`4;j2b>r-Q(AI%4Ad2(|q_jhG&{Ai(2O+r9&~r>P9- zLl8@qOJ0l|f3*RMmuNTU?bfj^grC`c&`$gyX(`4=ALGwvZ$`oeO4 zNj##=#9}}Anb9WQ5aXUxFmwq2JQ4ajRuT^yMyePf9Ix@X#DfFP&fulLzHBPv1UMK> zvzfa#?oDlV8pJ6Y;C{SSDunP%=1jrIMGd8DjCAU)x)aNxupfS^xpua+Q4*rrRwd`3 z2gEC=50XYQLV3A&%n26E#**N)}=Y)3}+~*u|{M#Cg@ECQ#^}Ro<*eV;a)tjK5+yK#gi8WS>>I~S+7*u z^F74?)_$G_64}%CZ{u>p>wz=@JIJhj0`_{Gmnri{NwpzAs#Evc&pgspP3af4U7K&f z4IvL8m&$b!`b}NtsGKBm7t_t$tHbgP{zb?Np0tl?i|Ea82TzVS8m5Po(h8e>-PvHq zsGK%NdhRe;xR33LUBnD8sjCN~7JoB^y*I#qR1jYwg5CQGwDCa9PhlA=`az!tg2g?) z;)M|=0q_Z&F`>M<)poHpP(Pu?I&q(axF*PN9HBJ}zSxHN&>RZR$p2a1;WsEuPp$&R zE<>8q_A65m^ErFg8l7KFrCo_9Qf4M@<;xd|wxS7>_`lxhSW6?DM6m_g;PErHy8NO6 zQH+B)WO9};;W+O{);^n?j(#YvgC32(Z0wU5N7Q3$rrf1`K5kOvr3$k?b{*r!M#KKM zy&D2)B6bsjB{P8<>{xnp{OU>bk}(j^0E4pPo57_WA7FYfzUd#}y17RwDc;v(i&}@D zd4ipB2XwyAmTA8ECWm0ccj>IHaMtYPNhyawuXcZ6O@rptIaZuE+%)jaS^w(H@u_o+ zs#H`!MWH_=WN{D`leV1cT5-=)IKQV}nt_!*5~3xg!<{@yXj_1`Q=WrqpnhQFtM z^Ib~+2oz@Fu~U@Yluetw%hCGvjl$*CiC2+!@SoYGm0NgL3*cul`U7RlcKlo^5o|N-&|Lh@2glX6~A$;6Fd6{s7(3? z(ERU-9ad)_<3?sz>ytk2*!E4?7V`Q=C&Auq{tpoM zB%d~P?6>;PLU|JvBQDh_|C4~*{{Z7WVWzju{{VA?!y!x$noLJJ@^_%7&mKGT`i^qa zTX&=XJ2HRS#gw4OkaPRvkv-+QjOl@AKcwDiXTC>Uf}!`Z5$DdB=rL2C@2^?xjpJ_D z^kZ?`19!}mN?HR{&W!t3i<5Q4GdQB(Of}>D1FY3GeNJv_zBc1n6qYLcskpC?+Kmj8!G37)TplV+2oNB`sDna34_aiskaT`~&>#b}Bz?=I=LJ8&AJBC3w!!de}U-(VnD@ z@5d{}Mk?vnPFsPKj>{oS`J>FOlwiZutIeXv1+m#t<~8gSSk6tT`u0Nx|U#UwO)n}gZQhiUhXozz86gZ?e@Sp&WY!D;wh^}&Q>bbs{O8fpq^c|FIwx)V z3l|AsW^3wp2%Euz(z1w_FcL(Z^(qF_2Wi;*_1jA2u((-7*bOt@g@j$@Txn%^rcjoQ z#WmN4tz$_RPFBZfLiIv}_xu&1aO`D96E%A=a&nOGr)JB|*A&%|yN#C}Sf?F~`NU0- zoh=ZdlQ<32x#)ZLA#I}CbDGWZc?Ym9?4$%Cch2^S5em%tzV~T~4iHqGK?iU2B~EjC zm7;(c0&~7yH`R(vf67^gCZ^AKDlCSnpHU8LWFt_p9;3`#8u1 zE-S;CiRdB2aDyW@G_aRI$co;^E#@j>5^qefLb5Oa(g-ClvkHX7IM%#sgi>;aq$yU_ z0pE|D500s!YGYCpPIbt)V9?S|e&zyK=M617ZojMa~!R6Rdj&z3Fl@x9j;T{~T(XIbfODcNQ$^vHsaLW3$)?|4-P<#A!H-g3TwcjPpMrVZJY(4l7x7aM|8t&gg0# zFGFpgzCT4wYbw_v6G%Go(G#`$_YC5&4`=YchiOp%iQ!L+#J(>!Qj1VA^}YM#jRpu8 zAZBLvQ7Bolr0~w@v60Sf&pjMons541hm4=w;qzjtm8U3bI&q@I@zFl&G^9mDNM!E; zk0e!I?{C^q(o7v$Y`2aiEqKdkW(^I%{WEJtI|;)va-C8!0=P{bYt@x@?QRnI+;TLx zqmoIQ@xxKrDB@Xf@!RqSHE|?_K`*33`Hv|TuNYZNn}GzTrMqujmT0nbfLQwku*$|6 z(~l=e3?S!z2Q-i4&C$eU)D(z2+MjbX(e%x9gD0oaU${Es&OVn?xCTY|F)I@26mcGN zj$*UAes~c?)fAeR^+hb#8@Lar(nY=InsnFRnbx1zjPyPk^tMxd-h?j5%x56mMXa$$ z04ih{)vfbC?r3ev^`hL0TYCvL642$s8F_+l+2+S>KS+wpTmtNdiJ%jp}_Eu$2 zI41p5@CheRtWT}pjPDW?ISRZ$3;Tip4{-bsu+ns8PrDSn&FH?pPa(&WlSIZ+k=+$ZjbfJUHI6m^jWOYbHeM*@NlhG_Z>!8kpyQ~pya`*tU z??T`w+qHYeLV`FH2vt8&b&*98eUTTYHQ5n8+tXCmr7o4^ zzUV?{i3#Kr-4V9H9*F~yJI>}LL$O;hmC~Qx7|cmV+9+{*^nJAJs`>32q z_VD0-{_Ja7GhZB1-Y6ua9%4$H z*SbwzXs-92!2Ny}mH(1S$G#Z3hu97)EtcH~UtX^&w{)}vG)osr5Y$BKQYP_`m~C1R zmSrgC{*-ghCEL!Fowy^M^lZs2vUZyfb#JG_{gH_MQg6f+$Dfa004NC*%_J&MmGM3% z2@O24yV2sQpuJra*bYe%LuT(%iLxZ~v86q=4ZPYB8db`?`;B& zs3t`Q^Uksw^D+Eh@zsHRW!?fdy>Ap=E&?qi-(uBb>q@_^)!;zb$k4Ize6FgZ)er#g zyT54FztvDYYy1@~K(+psO1fA-ZXUd7JTo`oP*D}a7B4h8?bU#vV*D}D8n0z-Lv*A$ zRA$_Bn`DT=>PBesO8RTMrv%ks?EBi=;QGuBKlj@k&+W9jo5bA%g4L~@_;Trx=hJVoA@_zo_v7>*!_q=C?zgq`gyM&FoFp(M;YeoH z(Qx`R+!YcCi6{%YfDZ0=XSLq=-b8#}&rg<)WogEuWnaEl`86bzSmcm5PT=$6ScB+P z-R$xEFaEODqYZKGR`*}v<`d`;?cGo;M~x*LTg%>-r&Yc3$gjTato4eQpzd`t3$w^EUP+V{!Ib*>(EI0tMn zEqZO={HYT67NAb|Q0jtPC!x>gh2j=9X%sHABd$voWdge9=2@LP=Z?$rDJWw2y4p_C ze#on9t)fSU?2u&HsIhjn0oQ*{!;*4k*2WB@wN2@2%(S*VK?Swn9dj{jH&vis8=sHN zj|wK12#1R%1^0EtcDA8zN(bpdq^-PhlgXQ8CpB>lWU(v!19muy^1r43Rx3wwXph{R z;jPB34LOoVOaPltC19#wCP_7US?T_cV{xr-X@}WlRt+NB0p;xYEb;c~1Cc=M!mLw1 znJ-&)>5T+z-!+Oh1iD!zb5?2FFAE0Mg})}`BhtmzVgxifC7#ROGFQiCP_brB0;+}~ z1-~_BP=Rek7AI({Hp4qFmo_Q)S~-_wi-r-aLR0INIrsRcdR&6z0;_*%rr@m{j4-c)QmxtV}CqhYHk;FCp@3xT-c zcv6yN^$M5SPYO>GTJ=?V;mkM7fqN%aKV6EO2I9%xzNqKLEz#LcWz)lnnh&%5BR3 zoG-pf>qAwWehK63BT2W2OI+=Fr}zD}QELFb8g@1QfM=Y_t7HZfbTh;!b}osAwN{Ff?G?H zpYnb|XH^%0F|I!ejlL)XQX1KAKXpBnqrS^YCWUXHHAb=gW{@ zvtYgz(m8^)d%kPz5MVmC@X+5eoWLJD5{(Pc;}@j{=5aa!Ed7_ySg{1vypi_m%lH^zkQOI+vgd@XbEUmN^|qE+}F6rz?vS zo<8J(F}4U*37KMT@xbOeQl_h+xF6Lf9zv9(sW;wx1NAuG{?@~cN=TS(q%qxrjxAL#%w@egYg2I& z;3_7xMaA$6$%qIIYfr}W0KbVQG@r&lRi|)7MXz`kOG4e+8--I9DcWp+@ec22rM?29 zS#KacSmZXPDQR}%vQ$k=76}YHAo>;pY#DKGA^f!VnKM4NnRiWyz2Tr?F6IoZ zLa3@=2rIncqQ<7l^3ZL6XMenZ{m3^s%qpJ&(GFVO75WBGw`j?>>pyZtqD9cP`#61- zHsR0C`rUpf6CxlE%iz6q)Zg}Ca%r@5$I{iaVxb3j2JLji9`L-XJ<~hAgRjIs-^q|ebP|(Ip6Zhr)ux=-x_0fxC)u_*8Z>+_x+dF~0 z$v}SR|BCbfHAg%pZ2vnT(2md3?R%x3;d+%Nt8Z*VZ=|TMuC21^V*=8;QPtPRz5i3N z^KN|eLx?xfI4p3pUynkSY;DGSVPz9CU{1q$SUtb-JMZ^3uB>#Fj9zbhQ^xjWAiu0C zc`d?~UKzjEF}_o{^#$d$uC&~Znhfzf55@0!p1YVbwBtFBY}(nS6ObF(L?asrB^7}& z_iojID^7Uh^owXtCgZMdn~S@N`L(+?CYlnvKR7RU46~%NqoPsi<)_Umt8?Ka`1SwFZ&*jGr}R}BgsLqYHVVDTiJw*LF?M-_#i&l$rdw8 zN7~)^UgE_)MZ=ia%g4#-$Lk=~i@R)yX>!x7^t8&bwCA9u2ItY4FD)Q(S$y`v?AI7^}?h_GWaV*2I@o<9* zH7*vdAtm7NS^|Q(X^jdQ>{m``(;(@*)gH6#Uk`0t#%na-VnTtnlmtA6K;OG6AK7YN zTdC%bI!~VZLZHC!_SnS-A4kn&dATaRXq{%4=9CSe7hG}JGtOU1+cgGIf@S(8{QX8D z*B+I9toH=g9k3nRLa&Dm$5}rS2D9(^q4ct|(#AE3r$ z@#u2p>g#h@+~SVwHSFU^i{^_2b@sSRhX5aiXBQ>>M7FT#K~-ItpHP6YWa2g$KLRq4j&{%`pT``;UVh?KffXVBL*Sh{uSN}J<%UJ&?# zE2jZet#{c2z5fZ1le+{kPs>d|4kh&m4Qmrpf#%CuwhLE*v}Ix2pTI zHCfFy*}r2l-8|uXH8lChgV^tT0Yt?2v%6!0Q- z#QDvK_34R?TvLhsO__A7zIMk-0r1`JFFzgB&612qdHsH8nl05>PBBVmXKmYX{ECr= zfzduM#lAW-``$;zCguGdCjCSHtJe_c+jkivF926zlEZufqM#*c;=XpYbre7Us9s;Zx?Z2Z`Pz$37q$61=W?Jn5SJtAMmmysVWWfOxtbLO zoQew~AyeB%f&?V~0m%4V4*8Tv_#+?6yB4K1<1hf?=A7eIPE12)55A@L~R@b z+`I5pbSaf7RWg&J&8O7swXPn0<;+Rs^LEq16zK%MB8c0$%NBT$d z-s%l{ENV@QMxbGTt4&VdsRim{b`>ojAX|ft=a55r;%a=o_r%ZEj)v-xeSN;kQ3}$Y z#Z;^~NjF9b&lSG?BpRd>c;UfYR|UZyL;pmqE{&Opq`P`%Y)^Y|4n8TMZQJVD8>!SFNv+$@l6}|R<$v0i!Rm>CO6uHFVaOg;ml?*Kg1z|PBT2xjW zpaXdPVe&2sQOTPW+Gq8_r-+L`+ru~i01--^3}5XTM7vcV>U3}yNbSgp$80NVqN$S8 zwPycTmow(~khsW=Zok>4mJg%&2cSs2!)8&ra<2O3b)DHWRe$S}0EiGEzdV8vzYSUq z`s0;x=vPx62YG&yA((je7H9+MmYigsvStg06!@zq7=J_={6oLhZTJ`g8Ly|6C4KK6&=8SHEg%1FHUPLa_F0 zQ^?OuTMfUwd?b+{lnl9-uY=oJ+mZjO!53>MFEBv7Hk7H$1b0NNSEaY%c^y!W+PTd; zz^ncApIWq|acN$E8Kr*HWW4t9^`tCzQdVB$ONxfvtCg<`Pk)xIQg^UmGrDZ@l@9os zmZeK%y?VvdHfQQ=o9v7hh+`BtzEUX5TbLRHC*oK$jcb@>{k=dX{W_-!k8i6SQTeM{ zC-9BoRn0z^rVXa`tZMuq)zIN&>_H>z2NHfy@IKF9;dBfzLET?Kz;MQJRVpT9Q6 z;9^&nJhJ3#d#&O>09fqj=bk(NUB+IlsO-2oFBbRT-6!SRi_n6PanN;W4~%3j8gZ@;8!J#3+| z=aWerdk~9k-WsJI`J!mUe64mg*oH*|gub;-mvrQnl4am4G_qTi{wvOcIS_MR3-Jgz zj;8)*7Hub?5t>GI^wO`jk}kkIWu12=gg@hsdB=bMhE@9w?%=l{aklzG z)yTYEF%FnH8_heA**`$=fgC~4)j@YjO45e5wZ6Ou7{7y?@$FB3Zr-{^-YWd@}w>Mw3*3U>6jsPK`aJT=l<$Xng6*Y$;fvhRZGX? zOz^y=r^Y0N#Kt9LTu27qzE``*?6-9M+Rz&rV>Lql)P66;CM4~TyG8!#%AA5g0CFf6 z%*wTR7*9L4iRaxwg~Ab5lJrx%Ak_%Ugj7cd6pz9sSCpCA((Ovspx!k$Kj?Fwj60^l zdOEI^8`zMt2k+|%CQ;Tt7@yMtEAN}T%**kY=!j94dU5W3K2T|n@76R$4 z)3%-44b${#{FiOIIiGGf=|;Hrb=BBi3*iMYpT_BgOb2NLa|UL$oSWKC(^&Rr)G*Bj zk_5Nz{AEaUy00llOeKWE#tU$2_}tGzb|afUuS&R@TQ!FyDUrSM|2x13;B$A25ai5%=T_24~1wa#G0a7?Kc9GG^Z zcz34jgHH2lXcCy(|FhNIZvsFJf&_Oj^X=k0rrW;fTzbd=qPTw^^>| zofI^9){_1CwgkIA_LlpROSoOYePR_3)(_upxzw#}|YtLp8rhMyRD4SX| z+;>~R5OQqmOs-5Ma5q-(+>{SKx77M$x$GV{eRMYPZp1W51l@fR*e>~_MF0e_HSPZJ z_7#=El)_d>x9p>YwQ|dM7y4_}q5I5h4`k-(Q^kAvIdS+nY1yM#_2lC9a$x<(1r)|e zy_j3z8yL6mJ|A=VKLB;gPS4-^H%`CCB*Qbs59Bg$oZ89O+V-+>4UMGgG@C;V{!%pl z1Hk>W*VgyI<}@v??+6DkR&}Vw3Cyk8-2IJJzNdwm%=zyI4=CILb#_ zX0}RxxcT26do_-3j`WaU{*+Ff1dOIb-g2_t**AT zcA0+k&R>`BYfZrPDyuxWaVDz#Lep$+P!Y1f*4FRr$Yd2C*UHxjvVy}sT6qgHBuN^_ zekyPIS%bjbhpvtfN?E4*(n4((sJy?1oTabigu3%MYf=V2|H-CXs?B@Tsux2ruv3cd zCR`@;osW=7cy!S>&k$@(lVhfuC+XJpT6X_JSnxdQqDQ%J)yeqdg+A=UJ%{Oedt3^! zXJ>wbE?L)d_lH^J7LMGcyw>iYP&*lOKKf@n<8OeY87Ywq=a10r&Rx55%AVxC)7fmS zi%x7*B&k|eti@2+ZIZlJ!iKi_t225VNd`*6srkPb2r zII?Se+3Ipa{E?lOt?Oi4TF%_y-S#ejzw*uX?+fyKHY02*OZcCs!g0VO$+fk4>Eg(x z_wHGIU9S-QT1tkqdBfvD@5h1F$Ae+{-9?XvoCdn>%&iBJo)7YQk8Iya)%xg>axdEK zmJ^7(o-D^o!)8P=3DEfWY}PMXqr1CYv3l9$Wc8u#&${owh6(sYw}w_`TxCgi6J&b1 zE`5HVIww0D_PAz}o9*}Nv*(cnPXYRc9*XengIsyn!OT&S$9|y28{wC?e&IEz_d`5f z6Z3nn!-78N4)N-tlU|lDf`&vcR%knG5#BYEVY1m5d}4LtU6yP+F1Mt7ps628@-dW< zZwL1!p(bH6-`N8f#7LUYL9Tqpq0ktcSWR+-n-o9gF7uT_iVa)32!&&5+8$-H7HOi& z!4>WYLbs^Tj8)5Iq8nBtpMDb5M9{ENVn&JOB*BGfPL5mEOd9+lkKIU&e}FF>k3tFG ze|xCIel76s%SG8WS()@-C8L4f+L0|NGHCOyR$k-T2B^18!(v$^E&b1e0ypbkPFQ~^ zk9D-La&s(BX<4*PD^Izf`+g=W z+VgaeL1zNQ;IhKV)cVt zVJJ zRm_@ALmcZHOghQO*Btk5O*k*M-^P4-yl><%7WJR7+J8AtK+hPXeEJ70_HW%L7FeWG z1&>N&@D5Y%LQ`&v)&9%x#56%D%zFn9U?WQ(VGB2mT9u1PsTfajOxYIen2gD}+P2$& zPawyZ2Vk-joxq53J>%_~JcGFrQ$t?JDwwc4_cB?p&88E@25rTgtrRNKl%s?c8m9B8 zy~fJ7l_R6(E$1o`C=A*(NA^EQzE3KDeeh5T(UL9kpiTf)R++jUH4U;Jwhgss4_Y{I zw$ByL-!=E?mi#ljwBaT?6#xt^d&-Nat zpG5Ybe|Ij&o5K2zP&Kf;KP7W9*n4Y78JUEN-byZ0gbs=J%(?kRU@k((u7WeQH@g%& zKqgbK4Y^6Pn*RA>cNaU7LCw=YWHwsfk1SGF_ATv=19QtxgpS8@+!8FPiZDrK`J;Ca z{AMLSy#Mp;pq;bGpqlAh>a2=m^1xO4A-4Hm1yl#Sr~aeOAa*RC?HtXEMgPdpR+Scd z^X6%Iy+f$SeOnIoMQEa_7wROLC6|HeO5rI3`w2-~+TRYYUjINUf^^{&;%lX>d=6$6 zA{|WUB%fkkBc$w!dB$jdI$*Mkunimfd$}{;hSABK*-_&LQuBl|vBRfW@DZM?A`>`y zTf0?#@(UN;who4kI66sYBmY=ePWZHtylEFGLN{q6vj~z~M(f}#Inr<$KM6X20tQ@s zMQSOec!cCeIFi6$3VH2r<+-Z$>R{hSE-wU(ZQ!6R=2j=U;{IZl-M+k3f?jQLv4Y+a z9+_}KXK*@;#3XB7v8zH}+++ttc%E@#9MABOOgMy=vET1kFyk)YO|IhLdS23b6%24; zhdVg8A|4_A-L%22)}6O$*xu|fmIz{MPn8>{bb_d6G3;QBc{w82kn8Q~eX!`utCn$a zui56Q)v&l*C0-O47)cadbN=enc_p8INuU5vrni1^+Md08s*XX+Qsa$vR{pfwFN<7b zA!K0-=(n}wa|@%3m&;M6<1mA}yQU<(Z8}`=;OykyrV0Y`37(I~b3`$7c_uddnOLY! z1l6nGzSf$WtXrSIWS0OxyJO10Gj2FT%6*T`>s>CUoAiTI961#Jt-!+OR^diBk}vO8?x9Pw($eZm(3u z*TcfJcofq|fYq+%ds45aeEJh#mW?m-8Y(gi2dXO~dwKhQf3eIY&V3wPmPb8(E;I!z zw#Al5&}1RIaBnh0ju1vy>=0=5$Gt^Y!|ixOuhB_Z19bipd+1X&9Q`gi1HUKfSqSH+ zvls?p{=wPBONqON6+*+FilzgBDzM~>Tt9IY(epv7;7FxwBkvK7k<(uO*(l_)8$^37 z?Wggoc>`*x&=e?vNEA7RB(T?OuWwHM+TCAg!Q!Yz0Uh(X*miqmr(|$65nqh0H9AMF z^xf}uyfiGUi>cA4Fno~ywNUP_p4J0-*|T}S^qFHa{4Vkb4OFhclmX?!QHQQjBkrM8 zh31VKY5uaW5v_BBKjWm+y>rvgsrHJCvFR?w# zZuQGw&MQp>3zyNN=hsfM^~@XFQ!Qy;=a9;WvsxQo#$u6$XKtwhHIC8cQC$E7lxPyY zJ7TIuf9>pG^^Yp8RkF8u##2Wkox>hEyh-yd{iF2Aa>ApNb|YbDSHb63=D!+1I#dx- z^CxI(LmIHu4u}@0YGPNtuUfx=bX|`YZL(YN&d?h6WrtD0NYY+>X6f^S+#Lu^gsV_5 zl)91Pa{Q3r3MA|+N675_Zd)hT9DCfy;C|fL^hlawBV5W4fh@B0C9(`8^y!v#`N#Qe zd1lZ;X7>wp`^x>EIMxLedLRwqF*y|m1uyD$9sS*0FRmE`A7U8E|8JxI??^)BI!$%h z9WI7}cv>pB;d6<~0ID7%z9ZaAUD~?Kp|HI!n!0@&=2%{1b7zQATb}FJ&#e8Lr`q|x z*<%<${X9&i*?p6;m@F8Rn<#2#BtShHHwXd? z?VAr!aJ{omMo2@sXNUC7&^agFf1DaU`*brhJVj_RKZN@c+PrFuNOdlMSg%&aBGaft zb(tq-8)&zJ_Vp3+SXePVKzEW+rKT(NwiN{2$n{=AjkoPcspj{;Qw8in|6&Db-!Wti z7v1V>HdoK$1@zG0|0ueTb=uN8SzpcF{w@js-*fyOB#9r)Z+~Z6Jj?xywK^T}q5kac zRV>%8=h|PatNee5l=9C20iojpIH_DPzn5teox6J5|at`+lA4d z;5$wu(!W^5?faDFyQKG)lB6%s>rYH>F?e4ITYHW^y0$$Mch_mH{puG6Bhdb5Ghw>_ zd!+iz2D5PDJ%$|Fot;tiG!1j=RP@ZM-<>)YF6n_T&y{(MMC)WlI9QUjNGyl$M z@@MDTwOXq;$_PMXw)%8C;Qv}Y>59ey`Bw5QP2s#)QXnIeFs54f(VYKmTn61CNF?nq z)-LJDb?-f+%CKJ?_tTvmf6XCna`4e|#WW#`ad$}H$0uN;#a7tkp3`TPT5$MQqS!&e zveP0^nA(s)7ObJ{=wl=RSnO&^3()9-D)$tsE=G6mZCcSg^c-#a7FH9>z-j#L%q>kq z9AuVt)gqxmTfT>1%SEjI#nLEvjny6pQykPM6<+WJx*bw^3?L;C~go3ZaE z{z(A)m%--E(EfHkGRlHe&gp=eke4@^0TCD@5TL%5h%_;K7s#3WesZtsR@J=Bi@xir zedJe#aJYKy+zca?vAS_{_LtTq370lq*Qw_3h=kq9uHtwCQtJ9ER*KD2@7*GEu-^KX zVZzj0o^_7>@HRE`WMf9%c(KwktgfY9Rd5f2DV9)}B|J=o@@e%VxqK28u_gVtcCU3- zW_o+kRET7j(O2J2TOQ65%3%P^(=V>lVraI6U%SymUZfPiP9jqADRM34Xbj!@VEC)E z@KzcLeJu;nV~>894RF69l+8dfC;rfdrnxT+2ZD|nYm1TJk9jl0%nq6u@AqYzrIv`! zY6?SYi^q;FCzSBm_xjxMi=fkv3ywR+?Ma)^s#PRw&mBD~o94BnMT1);^ZF=k+1^nx zyPGWTZG2hOcsNW~>4*tFFjR6Ajp#OghWzMB6+TdftM9T^OoH`k`bS>Z5jA(+N?v}` z(TtlE0GtzDmeIQ$wd4u|U?aR-)ffmm5rgLZ4BJPeb_zN8=Z}_6=u}!5GelK4$XDK0 zqv)s@e>B#(UrL-v7B+9JZkwpp?iqr*QeD$N;bxkss(9xNpza6sg84bcV|-QKbMNH_ zsd?QA){An{xpo-~UAvWU2R-%g{n z)BfWl6J_tlzgSzdUB%XA*5Gfr0>LTMm>KCkeSdG z4+7i7C=#|HiDr~dO$JZ(?d)tn=LM4Pxm8Ol<946x!eXEWo1+<#O5I+Eo%TFiY*G74 z7TBOi?^IV;c_22%l2i#UtwZ`9UejIFZXp_53-WEVlcFY=uO-J$>(pC8aWf*IHszO|H4oUv6&B zoq?f_x+!m@k;qWmBbDQk2*rdq4Oh7%H`uHODH5zDYstmfu4fY zEWXWqq#QM&U6}^H3MpROn+qR?u7$9T=+0#gJY@ou)Z)B~Rd(FnQ(JzZxfx04Y=wt9 zlXZ*IU#zw8c8D!{d2w=~DFK`UI+sxl{)XWoH<0Q_;8S<9Ju*uAhrjh7oQVHHJ^wkN zl>?Y}h<=H`Cc*@n(S-`v!M@G9@lDS0B3${sZ6=2R3o49Mr8#__xqsd^=ObZWf{M)J z+i{_vRE$5*f0bhq2V;~`tzojnzrIr8FH?l}y3>pqe#WWW5h)F2S?&S{hk4<(MkJz%t+61%B zj}I8Gf7YvFttOW^rc>4Pvrp_^Xh)A@SX~%ZrgqfkPE+XG9h(s0->m&|?) zCr_7=*?I_Tm;Kc3yR6X^qEwNOBKa!cD<5)B-UtN2O|lNqBM3;#QiJ*E25#DH-p7VB zmq3X^ebPc^?Bse?L9#Lq-x9a@kKpu(m+H!Zuxf&DTlG96Q&?nd)ue zZ~`0lyU(XtG@lzYsqJ!9)Q z4)37hjpu{h!rLWtW10>i?k9_ZZ7cB9Rc@~`UIgBygOFzn{N52HiL-XpoWZ5;Yv?fU zC8%T)qul@#_9z&#(g?QL*?1i)QdfWtnvTWZYs;|dtz9RW@PkXZpXb+LQK`1gV|NB5-KvBADhlFb1eiG=3@0+ z>=$73MeUk7wyD8B{*1_Hmpk8*n3)6fdClNPDUjPI1&f{Ztq(6xrZ|z1tTveUM0Ne(vGq{a)zA-A_L$LBWXbH!X#4KB-{xC*)U2370;rtl z(~|Gc^2qzJY%k$pLI)+H-0!|fn5d;?U;hD5i>BU%QzobOyml z6?#f7FTLi?N3}7WX^}+Nbz$5pkS5972XsD^!8s2T;I`VdAx=YR~na41F(m;j8++ZG{to=;He-7b>B=r%Ej0pr7v% z$4RC*nb2bA*LSNiOhN3?{Vx zS_)dBX6oXSNi!TQMo%>ruL#e@#SV1)TgzKK5Ti!Zy=5F`EguT~>Av?}gP+E(+I_W0 zrwc2-Mgm7>YfqaHv(2=!FLUyKh>3LDJM@(oviNu*0BXjsx*x~7H#8o8(F<0|n`58Z z(fr}f(F^At)=K7kfORHsQ2Mqu7M36fIFHQs))tgB3|Wd876$urSsGWb&^ub=rCe>5 z<9eSS9r|OOkCGM0-8 zSMb2KUge9GE*Dal%~}AD#8T%VpPqS8-6La+-a1*tuyFq9yL2CuEsoSVrWxyx|46OL zKlW$102L#imh7iEi#<&*yrxfVe_<(Vv1w=LDt6hP{S5LVdhP0-j`Zy}bH0XLCd4Oq zzG?e());}tbh@P1HDC3=PK`IGV(ry^q=bOsf3co6m~+w*Jr@dxA`g;^OBHBY4d&>$ z7rSTD4ja&84(FpG*`!m_VlKURb63kAjjecW-U0PfVyiU*ia|mrdyNN97yd-lNx?jI zN6#EKOp#N|(6NJ3gpo*WXI#AlbQS8?a(e}@c=XcUkyVbK5DO>4$dN1jmeDyq4V*1F zSZD=zq@?xvJ|#tq`yNUX%fb66Zski-8#R0RfLX(^a)~#|h_6jk;65o-4+-E_0LU)p zTzuNrrtR!9doj?vJq-3dP$`T&v|Mx1_sZ@e;dDDU)$PW2=tkoVWcCE=#8zd(9Rr6& zIXV61$_nYQ2(koSR4k{uBm$d)l6oU~9UFHExRg8t1FVZH;jD z?CQAXCf7ucZJ$nidUYHA5AG+R16vt`$?SB}o3oF8GqpZKZWj>1F!?=Wa^>DqSLA?Y zaoNw7-AnS-Ry%O=OfX8+@nw`9@jiOlvoxwriIAfG(Lc!)Hy51?%&R=!zk+6#vW<)I zP-k(InrZc(N3uuUk8pIK@fYQ!S=&&V(ftqZRhLh82@CR(jw+W;>F>{fy3o6{3irDr zYz9-c;eA^Xbpfpce;j?}31j z)YGeSK-jT=M49mNB=GLx9!F2_YG<A7@<|JQSWSzvp@&>;k0S zFShT2*>T1DH-pjx0o0cZ$alA*><=b<+TjarF*fCr!n?!vj)OacK-=mMvS0~MAS7ez z^m>PIFrch4<~BJE+>VT~Rv8~QVGzgBW@$K^W%EcHsxqUNi(#+1%YXXY=_}3ms;g9g zz%HtVf4i=w0G9K>{rvU?Mr^DbnLZila!KPgYwMg`^iejX(I?Nkmw|t3R1TAH;0*)69c)p^4?XzhC+@(}BmPn6k>Cl%I=&_xv3rtd^a#x)w_^^1y}6 zm<0@0gEoLVimy^`4%YS7QWQeWRrKFq+mLhQ$&+Rz9lctCBR}q%ooj3JObp7=xJBis z4S}PgQG~7piv>O;3zkM4Ei&3%Et;J1=6kMf2&P75%p%7{b@|>BDrg@MK zM~$Aor6s?MsWGFe7*vr*F!8t8)O@&nRNhiH|D#3yr=@Ra_Fbw5qI8`rwi^xFDn!)cB3U?E zwOPQFT44RixQ81^yqU`QYG@Kc9>12HC%ilV_EofF_ksU+l4@2bRVLlk`J@KLE_UK( zz{w@&+SQS%&^^nwZJ}Y<V3HA)10N;vI@Rq`rM8Hw*k>VvYB@6@0g_>P7LCz*+}?i?m2|~(er-&{4+1ORwXk#C#%Sh>0)|pB0201#osgH z?R1bzmA@$+T3lK@NWRmxvu9n9oAIQmd{Ub}{^Jzt)b6sT-9(Lvw78m<_0Y?Y=JmJo zZtj7BEeeC}+L%z)j5fOO>Y9T|M;1`7O&^1ZWTh5m${do1d3rRtKk8USWKet6X@xVZ zJJN=nh@@O*_9+L*i!d|qh_;8j7T#fBrncKIrw)G|9goIgAjb3(%UX~r&zR=jPk)AM zT;VG5vBz}}B)#*keIZna<$O=Hk}H#p9}_P;b+Y&1WqGyzB$d(CH&kV%{`hXSbt?$u zMe7D4j#bjL!L({^6O%Xmtp@Zb#WOX2=Y1r;hv3+efJgE;->}NIMe7xdl)UkyqhGs+hO84$`t_|xH*!i#r_IR4fD|f^YOTD{LWnInftn@U z$UsKZ;p&6Ylx(B}&hxvw$1j-+U%;58k7G~Y9ec$2&7d;}HiwixT0cXft#aZNgeph! zXP3Xux=vs~4w|~dT{jAopBWJka5JozR&D{LflohbpSympphPo98BH(MR6S^4<*#zs z2@)o>=;ooGMsX2B(vn=AcL2lh%bAe^x{XbS0dw^kMNg+1^J(G_Nc>rqUt|rv{Msvz zSkc-KpOC+7@x6ac;Ctn#u9-C=JW`i}UC2jn0Wx>(r?%(vc4LnA4N7Z|>>Qq-oqmHP zoD3YrxO;l|65#>XUZm}xKZ7;RW zr`yz2s#M0(5gH06Av&_U%0kmL?}>R1yw2=WhTc@;%-HL^6%`+g7Jd{hRX~dg3^Cf> z|A`fYe)$TVG&6yGS;kR6;E4vE)jFWj5F?d%_*8VU)ywz0GzaH=!%%e#P<7(6V<1?W zbuBGJ2pz|?u8OZ5w0XobJ!?951pJNj(=40PT3a?;8tb)yVJG=ttWZ807C`~3pO2T- zy`bbbT5DpAy_M{bIcc_*7Fmose#2bxE7%M?6@u0KnAqLQ6NZ~p89=q@*QX03xTpw3 zw7VL4F;CRDgw?cn@yHx6>MNrp=-k26tfREt1Oi`!y}@%)@N@T2!YV&H!gmr6epFmH zMHGE({I0qFb7D#aDPD6L!ZRY_fzR`7Q;V@UY;uZQg5rUFlvpZWC7sfx8wcW4K*F{U z+cJ*vu5`2b$gS+oyYW;v2@41MD``dR`q|r%T=V|c8U62d=|&UF{pP~{gl9faEni?vL$AN{f8+U3xV2OL`eJ8HkaBwT>U0QC_M&|feC?dkDmL~cJ zvQeZ|B-E({nmFK+UY9E}fYC7L{38aLZG%2qS_iwbh7x7pqb$JG2+mh;#v0YrwW_y@ zi!a^F!0G6Dz%^os4imd&EO*a-EKe)Of8)HE?0D6HyV?Ri{d=@+zdRhf8e4Gg-?IWEll(0upZrpbKMn!RXHUMkq4w$1Wz*8}Az-qqluqoA#NVVgJ!~DqCve(s^ zhBIydOQCeX%iW#kmE!v($|}#<5`pS7cr<~+Q0~B_(7F)4=)9E zD<*myMaJk7C5$_mFh;pUpEkXB0qIh!mI+xsk;I>G53@ciuUr6~BL?_m`~99qvvvO{ z**pasM|Wrj$Sh%>a?zbbOo*EQVig_t)(3Aynx56obJ5)m7T?qFU2EA42-*K2;%-}& zo$?kYhf}k+a%!68oMPLt-?53ns_tS4t?woa>c`qxJuepXfpy;HOup8gw954gdp;S| zPs02r1rZk4n|^IEw{6xKl~LTW+^P{jlVigJr^wIU#zqZOe8}nbqy!08Ibn#cKB6GH zE6JCxFxO=pHXs;$QZ~Ns^y);Faa|=&@F`d+EmK>A%=j>1z5XQGa~bT2_-(%2Rc_}) zzzkkwzdjUps=(E55&kgI;$m#g?Za{Q3MBUOaj)5{t6maCW4!i-J$n1-RXCZ=3=Gh* zg`td=NyAKCEA&>sPS(t<1E{|Cjs0{)IyVQ-Bv>&G* znTpi+FCtB3YmV~ux3+sqLK1I_myNt-Y%UB77!0!_v5G!&B#|~!M(|*ToA2e?Eg38y zPQMt)N|0fzPEjxj$dP=vF*ZR^4oz=-AzT8y`0)wS+QXp(b-*%u9?!meMQp6DndI* zBI-$txD|1@Oxy~3k$Use!(w! zg&UvD=5E4%@pP}WDA^>}e1gKtXY$E$BD8n4)6YG}VSX=0=F)qIC_h|=+=o$g6ZW;H z2|;5NlFkC2y=8Z@61SCnlK+QjvTGZxmh6G$z}y4fOYEw9pJ(>(Zac=!8e) zTecj^hc%%0=+o4c#-tkcs|maC;gS?1R{0qGi#NgacE* zDeE%3Sx$(L^0vm9r*FT6GnX?QVW5B?mOmJu(;o+Y|!UW2q==Yw+> zE}A$D6sMaW=CfK}H`UK5D=<05Ws6kx6>?aB)=3M9Bt%760=!8eWGlnqA|*f{?QK1J4V%CrUUBwsL-%M zjVGc_O3^N(G+NuJ`JpWx0uE2_a-E^YUFp~^=LKpOR%w~}N0vPsgN&Qrpsj7;dsdpp zqrd^IgXcOqT?KFUiuT{WZEh?!f(;#7?7JFJ3L~p!o?dwvbvOsIIbRzSy{c4q1+{zx zxhh0XWroDCt^L%F)zMVQw$&9sA5OGMqY=&UlNV@Qpg5*;>0^m`(D}BPit4RLC#_{Z zJ?sx0#(R5=9d>Gx{0|tk)NwMz8sAe&}H3c>EQk`IiT%X7wiFRK*5)+LbVthKWeIVi$;4 ztvr&Aq2lJGn>+ONgeR*GB6G0#i7=rf)VPAl{rTo4Ademo4Lc{RUF3{}gYEPuCa z1Hwa@lq`t(A7=Vs`j_@j6i1W z40u^aywyVQ-E(*O7g3+RL-8_)$T^I(_57LDNVLV@8`gcu`Ql1Dxv?dTQ-#%lYe6g8 z%Qd#Rk%mfoerDU@n>fZfAxxKGST<> z7G}=ih`m=;cRIF}Rh7d{=;S*kSF;EBknCxLJR170eEzU%ZJkfS&^gi%sj{N>!?M{^ z!~$N@bvsmMPj_!L5OGsz_U=obSsdA%rvCbFi8s@f< zM(Wx5yGI-jjhwE_-APon2M#-R80t)&_+k(>Nf62Jyb+4dgg9A_GzEp>a;Hm0iQx4k z-;6085wyj_%dT`lqotTj4(}g#38%riMT@}=H1UypU&33n492gY#Sb5WuUe@4(fFJgb<$9e!rUOdRPPf^=_bUAeM{Ypdr$f_G z;=A!D(CO;Qer@1{Ak}kHP@`7QxOn`=w0;sE*?nFQpP_)V8Q}+&oyRbpCt$7 zVE5Yhepq^H7l74+5>3vXsP_Y zcP)9rx8}=;O&Iq=1GPPErE9DaYOrD_A~mMVu2PJ&O-up5v>-Q~x3Eh3t$DIPAcphj z)^2YfYUuZZD_s}81x5Lj7~+Q=)9OOfuW7SUfNf9Xob+W@6LE0`+`}hbVmfJ6Q)UU| z_Ms_&*B-0eyjp4#ExI)ghp_UEW#^@F=;@+gXzz|4Cx3v}2wfH8YUy{*o>G5pm;2{*0&S^UIG#A#u>fa7zt_vvh8s??DjrV*WYW;BINy*OSYOhukNu+;)$ z?_sk&{NhtgvM@1F3CB#X)2T)e#o3S1NF1^F+=a&9kM+PY_}1O;BIqD&;;DK91pAj1 ztcF&8ha8Lg#|IcGa{i&s7B1s3wmKfQ+%;0l=0f^qvVfGq4wKa?1J1)f+6k=JnYzNc zbvTa{k{?MW`>FHczy9=e<-OY*CaLY`_R>qQqt2wlFudxGICk}S@_V&CW3L^Wa;eda zzi;sBFU_Fa)wA`rF=@*S=-W$|y1_lzFyfG%=yjl{E)8=rJWrs8EQLdtB*`kQml_7V z6H8#nF1Xcrg}kG#ZxWvT?di1+>ZiEY!_DTdm-zC?Bx0C#`Gr3>r?Gxn3yVZ(4Vu<& z)7^aMJiFW44;mlkV@{7>f}5SLwV*ZkX6)+Es-;Yq@Naih7daMbMs+sa%;$LjbRhm8 zE}^cQ)cWU2G8(xt#)aN1Gsi^l*S5F|+i7j@$-!Mek!4@_g5GVm0LW2Kny;OlvO@f~ z)H<#5(pWza_Prj6^)LF3vBu$$f z*|ZZ|gqdI;M)|vs+PLD+XL9U2Q7%yN53;}su3?f3ttJi;C1JyZiK%#*5F-G|-h(Of zJQy!xv)=(ep!k)P{u5WX^$!KU$}`biw`Ggh1tPM>mKla&`}n{$)Bc% zBph@bhl4me=*48Yu~B11eioqiFU5r1=H>%z%K!ZNZ@8jk_<25fnmdveC)&BQe=2o; ztaH54Xw~ay5P|p0fulCzG!DQ+&veFA$~Q6Q^R@~@?o;oVpA}UXX!^yNAjgay*5ddm zhF|jqeqoL&&L4-3d=h`&UoXmTZ!Aw8+WIF}udFy}Y_8vXR-ygWl)rm6`Qwjj)6y+; zsvf`nEYT1d5P`ose+Rk~4o-@K+^HM;gWv+!s;%CVW+>_0^GJ8fi=o{Kr*Bgy$Md3D_)x0Oh}I6aJUdv%K$jGrq#K)%yPk#P=YZ-wmeZfMO6w^P!*QkbIBOk zZV8BV1*IEDx?xYvmYqTlPt?i&>NOuGr?u_Tlc(#4RW7O1eOk7Lq3XKtte=BnzJ)k!<`w!O>wzOTfNiuCuu2X@+cATxUV|>i?!6$4ySE$3)mGyd{1rri{<1e2Hhz3gVQ^FYh344f;uBol%9yq3A`SIc& zWa652pxX;lY?G{Df(QP=c!0Atb7|<;{ znf)e&0{yY$xt@(66~UDxus~ec9N1qvtcRh?1v!tLeOQUqM0*PNxj)L-1ITmzIE;um zz-m;O&S_kImIwyYkFzlZ5xa=63*yQnt3%ghKZ3ZEjLDphIcFe~byOQxrz^j!!+@~G zF~c3AMKadA(ao-8YuAwgB%w}L$%lhcJ}Dm835t$rA9ou%c4QK3qU8LrQzC>r-c)yJ57wN|uq4)bcGXX8*^ZcbgH%}p4i{p3bbFh8@lb~*T-mVrVtN+>U; zXn@6r)(%r^rY^ws|3VFGc`)1e}w1*YDE0hC%&1b=oeLewKWo9gJ(=A;A6P>%-yb$ z^NyJ3a>^jG2l+>#)Jk2xCDjxRGJf`z6*(ykY1o*+75=|ry@l1uJl#=KLy1_JaaI;D z$de*I0gfS3S6BL_Pfpp5>Jxq?%U;aKNZ*U*s6&G4x2r0)f zw`u2Lu%fb#xPdd-P%9(OCWl`*?qc6>X{Wo2`6W1yo6zD;Dvyj_Y_+luz_vh5V1}*Ctz$&iu$8}5_qKJF#x0IDou}FR2 z_Fn_11_cB9*^&4{n?P(s77 zw$C1?m3xuh@-|c0xk-v3MpM`ARYgn!#fURPjZwl$zTrGRNkbX};yvsN@%(8^>kVk# zAq=H1fJSJ^7mq12VLN3&ba3alTR}Y#u;BWvv}kZn=j|hr-IHrrc-YpkgB8@UY^~hM z0c;oDOx+PtH8oq$e1XxVIB)jEL`4gn>wD8<%w|tzN#8M>tbGXFY|OyllQc z?r7y=@@c4;U%Vb1qHA;y=x%l2RdWQlHYg4ry0PZRLnn2=Y>}>lG^UK9#SAG-x?}I| zHaQvK$7ge$lJq82&4|OrU|1D~oDkvTv7lXraH6u#=K(>#&VNHgs^4u=i%-{RBb%~q zy{J4pcw3K&Rt24SoV3qxRF6OxKnXvZwiQ(uQXhVaenOSr4R5Ldjn?92-+oBIpL1~h ze7OLklwUu6PEIu2BauoX3zk{W3`1T`0fTzB1HV{s4-9ifB{tAPs5{S{_f%EIuDwuY z4^LFk8BHU?Wr@9m1cu7e~xeOgf z)*iJmeYyRxPHPCaSM^{rRt#65fTTPR^Q-)NxBnOGN&CBVx0~Xzt4$xDZT9g$oD7@c z>3jC<@bi+z)~-=+))OESBM5X!h8SZW;TMRQbIYSVAbRl)k@GXg3CVHW5INCvz{Rq4 z;P!Z3SeLYj@McR>QsKBHAGvwm*fDAJVm*<*>p-Hcp2F9!`4s`Nw4ZU8ff&d1?5~}c zv{8^S7}LifRe%&o$Ki>|f>O&csr5(1EtntCC$^mb}mc=UUbOD%pFt0iB;qmccy znrf1?>NaM#*o1?-`1bM^wMz!I8(Ff@mMavhtjL58bxm(CWkB64B5M^{GXCaw>fPSF zj4%6YV72r?wg1!ke_w}jtA?-MW}@`lalVKrI(10>e@*~c{xc20M>{CEmKQW{bxZQ^ z6%Q$Gq&O!l^s{-_FYB&Kp)&u*uEWFvPpHS%1m0$?40ElO{&VFUA}i>L&c7Sz+nJ~P zdb~$DOXnh-s?OVE_a_%joG_WXgx5pIHjJ~*SXh3S(0$us__nY2W?*UdHCdI2Tr9=w z=Y{0HkAkeH~U+blkarAKh+ZSPd)xlZCFuP#`11HB$ z8K*JVJ%0X>wgB~+mv#G#J;S2fPsmko5`GFj_hx@8oSEvPjrG-5nvuDZVNfEHr(L@a z^B~7BPk-hA)-oz|tg|YI+=<9FkmU8K`yH*=1xSawR{aQd7?YRVc;{W{0to(Nn1wex z#P%ddFrV*%euexc)P;&Io`i)Zyv$kD*ou_~cb@Odkly{$?rRgtrlj)8JhC7&=?zUi zVf-4bdXiILqQg)B7^n0}g!yPH-WC}!KsyPmUfW=o1wS~+o?nx%j?Ib2vcr6%P(ob~ z&G;b-8UBEdr)hf>Qf*!*(vy(U5#*{lR5sCIS0?DQoMw9GW)Gg{~{v4+Bz7N+SR%KZo&I`iE zGFK_g;*8{AAg#v*a3xf9pb-gSvk3hGY+nq@YG&%cKe8fSOyif_0Q4*?I1;7+X=2nU ziS=AS*3^c@QNr;E<$q&t*8G%In+J*Kz(w=H!QE>=T~_J*X-g+EE9Vb}!ATEVk6*RJ z#KHc@KaoCOIwvhH_Aom=@cx~p712^tIXt!b+`kdI$uD+C*C&{#QvE_tk5Kx#TFhv>M+>WMo*gt)`0GJHoiDYi(;wHL8XqlTiqjED14s??!bCd$=^4$VLy zIM_G@Y?E9Fy$$aqM<9Fy`6 zt|+%YNW1el3uq(`SRii^Uxn4zx@%sIpDW=EhiYp)OQiXp9I3+lA*Sy_YanXK?dNHI zvxN%wTGcqf22K^iUh_KVt3$3u(6p7H;&5lhqH$LL%`seg$-I;+pD3E z9|%OtRAffMw-HP8c)=L*+S@H_`88>6alwcs5}M8AeGZSLdTJ1zcfEeZRB2A0b6a3- zdfZbs*MO(H1?h2`T9Y>)Wt;EkaQVB64|jIkzEx+V{q!zRdiuPBw>A!%3D?TR?&+<> zBcezdHgrlwg)=LC-`$6olqv|pi7gKn6I|Ix$CXWVZXY&v{Sig&=X?HX5|^an!gZfI zfw(QzLsTB25s%_T`@g|CkBp0NjLr{J9h_oD8UvW_3ABvX@+@LFQJ~H<4<0UG8csTm zu#v|jo)ATXwr}ndhKtqaygzuJrqYFS!9Cndz!z5uydb6F%lz=+7H;`fmI@5GOw(GsW3EC$}v!{CnCkYA<0Fa1UmtTdQ2}G<;0x$ZaPs6si+~5F>JfOGcz}R`upMu ziEhwx>T_q(87uEsf;?8&va|F+eCIzRbZqi4{F@kvE3MTV&A2 z^^F14==kM#NkqV%iPjw@x;;|=fL7up1ojupaP(Rt|C+zLuEI5jl;@W29SHj+%$cp+ zHnR|tRykmRiqn5-aEyNohG}2;>LbW{3L1j!a3(Wm6}cz-?b!rB%tV&XW+XHPPghp0 z9r&qZ1xwQcWA^myR%LePE)42|=;;4QFphB;xyjZ~VhM3;wl=xG3 z8z>^pmK70QY6qp>t^=eZcMbRWS`K0!lz+QkD!$}1h^?4+nw9lph_2IH9{v3gH9fIs zAP%e;dhub^yMwgSK}2|+%4n_1w%myoe|(C3>d&YzyZBG>mn)J^JCj-Y*;rtoZ>QHJ zfw6te`oUAemeLx>JWm{+T1ntb5_P&=GiJwH*<sGmmpAQoHX8ypL;WSjiPS_YmPTDT23i*Hgbi zWncHqySDGTcEN}Td3{T|E``@9|8f87U1!DJC!mjk+5tO12U3}`hnpRrbHw9W#Z?9q z_!}u37;`tGsv~=SW%$s25*}CYQe~`hcYb!~4Pnk>Z_eSJ6k*xG!QtAL=;2UsrM|Km zvf8wZ=1FSHTzRrLb~Kbc^T}B_+uGaR7_9eCqar{-ymIpXLmNk-v87s&M{G=IrsvY+ zH^$-Sm0DQ&BS)#;BSQIn{PUJn4B!90ZrL%PELwC)Ax=unT1<2tS@!b>-;GG60G_|D zDa?-C87tW#ry7Ul{JDVu3&UO@lFv+d;%{_RN!k&P;DL5grCD1jm9kxrKo_jiflmy~ zGyd)RKQ!C&0GE@?7Stkb25!jbA~Fs(Co32sF*e>@(}aOWuP#t=nrRB@@N{wvY=Ky( z?t*vM8O(I9@Y^cn=j?{k_8iBId&MoL&xID+`I&@1ikUot<6ry%Ew|u;FiQ{&Ebicj zAk8Eh_1sbtj8zz9vJ{y^u-JO@U|x{3*YtQQpfdKHl37igS&&DiImDLlPI@iKvT+Ml z{%OsInO>Tfd++WOdvKnzz4a#x3@?jw8(J=_9xR9i^BbLY^Hy3Exi?blvkA>&>xY4x zD&q9_NR&xE&7=Cwq6AdF+S&sc>QE-iBCp#kk0?ig&MvowPT9+g`6!GGvDnB?;?-@J z4IzQSk)-WIs61(z`ghbxz6zj%t{>HZFYEJqNYLt=#2GO_(iQ?$fgrQzIPE?nplvjm1ZN^aS#-Ng5*(k-HD4HIv z&1+Ooa$ZtCz6nDCOYiG6JyL_QdEvYJ-v7{CQ0w@5PT!~FJ0Bk{4fX`8M_rh;q6UEU z4|&_)ri=a=GBhl7qhIv7>e#BE2?Nn;18Il?l>$}X2ddy=e#U>%e6C9<6{!7Qj(HaF zw%kKX>Y-=vRSA!I9E-?;T`3PH6R9138klt0i~MD>WkyRFs&&wcNQIFCcKZv}W%1Gf zU?Q#%>S2BP_jr}}WEzFvnA~}qq4jz-qgo{<`=+6_D!vI5d&^GJjLr$`ZA}UVWa=a+ zwKsv76DF&Lr5{;ygeIOpIaJvP9G;)0Dz!OushOb(2H9lP$oyScFtrU97H8U;@^01& z_%}7^UR})6?6%L?wgbZwxBNd@XHCfm^#UXNN?!4y4B^alwq9VutPVdSI$uX4S0KfN zV6e0K@Th}sE&Ye4Zmb zH5qcbS@qv7Z+bP+s#@qu4Bbf-_;h&rF(cr)V8`gDNu5ZD=9S2B8jx*PHC9c<=+Ke5 zG2eo7Raz2|_iO=wt)A_Xv=l*MAtBq^*sPqqY4qGfFXn^u z_L{{gqqQ93*I3QgU$_nEO&}GsktQi1hj%z-rJqj3#n0HaBvK{$xz*s4kgvUT# zso_26CebSEpMrU?geBIE;cqD(k5a_^rWf-*n11RFxNt$7_an*rwerivXq}E8%K;=v z16rhkH*gCZgL^Y4Ho&sCdX~p$yp_JAXPIp~zU$>mz?t4cK>XOGb55V@02H1rq2Ney zTktX=aesSulK1z*YK^E?c|hhvXJ<{T+0vq7%)~}ZYuRWpwgug%mvpgxNWf#IXfWa! z-xoIMKh}66Fd8~uqJ^A3iK#W#cHM&ZF^MK&{L1<c{q8ih0^|qqMexm zQEGbQnVQ^(a<*z2Adk*Z9&7$L2BoZRhSIt(`_TFVV&&EucVQd*wT+)Fd82v@5^1C6Nz~D{ z6DV3tdX*Lv7a~9={HyuCz=-}eo3XDbVTfAqQnag~hf22Ygy>aaezrd>e6gBQ_GNBU zSZc8n$DC4PEUHKBGxR+IhQ{w3>(N^Q>Rr$H;BZpH8&gsf7}RY+KO$>h$@I)TV+h|l z9wVUy)CwW!3wbqcr`{~>!U*vH+^#OLXUYzWY@|^FNBwELQx&p+@^anO?dsp@s+AGwLPLm^^7!!2sUh$nAZ9W|2 zM)MjscL?&e?!}+Uj7X)$thfW{u>6^o|HM~*aZcs!ZHN_X0_Zsw=&SG7^3?7ilx$N< zw@lZGee6M0WK|l%D}CyF8@$zj$W^Odwdfg*Z52EKGebp{Ia$v}el*|M zJcLNVexQ|a!22>_gT~BhLd=SJ52-p3pCkV)-B%Apo&#P5$@uPXOGvCQs#rfJw9fD4 z7%mL0zW=NF=ZBSZmj-FYlHk?Cupm5{UHgL|I=yQ=UCAMkL( zm3HUBZfhvh1mct+()yFNvzK*HjP_nsqwH~y6@(i!l&7e*rC56TDY4O|tY9%?L&#NQ zGpI65SVkn(dDjFA(0I@XYFYP7=PZltztDcrpc|(+`y-S`pDGlFb5%ZLr)Row`i8MQ zRXs`<=ObQ@72TKFi)9-;h5lv-LWacpDTLK2)=-#;T0(7{U+ObLT-hexj9yWHjmj>n z@p)n2>xicf)S2AM%uBIv+yfHu>0ohW44r0?x7fxw!XJcK%z>Y?jyuT)|({H_o{wW9kju(H}0p zy?#BveV1`9)@vvJqVkNqPBCQ24vRo)!=f3VXgFUIRRkOJt)?jl@E=-3zzkFG8$J<& zWBH3uiljtkdBa~&UoGuZ!QKz&^ta-_!Z1e#Mb!g%mpZbuMwN*{$a9S_C#~I27q|TT z?jq=e-!7nj1M~0eUOh~gfVi{1NWH?pMte?9OiF@A+l29HK`I$Lq&E{c#LU=p;%#wX zxzG<=>jm$jsBo`L)_X?8_7`2pnk^>*LvG^ z!=iC)>&kdF(FF=uCL{`HDy>{cB*mC4^(R)>8GF_S>-{dBjrO~!7r2)|NmA~7?pgn9 zZsr@mT+Wd&9oCD9wFX0rQ)$`B_HfT%O@|ADckGC3{l`@$kNC0WJUDJGr3cncndHw2 zMYaB^HJwbfq|TD7wAkWwT0S?SCexFh-4+j&C~bZBqWMeYm)dSNZ)^Qsh5rrQrESaM z_hVj4@-M@TmD${is+mRD$e>otrV`>-j5#o3gJ8C$73#irCO~kew`(xAnI5w~SK-RA zb0VZ*94T0K?(Z4(>fLq2+8p3}Z9V^rkHNYz7h@g`_ z=hLie^vLAO&{NzooztBN7+Nw+Hl*Rq&0*SNQzvY8SnI6NA+2_W@ywOE=5yLkL{TJu z_u4AV(SKRUhaGf4H1Fw?=~Ou%gyCdUW>XMl<4RY#)90g)xQBDh2|HMhyB&Ggf!R$h z6Aoiy6Qy6({A%evLt{4tS&}qGBir!O-t3n1#bNb-X12fK?But(t9=+gU44k^NSZPv z4s~Y0ZBJLK8rMgmvmR3=0y<;0P?ZHc(*eTACn;K$mNo6YE?eKV*Bo-zfkG`g?Cvtv z9z$b=?1rYpux01=0-aG2UFYAY1{6kzsbmWHsU(|;;?K%H1a~H^IJ!PAdSh1{DP3JM zM3>EWI?;t(rn%XT-F6beqcnO?jA6OWu(IVX)CdDwo;+ip2nahoVcr?=;jaQ8+_*i^ zvoJqj%Cl42$j>ndWv3qTl+rD@S~BU(L3QMI(;e!;Go` zC{g9~-c6S;71f;U3-nJ~*SE1PAuS_2)hxt+qk)dY^E=EOAz!cP{IXZuO@qA8UQ-Ae zR;8XMPnTU>fb(U`=zpFPt{-TdM5aOV_)YpBd-Mxd_%NBg#>=ySr2ZkP2PwsP3jEkM z^BS1TfB}}>Iccy)nkVd2e*UDx;fvmZ5;lt8{!=T~F-Q$}Jaxt2096h8f*d+aDfbK2 z`tPQ$UQx_}I$cB63cC?##rczZRQEs4D|1L@lA6DKRj2Xjnn>9D=~KOgF|la<(5Bo3-T(wvsKh52`Z0n!4LI&(Lw- ze2fvOJRelE;YKJk?XbS7t0XdcONJwv%KT2XG*3P3cU35jDVYOS>YqIsD>U+tc%DE9 zxfwOZG*0rX;VbGO5R7!C9FV=Ua0wDZliB+_kU}hq$r;{I|$^G+B^`K7V zMDO@Ws|xEy6@luE8tQk2Btit&{EvJcrY6sRRev&#$#78N(+%J7bq0GDf_{9B8A+?s z#0eP=p9Dli1Lwp81R?4PIkqG&-hIcKXPoYvPeURKxqL({8D(-tSFX%0R>`tW! z`c?6&NdK-qHwL9kzbc`x1_S*YtDgo}lS>O|rvJ~v`y8JYVgB#waP|27D}!;=#FJV_ zb_ojJ>^p7om%V{``>afNLT)bt+hNV5Qnz@Mu!uSQ4Slga;vpdw(qwD~q&xJ^Un4`@ z=A%;k*f}=oHo9N@AOscnwpwC^vjru7Vv*eWxB9kmc@xvkg3wRiw1*A{K+!5Q--rHL|~l8S*E{@Nn&+3W(+DzVjq_T9(g$74=jet z16_ivXID7@1M#df*HN=6S7}U7?o2cO_WHC`90?T(pV&hbzcwVm}wT0UxG-POn3 zUIF`3?cwxgaG&lZ z?LV|m+hdWZn4O_xXk6pgZ{OL_HGyr+G^Eb`f=EIF6H=~8;+aFn!hE(WTgBsjx~Ze& z?jERP3)p-iY!MwlwyKm4JGekz$09f9x1LC+YdK_fqiLHI8T|4-&li(}Y`8 z7AGnBk=?_6{mKxQH+t=H1LgNyaoON18*SGd0g26~S{3$I0e8!tC}b16`c}W3%^(~Z zxW4{}me92pFnsnTFAd&EaWx@zd{+9h7A_w>tXL|%WP8zeMv61k#Vop1+CGM8x$+h& zfkhiPt;_Nqw2RP;m zPnvBf4x`@lgyLStJeJ^#6N})g`MEy8O(IN!FFZ~Bt)-!ZDF`V%c9v+jE)o|;ZFwGQ zB?#kGo85Vsf4@~(ZXfO-#@amZ)=PS5I*%1QkV5!xx~ z+uCe|NQS!Tk))SWed6D&dl7g|T-)6gXpTIZ-81V!5s20+1>@*)_STIN<_YJv}YG zKKa+cxzsldX*X$PA~Qm=(FNLbb2EX>Z}T^MDq=)U-B?gc=u-bbOB3yz9p3fKQ;dZ=JJN4~Qcy<|-|B`8J zt8cEROy{oBKA?|SXrbd3qs&!U`>vR#qGKwA&kEHq{P!!W#S#;}<%ho{BSYQqQ{9_I z$Dp@_VK_zpq0*&ybc6;}Yh^WuvF;zHB#-f;1l(eI(XgdWf_bhE9CCSWjctwJrPVGa zq?o>o=aQE4zp;x3lbS~bx|?KwX-7fXzHcQ6k<~(;Ta%^K=*nM@o~gaGMp?IB!$)WmzZxSP!f|+o z5SWbL;LLE*keUgVnn3iF&{8zAuOHdcQmm;Ad@CCjUdCn6pxPzUa^AWREGtvLu<0-} z&i_m6;nf}4z~2CO zaisJCFaF#@Z5Ye*XJ|o!MY#R9KoJ&e6xb-)Q;ZJ&_F?hMu9F>^+^e_6z5AiVtKt$F z_mrZmp;w~bY#zJaJ2~Xj8>A)*I%y9)^KqDoN@uD0et1KaKAZ(B*nSTb4T43Q(Iu9} z77BEq5tL@Gf0S(WDe5P?^Tq``c$)3U5U+0O8TfR~B_%eK;W{cd`-L&!4}J0V&pNv` zBLxe%XDo!WIJOvJq{_^NrM`uAK!3^~uh;8MUEOVZXiPt4;*~`an(~Z&+cl6%xIP30 z+jr$0d_JqRXnR!#!tzxpOOz?}fy%sqCiS>u)l3DLtWxK1ib}uvTQ69Fo|+^+AvaKN z!t&nlWRVPKRTRNDRj%5BV#0;Cc!V``cAt6{x>6u;d^13ToqDX~G(|xeg>Iafqfd9r zT2}A6PQGArzf3Sen;ZnDeMHj(^X93%;kjFF{rF(|RHH=`Vt|$O{LwD%YV@wpb(0HA zRU#ENynZclW*3FS9lcsw+*9cB9X~^ zwMO#gFm(^Q)Pu!^fXTjP3xQZR`D5ptT>3{Pm@Oo2i8*8_^80wX>{v%%yk7pMYK63! zR>aRldpFHoqAO-6-RC{SY9NMXTz?)mO3R8OYDv;@RJr%X^~L%oC2?-_V;i(rgjj=? zNC)BEtwlBD<-w!I6-V*wDwKC&7&I{cRHmA_>(y^@2<PxZJoxVGr=)BME>>GGs+MkM!Gkkh2vrg2nOik(RUU?6L!Ga^o~WVpa512Z2qvGq z>jvZ-=zD_~F=0w|eG(w-8K*U+*c9KbFLN#DINjI7-bh~|x*l$Iiuw1MPT>4WXzavs>m)$OvQd=W+qo?CK zjy)q4cfxmTWJrUGAWQu@M3%^dWB%>Q8a`0&+3;L^q$Rr%tU%U4g zNIrzA^piAVIzW2w^faB)*H=p+L&)G@5}q5GV&$A6w?s=}+Y!s;WgViwa;%za)5ZFb zVzBK@R`On;BG~Bw16Go9Tng>qPnQjy>~XlwMx5O6b}|TW?RP4BtjbCUBf<3$)9z}f zEatF3(qgQu9@;r3L_DX6>p!Z%AJ_aohAHrjo8_GVM{0Sm*Kco>!8SE_cC)>{@Gy1F z8JXL{;>yyih;odkm^FyC^{vM(@$iwC!TynhFeZxxn4=w^Gih3lqnht#!Dg=+xeNgW}g0ER)5XAV5r(rUcrYn}S>X)(^#hQv(`s?*Hj>6X~x` zf$Nk7z3t+enoAO}jGW)MOnogC_qGI)$j{|jvMf6OT*dd~D);(PskEmPkKv_fdZHya zb^DA?Hg)#zUfQzsX{o9Aug~@##7W8^IY%aaa%7gmvmDe4Z^}!41`WPJFPi;eXUYqN zlrs_DWb0kw=uXvZ`$?)VYzboxiV|&@a`Fo6D4E!P(OxpLbaZ?CxKse9GxCc4g8Y+D zPKUKHx&2JNQ5-jLZQHm_`AQzNp zv`N&jRehyx_3$6sx=%nKegH||+VM*4{N%xw_LV7J;N#pq&JjwoCDZ2S7K-b)eyF@u z!IUE4S&vuyD=-k5*YU{uqOK)o8Q~D-=$N2bkai=Qcpm#HdP86ZLr0Q;qmeVYM$?vK zOyx>g#?z6nDInXmz`bCtkIFWKqOW&^Hnxs)Li98U-VT#mHtv{0*9vSyx4&cK&#kF3 zO-F=4V47j7!x5Gt)=d1T}vC#Ec_df@XdEmbbMndoUKuIr{+4E|R4672J=2x}<|3~Z#k;FLsBUTpe z9Ic-G;v8{8g+$KY!$+1DEK#|r0aviqLtK_imqj$k`uQK_m;Q9}sw!?>T|ZkHJe-^C zTOR2Kz3-I_R;c#1NV(1L7?J1pN|Uygoxzzc+Di(8%&zQ%AR*StXUk!?<%Wduc6g1n z!fm;qYQ&g1q7KV}hExJsikc;W0l0%l^z>=7pmFB0|#1dCB!sD%*h)N zq(7A$dv9gK7u^hF9gLq-t>jPd>`>u4{aDoj>xL|W5uU!w8-8L}Y$Eajr2&Q#%iCD< zU_Y(kD(}p_nh3~mVFlHGhGDOJrgi>~K6j#vwWXC6e(U;tPOGBS~Xiw z2`+lz=3L2^J2O0c>>82$i(DFKz-|tc6xCGt+dFSca>5hwnVXzi(Ri{srRq*A49w_Q zcgHPa*XW#bC59?X7RF7bqx6fd<5~uK%nTmMC!i8<*!u zB*jILmKkAkg2Y#bpWc#Jr;=DM$64Vu~H1D4I7)Fi$TbOVC=&W5KNl9HBK* z2d{F*Ubjn<7-Qo}(&DSvq7a8=X>n#K4&Y%bmlOi3Jo=!hoa)l49hZ zHy1OID`(g0DZ4DF?&bg-UcnPyW0j3ReW=O`vH&X-GJVC4&3J0@=BOy9aT(tSgsO6S zF^2CfloN9!rG#kEpqw)UsgrG#a6M56w3%34wq9H`>zoOpa^`jwpI(eh^op=!gDgIf z9CLbee$;rSe5^LA3-^F_gAS+Ta z&9?isd32pT`LWzWw6@)kpECo#E-$;jqR=6Z)b*r|^T5BM%=Pw_bcJodo@i z7kwtt*Qv$Z0$JRpUy@dDUS?vkMrhG7+M8?l5;|QYNuah6U?vlp97*7_!2n?~PceJD_LG7b9Awu)Xc2AG2ORr5GvR zk*5w}B^!J0*Ea`%5Wg!G(u$ac>ul*8SXq~awZ}V-PPJ&}%hF6^47?o}oL)GnbL+0q z3{SQB%X{FWSV-5vejl8K2>?g)+1va=v8s%+rP9hTAITGJS;LVtE*Rt=6@9#Lp>%~| zrB!`$ano|i>iYI)6{)nbzO5hDBi;9#@|Pz2$U}Z$#Pl_y|FR!dWiW4r3rKc_oBe1Jv=k%|1O{|)sp4Mpu0(7_58`K3-D(Hg?z zMI6HAX0)Gwdp#vkOH6c2(??A>_<2~RqivqTTKlanft08ho9n_TTNkgV{7=4J&EfpE z-&1dvRt^9P87J-~ltWxoO6Gl#Ms5|{?QF$)RvVe}t@)pa`T7?7GkG*G2%Rlt7GrJl z47%nm@1Fk8pmBF-Ky|cxq%YQ~;WN*IempOZ3bT8DuC!CwEJnSZUxDj^U@S;rbdI12 z!FLeP*$3$l+e-@F&ZXtcnbqFy_&FcK#=b_}n{zL-Dk!~fjfu5*x^KF{No2ngJo${A zC0?_;8LTSLBl#qPry(oL;^0>4eA;s8svM^!9QUDiV>o_^E7dz!9H3@$V__6W3_}%H zWE9702}!8BR-X7hixc8GzpX6rJ23szCDhOyV;XB#m@4G3&JWZNR$Za0gXCg0=ethSuucQ5-hZl_9yXQ2p z*ETyXvrSrH>9V*o!WMJo%1bS7_=!I^nC!`>B$IiYV*ZtBMPf#5PAt6|g6ham)%Fu7 z4lApxe}D#cLXZRg2EOra-Se_5sCi_*wB!f34Bg!&77RZ9=CiZR*V_E)n69`9&l|M= zQL?_4%sh^>Zx~)i*1W|^LjQk{XGPLi|E{7z#Ol4P{!;u`{R1Cohzx_%nrlMWZ>3+x zy{YoY<3&dbWl6j%EGYI>DkyPP477b<6Uv@hn#J~>+j*LxaIQj7yzh2#FoNV&_A)V- zm1nc4=pL3}<4mz5n|?#JtcRC8?^`&B6r9gCy8w4_aczM5+)uo|01kYaTDVMg|6%#e zd#-(&41Dbw_-47_bZjt4Zo{qLP^+BHSvM|TuUwXNiPiX`e_9piu|TXEC^WuUe8)B# zwRxFyoTD)y#1>HE{td?s0{l}wP3uk-Svd~C?Y23{ncqd;wTpdO79yok>kmNqP&MC3 zntmN^!4VzwUc#a3`3~)f7BK%#@DN*)xaGTYk~gHdKFfq;e!jt{*IW2-QOBY9jL$9@ zx71Ea)b6?iVibpsG0PRqtO@esxVb^rN7)xvX(k7#CK4sbuf?Qkf#OcdfQ6a|B*T zi;f@owsCHCa_vz0U=6MCUyT})rLu;21hIS*VB8ZMRM-Ki!PEvnL{iq@L_>UpZuDDQ zkUNhx%@5~%MHebCN*?=e%gd z2N7xE6R^!BWN=ncC_+q}NMp?gR~%(lnvtZKoBMnSkF!o+=kUgfJQ&|=)Wlv zdd2W_N}8r;KObV8lD+970|#>m#(l(VAu<>hVIYSjwu*&CJy>r@ksB&Je4UGB2<>Ce zd0=xi>Pvsqu+m>AVMBMZb=vu~BD%`PP1mKI9I3pnVc@gIKlk<~XG!{XEKp3h)$2qg zStw)WI4>621rA&ZAUtd9^lj0f)wgPai)^e~ofOUy6Gf<@F(0R zSoscYr%rb%C{f1QYyYZ4HlzUM?-r5l`hr=XiRJLXvW7z_FvtlR?2mdgJmoz2BCXHX zUK#7CEP)tP@E$vx*ng~~X?+8FBRH=dbo)xq4nXWRCUEc)p$Gupq#*}-DMxU&4Izg< zR4c1jpx9s-Oi!Ae7PeU!5j0{tth7o5{i8J2v>`rSe<*=d)W?`Bse|jQhKZ{=O5qtW zWDkH@A(^~i8*5j|RI>1yopJZyjA=QxwKz2CF@HoTM$`}kxs4i7`>QYiXJ5WW_@<`* z@=K`dl1mq>y%!~?8yxyRK7_+oF)Lal{HAf4aI=>RS-T<6`^G)-+p;Sx^Ygh*%v^db z{bD}PeJ-!TLUwFR!*rCB8iJehdewN<&XPM68Zo5HBS+5~KKjm5 zYLRRHqFubyr-QzaQa7n5S_x4WOw#eICEE;+J-y2)$rm7NeJTp+zcYJ^7 zor5`_#5*euCGFd-K9d|adgY~e(GbWEqRljCFkgBu@Y6HYx{rZjg|jBXa0B7evF6V} z33jo1l&9#=2%yG$k`zx}hne`L7Lnx!Z#NI@4rTa>3ojfzzHPp?N!ivJ4w>Kh_+@{@ z^p)FG?rO5biE)#nRQHJZNSpJqxw%#6)cME*alXscqAJ;7H;t&8n~$XQwIs&EOT{lQ zA_N)Bs}@6-g!*sN0fzD+COmFoI1!1Wli-^M7j)&Jmh*j2EiA684nu$|18;*GI@ zhbVD+X&s&veeiiUE6=4g$KR82ygHqCZ4ZqA;dC9-Zkh5jzPJG1$uZ!$PJ3=o<#{hz z9TgBJJfQu^r9N_m$F+0~^a9l+EiRm0n~}^@xL5$EX5|rw1;GhtINrm{s9wmq(cu;` z`p~{uQ`!}m?*Z|Q53Nv=8Eza4JDZqVd9d@H_vCf_l;pDT^$I;C%O`z!-`4;ulj~S8 z)mew*&;zrypv+;dmJ5;4^%L&mbour_v`k>l&ncXCd-KJxT20q?_bKHCg=uwk!u@+4 zsVxgp?0>l}fMXJ=ztZEC4cXn`UCWMTfH82idd5|&|8RP72Iu?qxVMX?vk$|Aw>tXG zy=m zYucFal9Bav|9l5jh``U}beBgCG9-B@`9yt$Y07v_3)`o$#j1w8uGHn={Sna0KFNkcFQt#xqZ{BKc(gE<u*LD>o)+TQfchCAYD4@VEr{<1qGl$^z1B=#J8O{Ry#9j!v86 zz@W!P{mwA1(X9&zad@ve=5WZ+Y}I4=TA zv?2-Q=-A zT3H9^1L_eMaGSh8>S4^%6Nw8cnnrWGIM@!JBA@;@ht&pJ#0WKAdWoa3qLmum`0eEM zukYrmkFqZ#Be}2u4lkQ^(Y|h`i7-S8B$FJo%Bm_?#jgQGqlvGxOZVfw?f3vzV`e~@ zM&REm&JB_}TSkkJS{pkY+x#wY#Oxi>BU!)u@a0XTEu@mfUXxByl`2CT(7PuU^P!*H zaq2?kzU{$7XULnPZ$Ug{d~1{xp2qaIv?MW;Ff>C*w(oGB>>35GAlQZ0Z#<3VE+3>s zq0xlgWnWUWc`FlT>d6hA^qVP?pyy{q*;Qb@wO>`N=g_W5Xk3^6@iM6XTm9L`+XBl! zqgIFYV{UXYcPbvA0EJ>%`;`$ZE)6dGV@mDRQuE`!u?;@0Y7p26n~R+{?S%+f7|F~E zcrilEr(4=W?luoI$%o4l)XX%+13Z-s0Tv%B3PKyjwu^(_7E`yUw`QKR0o&NZ1dr+4 zgN58}hIArzY)->Jb0NN8@fSpD`|1O?CFn?GFAQ_Go(Mo}R_m6QoGB&*79(G$FD~w) zO%jE|Ev6eEH_8f4yZnjaC&J_ltCH*64}HqA(ptP?c;Qp>ANkmWbR;gCMuhn1eGj+~ za>c09YNFTXM1kjO=5zBZcUHmrO7aDf_UM|;o3qfO#Wv03c7L%21TRa9)6jy+M>nCB ztB!SkDgz?kleQlh%G04y)T`iF&GW|`S!}`t^0S)%e*_PIv3wK#=8=g7r0CFToHY-TxL&K*N(B)#chxf@D z=-hSx-fd&h-{GlT!ITt6DFW%s4+zz9geY@7N~rMfI7ES&w=NfBq~Am~J?}10SEa63 zQ&_o@rW7i;M>?ikl5Xv@51wR^9}Y%XR*H#i^^zEHsBDX+h8)|y%i!wXNMCfVZhfRS ze-b;(J=~)!`fN7zKCKZw$tbe6rg@;ufs%;aTR~U>9gr~yfeWTK{yDl}hYBDMkF^i_ z`LY;d<_WM1O0SA1jXA#R=qTbvCsB+~#5Il#KORHhobT**0J@H90?3~XM&^{Pd)E6o zrIV-068R>vhD0WU}R|v8|>y5=(=s z$fJr)Jz8&^?_wAlCu5=}GBJZVWmkg!=4yPMQc52BR~>Ki_bOiFNy5g-%1I~l_DXTd2FoAs%#`62 zyF%CJJ4ZR=4SB`)gg^_z55$`%aE*3>b)di%8u#{B*gII6Nl8(OLs~&hBO05?ZSP5 z#1u>%>e+e{;MMk;e>USzAKL{^F_iaZY+o}+3$tmuxaN{*=C22)ABki6f2_$izg?`VUP>ejHx4 z9tEewOmLwx7$A}7$RbJ!vmFD_Ir5zB?+BOa3|Ccc(3$XwM6L}Tx%~(nHXqihw!YLL z4`;H@t0+p1EvA=$pFe6lM=>E1E;6e#)$h5HCNSJxm$*!CI?QwIjztIe!c;_Xf}Y}( zqNW$F`IaCQ1w-i2j&MW0IL0A?v(U2Mw1y($L8k?Y|R&M)?D8I*%8dkte7#ucgSB>ta}dUh~xwY-%AxnyHLKGYu<6Sw^Z}LY$+eml4tYOe-9+ zB{${Z3ntSyuNhrcb~wybF&pzt+vo5SKf(+7dm<*fj3TPR>lSxW#~8mw_Vuol7Y?Q- z=0}5y(Io^%EsN{@W%|99xr%K3a-3Y|Y)oFum!*k}IjCmrRpcYky6z2s&(8Q!mS;h9(xWL zqEa;1w~a?`_^~r{YA9YoG0I@h9CIi)g_Rj1gGN_RmC*v0K(w06`}ai9`=X?F)2>S| zNL5+X-iK+~;A-l1O{;Y4vxS{AsIv7z(}IXJ>$<><;)XJzbMzN^07Y6TIZa6r$Bt$% z$KYemD+0e3R^qxiY@78pH&Ss5SarKJF1%bH5H&KS>ESYBc4FY`y+UEI4$^)gR=&HV z84~2HW5IZgY+322teQIGyRzPvfKIMWy9H0X%s9fFT4J9?X->jbc8GgSt+8BX8K zy~$xvAM)1KUS^qSpRY9aN>n!}2|uqq?|&#ttyW+rC@jmw6AT5&hPH;aIVJS1wRX;3 z@ih7SK(wI#I5-v1zH?27itbZ9HkM`MBt=Q`VmDoOsEU34IT>$S+I4QG=ULO-mG?-9 zUfj5}C@Yo)?m)ZhxaQEZgY&2EF;3Chx(D5WPqWVT- zuw-ZfpvfWpBl+@+AmQfb3KtZM!-#0Z_%}!wl~9&6dYvv+nBUbPaWms*)C?+UQoI0V zqY(U}%Ob$w{GB@wGn#9;Ed(Z(8jIw~OWlTI7hQUr5qzG+Mc%$b5T;qOnmd*nyF#(y`1YH#>9t{A+U{#{gBeYoW%fnvRU+>B>cI%aK+SrUq;?0R-{fJDB=j)>?6D z-cCRDAA-#aJZ(Xo>gi|dzh@^#$o?WXmOK1G!%4YJIZ5~#9Z+9~X#i%&y((`$!Mlz$eWBh&UD|(?2 zj2D#A3gr8Wj-_I2Vw(0x+5;E;3t0_K3MJ+LYb7v+82n?xdQcja8JJ zanWg3L!<}fM|7*TjS3cDuRh)qosx-Yk*B_;5G!sOSLF>N`JLP{Vr$0sBBsf;UDyA9 z&^MMFEL6Tf`f_c_wXipoIeB+K)R4!%sHCWGX*ciPY^7{oiFVTIa!u_c|IIO2Y*kcH zZhwS|#W>BJj&q@z$+nl3kn0NqFWqB0uY-JO_)=61knCng#_GCVg}^V84J1SL0vZ`~ z27^_RcV+Oy7^AKSdc&d4E-4XU(wB8s(4IwK|IoIJES`<3NF18L5*^R4rDc-zUub1% zKI}d(I4#7C9a9_P3zO@Eo)7Dh+IUxedC68=CC!2E!~&>WP28Jt$D|K$@+X?sV%k4=%-KOtjwOli9V~V+e5`TykWH}GR@L@WR0Th7=jU^ z{@bgT(pdl%vM~4$ZJ+{dAL-*DF*f(gzbBS1c*r!B+j`G@L0e{{W{{^C+m^w}dJ_qIqxIl=8DzxNbkS zk`~*T{o5?Qt)A$D{vMBVPRQ@f`lt8KE6mN4*j0h656glieylm~h2|W8Joi~*+o6sy z$l*E*@6r{=_dHKNd!MAjCCCZvq++?*E5|&^+=W;WwnNa%pvDRBPc4{`K36 z(YaloBQ3+W!XyHkq)abaCk-{sc9?OAcK28pQ(xN>wyAq*R+Z>}5SmDDlPa;xUV8v5 z+1wgxPlPs@+odRxxXXv;U@N*^8Xr4dPORp+XIItmC(#97mG)RxnzNY>pR0a<>?lsV zK6*W!!TW63@2+%bVQz5PU^aC9#+_S|=+n;`n2xM4`bG}1jcMT72d~@HQ;!roa){b$ zG%D>Zp%^}{ZhV=*rOjmOrpCGcH+Z*$QaDyqAUB*;(=INvqV@usa1^oi2i3J1fOjo- zCrag!6vkMI`Tz0t6@E?lYq*%GluEZssC0LTlF~V1fG~P=Hv-Zyq(*~uGir2*Fluy- zMmk4#dFSt(bI+~M{SWqGu8&>`4`pGj@}*)B;nOaj#5*>D4QYS^2BP zvwP(Eg|dIWGA~JVGwIn}uUX>Mk(pHfb8 z2rs_s1AKAMAzKQOkf7q?@K&N?n*t%eW4V4$f*TxRTfzH zMjS3#o`e%zQNt^-$}D6GUKJvFc-XqrJEyqBoG*k4l^~nK6d>ZgVmDVZw~K+;cWqg0 zH>pVkjMq<}jtf9yMeunpOjT@i)`~`MkOD`ufjN~dTycco)F-*;*}+jY{_9#Pqg7|X(g97!arxA3;YP@EJ_&--H0H$iP=c90 zrf&4i3Vesds|>c<{O^F|M}b)y0dzP%R$WmtKKh?)qX#kbP8G%uHzZVc&x$&jKm{?? zUF-K$m8O^9W_c?eGVgIAyWw%n^KRy9HZj*B`j$#3r`Cm_a zeyfc(zLZbVwwSBYA)btVW0@7-Uci?}-vw}9rBSlQ3@XwkJK{m7iaN9EDyxEqq_7}X z*?I3)wV=kj?2XwsU;s_&Nh?84>1M04Zp-|8fYCasAfM<9Pa663iv(!7ai_t7HfF2= zJRH!ak1lQ%vGAO$kW!UX)Fb>+k{9egBu8E(BgP+3L)kg_(u8VOFMQ3DDmi|evu86K z7Bz8#7;SwkP>W80fUoR8!|eTku)go2^`fg$Pr1vVs;f#wsjbx0KiUg;%2A&gZZx=- z&!2i;YI8++3>$RZ-KW^-lL?zJz3Q)47JW#T$HoxcsHceQ*`JbgD6GK_HuW#Zx+wDr z*jS1dXJqCvrh5s+uKgUzdcXm%aKE839y)w{MXVFekf{BpXO_||_C0-4CY%iMQ~X;U zg4bt)7?XFDjikEtA93cP_=80&ti$&nEinVK zR)xoOjhIzNjSh?6zgCl+a@T)L9?BHnfUAMgBw&@|jEt-$45fMd7T-FSVp5wNh!Gs$KC=;JwJ;Kgn?pyoGqL9sU3+|bv`-TOl+F-y6b zGs1p(-ggByYchFjd)x=doE&_qv;j~@akX->L5ZWLwix@CGEhc+cN*g$`Do=KraHZ$ z-f4h=%Ax7k18b_|?F}8TMrv`|(wLlCFg2=x^Kn&2433lZbvqCthTW;a#rXLVALAb^ zqe8nSD>2$0z~El}if^|*ulFn`&{DN=qjjQ!6NYq;_<8RRg)@JE>m`;7%bP)Ere=s{ z18hw$NgKMxdDRr{aL`rE5sTLh0lP9>Ez7990!&vJ#(3gR?Ve^cUIZSvSj>FeGp#30 zanP?!>{PTBwX2K7Q^L-gWB0S^?(MsERC;r1lIK+5TaaOE_)(7Bx(ky8{Hn}hQsyCP z(VU|;%JATU$heupzCKKSAVB)U!AzP}S$7>E>1m+GtG8z8R=dVdDonxBx)KuGYG~lA(EU`Zz6?tJ zcNB2k_FB;tYjR0T?Ao(+bX(~*{+RErN05BD4J=CBIlTJ0unl>6FlvLzoA9E&9As|$ z49*l<1`Z@uQjI~hK=sXg(CqS$J626}=6qd4Q#CL*`GRP1CPbo*%g%C?W+9`@WB;Mz zSq5uN7}{25vE$trTlG$6oI*~U>`7Z40Wr*nF!jO&9Uq*byZW|+VZxV)H$%nWfUU}Yo@PZGC zxq@nc0D64GO}KKc<4xczY1Lzi1EQrdHLEYVvo(Ukaq^izcEx?Jd0rXlT8ktPHMN8X zXg$i>eE4j^NChe#T=BB1wqLbyE-1A61#?2EK@qgLg=$zlmPtX=ujQyLa_tZ;8k<=n zW(>LC`DKjY3S<7|Fre9ALCxH{B#NTC>Si~q1Zd}@Z&a@aBr4&i_}VW!(!Vnyd7gfi z<6sC-UB4KA{;3=HeqJf{NfNRB+q0_no1M2K;b((^dFpc32z5&Zt7(oQs&@|G5tV|PBwLqLw#ikZb?p$+H@%yCaYRN{F z-al&)WfQ@7q%KwqsN^>S&$~nlV$7=#DSYhaU*7RzA~Q;!|Cr_wpX~XAWxZdjg&P~e z!w~R=B!%Qsx&RotBgZ<*rMJqf7%WDyHCd`(+xSVQf zT}E6QMyevU*^HdA0aHno3jzYOV2{(PqjRUojAUR`*Dk6v<>%|=7p6Xs6jU|T#+RKr z$fZ@_|nO$zL_1B+Wc<)|Q31#Fc_9rdiq`i}7mQR@dc!p$7&UO%S_&NKyn~=d0 z%E+TvzLQD2)irQ2!YP}yMR)yt8aQMn);FEe!I)m>VYf&bF>hGvP_fJWEVth!X~5MS zaraAdzqWf}SA^dc8W9nfj}-JRcxgXrI0eq_0P((#>H6KJKFK943Uf{UxZ>yLmu0_3 z?ylV__DNool_xjsO@%|Oe)_e#4JtLhOIi8z?t$^Ii}r-d;yyFu7e@8*wj3HgqqHoL zF??u4Ki#J~TH-x4*O46!+X(uTUa}+V>7jyNSVKTnZ5u_b5H9zFyh4kDJa(^)OWFcC zrP!A9bdf>)y(qli-ob*fYJ^FndaDJ27MZDCW$X9}yuhnin1tbB7;M(lYq z8J5zcHoVhIUF;rl&E1H!11(me)ohx5>x~(@zUw(Sg{Z8NMn3G8LyTAN{2ITzV_tri zl@#-JT)|p0pnu)`fA82B`d%KGsJ^l?57T@PQq0r#Whqh?Q88fcRwDBt3}Z^~|L{4zK2!mn!0@D_3evZcg97a1@t25L|Lj zD${(*r3%t25Yl%>5d z^}7zNtQUs*dR7~*W8d5`&v%wm{s*fa?t?#qj7xh&UrOqJ1!x(1p|Fe>D&4c`+xOKc zu3uNW3z~s!pD&4W*1bGk%y(EP+JFn{)wt3#*MHmPEKuoq|2p(CL|{i;0tfAy<|AdM5DY~#J!sK7%~L-9;1Pk}rG&w`Y*Z`lx7uuD}R+xvoocyF&s zf;CK$T{$o(wu99x=#;@j(9mKK`8QIT@!#NPTEB*bCc!CQj5-WQz9uD+AP!yF#_^#` z+BwlHf0r^=;t1Vhq*>R?Mi}*Do5)s5FCj5=!{0KzA_^aMNoCT_BKpb?t4~}%Z2Q&r z)=$|MRkAAAPb6sPa0s(`r|n9C>1(qGKHh=rh?YzHQs0z@A^_KmOjCn~Gy~IgSJwzX zhxI$bl8y7kvAg0 z@dGgCrZ=Y(Dg-#XkG|rJjkN8M9rt{}LqAg0emvM$YWD}r89;^U@fq1HBW3V%(p9-v z|K|6xS{iQ!7o9~8m~wT*B#vsd&Q#4f3#t1zgY3V{ae&;zcYF#2r&Z#!81qvgeJscbpF)JaJkxh>fm)QBxTB*K`35ZQu(plB^2d!JY4Qb$4)dt0BI2sj#g zD>oyCkAV9a+k|92i_`=Qq742@H$>x^TewO)Ycs>IGhpL6)UWUew?lI#b7nP~O~sV_ zebew%e!{mN@`*iAZpDQU^O74sMq+TQuB&gWhpvuJ>;|M9q%iX3mBxG@850tGLprWk zlszxVPUCjIli4Ei%~fycB7>!0Jybh`AX@qs$t>fP)lr_}gYxU#F)XhncrGmdsl&Q5 zY(0&i(~Dd2?Nob!ngpw)K&IzW&->H``Lf0Z@tbKGwxN>l6%2}|TGc1UJ5X`c_Fpi9 z5cAMC&Uon+y}P&|GD_tKj80^el~AD!nNAmsO--kt8EH7 zFb#dR3-wioRi$Y2DLTuTrEqUG&!pv~Uez1l=>f$6>-RZsMf8vsY)W?)&393M>Tc?Z ziNAVRyoxx)m8TyA!7!aSHTl{K0}vT_w>*UizS}YDyr-})bG_};Dyw2p@MIUY!}ai&Ab|<(-o)ltinS2vqKo%T%*C@+RnXPM>5*14KaY@^h?(E~KWuQq@?4YMid zg6oBo{0b@7!QB#P@^Q_boI{;m&ko$IAyEc+p6)cUUQ~YF_x+^2f6BH&2$soOhb#{V zYnZzI)SFCaZZT?T`tzvsc~F!&M}0am#{|kb0%I=;G{JvoiXja&VxK7Yn&(m7?z;>} zrDxkj(O76HJ4<9id3fp#pP>xgv5n@5)QUJ(Ycv6jUmU~WpZ>wBGQj*3vPWM6*qVD5 z_-E_xU-)#RFz&(Jin?~gMa9LYkW%joC`0N`&K$)=uSu)n zf3OPJY{eehwzknmzkQD;UoU)vDNWqOFtAq`;)Ulxp|oV`AWaKG#tuP}Vqy&oc&jRI zLH*u4l0F;R125!Xi;}#40h;e^qT^Wqs8}ndB#=-^2r}uS$F(4-n!5-7&=U91WHuXW z^t4Tqr=yWR6i46nQNXLhvlq0J(*0I&fLJ@Kv ztYeys1G<_+96^{;o9LZ=Vrt)xzaeUvzTMRM7JV2>H_oTb^a#9JMfPuQroqQonuYvl zyn7}{@TT9EuBJ_ED)E1=29P5(d3+LiF6qjz9jjBHEM@~ zo<&hFnntc-VK*U|&oGyXRRgiMlLqS7^6z4wEZTYaFAAMFoOUt%kWnp&RvXz`JTC7h z^|+^jaWlpVf(@d;HZHr7V`DGn-#;t;i$0Gt_0A>RFp)OQxz9`gD`sntRr|Zc@rRv% z?weX?A9(T?oy`7?PWq_sf1%R`aXLwa^=5b+A+K(3XFp$~d}M*YiQ;>H?P*SK&E9WG zG7-}+rB9`-KC3*^c=&H>B<#Ghxg*3LH|cdD+kh=Kbh6tcv6p~MA)(0CjwoieDWo@- zY~6%%H!#%?yo_-GPwOAXBz@ByO=&ZBQE(WrF)HU{Xf^T>)WH->ABjj@Mn6W(CQ?Us z2XdYg@f_aA*})VQ?$>cm5)ibz3zxM17^}Q0aEQKN-bbFu_2q<1^sG-TD9GNj?0wC6Ge$J|A0Z$099S&D@ecf`!YtTylY-SvgpXsN@iv<;@U zL9kKRQ93)pL8FiY!PES_@(xZ9%Sv3#i?Uqg$1#<>GC7Qr-XKmhgXMM4K1e$frBN9m zTYt*x2M=-MeKF*9Eolcze&42~wKL$bvq-TqXWwQ1dW9T@yA*$t?COdTHQ>S1yEi5h z6b~DtR9;Bb)mrpPlyi&lbfTN6obzMapy?I#V^RfiRg-t*Kr?E|O{$A@^@XFqxlZTXQ|ZnKg8&%aa8=g#UzAOm+$Y-=C*xwwLvs#yN-Lux`b}Ns14#zD zJ?`p9!IbLiEJV&H2^udnz}#D45WZdT(xCVy^X|zXtj?j*G|t^QzTLwF$3y~qAOTUh zC1;A3mmGp}{`};W&8CbfT5ZBB3Uw*QWBuk+o0P z?zVFF4fb2dZc0#N=w@o(WYUU>q2f~|fsToP33M?(#|m~s31s2LeyDFfX1NxRJWWJx zb_XU`)(5nx&+yv5CDl#{YHU#MXT9b0WDC2}b?E(Kv99@A*j4QwIkLu7ie2cgeVGS5!8sK$S-DFUSg;>y2eSgAWG#A8L6ca|_ z@A-}7%}brKaMHf>dQ20;fS}{a_AVQd{dUBgFVDj$Xd^T@VP#3w9c5Rk;>PSJu!Ol& z_D-z}5A6pB%t$J9VF`H4z7H^g8t+gh@+%etY=M0>Q6U7py)f>6(Ht%k{9_WTnK_-` zvl`E#lD-6vXkoB&838F;F{)<+mz3G)06(}`M!{EKh*W1LmZQNbN<^ana-YrU^rGZV zesO2fQVQ8CuDW z_XzpSQhbZGXt&+S<$gWd$Y|Fm%0rm*A__4YvE~3%et@zSmtj4N`Xxp1JUujcIw^|9 zj;7pVRC)MsjhbL{Hf+z04Yh?_!Nz-+k%i&v44@&MdcCX^@kgXIaX)e2EmJAxlsehb zkjsmzx3JA)25Z;}jMSxfR{u+@iz`mzu2X?!U(b5KfHc+EN`8*h;+@yu={vTy%~Dig zc59g{U@{dSyvPX1j1&K*qWtn`tr1X-ftKZ6J96|aD8`Tgw%5Y3#&u=mfo(}eJIj^8 zMo)f@r%iu{WAZ5X4;Is@>rGXI_IibFYg*$fC>z|4j}^F1(m5Uea#)@aF73jPEZ%yX zs}sgi%#@~1ob~H{lETCUuK(A|hMA8?E_=)oZEvE!cTMHkqzq%xNO&)J!?%_b9BopL zX+|b0N9}8?$njdLiZdSHd}zFU~J%aR;# zD3s+7)+u&y@X@oJFBb6g#(tMW!6IN0Nk#OzmMXBx_p^>POwx&$@;(pS&kwJ(?dbh$ zb)H$j$t`tB3^tDNrz?7WQ|8f#Om%NwT#iiu_j^LJ@2i7PWr3_59& zoidn=h8t&0iO1o|=~JB$p-vw zx4V@N8?2OKo`nIKCLY)pI(~O4_3^*ve{?wzoEGruwY zkh(YUmXz7l4DO9NsbD)TXcrG2YyR90?Kfiq;C$=laonBc=^7&Qr6|5^jja{68=mwx6Wlv$5XLWAR$8=enBMaLefBh-8}oO%c+AV= z1R~aUqT?wKk++yLxUfo@+RrsavrX6xoNYHQWF8KI(RbJG`KEy{%ZvL|P}R4?d4#{= z>>kzMzSr|M-h`22{OJwLts9W)X}=&rXbE*zZ|mqbU|GAfMpeLlnV6`wx?_spEpZU` z?Pz(0@#B|iJ?fBcpsKwaVTKUV+K!%Z3iGEvMGN^%m+(TCuhSr6vRSt!nHS2hEwp z&J!G_Q^`q{{IZLUR~(ro99zUf4gnbkwLUm{7r# zC*k~Snf5;|&JKr*&u{HZ{&kdU81cR{>te$g9jPXbR!K%&(;|Y}vV8v+d=cPNW3ZZf zYgDHsFInorf9JyYB^k!-5`PQOU0G9}*o2HU)L!d*52}Gq5Wsg%09mSutR5_D+viFX zPX!BU*zzjBI7-uhIIK#Unsb+vA$i>ie3s$`eO4=H`>ke9Uq#M2tNH* z(kkl4#1(`-7fpR6Hci*ln(7sGv9QxVcXZONAF`NzskLJw2%;gFsXK+S`|_1w=IyMR zae(lc2fItCjBY#VK<|yW!QwP)&hDPkE1TW%#RPY+>WJLLzBrn&ZspnHhAsGph*eMA z2C!K1fpEV(fde$51yh}DJ}hRsgZ7GO0G7_I;>r#Y1w$=z!_XK_%tWG|Vots@s5Pd! z3kkIDYhEZ8V^VNYzITKtt%i(7I9MpSToi)SDQC^4p3{(I-kcbUH*A!|(fnwZrzz@& zOaf>e%xR-JH~N)Yu}P(qIUCbMn54SxUl;+e)e3aMkPHp?t;6buJPS!;J6~ThoVx{Mab2(l7U7Ahu zQ7dQMp+|+cSyDGMUPl8Qy}3@?&b;Y-*|+9i`N>xvMHp}^6+Uaixs!&q)L#z~ygcc& z#IY=dKNAHms$OWVlks1o2KGFVTi&2Nr7mQj8|Q%><6zDGh{XHw>jQC8aDPlx6WaAHKRV#7k4RF}#j;IQsCldG{ks$roZO zh-owH^&`p5lc~ALJ#$*E=y4Craz+?Q+C1K|@96j-9fJjtc<_7_{viG}?k!39&U4}m zf9>bIcu(#%KFy9+4o8YL9)|TcG{Tj*#d3<~qh#1VL)5~{xcWAF)l49on%kO03oHPA zJSPohm$X(z~3WNWRF;<)@V2OZK)RliP2rQ|gHEbuqqz zSI;d^+nnVtx^IokC7xl-J^xW@M4Xt!|1+hMsP_A%Jj33^=l_ERvAC-=7#zCG5ZhT< zU;Scm{uhJ>!U8|&R*zIIq387oxxsWIKHCyiyj=7-DS4QAQ+oB~sEsP7g=2=-<7#9v z&rmuU6FOEs|Eur+O@*S1pMtjQoTg%BjSC|Y90xRDLFM%%!R~OX2TQ>^#bkpxh^O^_ zp-q75r%c-K=aKQYPShtZILGtnpAT+x;s%&5Dmz=LMtkfHMm^-Y)oXvMPjCSmu8+ql zmVAcz*#`~I6Nwhf@Y`z4z6=Tm$5D4yS@XE3Gk0d1RNbg?nd1nS?(5z8<6s zFAUil6@42tr`6v;OYUmns?@oHbnhP!D0#m{wMokiJKLNR;p`!3opmu7MD`h;frq*8 z6n=5cZOC+qB<>y?P45MZh?VDKgCk~nb_x>GYRIR<E$UeQ36QKe;P7O1tF8Gz^yK zr{qg0?J7l3f(%^1)`tz{ZUvFIILmI{PCGC`L7BpXnI{#+X$8rZWF`q0lOP)@2I+KG zYjrXAJWw;F!!OIuj!#gD)#pN*JK}%~8V-piTNB7L#d{q#dyeNLd9-*Qh$$)YzVPf? z5KFZK-3U>Qbg3JvI9Ic*X+O<)k<}mjankcfOmk_jKKS)QvBTsA7l43XLw^)OkjnP z2GdfXH7?E&vQpOM1g^Sn5D4q& z=MGI0=wQyI=lX!Q*Wh>Ky)*GS_F*G6$TaLkeVcGKA3QnQ%7^_b))^U$8MwNCaiaz=8R(j-D1_JzDNDTy zOzfrKM-$%eW3MuAoSTzv5g#9Jbqvu%K06FOlJT4}H;FEA4>zm1D|ih8%Ixc(lt3LW zrbf8y9#$E+mI;(eI;sGg(oTNz1JJ3xi^Q|hPVQA#7Ts0H6i4J4kknm#^7>1!iN&K0 zG}$7T`NJw#^%C3n^iIYu0}mA7(rCLvyE_jy@9Xr7X_|oMxdxBM9+#VV_ibHvQtlH$ zb|$5Z;_K3n@bciGsB>fxTvpuj28o(IIlJcUxr*p@;D76KT0caVdO$sXRL)y-kWhB} z^5_(!nb59x@mm{d7oG}u%hSx3wo?(*Kn5%p)@jw*CWtI;eu9-sTE}p8xJ93hA_6F$$!W>$3-08mA97MONwjcV z;P5KDB&{pxKy)NB*1hITXWMM?26E46iD_^oQ@+X5y4I?}L7j4fJ;c zCjHWN-t=Nat(Ff01^O1#{?LmpobLQJaLH=(ZDg}izNq?fv{dO6im>L2H}@awZW2+x za{Trt%>XIor2`;(;S%>iWBRMK`U}dBZ1i8)-0zth5?5eRK^uERaA?9~eBKn1THI4y zi>%cA)w7{#rgM#{O~wZUcQrg3H&jFCe%0z82`c?B{71gn>Q-2V=MBw z2WaD3{o^)f+LWTjR#-6%)WA&)4X?vZo|t&?g!2h5SClhsD)0|hdZMsHV;f>hv>>RV zk?UITL3upwTP{)oA6C`XspSlY^<8k}RF@}`iu&jKWBf;9#xdg^(c}~}es)l@_c;Yo zd)Qs)W5}X~v^qn6SY2FcYnlStX(w@uO>;l%`n$FRwPk&ZSKSQgDDfs70s0QtNv>{`WK7kFHpC}jlBWHiNn(z?EjW?Xhg<-|NF$^)xY}c!P17! zaA$#U#C6a}Rd+^8OubGgCtiCke){gbnc;lnh~4h5(lHM;BwOcr?d>ZePwUrU#qb zvX*W(kmSua)Od2H0wZ91**)>_=d|@7EW<#l{yE|$U)QeO?qgS#K*G|PtYA5_cxa8| zy~di^RZPt(8U_S^ceU*$f*bC!k%#;yvY9WK+aGOx6|1VRpbOz(K*sDZps`gbG|fGR*goNkS_-xIdjgQ5HLf zhXkTx(XY1nr)_p`2{LYg-3-3g`3SJZYDY0A*45|yUXnnQMNTIiyUDsZ5(pQPm>z5iQ1(BZa_EuD!&}x#NrK&pRspf)Y zhs1p!uD)ZXp&VH8sodsT$M9~$Ba@pq%S7>PBcbLB%6Pr;T)I~-T+*VGw-GF@A*S84 zNMvNf2_@c-++PRV3S1DzZen`epeQ>=c6Eltzf%l z+8D%uuK2$}_w-6Qnt+ZBQ#H|fQCgjytC=*}#m12iWfhU!e!@tV@M_(w{at!md{|1M zXdw%)YyuR=7{|U&dZjSo&@i8r*#9QbO z*5|19+`|l|m0+^#o8KT`4+`-FH+0LQjf1{XlVZ2jX+28dytQ|LrIT|*w^O|xLr|g{ z?Z`F}zqK-o6{(IR9M}q8Ih4>8q*o1nLk%cXtK*b{nia0WzLc}eO@olGmK6d7$DCC- zi~N(a;PP14ZHPsBQJyjzRD$CRH6S99!b*BJTTY!3+m;p7_Fey?mq-I0pwPXeAXJF5PG#RTir@HhmNJnHK{Y(KRN$Yn`{Lxw3C`l!)7BK`{&75BerWYoK_6mM(L1&&-Mo z!bK7sh2^Ef=?UfS4Uf9sk}cOc16%J5t?h#Pxwr#nltA`8z$@Kx+0Mm~{Ee(!OF8U> z#exx~MoY=s&l>QNt#$yz+hpnS_*OGiQxcpk?M(g8ng6M`R%Q?V*{0dJZ1bz--fN2w zXII{vbk2!jL=KihNYyf*h-i> zFIQ(TMCf0nEP+|!&r!9@$n-NLT1(odYAQTW{1xVvIh9;!Co7#@bV*A4ydFijrblOj zuoNUlK}a!s#CMnnE-8AC@(&go*HFC4v&m4Y$nnzUB=JDJiS{DrG$jx3KROITV-kyX zZ~o9`>VX>VR)?;O^T>e^Bh9k>qSBl)SiAidX$VllAq(bGw(bY@c&1ZL@yh{MoC!pZ zE!^HY_w@3cI{#B>>$6ysGs~O%d3E-FtgNm}_G>-f8)()UuTT*Mgnr`EAlV!_B@Wce zTPWP~d-njr!nOJoCct+9bQ2N6oZp3-&V&fmQtBxF@}_)H;7gzvI%*8*U@D$|WUBRs z;%CppNsuvUr~!Ts6jUrbvZ1mmjSyW0=EZaQ5pZ-*esOmuCKi|=CVvTsm@XxT0RWR9&x~*@Sf7a72XixVS_0SJGt& zs@dM_F%k!lb?W2R*RX<2{anvPAzl>LcvqMDo}PBVjP&SVNVTdt`VLTRwjmhb$kI9(KzU4w5l2CuxpFK1)scRE-c3g$vKU&Wa-&DUv*qme+CzwI;UV54b3;5*fOZ9*k4mWx< z2&T=QmE6wCl#t}26LIwVQ=S^0*%2>cWz2RzX~n|huQFwWkuu_vIYw@FK;xvRVlsee z*AkmITcY>jN(v)ANyW69|Ehn61%38)K6_Wt#*U0_>gJdbd%~nwqx(Npcklna`u#(7 z{m(I5vf(4!Y96ENa)z)aLBkhi?L}T!>mSxf`R2B%mqNW^_6D{q!9x<4+)V9pj%)b9 z9R6?!3A}4^pB}#W`Zg|eS^UkyY~7HvnR7;-r}faMuh)Ji4OI)a9o2j^KWA{gH1(z) z50pfFzf#^$ToLbg)zXKgF;)rqf^)j+-SlI(9JKoE8^a{=>?=5sAsRx8jCXrkbqMzh z`|i5Plkp3N5M}ueG4_?i%0Uwy%>&Lec;NXJDePoW9n)DOwOc>$s*el`*0z6bnEbZ2 zeIk}*Og(0;sR5QXHFV~FscgIR$TwJ7Nh3V+Z;-+NP84aWcf^6r;(ex9$eokQUQytY+g?ZX@KPUgJgaMh<9pVR^iA@)j#BA=xT6&GRx1u*~+t&u@GS{qFf(hC!qtaS}Y{SZ9&8 z|MlaHw{m@#?xUtY=oWOb&ZfNirpdAw3U(<#D+e{Hmh?`jI@Y;qqi#IlB~fU-fC9J} z4NnSgvMRSSzans|d$^k(jq5RJkEYB#+-MENDUNs+ws4VS9@cRf-FAdA{7=4V?j0RR zjSJ-$XUna5G-c8u!!7}qGo4E*nO~NiB2eU%8UJg+Qw>}1a#CMnxdfcvhpx5NJJa?w`kAZ`r$b+ zwFRXY5AAmtt@G5T)Njk}3t&$4#mH^!VP+)VU0B5SNq&21-}E)l>Q>4P&I@PN2W}sh z+!qh63^Eh*Tl8?yqTES+-gYe2tq4+HLez&WSbQ%VsSXw@j)#onS!(Hn!?uR?~Z0})QP&7R?85T6yd!XO+Pm>^n!V1 zEDdN=7>18CLdTay)yMHZ$6`sg?q$`+B^ba4yJ>WA{S?%9DXLt4qh!vTK!Agmumd4M z1ztLr_fK6HfoOMI!YE^HVkb^2x)&LcY;jlF%v_lMmXbOZ+A|nuCYrj#a#k7gJASG( zY8L32MB^iOSaXY$fM&48{C(T7Xp2pmFam|+8NV2(8%YBNF%0`8insX5l`bkkT3uYM z&wA6$iu+(g-~B9e);mKy<#@qnFd?9T1H?6M*_z}tmFnxC({app3{UgPpZQfA4%i#n zhD8$)Kn!KCw5ly>L6-nU z|6%;7@`tH@)?@2`*uLLD+Zl4(WfZv+i*=3<);dFKgL!sdx(7eiO! z4< zKlIj@%XDoQ&z);55jISbFxsp*vpVVOsf^j!oQQ#Y$JY{SJ)IO8e3ddFVGVh)jTIle zp&YW#GK_66_HIO_J9-_DP*jcmM)ApS=_j>DSCWER!@pcK+r;YXvZ(9ePq=S9zMW2h zQtEK6ltu}8AEz7$%~;K0)077k*rR0l(ybZ00Yw$_W>M9w2kPP*X+GZvf{i18W`>T9 zXpVPHHhP%E*KeBWLh1yg5|zc88^=ozqid;N^)%D{y0D42U!Yh@vcB|tSP;4NGF1DR zoaW@mYzOzAi*S1Hu|X?&l&6`>LB;THzwCj966M$dChnqlEXJ?rw2X1QhpZTYv66co=k0*6m zNOd?z-mN#xo5+(3;}rFccYoJ>knmLXJw=g}$an66hw;V}oR|s&1j=b)h18kJE0uyUEG@$x0*d|PG=^ZNOb0matX)zTa+w3@|;%)q!PKyG?o6wVOn zTBY@bV8rPN<}cuhYKs`<(t3TyUCmEMyjU;Y=QTg(Gq zc6WOYHSPQx>EOqgIbmMzH`3+Y+3$^Mj262w$R-8OjD{`6@ms+qYftkn9Y3ns(2POlpn%>8G85+aw;72Kp4T?|pq_FE<^>4kq{d#}g z1i1_6-=#lp#(h>lmlNYYavR5)Is55Go^%pjTB%6wa+?b!ZK*rfU9(N&Ynf#4Bi6|C z2PNC8HcEa`mqz^>#(r6~*4C!mfLZVX^&yXX|5@-6IjQ@;X?_5=UZ+r~ynYWB-}{3l zgt^H88wC4%xq~vU16tD{S}~LN=ZUk&Cy<5LQqis~76#0g5kunjv48)*HcNNQ>h z-o$3zLw06KcH!voslGGcUN7@z^>Z4(m6T?mjc!=&)pngD&Wa%{yA6}_|E~j7;lI~v z{`i|ON;s^5N&}UvX<2%ZtqG1X+>d8XX*PohrkquCD;nXA1%Zv;gI#Y#u*uEiLR`AX zsJzk_yIc8gJ=pBxqL`)h5T=p5eHH1D_OTMq!!z+*>5QaZP8V}5Xbqkt4WVYdB^8{A zeIu#8#)m^fD9Yn=q9!CNog(BW_ycSjm_{+rzOgiNRC*KIKu4Hx;PJEoVVOIjFY}6L zJX=v}@|@M{vCf_ME#XivSt9F(!ayRYr?px1^P=$bH`Mt5fT?tE6+8T7>oZsqI0FLJy#&hDmULhZg#((K>&;lB#L%t%Zr z-Rkp__W$Pjw@J%=_4z`YZQq z7~~0v|LC9lmBNC2_82~xWl}1bQqMGLJTNwki~h7e8*ZWTWTB8DpQJG4Fw1HC@B}^P zLuxK{EYxgpmxhTmIi4bis2%>7^Q+=oeZ;C zsNR{9S!QAx3K1tHrkwT5Q!3+_k6kKY)YMa`t|J6=s&NdE?r4TZ7z7?+>;1v%>lI~> zKe@U$<%N4q`_oe>V_&AuSTlC(sB&!wxn*cr9ZjnSUQD_DcxI@&zUuhuKVvxNmBQ4N z=wq|xthBzqS_0guvrift=0#(3)6Kzv(yWNRQngO1KAcLN@89)8-POWozB)dVWQ;DJ zVt_;a9~OTI^njxV)()?9r4S5QabIe2Tkr`Tr#EPRFd34_MdH$EX>Yxegr+6IHb5}-P@)x0w`d!JQu0Y;}4eEVkw)LP@)%7iiW4x?<3hSm1+QowC~ zs}imPGm}&JvcwODNgD4x7=FE~;uT`Li0XH{Ng?O~1UA}j4TFFF42-G&XA1r21sX^D zQl)U6H0Vj!uNcM3=qa;nszSFDr=P5raCW)!DVWzvlwpI*trDN<*cN9oMv0Z^1!sRu z;Tt5uxCI*SbSJvY9NC1)oS4^~&h`19Wlsw3!%LMCk~Mz-4eDnvXwNVW>7ors5Z~}{ zN9+*OQ!yEQdCrmA^Y3h~SymM86mr%^YL)B(qF<|cmGZMn>#<$DzvoJPpGSrUTL5J% zRvQmb`k8f?1^`e@Pg@fdDaIT%2G_AItZN)bixsASp6Kx}{1n`i8}*^^`H=)=RJjV^ zWrm5hCWw<;Da)l<^;tR4LY{*$Q#16CS(Zeqz$%`3Qp%nNo6Vw)m^bv<-0sgvPAq@j z(T&Ic4SFXraZ&z}c+`ZvsOXnWa)!T)+it zXA}0H{xB;_%D<5H7yWpA*?N^pq&n$J!j2G}VGz)xIT`n{DhN;{gk}T(kx40+&kTSKCLQOaANac<1CGs|}&cN0OmN~i2?@HRsE8tXdBbG^(g%?WNgkKU)xwVE& z(Wht}Wgu!hY8#!Ojwv>I9k(F+Z*>)*e8Mvw!}D?PA zjWv&|TWWe|RTYhP73q>~2j3i<5K)p7{rY}+)Cxao{Uvco(T{)WxRlGTvkkl2c8Dhx zo|m=;|1Hauxip?Fi&7tb?VdpjOex8|Dtud>W}dncdYtsAt_ z4@DgHNz$AoJ9jt3KMTG}wl)z3CXK>PlZd}a7YA6`HNL*FP#qLHS(L&Y(FbcqZUe0%qSBCfB+1pqA8h(NGUe z_7Kw<;ap#h*R2^>!(APTBabYIKI7wgiE|}=*DC0cuEH6xp+it!Un>8abB|^7$$}ps znm+`l1`dxq?88q47&Qhdb;sslZ&X0UV#N%&$WF~y?Zew-LYAeaq12X1VP&cByR(bs zb@)-w28r3b(g}?gja8cVpjYlYp36SoJbR2g(x(!%Rxu0&q2a^7go~27dKl!4)pgRp z4eJWO;IsjU_P=Y{A4p>B!Ib?@kv`F>bnWM#!20>No&VA;GOxfDCU)#@Ix-n2Q;H9_ zxzC<)VCS_!5Y7%Rnb(eG&^izzuSOw{;LRE&Hi`}wt}scpL6dHcL~C`xhK1-U_=BG)$7ZP(ir^cj$Y zMZKkf%q~56;|NLkVEb)TxJZ!OuCw04!8x^zjCq`;U$!HyKnmhkj5JgE0_bF(TlcI@6DQ8IR~6bt3Tv`ssRKR}YY$$8i}ql+VUO}N|i7^c1>1nT1l2&LDD z_K39py9l07d=k)6YxA?ey#XdPiY{yj8{p^_h1I)VI&486sW4=d89G*XXq8x^! zF-#h{6kC`U?bbfd75{mg+mIJW-=RUqwxaN73*o)>`V(`ba}^9H4CCLiyfFVudV;q~I+H-*2VKm_W&eCZJFKt5#wUvjAUrD|!R4D$qo$q+I=i&I)48mvd|sM??3285Ot3zZ*0f zleLR%;^ICxCx>|iLfVC)1~<1ZkhBGk2;V| zY7Ny^RA!8O=rU_B>zjz~kKIKhVl(S2Y>vrv#-__{q@R0BIVuoIKZiyvd|_lPniUUA z@2Vmim2UW6TTk7*wwBb*RY%6Xd3?HH!!fw!vuMyp@#ahu$h52_Sx|YfAxo-juk2Oh z&LP&_-EINXD09VjPtx|7uMs}b#?uQm<2>IZZBfQl1WA~j_^D;8^Xs1aIX=$%YwlIe zg$aVB-Kzr9#^peKTf zzcZIdNO!&CLv8+o>8~^J%*cG5L+Jq4&e8Nx?4S9JuHez>N$Vm28zVb!Lo`!Ix*I*nWn6|O zC7fWCRlc`~se(q@PP(BG&r;T-)M`lRgfR#cc_m4-b`2^?u=w$QTgf?T-i>Rr^|-D> zfzu&1v>NwHa*^N8dYJ2#OZ9VPo$k2%sN1lqWbu#J>#4KiuDZoRMi+7v9<}b8l@{O` z$2LkG%%fYqd|Gk3K<@g|={0QHgsC0Jgkqt1?u*LZ>unffTn2lT_1JdiB&2NF!*ZnT z=Nmoxk>?vtveY}=rqjr#(~ac&>4$>O3!2ZXy4|0>YgFuxby!lK7}NesAEE`!`~XzP zAGuf{QSd}-e2Sqh$7_6)0iLqR4m%PPpKG!F+%iqMui#H_Du6j~9z z`r&hDWG&sY_W>y+_gDaV5~sG7M3&}XEx;H8nDcmRVfXLIRrvo&OE17!kkP~WVW?Ns zN1rGk$gliY|Mm3P@j>hE;g^p$<}1sEG_wIUHV%FY4Veit^>Q>ZMw9pL^f(H(IMT~8 z*KfZkeONdGfcCh;f8dse-})bgygPz+iI$?S$`ccUH|Xun1~i+@m`j_QbCZNisp88K zbKMYgKOxwmC4B%RgtTWiGMkiREGsS>Umd<>Of}M)(*4Lbv6N8K|2`{b&H|W|j9Vj( zk1Z;oCeC!qxz~RtS`ui?*m+*gq1#u#NL1^(<11cR<)Cbh*2f8Xp;FAK@=u$yTx6{f z{ZA*Pjj&bZR@^PK`0DJo=Wh|-6Wi{=&GJ)?miPe4B8F$gx`c-6>@%k!e(|8QSqumj zXa9>Wf7lVi{&ODO$_#o|6|-03L^*EmKuLlDsy$2dz*g8i`x>LirR3rIfORyMQpntK z#HS`JVq!6tkk=omu5yYmO^X9BJL{zr#D_l?c!zo`zAh*#YZVu&Ui}RE0DZ8m%HkKK;xT| z1$-NnI^d1UE(8K>9aSa27jc3J%zJTaCG#_q_zFC=fMDuHx4UWb!?(LuiBl-MeAQoB zuPEejH6!Q{WayWK_O-qU`IZYE=0!k*$4gi{!*A8oGZr~xjSVZuX{^H?@ zxZr(yZOr#(ePj>D7F~1+ftv#Ql#teIeS;g0@{yW6jjX4y3f9DY1a_pPp&BlFhXp&) z#%!Kkb!Pl{B#dJE(INhVE}3;2sCJX4V@gPb0-mfPa`PRciz%j7xP}Z`m0~={O*n&S z2~AqnUfW5s28`TqZW_PjaM4{MTIlH(Gd(YWH-?rAQ62l*dk>nbN%cl6yC?1lyra{c znk5Do)p`fKY7MO#FgYod4YloFiN9-FC_?^W$|I!huQKl@^IrPsGCitc4ehSlUx(X_ z3@zVIZ4%c|L>~CULOZoA3B2kh%atZYEOjzB^oiPJfcxB<5L8Fxk`Typbp!NV2PGv< z8OJg#@d4e*RR7Q93HW}A2eJ36nlRK$>s5Phg-3ilTQ}o(zFZw)n{}z6ABWDV3!^#z z#(Gz@Ev*t{$~mt-Z@ar<#QAHo>ARyxqh_OOJrE7WYido+){Mm11RwFI1^_?xPeNnz zW&G2SK@c`Du}1y}7l3;>O8fT*fVcK97*4XDpGe+&F={z~$Tc}Pm-nFf%y-K*EyGWM zp@eb*2f097uPKq!U#$#!98-qPc{vF`aW4)?Tq)ejGyFyV6?+Ui+6q2w0A|jMpB}2k z8KqAk&=Y(lq1pWCKSz{ensAJwD9kXU1I$|H7`Rp1thI#*mR5fE^S>XvwWAP<;A|Mkd! z8i-mJ6)C|Sii)h_?uNx;;fLA}xs775k7ube%L*gLLomllmKD7*{$#67i!{_0wMSXiFU z+%xVl9=DP;u*3Gjv4FrU~ACId|#rhfgMEL=3zr8KbYrRFj)GQi;5o)mP zt35a$b6C#Co=ci`k~B9L>>F%hscQ>Na}C)Lx#;tj7{GC@lAF3}?aR@Qye&?0Iy7e( z`{G&FGf_F8M(BZ}e} zwr@{4oW^(!rY20IBws0!RAZ1xzDVLl2oc-Ju%}b&NEj^)@l(CCz`ksQ_TyXrs6NJp~ zO6cRfzBkQcFE$?zkh=)D)wA)zTpQ8_&`n5)$sjkE$~s9O?{L5_JY?s>S+=gr_aZf= zKv-=0d{I`RIQ9Ug*#OkA=Gmj5U3Q#F+ad0!GgMT?(Qylk8NihWe^Cv7Q`_EHuB7S- z%9B^kQW2cfAFK?yCX?n7BGE%gHR26%HW8?bOOBIfFFQqRkRCU1Ua&5`psMLH1z4&xCYJR zv7WD{X1Lq?h=a#*DS$Z|MSBD+TsnX0DXkd={~Z%mpjNm zEO1&8J}!rjwm$y4d)`B z^da&G%N?Fa7G-)rrPRhM2T!u)9fn!NoxVrQ1}$*B@utK%vnTzy8zH|Ll?&z%uj{Q% zyZ}X89lCPM_O2*pjs3RAW}qaQMF{UBCL`)SH+|=fnxzf?vtz&N%3m+WY23 z9DciE3N9WGiBqVLKKS?`M#6i)0fp-nJ`~j!Z!I(g?3JS__T;Z+qLp`uD2v>SoOJn# zTNZ}Nv7bu-`O78B46kQD=e%W+tt-!AM43eMI#ZK6u1Lo$!kwSdAnpIcg;!!T*#OU-O|oezs>k* zFEcO9xh_hqEP1Ao;%GP(Y5Jb?92Z3rG?9&v0|9Hq7!jr^;mf(5E6yL7ql*i4%SVZh z1e&w;Q!6_?(R(y4>ap`Iohi!=YRUKbh06<2-JKT~72d1z+IuB1Cn_}7rZqYO|8U3x zdEOG-SG{?Ig}_%Xe5K;4icj%g1LI$n`V0qLJsF>pNcpN_%D4$%S-P1AP^9OtPQU0> zBzHtCpL?kr8D*qz4Bu;B&qDBg`vk*I7z&kGSQ2?(ymlaSi_dH@A0s0Ic7f@oJTT(; z%}^p}$jg^{S+iuN0QU@7Bcnt>723D5BEy1mFL%w6uUQyn zU}nDjI{M;lZZTFcE8_tOUaB`qyvi!$AhmR^Y|}pvHM4+p(XYYt3_a&97nru?>-e?%Knwd;++?Zb+G)9DD`1Cij?;8O%S> zE$Q-MkfUj4C=-_r5So!7ToIu71TFZit@26GDSx2 zyASmvds{T+?%R{;V3SSk$9>bzJg-ii->-6SJOR1c<=#&Z!3Ob2hNB1JQ{prwN&9R2p3N{Q zTWYL~B;hK$wFnnD?E*Ov^~D?TFkaGf^53KQ%vmWCXKuA{;p69;+KTM-^sL`k4dhVj zL_JIBe&?eZ@?*PxeI=&%sYfLdc5X_AwVg}oDL1TWJ9fSFg>Qj$?WdD{nw}Fz@8(#p z?<+V@KiNc20IT$shqTSDa(75u(IQz^fX7m8Y{9dPL32sgH*`cFa{Md1W#wb=prGob zNs`~owGQgfox&DFe&987UaE+(sQpJ8+2~-N2xMNwafSYHsjt8tEVD69)9xqM5HK?@ z@@^eYclTMHRA-On!ENe7rw8tV#BPGrL$6achALwv23LjA7I)699BTS=Vl}phY2c^` zjrQ>+&WcwvWH<>6n5CgZe~vmN2S1u}6q*mvIQem(Yo?1ee27^v>;B?`2x1Xq0yu4s zmEYWjGnO>2lp72_{`6L^g2D29yCimYPux84&G-3^t|RS*$_-Iqzl z?V)3m9WQI!SMR5=>FfPD$Ib+y|6c}HVj^{KQlaTu{Ezsd!an`j?*iyi!jJQgWwxc} zXj}XO$2Pb1?|OItJY;>G*{|=PPmw-*9)11^(1`znQ9<-%*xxpGkGXlgB<0be=4a#p zFG@}vMn|sIN{vP$a>=&9ZCK-ka1oz7h4K=5$Z&l7DP?-If6MCl(#R|%d(!uJy2A0v z)?BI=iK#2}jQp4Ip~0gc4nZ68|F8$pY$1_Zonw*9_=uKqv>mT;q&rp|&qRIyqzx+f za~&@7(^84OJR;3XF~hT7&^_lX5B$Bc@rCFL`|TVQ&8I*fHn_Bkc@l=MZ1dp{8S|Edu)fAescAVd0ee+7!pl zWddHhjFKnl=vFqRRkp>>y-W#)=3?XkOeTMPXG!@7!iX;04w%eNSWNRh9Y`;5k;0eU zqgd$`S=ITb!fuabOt1%X$%2;}Fg-)$$luLyqrEi|B~7fFcl0Q-IFe3#jbYYCWdW(> zmU!c=)ezeQ$8_8PBPwm$O=&wRTDoTi%N#?Uqlw}dqSr@AognY%hF%-GH@qmv^l(r- z!pNilahX95N@hi&Y|a=fm}uUP%&Q19Vd=8VEj2PhQG?lp^XD}9hsu*?BMAzV_h8NR zkX(zAbM*^ZA!;MxmJv378~e3{-bR!Z+vL;yd!2k9Bm+5IdSNa>l0yx>WGyi@T5{pOoQ@I>8{|Ag+>LDWUjy`8_%rmQOX#VyU2n zt4`fa-pV@(SI}r&Cnl4CV8(QYJfA*1&;mPp{o1mMwzv(IL5O44OPp{7Eep@1n-IB} z2aDdyeyga9zvSpcJ=YJ;(|X+rw&HV`kl3N5$lN96lp}|`sQxI`O9kP>gLh@OYPgPscWdDiVgJy!=^p4vcz&ZMn<7%C2bqdq(rRVaVy%*h<92 zJg^Nod|0ZPTp1y#Wiz}aX8l|6Br+=%jp3LLD(J1QN{BY^ba;9=EF833_-1s}zM78T za$d9!s1;K;LG-(%7sYBWbQ+iN>Xt4UV9KHU_LI67+tsGSL((5WN`_%PSg~<;J|^b2 z`PspV&r;1T`ET;iEC(GXLroGb&e_cxM#CMC?_zPy5l31m$o7R#L6Bvh4-l(az_FcEIT3 zN9^;N>bvT;3=!LU)rx(?oow$z7ATS3FXJ~ym@6EosyIaRM^fZoX;G1H_7V~?b3yn1 z&}(~!yVx^a@bLphh|FN8>US$t3afV=Vf*-p1=a@zun`)*LP}D!&A)k;KW*+I&U^er zg8E-{BtLu}S_YKS0&H{M*PYW?GqNykFM#0Q6^7+^8=dn}u@rkHI8OEEUQf+#lstsW z3}%xrnh1IivZqp`1pUxWM=o_4vzk}m-?FnRX&;Kei)YD0EV-y*bDfLYsN(QKiMo7G zFurUh*T-IMRyuYw88bVoqZTef+34hZ@1UICdApo@**zvy;4AHl80VuM&FQLb*H*{h zX(u?7a&pkw7?f2a>7qWQxHQ|&F`acTm>|~IO?ekHh1CgLR(VF3X`?|)3yly8E{eso25DJ?ZL z0{pS)_6hf8r}d@voy+S>3LWW6F8uc#`TR82o4-o4WrUuzIMNw8GuLzRC*dP7#%940 zM)@Cx5e6!M&OSVGPet$D=17#_k{-5#{{JEw)ix^7g2_TVe%?WvSRT?I*Xe@Z@x~b5(%G-x z%TBgX{PZb3^44&ux-_ftUvN8qw%B>eGAVh~{~^B7R-H3SX#pKq+sknt#|CzXLkJwS zdlt$?U_*|Mjdh+dBMFF_>_lBu^eDq%0WZ zwwG-16UC}-q9DU<6JIXcT-PFH{&uU(JI=8r)A#5p!g;;4TX?C5{r^e{$7d+)p-3$n~! z504C{xAV;wq=4OudSl<_sydV#Sb}vJEx3p&d!-@_?lr6!#m+-h^oi1Sk5G4suNdv< z46V|QllI4|d2l6xl^=SXa#U+QxxO&R$Pjkgp=MGOF%5jwyvuIH9v4A4dTc`7+&JTx zSJO2~MXnZRu`wp*`r|cV6{mXBbFU!=Hg$0WpDI(cc;AHj`V!bNb;mJSAK8fR&Eu`A zr=b&Oo)*qMAsUs}_bYCz^OYv3hOL*@^XD!oxNqxn)Z|&r%IfrrCe6L+ofqBAsqV*? zx0Un;RvBTVj?k9`*F(0P z<)22r=?`nR!ca=W7}wQU3PscJMt-=hhfSAG!$g;uO0e<5WS&h*=yrI_E3ES|aRELU zalpbtO#rQ64mo(ox}ik@X?H)qOSqJ}wEyDi`?OPjN!fW;S=Oo8Y5?x;m$a}bnQ@9T z3Xf!Iv&1PIKtHKnEgXQ>#{A3+&4vRxk+N;&R_qoM~vhHw!uYR z(|fk`x`4#V*E>>S+c)k?8cI?s?;5@U@}98tSH4DDm_e^Ce_?U$oNCd=)XjWZmT;K+ zi5xG0_7y&HJHywA3JYtdQ|xs6G=lT~bKtYFBo1xq(IMTMk{rC6csO8OnX5|#* z0rb-JJ#c+&ZzPxFFv1rF-TZDQe7oJy1%E7SRtKKXG;DgovZgsgY(XTU>CZbca0w~l9%8^3ak zbR)fZ*i}V)y>SYbBhoZ`hx}6by^yqF1(G6`IeoScDuJe#B-a8 zG6F4wt{pYCwWNpgbl0PrV50KHj_C}rD4|!BjcGuQdr=GL)2ILRq22tKxp1w)r)0xV z-V}!ee4$tTt51T$%%V;@%&adp1EVq`QK^;{(c1r$+A`ssF)-NFbbM46rv7zXcPTnD zDNOw`Nwp&E_9Y8qKnB}jEvzq`xzr4!Bt~b$)^C!!OPRy>Br8Z7* zdpI-+`cP2Jf&jrd3|0x|l*21&On6+|$3h4FB;gC5AB~CP`Clhp1k=a|6_-P`qTlTn z%17|`X`^hZ8WTS$!8`iq1r}blqyJ!T=8T33Jnn1TWe(D_`9PUh;}|q)Rd2?`1UG7( z!U=t)I!Fm~a*Ld+C7cQmg5+nBGW3)c>_0pEPQ}ph2nvNWP zJJ6CE+{QsuV+zX(#vAwF;@NHGV-ko_?R* zWfm9pu@Ugg`z40&F>2?m6jsaN^DWV)NSwr(1;$w7^f;Og+6W@e9(8W4SD^Jr;m4phr^4A^tMFfEx+ zFt=2E^k+fQ9jMnf$cN%M_LZ}aeQM|TV_QJ4m-SP!UtR*meQYr9syZz9#>vJTm^x+P zzSzPaCQiGke-%RnQDAMa_U1P`t_Un=F z-SnQECaJueN6*GUH4;#1IuK}ps7T*fV{2adDZN{+uptXd?AU%iMIzWVXGMP@w|c4Q zCGWh1bm61)VTY^EmFWA|CW;%VaA5vc2Pa*yarb03o1W5lqD)8+41lyTn!~4E7R)5pc6D3-b zk<}(NWSl?llG_{ytG*m_n9*PoIW$wFBUcP-VA;nrgi+JpmM4qz52V%>SePP)Cw49R zxetCHbRHGvfsPXpa342lLA7F_GQ`P-0l5Ngn(h@C!%X$lrB7ZtTCFu0B@1j00c5Ir zGkC||prB3@j8;`>l8BGv`v=FPVxEv1)kGP z_cp@FHFF!jQd!sY!FdSJvt>szbrs3Ig5G8+X@FTxWWIb9-azAb5d})m>Bh;8wIyYM zdnbuH@o~rynJO;1?aMPmk@>!7_JM~(fV1dW=YV>j#(M$+Gi+g4Z)eY!x~)24eNuW3 zE=}PXE>4VTBIeY5Auo3iqiL@-u0>kzkE8AqSrcF6-!P)n!`F)1B4NY)@2W3?(}zxv z1>SF%$}3dG4bYMfz5BQmqqNv+Cv=(DJUUDUoORq$%1_dD*HRSO!?ktigugN7u1Ld( zh72i;%!=AD>j{O<(5%WbiPwi?ML*VDkv4?vXf=77y&d^#EnF7MT7>Di-rB#a$8mielic$Kj0u)0u(Oopr8x*@Y z=t!vPhk*``z7FW*|7}wB1sKl+eriVrWL&&Ux=?I0AUOH!XZmMiLJ}i2Atr`Bvc8sA zpVY@S)a%k3cnmp+DM&X(K?WJibp!_n@fi=CaTWHoAsF_RFKzXl1^sWg)(R~U!C5v* zuNC|Ix6()L*=yZZ{A_%0D39Ony?r1aHFO02?Q1Q~Sh}ik7?Opj*H*bu~iBvH)iBK81 z6@g%gpV2nqjqUtQ1;9;NRaVMUR2>I3V2!l~4!Rr+TPC(sTLf#m^Nda&^Zh#h{Fdj+ z)t%M#bq7fsfc^H`aRk7nzwFdR@l*l>aQw^uMI;1PD!!1^XO8iSd~RF z8f^V%A403PxVkhh@_xkzF*EN}c4^ecAUtG*w_8y$vD``s63C(U7{-ruHUO@}p9{)R zu6^rH7t3!7j6x~XRxBconiCSw5CK&Rf5R<_>l&49m60Xmz2r5Pa94BUXq3W%8=KK$aKX8Lx%XiCH5N>oXE%mI%PWi8c}?n+@DOO z)_tm5;!CpK+Lw=Q*9JckL1WcW0~v_jwE~Af zYgAlaZ8J9nsgWw@%l^y7Z@2oJU+IvXNOv?W*Kh7`a$Xk>uujl}tNP`ORR=ci&xsA& zUC(x%nY)Km-x=;s#!mp8_VKYt?cw2-Sm%WL5@kV;c7L_Gcp?IS?O``s9KD@9V2h2z z2rTRV>vlqsWzGOS-$Nz(79+i8yFzrN>o?0cB|NQ}8;b=0o=#Ns)g zgkRcaWPK6N>(`waw0!&AWmqB{xA)^fXYbpp6IBIFFSVfKz{0*Qw{Ozpp<2+DbhmiI zGDC~$s>En)1I4|n_PBnAl9g`?z68P&^Tozo&mrfjn@X<}^eK#i4_($8BQw5|W ze#kQtWbUQ7cqyb&nSsG=j;2rQDb^yz-g>o{&t_7>&td&;q^|HWB+D$rmQZHYgrJdqWM{E>O(_$o?BMm@XtDA1_T<(B;i`Gle#DEVT zw0jr2cDw(Bc4aX)#eL=V*R1&?vZL-f%bmNo1y`u)3=GcK~Q)?|&-0WV)MYo4bR z!eJ-;UGsT!Chy5Sui))_E`#HrLVSLzPWrc^5r20x|Lo#*ah+1fz>gR@Qi|*1Eqwq} zKly~EZf5oBN)E=J(25gAF#Y?^5T@OL{8n`IJ6BgBOhdB?YUl}i;{Gm`rBH!m+Mqd= zA`_h7qSjE|2(!LkR@4uN#?#DATp_FmY^njvgAz+W4YM~C9@JAr^9^s&@)e@K85MDV zfP;jlG3<$mK_S!O@&o>)@PexRG^{HF9)r7Z9=21k1D=iiyyI;&1KQgIt9RjY(^+ZS zdO2+v&lRSai0uc`Z@PX_H6S>&JyFiO51*g4sSnq|1$#D)Vd%tQ!+l%m6u}NHwlS&5e9^M zj?|po*O@8v{`v#9w<6u{UWBkYh96xm5*Ou2wWz7nRm!*GEZC)IyxYgK@+mZ6xPRib z`-mPl^%F>}odi`Bmbj@0^4 z(3AcA5Vcy(aCR@#XI^**NEp}Hl-(4=UNCS>OG9Lmj>!e*zcb22M$`r#BIZyv%E3#W z!-r-fJV0NS>xa`{nrN?+?bg@5D<03p7@FRrl?oiy5QnveSK}A=K``iM|7EiL`%X#w znjx)K|ICRgu>J_LCaCa%%g>6)iHQ@2TeA(~53ZwDA&sID%+zI~fW60UZM{{U(velV z*CIO7pR{c67W8Cug@MI6zNUB+HR^L(-?~*}beg7e7#TqljF|p#*t6Q1HCKaHT}zZc z4eTcVDeU`M1*o8112b&C2@=hHJQj()yPS z^@VTvvNVrE&@`3cLpBRzJ3V#G7byXA0hFoT+^ek@u3xr@o+d0&b$esnBjnT0jZc!~Q0n8!Ap+{7;NPQ?=OwX$fN%oAKe;X&^&v z*PI79QFXYQdTXlxVt~PY=Y#t$1g94yiR`|wN+T-RMye{iD-U~M8X$}DcQO61VJXmC z@zd=-5*o=4GBCYd0}ey;0-?@tc?nKGbh=d(FZHddQe7>JhYTVU1^Ae4_`>!OBBVy% z_9za^69%k##6A_tdv5RtE zdh6qgU-;pSoF*l=4YyWg>5ZiS!+A!W6xPkw`rN92;*I97(}p8j2epQw53YrIriJSpDC9Khj6#kP4e}13Dy3Ss-?WdixtaEo1f3Md zJaHc3?x#Hoh83UrSGFDtmRs4vAXh--xWPUvVk2;tbz_r4U0SBp1b2asDdm3eUKzOa zN*jq1R_fqaR$?^sf)^i|AQdq;Zj!US%SPksRYD4@4s#~O1&Wv_j`8eysc}$88zb=y&$Iza+|uI}iAtp~u*`1=`3;A4sEmDe>R*wx>dj+~I%|H9Va=jjol z!o`(mVuqM&+5g5gV#FzZ$MqA=D^ttyBg|yarJ#!+jP0WlIZA3yEJ!;hsZ-_S{$lQy z{A{)L80^I%*p~pO&us2~jj4MjfGwf%%%yduY2ZxHvcLOn4{8Kqb*D0eL{gQ<08X3R z6U3~()i#1S?wEyAKgO+vK~YAT?x>eATS3I}B}esQIJOeAA-%XwpSe9qeC3wyG%H!8 zrc&|t8Aass%*g1R|KjO{g(c__=lQ=?18HuyRyvs!*N(_Kf8?IV2k`qf4+pvZNhd)D0Ujh@hc^-T zSErC|2jf|=+|)r2A-16@^phhVz{q%+`($|y|aJ+YfF;F_4iYJi#g$spIMjW zBFwm&K04uRX@$=BNkwYSzRbPDR*vrgq&4+#F1iW}ahAjF?bs%5*?_N)BJ{k%X;OJe?inTsB z68mr9pSat*ZCC$_m;Rq`wg0{2`n&YL?d`a!)?6A{mpFf#zWN$a|7?g0e&L4gN@`Zr zv!?1%913&O8pSsKmX1X9a4Fk(<;q9XDYrLv&(GF+SDHno0bVnMN-#DzH!UtgLAe(hJyA`==W1(SIu~@ z_VS!~Vh0v$$oi(Jmt^?$BOn5W8900raob#+?L)Co2y{B^AG;Z_=?C2i5h^C-?^o9t zhvkZ!;(Dlx?h-rTEixi|qmjuqWJV}(NTbgJ@0OXOlX1mxG^^Os|B72i-RwU4JIv)(exaErB+*q`L2Tp*kWR((IQ{@XT{_U}TTRPv8$U93#}jLnFEGj!cRI zq8Rxrl4JyKF59{mE|VD3aW%#oTR$vo4#xqrd@ z*%py3?4O_3Erl7$@`Y$+FuQjD>S!)*gr*c7tR76jg{oYs}#eMSZPT_TNed~f354|)9*!v_P$ z6>Lafi}{~^tl~@ljQ7XjTHI?#@s9Fi-to4Jh?ASd>!QZseCTEhQsREY z$rzb5q^9DHVzR2u_bme!1sDDFeYVRK-tM=|G&(nCnus4O-Z*`Ais}`3L$$FggY-G- zctQz$saUS*FyvlqScEtf%PQP^F-rrTj{}izo2G;8Y09}{y2Bs7+SAk7oP=`dZ%jZW z;M0zSYuK@I{0qif4L@MI5`Dmcd{q`6(K5xVDJe>Flw9Q&n(|6m^E?c8#;L9Ucb#qa z;hyG;_zUJzuV?35Fi*b|{r(iH)sx?KQXI*;I+)HZW=T~7g!2_o?*zhNFjprw`_l02 zxN!LsvA5nzy|O5WWi;Idvcpu`Zyx3v11XzJ>-^yDYHC4b@nh{;?C$3^kpY@T`S|H) zp@;C7>{LXL+&{*O^gqT5-O$&gfxrLw(F4?LE!yaamcD%?%vP~k*NDT{6Rgq+Cm~$0 z{OIyc*%rJSqbxu5Se+FZZ=UN-;rMd~G21eZ&@1alH_D(g+tTi@958QQ97J;2o{r7# zxYW)(&WkIB6-b~YnMT%Cei~gSg;>Q68i-F4c@|B@6pudOfbchi`8B7-V$7V%l4Maf z=R_}#RqRrpZ{gQH_Ep8g?(ip3cW~Z=*;?6)5mQT z0ss)xlS`>8F8G+k{}4dX`CtMa{1R}4|I-j7)Ln_{K9Wkp{#iuL&8X0ftoC%AeEvhg zJM{qA{J!iQ<}O|A499DH%rPz6x>AeB@1;gc^CoO@SLp3--#ffWQd19YkJ{yr^U;}E zRRzgH^s97P4g--riD$SI8j9vlvUfh6zvzrz27K8Nu7F#2v~(o@e)Z#1wQCb`znwf^ z2}>xQi!&Dl#%N~2o(;Qy7TnB>;AUQ!@oAim=eur-n?Yi`>Ko3|Ni_0phnNBLm~=P& zIQv9thd0Q?uqC_q-;yf07XuC4v7K6!WDHx1C;sWW%7J z4W}4yy`RYg9it>c^bMM7kWxUjCxvl>5}dJ9H0Qgd;X5T$sBfmN1QHTWR;mrr1~<1Z zb`r8~XpX|$M@H_=qst@$NVa+YRuw~pAwlT=wy2GLwJJql(=_Q9d78MoOHR%XXRQ(0 zUvgP1vuCI6m)x}tW}eg%wv347N7U>k#e>JXCv8h_MzxZou}WMn37JLg(-s2tkppL) zlI-(4D)fE1PYP1^PVW>dET?gqi=BQY%3;6yjl&1YU&kvmvdrlG1*5v_YXIlNl#=og zx}H48xDY1_(jhDl{5dnhoLEW1V06zrxTO1uvD%{^;E|AH~M#4#tt+dQFlO7xc(Z|i_T=PSh+@Xgi#lxyqs^ zf4G47ZUBS%{4&~GcW#IN3I^-a+(8#Xl2411%4cE4L+9>S-6MiUFDcKe#;SrZa`VMBPTj7L8pTKam<&%T#nhVo63q?fviz+(I1!0i9r55V3ew6TAo3B zMM-V(jm%##Oj{GN@?-MJCZuUVLa+BVX=+NU1AKRyD%z z<@T&2Y`yXXlh7Rq+_MKkcI1Lymxj&E4Zp`xnffz+-|0 zrAqV`4k$0$@;e|`A{p5t?I19`0Og$(RCz&@#D$T?PUqquIR1k1C5KzF?&<=oY>qTY zgktR)wQ{eRx4W~OFpKFyb|Q>XViby{l6wbxod2oH1J&4)Q@f*SVuRB@F>Fe}Z*w_6wnst-x_ZmTg5I<@udzZALOe&VNCpe{`Te2?E~ zfk%vd1OHqvgI>T}uxY3_J3$St$$aqMC$C z@~3?KZ47Guq8S(AuSwQ6J26Cfh`S0J|g|M;tw&ykxhOA*240L3YjOpPeBN4-{!|R0|MqzXZtGO z+$I91W6VafLOP z87rwmW#Mt5O61bik3Z0V)+?!~ReF|>PVf`ZFU8`L(Ak9txBuKDusAU!snQ_!V%XQh ziz;Z6l3+FrhTb{T*5}dJ*Z1=oFpr2AmL*;m#?gJPOk=)Y1@;_Jf#)?ZC)fYyXr>E0{SHkGPZN2}bjM$QmC4>CfK~vnONRJfeNXGy4REV z)S02q3Fi1j3It>Uyv|W2SKg68)IEVIYt&yWfvnY$sR)y$)l)=Ik_>_#X0VSn2G#YGS7ucJMNsM z*g8-s=p#CHcre#~^*)+%3 zW7AE&OwOjC)k&uYR6d5JSA!0e(tItXy`nr>1UKB(P6?FSu{saF95xg z2e%&Ygi7}*MIv*OQiiX|1XW z<-5k29IEYP7w!GbjRcvTS2#+(~g$ zD;NZl;mSU1=DRo=i~<>dCOoV3+l+{)>GFjF@n{S!=^gCe8i=bMWCiVrmt{|f%xcjO zv}=rO5tJwKx86S2ek0I3B}45r6fxn>s<`!+v0OsB-=b3C3{(7e3Q0|zZ$lT^)Lgv3 z^ykYHC;<=bRb~(h{+^6J62PUT#uKE&%b>X&S01yR6?BISH1(cp8>BrBWxYa|VBlXcgZuv9F z=gZ%n>s)Q9BP6G0<<4v_?QG)8^oWL}pI3bWI0!s?q{sIDpqMjA#tGVDh!~!lTSBj& z5%?M-C7a9AAd`tV_Rt#cO+>VvEY~p;=i=q>?nC9zzC7rUs~}GvTaoFowx;}TriO;e z+&*@mMHeO?6c3Bf`MUo=aXdbC2X^<&AIkz;9(^tXI-Na^QY5?{jC?AXoExAbzD^3g zt&J@;n^fY{7tyu4ZMcJy-3%xl=T~Pne#kDUsc|#oZ({vr&(~!!lC5PenmFmz(H8E; zHv^U-yk2y;ddHuml_lh*@U8H+j2ikb)DF4nU=)oTv@8u-Nblp5@hPpovGS7bWdKWl znI-?2pXc5@)KZ9OjYYU$*?MCtamD|e(W%%!!jzlAQL6P>4>>@sxxFNazQ^(ce2LBG zW?>=HwJKd~q7Z@(Jy70RBI~XuTXnjwq4@H910^xG!^QrG?)s=|U|kz{jHg=!K|@`J zz$r&+?9jG33DMQG+}*^k@_jU?J$?W<)y^Xvy|W_X?L{ABt^Y3K-LLu15la9*<2x|B z$=XzNSh+j(B;tE(5%IXtTHTK(V8v*cNZZV4szuQusGHQ&?v%CX*m^s6j&G@3yDI%A zeO2`!sL-%%hvyZ!>)sHcu21jIVp8da6(1Py>dCEmVO^><;KEFN*|mOpI4X@E>U8PG zU%3y5dmB?>gp(a8KU_x@xZZ61q)o(s(HLKb7Sg;>Z411*B};doby^Q6`i6732S*4X z`X1rBn`%9*CVN4{q{=rZr}kWvssMKMK5JUJ!5Ya?;D6GdBq#$^(7$kIvC9kTFbl6d zN}Lq&eTUd8l$4)WudJT?M4?}~90I}ZbrCLo4H29iBIdt*+OirEumnw_4*klsdUble zI|)2at|R)}I-a8iV4Iehhl%?K40*}+GcY1dUyC~BDy;_UKlJJCw)RfUy~+d!XT*+w z!?z2|)uQ7gOKQ2a`uS42^sH%#m-E@VXCF9riGdbpGr_L_2;^A%+rNxsNY=*WH*4{0 z`19BagGAGosR`vN`-t|Q#qTH0Qw~z)ZF+CYOoOc(-1I)Mo=nnI3yyd@=|vyfpNJN) zTU6c9b_2>bSs=nRqIwz1eja!wtMc&?9XNAdMMUz<4V{#d!4S)Zb++dg!bs_yF6kXyg119&cr%J-L8pUDO*H2w%8$%CoC{pJI0h{Vd;cn1BLxg&Aof+P#ozfrv3A zy{07PdDl@mP8fc22maz5c_Xi)X#RrOVsqpQU2u;5>X7w`Wtn0`tF9eo;8SB4ds)vi zaR%~L18-yfAo2n_D|zVWmnLi}kz#W^Yi_f;wR5X}>%3~dXE(ACy@mz{Fg?5^v(I5? z+CB*teCc7uEstGw%y;OE&P|(G@7=V!?rt>RlU8lnSViI4zh$mKNye=BTQTCDy;bT8bSHX_azHF21(r=pw-ZLmE<+(bB85_mfWBz+4US)R-NF3owP0 z0u*!Hc$(O=fwN@$gpZ+z3m!ZFP6&@YeR=}eQwAa{^o4Tpv%hyLB~LX89z>eSNKP+rn3i5x@fwPN;oH0;_EE{~Fi}NY;P<!(Z2Dq@%d)s)N0fci?bNe)5}OS#EDMJYv$|BI5F|HRiK^i#H#f6P0JwH zhCk{$yQV*0Sbug@-lXI=Y*#7!#@YJK;*iI82?$+&4^OQ_ z=Bn+f(5*=G=XZo1Ovh$7(W7X~JSuZT`hl0?pMUgM?w_Qqz(py27%omm+;H^@B(`z) zn_yoP)39BZFB)3WS_%dRYD{<2lqCU8LcKB_>m5_xyx6K<-;dO8$)bHFnkDW^AsRai zJ{G&OSYp4a`l3+IigZigZJ>osoU>Cp&@oMMGzY(7d(+La`jAM&-^+$GiPQdi^9APOQDVjM0v`ZW4Uwf`c~D zcq9t8rzx0d$NN+S&MQW1d0U>}?(g$;UL!x5Lb`=*v9_7=sU;lFgWbuJU=~+lyxEXX zB#mvj?-oL6nY7q8Ju+Hf8$`DifX9$P1OLlY_grm1rJ1*HuO`RPGp^p2+2U=KHR z`=%nO@lOw99d|_8Mre;4qo*5n(;35{gKihmZzj%^Ss^35pn3b9FEvL^XIT7)L+T*B zDR`R`eY-ZPP;K6fb4whVMLKUUp$ywiZZ1y~9+4APiAmM>K+R5JbM>&Y>p=ODK zak&veuS{^g9B4_r-?iHDo^%PkAH=xsI-#FVLWn+I$^E-+za*DAe3s%Psqr9p?hcu| zwxqB2N+VB01V%`YoI;k#P5S=ZraXEy(dh_~5NDE31ddDI&P-!%zN=bb-ZA z{i0=C|JrRWSM}OdPY{Rg+PPzb7JgGp*QqoW%rPtd3*+Q_~V$LU%adTY8_o& zjR1L#q|SP!@;1xroo0cRSdO+vR4~Eh0_&CVP}#w(z@X^=RiN=72h{&B*{DhIxLogp zrzCqfPd&%Iy!hMQGk#nh5c}sXd1qjAf;uysok`j#%*ZOH0t^k6+}Wz2E-iiL@I#3# zE*PBN9+_18$zayuhb&t1oFW6wgaSmZD;kHAuWsMo8^`ez20{v7@O$Cl(}VF!J;KlC z=^B2-V81aAvNK5BG_+jO&KeORogS)1I~F0-(3DXUvFxubw>wV%F+w6yEWB0a?6B#m ztTS9$JC$QPo~ab1wDXL7JFygs-!! zzU&BSJpsyP`^$d22L{J>A^O|&*YgOcVu?JZl#OkPE08Jeo0_&<`K4jYOi=WHDE$M~ z!e~0b2~k6}lWzM2sK<|qdiJ%TWF}>!teptSB(4T#y&MK%qYexPbYAqEFe|uT6my=M z$lIAxag>(Scty&&A?D@I_$=|h=DyDTFkyY#+mDB)O1;z_uXKJJkqpc5$$CvBRxiw8 zQlNJA3ggi>=l&&dZ0>0Y-(C#9dG10Q zYI;;1WT-F#_2*GMtKT$tCXe@GSAp@T(`Wj~!m9_pu~tMxK{rhkGfJxqbyqxsab2it*`q&9 zxYni^c!qzAM>Nxd&Vzk}=Im^2#~WeKL!N*dpF@Qm{^1iTQMf&A$S<4XDl5z=FE?FQg+T?x@7 zLr;--Za5HBr?Fgj^R{h{o6Bn&O`=`?&B#QA=$f_AhKQwf{4__KRsjgaWQO!*t)sxl zhv!qxuTh%Z$Y*s*Q&th%?GNEeG$;zE6}3iw3jZ(xidp`l6XM^aykFpUYhZp8-62*Y zkhPMuDj}P$0LX1)e?rjP*XCG=e1C^va6Hu!AYlS7)OCwWVu#Ot^8GkDGUUPNw3%Y| zZIT%13n8`S7tzwt#AECfbo&;Iu*?T)nXYXd+WV>|{w$%YJ5pCLImq>pTr90ZkXR_M zyV_V(eLnZpCbscdl95cI^f|SH`YM=6CC>d(MyrS=?h9~ZMykvMIYtQ?9A%dP=*!?x{kqF1E)1LyJ289B;^up z%o!wfWQA|2ghHG5dK>Obyj5L7e2SGWEPu+%Z{@Fv{->oT_Rs5>M= zZN1pq(*(>Ho4|L_zck$pY3&5-&1tiV;9q0=$- zoO3L4NVFDK3$04+P|bW00*O|Em~a;I-_%>t*spK9fF*_)7Vl0k;l*x=8#b3;4<)N) zvejKGbK7}*f0<<8Q_b4Mg26FVDNP#nN0Z7ciXI7VA@OMFrl*Z)ZH%T6Ky7zl#Nj_s zjog_r1GWXl-06+a>A2E#Yg11;9}fxh-U90>VO-0Gz!0xvh+3o(rD6Gwj_b5f>)T~) z{T~UteiRockG}F2DeP+0BzuHGH}Uwvn^v9S;H?oT#Bq4b>TqRwN2%LGBuebd-xRRX}DQGDoO7R&%$Yh z+lQ&4yHz(d3COEgBn`#X_-REdxN{wD(nWnzC>utef4xmrz#pews`#nQ<5QSBvx&%` zz;^`|(n2?U#y-6&;T4#E9c+p?eHosO?{aKa>|DmZQ5^ROIgZBt%=xG1LO-D^ofIuiJJg%%f7}ho~I(T8gZyEvU~%z5;)@+)EK^V3Rrr7S6l1G+*UnKI9+eY!nEK1y(0joab4qBYgC zf$>SM@>+Y|mY0YWE=~Hr_AWH4pKmyJ6!dR$%eJ-O2%%TDq_dXD$A08-_&`iXJ-2At zm!Zh_bXQD~gB1_0LJwV7pgn5=WDg#b`6QIKZ5Dbxb=%lOYWE^z?rq+pX( zbJ&^U?BA;#Jmh<+`TVroBg?Fo4}jfauz z&Rlz*d!1o_`#`6Ay_jFc*kA8PqIio~+?JH-TTs@)^lZFh;6PQLU2JNNpr@V&RutCMxy$@IKMDG1dS2>?F00Mf*y4dl z^a$Kx=6n+C@X};DXb+==v=*JGh`hJs4XxB+F4GA8eBZRdoC#(l zFNKlTit`DJi_Lq`agkoVWlqc%7VX6UKrxKp_)+yla3IhpyJsj)@*nf=J-+S}mJT&A zjTq>lR1HZncZFEj|h$H#W>WsbJ->*lEJ!>*_)<7O%^?(=3e z1WalYTv7hDi9&lR$z*>Y$!h2ZU?QMxAp}0cGoVoOp1J$Pzi=m261%#+W{@sB3ZK?rS~r793-=mvf82QuI1u%}(HLcPeXEKN zxKmP5;?`8Oc+0>)b${5NJ1aF~zU!F?wO-d$Vhze~@y>Zj?0L{<8b~xtv=ct~ z*)d^f)1*-C1KTqx(6jVPM@ZxsZNF=!#S|)QMU;6vIxs<=n~P<){U`MwD0}VxAHrL_ zP775b7oK_Zz(Tss;%CA)v5pw@6L#m}69B8*sS{<_9>5&9lBc_0e~-j4nMqgRz#usM zjA3C+EHUs7M6(G~(ZS>|NN#_GklJN4y{G*x5b)8Qfi-Q!7X!P`J(!f7c%;7#bhsKh zC~-<%uPj%?w!X2t82a?6TK|Ik)_xr#UNT8{oyYtq@te25 zWQg7Tt8jfb<^CPk4nN$#eDl~_$pe1qd&IX1w2BcAM0}SX;2g*;Q@yej;O47$5OCba zq#Uv&G-V1=wZ{db1em-FmE=8V6y z)=bj>cFb~*4fZTzwJE#W1aAgbQyt0k(!$4jZfH-D+g8hQ)os`@&Z8c~20uI{I?%q0 z$o+8y<{ks@#BW#VHDmlMoGNz0u{8#X(S8L0HV)X_0d+ZVho#TJ#@o3`T@oz>Xd5yv z9Bw7-zD)xu{%$E~vIyHWKtZg=9v&T)g`rbpKTVA6P2*`O&#v1vz5hGqT?x}deE*(B zT`eT^WBYT>fE2NWbtuFKG3-;rKFE~Z`$fa@XS|G712Vu-@)yk5{ame?#PuwJPKPGd z&tZ!Xmai zypBbh6eQgrleg#))UUlyC6|xofk2V=enrG2$$G8)WT@CVs6r3i;&BjiDaH*`pa6#) zGH3*2>vU~pEXyw&0c{$RU=HU9w>8!+z9CqYhGCPMi39~fFY}7iWIe2lwGF|k*!8|q zsGUBFaTkP}0RRE%zFa*E-o4|@ON3NtLZSViLM5((YkoAGX-8lPT{LdSu{8Rza8cFK ztTSTSKS<}hfr;Ul6_w;S>pJyHtJO3&{}2bE;1kkxlPVCow<3LUkLFPaxojFoPYN93 zvJgFEvY?-gt08|!)EmT|S1XeTP*IU~RSq|Be^%etWbP7LD81E6;pH^vl_WUE7Bhm) z9y_U}joMf>KTOwe45_nA5i}|P^vDZZ^rx48az(+yTfY#>ANksCv|W0ec@8~MmqnV# zwWx|mD&LHET|w_#LLh2 z#~?wEZ7GXqow4(8D$YnPC>y^}d>@SYFXs)0vGmv0WVg^Z#vx*$&&SvkO)2-Yl;9Dr zR_V=JJePaqNREKsv(m-UhU6Fb@`{bXo%zveagW1lzMsD>udUn_WCIeqA~Q1Df_h;e z$_f2!DN4#>!6aY#z(g}DR5;vtb@59?Li~rN)8E1akSo~izZ$i@S04QAx$F$2<7Fak z)>h*mW_)yimPd<{{v+kGU+bZzVDzqK zm{v5OZ$^)oib3F zGSN^*IS3Eo6Rb*t3T*_{$f73UecfttH4t6ZN7}jCn_HHiYy98);U>pk989SG99{qL zs(lcdA{F-c^=T73;kY6aTq4+H{kHjBn{>u9OZfxvcXbHC7KOYbb`e>hkP5vihpTN* z)t+QmFwe&Q*2ogk_oQbNLk_Y*Z=@R7TRMcQUrvMM9^rt4eJlzu$lY z7?eSglYCXWkGGef@o!Y$1t$!`SaT0yvZuN^!~7Qq zK$D|ik*qnZk25&Jf))TEc5;BPc_>!OE`64q|66dnky*sw-+Rc^pHMr@{7;*!d4?@`#CP($DNiliEosv)68Wyw8!`Ka0Y6_I;il~E!G zLQaDW_y5N4QqEjcAw>C-OLIJL>HvcMubtA55V^Nv`N=zbK8M%Se5eZLbA%F#+mWaj z5e?h(P@IrZDLR1+EU9(;)k-5t%O^Ob<(_Nn#nFrKm26v|JI7(RXWd$Z1&06V$Z?0N zD|PdzONw1dC70=+n)p=LlvROwQTUS28mgRX(?BVq^!7il zxec!hQ7{*_)`qS^N7$lHKQ&PCWix-k1)x$~wln^S%ZsW z>CImR5}p0U-oa6Ejz6Me9f`V)%PZ0JqWAY^K0AK1ZVn9uQ}>DJ z&f9pGvK(OAs|kvr7&qU=Yl)f6YGbi9L@47ps@6so#rR>}L7TQ({3P1?pyo?)=ewkF zDbv4ko=q{@E+WdMb&Y7h=B*KYnGkC9yhYB`{tpywn<#HBS?Gi7(%m|v!d5BL;{k>*T(r7HHFJN*g1t~s>@o4 zQ*UMofqyZxB zlPlN0Js6c+-*5rLfJC#FYN!Ps{J*G?%P*|lf0ksm=72|+2UF026d#StgpDa8_wDTnC0agfB164$DDc-E__!a%0FA=z5;g>Ewt@I(k zO5*^}7kxu)R4ogRtrhythn=RvrO6rH7XX}V8f4GcMAX7W)!atGV!aMUqIhF&H51Ms z=?95Dq~e;mU5|6FGr50~%@c9+Vy(w<5;oRn!lxx12AXI{v|+6>ze0Wrh&8;Z-*>Uu z?6SFrdUzRyO?1spv=?w+3cCi;TmIKU`MS5igosDKejC|9`D#_4W5PQgAg#Y*kD&V{ zZfNMR;p1E=T^!a54}!@AQ;1sh$>{ZwgF36TXV5p=>kb*PJ2JT3pW;|7*n9@X~g!6htj=qX?GGNhcKQ^ zwU8nzX*E(bJVlpKhUwTcjngEH0*Jp}SrHy)h0FY4Auo@$Ug2)lLFM7m411bVzyhJg z94*-oU_Y~X4N`K=%eckgq7`}mfiu@uTN|1}oQ2OA9u6sK{Q?)gf%G$EQXI`lfxdWQ zzfaO8O&xbm9;j^+x6&Y|tMJgi>i*HO-r}!a8~d_p*oh0D3tn|#T6j4pMflD~t(3_U zuq-0`V@YGE-5qUcY;7$5iuWiVBXXk@%%Y*huOal6=~RF|21MZAt=%a-9hdoN@VI_j zXJHBa4vJtAD(i93Xyz!AP7og+gG`OrE~^uT;Rn+hl(1mItApsK#PLhN8%Q*EUEF1U zw@IBan&r691;j>_A)MgCLi#4ig2XcvD#Q}2U3Z0HFO;RQm4VIxH@02Z8pMq?*vX}Nq_L9tKwajY4w7-ODe}Y=qzZZU zA82I#jIiNiAJ=nWv6E|HY;X8AZHNnD(CMhbmC8*tb!zCV%gt6-z**?Vo%YNnrN5Cj zt=2YkYh#=WgS#bS(S%AY;ZA}yrt}9!%2_KzQTilBKb&PJi}}eY+ngt#fu+NWKa=o? zkhvg)uZr`HcyaeC<4iDp$C2NBciXQl#h1UT?FnBg@rM3I!nHvnT0B~Yo0{&s|E3yhQLElLRbGPZegf?xhqvI3g>^KB2_!XU zdOfG}&(c!#+LD7mNDNWUcq*TMe1CTMbiDWn(p-VE;S3TSVn0ljt4F;&m_fbP}Khrq_KEOt$NUhO|I}ZR3K0q|y3? z9FM|KJG%D)w=amkdC`kfE;s$hkCvB|+pG0RN~n$!HcF6{aM;L+mo;jjQEz;*>T(pS zJhoClyF3Zl3k)qC4IxU9&TSQ^##?j|EJ$J@aZZ3(f=O_t)~)UZdh=@W=O)}BSuH}H zw3fxQHlhxxIG^;O`lfQyG~55PlSi#;~I!vV_|@p-O0!&8I%0FHnmGRIslZyLYxH!*D95;J!0PFFgM;` ztUnRzF~WkEJE!mjOA(&0-)RF*Ljp@6?5pcsHiW`s^JB7fHb%>>ql55%PU^nAbICX` zq;zl^>Lrh;tS~<#!+LtB-jIJ4FTK4^@+$wQhwko9fJPSu{$iide8P#h9vR$(qg35= z(x!qtOK z9mrqX#+^@sq>r5RYiAsn(UQ(yu)lC5X%&7DRqWy4|K$nho!H3R5T^Y$1J%qnwLZ*J zh(ArZ%c2$17Xju*n7ya7kVbTaf`p~B7|I+Xp{r1iJKqAN)@O0zMBaKMDmbUDLuTx= z2g3nwY&EbBFapiF65C8g(oTOa{-;!O^ltf8%&G~9kdE3h4&9;7qe>ZV30~TqUawrw z{#M%B&Mit1nas?g$eD@XBNpXH%%LmF!V)E1Gxpc~%2f2_!0Jw_Ro&%v%g>bs_;^SR zos1rh5~N+LrdWBdGC+06HTy7xUlAXoPiRUwW$4?02 z>_NO{-qnI9|`=8cel+w zZ^jr%w{iBJ>VVN~?azenPlR})-*1d*c2`3|7`6QtC6h`Cp}9x$z3+>=H~8Pwkjt}F za570*?Pe?+b!=1K`O|&t1P4?ia_V9f$0n5XkP#tKLrVgAs=r3YKPNZ<@H=01uaglF ziT0+67+g?CvKyaVeiSFt-kd{E(WI|Ps(`R+%1bLVT*(EDS8_KnJjfsa676+df%q(5 zSp|;DIq@5JUbOj@bk`sTpJgpMozL}lpkMmS>h@N3%Wh%6+Ajx%MiRQ%cUoTOF@6>O z;yg0?Wy>*80oY!gdkX@HwnPb?`){z0K@!8*HgA-fY~(nn@RpAS7|wDu__Yo@tJCN* z8Q9L~^7*WQ|3EDgflOm<@L!DX$VaT=u4B~?NQtc+$)X?lm18?YJB1WTnak2=wbVPA zxoG=tT6OI67xWN@l6^u3gD9*OK~b7Vne~+n)jeAA=8B~S@y9rr+Q>e6TlZ>?+^9h{ zi7M%c-H`<-KxPl((|n)vA*TGbDms^Wvf^=F6O4v2A>)#kkgJSZFSQwei4tGx_!0-S zjz0ynFNEu4?6;}SH)BdecjFug7C&8y6@&OJoZK;8;4hI9F4^h6j~5T zeU=AE=>(#f1p459uXq`R;nYoFS!Ug4>apeCc6VF`I6CML^zP?t5}-4Cwd@@MGJUc^ zE`9f<8&&>Qa7*+jV2OuW z9nbB0_@pZZ@rH{u+%GH`D4NCRF|)B5@{gDS#S!&QHTEFcrU99Q3+_4s8I;;*I>IxA z4=-$*u=?(3%p+zTSMX#p(0jEinGrjtmie4kCj8 zzn%Kl+;#Ie9PvM|=vD^PCWUZu)#O*cYoTEYKTa^L|Ss&xid(Zvm+U`$fxN8i9Cu@ zlpl|(CDObxyUUWwXR*_6ogRMKW3`%;AxG+jj+k(9SBe%-D=Ej}{pRDY-ZTKgSs)@@ zPXZCUlJs$NAtilOF>*fya`R@)WUDluw_01-Ij;C$NL0N`V&6OAB*R8wncdWaAEecb zLgCO!Wk=(xl_Xd-kw zR!UP4FH0sj8Ls^%-XY~hfwvikjT{x$k$p^KsQdo011tm^e8aPV5?$(RwyRpSPf9e(Z zUE(`Q4S?}Ueln}I40GtLsm)alWT9r^8MV5$?QRm%tF&~ZGRR^mm>p=gcX%dS495-1yj2tnJ7+9+>yuGJawH7742+ z1T3kkHcYr{8c7aoFk4RgyO36`jCzttR{}Aj2L@HzZfwQc@s~0Nh(jEZuS8QSs1R0= zl`boFvEG9M#EYh?xFY6Uny1JZC{d0f*Y9A&JdilmY3W z@Q2SVHHqN92*^PN)hs6JuzFer?Sb8=_9Vzt`47EQfB*<>GgL7AH8|m82#Z|f(S8lHDIc)tT;R_fh272 zCCj3MZoBY3@7DVLduSuMqy1kn)VOWuYaH#H0u>7!ZKx_ zA(3?dzPTAX=nKmZK+%8{w*C(BRH-MB9I^OS`~wxPI_~ig)XX{C3d;OHP)MDw4KaX$ z>VadGcM1c%^lqLB!52uYppIAg5A-ICT+y2tVAS6zy{M`D7fHku&&+^R$UVeJNscI6 z{&O@x&^_qgBYG2!F>}rK`tL1+KhW>-As7BXI|DsX{YypQ+b*U&pLb^TzfTJLAUI(R z`53>*MI|Q2pXd@IbKLm#RHCqsMRIO3sU~J!k_46S@?_QR%@Va-pB7rGHMqZ&{SA z+l{D*N*ZFTL8lBrZz#(mZ9KozN>3$%u7Os=dVF zClRp2=Cq7I+f9c&1TvInE~r?&CYCs5M%cWl^urc|*D*tAzdU`hCVI@9pjbV}7V&`~ z&=O*N{ChkSa!hyxWO2oqi*w(URVQ3G7;)mfBmKOG4W;S|H32XbDueHbIB z>?p2%{Q7v^P%ndG25Vi{FuR)w8W)u#>QNiZ7`(u1h$-g- zQ4bQz$bYzZ+)2>+a}f%*)&tI#uekz#Gpfy5Y%NXQE~@Qb2NiC~_J8RjY(_Td#< z6A|p8*><)h!ro@q>EbuLV-Xht%*0m5MsoN7* zZg`3Fbh;`i$LD4tnIE~}YTw%GBCj{dJV>4verQy}n%|sQs&8k{qj{Nr8fXipyb-G{ z7;><=qJFAGf}8t9^0^@j@0qd-s%doT_$bto2HcwMdypcnqy)Qh+)j3ui0=m<^AU>r zt>K6jFu~cWVm;4T>K~wv*klaCasDI_q=`{pGO{jsR$+e4ZHJnCZJL}E13re~23{f# z+|n`cre*#}J+Hc6MOE@GjhT15?NTmujz#SXp&gp8grhitD9$06c-1eqLNk<75q0$^ z!9IQClW?ZG21STi?j9Jx$&2F`;yx&oI6WFCA~M>4hN5QWmVyRR6!P%H@99OtZOUnJ?&x< ziVl5dnJ>^>dI?`;KNSr~{i((dcA5mn5IB1*mOvN?rgodUZjb`Q+5aY{fFt)r_ORz~ zV{WzGj@g}woSNKP0@*ujot@kbF8>zT?m81Cy8YW=;#_cd$7DFPJo`auKd530NbA#V zq_Q25hs)C@7pFb1!rx1zXe z38tnQ#V-D~!f5HNOvnLNw|Q13RpCMUt*6lc?6Uezz$|Hyo_ne$$X~hgY^u-@G;W9) z5Sse^p8wQ1Gos|+n8Lqae(+tj<+~E|;yYc^BotGXiRb&muVe?zWvorCz_H(Js*BO3RAF=1+LnZSS#rS*@di)s0nw z>@Pn?I+%&CM=j!eS2#$eKk)pmI_+a~gqiKVg1y@{_DHH`Wx4&xAzvlPnr(D2Zf3t7 zX{EE)6~a!0sfwxB#l@XU>6eQnxQZuPLxAj(L*zyL*yac_i!j1P?-|9(@w#zvdbmg> zUtoJcLR zUQYA|uZ&sj<164s8||WCm)@6`{E(pyk6@;ZaWNo&+?o(wo}zq9rM;bH74;V85pWGC z)5RT)gIo7(bS~A-9-JZ}{h~IjE)_cx)f=iKx7GW-m&Ia*8^zwKlaLi)s~uunhDTl4d_iuuk&Wpo;DvK-Gg6JGYhW?)lEos!}V#bVSCW1 z(Q|YYSTk^GPPR+tyO2KXdpFE_6g2ae-ab@`J5c*v^PFu(lpZT=Za}K7zcR*|BAAYF z)UDE~WDIg)_z9_^BlgKiW$c99_bj2Ua`S+XaXJ_@WRKxwl3DP~Jq%e;*~hEZ67;{& zx;TwGgOU$mpc^NPj<9#VBXriwE>qR#F{ou?3e71d+W`-HNQ@sRp-=?mfCyQ{-kd(UULsymZ>0K;P;t^Zspx_ zo|mg)e9Ty>76ndxMvMs7INnEV`$fYDZQ%QyV7%}A*n$;()aHBypB(G>-PeC1z{*QL ztuM47OZ)cn-EQWSw&SI*QNXI^5XQaXuY%tKuq@!)X=b;ikm96JHlC^3Cy!C7O-Poh z(GsccLytaVjbKEiNIfR>=7&}eZYzGPKE$U9D?nssZ3<+Rs_UceG&OV0a)Qp08|M>w z<~79xNEMk)nTK37^D@^Pz1X!|2$FA;exTY>HnGJpl%og)xq>10xzT7Fxeo3f< z!Lz6c>d~Bgd>D6zk4=EOfnqsbmTDgi1sfKr9j~N%z%rd=i`9b8o@7Qc2*@=VYnP|y{nh{x z{A1OC|4-ETUw{}U)7%%Qe{jYYey6j4|JyJ=ya2*YJHTS!5Vt$N#&MYFP;Z%{5{`6o zxuV=+fN#n!%eVYZ`Hc7=r{V}xzK`XBqUF2$1DEEN4cO{$b1ILAewxD-B79LNxJnJO z>4x;xmwgVrz!<%dorG24+XjC!>yEGcXR-q72TMk^JD%qT?;i~{x3G@{IYnVP07I&G;;Iu-g`8-nH!&fd#=I?Kc4esN>d zS52|GJT70Oh`~ZFsb+G8oZp6l_0uat9mpLZ=%@mTHU)n~xS2A_9#DSFD~i$BEzOsk zOWmaHr-o9<0B%xUd(nedyEe}n2Ha^64RPaJohM>asdX*PQO@>VKNqP6p_}q&6zWnt z$CP3^xuxC@9feLb=Qjl_XZNdH4PmIzerr$(L9HSu5GIDFg0XSKS&*V|l&hz67!HYj zp&ZwKh}&+)d|jN76;*BAuM|we2XEoJjFRz?$#r6%+PZdCQv|sZ|203aSP5b20-BZwH1wXQIV?$SZwFcIELr7za`q=4tVJhwruZ;{_b4f}I%0Le z%2B@$^oj}$`gYE=+7T*@JGPShF;&#a)kh+Kys5SLV~AGQB$q~W_EbQ%sn;oQt*Gq5 zCnCLOk5BbWNUe_9o|l8DD9n2+Q*5dxlO?7Uwh;0bkvcB*AU5b-UQTACGJW(zLvJhK zr%4)*pVTnF!|NXTXShY$q%|@e^3ky125}p-IJ$?fv#p#uQf;KsSA#x|jCJDJLd?p@ z6j{tMPoi>b>NPNovOnNTGK|KbAK%)RVggy`o49Lzz~Q>%EzatYb5Ch)S`E!RXC-lM zN1JfL7ca%U`67H8mF2Qy3C|u0>>G;SLN^$wut8(Sfv9j-xi)v_HgPPjAX8oG-Kz2{ zWq=;M`yY!kO?%ltT5fQ!w((V-0F)#S4pYY zuA07e*GesVmUqrUB}mcvMxb zZRJlyn;y|*I#c-kV<=uqStcMx(dxvQ-$&W_^K1mQH3|GJF6mN+KM!B9rw2J_4tz?3 z6yB>4cN5Em&eHPJXl&WigEOJf@l|f_3^LHnVOsdhF6&3hv>Rnh{sr_e^lqf{o^A>; zlArw|3>H0pz(7|YP$@)rTV456sI$v#%StWaaSA}}kx}ZZogL?(l)6=OQ(e+4|BuK8 z>Pl$RLX4F0-$;Yhfr7!d#YMqbk8l(4-Zv+wt`>wJnr<;e(lk#~@1k%5N z(XfyZIH;Q4+_a#xt`~_d$E$9^NAzJCZp}QQ0;>^zRL`%(2wz<;wFA9*%$A-^kpIkw zYP9?sU`bmcfV3$m9Cb;>M2)f((} zH>`ne&L^BOoI1TQ*(l@`ubsS#k$kLmb9TEw>7JCQ!*|p%=J1nPPpMWw- zvSIpZDbeH8;OfPkTRZdYZd@$uS(1~_v{s_5{LLS1hq|o%rHkbOaYB>>&y~^Lh{lz6k6b_CRTDnagf?7g;9ysfL%x>4ZhHy^YS&z+USLy3_fk{;PM@hN1T!HdIOYv+ zlDY0@4i|29bd*ljARwH4w;x5TTx%d~Au`e;(P5ien-{zL9XCxt>jny;teDKAjEN6t z>5ynD14!#J`SAv-t^`HKKBtpb01P4N0yR0aIh+&|Q?xonFI z*3^)H(Tc+h(55c%Tw7cVAsjr%UuKLEDc^H?K};@LrqqDh?K&WMQ7vjBMzXbUzkrpkyi*YJ=%f0aChl!?z$u9y|>P-aioPMkaQ}6gur_`+vX-6$;Nk^M- z>{8`aY?|5O7EIcA@vZGlJ%o1k`wakf#?qiDH^pX%C;q@K zCC0&_w^OHLdkg2L%4`KajvIPeTQ|TW$`P%tUiV8AEqQZB#41I?TenxwF_5FpnW8QX zvmu3T7;u$QnNKRL*2^wTfoPYcJn)T{L~m2n7qjC^Al8Fip7@@e!-+)j8oq9@E4%*9 z0SjM@&Y<5(T~*^)Pkwl|og}lKk3^TrMPh^^?~Jag& zbN76;HzVQs*|6^7{TCKz^*To@#hJ9$Y`tGxv63|_uP!wkgVgg zbCAHbW%$$hXVWLVM{S(?B+gBGB;&}kx#{*VcTIO)Q^kL7d&UTfFNT0Fy+&hRL1C@k zQl;RdM`;Qa=T_%Az*!6enw#rnNXDfj`zO?DhN=up@E<&2P2Kou<8p*Ehk_Y0WG%|Kf*U6&mC$bmuan#--s>Nnt^dUFE`e3`OnR8G*>Npu;ZHHt!VAWIa%L6GIt*4@ z0nmGBcJ~)S|2p~)*MC1fxR1XIO#&=2`sz;Lwei1jU82W)R_1V zW)1)h`F)G8=)j4^Wxuf6hEHW>jcC?zlpV~yVQw-&V|A$YRi}0}T(IXzGd6K7xe50l z+y>5R)^mnHp>qS7OA!d))Cs>;rvj(xy9SA*dBmA*+Dl@m=AWX$3Ajew)xrecBN@Cw zmcY-KEMT>sb(CzE1Dl2{K0P{tU3xJ;Z{`W*!nJfJG8%@A4csv`kCtVW>Rh4^=O(LZ zhfn&TregkF9fN!A*&~mh0-kA--WmCCXSQ6fsi6sI`guxWa0q zz{(I3wqW?{g|KqRuR=J8`?;z!2>b`Ij|5hsY*0&xKRH<71_Ytz=;`(e2fGZfkLdhh zxxqTl+=`_-^a^R-2AL-R87dxkZuN9~W;Pz`E#wZ?w@8bW z3tBT_ElT+^p{U2t0vfdYb>YSWwz=bBoh3dcVYWbt6(C) z+3c}@`}r@OHo#lfyCaQu847~msP8?8LjItb*bU(e_WxC|lZw8;1CUAiZqYYnY%1(I zyMf%of5Wx7%|$Vr*ic<;+VL{^@f!$+?uZud>XeJ~GPyO(j!;(V3fLje)Z0{6)h*kV z97spjdzTk*t*r<#wfgzh!88SSBm6pTA)7vi$jWSSFYZ6jSn;lvn{p^EJnK`i$Qjhm zaVJV6W1S)!FEj94Td)Dz_vJutmfPIS0>D%vi+@0Z?Ir)@%s5v z;?-ZxSOcZhPv_F9M&oUcWENCR46gIWJd5U=$0k0+^mB6q_HVwpn-|qCao=`oaLYhl zO120S3A_2%YCM6f1re2(2L7gHdrFR#Xvs)-=&9_8pA=rEwgQh-W8Fd% z40Xt>#rb`YyxG&NCBkdI_Iu+_2n|6 z><55m5QPZ{`)~1yRAP*p>K0}+xqw`<9R^$MfxEE7Uc3J%wfR3LGBOw46+_q`Mrc+v zDs+sR79uk0Cp1Lzs$3`Jns`l=>~CdG*u@XEM&gy00PN@;ZHVcCLlhfMege6_*!Z;U zvI+~dDKiFo*-R3fd_AXLw|#I*0)OB#|C`nT(xZZOO50cR}M^`&rRln;P7O?@$} zB8ZC-)Lz~sUmOF@(GkVdV-XQ@#!<|DC5bG@?JXzQdl*?bNPyX48h9pylquixW461I z|F~e#TP>JjH_O>%U84qo36A{pYsKP&F_3t(iP!wx+dqo`M?8En_??mPAMs$94fxOz zJh%Y3=A-wEtpEtZkKhm6EcK|o)G<4EJoEE->ftAhE6nkM!h$ANY|bKZ2o6CS{ruwz z&d;wDDC24Kk40J{QWNsYcRFqw(=XJU51asVyB`dzQ1C<3ELMl|2p`d@(~0rtvg%0k zefZDGeeG;xe?;uQYYf(%iG39!gCB!M?GZ;$5}eE0(AGlt+3kW=CM_4%iJ{UFomXVT}&NnwK??BOq=pUGIsgq=7O-)XZcN>{t4`c@K!%fKY9)J zPW4ajOww9ljv7qS?AfnS-itp#?yiE@B?_Tu?pHR}t6L7^r(kmi5F#r>;B>T{5N4tP zbybOJ#u6aL*1N&^@6g;>RfVDEGfU+UyDYKMRwRm$4)*E87Kw=O1HzB6s^>(|Lw@bZ z*7fnu_xkt%I(fU;w4OTfu&2XHomIi^(-$#2yND_nnTb@g#C?MwCiqo>EWZ-L_4HPS z6?9mb`j=BDR(gEJkzzcpN*`Z@94D?_CgW3cb4GhcF@0UEZBv6}rt{c~*AwL66jn!} zbD>sF%*Cqhu$z3>9*+2irkIQ)^=zBk@jWKS6u2pwexv{5eQHxPD2#|?z+zOlwrOto zmLb*IRj8OZ*2xRWHM>I1R*mB$49xhEK~x?sL#ohW?7hcq>m~z5+Gsw8&K&5MfGG$^ zxd#x&S{DHs1x0PaVi+k5hogKhE23U^YuBsfNdT; zJj`i<#yKUi@OF1N8noFhkk;O=mP^$SWR#7xFqB*IaiW5__Z9p@@V*7*O^tOaY5GoP z?tLx?V>ZMoK0~){uKc_flTL@kpoa&+C|tamx=p&53IBkBoV^I8G31wtmk3>n0wbQuOax9`^cv({!F>aS%RBLh>VHuC<6y+8H zzO^c(xdV6(!=a438Gv30{UJC#|NdvofFO*gXrBN?imL2{a*D##QYVbA>yZW@? z2LK|!cgC>5lxfuZ?bE06aX-{WvVkn}ittut?I7$@KdiW&>cKBIy5gQ;ZQkisIY-`R z*0$XS-=Gafw-bl2Su4A7jOr#WMvcjM^nKU_wwaSu6w2Rzxy0EQ?tb1ZhO#Y>%$X^srn5);0m~%PSIAMq zGZY<%*`1ri|$BP5o$k}tL!i1G1??=%_WCac*>LMe^qP~RB%I~CVYQr+&o~GyHQBvbLGXl12>=dW1?Pl;@)^)`-5}C z2duepX#|)5K|og$EyvU_=e$s`VBfsk+5jdGK6JnK|ISoJ0D*OP+V*`?8VHXWCS(U% z^+aH<9OJvNbUgBNs~^t&rTNILk+$qKmanQztP&A8Bww@; zv1>PzwlU9aYgk_F%QfM!?}ayqV?i0{#c+rtv-<&hk}-N*Kf5HWiJ6e~97ik4ns}nd z0|T|AX;cPjXp_Vz^V(wn!M_E>TCMJRmxH!!f8C^F&eqLEdU)rPDJJ|3E;EH%jAF&< zpVi7u@#p-5yM{FjIJ`P~Vqy#6-EPESiVK=Pe)TY;<^x^D^Z2^TDnsRC>gp0Yk@uH& zF`s7yde{w=|D?v@UGE$|CFQ;dxrg-9n$=xh;#8N{lt#=KM0CBl)-7?29Rj&D!D}~$ z8C~-&WIdl2>Egav!oL5qJ}XX92Ob<{3v*$9vzyivr!@=LznY7;X>t8^t6dQ{)sEw} zraXWF>Ro;wB`J>Kchxc1-%P~R%v7EPYAh|sZP^?>y{q%B?+t&z4n4Kvu=_#5LY^?U&fywY(mNhzBTuAC@+P0iB{lDMi0?sU(K4>JrGC@z*nx)JFi zl3EUW1_he{rNBMgqB)Z?MPJ6rmx%i2{I7j|JL ze$J0I?QY!^je4R3ww93i9!d9WpT6C7(>~Cman(elP89{V&9!qjyTng5O!n0bK*M@l>g|%ogp*dZxRKKMGxQ=_$@i#< z*zZ&!!}~2>ZQ$6s*ep8Wrv)lkxTluh0E6=<=3aJrMKx6MT~)!{R{9l^t@f<94)9FT z78UBIOfP>zI>=9oRI&zg_iNc*zkHC!l(GEFPEJ)?lt|o~cQ%Xb=7daf$DzbDv6$J< zi?{DC9ylBq0^7c|oV-e~mI1B+h~Jq1rIfwdIK~V&wqzj8gGF*G(*Gp$0(}TEc8pXR z;yQcH#dbXqrSZ5(AL2}0$Y|^tOV7kWT~%r?qkB-oL zuN3)DS*9q}w%2lIb6c}L7zc`1NGbPg5ajZQueM7D zBpEJHn=1bZz-93z46^Th!*pkbf*^3ob=&$a{` zCsqu<@SPXGtQI*c340cAN~{ko(;)U}>W7`hMHa(3EcsRpv@O^_=`HAotB@O1;U-Jm z+Xvc|yGv8Jo(H^JUFPBI=c_$z4ITK!R6Ot!_J{0+;RKNx(~zp7$7S*2}9L z#-s?|kwxWkmV!6Re%>=8zg*4e7x7VQpNab2$29q6l!AohY;$Z$@fb+X&C#AoG`DLS zF?|92g~H8`#3Q~#$vulS-|WtF&q|X`OyObm7%N95APSO|A3a1W$YK1V7;wRdrQpRK zG_Ed8f7QGnWnntNXxvXbU|eQq_Gc&{=akr-)z*F%a+Ozz4zI=V`)__8?IiMwE;P+w z&DOp`rRa&$66%i=rH&}V0u!K3lDbFix_v1gE*q?S0J(bFiBX|;69lz~k3IdqH1~?V zX$4H8MZ`P_D=ysRLAWy=VF-f%siPw6U3`F?<%|=?0X@?S&FNUB&PzoZWG^3OIIuN0 z)5KOAk&UUgUA;7)-LYK`CiXKt`@@SEZr*;(ktNz*@$Q!%VQGJmvxQ%fe2jEj8OM5GP@npPR@n*LG3dX<3OK!cm zokr;`fPD;CW37w|aHVrNy9tHgJVGE|hr+4oKoOns6NdTmer6$*>ayO_y0fp<&6L)k z2Q$%xT@SazY+_aqz3sOT9LLF7nQl$n2>6U1X<5CKi1G)W7-e>xl_U^AoIfnurmVaT z4pRh5Y=0yZ#NAahShr?}WIaiymov}?p$uH5I|&jJK76A#!fgNG#vf|qUSjJkHkMR! ztf+!^%Sx82pB4k6&pnGpVI`w*`+b~z6Xw{{aoFLs+giXZSboKE%+H2-qpb6Q>Jo$r zNdpvKC@zzs3^uws8h3OmJFPqr_d##Y$5T;c;NR`yPD1ZKQ)0=rn5^vFKi)nwx4Oywy32scwgzsQ_h{2OJ7 zu=6Shu4gp@bD(;_mkxK2>?XTtEJ$kN+Lr_iuC6XMt!5!@8p>}9`}oSZsP2Fr23!n0 z20+qg=;fgiO~iY#bX~(57*@^IdhzwwOTrHwlIg8($rghgS*iHK&bsZ48G`(bYdF?d zf3GuuQ28aB1PFSA{T)DKw;ke?Ns`KRU^g1Em!@BOr3@t=(Bo@o+8m|&sdw4Lv)-)7 zf128on7*GP3*j2yPd=1wy#+qlN@S51jtEqqYi`@czMCQJdF#^Dk0LOsnh+l z16y*lY)!quOOj_vlr)o_30&T>d!iiq$-hE;n8kto_TA5g$x{ff?QJ67B%ut0uXPl- z1-qeu;z2_eN6%OJ&`M6ErnrD;kVy)kz~p+1<3Bh$VG*O@Jl`f4h~3)zh6%I@}2Ne4wx_FO*?LTV@z$;e;$w z6l*^;`3JBkoy8a7%IS<0#vz1O7WXNypSG`*GGrq8EU3*D3t4EOtZx$C`5)X(vvVuc zKB+1Cm|+fuZJ^iRvF*g2iHicqKug78N7zn!>PY6m6+K+9Y&pIxg6^D&S6taw;L9T- zjmHgY*7ds{iUAoM;tO=cy7_ySVEVWyLS?c+J0@~|pJC+jJLQ2ddEuP8VS}H&388wD zlIzg6$$xN=cBgIOKmY~P_`ch^*As^HRw^M_opCSO%aYx=Eim!m(antK2b;qc`+D;m zYwOKkce$Q{^)4%(X6{w=RB~xKL#+>j+ECcs#3Jw4k?hSLgD`;{zV5H?s{;_JIdQxM}1$a8&=3}A393ZF()Qn^TLcMPeckbe$pBiDs6l& z=GEh|k-#I(vGk9nH_R|~0tUi=OHQ&H96uY1RUT^SO+W4+L3Mz1wt z<8$Gmv1%3xL)mlomF`;)M1wt;A&Vd%zOYVk-BiNeJ+`_Wjqzg~H~)qO!!;q@ayI>Z zr9ox;6pCIYEA2be2&=U;)zb19Vu{U@^;u4}rT4r5J%WNPkvsv53Y)LQKN!_IE3I3? zjsYU7C;BPxh@e=p_; zowDeF3A`r-uIoX?A` z&@okX0kUtYaO?*xAr0#Yw*AQazDAOV;lYwI-1Kn6CjqGM|AXK35{CaOcNo~s5xV2K zftn`6p@gTzTpcSb!FtXX-8A9bxe5d0eb)mm_bRLtBXcUn%MJ7N9y{?u?Wbvn{mJ+# zN4XH92@dBL;0v<@E&F$o61;QtK;rdCF_f*2-j0(aq`k@U6x zsryVD+qx9%57w>oacggT>br9Ue#{JA(omH;KFVZr9b5kGEty8~=UL=3UWdnLsJ9#U zaMZeJuwEGlxxqr-XL(Or78l7!i_N{<1bpH>vNHLMXUj$qgFH_V>FbgjUTg+1Rx|S)TQ^G1s!*+d<2`6vI zyXKd&cwOsO2}*J~8p}TMls`uSN|2WQC`x>q`!CFVUCh!1b8!6VeKMrs;q zjYYXq#&O0@%@Z<312!2DV77~5ubb=&S=`AOQ`;Gk^C<*%C8)>Nb4<^@yI|rFvO4a0 zXHheNj;rxTTynyOP5gPz%mQcm5aA~)fy`sh381+HtLmu&s(oz7D-))>14ERANU@q$ zBaIVA!yiTzNv(zN+hTMs)IJk$_#^hHk6jKlK3DtEhvSRj(_Hm7Xoi3sTAUh`Sk^M+ zCuH<`ctk%uxc|CVCXnvd6#XR4@V=J^xD$CjS60M6LP0d^*wtQn4Lk5#eFVa4$2$#5 zUrB|^Y39Pd68+8rarz8pemnG}ZwMq5>{^rj5GiPEvtD%fLQ(UoI0a%3KQvVLg+8(= zaj?P94E%+1;Mxa-SzS`h7y0odmzu~CeZpB3xairYGvt#3h+&5lK%xJM=NVRd{oV*p z&l5ETMRAmT_qxG@g5)A8vb7-=jr_DrYm+HGTHnpv1U-_#bBYt!(=_{eh`dNU3c=!{ zy_NR;dgL0ct>A3pQ13M8QbdEUT<`h$Bkd#{B0=Q71^bCCQkYQsI`h@AqIteg?Zjw) zhR*MpzH<3vL&o2G0nTc;`85)y)o=sDl!EDB%lWh824!Q6CH*Q)BD zTP|&Fp$lJ6S70a=<;yS$w*rBWJ+xV6Fc6k$Hs6prx)zbp&*gjF$V%$uHIDY`s03~e zPCk!DM%O`b#ISj#dU^N|T~v{DM!?kENnHxu$A3y9g(HaZb=`O0(Dsfw{w~q$6o7zME$M zj$&@X8=j+!v%?FpM9NaH>3RN1K&G!oMCm__n1I) zy${z0r^MeFP257xU8$$NMNID=`LK;+rsf`GGJfFut*3PLC}`)l{}EvoT*ii@0lo9d zQ3t=M0<+{I-FdDBs`tO%{PD$L75wAMbqXw_B2tj_ay3jjaXo7mZBfaY_~}O zF?DDnIi;VZDrE7bM`HQz&EB)4+XbwM!q!4T^(MdOCc^q8n zeE}n1K#_QIxcqxuQ=Tq}h=uXxQNJ~@r18>m<_UAW^mHay#|}KOT;&Zf?C^wIQ*lo( z3^9~?*-e6UVAMUQxR2M4Pnb%g@4^LjBdDtuHpNHo<^RDE`K8>~&3RL%8S^Y?I`?3@ zvcgCh7oh^A+oJP}x3xWO{>ccB$`rg54u7@UY68D({C=5jQo0tGC}HnzR3 zjr^V9vxd749dY!%(4XC`TgJ_B6ar1Wc^Rw$r}dc z-O@^|reb;zjqC37fT8uU;t{U*JMUZqFj>xiwuy&%8+yC6BObIqQc5A~-NV5DFip^| zwIz-rB-L?%KwbpX=~jf?4x}oS3esbD5^&4rXiKhqIE*L5oqSKT6w5q(QLbyefF?(* z5Rx2)#o3Dk!P`w&R~`4QYzCs*Dn$0N{QN-Z1+$;IC>0~4I52Q%f9x)kK~8*pv%0&E z!h%CwBI5Z`KV4j8{Sz4>P<6(rju62iP$uNPIBTGkj`$%A%a3S-{D08evi=WpgJM^d zS*Ci=S)FZ>=}sRxDSfh*BQ_?pkF?4lHWaf_J(K@9Wgy_sy$t!;@vuJi63Jutg7U}h( zTwU#S{$tKqWJ0uz;xj+5C2S`T#={AfW1BtNgO`9$rA@2}#|EyBT?4}4{UR9!D9oo6 zg;dJdKj^h^Phh27LbTd0$Vqy*jc0j#0k*&Q5;P|%FBYl>Xsl_lW4Bpulg{ZDg4$&#^tZWKC;!7D3Dr3Ch?a25~ zJAB(7!U^`!O^A9-mNWZuCHNS4{u6235_ip5G62~vbyi7u_SrS3-?)U?3iiX0&^p$E zsJ3X2)wd0Oqp9$G|3c{y0pz3Q<;+|c;Te157QgXgz8i%6jt_9xJ!NCIivWDx>G+94 zRp71`FgaEPPJtl2s~^AOSUmIq?%AOuu3?P=_v$8UL`J%*3*MCWD$S*06aH9>Q4N~h zqhceye*qSjkTZoe*B4n3sS6pIKi}y_4k*#J5RjK1M&=MP{+{l;{?g5SAj0fA6UvpV zRtJhKW>bZygtewGY*kGSyNgoSvcKVSD*n9?HUC=37q&AqjGqx2)_Jc#^HSF;7})omADY!Ppqp1y_<-*HRc0o2>j))*`#;16?nd#W~j$9=e%>GG@H`)I!@Z@^P()AGnotWENx(%=F}RcRnlnxApn7K zXxp66pm;79P3eItpF9UB9a3rxRf_oeK_{E4bh(W26=p{uOpb@D#mAd(su>zqGFCFd7QwK~SN#vuKgEBb z`(m}$M4IThql7G)>Qvcj{NndvEiKQ`*5L@+bUB@Sh#I}sjs<=z-5tiXZ6I`y78EeNsg~EEK=D zH^);o&$$8+|1z{if9x_6!IM6E?aX9V&eWBDq z6J8u#8e~>DPdm30*CCD&turh*63$AjE6%zc_1?wbtDc6lILX8>te`LO1-51<$BAOO z&Q2(1&IEBl5M7x}DaAoPtBolKWkgUsz}WzC;i%2T>B?um2zOQo zpw*<4O2FJA6^*`}BVmfe+Y5{WpqWMn9B+hHC$FKk_ja zu!f_MJy$@tZemkTMje$U@mIP`J5qqLXom1HIfzS1euNs$Xsb;6TLdGWIk$!EFO9oJ z#uGACj`%3}QJitifNARNw8>?%fGVDMo$u`bHMrGI%9X@lYm39aHQ%GR_KRCOovCa(-WsGuXF6a8kH_Ku}1rB!I2VlcpNNMIcY+n%4;t~G3tq*FH&%lLu zE07q)i%`vn&j|QVfSmY0(hLL|v@t~SFjrC~@D@aE+XMM_^K-n(`0`)#s(wa8X+vIe zYC9~&Ig`aU=dXxu+IVzgWuKRXJ`%B3`Gb|8q!BCAG0iDe@bTfq}ZcVGkr&{te`eX%C_Gf`@=G_`{(eA za*=y-)ihgsl|!{GLHuE^MnV;3WdjL*fi($cac)z1hURs2ix!pr6m6pp>RMu!L|^FZ zuf5-LqZY>RV(ZxepL8KwW_gYaswPK#QuPMBB>hfZt?4v*dUSv!5(hf=y> zJO+kRON;z^0h7W$>pB_ZDr#5b5d<{xHQZ0rT442i>!S+i_^Wfh8&xlJv;Gy!Ohtd% ztZMq?)(V!3q(l}O2VQ4B)%_#)L@%b~Tx>4e4OMx>=38J5o3Xw5k6w*ar=R2%!ZT;@ z?5itAW{>VvsAXc#&2G8deYKfJC-Q^K7n4-VAx3j28Q8~pfPFIK8O;JtrMVHREy_IL zif~A))j`UtEVqW4_0=9(bip4@>fdQSxM*=3_SG$VbTp`BWOodUDNCAGY>t{KA^11y z`RHqmzo<%aU4TzpShTN;%0H&QZkNv?_FD&@unCKx#PPT%!ugpKQI!pP{ z@{FBiIe!xl@uL26nr^pB^sM_M`X&oztecq2&H*%9~L?DV} zwAwa8?Rx%YXYjtyr0(a?>H6`6ohZ`zO_j8X!J9sF#6qQLhJ1Rj(K1L>frLZ~6$?zX zADc*{i92jUm=I9X&Ue&48r~Ghb_q1JpFAaPGnA44xJ+(in`O@43XsNc8=03GBf!yE z3PX`{mz6eolet_k%%<%JlXwRPQbWw&+gIy;tUvzjWiCb5hObqC<)=r%jT#9kJG7VP zz6{kOX*zSZ&G6|XsTQbkBorfS%@0z0p~W|Mok4NbhPQBo{c|5qRlr#lL|Ch~k(IoO zEolDWkN`1kKE=#NC~oD4@_w;rEq_iw8WZ@{sK|+x{=wb<=N(esJb#;Rww8OrS9TvO9j(7KmNc?WafE$!)%_T+ z>r+s`W5T4%fWMMIe*3}>Oj@4G#9)>!=JUDrP;q8NZNrNVtN|jo#YKDW3}&(i1jC6v zg7E*+sIXdL*miSbJQ`sAjWzM3QAz%M?gbX2IO(K*BOS_(ASj)JP2>F0!ulHrn>I+g z+i;G1IYs^lC(9v*O&|Zp2Q>Zr-1iS|WeU)VfyRw ze_zS`{14xMKz)9Gf$L1Ho5%8c`|s~@1kF9=1gTUy0eSq8RWV0 z_5yn$EjNPHkt@tDhc}_g4^!;$koi^4UcKhrde}}z^zwE}K@NFK{d*rtx9=kC!_1uE z!nc?Jl-DjDqIzQvmN>n;(VTDB#({d^W>@Zx4HAx0&;0P5B1#xyqNaB%kI=&s!7AZp zZ${+McTIv{A!}!7AfrW(eZ%UG$}5+qcfaJ8c=lCwdJ`?3`>r50>r5;;tvLRA8mDFF zmPDbs>+rfXbUN(WgoDozG0Z$&ifZy z?MF5LZCE(z4-iQyd}ZKEZKL>$i~b-V+X{QA6SggXf?r`2>(`|C?-+qQnffnx?w^Ez za61x+a#h9Q5HhnQy-Wk}+M8BhhZ2`%Kw`_~nk#nRYyJHEs3vz4j`EWsS9GGteyRX8 zv*zTxI;BIvZvfm+xEwiz_wS()dmJI z(mT7ebiZ;yOeP`7D<@l?=abP|p=Bc7;B6_tdK8nSV;V-Ninm^ysMzDE*fXEQ{Lmh` zg=drY{Iia~l=b5^b@JZXVUD&;)=zOAO812QfO5gCu%!iP(>dbUI(L%jP zYRaiW@*D4CGER1b`u?qtW7qsTzdQ{6)jH1e+1`C5e%fXc`-$tI0QuiuF>Qxd9Ndnq0tfDi2g#KU|FO3gwS#kYgCGgq4}Si{!r%w1`< z(H7tGeHCwKl(>w4hXmXBRHyJ-+v?f3>pWFwc}=Wpv~Hm@Iz?lbuaZ@t=M2ujINH&54aW2QA?letQfz-{ z5M#V`fOaHRFY7KqsBq!;oLC#{!{Y2JYzd}aPuqc?EWAQN=Er;PY;&_$%#{-ZeSj#- z{CsmdTeh-6CJRrjUWUvaK^>^@Uuh`Rf7w{SU)cU}6Dvf`l%IRPEnt=lWe8ESD>47< z{TaP-vzRK{EMW0(r0{g_cAFRx_?lT8Eo6S)p|2ELQSGa@NxUe<`hbS&wo&PNV7>}k zW-rQf(`2p78kxskPI2vZdLHRmW^@+RF?Y-)%^31juCZaQ|I81V`VzqvYC{}R+n zSaG$Z8MdVHA}#DZv2zZup0&pNyk$C9u;T>~Jt3weinrxpa4v7Xj{Iat4`0gNV1ife z6xcUq%bm6g9f9J%RGBY13Q#IqhAlVa83qlJQ->~2TOcDD-`_O|%-`?}RCzO#RK*!P z&9B*;?kAOfnf%s!W@n;FRj2R@(A&~pTl-%)xHkl4WDj!QXy=#iECm^vUpzdMoPe=-|~Oj9r_Q zeP%-cR=R~ACqRTmDm|2*4gC{8d4Yl-o6URaAgti4XnK^;|BI@(3~J+h--mH%ahCuE zg0#25&?WwlKjd34 z*^0}YA0zvXdFJ>NSrk$Jsg#+jx-5n?W`5eBEzY`w5F33h9jr)fgi}1?JZF;q^cn|- zm^N=9Vs!vq<5*knM~i9Qt*@0|o7s;H^b{gzHK@~DJ@l1reKLQk`Z-0uc)oQN{$sb) zYe&Cm(Mf!d2T0oMTw((4Lz{kxUxQ|S&u#XuT(Ylv=g#X)0(*Mhr^$Ieh)Tp5w?n2r(aPrf|6M(3p{L3lVXlg7pccVcpVkD|GkGhcPE zT^B|X7soI)X+E~w^)c`h?pNxn(WYrG?8v_hHBL5uOU#L%4VT+y{TI4>789487cwq* z5je#XDM_1~p7c7@xZ6lJWtOyQz#WP#IIvfQdN@_#c~?t z)!d?Ej(5y&*boGtXsYcj_c2PN>c$yJVVr8as{FEgcKYY3Q<$#xbIgFM|4(j$=&#wkJ9QlM) zR1>>(BrfZbDE{*P<%9>?{Ap-YKAx~_>T>j_aUG;Y3;XoL1-}SXL-<{#BJ4nz z&%!+~k{<(KE73wY8GX#5%4~EQN);`l$e&L?gYV?c_bFQE%W8wSL@Vt18=l*X>etW% zApfrA=Q%KFe#%G_pj8f^U)?BLZE-Qv*BLA9{n)!Nf41ogaq8{H=v^Oi9kJ(eX6>7e z6PaWY|8efnQj*c&WH#n;_gnAw=$rgKDU-GTg80G#iJ>U#hda1+|Ev^Vwv}6CJ5Ss9 z*Y=MpflYo>)u@}M$2F#&EoL2=yky`pAx{-04do}R$4CB|Qn!q!Jn7NS1&97Z0Dc6x z>K-vqd0NhUu433L_Yt#~Ij`oK4CHC_n(d5Tyzja^IrgvV?b{8Kc+0b?xS%<+Hl)~1O_X&5P>E%^|Qs{?W^HemvK8@%vz;S-B?-h|=0jGraQ?4uw z#fsuiQ!sOAMGT+SoV{l?IWu1Vb4bo#9{^~t=eoZmpP12#k7ijiFt?%^_QW6#*=ytS z()Ff@XvC<7xA$?xHU>xS3^kr@v{j>lKQ7`G_%PWMvXBuX%%xoyo;y*j5cZQ@k z#>oSO`s$dzvHDLh@^pP=9m=u`D-fHCu)G@|v=MS{%oH+xX1aDVRKKumdKJlCE3yZU zUQL+V(U`>V62r#3^xWS*Ne}+Gd8$=wp+IFj_KZ&&D^Z{|DYD`ST0RyAmnT9sK+i$O z4va|3$DK5LhJ6B0vN{kwtGBp|5guq?OR9+-1v%UqI&|L?juU5pXv=N{$}L|xG{hFj z9IKV|HiNw0@w$+j0$j%fr))|DN71_iC(GNk0NHP6^hb-mtftP4Ts&j)Y5tO2w`3qv z3e>6*2HhLyjXM60nEA_KJ;E-zHk~UAXaBsc>O>(g|S+A@a@sRDZQ>6Qq;aPQ5a5Avc1v@q7RE z)Jknqd!YjW;zz}~`8#B=)zgjlu;kQ8%lXmFf`XjJUOICA?5w~xbHmU-PYDBWF~N~N?QYy{?(tQ3h@-&{+_ycuO%P- zyOOep`U{DW){rVZ-(9tIaC3w$NjOfsv$-htdvJ;1A29ChSotzO_hrwpSl2+(=Cd8< zGx5l@jF8(mghp7qqraA)CqSVk%h_4LDtf+JjhwuCJkNGNi;5>{S

n2+~JRk|XJ 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 RsZ4!!G%j#D06vRH|Jm3tNb&#x literal 0 HcmV?d00001 diff --git a/frontend/resources/images/thumbnails/template-ux-notes.jpg b/frontend/resources/images/thumbnails/template-ux-notes.jpg new file mode 100644 index 0000000000000000000000000000000000000000..43cc3bd992144fdcdf2c1cd6ea3adc7bd19597e8 GIT binary patch literal 65360 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
KYf*h99XbOa`5{% z#wAt$7rDwK%hl5Na%D!6tDf=tJKqH1+h87$1j`p~?ighqD>OWZR9&h?@|cR)1X;-{ zaie=PMb)&r*X29k0$Hc%)GX*Cc&K?0rF?Kqnm9k*Am5$`4UJigi%#Nc%x1#M95!3d zpI5DB?dlHFAp&b^InCtcd;4a~bQ(2Zx%s@(S!f@zmhg|Y8(U4O6*MSqU^J6*cR@8P z`TC&}OCv9qcPBLZ59PS?n72-ao4Dx{9xVzOhjs)HCSNk+#ZM<8{g9m1Xt&US7QWJF zcU+o7ijvMF?rrGj)~{=IPA+dgUVD-+cb-_k`vTY@(_voU~vEQDw=W>0Tl) zEMEcKrSQ%HIt*K7hkz|6PEGO(DTNJKN+ezEGW-x@+$NkYR(Xsds2DL%-%u+f+Q)JVqr6n(#nlj&pO z>!sJ*Pq#`HZ1Fz)=k#NRu~BTNy{c6+F^opQ&CP&W=hMixS6H#UiYZ_Ck9*KqZsNJH zdUY?3p0r4(#G&HCo~;!}&y*;wr;qa0*Nu9F>UX8xcbpq?$H(m%(P?6(I=DN9wdG~B zvPUBfMuYL}=kT+q)zxzqG#_w}W+$Jf_wz3uTlOByi^{M29P{3EU9g_RUfuo|>)SU@ zz9P|&;+d`Qyr|rh!6WhI9a7h78Frp-ixEqzmyS;7*cg~unZ5@V9z(`#A?~}aU9d&Jnk{;PnG#T z3j?3elK38KqrVBnR|x|$E^xuxkOCOxa02f2lMn_R6@xQG*aQdHGjNm(%lae8)m$5f z`BQ@R0RVuZK{`RB2vPf|(`#d(PJ`(B^)R>4#;JtU^bdnZ3J?rVzBZXUMQW(`)veA? zy!N2=LR9j3xA6yV&99$x8j~HgC zX_{6pk1xQrt)H?LMDiD?AydTlN<0Yy7N@cYa^mO{L$=w~kDBICq;o;wv=wufv{R>4 z1TzTF0ck$qX`%iNC{^l{;1B^!5SXGzif70W6kHI7e7sCL9z6^xl4cI9C~yPR*TEyC zNR0vcVMW&mFundIDS~IrA10mV78fX^ya_owd5>^DHYbjI*mV~B_9A|4!ZWA{sA`;9 z)Q~yAO9RxWol(ewV2BXk?C}}n0;$aK;F$0p!HlMr5KFJ%%$SMPpl$V-_4A*Y1V($$ zhL@scwt5)zb0q1;gf!50bTN1}E$wE6Y7Kh#e48V3;uIo*5m?}c;H!ts4*Cj6XB!wredr7Xu%gvd5i^o zmgB5HsEMm(-y7=C#vR~QkBUfY8nWnp?o4G9Yv+K_@#VN0zMI9$(Ga=#>r`e%wVG6k zl%;#w%U5EZ27cygmKP$f$Uc_8SSYO@paru9c)B~;Vy3)Gigd*A6>=#Y?d zr}>$*^;)LrX#ah=ZuL{uE7)I%tUR{Q@fsDHNj%GRv!5J_II|6T?{7L zt@)N8*u}O8%!~FvaS(Zrnr;%_yM{iMxH*~DpN@O#d1%f0k^yad4*hG}nEZ!o@+->T zaUWIwJIMdlOeU@V#gy+>|Cu&^oqr~x#@07#Kl?(&KLYxbsQo=))KovKY2MoTcMDdB zRf3u{>6vcabHZ6B>MHeqIAvblWA$J`buBf{>BL$vRi#TB=U((@-qCe{jS?&3FXA;O+Abof(BHebG2h<2vcd(sMv= zU_T8IPii1NKs?Dh>ku^tgbLF5W z6u3Kl0yIkvks`3cqawJJUVx06>}7z(9VA7n*EeoLkR45fpW&|BZgNU~(vTl=JtywO zt|S~i@vNqW3<&2KZ~>(O)YwmyXDAvPy<6XVRdDJvpe)ot?g|j!|kg!hcH*kQ9f{#3q*GwZj~DIRa*ihmbAW+ zLUy40ieCaYpsQRbA(Eno{rr$3taSjw7ziwjpfU)mAnWl!3NG->MX3my<>G?ign`F> z&?fRX2$2M%_@tzNihe63Rwcif~e8SAd^5AKtN6Ig2 zUVi#abALe9{tK!(b>91^BEO<~_BM0^APPnd2Xfq`#(>*1Km(IH0U0Hkn$SrMSask< zh$0>Kqd|c%fFhiI^9ey<3EKAw0lyH*%;!E#I@|i5nxv*NpdwY_e?U|&07&i!f&=y8 z(GWn{=vbn)sa*d+yFdT#^_+}Zi|P#<>5+;M`y`w)WB-r7`6Jl8Br)tp+8Z{Xhz+7b zBm2q)hCp3FC74p;&~<<#d2u`hcR=D_m}>hwv;8#`qT>QwK!RWign5eOawL)RDkX@7 zgQKJ{B*GnrClNqC0y)Jwkb#7O=?PLB;O>)DMK@F-YMSSz!qZ6&Rc+cuTHC_F*k{0- zan^w#D5q$>w=k?CoIO$u1aUUfpkq=z6$w!csVNeo-^ZE(GLR#U zVCw@OGH~lrL)0Wh0Byl08AkLQ;~qXiqXa|2G7nK>;9F8HYWN1=3paD$sN@s)JmRvG zNr%Eyzw`{-v~?50E`Mr`Lg_KOd z+G`hwwhP%E`)k))CsK~i9Z}G8By{3p5!?8_jzf zwi*sAfr3M406k&KlPy*fJ-_bX!JxSTq9ltI#9PBe1lKbR$VoT?&Ih;TVwiPd-KI#5 zA<_CIM11rKqM*7vdt-BA(SC(N?wQ}w&8pgaoevkP(zfGM4>$nX=TgD|F5!YF>|1iW z_%E1>nr;`$kugm>3IZfkR-)MLLN;ESG|PP)vCYL<@9NHFV6v|NPGT~}{gyD_i6=?f z?u#do)_rCI;<>+HCn;Mvj*bFmNz!XNE*S26WlIg7Auc!r0g06Gn12E;3rZzepxMjD z0I4MWN2_xDcz~xwt4n3R3cHO|3-DtF(dLb}tze_Cus!&TmsT{I3pE9ir|J6{th>DUr`*Q`$sys0}UP@TKoi2A873j zU+EYfnBwy~x68QV&A5;12U9Bwh(Lyg;o-yu{=t(iC1n+>tKn9>@;qn{dVM+(6&Kv~m{74yPCZWk&bPX8NHgcAi9z7` z%2}`tyV4v~BC_7fB561Bs-tr3_av0^tVV6;P$@b+ETg%5npN!rOi6$u5ZRm57>E*9 z?Bdkmk)$N4BnwJ+va2lnHu>K=ptTt4iqnjE#J4(*WIw+BInz3Rn&oqAnfA=pMd zsGi|7D1emRi;}TlO*EYc+SK%&=W09%sX) z)o(+TI(_s`Z|v|m?HZN$f$^=0T6Brdm!&?77VgGGZEvp&(T2Dy)OIcD%IeiE;(HdQ zj}afHTI@jz@`u65I=Ys=mHQ2heP6Cif;VTqQc&vOWGSy~sbypDo**e-i##HhaBu9B zbXY1avpu`LU15?Wp;Wzv(o9%se)00lpBs?*A*x-`gCjTvUbl}{sNFqCcw=K;UtRR+8mp;f6w5s(uBr2ypt?MKZ>pyL?bPjs$h`K|9z#QQb;%#xD4cC7>f>a< z&?&eNPW3VL<;1yuj>YDf#aah|0G?Q`m>_f6RBoI2k1eO24NOJo-@jF^IA0~3)aOuc z{%&(i9=!(z>kd@+EE+$MF(r>OoN3;-5*O>OSGUVC@c5&Ztvneo4N`dw8L0%zkF(Qq zT_JCrWk2m65xjD*CpA{6iGa}h6oAj5mv6g)Ivjany(bQl9=~HEkt%xH?1Ds551#qW zuBslvN%61s9UPku(g`@jfa{CCQ=|p~?m*uG{ss&WC)c^iM-a;kJNDoAAR}L3f4=+| z`}4{7_9rYO7&xQ=_L5QoqwFQwC?naQvGoyYIWm0`tIpeVeBG+zA;l84Lw1CplS`8c zQyHl?3pXC;JeEeiP^lT{+&x)$`X~Z12!#@$w*G+ zUZM|M&*ji{G-|m_>&d*<_PH4cbN-Q(^@8pRQ@50&5<6~ZeS0l-{-Se9I6C@`?v+si z8o$!GOp5~hJ5v7~n46dmXq$B~n8Mj1=)ym|LQaPH(Z^;J6pl4(Zp0#8MIT}tIz&2R zT_lONx%3*(l6kSRs99I%;;pi7PX5<23KD3kb{F^*r9) zyg!##>G89^3o4BDaJIs;o%eI~I{n&}mpPw#)F458L7p?Hl|3+Uad}&M>xz^;^L^~w zx*pv0aDvv%6%Q(^u(ay8z0Ff2p^n7cJwN5iTq)2JAHT$$S)=|qpioxEnTWeF6yP@R zp+OTmSd64SGq2Hct1PtPQr1D5Zg(kje|h5$r2*%g@N&IxyaGyojRb}1PBEog+%zLx zqPb!^Cb^w$OG*lC||x;l}txZ(>?sRTaCvc6q||Ak^wLx-_zJHaGRCG3f!W=*C3<@9VFS z9wv8W4!|W~?{*5if1Kl5iof)(w|e5WdUYy# zM&4N*^@?{%e@JR3DwRJuJu@~%H#))0bbN`PKGryno}PK=<|C%#YpZSzhWFzKXzdM^ z^+b*IRRp?{iq=bcy90G42&fMB&E{B!=n}qRV#vf*Y%PwO%JYmx_BA&h2LIN7vjeTg>l-a znB-MHJNO(!b;aJ^dOH@k9b9eLaWqo3XEgD8&Q9+(Cu&{;;r%<4VDrNsoA5#t+Je^X ziLHOsqvMtFN;|QaA{?krHne@K(ZpBk0Lb&tS^d+5J+$amQy&93^CXaIYf@4 zRfG#+@jYmt$pQ@eyR(-!r(yd`@Yx=8bhGm47gJM26a#~T1jG@d#_WHNfdSFA-wcug z*dP%P=hrZF%L`rJn0&tn;Xm(K)SH+aTO*e=?p-S5Tl(M^DKmAO|42S`h&G3lA@E&) z8r?57h6S!+`lw<)1 z_Cs?sw-BE5iX(Ax6|s%3CmLY1E7#KP~L=S zh-ODU+bd$zvV~nqg-H*HJ~_0AD_sW;IuG=uhZmUmr4@%4`gYDL-0SS-PbyS#ODPD> zOS*LQ1a0lKMBXWEo@YQ#-v`T}$wZrs=uf6%1Tj^F2AjN1Dt};V&UueCn|%H_$)w@M zpp{rVWOioSY&K3%biq2;^6X^EF>Uh;%l+XRoF*^FO194o<}v6csW2j+w-vM8rBy^1 zTWvq+GLS^KzN@k1+>DE@7tj(JJ3Trn-`j}G9~ZtiJbpST@zDCDr^HY1W)07%?o5?f z4Ly&()bjC|o4spfLR44ddN+SSt37To$tKeh4wjvW@l;Yq^Tw!73_SxR`lGuSCK^dVVB;6|IdDCK zpRa-~07)T|DGV=f)EMxEnanR@k06TI#sAoG*^t}}iu~aBEBF|tbmsE<0Df0piyj0q zf`kG8faiu%3EYErxxk-q`!#mbeyu=v@%2i*7t?@7V!ZH35W z*|ZJw%2bLkCkYdyF|$?$ol~O6a_JG+XNw57p;lL_?^LMANTU3C1YdDr=gz?Kq(ZcB zi3e{7_`s+xF52jc-aP-7r1|uNNIBzBL1e<6(lFdO#NZwgg+Dn8eKG5Jo zC)T~p(Y0+NaI-1R>{YP?(vtAGStPCFIF%{*stm*q!I)DjlBX7;;NpUyUn*`yZY2D= zc0@i)HWS3@7Fw&(T;^313{qc_UYJd_p`>37Y+xw%Ff$rW3~#4ci_; z)RiR~6FNShl2SPtkXsP2^WqYVVhQ zSU)~+XVrhT$*R+~yS?BFgM+;$ryJV0TcJ)yghtl)WIUP!D>^g1Ea~KXG3z*YTx;#* zO8v`8ReA0fVOo0z|5CL^WP0#3q=vY56N;Xbs%bhI>!QY>Z2d63)kyMu&}96AaLU*+ zmA-w7m8@H2XSb|e1$r>8CU=spz$Rlf>3+uUa#jy(ot>K%4U)l7q+=;;%-~L^V1Aof zMi`4bZ>Ecemzq$}<+9Fl|LhmtsvLS^Ode`Cf!p|d#=_75+FU9bxSHx?JBN!2xf zJ(Ns71>mAogaGw^0~v{bDc~EhwWa>D|Dz80@`}9nz;R~4IdHs>=0^y!kg4i9B5^~s z%$Sehb|E^GJGfP)M@vLrCw*!%Ythv(KKH5Bx$b~uXM_f09eY+_#AzPmm>f|&lJmU* zRTyh->FV``a+b`o=mj<<>jmYY@zpUKckTqSX?;ojX+*X7U94tZU;E}zZ=T$U*J72V znsoEx@8v{>sY^X?1`K5)dEZG^@h{!OXAKAhx3n6kgqCHmRF|50)Bk6{S^omuOKutW z$Cg9ME&naB@|p!29qW?joi8bK#WPG|wxHwqSm3}I@r!G8jrxKPn$5SN-@xp4>W8nnV@*JqW(-bmjM@OCEQ{r%{?>d3>0n|NH> z&EMu&?2=gGCZOT|rN71R2RFw$5K;QZy4^ledE#y^JkOrwdCo6}=XvROcsA7cF_~lS z`y()6pD5o01EN&HQ&(>9sxv;BrdR2~nvh(f!s>>ce&|%Q7P>zfxc$kP+5waC4ZqQS z{7lIBm67q2-Nz3Llj_g-`Tiw-x$xxwUmbGNUk`a1nPG0XW^q4LMAy~`Db$l-of;=O z?lR+$%++6>;XFf7znf&FKwYQPaH_J8!76$Mu`p;u%s|%R)sX(8>yZmg?uALR3po9R2od}!|Ejx|=TrAd9mq-UM$7W?@WnC z!7d$6Zv<%*bNqu)Z&^%t zILFwU1d7qwpz~5(w2xIJR!cT-y+DCMv+dTZ%Fo@i%6tKX*!!Nlem@MD>+Tfw4xtiR z+|9A0T{a&+Q4NK?GhJe1*gn7)#vXs=O*WEU-%>2{29mG9&@d&8SBAYuyFb~kqgEtl zTwt2N>WO7%RvP{8(ot8ev$Xa5fN^Yh^e11&bkkgXV1e3{d#Y$Tmi{63s3%t3v1Z&Z zv|*G(qESTVvS)a{Io|@Ss7Nz9W)aWPXP6X}VH?Fb)R#u1!5}Nzp&+zUZO)`YNzjcg znHmgB-&m6{d-WPq>lXfcTeqvMSio>_M8vbRdQvtISP9#7jl|DWqu!^8H8qGe>!AeW z4qkzg;^U_*W3~_u%2igrRtYPfqRkkRnFJOA*r@uWcYuocbMciK@KM=(u>{HE#$MDk({5U*_p2V-z$g=qx545i zEzP1+c}^#Cdpgsoq9yt%`+MBvZ8u6-OW0_7pS#%<#>v}m3p^F>q8XgAM4=?#Ss+Z} zM90eiIf_*KAbqb{L{^ZudrIS4Q^hkU*IOU}8X2b`VA(8N9&2PEC3$|dtkt)VdC5uL zd!eE6d7cQXWE4>X^@QkyWf*c~vKcPFf^8oU8t3M*PR+EM&A@6r7}QCx>wVi*_8|m+#%O2U7EoK zQBD4`>tfY+e$#ZpdG^Naz(81WX8+BVkI>zO#f`=7$PWCijXd1NRouIYt+PvWcf57^ z%X5E&CPt-Nc&(Pah3tPx$~VOZr6$}9${5d#nNda2cw8|sx6BXTGhzNdaQ+a97Ga|0dOc3uHc0OeG2J1N* zwMzD}oU45krPkS{g5I5aZH zx`lhfSPHb{d_&dZo>>%Kw9P#lVVW}IZlK*AI0ei&V$~Zg8OyHq1(z@GwuE zg&>hJ9MCj=p#WN{TP#WmDZA!sYdCa!ULO{q2y1!$Dt|w*%dHnBjyjsAybmu#9@{?M zHIOjDjAAcy)B>tC?Y_Jyakirr@tlK%xd0OeFYp5xTDkeYfrIUvzP~A(#ZV z-4axoS0o@3I7D#{uJFBdz~nW(!50sj0{a+6_%%pCM#zze*Fh= zyBl6wW00DQYd}so&D{~88R%^$DBPR^d$lcvszf=*q=}bL#53Q2B?#5e z`9s7j!D8LvN=mML>v8yi3Zt%_$rz#|b2LdGP-8H#50QkW5(JJ_J>vwHBoEJ?+WorA zDE@wzp>Q$33f^UehIkmjyNns~E+gLX*;C-h~pyGHt$epiLDiT{VzE_jtk-8DBH{%?zGL?n#PZfek8o8)yzV@s25A+ zF%P7tlePbJl8UB3vdz)Wia+mR>AN~hmd=6~i+J@!Q#90X(?iM8O4k=<4OedfM|}UA+(nW-54#0FJ)? zGS1v!P`9P&Rhil5p9bni&q?mK)OlZ4hmhml0 zY)+J>AcaIPV`Q;)bo~zC*8v+EMcH(;qG3JaeRLi5 z*eP%lMc*tJI3CI0Ze3%LN$}Qs+i13;>-DTJCG3)M-0#jILVnLooxRWOgwvz>2B)*| zNO5hPC9m!}hj~yn;g5eH(%k7q}F`1)sQ4W56?|B8ZFte)rKa-!G^6{pvXx76oJHr~Tg{`{tx6U4-!s z6K1Af1Oi{nMmMuu!GGrV#1Frw29-?sdro|8h_6?L*wLRX*2_D%>c=|Sl)7rn1d!-H zM?&=YjM5US%XVNpa3~q4RhLG3#K6B_2vKk=DgHUigk1MqlnJF0Xb1lCh{OzF zSQJyX$?3U#?~t4>4~rH09!3nG7Vl2!kek!5Zt)V+02V;esoTH;cnrQRvxsmJ5wBk( zyJJik3@qeH_VlOEFEEr;#QT9*X0zzYzElNSc_DQh9v{`n6gkKC6;wli5kzye@_KUi z>m2zt8XNf-5W2Bto)`B6yVKIn;}-9GE0+(r8J@Tf9hIEPjsx(v9} zjRs26mQeC-E`|aXVZ9|jIl$zc_mY!N=>7TUKHbp#k}WZZEgzO1;!mDnHmI)6MOk=< zHJ|I2J)3=DePeLolhpYNIvhBi-Ex#e^q7|r-?R;3fkFPJQvaFH<3WkIyujp3d?V8v z()K)eAM?+@2LcSVBk4ee#0lgB6)2FJ5=a(!K{^3HM8O5$!m(X{4maS4>tbC9 z?6OVXRxcNzN$@F2=Ju0mTv&Ez!amzQKj)dKkz4&f4aoQUavqw%zA!I{_NXNu*ZVb~qt-F< z?)tQU(Zz~fTBpjZiQ_HDLksB8VfrZ*Q@oKC+7O3Ff5kfZX_*kE=~Kysl666RF7T>y z{4?#{Tg_?QfUtBUVO@7~N3ZO8K-uw2kb;h#QI%`(DZ6GjA;gcG;A47%cFW@v8=2|J zJeeiW#qi=yS{iH>{CQrIC<|9Fnur=L$=3_2S2WjaCfqX9EYviNf&yzBv)b16a6 zl_kb;PaQOWuEwMA^>TiO$5)aED8eiZtnN3h7KnCvo=@d}i&t$muA1Xf=vNtTs`2(w zQQlS0X*t=?=jWxui;6Qpuj$9=e3Y{+Eh_JEY0IPI#dn=lC0g%vW+gGQXa=NQx54Wr zmyD&RuclqI9TE}0J*VXvuF_U*!0eyKY>5@$^i4LlXmVi6!m|4b)%6UTR2#;*;JX61 z7rH#{;$9CFGoBkxWQ-yir|6QQFz`ij$amWN5zxonUn8IZ!MVPVRO%-y1M6x3_sI4W zFiQeaC8ckHFmNewNS_2D&=+2Ys>AC-)X*yLVXxb0JMR(uD^ud1nzYzBZp0t=^=%9_ z*2;;0&Ln(5R3oh`p)ci3tBz{C+pkh1t)EAlYS^P_0L#MP)ckF1I)>|CV$&ak(_XMJ zKxaRzwV9`|<}tCj>v#BPjs=ymAVfL)VvRkb?Cjj9c0AIQi<3u>mZ2#FMsX}I7uVRk zD8lS%`LLHdXBv;96B#}Tx>wM#ZMKT&JSNttdJ9Eftzz=FV8EU7?khiz)~#;g{lO_< zq&cbJ*YUL%n?N{!~%C;2SA! z4ukNrVzV4%C)EXHxrXmgGK?sj6gU@X;5P+jp1R0zt$QK0{`FP;id2_9g)EJ4>gCAAs)(2ky z^QGG=Q65J$%=X*Ztf=ZGplo9At0|Iu`}V646zT9nNkJA3I9e0~+a~0|ci43KE+EY= zw03;CRxj+bQw2}XaiKOp*Q!N61K#SLCM6dQZ*QHQ;9*fUcaQ0?$#seDHBnm(@|Aw?BBly0^-gXviYis$Pf?4vsoksM=vT9zgnO-{hdv zvW*`N-gN%nbu7`kX5OZLc$~imp&_7^*4;{v4`}!BERcJcIOd&F$yk72J3rh(^yE-! zC>yX6H}TDpGp^GeeKRPXo!LD3dy(6PX3HEJ9RY;I&L@v^;Sm?Q-wv(ma0i2*al}8* z2&+LGih~~j1$@@Tww=FnFcJgYGw;lt1?)l&9PjP$qjQRLoeWFRlD^E|^SUb;jg+N( zzg39F5^CR^mc>!wy(AwG71^JCKe}$mBcS=xWpZ@|Cy4MC#Wv+dXXZssRUp&KKCT?& zI2F$xWQ+fdmydC^v;0VNt&08mu2q4Akl${Wl1lZDD(wk!FN@7}H7WwJneqxoHen45 zer`uK47cUq#6}?sZ=!b^iQr@Bv%L@LoDDYaP21~@#ffY1)=JkGie<2JzavVH&}lFj z`Z(su^S9J3#JL1k6J*5}T+}nxB`%iaLnD@#jtQYKRgoih^D}04&2J`WRPU7uM4}01 zqrlsCNq0^^d8f3{&_RQ$$?NhHvm!UC+B@qd?d5WwSM;5bs*B)k+EGMU?Y-IE+OE_U zj-(6^e_hT(zY_sc zHDJM!7Jv8+*Vzlvru^LT_Z2A$9pvv{3a{HqX5gHcPiru+b(gKm($N=i8P({ej2ojK#f!k}uy)UmiW zVEp1qs-?OK_4Oo7^ZS#q1y=%gb*jL(Pg1ahjU_#Y+bn%bRYTf3(>m!$O!K+S=p0#= z6xj1aRW_k*W%jhdWR zuFL}~Cz-S8lFV^Y(K5O4-$bZu7d zgv5omiXvk|BpOX~P$D9Mwbrr&9;&+@_+3P?xx3VsZswbm5ryM~%Xd0Ew=P|`>QFee zzADb$osOYGp|vc$Z>{uU>kJl)3iEzxmzu&icFe0pgrjqkGxBBK9?<=g0&myXR|Vr( z-cH2ScCZ=JEhIfe*=HUNpbZmcG^hBbBCOUhNMMLaa2?b7lp5V`v4-wLqJqwkBp$47 zeAby_{n!-q&Ae#{eQ31$a>O@@LhIc>_}ArwE1--i8ZZ0oE35XUrW|^p`iK zcW7o3g5yu|#8rlCAYV?#xe4|cUztYK-b1P))HJ1QYL--GThe2##1<+fVuDg+9Tl!# zr9oBtJX=)ZPqDt>x>9rd^aH=EW0_4jh2f@YqUy>iwXl(*xB~wicfR524Xgq8TVi_( zy^;gIp0H>wh_pCE!3~Q7Y2OI}E(cy5z{9X!Kgj!kF!$bJO=WA}a4e%^We^aQIxvDF zMGU<`_)lqsFMJWNo3}_+*LK8x$0s*81#27;F0V$z_bl;WWlr!g? z=Y78K`u_O#MK;OWYp=c9zSq6(^1HA8VGGMNJrV!%RxL(C4&Q(r9E?>3>fAqtc3s_7ttP>-xm(+vX$bPaWj*Kgl%ExJ3P`VhHT&Gp*Xb zvnZlwsVe!H2&?9KiZOOPdYkUlXfxYni6-&*tSuNM+xWQQ&pf~TYP7G>JkEFBNjC`9 z(OIgJ7L>3<8JD2=*D3@*=4;||HSEuc6@n%cJC2ww7CI~2JTvW^S0PC{vNhJcSZP8! z?YeB2l(@l% z_91TATBRg;KS4B-1ISHa&mk$@W}@(BTokC^5rw$pKaAY_W8Q!Xbod5y213B>J;Y$` z|JvsR8I3(tM$_QMy97Bn7&8_aT0)LSe%TW;Cp}0!`s^iR(n17e%a6ai$>fPJ|KN$P z+9DbD`;bF@ZnWL3GnqD?PMg7tqt1oqul3c~JAB7QP>Svr4szIHn0ye)_;>sRToYHU z3$Zy^MU3kCDIyBPqGVj+tutS{u6osUQr>o~CHeOZ70^X8TDPTm4-`kU>jfUGca z(UbQ{x2IUwM?ylq!Aoh&m>&A8S)V;%?3k=rb1C48{Y5FLoY!ZFBTi3!)?~%en(!#P zEPBUqW!ui&bFxa~sr#8k&em0Kd8DmO9@6PHV6u^Ew8Y08r!~**pDR4J4&@!HzJuVt zV8^NV$nh0wzf;b>#|;=)k=mb`Wn)uZ(Xm$&T=H_?3o4dgiAG|i1s$)%ue>QQ4B6t- z(Fk;Vng>;O5_8qwdmJ-Mvi74JEH~ENf6KYd#$mm~J~O`-62fyj{H>VHxO4HwY&YMC zUTN9O()c-OSMmCkDNeNN)7(s#jMV#BJETzYDK!5X*Ha$i{qgT!j7!OR2ME*qx~`9w z7DXQMVJsK!539=L+k-8L#J&b%i%dn9xN)Ntri_hZ;ID;Pnu`}_tLK4IKPK8v7gw{~ zS0BeBE{q}ywRg;aG&Z{t?uv^ug!$0)b=cK`d9R|nI=szRIG6M_!?L)#y*%Wm6`9T_ zDccizJ8$#6VE7b8`Pq)yYL}zKOq$XOE-@L|8dVfwA}CqEsZ)*(Hlme-eK*5R`tHb2 z0XrF;*D&xRY+H_M%Y73%Q-R0O#dkLzA0NRMrK zOkQ|tjiiRJMRt1fECA^ew6*mExLqViVG-#X31MMqhUV;?2C49qWbYoj&bc{B5cCL~Btfe0l)i;wE*VVoq38oWs zmH1+60;b^6NCv$>lJtBF^TnSl2)M32?Rtj6ai6gccmrX)X<+9J=ICE<8@P{g91;L~ z;G^-p_6Bbt$7p@Z$o+R7$m^jp1O5x+jx=eCRW;Z9jq1vf+qypy$-lJi`01mB>wd(~J zyEwd+w|!@IA8>#FpYwzC^8ZxM|1$mcCN^f8jM0C0^PY--`)5eqC<;2Z_55B>AT!-S zve)uyf6Y@|zVKCOy=}<=vZF5+J7$hueASbMPRGoi-pwAcx9eIvDjZl94E z-%1`ewt%T`%Lgh}NK2_qFYK^9*SC5<*{zW;?xz(uHf5W|2H^IPLb=dSDiSFoa@OC{ zf(turJeMdRQC2k(e5$HeZ$FHUdmG7LS!)pv*Reh;?oulHhB06aStip1k}0sS25Xw`nGuM5?zSx7^sBM6E)=3&U8WXt)@ zOm8)0%|)1->j`K*OrM^h)9%QWZ;O7Tn^vt=Wlwn$`2x zGX2V*lr!OO18gyfKy+17eWDBM-e%?; zsTwM$2 zR~PElKU@h7AFdix4LAT}#q@02ZkyH2^msSA27e^&_%Hr)fR&n{`Q^f{Re!-Nq8YAP z$QgPk8D}7EtP$A$+yKZTw6(QYi0k}@qh7B83t4GvN4c0KV^<6#l3{IV5vt;lxpN+P zjg`!mjLWz}3{8q(rxjEg&BR{Lj(2#AM%qe8N5@P)E->K{hs(e`($dy7(G>Z4m=rtN z=T-E2Cw>mWZBEto9KeSx9^kYV=dRas)h07gco_|WgNBU!2`VcUCe8qr9V@FQmtCmy zv|LR81E2TcmdXUbOos|GgKPjM5EyaZfZX`9!ZX%1V8~e~y~K39<6Q)PcO|AP&(<4l zuP$r?Lc}0O3`G78#%Apg{(w=;1E9VE>!r|fQ}!juq4JV^ja>BLq3kUH2{j$KSoWa%dN9itQ1p8I!}#+!dXw_q~>`$TGq`ZzQH(0@Gmc9oN9 zv-of8pRUpKcBUp8*L*j=uku#8WLcU&asFNKPO3j8Y}I>gTQNjnr~>sA*Vp46cTXj( zL&>Ffi*Rj^SLIiaLA@W1-R9(*Uh~yX@s?SK4yJ}9P;Yhrr)SzT%HCp@?PJ3%JC#wk zyGlZvRFzUPrEI`E)9x}lR^F(HTFe3bvq>@r&~}Tp+?kM2igHeL4rhS(=)FV>qGrq_ zEh~z*PS^%_m+mq6yHA)tRGHViy_KI&?1+2$0Dn2xK5yt%d2XnxT;m)G=p8K0FspDa z$Ht`V?$w!|(q0s0IQByUO*8}|B&zKNk69O)Mcf+UTkC}7evUxCdY_MSJ z0M#1g@QoWF8*`2^{vEyn`Cb61fsR6sMgk|?yK{ml$alwj-fSNqSL5G^HuTsZ!u0K7 z6AFQwl`(z?`MZa~FAVVjgg3dN6ll^2;rH&~E__z`b0_O=?%P!pKY3G1N1Pn!YbuS*ABNg~;eE*KRFe z@vH7`G+gd#P|>N*eJ37l0_x_Xo$Xz*6<_4e;}j00dO%(79_4&wm1PL-$aY-~5FbVJ;rsUZnSjW%XB> zeTJ;AheQza&Qp{@UdGl>06g`;Yn^eo;LqU16oNv&_(U=*d;_HZ;S(uv_=|=Xq(y?y zf1e7#$o#N6$iU=}CmqVjns$$Hg!f2KeJJ!jf?aAjeq%OzGWm`L=an?t<0gt#z&l2H z|K6}$AW?vEh0(Sr`oNFa`p8G#Xb{EZ+n=j;{Id#&EZoE2Fa$_HmFKWgV2d0 zw*sh39^)?90qmge5Ij>Q_s@I>@PvMyz8k39j^P#KwZVTNAX-f8Isbp04fmyTe}CxI zzd!WfvtgbRvT*W+s6S8~sS4!&psQ)y6R}&fUyv9X&H9houKYdQukOrS|0V75!L4ck z{)E4>c>=7*e`ebPaFYM1$p4fLb^Fhz0wg>eJhOlQYHBS&i98sFzh|@cpUaq`D?jhp z^KJ@V2LOD3jjF|;qZ$gpB>x{|)4K#$v+%Z7VZdK9VES-y%wHK6 zkSL}Y0i2m7-2ksJa8(7l4itl@-#{MR0JjJTKo|#j-I-sQ00_4L^AQsM*1C$skCoy~;8j z9um!GJ5g7{X|k`V>1Jp_)s&{T@gX*gWp$^p0ifDo*Wy`{6}gdsULO$KGFIjYX%3YG zTdf}c^US@L;!$@wT%S`Lfw2`LFt$Raj4hHuO!|WBJzyQkfgFd5)mE9@fmz{@qJ@v7 zv|Xhxk~`a@`p)vR`llO`6{g_9GR4-t`$8-(*fQ9KZ0NS%wc|ncjILxh1jLL4-T5oC z-nYORm}G&|mwpBPMb4V$ZOE3S&JXoyXyJ^MvkMu zffGakd_ct+>*_%#J^-d9%!h$XN3OKv9m<1n$C~Z#w|yi;5%oF6De`gN1yE9}jO$t0 zVCjQmivb*tYhpB0w;(?up-$Z*8+BrQEWtzX2l1M96r#UuOlooCNLIGrbEC(wJBBvlYKn2m)|JSM$dvK`Y9FB*&4I5Y#jr-ai;l5Ib=`$zb5 zTfUYyh%UR2IT2NuENP3r7lX(*ctKGeMgk8XE3*b0k$Pll*LPmKnQp=wP2&>{v7uZv z6ifQGhJ|y1Qu0GD-{Uf6izD z@2CuP|8-2V>!DS!6SZle5SkX#yCFdgG<3{Uu?Rz!7MUk6m=a*v*DwuVZ8A(oGfBHe zSzGCel%W$sS4~#oo!dw%n&0GOB5k&AL0HO9eHGu~Eq!-oSA0-o2e~9}2Ex`B2${YYN6q>>+SP~( z6iK4?6xoZVM>kmJ(YE1UjtDN=x}R(|t~7GCyzo#gP;o-ri;TvrHAPPO3{^S;S+Vnb zA=AmnJ;&&>-qIF@vBJU(3qPwyV-JKvO!Ph6FWg~sDz)IvkmTNroc@@3TX$(<3u$Ni z?xE+N6Mn#`S}02B!L&gG634@w@;VKqVtZNYxSwx%oMqeMN4O= z%~KQ&_)nL4%eQmg>I!~^*zc6>%ZK_RTv3m9u(cTb~3KA$LD!xZy0P}R&LUstnfEJvA)Qm~7f z{yj#q)8s-Vu-pwjdxSS_{7QpEuTpRN`d&emp$<&1{&avuw`11XNupN4)1kaY*r<8@ z>a3H3?&L-tKTw2GY<#vwQXcwGpR9|`w3|rvmYk0};R4r3;c(&-l!Qdvg(WHyRjYFP zamz{so)stJBAPa<{|i~~u`7JGPkoRi(XFVR8%m z5yuJ$$yz^oMSI>hOM}EOcPGt5#M$cuDaga&L9==o$pDr&-A^^yrMD|xYBa9*NyF$- z?S5Wpkz)56$P?{e@2@Y-%;@qDUNi0Vsn$I2=!?#qS$VFvE2H(@?m7C{vcHr*fEZS@ z$nX%~y)-X2RioWPy;|T_RxcpHpzQxx2>)%V2g?fMhy>fN` z^j$MmC$^d=3u@J#iDTpyIsEdyEzCa?GITezD)yIa)uQy?4lg$4OnEa4X=aom6jFCS zF^xE4ACkDpJ+bM#o3OwvGwkV~WmbVQGjulY{A&?%eG(Hp|5`-Ve=9=wQ@A)kG^VyS zfPYx7Woc%Mdua1@Xs7VbrNM~65&lNZq-Vf*_o{sQe2VwpL}tS2=iaayE*CUlH@ zmRPoYN?6`i4A=aBSLVMJA^pE8Q|O=dO#FL28D*;cYqf^oegaKx{IjVdAQWHT8ceGxK234kkhrVHYTv5dWPyy%=+YQD{;Pu%FW+Q60B92GOw+ zo7I+hOAFpWGGl4)@kv5FAE~h$O?+62Ku=t7Xd3X2FJ=|fgpUyUP*;CxoY|z z3$zUt5`eQxd%D|3HB{Po7s`NOpyvd9ug7c5$gZ9h0=oeY7NcM=zJuJpCJPn5d2Ppopie}&93H*(tN zLIr`qAK_m=(!1i&UQxY44?{|KS-mV3o>Vfq6}zyPx29!O9yq4-8|29GVb#TJRR#|T zsk9Aee7Xtdk%nP2N|N;xho4if+9-W8zQF2a1>OffkjYoES&?S_9XTP}!#tiUq?Z@Y zqDs**gh?9%<^%eI*qn5(j!0|{{E4A6%f0~#FBl;B(_{; zdvlPsIz{1kd^tbdC_63)MJ3C?3^fezI%98PhJ+QS_qjG5gPx1MEV#i#Hjq3fy+y8%dyCVjJA zYYp~=zxTVx^wIN6r5#f*$1PvfkHNo`ySEwa-J5As^RP`m{`7R2GEWk*yV-tTRS{~5 ziAt957jpMMCD+@b9XJ87&mL4Mnl|a{KI;OsagfrxSw?%mnpE;K|98E<(LDJHW3kIy zH-#-**TZlZonpf)UdAhW+&f+8TN|xl48rfes+gpW^nFsv8ai8kb9EMEgcZ)6&#CJuYagcO8{o zs9$i2r4NwG8-}dR1hIi!nbL@Y*6Cf7&EVK%gTA9gQocxefmu&=`mchv661SA!Bys- zXC61+o!5WdU_K4^Q4yAZg)F(*l<-Yi?U0X&p_=3tvIxZv^Fx$4okCV>NX#(q2?${pBni zr?IeoZA}NoOS)pNZA9V3no-`; zs|@mNC{;u5%93mR@*Hq_9z?LQ=>*cB5V%4H%XH7ut?jV;w=v0S^LiqV=iQFIoy(Eo zs^y{~)ZBu@D=7KlEi+h^K&umzYat4%6-YSugJy?{stTU)i?nzRWCgG?y9m=R*jUg9 z*d>G0F)#^p90i!YBW;$#YMHyRZy2+Lff{|{+}ErE5N5P!W)kD{FPkyQje%M6Yi8=N zjJueT=71m=a`*;gD+jit;1B>G-wbXo7~bK%J#8qF#&Ssm zX~!0<`e8XZ$D-WjbqS-9M-tK;dc{VLgh+IFtqnJhVD4LT_)hGKVA$ThFV$x>_J6x|`MLt+oyM_ErY!hHQ zAyk52P6ypNWTaO!syBqXvhMm={-eTtoiFOY(*x8W^njcGPkP|QqzCNBrUv&H3;K#( zT}#t14ijiavRK6JD{Fm-{I$v_?c{_jeIcSGnC`ibC9UDC$F)sW-`ZE8g*bxcBm7kr z(;Z-DH$a;Y-Cwk`ebuj>oKOAA$)a5{+coDQ58ho%+|WN5&WqAbC;Yk+KPKr8>*~d- zugq=9r@4wWOLPvXhgJHv2xCyx^>2diURXqHD0)xXeJwBbUuL<4=50t(aW6Mz2Z^Rbfn+ChE0GwS+!Mot*R4M)GU`SuPe z&N<>x9=&xe<)savQTX!(Ek_md#omDGN)^-$h{-nFKerQkXmx$Rd@0#!0lNbXW*#d{ zk0R1@lCFoD{_yGkPH~HBfzLEeEKL5CD*vJ$dsy(dQ}K>awp3f(L~%-9RX7N1LG#lS zhiR|0chd*Z6e$f>}Tp{;Q{rY&1A)+dU)5NIIh!Kj~mBw>%y~6x{QsDO^lDu284iGW9-OrFB2Eg|}va)`L*f8M5KSPdZC;Fc~ zzYyI1<}+jgDR8??&L`qIsz8S)A_-CB_IqU*+zQJp^QzaN!G(^ILUO5SM= zcXG|+-TA&2ayr7Ld_th_l)eH=*rm?G)$@$&Z5)i(Qc=GzlY0~F=v%t>FOSkt!jI*y zn7q;2HyxWq$W}HjF7m?qmJwYh*~8VStHCaL;g=K6Uk%~RksBZ=?EO?|ToM8Tpba{% zw-fpj)@gm{>%&Ks-)LIH`m>ReWcVXj)2T66R_PX}l+qkM?&9|3%jwCYOQpe3uN?*R zRFx;@H5TS|dJnV6A2(KHZ2^fpV!qfViD503*KWAdQ!OlUg_^73+o3ldYowB3x#TTl zPD3o_8vFm~+Sq6SLM!b5p2O*P=}?MCi$iXI0=mqT&GXU2`WA!~t5mC@`j(mMh23rm zUDM_TF(6CX$Qw-vZ!s1c#XAZM7FOwJ5CPW0_Hk)HgkH(`poK9=dR9_aoyB)rGkChY04rraJrJ+ahwHq0 z>M`2sX`D&0qY%wiE%RQEU9YH+G_lKKwjtShZ zW5*0^fPG1V+())L0{|b&KQy_ykPN3AJBTZKr(GA_ZTx@qN0!@C%R=woDx@ z4Ly_5E=c~l0W)f$2gcrU50Bj=3))pveWOX-*F<`nM?Ou3Zs>oM`_u;d&U zf5*KzqfL_zF6v{(nd|NI(j(xS#ItlF{gJ>3oM7Tupp*(dJ55AP9167Ti0Jh6fsaQy*JHn5Xy)soqO-K_zYu zm%I6QY+luiUGq)qTZQd97Um#Eo^*eP9MthBsN&NQRi}6gqk_IlPBm`2z4pU5hgu74 zoR`f!Hebr2b5|-?oL~5v6VwC^B5Uv(L7N~rMDdnOepn{@9;q=aak8G5%KFsflcRj! z>t457I#k}=+KJc^Y^mrI3VjhO;Q?!2;Q13VZHOo3;ZQ{?Ud>%8QYEaNR()aS|>g?(IjQb8n2k2~CL>fK%cERjYK*2Q2v zU?MrTwtq;!RT_A8*Jh6|m5nayq-S_zda7-tr0v8t=0bm-?i;aR_1XXiv}|04JL%}3Pez>GZL)^y_9YcOp~2JI0}^^*58(TV3V3yp}nh` z5%_e2*CyDM<+O6ap-Qx4hDv&pMjnW5r48SK=hq0GO1f5Y+ZK5_24y;yg0l5V7U3|Y zSQ?~1mH)QKrnF=3xP@hd03B2Ch0x>PStC}lZ2tipRags;&$ej}XtasI=+&GmiZj;X4R96gWn z{&u;zk~H*>(OqIwQXW0$Mq+KnEmrXE>w?ZRbIMQ9#n88T!>#gIxojf2QQ6?*b5y5c zqgAO~Hty?*L~Z5Ika8thLjUf)C`#GGobNXqj%SAO5?(@-M*}Lv^FVZ~S{_X9)TDc2rix-l-wK z2%oLbkQ~=M)U^7bb0kCl#!zAjocLNDQCv#{UzxsZzz`8~lzH`6ki=Xv!C8Ru^<#Nm z$AHx$zY%)lNSmG!I$5o?#j0Fzj=&V=9lilM3OOVIS(|#Z)!te&?fEeXWw<&}3kX$UiA&5EslwMJv>Z(*YoA2&YTNlLl0RK&5PG&U{w zd-d7}?r9%W6?xugh0=LhB~!+ESnGX7fPkZ_%Cjpf@phRlfa81(dvn^@hwAwNmNFa1 zMRaaA&&2_T0k1b)yP?@2dAw9vdoS*kV-;n?HkEp7zND`Vw)3nXgK&a!%)Rc#!}=?- zq1A=yj;YmiP~ud@T!zvnHpz!Dqgma}8=WAi^v(LI^Oqa@(G;GaR=Gc6iNO0P)Mp$j zB_NBNkWHp#gbO(=a|*lLUdhnp6Atg8skyV#$?cmp&&};C)=?P01 zpGr@9jExPnDnP zUcSc4L8W@7_opuyvk;1(ck`I8w%{KnDC!2DS+A&5=uO;y)RpV5(I<)0T4@O_62ag%Z867SjJppMR(iGbPm5aA$N;S^#c`R7%ox^|T=Nfnu?SKmRn$=;^o@;X^f zPB8L@cG$vK(9e(-&!jmWYxXPLmxzIZv2HCKQs{8g6di=k?kNr{lp;nwbhX^JycqH( zp#62gb)Dp8#QDkYXwubmRw+eov*;c|B1vyTsfxcrQ;1`X(xk?#M$^jhG;gFPv}ZfsBlcsg&ZsRDeaI>(kM?(77wlLP zqGPg-)&98Y^XZkz?vseGpi+DsJjKhC3pNX-&w$>YDS3b#5(K<7gR5p7HyEd*jMD+X zd^~4%O`)$V80<=ZS{?Ze`8@KpchsINRW(v252Obji@_fDUKJKk$ zad<jSmtT-orCY1HLgx; z=KRLjxxJqHNewtCuy$Z{OPli5RDE3(|H!U)kXxCV852;#jcfCllflZqnUZg(ik8CC z(2K_(zUa`qEwpI!GO=CG=TSjkrLB-^_-T5_S*^0js`75bjww=O8d83t0sy~ONf~vF zO3t)vs$Nb6c5C~vBs&gAB2{l}v!SZwcEm)t@%ZK)4T(0p*M0FD8ziS*v4tk6;TX=< zQcBHJeFdi1sNDhl>0P{&MN5q_b?^G>$DK}ur+0r`SgX-VnOI6g16zs68l6E^!Dxa< z#SHN?WE$Fm17Kiqj|$SYwK!wv8ek&ahIuH_%3V6h3I2!QQ9xif~>Jgf~cHB8dNv?BhCsSyAq=)jBX*4a4MT~gV?+THH5yTm2UbeTZ+QIuqSY%arr|+sbJtG=CzdM6LUfUQ~)mCPN z4ehU-u9@|h7dN1sH3v|`@H*$zzSCk_(o?eI;U43S#f3`PEvH(Jy{ADh)kwVW-?hL0 z6>`>52de9N9~m^k=3+;?c~Gy6g64}z|U(OS1`coSNAjIGFLR=35=XdB<@(- znwN_=1#E|lqFN^&Q`bW;K5~cM@T_SH>Lf;dkO;fuBGDSUqL!>g3+SCj>H)ZPS<&jn z$dCT3omK&h+;v9geb6rP2=B`HXYeba>?@0mh52!yYw?=3nL)y8O&k)R6hsB$T% z!ZOEtR|vVN`ut^5D{p5L?n_j!p7b4pwj1tPPj#6iJB9CqIbq~cqMg)dh-mJv8kceT zk7~=giA_t%(Uu>IE;KLTQ{sB(P+AkO3fZ1pVjsaOvLqdyP}-O9@j!sJSIvGt;0=lA&*F4o}a z3NQVO!-oYE&wiMWl6eIDT>V16FI5mGk4}G;0hDpNNpA{uuHse9T&80_Lt5R&yiMS8Jv3mpJ_GB{cC6?mwof3OJb4tAqAR$S zbiJTDN7F-e0--83yYTb%WNktuR*e_hq;_JxnA5Z!IDLTyk8vFQJCI}vfR!22Dd%1V zcGcsd5s72HZDO#EJ5O3+vpEZwfzRzsh=+tx+lSFBOX5pZMHTpx|8=W7SYG2O>#tZb zl+&KhMHj4$Q4`lLNZ3ux^QI^1VEf@Mx-wIlB1tBbnKDsY$NlMZ>{I}umphSI`0Ac5 zeV{BjPaHO8z?Wjw=L-4uGN=)Y7UiRNDQc~L|M%(7kk61GK3Q510!``1{#gv6Th8n* z18*yrS$W9UH)aPGegfEij5m~V95jc?NE~7m2047=1~C2Sqi&_U4$S}oT}i~VzXWtt zAfN-6!DfYV#|OTQUY7s#eqKNJFciF>iT`!!=PbK$4zi{?wL3PZ(*KE?lI8ZWD{mG- z+Yty#P=ODV2956>yHX=5uTV!A*mICTYpm{s!NIC;da&vjd|XsIT4P+YncD2u1B=Cc zhRi)EHg1&GEEI3xTP9vsl+rh^ z-qF1u5MWof$<>Q6N!{G#(fL(>Y!n?NEHbtnv>yJ`o9`t??2F3m{4tjs$QL)!vK@N6 z)$(asaYkssub%S3-F70B-Oq6&4q&Lfi-y%TGm((@>HEYcQ=Gv=M2Ja9iqmpl^k;}5 ztvDEJMz9tm`fHK&`ox1426CPXheT{r?%aNTB+TP#r@zqt@9=g150+22CL_cG+UUhy z(pexpo|{9^$f0-i>5S^dVY%9Te2EjvZ2#V(vxB5GVYhT}WrA$w0i>jc^Nzw&Awo&k zF*|N&qO&|MM`v}NTRr`|CN++rH;(%B^6u58rSjQbslf#^_aZLzp!+_z4d(bnb;-VP zhP`op-jF`4HW^*4_!&Yvi`HrNbC5h$pC?pLYMFyyM;Ks40#$jT3acM&YxqmT@ym4z zH!G-n8&k>AU4*>K|!YNe%x{9zj`I(V4o|3Di~v;rvV(%-B#jv{M(>_KbGY8669E?5yX-v!6Rs)aw6Gp>N*M z?z&sU#`(n|FOfD1@9kXF?VRFk_0bJ|O$MV@7-eWL5d>`<>&Hr$CwF?zW?pWj>l#Zb zlcO8Lpz2-IF`FD2R?QJ1XN*hy_Wbe#EuZW!2m_=Dx9UWf@(^e7r4@_*W?|nR_a-w7 zw34*$b1fpy*2^URyQv!WmH^LljZw`eO`0Jx>Yp~09I^Hg9-dWUpvHj3v_VgWDsdr& z(`LykqB*5(FIrxAJti7Is?r$<^=gbR))fBGUl?m;*m=D}^A2)+CBq^tStm{>F}#PkWt|J+w6WgHZgOmJDS4xe`siuS366zohquV-$ATf#)YjIa{x*0l zQcmLBU=v>&;^TTindeQ*syRFE6}#G!#qv`x9t8w1XYyp8@n0;6_iROM)%Hp}Ju}*FgkP+KllC#*Cx;>P*ovGoZ>1;vZ>5p%AQB;GYoaOW?JR?wVhA6@ZbZg%0?0c7T# za|d^JGVh$)xm$TluJA&4>pQBaVsGS8+m!3;pvcG42LX<2o-2Ppnf!xonTO90s8fy|L6 zYQcFawcRqe7+rrL)A7@N_>4(BzwEI<>eojjzqrgW;+Qc93MhuB4)nqiB3nPse&}x5 zlAr4#@;ZIT*rkE&-~+7KS#;-*XXK|av?E9drgr2yqQCWU9*iSd%~4 z3cO!^n7)%)*YoqNy|o&izK|j*ww2K36sp{_7J!1RX-=2Az{R5*O^}<$*Ep{>8dJzt z9BM;(LZd+&*2S+UT(I3n&YQZa)+HQt{Ba#sB)p}CkY0g%d$!cMBpAMz)iSyILRYlO zP#;R-SS71{rGKukeq^vBR?($R8GC)gHjdz7oZ`U7MMwVy z*-$s>-1+k&Ei0OvDmRUm^mWgr z&6D}efFJFe@*}%@^#)l89N)0`g=eSn5gyI3^jOr{P8Ee-*P_YD5v3@cXy0j=iXxml z3tOJ!mJGF>$!g?XshszLkGUi^sl4kuIs4`adO(R|++Rzf*h3~S|EvAeeoptHIdBmQ zyDgof{BhC6ZU(u87gPYGy_7uc0*O5SJ6;k=PIc4C_>Nl8Q44%f)K_PqjhIy!=FM;O z4>~FF$QllHy~fd+N$vrUvsc#0P=5Y6Wv`*%xU4qHJ*K+dp7$4(PgNUP8zTzHtnG&C z+Q!=9VjaN!zWHWTGaCmV=MeTm_(hBOvR^Wc&WG|T2HK6U#=U#S#)waO3nF;qY;yJu znd7sRxpE1E;HLh9!E8Ttp6GjL6tO`REgDbJ4Ag;2cLt))cl5fiI;Qyx_E?t5L>r`}s~nOxJw(H@G>29opQ0@IdqX=}~38|(iF zxAbFbYR3Bt;`G>~A8rIu!%WPs4FrVKSy?B5P`WH6l#gZ0crVddX4F=s8#FpLF6C9M zRFc$8bXHXT10{siE65)l8hBq0zA|8|BahfG;Db5bXohb4VLq;HIM~aoq>G&w9V1lO zl$YO6&tm(Wgcd5&H$X_V2-0w?g1OIBamYeIXj=2~>RwG>y6<$AT3n;;ifb{OOyDCK z3W!&fh6omUXdH0dLYnBDPt4)KP-)*Gt z#nTXtIgf{fbH3{D9{Jad)BmfCx(M!|*?3M@ttK4nHYj4 z8gsc{bj3~QErtb2)YtA<(U|oc4Gr!HfuG!e>jjTs;mn=LsUjDa4fpO#-XrQDE3k`e z{>%PyN9=C!11|ULQCWrEjBl+>y!gmx}1;-2eHLM zlrmOmoNkSx-H1g z<9~fhac!uukLTB#yG6ct-8J%5O4}u9uLcf%0LX17eF<63PIBl>w}I3$?Y*JaNpx1? zs>{HeF_&g*bVqRDc8$1&hwwFj(Hd2RMBUAH&P7Y&Fd@3mg6czuTl(oKQ=s|nBA-u4S)!G`7k!^J(JB3^k?QI%PLfEB94N$ zGlq8ijNnA(ipwdm-;U-XT>*SgDzGa1F=i@NTi3bk>(s6bFQ@1=L&L5mL67EouHhwV zFp7+6ow|;`29%@|_9MdG>1l*?FrRi?d2!FUXa;55ZsO#zpIZaGU>)QOAJ_C6OhSD+ zpLEVC=o($U+EH}gZCtA2v?gDV(4%pgA-uE(Nt*hwP!-wI+@diT00I}hN<%1XB9v}lyrehSBvgd+Ua*B>Sa?ilF<5T&tIGuuJ!uJ5ccR>xcN$@C6+?r-Zmg;>hT z0F?-1UiGU~h^CMWHn#RNL=*EHyT&NwVnm=)dQCKOsIy!%R@g(E8gK;4K4Yxw-m&7d zH^0lPQF@8C?Ti*1-{XO~_Fx^9AIZSvifU2vl-yjYzHl|MI(dthuOdzbqk<*Pk)oR~ zUGe@yv!PevYI;? z9B@`X{LuNiD%CTrs4$&}B|Ay|r+f0GF6?M!vPHRs^O?-bbCG@>nqnrDcN+_NP9fMe8=~^r+T$Yy&!}btOtSV_Fw>iR(5kkuJ)WSD0heThahHBwV*>1)5WpD8Lju=VA>kiwB>nm>dH>E@AOM%u?!N*!YBCkn70jNh* zy+%8wDX=wqOI|w3j&GQ@j;sQZF_;DFeoKH_mq_lix34qUJbH6h_f z!IrP|5mdj`>7$V`7+oPt-xwNM$1?OgD|C}objJF2c-3IFVP85$CwfOU$`tE>Lq-C* z#Gyko7i-RJz=u=SJ}7Ui-Lsm*?xduxa$6dHQWRd*KB%q$qsC_o-uVz2b^o&TF#TQ+ zmLiA%GZ|<_j%5F(0;vEh5Hq9+hzQRc-1`tW8OdbB534isesf4t?@xC8i?PzJR@9&D zxMzE(L*2iynlerC>4!irU(6Z9!Yn`1k4^x`Dwr z1Gv5I+ z3tzd_WaV#+wmpaGNXfu}@kV~f+HVu`sF302A%il7mkN&N0gsaJilV;KS5Cpfb;3Wu zwHj4qcD|h)YI1cW@Ou=nwial#n`-%6^wYa~G1@D$cXcPCA*ac{A>V6il*_9eFDdepTGK%l% z5N^n1fCq(?;=F=^HW;vvyRYhmT_&)8KxO?Lems*Fnr?J>BRG6=*~NOrNI%{$pAxn? z(bK_`VhG{q(PcXoj~|!skio8n(c1)HZN6OB@H5X?({)}~bw&e325Xx-rD69r_a$SBcXN zo>nurjlJ@J+I#PSrjoXCG$^aDYg-njw-p6NKr!_Gt_bc*S(m2N6@*9^Lhq|9y{rO4 zXi-=}h=70rLKSIBix@&^p%>}BC-9qdf^EzD`@VaB_q+FxJDS7E%rj4B=FB|voM)a= z%$XHIEF4{?Yz=qu3$J>k?N8;h$(#)(aA}CS`_E$UY9I5_C3_U?Q*arQ&K{qpRL?Bi zI$sz&=-Sz16OGpaI}7p3WYk_aN8?{;4%R8pTkPo%XOJ9RBGLFXFQM^b#kS54@7tO7 zch9V&31T|TeltdNJIC+e^f5c)?$;<9tw?ug7b1p+3!00O#Y1ur&4cQCq6t;DiNiw) zH;cVTF+@i=@Q1>~oW2Oknb2qxlq-IA{01&BSV7{~(D9M<%j@a)37p2s3|7qP267aF{0q{Uhq*B_7a zOi5OyjCGdxgK$ag-nc@3pJ$6|?kD7w_dmTcO$x?qWqYO}6}#z^c|beX1TEJqWDR@P zMtr1v2vtA~;b5weaV~r?3iP%G4IfwT>Vs&^!1^Fd%9gM?2-v5@KE!B4B5CFk2 zALheScM!W`fn7TE!v{K4zSr#U=#ZHWEEc#j6oojd=7{>USit2dMwcNLP_;-ReIXX0 zD7_oA!b%XP=YkW>qL$tw&@LuZ5?!?V4!bxDq1F@4i+~QfP9#j!u5d_j_;}*bw$rFk z>--Qx5P{u6+a~x?5x*Bkn$n$q*uC_;SF(EC;1uq1u6NOxf42h9!bZF3llybO2!U9( z8s~(~JFLcqt?aJ7pGV!P)Y5$O+AR=J10HLc1M!2omJ*#w*L>L0@0m8mU6Lg6V&bV~ zZq)44X~^bEagz)((iENeUHV#dMG|I({en_*cA1=?5y_j@u&-Rr?S$M!`Vvt``uD=v&oe-&^7{vCb<`7Z?>{1mJC)s{}z4ja_MOuA2IxSUInOj$Cn`PJzmkxm0CC~e`M=QBYQIV2tnH7%L&Ec?B#P_6g755w+94O3=-_RNBiR&(G(1>4f$2Cy ziNQ>;+2n@1l3dWu8iy9kS6B25U2K8z3z6AHw)vSu&2yhgye&C7-7af@q;{#yv&Yp% zP2=Px*9HXU! z-UPUt?M(P+)L|KiN*e{HBu|s)x0LyR0S`f0<^0Q0&npSEhT~30gYi5fvnII9Ky=?4 za|);5mwURHbIhDw{Hir37cf~~TV7>Ngd+A~(Z+T6f~4b9T#Nc4*>c(0@>h9JucP80 zfaiQteUEfgxm0Vk0bW>S^m=_O#pzDSyO*X7$G}kTu4^VZJkGZQdw|Cqpj`&UEdrnr zO3RUEL0fWjn*5V|e*7=axsmBj%^Q)q**+-;-7-M=9aY$@n?3V>`?_dP;ynU+?6Q;TN4yc_X@Bz$umCc*84lup34x3!0!l$!`ObO->(ZD z6dodmueY{H`|387^ReA0W`?$6xeCKNXD2H3XNqO+$t`)RNW~m1INV~LWNhZ!mJ~fQ ztH%3&4790@hTZmnm?>E>Yo?G+mkZ6KsuFq zdU1cfFZXiaf)1}|rlh7#<{ss(?Dsc&Lo3#bW(r>owA3XHiycaT=;4=wdkN{Hs=VSj zSUx0x=uG0Q=sP_kU7&r=bFLPbTXlS)KXmFk7oxyEGQM%DMwTqfv$E`hZ5dxgh-!@TC}_v&}hFJhqKpRYcM9 z$ct{q`jw8zn;hlQ;r`MKWJ%IcrQ+bcYqrSPfO*l zS|4TCf+b-`I>Jws2O@s8$<7uD%ff_)b_fao5GpHt=W=rI`PNmmuaDt z>g7xpB>M>kcER{j+rgp5eeA5OPq$bnho;Gx?pLF|+I)&!+wI=#TW;g14Qslz?r}}v z?WumiZej{(94KXFxNT3}^Re{IR!pwD+SQ-ai!Trr^Z!{WMX5W5TruUiJ*p_;9@ZPs zVm*W0n6PP8YiO8Xt}hy~NQx5%inVHqLYd%l)5oqovJNM;WFS6 zdhOU9y^rR3wW&@;>CoKXO5m=a#OlKzQcYF?0vx?&U&-6)OC|BrDpAFCnmT$74ah>L zbHCuCxH9C24LlUmGG5xe8a|bx)Hr^pro3c3%E!`Jnf8mf7Hd{@y%YAA=P#POnk6{0 zq6xrZweZ%0CepZbTfS1>LViq{v(v7rL_{_lGa0%*W_;Hv*CQ0S zOy%L+*EX3)L#otKL7A7sB#c^|dBcX|hspJIBRoPvz9N>@Sc9DFDG}nvbvG(obO$x^ zj8&RsRtjYk!qA#!+;?)l#u74SSmx_v=#+h{_4$%sB56;jv3YjIb~mqimp?(W_VAlE z_@I1zDl0TK9lny(T*lQ zW^`4KpOQPuZwMw`!L!0&GuM{2GcRK1rmWAmleMqMTjt{%B+19R)BHIx*x6$HX**W) z*z7Y=U7M>fW~alCYQ$uq)ckxn!~-f*@>(XcTlbV*Hw`05*3=hE?jTaVEPFD(>v=UD zaKJLCs#v*Fyv3{6UfZZ%CZtK8nuKr|1D!w`5GJhhw5e z$h=L&+hMXES#C0Uk*16lKuj+xWe|%T*TP3IPiUgeQ^2WW&hda2&5i5pH*!L&JL?+m zdMBiA_et0Dv-=#Bn$+Hd{JVj{HGV&R%xYTUGvZszMjIYVissPx%deX{(L z{KLi7BUKehUT2&_e&porw#}gPgVxkhw0Za)N}ovp8$~HU2kU>{R45eqI$djd&S7iq zFczPW@LzS3UYJmlu?Omm zz49#2j?sQZ(ONV3Em<2v^18Ujb&~>a-mkNWwx5i2uzI0z{ROvfNccvdrOOUtpIcgg zcTf7Zk>vxWO1J2Pck=IKRu^hJnP=k7YlqJbP0r`(W6Sc}rMn*?0-@by4}&iT4&cCM z19__kTBZND{r;x7FnF@5#kY-tt23oC&q>!2SyzIY2fH6iw8eZwRG zfJIMe81%aUK06S6VMIJs1$R&adl@5v?T?qOa|83a0)warWMQO4arp__?KlIOm;-lp z9l%%65>@aA9IHV>1i()30bT&1j1RjtV?zaCa2CAB!akEA|2<3sj4pzre?i5Fy)O3R zEAHmuo(@SpvIN`PdUa)nX;l3-(_@RetEompf-#t%8|AoJONCi}8=SA;;qgyZ{wkd* z?)jG5wYuBZ%kx{ZC8j$FJ{jax=Iy$5F|oNu8i?`i=tzriZ8J!Z=Ekg$N-Su{c7q_7 z6__hrGKx}kL{YQ{!{>D?HsEm1vu}K7j@!yE5U{2SLFb?_)=)TSYS+1xv>XjS83`D- z(Aua!h$@{_CWL;W|8%&1Ov!bYql&qYmIsB8_PE*V9)=hG?*Q|7_BQ0E)UXdE^~Y_1 z*w2pB7)F~D;5L5lSHu9!B$(dK@ypx<|Krwn^3HL;c(Qg@d&2bQ> zyCJgKd!pCb|3JltITWsX_DwRQf6=B2QE>m3;Qk>$_RqO){fqu(MV98C2G8g3StOV* z0}(Y`jc<%u<#}XIw)ef+{%``(>5~g|_JJo{kQlFM;F<4%zJW6d$N@X-feK7(Mhb-f zFeU>72=SeO0GMu&{lMSMegKU4w*a`nGN{W4Mtr=(uW}R+P%Z-zxB(@MBmn+^5AX)1 z_3yTsV9djcKI{iGVu-cN36`Jz3BbTEFu@E3|KP+}cp%ozCqGh*5_o3s0(}GP7&G2z z!6IM|-0cGVlK>546n=ydo>cwhL9Lzpo{{@s!v!){5Exek6mkmGkr#Wubb(SvTCsJy zxr2a3YIDN8(8~N(04j%v6~2KD9QK_2P!SZt*}LNr2)={#-Dz+E1ACcaPyt7LfD3jP zD-@)Z5m^}MJAHJ@3VGz*Yw27iwj81JCi9i^TIHOmpAWZjW&cUKkG9Nc<^9kN$#wNL z>S&~VWWUn`|B6iR#s15+v_xOQ+ou2JOq0KZG#QP~v+!`M{9$u7*{R7-kaf{!KC&A9 zP`M&#w)l;T87XqZ=?@EkEoGJxahC?lb85$i@KiV4RzuKMnXg)}ZLV^cLM_#e+(3N+ zx(b8Vh%&k*^Hm=N%IK7=RVt%X17%J8W;Gr?BiKBfhC_w#Bvgd3|LSFzvz+R5-13cC znUNiQ=&de1LK@`01C7dIM*n#(5I^=mI`2l=%%TqE#cu>BI#8dY{+GvpU(q7?|860KlAEtoBlcTzRqt>e(;#U!>27f zntDHMLvpRHV$BQc{uJE(VbJ}vQ1|=cJ~19j)NV_^^oF_t3m797X2%R ztfAp;$4E!+m$ri?`zN9WoZlf}u^6seJdFt%jIGt2zgX4ezSjZiAiTHm+GZ9mvFu^_j~JTm za&+svve@SjmFcf%h`l}dm<7YiQC4an%|X2mwZ%JpnRt73njDc)np4Mqq6$yChKbVh zx*@Ch*phe90g06et2V11>#>yfP@@8c4$uPlV+(G;2?X`b=jMh(%?sM7$AcCfWG(lJ5F$$* zXT@Pux!B;`MXQCFdlm5mw>f-bB!J$1J2hj(T_i8Ytd{ic^O5HGnEY7Jt9oSR1WZd( zp>c5Rg(#JShIb`c_(G%j=vw-z4(e|m#2Up>gdEzcJnm&0zjZZosQEPblQ?LyGV^$ZiJc6tK9Hd zeF^>2XT1xT6B0&4!_jG2@5I|1wu+~>q-d5h-XzLjtR-i7im&qPP44GGLn#-wYNtR zCn!1LbAoOq^vE&;tN0er^3+i?gE=L4A+M}F?f9Q_ZGftv#wn{Xi3NP`KweBdPWR%O zo2B#U!L}L=53?fX83LFq@Z^NL1BJTSTYT|{PcAAMy+trF2ZEth1tSU4H_$Tx3F4ji z{4DS-q`%+J$ogWTs=`p8FH{c&;Q~xvSg@9m!1Lfx;*rfN5m3+@*z1e0{mfrx{3<;FT|iNNqHN&6Dtg$@x3<4l#p zwxpObg7)Pa;E5!uXM)(Y2z)Tv78y%*9qK5@N#Xx!c!+n$z9`f9F&jmbztVaXL{qmF z?@lcliIZXfjc}KM?~Qgko9Tf6_n()|9#|0n?M#u*iA)>!;IHoMhbAjpOeHEBoF2UG znt?Kviu5YYF>w@jxt6_Zzfo~G;#4HbJL&oo%0+tIYNB%{t>XUG$YedEv@n{1!@Sg> zE^Es(x~P`|r|cAqx23c%jmJJ=T70-dIt@MMdUz}Wu?JY3LP2^VBF8!Qa*qG20%N75 z5w9TQ08Vvfx8h63>m(b#4$Y`MMwB_J+rmn6c6oRukK3O*DH1a8HXa?G6WAzuLzH4$ zie5J=yt3Cl`C$h&X!#c2F*34;>uIf3Nto~VEn9s?Vrq+?Dc(zMifzc28MFb2+=@w| z{5Fs)Yb{8ciZ%~0=e>JsRI`ncuP8|b0ezHoLGT{eq<7R7YIw6CZ#>D=OI3Ejd(uf?kjZFPI4$)RFWGw;3XYl<({7QWN# ztno@2xx(hFE!3)BNSLQd5qW5+L4MtJ9J2XL?)z1{oTR5*q4l!$Jd2E7M062q%fyQ=N0T85bRP=#l{++DPtv^S4oQu|~ktO)& z#8&+`qp*tZf~@zde$SgtmN`rqj{c1%Jn8>@JzUPZb-ebrA&>4tbcCOJV(TIf!{-#< zC_W_GpLf9BL90pX_EVhpA3KQPAKjuJ^aNLMgzHg55{P_pW^_!x3l1%}-`{<(Rbl>fCUp4RninB2ca|u&LgS6vs`$p)f7o*JqPgX^rH;v3p;eV4 zE?XgiyJ#d3*d9EBsU-*$4$xA4o_9~Pb&nK#IOFq&$Yg7q8k1}_C0g20@JU9Ok zxpQUuD?Ulkk~ClLYw z1xR~LBFfI!jmpxLtpY2g^Er%Tsl_I)*`XauRW?yG*-lrbry>>V*nedd|2P$N&N!e*k*ODU3!&N6$`64dKxv|l- z$*((7dC>-Ony$-X!o!B{mm&y3c&##Y(ko)kWJGrdZ}h+n2rK6@f|^I)_6C|Jktq$v z29*t{v+t;ivGn-6Z)R?L9Z#9V3})x@^FZs+>r0rzorHGMzn@~T}JcO ztp!kF--t<&ugfS!A9irq>Iyr>gdJ$gE=-$y&`GdUOxR!MF!9egl>dxl>(4lr7&roe z=flr&K+ZbhcAR7&)vc%s*Jy^_Uph~9R?cl@tZoB0nXvoIhCGX{s@bF-;3l&L@^-1g zR}ntDgD7=!0)8@K7n(fYtLMtLC;opNyW^qaE}eH6(_b7vw3uk!ccP?NLf_fMr8PNU zadosE54`K?>}o#J;^1)2x2WBy#^Tx4ur#t_$4X*W zLew92nyo2u4JRz7>IQw!#-v)HQKLg0Pe+r*I5Z9KIwIBTefv!{r8-@H1O8e+IW7-` zSDXNJ-QC_0zdZt94t&GJ5F5cv8OUHFfY6gG@341QN7YrF=xDZ3dguz#<_WH4 zO?m`fAx57`00D#@T!DxS6=ZLLk;*y4_N->e&Jj0!B! zcMz}R0{QNod6- zN3UDhAWWzSh#^xq_`afv%TM0K-ZZksA7>Ji{&tdE>o!c-cImNujV9uoE4KrL`={pK z1d#RIb!q1&L42M(Oa8iTY9~v^PF>19xYwt}5q{AuY~S zxA%=@BZ+e8Vt~Kz`GDn~fSl4PdsK@EaFq~@yy@?z1AHgovug)FAo)OtAY2SS<2wPU z?7%mN)gV1En2p(OB!YS07*JWH$on7di91cNT4^>CUKOS&Wf+i6z-t6h785{#C;St* zTn76P;I|>{jcfXU-d;IBY_Ifh^8apoWy|e(0BVBz5HAjJA&&IiM28g|&TK+@=HALY z9GZrU;fqH;ah?a30S67aEnNqv@J*~e@85O4G6gP`&<_H(9zU;&71!ag-x4Q^k)Fs- zD|Y2t&dm@Nw_GVK>$!aOPV4S=g(_uoTLJ4+qg%>{yB!-c6sk7cn~;Iv2cZwVyC3NU z{Wx4r!>Z&}o!UX@U+vPFufov`Dk1{dH~qye4@v;(ADD=Ld>ACSB6Qh*?#zqDNn8PV zzE9cj5#2F9;jV}ba0&P!El2%-3q1Gt!2bUo%>I}^H6!!i)ZrDvrd9Nz{$A`mAT=*9 znYB*naOLe&F~(+Gn{T1Np$moKxtpTKY$8z%VAKB+umi@R!QterQObjevK@qb^!sfw zC$ia@)n4(V-HS`xZtfE6err@S_Ri53#opfQg$re*J5?1vN!44vnBf#`ba?2q%_DRC zIYg4Erybk&$ac&nqh#LE2DD^-;iK7w&0hM2h9IX|oe4?(r+p?Kz&E=55hn(?H3K?w z7kKOo;4FpRzO?*p$9ev)<2G;6;2C~Cc+!k#C<8sihaaEek|q4W(O$e?0?WV;{2ze- z0rUOOG5^qK?*w}2irH>(kZzh6R(dmc;}$_)*Tp*VJ!bND7ADe%tN489v@-HFg|)v+ z%tZa`ZT3bIh6K*jfOH;&ih}vQ{n9R)-N_lrt1ep$@nm=VdcnJ+LX{a+8(fR$XTyyh zNrM{ql9a7Y)5a)8>nf;lg*(l)2*4AXK|CQD;t3lPdOzn0tJ)57{u56KUh83jJiOWw zGL8$`DQUf9m#~!4yc;wp{l+q+W>4NQ?$SlD`s*5t?KO^#&k?!Ud>`*11ci;uCL+2s zuUyWVWUSiV?QJIL>Aw&%`xkw;D{1j`eGMy>SKE0DMnw`d^NDprgy<_(#+rs#`o{}X zQ=>1r+GnW0Bk1h*kGWa1H}gkrrh@pZh{_x)n+{bSRJS7JSX_YQ+C@x(ihSmVWu+0> z;x>Xoc^DWW5&_cps;c0s7PyC@gaaKBfbWRCp0gKPp7GU>%eCNK*T)-VP7i9LNseSG zUA_){Bc?zkqujI%smPhG+3d^Kd{^`8J%YRJQfo-)dReN}cwgSEo=0L*RD+CWQL*W) z*>L3b9RzMGj(6C(b8I5Ut#5QzmW{bU2pvR=lY%-$9V+jZq6F(`eV$ zLKuqjXQ&3Qr5%LfnusDRget{)s-mgaIZtIJz$Lx<6RrU!y%%bM^mE`|Cb03`%ar5%wP--a3=S!bD)p#`d`@z@dR=DknnxWhni zl5*F?L)x7S;omDyfq--&Ot!LJyA3@Kx+7yc>)~AA{Gm6`(5`Pv=g?(Q(x@+Smke9) zHpxJ)^d{AV;Pd|_kmP5RGsYTa_M7Ny88ZgwDN`A_hcq4*I|XYlx(?k4t93MaY-c+_ zlmLn+r#7gv+)1b-w^CSA#^N8J9(%OArGu>7*IYtfhdYYc4riosr=la>-e}GHN=?WXn^#sOnQ&@8kbGCZDMm@6jXpP_N z;g!vFavwQdF!1kIe)@;E!T+%G;n*_>getT!z_M|ij~li3Pq zw%Jz#!pQm2Lpunax+V*22<$KEFH7F45L)uQf3xJ{KVR|ykt$Q+nqfFl@D;7I*A95t zg%4|>yebaGEK;(!62dZP>@sIvM^ep_Tk++E>KE!7f%6yQu}wKS?;$^x>(As)l%JYH z|5l}KgCjL%TehuWkM%?bH?Im`SSS(^n*DaVc`#o>JGM9Kj}?)q^yE8;%LBe|Eqy+hkAnAZc%`c425NL<}}V^zbZz^;?FgRt?9sx_`9 zTPK;FvyHqJb~*v~1LtZ2Cu}S2+6i)!0Whk90V1?0dKIT?mNb z-eOR0M)tlcsgE>>by*^@%$Ld`PY>mLWQ4EMI9jmEHc>najc*%e4@tAN8(NP8l}P7? zy!&}n3eWE3{f3+3QW>;CtX$xKTJ&Ue2hq*8nZEVJ@wLAtI@jkhSV{jn3C_8IZ0Y1~ z4X~%ry~kGH4gY`Z;}5qEy9KmsJ5E^kM3pp8GvjYhb-WraW@t z+CoDJy?Flw$yACIujM*wH&ir}kwZ+XX{k<0I*NCAG1Kn>oE-A>guR%K^j8>pt>~m( ziCi!{8nUXW(R5pqWGW{~G1D@0L%Gi86^^1e(LiC@a9_YvbMaX};%a%Sle+&o)DdgI zh%XfHAQb)QK#*#>=MiDLFeNBpy$9%Dsi@3tm+#$a{8->2$c$+Rab;x? zyDbgeBt;Xqb`W{MImwgFd1`K>>!INz2gCVnZ;#ja6P0`J%G0aj#waN{5&b}Wqisz| z1wHtx^VOUIRl9Aig5PKOC8ca``TKgG$mpyiV+}OOFvfYYKUJU1+kBwMCGf+zfWII) zwvg0@inZ_@XGS}momqAe(p(8Uh_5b+(jzjht46mct``_~zge@H+U|H@O#Yow3BK;X zC8dhkH@K}6K-ob&*g<4Joz7f0CvTrMs8GobX3`Ppkl#k>LMc| z>)M4bD4K6laSv{|-Wesm=u>Yd7?gQ*$X{wf%QZI}PYLGt%Sd!hxL|G6H-)r&IbYc7 zuhK4wD!c7!~=b0TnRpsCgVsi&EB(E$9v}$({2EpOxNt^zt zEk%EJAPU$))GFElZPo3}|CDXBP2|6~gP;d29OVi)yAqH!L;-rPnExZWLHq!%&Sz*7 zNwiekjHlTt`3VUr7M4s+yzMEm;{!=5IJyp7VF3Fwt>;K&Y;ujYCjp-@i4Gy%9S$uV z(qHt;F?TSGkFK0p-t?YFapNsK)Y-6m$yh}Xjs01@5qw?2-4e*b%_Zy9jlq@j;UaD& z?IwqPXHTW`+p%kf5yY=5=Cd}j=(%P`B`fXS8%BM2rb2RzxKcfNRiebBw9UdjPJIEjeI1$(%$LlPne)Km_hS zbVvqpc#2?t(RZrfGrDUg%PU~@Uggv63F89cgx;yt_x`HTi6L3wv&9XaK=RW0g35lF z(?m_raMB;6a(zRJ9-95-d1so7*~42aXF^u%t<>d4RFF-kW?!8Et-Gh&L5& zh&FiU$bq=f(!TlK&0VPx-v_Btqx|-f2EXl)YeeV#mGAQMcMz~!tpdu26$#!?0GWa= z;7`(M5~hbnJg9ylIXgm%{e(zH@}q=hKXGwR;g7QtvlF?buHkoI3 z5Lxr4g}kG8>qXf`S7pl@!bhS=kF@(Yv0wE_^eI9=exuy8^74%QN7!K)l>7fFNXppQ z(Ar%`sy^w?E0ct%A8qP%pKTdU@TW)=@EmHj!Az@-XqspobAN7MbFRVaS`)$F>K-Ae zwi9>Ph1}?xjRBSmrrwTqWiQOq&KAoJnUp=8#Ot-0fDj*D{O}{$`{JS=pp*O~YxIDP zbDP-@8w2jq&4=*zmg`ld1(!}tAPn}|1-u#ki%CGvODD19oUifb+q!@^`ef0EzE6~H z*A#D!H|*a*Xclkw=F zr;oROXl=8dR(3#r)`W&mcWA=fM$Yg1bnt_e8s(5tr(e#?NUSM-En9(n-NlV6x~@Iz z64DtN8fH_ks~taATib$37|ljyx&+A7eZ9Ju$wP!nO(2%Nk1~(2u_~ii(u*CqKl@X_UAFy8= z!DeS&ebZkg4t7LeF^(NXmqAr#sgaeV{!4gpKDX1j)=)4nImVs2nY12V3(#Ma8bdLdWnj1Ja;hs$whQ`Kvv9 zMX5SzY*%Ji{C-SsE(C3+_VrFjq+=g)-n{Vv&_OIJLENymqB zY8NY*@LnCL-&#;1Wg zl}MMav84ZV75$zYYovJ2HtQ#t0Obv@CT7~8W34S=}-+yCMm_fzImv~N35nZ4M%P<$iJ$2$-TtfLGk`*X3`I- zj=&^R`1k|SVF}580SSito&FeU+i$Hw2e5JQ+mpFf>I= z>Feu0YbGi-mqPB_c?cK`@ieq)!Ft_LBwu*Wg7b-@skc{9RVV5CKSpWO^F21p25&WN zH{$6^??`7|azTwi@Bz{m&`$)+D0fjR7gP#+eqP)`%pCN)N`F^0q9Z||D7~dU5r80J z5(4{3g4LI9ve6H_$Mhu-ySkBE-xEz$dV!(#yE3vNx<%*TKO>j}_ki6NR04At!D&6| z_f3Jh2X0aiHdiDs1YbP0G0F>0KB|tYDWbkS`LKgeKK4MWFdzXmP->L90ZtAD*V_HQ z9k+72KmfYIl^#wxW$vVwMtW=XV z_ug^`(THq$mflyaT;^l3tv+tzA-Q^S^wy;9@yBLxE#5?~mxz;qF0U}?a?}U9jDqMg znggTCKn||VfuL=d!41^HKZ($vJS4^f3A*DB!gqZDuon*@5qjqb5xVvV5&9)agwDLH z%nsf{AO?s@V7JRE1~a`CE=kf3WI#M2Zv!2+AQDv-h^5+u&}{Vg`dV0qSh|6NEZX7yoXc18$M zZ_MCKhHY|ty+_M(AOa*NX6O%i?)z4I^Bxzu&6Vp+ueO(0ZGGRb7vP#hU~P7EBf6@b z0YG5s!1~?HiC{89X|F)>d%G8@%k}=PZP;!$?}_cP{_VKF?6OoF@2`J{-@QN;kO21U zrC2r580zF^oE!!PaQfbO`^Mi(13E3QX*>F*WYh>gEe|Z)JuQb(ATC690&Sz$^c8+J zLYHxKuA5AOQ%cX2BlX3SOBFi(z212~jqbu>MO>OAUX@YB?|DG$w9gZjD?{VGshMPc zZ?MTMMl9K#Udtio_H|a>Cs24>lz!hZl25#M%PGLj1vk>G+8Yxgp%uXUC-2$(_N}}yYkbV&z20~aXG{ONG%sb- zrhN)~oz56jJ+)OdU1(eVe%Xy^QHrY%GWM7A9^%8|l;4WAo<<6rf179OHb#oSp6bBQ zp|CnVdWB+_+}?1nW+u2#yv3uy0jH<#omoAwdS&8X_4MqByNh$l9BTt=y<1j7Q%4NF z7P~xA%$iY1T2E89%VQ}xr17gp7hb2sYh_U*y-4>G+lAxNM=H5vR=WDy)|>UO^_osw zx#t*X(;IWO*q#owX&2_k)}l3jW8{&0f0JFBgC5E-(=cc-nsB!334%NZw# zm+rj;r-Xk|l7;9gU{X8<6u= zwo;@< zvEincM%Mg-7LG&Kbw0(z6JXT$iY9dI0#ys@56!cyK$d5tR*3$>m!&yHj1`vvY)W#z_cRbPT z&L4pQ2>Jj}z+@D=@r8H^Gmesghb;IgiMAM3bvM61I*kw6E9!UIZaSdZW-4{n9zP!E zrh#U1hfIz?B&Jx$8sfIb+|$idt&M$F=&Xtu-`Rd+_nFM3xUCfa?;i&)DwDCCqo%BG z*^D}SXYOu$SW?eynzJj9tSCR-dfNcZ*icE=H7Xqa+*j*pk*y`OHq*h4ZSC!6zb}U? zDX;*BH*VhNa?;*JerigGtq~@|S0DSE~|^MERWgpDG~!(~tjm3sBTAYy9l7w6~3DB~MCM zp7ri-a8HRo)OYCdI}Hb;NZQL~beDGFf1`j7)!=H4*dk2X@pgklbI%LGKk(vhW!AuN z+_aNN&W`6i^RVfhZy9LhJ?Tz<+TVLrL+Spr_r$W)qI_y5IQ71J+Vy^qL3+S#C7xCF zzxnO|w|~M){%^X+7{dQ;fx)K%*{u=D4Ug3S?E)~il8*4$0$qR)W7`akZ4M|Hh6epF z1tR_auWk%E{o-!NJ+w^EDDjcr2p9{?upAP!?CdT%O90m4{`+ZkCA33et`kO%m*wO;Jw+&^=HyF^Xp43p5KK)CLw%igN=w=Ry{F6vxktOwb0>urdl7;SpFwveN7^1{nnQw_yWtwj7!?YA$%ehU(V zO@ME|w4(!zqU!E&eBc}z&Lv=BDd7Hqu?m0zD8RlwM^L$F0)(L0&xN2DgfS+N5cKDd z#GVO$9RpPmy!5JzT2Iz8kgM(y+iwdgI&0v7U^#b1zjx{4TfN^Q1t|#Zujzkiw_wWM z9hu#!_?>_N=qzMm_+K;KWQ+`CVF*&+R?MP!r#}b&^8SD59hGMRdVT*mHV`+!P=W)~>67&(Sf)_= zWPJ%(EufMGselWBeCPwx9#tp5H=A7JW?Qw}M29O)JBSxzD;jG*QttaUj+?AqT#OBb zz&<4SM-SbJ{-^1q08O8NO8+ynM{d}JnbCrO_U{tN0Jx(H{xUxTmtAHJrf=UIhO!|> z7xeab?qL`IAi|$TBlr>X3$SP;@MCwG;7Z`~AEu87^n&nDY42%jFqRhGe|7mvN?dv4 zxUP@T2DP$irbkES?3%pty^BmEemG@hW2w*-5FJBlf6so}Y(uH;a;3Q6n@PW`YmcKr z7z?6wL9}=8=FCj^26u{cFRANjTzb}1gL|HE9Wdf#szKeYe;>a%sC$or(6pBT0H?fI9=_$GATtrOOS rvsN_vf>dbfirtM$Q|PJUqH`mTZVhOio5}`J8IO&Q4?uO8cDnu-5H`Za literal 0 HcmV?d00001 diff --git a/frontend/resources/images/walkthrough-cover.png b/frontend/resources/images/walkthrough-cover.png index eb602f871de73208397acff3d20c0660675e0950..109e00b30d4f4ef92638444f5b6c2aacec35e731 100644 GIT binary patch literal 179746 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
7xl-(y(K*f5Ak@vR*Q+FLnMV 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

H&yOrfw0~$T(~C54pC8SAYF-*skG$6VQ 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 CQ>#4y literal 115991 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�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 JTkTBX-vQ;{RM!9i -- Gitee From 43faa06ac087ec50c8e2aab7ebe9f3359cc847b9 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Fri, 5 Apr 2024 12:16:44 +0200 Subject: [PATCH 0209/1266] :bug: Fix problem with uploading temp files --- backend/src/app/rpc/commands/files_temp.clj | 3 +++ 1 file changed, 3 insertions(+) diff --git a/backend/src/app/rpc/commands/files_temp.clj b/backend/src/app/rpc/commands/files_temp.clj index 9ac4f7e5e..bc183cfd9 100644 --- a/backend/src/app/rpc/commands/files_temp.clj +++ b/backend/src/app/rpc/commands/files_temp.clj @@ -134,6 +134,9 @@ file)) file)] + ;; Delete changes from the changes history + (db/delete! conn :file-change {:file-id id}) + (db/update! conn :file {:deleted-at nil :revn 1 -- Gitee From a7b7355a7d436b3ead5b60580fb6149370a96bc0 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Fri, 5 Apr 2024 14:19:15 +0200 Subject: [PATCH 0210/1266] :tada: Update libraries and templates section --- backend/resources/app/onboarding.edn | 3 +++ 1 file changed, 3 insertions(+) diff --git a/backend/resources/app/onboarding.edn b/backend/resources/app/onboarding.edn index 9c65ac6ff..3a94d29ed 100644 --- a/backend/resources/app/onboarding.edn +++ b/backend/resources/app/onboarding.edn @@ -16,6 +16,9 @@ {:id "black-white-mobile-templates" :name "Black & White Mobile Templates" :file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Black-White-Mobile-Templates.penpot"} + {:id "avataaars" + :name "Avataaars" + :file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Avataaars-by-Pablo-Stanley.penpot"} {:id "ux-notes" :name "UX Notes" :file-uri "https://github.com/penpot/penpot-files/raw/binary-files/UX-Notes.penpot"} -- Gitee From 5a79a2d4d66701fd417823fe737dd967e1954d35 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Fri, 5 Apr 2024 14:58:12 +0200 Subject: [PATCH 0211/1266] :bug: Fix visual bug in firefox --- frontend/src/app/main/ui/workspace/viewport/rulers.cljs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/frontend/src/app/main/ui/workspace/viewport/rulers.cljs b/frontend/src/app/main/ui/workspace/viewport/rulers.cljs index 423701445..bec8eaf33 100644 --- a/frontend/src/app/main/ui/workspace/viewport/rulers.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/rulers.cljs @@ -197,6 +197,12 @@ bs (* 4 zoom-inverse)] [:* [:g.viewport-frame-background + ;; Fix for a Firefox bug that shows some strange artifacts when creating shape + [:rect {:x 0 :y 0 :width 1 :height 1 + :fill "none" + :stroke-width 0.1 + :stroke "rgba(0,0,0,0)"}] + ;; This goes behind because if it goes in front the background bleeds through [:path {:d (rulers-inside-path x1 y1 x2 y2 br bw) :fill "none" -- Gitee From 9dac69894e2354d2a3ddc654fd0c510c1ef3cea1 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Fri, 5 Apr 2024 15:56:47 +0200 Subject: [PATCH 0212/1266] :bug: Add lost template image --- .../images/thumbnails/template-avataaars.jpg | Bin 0 -> 169555 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 frontend/resources/images/thumbnails/template-avataaars.jpg diff --git a/frontend/resources/images/thumbnails/template-avataaars.jpg b/frontend/resources/images/thumbnails/template-avataaars.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d5abeaf8eb9070d8787c60b16c2eac4037d48276 GIT binary patch literal 169555 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 rq#qKztmbOHveUXt9M|ra9sS0~@PAw+xrGk( Date: Thu, 4 Apr 2024 09:53:34 +0200 Subject: [PATCH 0213/1266] :zap: Add optimizations to `order-by-indexed-shapes` fn --- common/src/app/common/files/helpers.cljc | 88 ++++++++++++++---------- 1 file changed, 53 insertions(+), 35 deletions(-) diff --git a/common/src/app/common/files/helpers.cljc b/common/src/app/common/files/helpers.cljc index 287bb7bb8..d6a15fcd4 100644 --- a/common/src/app/common/files/helpers.cljc +++ b/common/src/app/common/files/helpers.cljc @@ -16,6 +16,8 @@ [clojure.set :as set] [cuerdas.core :as str])) +#?(:clj (set! *warn-on-reflection* true)) + (declare reduce-objects) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -327,12 +329,9 @@ "Selects the shape that will be the base to add the shapes over" [objects selected] (let [;; Gets the tree-index for all the shapes - indexed-shapes (indexed-shapes objects) - + indexed-shapes (indexed-shapes objects selected) ;; Filters the selected and retrieve a list of ids - sorted-ids (->> indexed-shapes - (filter (comp selected second)) - (map second))] + sorted-ids (map val indexed-shapes)] ;; The first id will be the top-most (get objects (first sorted-ids)))) @@ -486,43 +485,62 @@ (reduce add-element (d/ordered-set) ids))) -(defn indexed-shapes - "Retrieves a list with the indexes for each element in the layer tree. - This will be used for shift+selection." - [objects] - (letfn [(red-fn [cur-idx id] - (let [[prev-idx _] (first cur-idx) - prev-idx (or prev-idx 0) - cur-idx (conj cur-idx (d/vec2 (inc prev-idx) id))] - (rec-index cur-idx id))) - (rec-index [cur-idx id] - (let [object (get objects id)] - (reduce red-fn cur-idx (reverse (:shapes object)))))] - (into {} (rec-index '() uuid/zero)))) +(defn- indexed-shapes + "Retrieves a vector with the indexes for each element in the layer + tree. This will be used for shift+selection." + [objects selected] + (loop [index 1 + result (transient []) + ;; Flag to start adding elements to the index + add? false + ;; Only add elements while we're in the selection, we finish when the selection is over + pending (set selected) + shapes (-> objects + (get uuid/zero) + (get :shapes) + (rseq))] + + (let [shape-id (first shapes)] + (if (and (d/not-empty? pending) shape-id) + (let [shape (get objects shape-id) + add? (or add? (contains? selected shape-id)) + pending (disj pending shape-id) + result (if add? + (conj! result (d/vec2 index shape-id)) + result)] + (if-let [children (get shape :shapes)] + (recur (inc index) + result + add? + pending + (concat (rseq children) (rest shapes))) + (recur (inc index) + result + add? + pending + (rest shapes)))) + (persistent! result))))) (defn expand-region-selection "Given a selection selects all the shapes between the first and last in an indexed manner (shift selection)" [objects selection] - (let [indexed-shapes (indexed-shapes objects) - filter-indexes (->> indexed-shapes - (filter (comp selection second)) - (map first)) - - from (apply min filter-indexes) - to (apply max filter-indexes)] - (->> indexed-shapes - (filter (fn [[idx _]] (and (>= idx from) (<= idx to)))) - (map second) - (into #{})))) + (let [selection (if (set? selection) selection (set selection)) + indexed-shapes (indexed-shapes objects selection) + indexes (map key indexed-shapes) + from (apply min indexes) + to (apply max indexes) + xform (comp + (filter (fn [[idx _]] (and (>= idx from) (<= idx to)))) + (map val))] + (into #{} xform indexed-shapes))) (defn order-by-indexed-shapes - [objects ids] - (let [ids (if (set? ids) ids (set ids))] - (->> (indexed-shapes objects) - (filter (fn [o] (contains? ids (val o)))) - (sort-by key) - (map val)))) + "Retrieves a ordered vector for each element in the layer tree and + filted by selected set" + [objects selected] + (let [selected (if (set? selected) selected (set selected))] + (sequence (map val) (indexed-shapes objects selected)))) (defn get-index-replacement "Given a collection of shapes, calculate their positions -- Gitee From fed9346ec623acd9a10f1e1fa49a5c21c6aee41e Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 4 Apr 2024 10:38:35 +0200 Subject: [PATCH 0214/1266] :sparkles: Improve partitioning mechanism on compv2 migration --- backend/src/app/srepl/components_v2.clj | 148 +++++------------------- 1 file changed, 27 insertions(+), 121 deletions(-) diff --git a/backend/src/app/srepl/components_v2.clj b/backend/src/app/srepl/components_v2.clj index 092290493..6b28de25e 100644 --- a/backend/src/app/srepl/components_v2.clj +++ b/backend/src/app/srepl/components_v2.clj @@ -68,7 +68,8 @@ (def ^:private sql:get-teams-by-created-at "WITH teams AS ( - SELECT id, features + SELECT id, features, + row_number() OVER (ORDER BY created_at) AS rown FROM team WHERE deleted_at IS NULL ORDER BY created_at DESC @@ -77,6 +78,7 @@ (def ^:private sql:get-teams-by-graphics "WITH teams AS ( SELECT t.id, t.features, + row_number() OVER (ORDER BY t.created_at) AS rown, (SELECT count(*) FROM file_media_object AS fmo JOIN file AS f ON (f.id = fmo.file_id) @@ -93,6 +95,7 @@ (def ^:private sql:get-teams-by-activity "WITH teams AS ( SELECT t.id, t.features, + row_number() OVER (ORDER BY t.created_at) AS rown, (SELECT coalesce(max(date_trunc('month', f.modified_at)), date_trunc('month', t.modified_at)) FROM file AS f JOIN project AS p ON (f.project_id = p.id) @@ -107,24 +110,16 @@ ) SELECT * FROM teams %(pred)s") -(def ^:private sql:get-teams-by-report - "WITH teams AS ( - SELECT t.id t.features, mr.name - FROM migration_team_report AS mr - JOIN team AS t ON (t.id = mr.team_id) - WHERE t.deleted_at IS NULL - AND mr.error IS NOT NULL - ORDER BY mr.created_at - ) SELECT id, features FROM teams %(pred)s") - (def ^:private sql:get-files-by-created-at - "SELECT id, features + "SELECT id, features, + row_number() OVER (ORDER BY created_at) AS rown FROM file WHERE deleted_at IS NULL ORDER BY created_at DESC") (def ^:private sql:get-files-by-modified-at "SELECT id, features + row_number() OVER (ORDER BY modified_at) AS rown FROM file WHERE deleted_at IS NULL ORDER BY modified_at DESC") @@ -132,6 +127,7 @@ (def ^:private sql:get-files-by-graphics "WITH files AS ( SELECT f.id, f.features, + row_number() OVER (ORDER BY modified_at) AS rown, (SELECT count(*) FROM file_media_object AS fmo WHERE fmo.mtype = 'image/svg+xml' AND fmo.is_local = false @@ -141,16 +137,6 @@ ORDER BY 3 ASC ) SELECT * FROM files %(pred)s") -(def ^:private sql:get-files-by-report - "WITH files AS ( - SELECT f.id, f.features, mr.label - FROM migration_file_report AS mr - JOIN file AS f ON (f.id = mr.file_id) - WHERE f.deleted_at IS NULL - AND mr.error IS NOT NULL - ORDER BY mr.created_at - ) SELECT id, features FROM files %(pred)s") - (defn- read-pred [entries] (let [entries (if (and (vector? entries) @@ -181,8 +167,7 @@ sql (case query :created-at sql:get-teams-by-created-at :activity sql:get-teams-by-activity - :graphics sql:get-teams-by-graphics - :report sql:get-teams-by-report) + :graphics sql:get-teams-by-graphics) sql (if pred (let [[pred-sql & pred-params] (read-pred pred)] (apply vector @@ -193,8 +178,7 @@ (->> (db/cursor conn sql {:chunk-size 500}) (map feat/decode-row) (remove (fn [{:keys [features]}] - (contains? features "components/v2"))) - (map :id)))) + (contains? features "components/v2")))))) (defn- get-files [conn query pred] @@ -202,8 +186,7 @@ sql (case query :created-at sql:get-files-by-created-at :modified-at sql:get-files-by-modified-at - :graphics sql:get-files-by-graphics - :report sql:get-files-by-report) + :graphics sql:get-files-by-graphics) sql (if pred (let [[pred-sql & pred-params] (read-pred pred)] (apply vector @@ -214,60 +197,7 @@ (->> (db/cursor conn sql {:chunk-size 500}) (map feat/decode-row) (remove (fn [{:keys [features]}] - (contains? features "components/v2"))) - (map :id)))) - -(def ^:private sql:team-report-table - "CREATE UNLOGGED TABLE IF NOT EXISTS migration_team_report ( - id bigserial NOT NULL, - label text NOT NULL, - team_id UUID NOT NULL, - error text NULL, - created_at timestamptz NOT NULL DEFAULT now(), - elapsed bigint NOT NULL, - PRIMARY KEY (label, created_at, id))") - -(def ^:private sql:file-report-table - "CREATE UNLOGGED TABLE IF NOT EXISTS migration_file_report ( - id bigserial NOT NULL, - label text NOT NULL, - file_id UUID NOT NULL, - error text NULL, - created_at timestamptz NOT NULL DEFAULT now(), - elapsed bigint NOT NULL, - PRIMARY KEY (label, created_at, id))") - -(defn- create-report-tables! - [system] - (db/exec-one! system [sql:team-report-table]) - (db/exec-one! system [sql:file-report-table])) - -(defn- clean-team-reports! - [system label] - (db/delete! system :migration-team-report {:label label})) - -(defn- team-report! - [system team-id label elapsed error] - (db/insert! system :migration-team-report - {:label label - :team-id team-id - :elapsed (inst-ms elapsed) - :error error} - {::db/return-keys false})) - -(defn- clean-file-reports! - [system label] - (db/delete! system :migration-file-report {:label label})) - -(defn- file-report! - [system file-id label elapsed error] - (db/insert! system :migration-file-report - {:label label - :file-id file-id - :elapsed (inst-ms elapsed) - :error error} - {::db/return-keys false})) - + (contains? features "components/v2")))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; PUBLIC API @@ -347,7 +277,7 @@ "A REPL helper for migrate all teams. This function starts multiple concurrent team migration processes - until thw maximum number of jobs is reached which by default has the + until the maximum number of jobs is reached which by default has the value of `1`. This is controled with the `:max-jobs` option. If you want to run this on multiple machines you will need to specify @@ -393,15 +323,12 @@ (try (db/tx-run! (assoc main/system ::db/rollback rollback?) (fn [system] - (db/exec-one! system ["SET idle_in_transaction_session_timeout = 0"]) + (db/exec-one! system ["SET LOCAL idle_in_transaction_session_timeout = 0"]) (feat/migrate-team! system team-id :label label :validate? validate? :skip-on-graphic-error? skip-on-graphic-error?))) - (when (string? label) - (team-report! main/system team-id label (tpoint) nil)) - (catch Throwable cause (l/wrn :hint "unexpected error on processing team (skiping)" :team-id (str team-id)) @@ -411,10 +338,7 @@ {:team-id team-id} cause)) - (swap! stats update :errors (fnil inc 0)) - - (when (string? label) - (team-report! main/system team-id label (tpoint) (ex-message cause)))) + (swap! stats update :errors (fnil inc 0))) (finally (ps/release! sjobs))))) @@ -445,23 +369,18 @@ feat/*cache* cache svgo/*semaphore* sprocs] (try - (when (string? label) - (create-report-tables! main/system) - (clean-team-reports! main/system label)) - (db/tx-run! main/system (fn [{:keys [::db/conn] :as system}] - (db/exec! conn ["SET statement_timeout = 0"]) - (db/exec! conn ["SET idle_in_transaction_session_timeout = 0"]) + (db/exec! conn ["SET LOCAL statement_timeout = 0"]) + (db/exec! conn ["SET LOCAL idle_in_transaction_session_timeout = 0"]) (run! process-team (->> (get-teams conn query pred) - (filter (fn [team-id] + (filter (fn [{:keys [rown]}] (if (int? partitions) - (= current-partition (-> (uuid/hash-int team-id) - (mod partitions) - (inc))) + (= current-partition (inc (mod rown partitions))) true))) + (map :id) (take max-items))) ;; Close and await tasks @@ -480,7 +399,6 @@ :rollback rollback? :elapsed elapsed))))))) - (defn migrate-files! "A REPL helper for migrate all files. @@ -532,15 +450,12 @@ (try (db/tx-run! (assoc main/system ::db/rollback rollback?) (fn [system] - (db/exec-one! system ["SET idle_in_transaction_session_timeout = 0"]) + (db/exec-one! system ["SET LOCAL idle_in_transaction_session_timeout = 0"]) (feat/migrate-file! system file-id :label label :validate? validate? :skip-on-graphic-error? skip-on-graphic-error?))) - (when (string? label) - (file-report! main/system file-id label (tpoint) nil)) - (catch Throwable cause (l/wrn :hint "unexpected error on processing file (skiping)" :file-id (str file-id)) @@ -550,10 +465,7 @@ {:file-id file-id} cause)) - (swap! stats update :errors (fnil inc 0)) - - (when (string? label) - (file-report! main/system file-id label (tpoint) (ex-message cause)))) + (swap! stats update :errors (fnil inc 0))) (finally (ps/release! sjobs))))) @@ -584,23 +496,18 @@ feat/*cache* cache svgo/*semaphore* sprocs] (try - (when (string? label) - (create-report-tables! main/system) - (clean-file-reports! main/system label)) - (db/tx-run! main/system (fn [{:keys [::db/conn] :as system}] - (db/exec! conn ["SET statement_timeout = 0"]) - (db/exec! conn ["SET idle_in_transaction_session_timeout = 0"]) + (db/exec! conn ["SET LOCAL statement_timeout = 0"]) + (db/exec! conn ["SET LOCAL idle_in_transaction_session_timeout = 0"]) (run! process-file (->> (get-files conn query pred) - (filter (fn [file-id] + (filter (fn [{:keys [rown] :as row}] (if (int? partitions) - (= current-partition (-> (uuid/hash-int file-id) - (mod partitions) - (inc))) + (= current-partition (inc (mod rown partitions))) true))) + (map :id) (take max-items))) ;; Close and await tasks @@ -619,7 +526,6 @@ :rollback rollback? :elapsed elapsed))))))) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; FILE PROCESS HELPERS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -- Gitee From 542b27a7795043182d8c02a6c8544716c9660b1e Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 4 Apr 2024 10:39:02 +0200 Subject: [PATCH 0215/1266] :paperclip: Add minor changes to compv2 related scripts --- backend/deps.edn | 4 ++-- backend/resources/log4j2-experiments.xml | 4 ++-- backend/scripts/repl-test | 15 +++++++-------- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/backend/deps.edn b/backend/deps.edn index afd1e6840..90d78fa21 100644 --- a/backend/deps.edn +++ b/backend/deps.edn @@ -91,8 +91,8 @@ :jmx-remote {:jvm-opts ["-Dcom.sun.management.jmxremote" - "-Dcom.sun.management.jmxremote.port=9090" - "-Dcom.sun.management.jmxremote.rmi.port=9090" + "-Dcom.sun.management.jmxremote.port=9091" + "-Dcom.sun.management.jmxremote.rmi.port=9091" "-Dcom.sun.management.jmxremote.local.only=false" "-Dcom.sun.management.jmxremote.authenticate=false" "-Dcom.sun.management.jmxremote.ssl=false" diff --git a/backend/resources/log4j2-experiments.xml b/backend/resources/log4j2-experiments.xml index 3357aae31..a874af5d8 100644 --- a/backend/resources/log4j2-experiments.xml +++ b/backend/resources/log4j2-experiments.xml @@ -6,7 +6,7 @@ alwaysWriteExceptions="true" /> - + @@ -15,7 +15,7 @@ - + diff --git a/backend/scripts/repl-test b/backend/scripts/repl-test index a1333a531..2ba1acdbf 100755 --- a/backend/scripts/repl-test +++ b/backend/scripts/repl-test @@ -1,6 +1,6 @@ #!/usr/bin/env bash -source /home/penpot/backend/environ +source /home/penpot/environ export PENPOT_FLAGS="$PENPOT_FLAGS disable-backend-worker" export OPTIONS=" @@ -12,13 +12,13 @@ export OPTIONS=" -J-XX:+UnlockDiagnosticVMOptions \ -J-XX:+DebugNonSafepoints \ -J-Djdk.tracePinnedThreads=full \ + -J-XX:+UseTransparentHugePages \ + -J-XX:ReservedCodeCacheSize=1g \ -J-Dpolyglot.engine.WarnInterpreterOnly=false \ -J--enable-preview"; # Setup HEAP -#export OPTIONS="$OPTIONS -J-Xms900m -J-Xmx900m -J-XX:+AlwaysPreTouch" -export OPTIONS="$OPTIONS -J-Xms1g -J-Xmx25g" -#export OPTIONS="$OPTIONS -J-Xms900m -J-Xmx900m -J-XX:+AlwaysPreTouch" +export OPTIONS="$OPTIONS -J-Xms320g -J-Xmx320g -J-XX:+AlwaysPreTouch" export PENPOT_HTTP_SERVER_IO_THREADS=2 export PENPOT_HTTP_SERVER_WORKER_THREADS=2 @@ -33,11 +33,10 @@ export PENPOT_HTTP_SERVER_WORKER_THREADS=2 # export OPTIONS="$OPTIONS -J-Xint" # Setup GC -export OPTIONS="$OPTIONS -J-XX:+UseG1GC -J-Xlog:gc:logs/gc.log" - +export OPTIONS="$OPTIONS -J-XX:+UseG1GC -J-Xlog:gc:logs/gc.log" # Setup GC -#export OPTIONS="$OPTIONS -J-XX:+UseZGC -J-XX:+ZGenerational -J-Xlog:gc:gc.log" +#export OPTIONS="$OPTIONS -J-XX:+UseZGC -J-XX:+ZGenerational -J-Xlog:gc:logs/gc.log" # Enable ImageMagick v7.x support # export OPTIONS="-J-Dim4java.useV7=true $OPTIONS"; @@ -46,4 +45,4 @@ export OPTIONS_EVAL="nil" # export OPTIONS_EVAL="(set! *warn-on-reflection* true)" set -ex -exec clojure $OPTIONS -M -e "$OPTIONS_EVAL" -m rebel-readline.main \ No newline at end of file +exec clojure $OPTIONS -M -e "$OPTIONS_EVAL" -m rebel-readline.main -- Gitee From da5f452db53cbd1547b46004195e56bc9a4bf0f7 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Sun, 7 Apr 2024 14:01:34 +0200 Subject: [PATCH 0216/1266] :bug: Fix issue on migration script related to version --- backend/src/app/features/components_v2.clj | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/app/features/components_v2.clj b/backend/src/app/features/components_v2.clj index db4ca2536..00e8b5f4f 100644 --- a/backend/src/app/features/components_v2.clj +++ b/backend/src/app/features/components_v2.clj @@ -1664,6 +1664,7 @@ (db/update! conn :file {:data (blob/encode (:data file)) :features (db/create-array conn "text" (:features file)) + :version (:version file) :revn (:revn file)} {:id (:id file)}))) -- Gitee From e01f8d6fdf89cf70033535048bbd36ffece5c793 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Sun, 7 Apr 2024 14:06:42 +0200 Subject: [PATCH 0217/1266] :paperclip: Update migration scripts --- backend/src/app/features/components_v2.clj | 111 ++++++----- backend/src/app/srepl/components_v2.clj | 218 ++++++++++++++------- 2 files changed, 204 insertions(+), 125 deletions(-) diff --git a/backend/src/app/features/components_v2.clj b/backend/src/app/features/components_v2.clj index 00e8b5f4f..36f0a5ad5 100644 --- a/backend/src/app/features/components_v2.clj +++ b/backend/src/app/features/components_v2.clj @@ -16,6 +16,7 @@ [app.common.files.migrations :as fmg] [app.common.files.shapes-helpers :as cfsh] [app.common.files.validate :as cfv] + [app.common.fressian :as fres] [app.common.geom.matrix :as gmt] [app.common.geom.point :as gpt] [app.common.geom.rect :as grc] @@ -48,18 +49,18 @@ [app.rpc.commands.files-snapshot :as fsnap] [app.rpc.commands.media :as cmd.media] [app.storage :as sto] + [app.storage.impl :as impl] [app.storage.tmp :as tmp] [app.svgo :as svgo] [app.util.blob :as blob] - [app.util.cache :as cache] [app.util.events :as events] [app.util.pointer-map :as pmap] [app.util.time :as dt] [buddy.core.codecs :as bc] [clojure.set :refer [rename-keys]] [cuerdas.core :as str] + [datoteka.fs :as fs] [datoteka.io :as io] - [promesa.exec :as px] [promesa.util :as pu])) (def ^:dynamic *stats* @@ -68,7 +69,7 @@ (def ^:dynamic *cache* "A dynamic var for setting up a cache instance." - nil) + false) (def ^:dynamic *skip-on-graphic-error* "A dynamic var for setting up the default error behavior for graphics processing." @@ -100,6 +101,8 @@ (some? data) (assoc :data (blob/decode data)))) +(set! *warn-on-reflection* true) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; FILE PREPARATION BEFORE MIGRATION ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -1296,7 +1299,7 @@ (try (let [item (if (str/starts-with? href "data:") (let [[mtype data] (parse-datauri href) - size (alength data) + size (alength ^bytes data) path (tmp/tempfile :prefix "penpot.media.download.") written (io/write-to-file! data path :size size)] @@ -1365,27 +1368,49 @@ {::sql/columns [:media-id]})] (:media-id fmobject))) -(defn- get-sobject-content +(defn get-sobject-content [id] (let [storage (::sto/storage *system*) sobject (sto/get-object storage id)] + + (when-not sobject + (throw (RuntimeException. "sobject is nil"))) + (when (> (:size sobject) 1135899) + (throw (RuntimeException. "svg too big"))) + (with-open [stream (sto/get-object-data storage sobject)] (slurp stream)))) -(defn- create-shapes-for-svg - [{:keys [id] :as mobj} file-id objects frame-id position] - (let [get-svg (fn [sid] - (let [svg-text (get-sobject-content sid) - svg-text (svgo/optimize *system* svg-text)] - (-> (csvg/parse svg-text) - (assoc :name (:name mobj))))) +(defn get-optimized-svg + [sid] + (let [svg-text (get-sobject-content sid) + svg-text (svgo/optimize *system* svg-text)] + (csvg/parse svg-text))) - sid (resolve-sobject-id id) - svg-data (if (cache/cache? *cache*) - (cache/get *cache* sid (px/wrap-bindings get-svg)) - (get-svg sid)) +(def base-path "/data/cache") - svg-data (collect-and-persist-images svg-data file-id id)] +(defn get-sobject-cache-path + [sid] + (let [path (impl/id->path sid)] + (fs/join base-path path))) + +(defn get-cached-svg + [sid] + (let [path (get-sobject-cache-path sid)] + (if (fs/exists? path) + (with-open [^java.lang.AutoCloseable stream (io/input-stream path)] + (let [reader (fres/reader stream)] + (fres/read! reader))) + (get-optimized-svg sid)))) + +(defn- create-shapes-for-svg + [{:keys [id] :as mobj} file-id objects frame-id position] + (let [sid (resolve-sobject-id id) + svg-data (if *cache* + (get-cached-svg sid) + (get-optimized-svg sid)) + svg-data (collect-and-persist-images svg-data file-id id) + svg-data (assoc svg-data :name (:name mobj))] (sbuilder/create-svg-shapes svg-data position objects frame-id frame-id #{} false))) @@ -1714,7 +1739,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defn migrate-file! - [system file-id & {:keys [validate? skip-on-graphic-error? label]}] + [system file-id & {:keys [validate? skip-on-graphic-error? label rown]}] (let [tpoint (dt/tpoint) err (volatile! false)] @@ -1754,24 +1779,14 @@ components (get @*file-stats* :processed-components 0) graphics (get @*file-stats* :processed-graphics 0)] - (if (cache/cache? *cache*) - (let [cache-stats (cache/stats *cache*)] - (l/dbg :hint "migrate:file:end" - :file-id (str file-id) - :graphics graphics - :components components - :validate validate? - :crt (mth/to-fixed (:hit-rate cache-stats) 2) - :crq (str (:req-count cache-stats)) - :error @err - :elapsed (dt/format-duration elapsed))) - (l/dbg :hint "migrate:file:end" - :file-id (str file-id) - :graphics graphics - :components components - :validate validate? - :error @err - :elapsed (dt/format-duration elapsed))) + (l/dbg :hint "migrate:file:end" + :file-id (str file-id) + :graphics graphics + :components components + :validate validate? + :rown rown + :error @err + :elapsed (dt/format-duration elapsed)) (some-> *stats* (swap! update :processed-files (fnil inc 0))) (some-> *team-stats* (swap! update :processed-files (fnil inc 0))))))))) @@ -1833,21 +1848,9 @@ (when-not @err (some-> *stats* (swap! update :processed-teams (fnil inc 0)))) - (if (cache/cache? *cache*) - (let [cache-stats (cache/stats *cache*)] - (l/dbg :hint "migrate:team:end" - :team-id (dm/str team-id) - :files files - :components components - :graphics graphics - :crt (mth/to-fixed (:hit-rate cache-stats) 2) - :crq (str (:req-count cache-stats)) - :error @err - :elapsed (dt/format-duration elapsed))) - - (l/dbg :hint "migrate:team:end" - :team-id (dm/str team-id) - :files files - :components components - :graphics graphics - :elapsed (dt/format-duration elapsed))))))))) + (l/dbg :hint "migrate:team:end" + :team-id (dm/str team-id) + :files files + :components components + :graphics graphics + :elapsed (dt/format-duration elapsed)))))))) diff --git a/backend/src/app/srepl/components_v2.clj b/backend/src/app/srepl/components_v2.clj index 6b28de25e..00a3c34fb 100644 --- a/backend/src/app/srepl/components_v2.clj +++ b/backend/src/app/srepl/components_v2.clj @@ -7,18 +7,19 @@ (ns app.srepl.components-v2 (:require [app.common.data :as d] + [app.common.fressian :as fres] [app.common.logging :as l] - [app.common.uuid :as uuid] [app.db :as db] [app.features.components-v2 :as feat] [app.main :as main] [app.srepl.helpers :as h] [app.svgo :as svgo] - [app.util.cache :as cache] [app.util.events :as events] [app.util.time :as dt] [app.worker :as-alias wrk] [cuerdas.core :as str] + [datoteka.fs :as fs] + [datoteka.io :as io] [promesa.exec :as px] [promesa.exec.semaphore :as ps] [promesa.util :as pu])) @@ -112,14 +113,14 @@ (def ^:private sql:get-files-by-created-at "SELECT id, features, - row_number() OVER (ORDER BY created_at) AS rown + row_number() OVER (ORDER BY created_at DESC) AS rown FROM file WHERE deleted_at IS NULL ORDER BY created_at DESC") (def ^:private sql:get-files-by-modified-at "SELECT id, features - row_number() OVER (ORDER BY modified_at) AS rown + row_number() OVER (ORDER BY modified_at DESC) AS rown FROM file WHERE deleted_at IS NULL ORDER BY modified_at DESC") @@ -210,11 +211,7 @@ skip-on-graphic-error? true}}] (l/dbg :hint "migrate:start" :rollback rollback?) (let [tpoint (dt/tpoint) - file-id (h/parse-uuid file-id) - cache (if (int? cache) - (cache/create :executor (::wrk/executor main/system) - :max-items cache) - nil)] + file-id (h/parse-uuid file-id)] (binding [feat/*stats* (atom {}) feat/*cache* cache] @@ -245,12 +242,7 @@ (let [team-id (h/parse-uuid team-id) stats (atom {}) - tpoint (dt/tpoint) - - cache (if (int? cache) - (cache/create :executor (::wrk/executor main/system) - :max-items cache) - nil)] + tpoint (dt/tpoint)] (add-watch stats :progress-report (report-progress-files tpoint)) @@ -313,35 +305,30 @@ sjobs (ps/create :permits max-jobs) sprocs (ps/create :permits max-procs) - cache (if (int? cache) - (cache/create :executor (::wrk/executor main/system) - :max-items cache) - nil) migrate-team (fn [team-id] - (let [tpoint (dt/tpoint)] - (try - (db/tx-run! (assoc main/system ::db/rollback rollback?) - (fn [system] - (db/exec-one! system ["SET LOCAL idle_in_transaction_session_timeout = 0"]) - (feat/migrate-team! system team-id - :label label - :validate? validate? - :skip-on-graphic-error? skip-on-graphic-error?))) + (try + (db/tx-run! (assoc main/system ::db/rollback rollback?) + (fn [system] + (db/exec-one! system ["SET LOCAL idle_in_transaction_session_timeout = 0"]) + (feat/migrate-team! system team-id + :label label + :validate? validate? + :skip-on-graphic-error? skip-on-graphic-error?))) - (catch Throwable cause - (l/wrn :hint "unexpected error on processing team (skiping)" - :team-id (str team-id)) + (catch Throwable cause + (l/wrn :hint "unexpected error on processing team (skiping)" + :team-id (str team-id)) - (events/tap :error - (ex-info "unexpected error on processing team (skiping)" - {:team-id team-id} - cause)) + (events/tap :error + (ex-info "unexpected error on processing team (skiping)" + {:team-id team-id} + cause)) - (swap! stats update :errors (fnil inc 0))) + (swap! stats update :errors (fnil inc 0))) - (finally - (ps/release! sjobs))))) + (finally + (ps/release! sjobs)))) process-team (fn [team-id] @@ -439,50 +426,45 @@ sjobs (ps/create :permits max-jobs) sprocs (ps/create :permits max-procs) - cache (if (int? cache) - (cache/create :executor (::wrk/executor main/system) - :max-items cache) - nil) - migrate-file - (fn [file-id] - (let [tpoint (dt/tpoint)] - (try - (db/tx-run! (assoc main/system ::db/rollback rollback?) - (fn [system] - (db/exec-one! system ["SET LOCAL idle_in_transaction_session_timeout = 0"]) - (feat/migrate-file! system file-id - :label label - :validate? validate? - :skip-on-graphic-error? skip-on-graphic-error?))) - - (catch Throwable cause - (l/wrn :hint "unexpected error on processing file (skiping)" - :file-id (str file-id)) - - (events/tap :error - (ex-info "unexpected error on processing file (skiping)" - {:file-id file-id} - cause)) - - (swap! stats update :errors (fnil inc 0))) - - (finally - (ps/release! sjobs))))) + (fn [file-id rown] + (try + (db/tx-run! (assoc main/system ::db/rollback rollback?) + (fn [system] + (db/exec-one! system ["SET LOCAL idle_in_transaction_session_timeout = 0"]) + (feat/migrate-file! system file-id + :rown rown + :label label + :validate? validate? + :skip-on-graphic-error? skip-on-graphic-error?))) + + (catch Throwable cause + (l/wrn :hint "unexpected error on processing file (skiping)" + :file-id (str file-id)) + + (events/tap :error + (ex-info "unexpected error on processing file (skiping)" + {:file-id file-id} + cause)) + + (swap! stats update :errors (fnil inc 0))) + + (finally + (ps/release! sjobs)))) process-file - (fn [file-id] + (fn [{:keys [id rown]}] (ps/acquire! sjobs) (let [ts (tpoint)] (if (and mtime (neg? (compare mtime ts))) (do (l/inf :hint "max time constraint reached" - :file-id (str file-id) + :file-id (str id) :elapsed (dt/format-duration ts)) (ps/release! sjobs) (reduced nil)) - (px/run! executor (partial migrate-file file-id)))))] + (px/run! executor (partial migrate-file id rown)))))] (l/dbg :hint "migrate:start" :label label @@ -507,7 +489,6 @@ (if (int? partitions) (= current-partition (inc (mod rown partitions))) true))) - (map :id) (take max-items))) ;; Close and await tasks @@ -526,6 +507,101 @@ :rollback rollback? :elapsed elapsed))))))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; CACHE POPULATE +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(def sql:sobjects-for-cache + "SELECT id, + row_number() OVER (ORDER BY created_at) AS index + FROM storage_object + WHERE (metadata->>'~:bucket' = 'file-media-object' OR + metadata->>'~:bucket' IS NULL) + AND metadata->>'~:content-type' = 'image/svg+xml' + AND deleted_at IS NULL + AND size < 1135899 + ORDER BY created_at ASC") + +(defn populate-cache! + "A REPL helper for migrate all files. + + This function starts multiple concurrent file migration processes + until thw maximum number of jobs is reached which by default has the + value of `1`. This is controled with the `:max-jobs` option. + + If you want to run this on multiple machines you will need to specify + the total number of partitions and the current partition. + + In order to get the report table populated, you will need to provide + a correct `:label`. That label is also used for persist a file + snaphot before continue with the migration." + [& {:keys [max-jobs] :or {max-jobs 1}}] + + (let [tpoint (dt/tpoint) + + factory (px/thread-factory :virtual false :prefix "penpot/cache/") + executor (px/cached-executor :factory factory) + + sjobs (ps/create :permits max-jobs) + + retrieve-sobject + (fn [id index] + (let [path (feat/get-sobject-cache-path id) + parent (fs/parent path)] + + (try + (when-not (fs/exists? parent) + (fs/create-dir parent)) + + (if (fs/exists? path) + (l/inf :hint "create cache entry" :status "exists" :index index :id (str id) :path (str path)) + (let [svg-data (feat/get-optimized-svg id)] + (with-open [^java.lang.AutoCloseable stream (io/output-stream path)] + (let [writer (fres/writer stream)] + (fres/write! writer svg-data))) + + (l/inf :hint "create cache entry" :status "created" + :index index + :id (str id) + :path (str path)))) + + (catch Throwable cause + (l/wrn :hint "create cache entry" + :status "error" + :index index + :id (str id) + :path (str path) + :cause cause)) + + (finally + (ps/release! sjobs))))) + + process-sobject + (fn [{:keys [id index]}] + (ps/acquire! sjobs) + (px/run! executor (partial retrieve-sobject id index)))] + + (l/dbg :hint "migrate:start" + :max-jobs max-jobs) + + (try + (binding [feat/*system* main/system] + (run! process-sobject + (db/exec! main/system [sql:sobjects-for-cache])) + + ;; Close and await tasks + (pu/close! executor)) + + {:elapsed (dt/format-duration (tpoint))} + + (catch Throwable cause + (l/dbg :hint "populate:error" :cause cause)) + + (finally + (let [elapsed (dt/format-duration (tpoint))] + (l/dbg :hint "populate:end" + :elapsed elapsed)))))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; FILE PROCESS HELPERS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -- Gitee From 6904cacd0cbc6a22afe0e19e25838e1d60988653 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 8 Apr 2024 09:57:36 +0200 Subject: [PATCH 0218/1266] :bug: Fix timeout error on large binfile import --- backend/src/app/rpc/commands/binfile.clj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/app/rpc/commands/binfile.clj b/backend/src/app/rpc/commands/binfile.clj index 8f2216e63..60148eb7e 100644 --- a/backend/src/app/rpc/commands/binfile.clj +++ b/backend/src/app/rpc/commands/binfile.clj @@ -72,11 +72,11 @@ ;; are not very friendly with virtual threads, and for avoid ;; unexpected blocking of other concurrent operations we ;; dispatch that operation to a dedicated executor. - (let [result (px/submit! executor (partial bf.v1/import-files! cfg input))] + (let [result (px/invoke! executor (partial bf.v1/import-files! cfg input))] (db/update! conn :project {:modified-at (dt/now)} {:id project-id}) - (deref result))))) + result)))) (def ^:private schema:import-binfile -- Gitee From ccce550cdafcbf87059a331364b5fbc38e28d446 Mon Sep 17 00:00:00 2001 From: AzazelN28 Date: Thu, 21 Mar 2024 11:11:10 +0100 Subject: [PATCH 0219/1266] :bug: Fix comments and history toggle --- .../src/app/main/data/workspace/comments.cljs | 3 +-- .../src/app/main/data/workspace/drawing.cljs | 4 ++++ .../src/app/main/ui/workspace/comments.cljs | 3 ++- .../app/main/ui/workspace/right_header.cljs | 24 ++++++++----------- .../src/app/main/ui/workspace/viewport.cljs | 2 +- .../app/main/ui/workspace/viewport/hooks.cljs | 16 ++++++++++++- 6 files changed, 33 insertions(+), 19 deletions(-) diff --git a/frontend/src/app/main/data/workspace/comments.cljs b/frontend/src/app/main/data/workspace/comments.cljs index 246034878..4718b252c 100644 --- a/frontend/src/app/main/data/workspace/comments.cljs +++ b/frontend/src/app/main/data/workspace/comments.cljs @@ -60,8 +60,7 @@ (let [local (:comments-local state)] (cond (:draft local) (rx/of (dcm/close-thread)) - (:open local) (rx/of (dcm/close-thread)) - :else (rx/of #(dissoc % :workspace-drawing))))))) + (:open local) (rx/of (dcm/close-thread))))))) ;; Event responsible of the what should be executed when user clicked ;; on the comments layer. An option can be create a new draft thread, diff --git a/frontend/src/app/main/data/workspace/drawing.cljs b/frontend/src/app/main/data/workspace/drawing.cljs index c4c3a148d..1b1d96bee 100644 --- a/frontend/src/app/main/data/workspace/drawing.cljs +++ b/frontend/src/app/main/data/workspace/drawing.cljs @@ -28,6 +28,10 @@ ptk/UpdateEvent (update [_ state] (-> state + (update :workspace-layout (fn [workspace-layout] + (if (= tool :comments) + (disj workspace-layout :document-history) + workspace-layout))) (update :workspace-drawing assoc :tool tool) ;; When changing drawing tool disable "scale text" mode ;; automatically, to help users that ignore how this diff --git a/frontend/src/app/main/ui/workspace/comments.cljs b/frontend/src/app/main/ui/workspace/comments.cljs index 4ff0e1842..17be9321c 100644 --- a/frontend/src/app/main/ui/workspace/comments.cljs +++ b/frontend/src/app/main/ui/workspace/comments.cljs @@ -92,7 +92,8 @@ (fn [] (if from-viewer (st/emit! (dcm/update-options {:show-sidebar? false})) - (st/emit! :interrupt (dw/deselect-all true))))) + (st/emit! (dw/clear-edition-mode) + (dw/deselect-all true))))) tgroups (->> threads (dcm/group-threads-by-page)) diff --git a/frontend/src/app/main/ui/workspace/right_header.cljs b/frontend/src/app/main/ui/workspace/right_header.cljs index f2e1b53f0..d3b6a6026 100644 --- a/frontend/src/app/main/ui/workspace/right_header.cljs +++ b/frontend/src/app/main/ui/workspace/right_header.cljs @@ -10,6 +10,7 @@ [app.main.data.events :as ev] [app.main.data.shortcuts :as scd] [app.main.data.workspace :as dw] + [app.main.data.workspace.drawing.common :as dwc] [app.main.data.workspace.shortcuts :as sc] [app.main.refs :as refs] [app.main.store :as st] @@ -21,7 +22,6 @@ [app.main.ui.workspace.presence :refer [active-sessions]] [app.util.dom :as dom] [app.util.i18n :as i18n :refer [tr]] - [app.util.timers :as ts] [okulary.core :as l] [rumext.v2 :as mf])) @@ -141,7 +141,7 @@ (mf/defc right-header {::mf/wrap-props false} [{:keys [file layout page-id]}] - (let [file-id (:id file) + (let [file-id (:id file) zoom (mf/deref refs/selected-zoom) read-only? (mf/use-ctx ctx/workspace-read-only?) @@ -169,33 +169,29 @@ active-comments (mf/use-fn + (mf/deps layout) (fn [] (st/emit! :interrupt - (dw/clear-edition-mode)) - ;; Delay so anything that launched :interrupt can finish - (ts/schedule 100 #(st/emit! (dw/select-for-drawing :comments))))) + (dw/clear-edition-mode) + (-> (dw/remove-layout-flag :document-history) + (vary-meta assoc ::ev/origin "workspace-header")) + (dw/select-for-drawing :comments)))) toggle-comments (mf/use-fn (mf/deps selected-drawtool) (fn [_] - (when (contains? layout :document-history) - (st/emit! (-> (dw/remove-layout-flag :document-history) - (vary-meta assoc ::ev/origin "workspace-header")))) - - (if (= :comments selected-drawtool) - (st/emit! :interrupt) + (if (= selected-drawtool :comments) + (st/emit! (dwc/clear-drawing)) (active-comments)))) toggle-history (mf/use-fn (mf/deps selected-drawtool) (fn [] - (when (= :comments selected-drawtool) (st/emit! :interrupt - (-> (dw/toggle-layout-flag :comments) - (vary-meta assoc ::ev/origin "workspace-header")))) + (dw/clear-edition-mode))) (st/emit! (-> (dw/toggle-layout-flag :document-history) (vary-meta assoc ::ev/origin "workspace-header")))))] diff --git a/frontend/src/app/main/ui/workspace/viewport.cljs b/frontend/src/app/main/ui/workspace/viewport.cljs index 8539def89..d20d35e3c 100644 --- a/frontend/src/app/main/ui/workspace/viewport.cljs +++ b/frontend/src/app/main/ui/workspace/viewport.cljs @@ -266,7 +266,7 @@ rule-area-size (/ rulers/ruler-area-size zoom)] - (hooks/setup-dom-events zoom disable-paste in-viewport? workspace-read-only?) + (hooks/setup-dom-events zoom disable-paste in-viewport? workspace-read-only? drawing-tool drawing-path?) (hooks/setup-viewport-size vport viewport-ref) (hooks/setup-cursor cursor alt? mod? space? panning drawing-tool drawing-path? node-editing? z? workspace-read-only?) (hooks/setup-keyboard alt? mod? space? z? shift?) diff --git a/frontend/src/app/main/ui/workspace/viewport/hooks.cljs b/frontend/src/app/main/ui/workspace/viewport/hooks.cljs index c2d4ab55b..d9f1dd1b5 100644 --- a/frontend/src/app/main/ui/workspace/viewport/hooks.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/hooks.cljs @@ -17,6 +17,7 @@ [app.common.uuid :as uuid] [app.main.data.shortcuts :as dsc] [app.main.data.workspace :as dw] + [app.main.data.workspace.edition :as dwe] [app.main.data.workspace.grid-layout.shortcuts :as gsc] [app.main.data.workspace.path.shortcuts :as psc] [app.main.data.workspace.shortcuts :as wsc] @@ -39,13 +40,26 @@ [rumext.v2 :as mf]) (:import goog.events.EventType)) -(defn setup-dom-events [zoom disable-paste in-viewport? workspace-read-only?] +(defn setup-dom-events [zoom disable-paste in-viewport? workspace-read-only? drawing-tool drawing-path?] (let [on-key-down (actions/on-key-down) on-key-up (actions/on-key-up) on-mouse-wheel (actions/on-mouse-wheel zoom) on-paste (actions/on-paste disable-paste in-viewport? workspace-read-only?) + on-pointer-down (mf/use-fn + (mf/deps drawing-tool drawing-path?) + (fn [_] + (when drawing-path? + (st/emit! (dwe/clear-edition-mode))))) on-blur (mf/use-fn #(st/emit! (mse/->BlurEvent)))] + (mf/use-effect + (mf/deps drawing-tool drawing-path?) + (fn [] + (let [keys [(events/listen js/window EventType.POINTERDOWN on-pointer-down)]] + (fn [] + (doseq [key keys] + (events/unlistenByKey key)))))) + (mf/use-layout-effect (mf/deps on-key-down on-key-up on-mouse-wheel on-paste workspace-read-only?) (fn [] -- Gitee From 2cd0bc565d1e6bcd8603dfd23caff358f150e74a Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Mon, 8 Apr 2024 08:58:53 +0200 Subject: [PATCH 0220/1266] :bug: Fix change shadow color from selected colors --- frontend/src/app/main/data/workspace/colors.cljs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/main/data/workspace/colors.cljs b/frontend/src/app/main/data/workspace/colors.cljs index 3a8bf6e13..287b6c344 100644 --- a/frontend/src/app/main/data/workspace/colors.cljs +++ b/frontend/src/app/main/data/workspace/colors.cljs @@ -273,7 +273,8 @@ ;; color attrs (cond-> attrs (:gradient attrs) (get-in [:gradient :stops 0])) - new-attrs (merge (get-in shape [:shadow index :color]) attrs)] + new-attrs (-> (merge (get-in shape [:shadow index :color]) attrs) + (d/without-nils))] (assoc-in shape [:shadow index :color] new-attrs)))))))) (defn add-shadow @@ -602,7 +603,8 @@ (merge data) (materialize-color-components)))) (-> state - (dissoc :gradient :stops :editing-stop))))))) + (dissoc :gradient :stops :editing-stop) + (assoc :type :color))))))) ptk/WatchEvent (watch [_ state _] (when add-recent? -- Gitee From fd5b1c034157b9a28e0a88e3e2d4873bb5d0d076 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 8 Apr 2024 11:04:56 +0200 Subject: [PATCH 0221/1266] :sparkles: Enable by default components v2 feature --- backend/scripts/repl | 1 - backend/scripts/start-dev | 1 - common/src/app/common/features.cljc | 3 ++- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/backend/scripts/repl b/backend/scripts/repl index 6336331e4..ddc2fba5f 100755 --- a/backend/scripts/repl +++ b/backend/scripts/repl @@ -26,7 +26,6 @@ export PENPOT_FLAGS="\ enable-soft-rpc-rlimit \ enable-webhooks \ enable-access-tokens \ - disable-feature-components-v2 \ enable-file-validation \ enable-file-schema-validation"; diff --git a/backend/scripts/start-dev b/backend/scripts/start-dev index 1a2fa2842..2497e801e 100755 --- a/backend/scripts/start-dev +++ b/backend/scripts/start-dev @@ -18,7 +18,6 @@ export PENPOT_FLAGS="\ enable-rpc-climit \ enable-smtp \ enable-access-tokens \ - disable-feature-components-v2 \ enable-file-validation \ enable-file-schema-validation"; diff --git a/common/src/app/common/features.cljc b/common/src/app/common/features.cljc index 90b27587f..fffa5b6a6 100644 --- a/common/src/app/common/features.cljc +++ b/common/src/app/common/features.cljc @@ -58,7 +58,8 @@ (def default-enabled-features #{"fdata/shape-data-type" "styles/v2" - "layout/grid"}) + "layout/grid" + "components/v2"}) ;; A set of features which only affects on frontend and can be enabled ;; and disabled freely by the user any time. This features does not -- Gitee From 06206f39b01cfc9c15a572b37c598a6c953c22cb Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 8 Apr 2024 11:07:32 +0200 Subject: [PATCH 0222/1266] :paperclip: Update devenv nginx configuration --- docker/devenv/files/nginx.conf | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/docker/devenv/files/nginx.conf b/docker/devenv/files/nginx.conf index 24a0f2ddf..5c1ae44db 100644 --- a/docker/devenv/files/nginx.conf +++ b/docker/devenv/files/nginx.conf @@ -14,11 +14,20 @@ http { tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; - # server_tokens off; + server_tokens off; # server_names_hash_bucket_size 64; # server_name_in_redirect off; + reset_timedout_connection on; + client_body_timeout 20s; + client_header_timeout 20s; + + proxy_connect_timeout 300s; + proxy_send_timeout 300s; + proxy_read_timeout 300s; + send_timeout 300s; + include /etc/nginx/mime.types; default_type application/octet-stream; @@ -33,7 +42,7 @@ http { gzip_buffers 16 8k; gzip_http_version 1.1; - gzip_types text/plain text/css text/javascript application/javascript application/json application/transit+json; + gzip_types text/plain text/css text/javascript application/javascript application/json application/transit+json image/svg+xml; map $http_upgrade $connection_upgrade { default upgrade; -- Gitee From d435b17452d64275a1bf7ce4616e302cf5e22ae3 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 8 Apr 2024 11:18:26 +0200 Subject: [PATCH 0223/1266] :bug: Fix io exception incorrect reporting --- backend/src/app/http/errors.clj | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/backend/src/app/http/errors.clj b/backend/src/app/http/errors.clj index 18350d21d..47a9a4dde 100644 --- a/backend/src/app/http/errors.clj +++ b/backend/src/app/http/errors.clj @@ -218,6 +218,14 @@ :hint (ex-message error) :data edata}})))) +(defmethod handle-exception java.io.IOException + [cause _ _] + (l/wrn :hint "io exception" :cause cause) + {::rres/status 500 + ::rres/body {:type :server-error + :code :io-exception + :hint (ex-message cause)}}) + (defmethod handle-exception java.util.concurrent.CompletionException [cause request _] (let [cause' (ex-cause cause)] -- Gitee From 0965c71a08cdb9543c89a4502aab4366aad340a8 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 8 Apr 2024 11:42:01 +0200 Subject: [PATCH 0224/1266] :paperclip: Update logging on webhook task handler --- backend/src/app/loggers/webhooks.clj | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/backend/src/app/loggers/webhooks.clj b/backend/src/app/loggers/webhooks.clj index 00ebd3f38..d93ce0185 100644 --- a/backend/src/app/loggers/webhooks.clj +++ b/backend/src/app/loggers/webhooks.clj @@ -67,12 +67,10 @@ [_ {:keys [::db/pool] :as cfg}] (fn [{:keys [props] :as task}] (let [event (::event props)] - - (l/debug :hint "process webhook event" - :name (:name event)) + (l/dbg :hint "process webhook event" :name (:name event)) (when-let [items (lookup-webhooks cfg event)] - (l/trace :hint "webhooks found for event" :total (count items)) + (l/trc :hint "webhooks found for event" :total (count items)) (db/with-atomic [conn pool] (doseq [item items] -- Gitee From 93debeb272b7b2034797109b748e694bcafe40bd Mon Sep 17 00:00:00 2001 From: Kelp <5446186+NatachaMenjibar@users.noreply.github.com> Date: Mon, 8 Apr 2024 11:49:56 +0200 Subject: [PATCH 0225/1266] Update README.md 2.0 --- README.md | 90 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 53 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index 26bae9ea3..4c33be810 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,8 @@ [uri_license]: https://www.mozilla.org/en-US/MPL/2.0 [uri_license_image]: https://img.shields.io/badge/MPL-2.0-blue.svg -

-
- PENPOT -

+![github-light-mode](https://github.com/penpot/penpot/assets/5446186/e5e725fb-a925-43aa-904e-68658c2ef1b5) +

License: MPL-2.0 Gitter @@ -23,12 +21,20 @@ MastodonYoutube

+
+ +[Penpot video](https://github.com/penpot/penpot/assets/5446186/b8ad0764-585e-4ddc-b098-9b4090d337cc) + +
+Penpot is the first **Open Source** design tool for design and code collaboration. Designers can create stunning designs, interactive prototypes, design systems at scale, while developers enjoy ready-to-use code and make their workflow easy and fast. And all of this with no handoff drama. -![feature-readme](https://user-images.githubusercontent.com/1045247/189871786-0b44f7cf-3a0a-4445-a87b-9919ec398bf7.gif) +Penpot is available on browser and [self host](https://penpot.app/self-host). It’s web-based and works with open standards (SVG, CSS and HTML). And last but not least, it’s free! -🎇 **Penpot Fest exceeded all expectations - it was a complete success!** 🎇 Penpot Fest is our first Design event that brought designers and developers from the Open Source communities and beyond. Watch the replay of the talks on our [Youtube channel](https://www.youtube.com/playlist?list=PLgcCPfOv5v56-fghJo2dHNBqL9zlDTslh) or [Peertube channel](https://peertube.kaleidos.net/w/p/1tWgyJTt8sKbWwCEcBimZW) +Penpot’s latest [huge release 2.0](https://penpot.app/dev-diaries), takes the platform to a whole new level. This update introduces the ground-breaking [CSS Grid Layout feature](https://penpot.app/layout), a complete UI redesign, a new Components system, and much more. Plus, it's faster and more accessible. -Penpot is the first **Open Source** design and prototyping platform meant for cross-domain teams. Non dependent on operating systems, Penpot is web based and works with open standards (SVG). Penpot invites designers all over the world to fall in love with open source while getting developers excited about the design process in return. + +🎇 **Penpot Fest is back!** Our first design, code & Open Source event is happening in Barcelona | June 5-7th. [Get your tickets](https://www.eventbrite.es/e/penpot-fest-2024-tickets-859331883797) to join other designers and developers from open-source communities and beyond. +Check out the highlights from [Penpot Fest 2023 edition](https://www.youtube.com/watch?v=sOpLZaK5mDc)! ## Table of contents ## @@ -40,48 +46,47 @@ Penpot is the first **Open Source** design and prototyping platform meant for cr ## Why Penpot ## -Penpot makes design and prototyping accessible to every team in the world. +Penpot expresses designs as code. Designers can do their best work and see it will be beautifully implemented by developers in a two-way collaboration. + +### Designed for developers ### +Penpot was built to serve both designers and developers and create a fluid design-code process. You have the choice to enjoy real-time collaboration or play "solo". -### For cross-domain teams ### -We have a clear focus on design and code teams and our capabilities reflect exactly that. The less hand-off mindset, the more fun for everyone. +### Inspect mode ### +Work with ready-to-use code and make your workflow easy and fast. The inspect tab gives instant access to SVG, CSS and HTML code. -### Multiplatform ### -Being web based, Penpot is not dependent on operating systems or local installations, you will only need to run a modern browser. +### Self host your own instance ### +Provide your team or organization with a completely owned collaborative design tool. Use Penpot's cloud service or deploy your own Penpot server. -### Open Standards ### -Using SVG as no other design and prototyping tool does, Penpot files sport compatibility with most of the vectorial tools, are tech friendly and extremely easy to use on the web. We make sure you will always own your work. +### Integrations ### +Penpot offers integration into the development toolchain, thanks to its support for webhooks and an API accessible through access tokens. + +### What’s great for design ### +With Penpot you can design libraries to share and reuse; turn design elements into components and tokens to allow reusability and scalability; and build realistic user flows and interactions. + +

- Open Source + Open Source

+
## Getting started ## ### Install with Elestio ### -[Elestio](https://elest.io/) offers a fully managed service for on-premise instances of a selection of open-source software! This means you can deploy a dedicated instance of Penpot in just 3 minutes with no technical knowledge needed. - -You don’t need to worry about DNS configuration, SMTP, backups, SSL certificates, OS & Penpot upgrades, and much more. - -[Get started with Elestio.](https://help.penpot.app/technical-guide/getting-started/#install-with-elestio) +Penpot is the only design & prototype platform that is deployment agnostic. You can use it or deploy it anywhere. -### Install with Docker ### - -You can also get started with Penpot locally or self-host it with **docker** and **docker-compose**. - -Here’s a step-by-step guide on [getting started with Docker.](https://help.penpot.app/technical-guide/getting-started/#install-with-docker) - -### Penpot cloud app ### - -If you prefer not to install Penpot in a local environment, [login or register on our Penpot cloud app](https://design.penpot.app). Create a team to work together on projects and share design assets or jump right away into Penpot and **start designing** on your own. +Learn how to install it with Elestio and Docker, or other options on [our website](https://penpot.dev/self-host). +

- Getting started + Open Source

+
## Community ## -We love the open source software community. Contributing is our passion and if it’s yours too, [participate](https://community.penpot.app/) and [improve](https://community.penpot.app/c/help-us-improve-penpot/7) Penpot. All your ideas and code are welcome! +We love the Open Source software community. Contributing is our passion and if it’s yours too, participate and [improve](https://community.penpot.app/c/help-us-improve-penpot/7) Penpot. All your designs, code and ideas are welcome! If you need help or have any questions; if you’d like to share your experience using Penpot or get inspired; if you’d rather meet our community of developers and designers, [join our Community](https://community.penpot.app/)! @@ -93,30 +98,41 @@ You will find the following categories: - [Events and Announcements](https://community.penpot.app/c/announcements/5) - [Inside Penpot](https://community.penpot.app/c/inside-penpot/21) - [Penpot in your language](https://community.penpot.app/c/penpot-in-your-language/12) +- [Design and Code Essentials](https://community.penpot.app/c/design-and-code-essentials/22) + + +

- Communnity + Communnity

+
## Contributing ## -Every sort of contribution will be very helpful to enhance Penpot. How you’ll participate? All your ideas, designs and code are welcome: +Any contribution will make a difference to improve Penpot. How can you get involved? + +Choose your way: +- Create and [share Libraries & Templates](https://penpot.app/libraries-templates.html) that will be helpful for the community - Invite your [team to join](https://design.penpot.app/#/auth/register) -- Star this repo and follow us on Social Media: [Twitter](https://twitter.com/penpotapp), [Instagram](https://instagram.com/penpot.app), [Youtube](https://www.youtube.com/c/Penpot) or [Mastodon](https://fosstodon.org/@penpot/). -- Participate in the [Community](https://community.penpot.app/) asking and answering questions, reacting to others’ articles or opening your own conversations. +- Star this repo and follow us on Social Media: [Mastodon](https://fosstodon.org/@penpot/), [Youtube](https://www.youtube.com/c/Penpot), [Instagram](https://instagram.com/penpot.app), [Linkedin](https://www.linkedin.com/company/penpotdesign), [Peertube](https://peertube.kaleidos.net/a/penpot_app) and [X](https://twitter.com/penpotapp). +- Participate in the [Community](https://community.penpot.app/) space by asking and answering questions; reacting to others’ articles; opening your own conversations and following along on decisions affecting the project. - Report bugs with our easy [guide for bugs hunting](https://help.penpot.app/contributing-guide/reporting-bugs/) or [GitHub issues](https://github.com/penpot/penpot/issues) -- Create and [share Libraries & templates](https://penpot.app/libraries-templates.html) that will be helpful for the community - Become a [translator](https://help.penpot.app/contributing-guide/translations) - Give feedback: [Mail us](mailto:support@penpot.app) - **Contribute to Penpot's code:** [Watch this video](https://www.youtube.com/watch?v=TpN0osiY-8k) by Alejandro Alonso, CIO and developer at Penpot, where he gives us a hands-on demo of how to use Penpot’s repository and make changes in both front and back end To find (almost) everything you need to know on how to contribute to Penpot, refer to the [contributing-guide](https://help.penpot.app/contributing-guide/). +
+

- Contributing + Libraries and templates

+
+ ## Resources ## You can ask and answer questions, have open-ended conversations, and follow along on decisions affecting the project. -- Gitee From 984dacba2b892683ae9691797b95740cda39c7a9 Mon Sep 17 00:00:00 2001 From: Kelp <5446186+NatachaMenjibar@users.noreply.github.com> Date: Mon, 8 Apr 2024 11:50:55 +0200 Subject: [PATCH 0226/1266] Update README.md small fix --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 4c33be810..abe693bef 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ [Penpot video](https://github.com/penpot/penpot/assets/5446186/b8ad0764-585e-4ddc-b098-9b4090d337cc)
+ Penpot is the first **Open Source** design tool for design and code collaboration. Designers can create stunning designs, interactive prototypes, design systems at scale, while developers enjoy ready-to-use code and make their workflow easy and fast. And all of this with no handoff drama. Penpot is available on browser and [self host](https://penpot.app/self-host). It’s web-based and works with open standards (SVG, CSS and HTML). And last but not least, it’s free! -- Gitee From 37507c3697d96ee4e5ba3eb8c38153401fffe985 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 8 Apr 2024 11:53:33 +0200 Subject: [PATCH 0227/1266] :paperclip: Update logging on worker module --- backend/src/app/worker/dispatcher.clj | 2 +- backend/src/app/worker/runner.clj | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/src/app/worker/dispatcher.clj b/backend/src/app/worker/dispatcher.clj index dbdb06042..9b901747f 100644 --- a/backend/src/app/worker/dispatcher.clj +++ b/backend/src/app/worker/dispatcher.clj @@ -56,7 +56,7 @@ (db/create-array conn "uuid" ids)]] (db/exec-one! conn sql) - (l/trc :hist "queue tasks" + (l/trc :hist "enqueue tasks on redis" :queue queue :tasks (count ids) :queued res))) diff --git a/backend/src/app/worker/runner.clj b/backend/src/app/worker/runner.clj index 40332ab23..11ca3d972 100644 --- a/backend/src/app/worker/runner.clj +++ b/backend/src/app/worker/runner.clj @@ -140,20 +140,20 @@ :else (try (l/trc :hint "start task" - :queue queue - :runner-id id :name (:name task) :task-id (str task-id) + :queue queue + :runner-id id :retry (:retry-num task)) (let [tpoint (dt/tpoint) result (handle-task task) elapsed (dt/format-duration (tpoint))] (l/trc :hint "end task" - :queue queue - :runner-id id :name (:name task) :task-id (str task-id) + :queue queue + :runner-id id :retry (:retry-num task) :elapsed elapsed) -- Gitee From 5f8d66e7eb4aac2974bbcc7630b4452dde110c36 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 8 Apr 2024 12:49:02 +0200 Subject: [PATCH 0228/1266] :sparkles: Remove unnecesarry transaction wrapping on import-binfile --- backend/src/app/binfile/v1.clj | 2 +- backend/src/app/rpc/commands/binfile.clj | 22 ++++++++++------------ 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/backend/src/app/binfile/v1.clj b/backend/src/app/binfile/v1.clj index d2b7cdf7f..5bad01f6d 100644 --- a/backend/src/app/binfile/v1.clj +++ b/backend/src/app/binfile/v1.clj @@ -468,7 +468,7 @@ (defn- read-import-v1 [{:keys [::db/conn ::project-id ::profile-id ::input] :as cfg}] - (db/exec-one! conn ["SET idle_in_transaction_session_timeout = 0"]) + (db/exec-one! conn ["SET LOCAL idle_in_transaction_session_timeout = 0"]) (db/exec-one! conn ["SET CONSTRAINTS ALL DEFERRED"]) (pu/with-open [input (zstd-input-stream input) diff --git a/backend/src/app/rpc/commands/binfile.clj b/backend/src/app/rpc/commands/binfile.clj index 60148eb7e..d6759eb42 100644 --- a/backend/src/app/rpc/commands/binfile.clj +++ b/backend/src/app/rpc/commands/binfile.clj @@ -65,18 +65,16 @@ ;; --- Command: import-binfile (defn- import-binfile - [{:keys [::wrk/executor ::bf.v1/project-id] :as cfg} input] - (db/tx-run! cfg - (fn [{:keys [::db/conn] :as cfg}] - ;; NOTE: the importation process performs some operations that - ;; are not very friendly with virtual threads, and for avoid - ;; unexpected blocking of other concurrent operations we - ;; dispatch that operation to a dedicated executor. - (let [result (px/invoke! executor (partial bf.v1/import-files! cfg input))] - (db/update! conn :project - {:modified-at (dt/now)} - {:id project-id}) - result)))) + [{:keys [::wrk/executor ::bf.v1/project-id ::db/pool] :as cfg} input] + ;; NOTE: the importation process performs some operations that + ;; are not very friendly with virtual threads, and for avoid + ;; unexpected blocking of other concurrent operations we + ;; dispatch that operation to a dedicated executor. + (let [result (px/invoke! executor (partial bf.v1/import-files! cfg input))] + (db/update! pool :project + {:modified-at (dt/now)} + {:id project-id}) + result)) (def ^:private schema:import-binfile -- Gitee From 10fbae2f0a56a61017a648a69ad07a7619a44258 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Mon, 8 Apr 2024 13:26:39 +0200 Subject: [PATCH 0229/1266] :bug: Fix error when pasting a main component in other file --- CHANGES.md | 1 + frontend/src/app/main/data/workspace.cljs | 1 - frontend/src/app/main/data/workspace/selection.cljs | 4 +++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index f80e97245..7482ad9c5 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -130,6 +130,7 @@ - Fix problem with hand tool stuck [Github #3318](https://github.com/penpot/penpot/issues/3318) - Fix problem with fix scrolling on nested elements [Github #3508](https://github.com/penpot/penpot/issues/3508) - Fix problem when changing typography assets [Github #3683](https://github.com/penpot/penpot/issues/3683) +- Internal error when you copy and paste some main components between files [Taiga #7397](https://tree.taiga.io/project/penpot/issue/7397) ## 1.19.5 diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index 1dddf3f99..a6487e363 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -2041,7 +2041,6 @@ all-objects (merge page-objects objects) - drop-cell (when (ctl/grid-layout? all-objects parent-id) (gslg/get-drop-cell frame-id all-objects position)) diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index acb0d2175..8ce2cfe1f 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -512,9 +512,11 @@ (ctk/remove-swap-slot)) (dissoc :shapes - :main-instance :use-for-thumbnail) + (cond-> (not is-component-root?) + (dissoc :main-instance)) + (cond-> into-component? (dissoc :component-root)) -- Gitee From aed6a045b306883212dfe88c699eeceb328da765 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 8 Apr 2024 16:32:34 +0200 Subject: [PATCH 0230/1266] :bug: Fix problem with sort indexed shapes --- common/src/app/common/files/helpers.cljc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/common/src/app/common/files/helpers.cljc b/common/src/app/common/files/helpers.cljc index d6a15fcd4..3856bc327 100644 --- a/common/src/app/common/files/helpers.cljc +++ b/common/src/app/common/files/helpers.cljc @@ -540,7 +540,10 @@ filted by selected set" [objects selected] (let [selected (if (set? selected) selected (set selected))] - (sequence (map val) (indexed-shapes objects selected)))) + (sequence + (comp (filter (fn [o] (contains? selected (val o)))) + (map val)) + (indexed-shapes objects selected)))) (defn get-index-replacement "Given a collection of shapes, calculate their positions -- Gitee From 7ebf8dd70215e1f295d6f1d11cd0ac34ba47ee7d Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 8 Apr 2024 17:12:27 +0200 Subject: [PATCH 0231/1266] :sparkles: Skip invalid graphics on migration post binfile import --- backend/src/app/binfile/common.clj | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/src/app/binfile/common.clj b/backend/src/app/binfile/common.clj index ace98c80e..bfbfe6186 100644 --- a/backend/src/app/binfile/common.clj +++ b/backend/src/app/binfile/common.clj @@ -479,7 +479,9 @@ (doseq [[feature file-id] (-> *state* deref :pending-to-migrate)] (case feature "components/v2" - (feat.compv2/migrate-file! cfg file-id :validate? (::validate cfg true)) + (feat.compv2/migrate-file! cfg file-id + :validate? (::validate cfg true) + :skip-on-graphic-error? true) "fdata/shape-data-type" nil -- Gitee From e8b29c3cfc21cb0085f2191e917e8ce201eafb79 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 8 Apr 2024 17:13:20 +0200 Subject: [PATCH 0232/1266] :bug: Fix incorrect grid calcultation condition on compv2 migration script --- backend/src/app/features/components_v2.clj | 35 ++++++++++----------- common/src/app/common/types/shape_tree.cljc | 9 +++--- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/backend/src/app/features/components_v2.clj b/backend/src/app/features/components_v2.clj index 36f0a5ad5..21ed5f52a 100644 --- a/backend/src/app/features/components_v2.clj +++ b/backend/src/app/features/components_v2.clj @@ -1600,29 +1600,28 @@ nil true)) new-shapes (volatile! []) - - add-shape (fn [shape] - (vswap! new-shapes conj shape)) + add-shape #(vswap! new-shapes conj %) fdata' (create-media-grid fdata page-id (:id frame) grid assets add-shape) - ;; When svgs had different width&height and viewport, sometimes the old graphics - ;; importer didn't calculate well the media object size. So, after migration we - ;; recalculate grid size from the actual size of the created shapes. - new-grid (ctst/generate-shape-grid @new-shapes position grid-gap) - - {new-width :width new-height :height} (meta new-grid) - - fdata'' (if-not (and (mth/close? width new-width) (mth/close? height new-height)) - (do - (l/inf :hint "fixing graphics sizes" - :file-id (str (:id fdata)) - :group group-name) - (fix-graphics-size fdata' new-grid page-id (:id frame))) - fdata')] + ;; When svgs had different width&height and viewport, + ;; sometimes the old graphics importer didn't + ;; calculate well the media object size. So, after + ;; migration we recalculate grid size from the actual + ;; size of the created shapes. + fdata' (if-let [grid (ctst/generate-shape-grid @new-shapes position grid-gap)] + (let [{new-width :width new-height :height} (meta grid)] + (if-not (and (mth/close? width new-width) (mth/close? height new-height)) + (do + (l/inf :hint "fixing graphics sizes" + :file-id (str (:id fdata)) + :group group-name) + (fix-graphics-size fdata' grid page-id (:id frame))) + fdata')) + fdata')] (recur (next groups) - fdata'' + fdata' (gpt/add position (gpt/point 0 (+ height (* 2 grid-gap) frame-gap)))))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/common/src/app/common/types/shape_tree.cljc b/common/src/app/common/types/shape_tree.cljc index 646c26641..a76189f71 100644 --- a/common/src/app/common/types/shape_tree.cljc +++ b/common/src/app/common/types/shape_tree.cljc @@ -461,16 +461,15 @@ row-size (+ (reduce d/max ##-Inf (map :height bounds)) gap) column-size (+ (reduce d/max ##-Inf (map :width bounds)) gap) - get-next (fn get-next - [counter] + get-next (fn get-next [counter] (let [row (quot counter grid-size) column (mod counter grid-size) position (->> (gpt/point (* column column-size) (* row row-size)) (gpt/add start-position))] - (lazy-seq - (cons position (get-next (inc counter))))))] - + (cons position + (lazy-seq + (get-next (inc counter))))))] (with-meta (get-next 0) {:width (* grid-size column-size) :height (* grid-size row-size)})))) -- Gitee From a9052e2690fc10e92a5bdfee830199df7640a44b Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 9 Apr 2024 12:01:56 +0200 Subject: [PATCH 0233/1266] :bug: Fix problem changing fill images --- frontend/src/app/main/data/workspace/colors.cljs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/data/workspace/colors.cljs b/frontend/src/app/main/data/workspace/colors.cljs index 287b6c344..5e9028424 100644 --- a/frontend/src/app/main/data/workspace/colors.cljs +++ b/frontend/src/app/main/data/workspace/colors.cljs @@ -602,9 +602,11 @@ (update-in state [:stops stop] (fn [data] (->> changes (merge data) (materialize-color-components)))) + (-> state (dissoc :gradient :stops :editing-stop) - (assoc :type :color))))))) + (cond-> (not= :image (:type state)) + (assoc :type :color)))))))) ptk/WatchEvent (watch [_ state _] (when add-recent? -- Gitee From b7c4cb1f58261569c22cdf20d6c6f20ba0f29dea Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 9 Apr 2024 12:03:06 +0200 Subject: [PATCH 0234/1266] :bug: Fix project name being cut --- frontend/src/app/main/ui/dashboard/projects.scss | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frontend/src/app/main/ui/dashboard/projects.scss b/frontend/src/app/main/ui/dashboard/projects.scss index eb73b2e89..e3b57fba5 100644 --- a/frontend/src/app/main/ui/dashboard/projects.scss +++ b/frontend/src/app/main/ui/dashboard/projects.scss @@ -85,6 +85,9 @@ line-height: 0.8; color: var(--title-foreground-color-hover); cursor: pointer; + height: $s-16; + display: inline-flex; + align-items: center; } .info-wrapper { -- Gitee From 27010ae0fb308d790ba66981049834e0aaadc5ab Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 9 Apr 2024 12:03:59 +0200 Subject: [PATCH 0235/1266] :bug: Fix problem when moving horizontal/vertical lines --- .../main/ui/workspace/viewport/selection.cljs | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/viewport/selection.cljs b/frontend/src/app/main/ui/workspace/viewport/selection.cljs index 8d04c1ac2..5789e2ff1 100644 --- a/frontend/src/app/main/ui/workspace/viewport/selection.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/selection.cljs @@ -36,6 +36,8 @@ (def selection-rect-width 1) (def min-selrect-side 10) (def small-selrect-side 30) +(def min-selrect-width 10) +(def min-selrect-height 10) (mf/defc selection-rect {::mf/wrap-props false} @@ -43,12 +45,27 @@ (let [x (dm/get-prop rect :x) y (dm/get-prop rect :y) width (dm/get-prop rect :width) - height (dm/get-prop rect :height)] + height (dm/get-prop rect :height) + + ;; This is a calculation to create a "minimum" interactable rect + ;; Is necesary so that small shapes in x/y (like lines) can be moved + ;; better + [x width] + (if (< width (/ min-selrect-width zoom)) + (let [width' (/ min-selrect-width zoom)] + [(- x (/ (- width' width) 2)) width']) + [x width]) + + [y height] + (if (< height (/ min-selrect-height zoom)) + (let [height' (/ min-selrect-height zoom)] + [(- y (/ (- height' height) 2)) height']) + [y height])] [:rect.main.viewport-selrect {:x x :y y - :width width - :height height + :width (max width (/ 10 zoom)) + :height (max height (/ 10 zoom)) :transform (str transform) :on-pointer-down on-move-selected :on-context-menu on-context-menu -- Gitee From 8f0e11d0205d6d902d9a324b7013ae4163901df8 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 9 Apr 2024 12:05:02 +0200 Subject: [PATCH 0236/1266] :bug: Fix component name ellipsis --- frontend/src/app/main/ui/components/editable_label.scss | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/frontend/src/app/main/ui/components/editable_label.scss b/frontend/src/app/main/ui/components/editable_label.scss index 1f72eaf7a..a8c399158 100644 --- a/frontend/src/app/main/ui/components/editable_label.scss +++ b/frontend/src/app/main/ui/components/editable_label.scss @@ -20,12 +20,8 @@ color: var(--input-foreground-color-active); } -.editable-label { - display: flex; - - &.is-hidden { - display: none; - } +.editable-label.is-hidden { + display: none; } .editable-label-close { -- Gitee From f6c62075229c2047dfbc7bc7338a92a02199d0fa Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 9 Apr 2024 12:07:17 +0200 Subject: [PATCH 0237/1266] :bug: Fix problem renaming boards from viewport --- frontend/src/app/main/data/workspace.cljs | 6 +++--- .../src/app/main/ui/workspace/sidebar/layer_name.cljs | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index a6487e363..91a080b71 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -682,12 +682,12 @@ (defn end-rename-shape "End the ongoing shape rename process" - ([] (end-rename-shape nil)) - ([name] + ([] (end-rename-shape nil nil)) + ([shape-id name] (ptk/reify ::end-rename-shape ptk/WatchEvent (watch [_ state _] - (when-let [shape-id (dm/get-in state [:workspace-local :shape-for-rename])] + (when-let [shape-id (d/nilv shape-id (dm/get-in state [:workspace-local :shape-for-rename]))] (let [shape (wsh/lookup-shape state shape-id) name (str/trim name) clean-name (cfh/clean-path name) diff --git a/frontend/src/app/main/ui/workspace/sidebar/layer_name.cljs b/frontend/src/app/main/ui/workspace/sidebar/layer_name.cljs index 45d0a9015..43d87b40d 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/layer_name.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/layer_name.cljs @@ -51,21 +51,21 @@ accept-edit (mf/use-fn - (mf/deps on-stop-edit) + (mf/deps shape-id on-stop-edit) (fn [] (let [name-input (mf/ref-val ref) name (str/trim (dom/get-value name-input))] (on-stop-edit) (reset! edition* false) - (st/emit! (dw/end-rename-shape name))))) + (st/emit! (dw/end-rename-shape shape-id name))))) cancel-edit (mf/use-fn - (mf/deps on-stop-edit) + (mf/deps shape-id on-stop-edit) (fn [] (on-stop-edit) (reset! edition* false) - (st/emit! (dw/end-rename-shape nil)))) + (st/emit! (dw/end-rename-shape shape-id nil)))) on-key-down (mf/use-fn -- Gitee From a4c7cc51bbb67a1e8addd8eb6096ef84c922c83f Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Tue, 9 Apr 2024 12:32:18 +0200 Subject: [PATCH 0238/1266] :bug: Fix crash on moving a copy in a copy (for a migrated file) --- common/src/app/common/types/container.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/app/common/types/container.cljc b/common/src/app/common/types/container.cljc index d71390508..ad2424144 100644 --- a/common/src/app/common/types/container.cljc +++ b/common/src/app/common/types/container.cljc @@ -509,7 +509,7 @@ (every? nil?)))] (or ;;We don't want to change the structure of component copies - (ctk/in-component-copy? parent) + (has-any-copy-parent? objects parent) ;; If we are moving something containing a main instance the container can't be part of a component (neither main nor copy) (and selected-main-instance? parent-in-component?) ;; Avoid placing a shape as a direct or indirect child of itself, -- Gitee From fcd29211a448e81f7c833e0d27026b561575ee81 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 9 Apr 2024 17:12:24 +0200 Subject: [PATCH 0239/1266] :bug: Fix cmd+optin+enter when popups blocked --- frontend/src/app/main/data/preview.cljs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/data/preview.cljs b/frontend/src/app/main/data/preview.cljs index 7510fb089..e5865e19a 100644 --- a/frontend/src/app/main/data/preview.cljs +++ b/frontend/src/app/main/data/preview.cljs @@ -98,7 +98,8 @@ closed-preview (rx/subject) preview (.open js/window "/#/frame-preview") listener-fn #(rx/push! closed-preview true)] - (.addEventListener preview "beforeunload" listener-fn) + (when (some? preview) + (.addEventListener preview "beforeunload" listener-fn)) (->> (rx/from-atom (refs/all-children-objects shape-id) {:emit-current-value? true}) (rx/take-until closed-preview) (rx/debounce 1000) -- Gitee From c27f8847559adc66e1737ee7a075ccdb6d0522fe Mon Sep 17 00:00:00 2001 From: Kelp <5446186+NatachaMenjibar@users.noreply.github.com> Date: Mon, 8 Apr 2024 13:06:37 +0200 Subject: [PATCH 0240/1266] :sparkles: Add light and dark version of the header --- README.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index abe693bef..03cb01d6c 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,12 @@ [uri_license]: https://www.mozilla.org/en-US/MPL/2.0 [uri_license_image]: https://img.shields.io/badge/MPL-2.0-blue.svg -![github-light-mode](https://github.com/penpot/penpot/assets/5446186/e5e725fb-a925-43aa-904e-68658c2ef1b5) - + + + + penpot header image + +

License: MPL-2.0 Gitter @@ -31,7 +35,7 @@ Penpot is the first **Open Source** design tool for design and code collaboratio Penpot is available on browser and [self host](https://penpot.app/self-host). It’s web-based and works with open standards (SVG, CSS and HTML). And last but not least, it’s free! -Penpot’s latest [huge release 2.0](https://penpot.app/dev-diaries), takes the platform to a whole new level. This update introduces the ground-breaking [CSS Grid Layout feature](https://penpot.app/layout), a complete UI redesign, a new Components system, and much more. Plus, it's faster and more accessible. +Penpot’s latest [huge release 2.0](https://penpot.app/dev-diaries), takes the platform to a whole new level. This update introduces the ground-breaking [CSS Grid Layout feature](https://penpot.app/design/layout), a complete UI redesign, a new Components system, and much more. Plus, it's faster and more accessible. 🎇 **Penpot Fest is back!** Our first design, code & Open Source event is happening in Barcelona | June 5-7th. [Get your tickets](https://www.eventbrite.es/e/penpot-fest-2024-tickets-859331883797) to join other designers and developers from open-source communities and beyond. @@ -124,7 +128,7 @@ Choose your way: - Give feedback: [Mail us](mailto:support@penpot.app) - **Contribute to Penpot's code:** [Watch this video](https://www.youtube.com/watch?v=TpN0osiY-8k) by Alejandro Alonso, CIO and developer at Penpot, where he gives us a hands-on demo of how to use Penpot’s repository and make changes in both front and back end -To find (almost) everything you need to know on how to contribute to Penpot, refer to the [contributing-guide](https://help.penpot.app/contributing-guide/). +To find (almost) everything you need to know on how to contribute to Penpot, refer to the [contributing guide](https://help.penpot.app/contributing-guide/).
-- Gitee From 19878484a67ec14a7035bbd0bfd2fe2b1c3c3dda Mon Sep 17 00:00:00 2001 From: Kelp <5446186+NatachaMenjibar@users.noreply.github.com> Date: Mon, 8 Apr 2024 13:13:56 +0200 Subject: [PATCH 0241/1266] :bug: Fix wrong website link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 03cb01d6c..c48e78997 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ With Penpot you can design libraries to share and reuse; turn design elements in ### Install with Elestio ### Penpot is the only design & prototype platform that is deployment agnostic. You can use it or deploy it anywhere. -Learn how to install it with Elestio and Docker, or other options on [our website](https://penpot.dev/self-host). +Learn how to install it with Elestio and Docker, or other options on [our website](https://penpot.app/self-host).

-- Gitee From 91ade7fe58b3fd008e2460a2f9f0854fdf582639 Mon Sep 17 00:00:00 2001 From: Kelp <5446186+NatachaMenjibar@users.noreply.github.com> Date: Mon, 8 Apr 2024 17:28:10 +0200 Subject: [PATCH 0242/1266] =?UTF-8?q?=F0=9F=90=9B=20Fix=20social=20media?= =?UTF-8?q?=20links?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index c48e78997..8ccd2def4 100644 --- a/README.md +++ b/README.md @@ -15,27 +15,33 @@ Gitpod ready-to-code

- Website • - Getting Started • - User Guide • - Tutorials & Info • - Community • - Twitter • - Instagram • - Mastodon • - Youtube + Website • + Getting Started • + User Guide • + Tutorials & Info • + Community

+

+ Youtube • + Peertube • + Linkedin • + Instagram • + Mastodon • + X + +

+
[Penpot video](https://github.com/penpot/penpot/assets/5446186/b8ad0764-585e-4ddc-b098-9b4090d337cc)
-Penpot is the first **Open Source** design tool for design and code collaboration. Designers can create stunning designs, interactive prototypes, design systems at scale, while developers enjoy ready-to-use code and make their workflow easy and fast. And all of this with no handoff drama. +Penpot is the first **open-source** design tool for design and code collaboration. Designers can create stunning designs, interactive prototypes, design systems at scale, while developers enjoy ready-to-use code and make their workflow easy and fast. And all of this with no handoff drama. Penpot is available on browser and [self host](https://penpot.app/self-host). It’s web-based and works with open standards (SVG, CSS and HTML). And last but not least, it’s free! -Penpot’s latest [huge release 2.0](https://penpot.app/dev-diaries), takes the platform to a whole new level. This update introduces the ground-breaking [CSS Grid Layout feature](https://penpot.app/design/layout), a complete UI redesign, a new Components system, and much more. Plus, it's faster and more accessible. +Penpot’s latest [huge release 2.0](https://penpot.app/dev-diaries), takes the platform to a whole new level. This update introduces the ground-breaking [CSS Grid Layout feature](https://penpot.app/penpot-2.0), a complete UI redesign, a new Components system, and much more. Plus, it's faster and more accessible. 🎇 **Penpot Fest is back!** Our first design, code & Open Source event is happening in Barcelona | June 5-7th. [Get your tickets](https://www.eventbrite.es/e/penpot-fest-2024-tickets-859331883797) to join other designers and developers from open-source communities and beyond. @@ -125,7 +131,7 @@ Choose your way: - Participate in the [Community](https://community.penpot.app/) space by asking and answering questions; reacting to others’ articles; opening your own conversations and following along on decisions affecting the project. - Report bugs with our easy [guide for bugs hunting](https://help.penpot.app/contributing-guide/reporting-bugs/) or [GitHub issues](https://github.com/penpot/penpot/issues) - Become a [translator](https://help.penpot.app/contributing-guide/translations) -- Give feedback: [Mail us](mailto:support@penpot.app) +- Give feedback: [Email us](mailto:support@penpot.app) - **Contribute to Penpot's code:** [Watch this video](https://www.youtube.com/watch?v=TpN0osiY-8k) by Alejandro Alonso, CIO and developer at Penpot, where he gives us a hands-on demo of how to use Penpot’s repository and make changes in both front and back end To find (almost) everything you need to know on how to contribute to Penpot, refer to the [contributing guide](https://help.penpot.app/contributing-guide/). -- Gitee From 5b4fcd2c8031e13e7d490fbf7581616521beecb7 Mon Sep 17 00:00:00 2001 From: Kelp <5446186+NatachaMenjibar@users.noreply.github.com> Date: Mon, 8 Apr 2024 17:51:52 +0200 Subject: [PATCH 0243/1266] :paperclip: Fix small content error --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8ccd2def4..2288643f2 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ Penpot is available on browser and [self host](https://penpot.app/self-host). It Penpot’s latest [huge release 2.0](https://penpot.app/dev-diaries), takes the platform to a whole new level. This update introduces the ground-breaking [CSS Grid Layout feature](https://penpot.app/penpot-2.0), a complete UI redesign, a new Components system, and much more. Plus, it's faster and more accessible. -🎇 **Penpot Fest is back!** Our first design, code & Open Source event is happening in Barcelona | June 5-7th. [Get your tickets](https://www.eventbrite.es/e/penpot-fest-2024-tickets-859331883797) to join other designers and developers from open-source communities and beyond. +🎇 **Penpot Fest is back!** Our design, code & Open Source event is happening in Barcelona | June 5-7th. [Get your tickets](https://www.eventbrite.es/e/penpot-fest-2024-tickets-859331883797) to join other designers and developers from open-source communities and beyond. Check out the highlights from [Penpot Fest 2023 edition](https://www.youtube.com/watch?v=sOpLZaK5mDc)! ## Table of contents ## -- Gitee From 39c35d51d32e5dc7fccfb23ee42feee29dceb276 Mon Sep 17 00:00:00 2001 From: Kelp <5446186+NatachaMenjibar@users.noreply.github.com> Date: Tue, 9 Apr 2024 15:38:45 +0200 Subject: [PATCH 0244/1266] =?UTF-8?q?=F0=9F=93=8E=20Add=20missing=20

?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2288643f2..255d92fb3 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ [uri_license]: https://www.mozilla.org/en-US/MPL/2.0 [uri_license_image]: https://img.shields.io/badge/MPL-2.0-blue.svg +

-- Gitee From 656e910896a88ac5710d8142b7f219c96774affa Mon Sep 17 00:00:00 2001 From: Kelp <5446186+NatachaMenjibar@users.noreply.github.com> Date: Tue, 9 Apr 2024 17:11:41 +0200 Subject: [PATCH 0245/1266] =?UTF-8?q?=F0=9F=93=8E=20Remove=20unnecessary?= =?UTF-8?q?=20html=20tags?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 255d92fb3..45cdc44c4 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,11 @@ [uri_license]: https://www.mozilla.org/en-US/MPL/2.0 [uri_license_image]: https://img.shields.io/badge/MPL-2.0-blue.svg -

penpot header image -

License: MPL-2.0 Gitter @@ -31,7 +29,7 @@ X

- +
[Penpot video](https://github.com/penpot/penpot/assets/5446186/b8ad0764-585e-4ddc-b098-9b4090d337cc) -- Gitee From a3f44074a0d3b471405d04829546505b3362bd09 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 9 Apr 2024 18:05:00 +0200 Subject: [PATCH 0246/1266] :bug: Removed shortcut ctrl+alt+enter in production --- .../src/app/main/data/workspace/shortcuts.cljs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/frontend/src/app/main/data/workspace/shortcuts.cljs b/frontend/src/app/main/data/workspace/shortcuts.cljs index b8d10264d..f3d7a72d6 100644 --- a/frontend/src/app/main/data/workspace/shortcuts.cljs +++ b/frontend/src/app/main/data/workspace/shortcuts.cljs @@ -547,11 +547,6 @@ :subsections [:shape] :fn #(emit-when-no-readonly (dw/create-bool :exclude))} - ;; PREVIEW - :preview-frame {:tooltip (ds/meta (ds/alt ds/enter)) - :command (ds/c-mod "alt+enter") - :fn #(emit-when-no-readonly (dp/open-preview-selected))} - ;; THEME :toggle-theme {:tooltip (ds/alt "M") :command (ds/a-mod "m") @@ -559,6 +554,12 @@ :fn #(st/emit! (with-meta (du/toggle-theme) {::ev/origin "workspace:shortcut"}))}}) +(def debug-shortcuts + ;; PREVIEW + {:preview-frame {:tooltip (ds/meta (ds/alt ds/enter)) + :command (ds/c-mod "alt+enter") + :fn #(emit-when-no-readonly (dp/open-preview-selected))}}) + (def opacity-shortcuts (into {} (->> (range 10) @@ -569,7 +570,9 @@ :fn #(emit-when-no-readonly (dwly/pressed-opacity n))}]))))) (def shortcuts - (merge base-shortcuts opacity-shortcuts dwtxts/shortcuts)) + (cond-> (merge base-shortcuts opacity-shortcuts dwtxts/shortcuts) + *assert* + (merge debug-shortcuts))) (defn get-tooltip [shortcut] (assert (contains? shortcuts shortcut) (str shortcut)) -- Gitee From c8b2db81459cddfc0af7df67c020cc8660cff0a6 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Tue, 9 Apr 2024 18:59:17 +0200 Subject: [PATCH 0247/1266] :bug: Fix crash on moving a copy in a copy (for a migrated file) (2) --- common/src/app/common/types/container.cljc | 1 + 1 file changed, 1 insertion(+) diff --git a/common/src/app/common/types/container.cljc b/common/src/app/common/types/container.cljc index ad2424144..b50c5058a 100644 --- a/common/src/app/common/types/container.cljc +++ b/common/src/app/common/types/container.cljc @@ -509,6 +509,7 @@ (every? nil?)))] (or ;;We don't want to change the structure of component copies + (ctk/in-component-copy? parent) (has-any-copy-parent? objects parent) ;; If we are moving something containing a main instance the container can't be part of a component (neither main nor copy) (and selected-main-instance? parent-in-component?) -- Gitee From 0fa2dbcaf2a267fa9e85a2cdcd945b5ead22eb83 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 9 Apr 2024 15:30:42 +0200 Subject: [PATCH 0248/1266] :bug: Remove transforming flag and use a global flag --- frontend/src/app/main/data/workspace/shapes.cljs | 7 +++---- frontend/src/app/main/data/workspace/transforms.cljs | 5 ++--- frontend/src/app/main/ui/workspace/viewport/outline.cljs | 3 +-- frontend/src/app/main/ui/workspace/viewport/selection.cljs | 2 -- 4 files changed, 6 insertions(+), 11 deletions(-) diff --git a/frontend/src/app/main/data/workspace/shapes.cljs b/frontend/src/app/main/data/workspace/shapes.cljs index 4fabc4e80..462b569c4 100644 --- a/frontend/src/app/main/data/workspace/shapes.cljs +++ b/frontend/src/app/main/data/workspace/shapes.cljs @@ -387,7 +387,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defn update-shape-flags - [ids {:keys [blocked hidden transforming undo-group] :as flags}] + [ids {:keys [blocked hidden undo-group] :as flags}] (dm/assert! "expected valid coll of uuids" (every? uuid? ids)) @@ -403,15 +403,14 @@ (fn [obj] (cond-> obj (boolean? blocked) (assoc :blocked blocked) - (boolean? hidden) (assoc :hidden hidden) - (boolean? transforming) (assoc :transforming transforming))) + (boolean? hidden) (assoc :hidden hidden))) objects (wsh/lookup-page-objects state) ;; We have change only the hidden behaviour, to hide only the ;; selected shape, block behaviour remains the same. ids (if (boolean? blocked) (into ids (->> ids (mapcat #(cfh/get-children-ids objects %)))) ids)] - (rx/of (dch/update-shapes ids update-fn {:attrs #{:blocked :hidden :transforming} :undo-group undo-group})))))) + (rx/of (dch/update-shapes ids update-fn {:attrs #{:blocked :hidden} :undo-group undo-group})))))) (defn toggle-visibility-selected [] diff --git a/frontend/src/app/main/data/workspace/transforms.cljs b/frontend/src/app/main/data/workspace/transforms.cljs index 7cea9cde9..05289294d 100644 --- a/frontend/src/app/main/data/workspace/transforms.cljs +++ b/frontend/src/app/main/data/workspace/transforms.cljs @@ -28,7 +28,6 @@ [app.main.data.workspace.collapse :as dwc] [app.main.data.workspace.modifiers :as dwm] [app.main.data.workspace.selection :as dws] - [app.main.data.workspace.shapes :as dwsh] [app.main.data.workspace.state-helpers :as wsh] [app.main.data.workspace.undo :as dwu] [app.main.snap :as snap] @@ -291,10 +290,10 @@ ptk/WatchEvent (watch [_ _ stream] (rx/concat - (rx/of (dwsh/update-shape-flags ids {:transforming true})) + (rx/of #(assoc-in % [:workspace-local :transform] :move)) (->> (rx/timer 1000) (rx/map (fn [] - (dwsh/update-shape-flags ids {:transforming false}))) + #(assoc-in % [:workspace-local :transform] nil))) (rx/take-until (rx/filter (ptk/type? ::trigger-bounding-box-cloaking) stream))))))) diff --git a/frontend/src/app/main/ui/workspace/viewport/outline.cljs b/frontend/src/app/main/ui/workspace/viewport/outline.cljs index 176128102..3cd2b3a95 100644 --- a/frontend/src/app/main/ui/workspace/viewport/outline.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/outline.cljs @@ -113,8 +113,7 @@ (defn- show-outline? [shape] (and (not (:hidden shape)) - (not (:blocked shape)) - (not (:transforming shape)))) + (not (:blocked shape)))) (mf/defc shape-outlines {::mf/wrap-props false} diff --git a/frontend/src/app/main/ui/workspace/viewport/selection.cljs b/frontend/src/app/main/ui/workspace/viewport/selection.cljs index 5789e2ff1..be2466409 100644 --- a/frontend/src/app/main/ui/workspace/viewport/selection.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/selection.cljs @@ -321,7 +321,6 @@ transform (gsh/transform-str shape)] (when (and (some? selrect) - (not (:transforming shape)) (not (or (= transform-type :move) (= transform-type :rotate)))) [:g.controls {:pointer-events (if ^boolean disable-handlers "none" "visible")} @@ -356,7 +355,6 @@ (and flip-y (not flip-x)))] (when (and (not ^boolean read-only?) - (not (:transforming shape)) (not (or (= transform-type :move) (= transform-type :rotate)))) -- Gitee From 9d7e8cf4e633ed4b087e7b0f04f6be9c88b44b21 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Tue, 9 Apr 2024 19:25:09 +0200 Subject: [PATCH 0249/1266] :bug: fix naming convention of swap --- .../sidebar/options/menus/component.cljs | 20 +++++-------------- .../sidebar/options/menus/component.scss | 9 +-------- 2 files changed, 6 insertions(+), 23 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.cljs index 570b25faf..8921cc25d 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.cljs @@ -248,18 +248,13 @@ {::mf/props :obj} [{:keys [item on-enter-group]}] (let [group-name (:name item) - path (cfh/butlast-path-with-dots group-name) on-group-click #(on-enter-group group-name)] [:div {:class (stl/css :component-group) :on-click on-group-click :title group-name} - [:div {:class (stl/css :path-wrapper)} - (when-not (str/blank? path) - [:span {:class (stl/css :component-group-path)} - (str "\u00A0\u2022\u00A0" path)]) - [:span {:class (stl/css :component-group-name)} - (cfh/last-path group-name)]] + [:span {:class (stl/css :component-group-name)} + (cfh/last-path group-name)] [:span {:class (stl/css :arrow-icon)} i/arrow]])) @@ -416,10 +411,7 @@ (mf/use-fn (fn [style] (swap! filters* assoc :listing-thumbs? (= style "grid")))) - - filters-but-last (cfh/butlast-path (:path filters)) - last-filters (cfh/last-path (:path filters)) - filter-path-with-dots (->> filters-but-last (cfh/split-path) (cfh/join-path-with-dot))] + filter-path-with-dots (->> (:path filters) (cfh/split-path) (cfh/join-path-with-dot))] [:div {:class (stl/css :component-swap)} [:div {:class (stl/css :element-set-title)} @@ -462,10 +454,8 @@ :on-click on-go-back :title filter-path-with-dots} [:span {:class (stl/css :back-arrow)} i/arrow] - (when-not (= "" filter-path-with-dots) - [:span {:class (stl/css :path-name)} - (dm/str "\u00A0\u2022\u00A0" filter-path-with-dots)]) - [:span {:class (stl/css :path-name-last)} last-filters]]) + [:span {:class (stl/css :path-name)} + filter-path-with-dots]]) (when (empty? items) [:div {:class (stl/css :component-list-empty)} diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.scss b/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.scss index d024187a7..3587d0fbe 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.scss +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.scss @@ -254,14 +254,7 @@ direction: rtl; height: $s-32; padding: $s-8 0 $s-8 $s-2; -} - -.path-name-last { - @include bodySmallTypography; - @include textEllipsis; - height: $s-32; - padding: $s-8 0 $s-8 $s-2; - color: white; + margin-right: $s-4; } .component-list-empty { -- Gitee From 584e18d85825409f799feccf64f4936745282219 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Wed, 10 Apr 2024 13:25:46 +0200 Subject: [PATCH 0250/1266] :bug: Fix ignore touched when rotating a copy --- frontend/src/app/main/data/workspace/modifiers.cljs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/main/data/workspace/modifiers.cljs b/frontend/src/app/main/data/workspace/modifiers.cljs index b552bee67..d4f8799f7 100644 --- a/frontend/src/app/main/data/workspace/modifiers.cljs +++ b/frontend/src/app/main/data/workspace/modifiers.cljs @@ -46,9 +46,10 @@ ;; When the interaction is finished (e.g. user releases mouse button), the ;; apply-modifiers event is done, that consolidates all modifiers into the base ;; geometric attributes of the shapes. + (defn- check-delta - "If the shape is a component instance, check its relative position respect the - root of the component, and see if it changes after applying a transformation." + "If the shape is a component instance, check its relative position and rotation respect + the root of the component, and see if it changes after applying a transformation." [shape root transformed-shape transformed-root] (let [shape-delta (when root @@ -65,6 +66,11 @@ (gpt/distance-vector shape-delta transformed-shape-delta) (gpt/point 0 0)) + rotation-delta + (if (and (some? (:rotation shape)) (some? (:rotation shape))) + (- (:rotation transformed-shape) (:rotation shape)) + 0) + selrect (:selrect shape) transformed-selrect (:selrect transformed-shape)] @@ -76,7 +82,8 @@ ;; shape position unchanged. But in this case we do not want to ignore it. (and (and (< (:x distance) 1) (< (:y distance) 1)) (mth/close? (:width selrect) (:width transformed-selrect)) - (mth/close? (:height selrect) (:height transformed-selrect))))) + (mth/close? (:height selrect) (:height transformed-selrect)) + (mth/close? rotation-delta 0)))) (defn calculate-ignore-tree "Retrieves a map with the flag `ignore-geometry?` given a tree of modifiers" -- Gitee From 09353907612910e9e722da797f040e9896c133ca Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 10 Apr 2024 10:27:46 +0200 Subject: [PATCH 0251/1266] :bug: Fix problem with paste order --- common/src/app/common/types/shape/layout.cljc | 8 +++++--- frontend/src/app/main/data/workspace.cljs | 5 +++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/common/src/app/common/types/shape/layout.cljc b/common/src/app/common/types/shape/layout.cljc index efccf250c..d6c1178bd 100644 --- a/common/src/app/common/types/shape/layout.cljc +++ b/common/src/app/common/types/shape/layout.cljc @@ -495,9 +495,11 @@ (= layout-align-items :stretch)) (defn reverse? - [{:keys [layout-flex-dir]}] - (or (= :row-reverse layout-flex-dir) - (= :column-reverse layout-flex-dir))) + ([objects id] + (reverse? (get objects id))) + ([{:keys [layout-flex-dir]}] + (or (= :row-reverse layout-flex-dir) + (= :column-reverse layout-flex-dir)))) (defn space-between? [{:keys [layout-justify-content]}] diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index 91a080b71..23e8dd546 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -2013,6 +2013,7 @@ (d/index-by :prev-id)) selected (:selected pdata) + objects (:objects pdata) position (deref ms/mouse-position) @@ -2036,6 +2037,10 @@ index 0) + selected (if (and (ctl/flex-layout? page-objects parent-id) (not (ctl/reverse? page-objects parent-id))) + (into (d/ordered-set) (reverse selected)) + selected) + objects (update-vals objects (partial process-shape file-id frame-id parent-id)) all-objects (merge page-objects objects) -- Gitee From 389c394f39c9cd8119eff1d768d0e3af8327a9a9 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 10 Apr 2024 11:02:23 +0200 Subject: [PATCH 0252/1266] :bug: Fix import zip text with gradients --- common/src/app/common/files/builder.cljc | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/common/src/app/common/files/builder.cljc b/common/src/app/common/files/builder.cljc index d10b494d9..c30a2e8c8 100644 --- a/common/src/app/common/files/builder.cljc +++ b/common/src/app/common/files/builder.cljc @@ -16,6 +16,7 @@ [app.common.pprint :as pp] [app.common.schema :as sm] [app.common.svg :as csvg] + [app.common.text :as txt] [app.common.types.components-list :as ctkl] [app.common.types.container :as ctn] [app.common.types.file :as ctf] @@ -322,8 +323,19 @@ (defn create-path [file data] (create-shape file :path data)) +(defn- clean-text-content + "Clean the content data so it doesn't break the validation" + [content] + (letfn [(update-fill [fill] + (d/update-in-when fill [:fill-color-gradient :type] keyword))] + (txt/transform-nodes + (fn [node] + (d/update-when node :fills #(mapv update-fill %))) + content))) + (defn create-text [file data] - (create-shape file :text data)) + (let [data (d/update-when data :content clean-text-content)] + (create-shape file :text data))) (defn create-image [file data] (create-shape file :image data)) -- Gitee From 01a64dda2eecf24e0d68d4ae5e87680116fd0f30 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 9 Apr 2024 11:00:16 +0200 Subject: [PATCH 0253/1266] :bug: Fix json encoding issue on webhook event with custom object This commit is a workaround. We will need to properly replace jsonista with data.json because the data.json has more convenient way for extending for custom data types. --- backend/src/app/loggers/webhooks.clj | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/backend/src/app/loggers/webhooks.clj b/backend/src/app/loggers/webhooks.clj index d93ce0185..3982aa48e 100644 --- a/backend/src/app/loggers/webhooks.clj +++ b/backend/src/app/loggers/webhooks.clj @@ -15,9 +15,9 @@ [app.config :as cf] [app.db :as db] [app.http.client :as http] - [app.util.json :as json] [app.util.time :as dt] [app.worker :as wrk] + [clojure.data.json :as json] [clojure.spec.alpha :as s] [cuerdas.core :as str] [integrant.core :as ig])) @@ -86,11 +86,9 @@ (declare interpret-exception) (declare interpret-response) -(def ^:private json-mapper - (json/mapper - {:encode-key-fn str/camel - :decode-key-fn (comp keyword str/kebab) - :pretty true})) +(def json-write-opts + {:key-fn str/camel + :indent true}) (defmethod ig/pre-init-spec ::run-webhook-handler [_] (s/keys :req [::http/client ::db/pool])) @@ -134,7 +132,7 @@ whook (::config props) body (case (:mtype whook) - "application/json" (json/encode-str event json-mapper) + "application/json" (json/write-str event json-write-opts) "application/transit+json" (t/encode-str event) "application/x-www-form-urlencoded" (uri/map->query-string event))] -- Gitee From 036392af6ede5e6a0711666bb9987339a1f55f63 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 9 Apr 2024 11:24:46 +0200 Subject: [PATCH 0254/1266] :sparkles: Add the logger info to mattermost reporter --- backend/src/app/loggers/mattermost.clj | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/backend/src/app/loggers/mattermost.clj b/backend/src/app/loggers/mattermost.clj index 8a2117e23..32fff185b 100644 --- a/backend/src/app/loggers/mattermost.clj +++ b/backend/src/app/loggers/mattermost.clj @@ -23,17 +23,20 @@ (defn- send-mattermost-notification! [cfg {:keys [id public-uri] :as report}] + + (let [text (str "Exception: " public-uri "/dbg/error/" id " " (when-let [pid (:profile-id report)] (str "(pid: #uuid-" pid ")")) "\n" - "```\n" - "- host: `" (:host report) "`\n" - "- tenant: `" (:tenant report) "`\n" + "- host: #" (:host report) "\n" + "- tenant: #" (:tenant report) "\n" + "- logger: #" (:logger report) "\n" "- request-path: `" (:request-path report) "`\n" "- frontend-version: `" (:frontend-version report) "`\n" "- backend-version: `" (:backend-version report) "`\n" "\n" + "```\n" "Trace:\n" (:trace report) "```") @@ -60,6 +63,7 @@ :frontend-version (:version/frontend context) :profile-id (:request/profile-id context) :request-path (:request/path context) + :logger (::l/logger record) :trace (ex/format-throwable cause :detail? false :header? false)}) (defn handle-event -- Gitee From c6d92a25175c43083d3a73cf886ac16a5aa0a94e Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 9 Apr 2024 13:28:15 +0200 Subject: [PATCH 0255/1266] :bug: Fix incorrect feature handling on importing binfile on v1 --- common/src/app/common/features.cljc | 1 - 1 file changed, 1 deletion(-) diff --git a/common/src/app/common/features.cljc b/common/src/app/common/features.cljc index fffa5b6a6..7c670a9bd 100644 --- a/common/src/app/common/features.cljc +++ b/common/src/app/common/features.cljc @@ -144,7 +144,6 @@ team-features (into #{} xf-remove-ephimeral (:features team))] (-> enabled-features (set/intersection no-migration-features) - (set/union default-enabled-features) (set/union team-features)))) (defn check-client-features! -- Gitee From 5924f3bc41dfbe8f624429fa328ac30abf925ec9 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 9 Apr 2024 13:39:30 +0200 Subject: [PATCH 0256/1266] :sparkles: Simplify v2 migration helpers on srepl ns --- backend/scripts/manage.py | 4 - backend/scripts/start-dev | 42 +- backend/src/app/features/components_v2.clj | 23 +- backend/src/app/main.clj | 9 + backend/src/app/srepl/cli.clj | 36 -- backend/src/app/srepl/components_v2.clj | 400 ++++-------------- .../backend_tests/rpc_management_test.clj | 2 +- 7 files changed, 100 insertions(+), 416 deletions(-) diff --git a/backend/scripts/manage.py b/backend/scripts/manage.py index 564c0e2d5..d3971e68d 100755 --- a/backend/scripts/manage.py +++ b/backend/scripts/manage.py @@ -160,7 +160,6 @@ available_commands = ( "delete-profile", "search-profile", "derive-password", - "migrate-components-v2", ) parser = argparse.ArgumentParser( @@ -233,7 +232,4 @@ elif args.action == "search-profile": search_profile(email) -elif args.action == "migrate-components-v2": - migrate_components_v2() - diff --git a/backend/scripts/start-dev b/backend/scripts/start-dev index 2497e801e..fe81a240a 100755 --- a/backend/scripts/start-dev +++ b/backend/scripts/start-dev @@ -38,29 +38,9 @@ export PENPOT_MEDIA_MAX_FILE_SIZE=104857600 # Setup default multipart upload size to 300MiB export PENPOT_HTTP_SERVER_MAX_MULTIPART_BODY_SIZE=314572800 -# Setup HEAP -# export OPTIONS="$OPTIONS -J-Xms50m -J-Xmx1024m" -# export OPTIONS="$OPTIONS -J-Xms1100m -J-Xmx1100m -J-XX:+AlwaysPreTouch" - -# Increase virtual thread pool size -# export OPTIONS="$OPTIONS -J-Djdk.virtualThreadScheduler.parallelism=16" - -# Disable C2 Compiler -# export OPTIONS="$OPTIONS -J-XX:TieredStopAtLevel=1" - -# Disable all compilers -# export OPTIONS="$OPTIONS -J-Xint" - -# Setup GC -# export OPTIONS="$OPTIONS -J-XX:+UseG1GC" - -# Setup GC -# export OPTIONS="$OPTIONS -J-XX:+UseZGC" - # Enable ImageMagick v7.x support # export OPTIONS="-J-Dim4java.useV7=true $OPTIONS"; - # Initialize MINIO config mc alias set penpot-s3/ http://minio:9000 minioadmin minioadmin -q mc admin user add penpot-s3 penpot-devenv penpot-devenv -q @@ -76,24 +56,8 @@ export PENPOT_ASSETS_STORAGE_BACKEND=assets-s3 export PENPOT_STORAGE_ASSETS_S3_ENDPOINT=http://minio:9000 export PENPOT_STORAGE_ASSETS_S3_BUCKET=penpot -if [ "$1" = "--watch" ]; then - trap "exit" INT TERM ERR - trap "kill 0" EXIT - - echo "Start Watch..." - - clojure $OPTIONS -A:dev -M -m app.main & +entrypoint=${1:-app.main}; - npx nodemon \ - --watch src \ - --watch ../common \ - --ext "clj" \ - --signal SIGKILL \ - --exec 'echo "(app.main/stop)\n\r(repl/refresh)\n\r(app.main/start)\n" | nc -N localhost 6062' +set -ex - wait; - -else - set -x - clojure $OPTIONS -A:dev -M -m app.main; -fi +clojure $OPTIONS -A:dev -M -m $entrypoint; diff --git a/backend/src/app/features/components_v2.clj b/backend/src/app/features/components_v2.clj index 21ed5f52a..05cd1a084 100644 --- a/backend/src/app/features/components_v2.clj +++ b/backend/src/app/features/components_v2.clj @@ -53,7 +53,6 @@ [app.storage.tmp :as tmp] [app.svgo :as svgo] [app.util.blob :as blob] - [app.util.events :as events] [app.util.pointer-map :as pmap] [app.util.time :as dt] [buddy.core.codecs :as bc] @@ -1196,9 +1195,6 @@ add-instance-grid (fn [fdata frame-id grid assets] (reduce (fn [result [component position]] - (events/tap :progress {:op :migrate-component - :id (:id component) - :name (:name component)}) (add-main-instance result component frame-id (gpt/add position (gpt/point grid-gap grid-gap)))) fdata @@ -1518,9 +1514,6 @@ (->> (d/zip media-group grid) (reduce (fn [fdata [mobj position]] - (events/tap :progress {:op :migrate-graphic - :id (:id mobj) - :name (:name mobj)}) (or (process fdata mobj position) fdata)) (assoc-in fdata [:options :components-v2] true))))) @@ -1759,11 +1752,6 @@ (let [file (get-file system file-id) file (process-file! system file :validate? validate?)] - (events/tap :progress - {:op :migrate-file - :name (:name file) - :id (:id file)}) - (persist-file! system file))))) (catch Throwable cause @@ -1791,10 +1779,11 @@ (some-> *team-stats* (swap! update :processed-files (fnil inc 0))))))))) (defn migrate-team! - [system team-id & {:keys [validate? skip-on-graphic-error? label]}] + [system team-id & {:keys [validate? rown skip-on-graphic-error? label]}] (l/dbg :hint "migrate:team:start" - :team-id (dm/str team-id)) + :team-id (dm/str team-id) + :rown rown) (let [tpoint (dt/tpoint) err (volatile! false) @@ -1816,11 +1805,6 @@ (conj "layout/grid") (conj "styles/v2"))] - (events/tap :progress - {:op :migrate-team - :name (:name team) - :id id}) - (run! (partial migrate-file system) (get-and-lock-team-files conn id)) @@ -1849,6 +1833,7 @@ (l/dbg :hint "migrate:team:end" :team-id (dm/str team-id) + :rown rown :files files :components components :graphics graphics diff --git a/backend/src/app/main.clj b/backend/src/app/main.clj index 3c61e6b35..7aba876e4 100644 --- a/backend/src/app/main.clj +++ b/backend/src/app/main.clj @@ -527,6 +527,15 @@ :worker? (contains? cf/flags :backend-worker) :version (:full cf/version))) +(defn start-custom + [config] + (ig/load-namespaces config) + (alter-var-root #'system (fn [sys] + (when sys (ig/halt! sys)) + (-> config + (ig/prep) + (ig/init))))) + (defn stop [] (alter-var-root #'system (fn [sys] diff --git a/backend/src/app/srepl/cli.clj b/backend/src/app/srepl/cli.clj index 6bcca5c0c..d461ef14c 100644 --- a/backend/src/app/srepl/cli.clj +++ b/backend/src/app/srepl/cli.clj @@ -11,10 +11,7 @@ [app.common.exceptions :as ex] [app.common.uuid :as uuid] [app.db :as db] - [app.main :as main] [app.rpc.commands.auth :as cmd.auth] - [app.srepl.components-v2 :refer [migrate-teams!]] - [app.util.events :as events] [app.util.json :as json] [app.util.time :as dt] [cuerdas.core :as str])) @@ -105,39 +102,6 @@ [{:keys [password]}] (auth/derive-password password)) -(defmethod exec-command :migrate-v2 - [_] - (letfn [(on-progress-report [{:keys [elapsed completed errors]}] - (println (str/ffmt "-> Progress: completed: %, errors: %, elapsed: %" - completed errors elapsed))) - - (on-progress [{:keys [op name]}] - (case op - :migrate-team - (println (str/ffmt "-> Migrating team: \"%\"" name)) - :migrate-file - (println (str/ffmt "=> Migrating file: \"%\"" name)) - nil)) - - (on-event [[type payload]] - (case type - :progress-report (on-progress-report payload) - :progress (on-progress payload) - :error (on-error payload) - nil)) - - (on-error [cause] - (println "EE:" (ex-message cause)))] - - (println "The components/v2 migration started...") - - (try - (let [result (-> (partial migrate-teams! main/system {:rollback? true}) - (events/run-with! on-event))] - (println (str/ffmt "Migration process finished (elapsed: %)" (:elapsed result)))) - (catch Throwable cause - (on-error cause))))) - (defmethod exec-command :default [{:keys [::cmd]}] (ex/raise :type :internal diff --git a/backend/src/app/srepl/components_v2.clj b/backend/src/app/srepl/components_v2.clj index 00a3c34fb..5553d81d1 100644 --- a/backend/src/app/srepl/components_v2.clj +++ b/backend/src/app/srepl/components_v2.clj @@ -6,18 +6,16 @@ (ns app.srepl.components-v2 (:require - [app.common.data :as d] + [app.common.exceptions :as ex] [app.common.fressian :as fres] [app.common.logging :as l] [app.db :as db] [app.features.components-v2 :as feat] [app.main :as main] [app.srepl.helpers :as h] - [app.svgo :as svgo] [app.util.events :as events] [app.util.time :as dt] [app.worker :as-alias wrk] - [cuerdas.core :as str] [datoteka.fs :as fs] [datoteka.io :as io] [promesa.exec :as px] @@ -31,86 +29,6 @@ ;; PRIVATE HELPERS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defn- report-progress-files - [tpoint] - (fn [_ _ oldv newv] - (when (or (not= (:processed-files oldv) - (:processed-files newv)) - (not= (:errors oldv) - (:errors newv))) - (let [completed (:processed-files newv 0) - errors (:errors newv 0) - elapsed (dt/format-duration (tpoint))] - (events/tap :progress-report - {:elapsed elapsed - :completed completed - :errors errors}) - (l/dbg :hint "progress" - :completed completed - :elapsed elapsed))))) - -(defn- report-progress-teams - [tpoint] - (fn [_ _ oldv newv] - (when (or (not= (:processed-teams oldv) - (:processed-teams newv)) - (not= (:errors oldv) - (:errors newv))) - (let [completed (:processed-teams newv 0) - errors (:errors newv 0) - elapsed (dt/format-duration (tpoint))] - (events/tap :progress-report - {:elapsed elapsed - :completed completed - :errors errors}) - (l/dbg :hint "progress" - :completed completed - :elapsed elapsed))))) - -(def ^:private sql:get-teams-by-created-at - "WITH teams AS ( - SELECT id, features, - row_number() OVER (ORDER BY created_at) AS rown - FROM team - WHERE deleted_at IS NULL - ORDER BY created_at DESC - ) SELECT * FROM TEAMS %(pred)s") - -(def ^:private sql:get-teams-by-graphics - "WITH teams AS ( - SELECT t.id, t.features, - row_number() OVER (ORDER BY t.created_at) AS rown, - (SELECT count(*) - FROM file_media_object AS fmo - JOIN file AS f ON (f.id = fmo.file_id) - JOIN project AS p ON (p.id = f.project_id) - WHERE p.team_id = t.id - AND fmo.mtype = 'image/svg+xml' - AND fmo.is_local = false) AS graphics - FROM team AS t - WHERE t.deleted_at IS NULL - ORDER BY 3 ASC - ) - SELECT * FROM teams %(pred)s") - -(def ^:private sql:get-teams-by-activity - "WITH teams AS ( - SELECT t.id, t.features, - row_number() OVER (ORDER BY t.created_at) AS rown, - (SELECT coalesce(max(date_trunc('month', f.modified_at)), date_trunc('month', t.modified_at)) - FROM file AS f - JOIN project AS p ON (f.project_id = p.id) - WHERE p.team_id = t.id) AS updated_at, - (SELECT coalesce(count(*), 0) - FROM file AS f - JOIN project AS p ON (f.project_id = p.id) - WHERE p.team_id = t.id) AS total_files - FROM team AS t - WHERE t.deleted_at IS NULL - ORDER BY 3 DESC, 4 DESC - ) - SELECT * FROM teams %(pred)s") - (def ^:private sql:get-files-by-created-at "SELECT id, features, row_number() OVER (ORDER BY created_at DESC) AS rown @@ -118,87 +36,12 @@ WHERE deleted_at IS NULL ORDER BY created_at DESC") -(def ^:private sql:get-files-by-modified-at - "SELECT id, features - row_number() OVER (ORDER BY modified_at DESC) AS rown - FROM file - WHERE deleted_at IS NULL - ORDER BY modified_at DESC") - -(def ^:private sql:get-files-by-graphics - "WITH files AS ( - SELECT f.id, f.features, - row_number() OVER (ORDER BY modified_at) AS rown, - (SELECT count(*) FROM file_media_object AS fmo - WHERE fmo.mtype = 'image/svg+xml' - AND fmo.is_local = false - AND fmo.file_id = f.id) AS graphics - FROM file AS f - WHERE f.deleted_at IS NULL - ORDER BY 3 ASC - ) SELECT * FROM files %(pred)s") - -(defn- read-pred - [entries] - (let [entries (if (and (vector? entries) - (keyword? (first entries))) - [entries] - entries)] - (loop [params [] - queries [] - entries (seq entries)] - (if-let [[op val field] (first entries)] - (let [field (name field) - cond (case op - :lt (str/ffmt "% < ?" field) - :lte (str/ffmt "% <= ?" field) - :gt (str/ffmt "% > ?" field) - :gte (str/ffmt "% >= ?" field) - :eq (str/ffmt "% = ?" field))] - (recur (conj params val) - (conj queries cond) - (rest entries))) - - (let [sql (apply str "WHERE " (str/join " AND " queries))] - (apply vector sql params)))))) - -(defn- get-teams - [conn query pred] - (let [query (d/nilv query :created-at) - sql (case query - :created-at sql:get-teams-by-created-at - :activity sql:get-teams-by-activity - :graphics sql:get-teams-by-graphics) - sql (if pred - (let [[pred-sql & pred-params] (read-pred pred)] - (apply vector - (str/format sql {:pred pred-sql}) - pred-params)) - [(str/format sql {:pred ""})])] - - (->> (db/cursor conn sql {:chunk-size 500}) - (map feat/decode-row) - (remove (fn [{:keys [features]}] - (contains? features "components/v2")))))) - (defn- get-files - [conn query pred] - (let [query (d/nilv query :created-at) - sql (case query - :created-at sql:get-files-by-created-at - :modified-at sql:get-files-by-modified-at - :graphics sql:get-files-by-graphics) - sql (if pred - (let [[pred-sql & pred-params] (read-pred pred)] - (apply vector - (str/format sql {:pred pred-sql}) - pred-params)) - [(str/format sql {:pred ""})])] - - (->> (db/cursor conn sql {:chunk-size 500}) - (map feat/decode-row) - (remove (fn [{:keys [features]}] - (contains? features "components/v2")))))) + [conn] + (->> (db/cursor conn [sql:get-files-by-created-at] {:chunk-size 500}) + (map feat/decode-row) + (remove (fn [{:keys [features]}] + (contains? features "components/v2"))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; PUBLIC API @@ -244,8 +87,6 @@ stats (atom {}) tpoint (dt/tpoint)] - (add-watch stats :progress-report (report-progress-files tpoint)) - (binding [feat/*stats* stats feat/*cache* cache] (try @@ -265,127 +106,6 @@ (let [elapsed (dt/format-duration (tpoint))] (l/dbg :hint "migrate:end" :rollback rollback? :elapsed elapsed))))))) -(defn migrate-teams! - "A REPL helper for migrate all teams. - - This function starts multiple concurrent team migration processes - until the maximum number of jobs is reached which by default has the - value of `1`. This is controled with the `:max-jobs` option. - - If you want to run this on multiple machines you will need to specify - the total number of partitions and the current partition. - - In order to get the report table populated, you will need to provide - a correct `:label`. That label is also used for persist a file - snaphot before continue with the migration." - [& {:keys [max-jobs max-items max-time rollback? validate? query - pred max-procs cache skip-on-graphic-error? - label partitions current-partition] - :or {validate? false - rollback? true - max-jobs 1 - current-partition 1 - skip-on-graphic-error? true - max-items Long/MAX_VALUE}}] - - (when (int? partitions) - (when-not (int? current-partition) - (throw (IllegalArgumentException. "missing `current-partition` parameter"))) - (when-not (<= 0 current-partition partitions) - (throw (IllegalArgumentException. "invalid value on `current-partition` parameter")))) - - (let [stats (atom {}) - tpoint (dt/tpoint) - mtime (some-> max-time dt/duration) - - factory (px/thread-factory :virtual false :prefix "penpot/migration/") - executor (px/cached-executor :factory factory) - - max-procs (or max-procs max-jobs) - sjobs (ps/create :permits max-jobs) - sprocs (ps/create :permits max-procs) - - migrate-team - (fn [team-id] - (try - (db/tx-run! (assoc main/system ::db/rollback rollback?) - (fn [system] - (db/exec-one! system ["SET LOCAL idle_in_transaction_session_timeout = 0"]) - (feat/migrate-team! system team-id - :label label - :validate? validate? - :skip-on-graphic-error? skip-on-graphic-error?))) - - (catch Throwable cause - (l/wrn :hint "unexpected error on processing team (skiping)" - :team-id (str team-id)) - - (events/tap :error - (ex-info "unexpected error on processing team (skiping)" - {:team-id team-id} - cause)) - - (swap! stats update :errors (fnil inc 0))) - - (finally - (ps/release! sjobs)))) - - process-team - (fn [team-id] - (ps/acquire! sjobs) - (let [ts (tpoint)] - (if (and mtime (neg? (compare mtime ts))) - (do - (l/inf :hint "max time constraint reached" - :team-id (str team-id) - :elapsed (dt/format-duration ts)) - (ps/release! sjobs) - (reduced nil)) - - (px/run! executor (partial migrate-team team-id)))))] - - (l/dbg :hint "migrate:start" - :label label - :rollback rollback? - :max-jobs max-jobs - :max-items max-items) - - (add-watch stats :progress-report (report-progress-teams tpoint)) - - (binding [feat/*stats* stats - feat/*cache* cache - svgo/*semaphore* sprocs] - (try - (db/tx-run! main/system - (fn [{:keys [::db/conn] :as system}] - (db/exec! conn ["SET LOCAL statement_timeout = 0"]) - (db/exec! conn ["SET LOCAL idle_in_transaction_session_timeout = 0"]) - - (run! process-team - (->> (get-teams conn query pred) - (filter (fn [{:keys [rown]}] - (if (int? partitions) - (= current-partition (inc (mod rown partitions))) - true))) - (map :id) - (take max-items))) - - ;; Close and await tasks - (pu/close! executor))) - - (-> (deref stats) - (assoc :elapsed (dt/format-duration (tpoint)))) - - (catch Throwable cause - (l/dbg :hint "migrate:error" :cause cause) - (events/tap :error cause)) - - (finally - (let [elapsed (dt/format-duration (tpoint))] - (l/dbg :hint "migrate:end" - :rollback rollback? - :elapsed elapsed))))))) - (defn migrate-files! "A REPL helper for migrate all files. @@ -399,8 +119,8 @@ In order to get the report table populated, you will need to provide a correct `:label`. That label is also used for persist a file snaphot before continue with the migration." - [& {:keys [max-jobs max-items max-time rollback? validate? query - pred max-procs cache skip-on-graphic-error? + [& {:keys [max-jobs max-items rollback? validate? + cache skip-on-graphic-error? label partitions current-partition] :or {validate? false rollback? true @@ -417,14 +137,10 @@ (let [stats (atom {}) tpoint (dt/tpoint) - mtime (some-> max-time dt/duration) - factory (px/thread-factory :virtual false :prefix "penpot/migration/") executor (px/cached-executor :factory factory) - max-procs (or max-procs max-jobs) sjobs (ps/create :permits max-jobs) - sprocs (ps/create :permits max-procs) migrate-file (fn [file-id rown] @@ -455,16 +171,7 @@ process-file (fn [{:keys [id rown]}] (ps/acquire! sjobs) - (let [ts (tpoint)] - (if (and mtime (neg? (compare mtime ts))) - (do - (l/inf :hint "max time constraint reached" - :file-id (str id) - :elapsed (dt/format-duration ts)) - (ps/release! sjobs) - (reduced nil)) - - (px/run! executor (partial migrate-file id rown)))))] + (px/run! executor (partial migrate-file id rown)))] (l/dbg :hint "migrate:start" :label label @@ -472,11 +179,8 @@ :max-jobs max-jobs :max-items max-items) - (add-watch stats :progress-report (report-progress-files tpoint)) - (binding [feat/*stats* stats - feat/*cache* cache - svgo/*semaphore* sprocs] + feat/*cache* cache] (try (db/tx-run! main/system (fn [{:keys [::db/conn] :as system}] @@ -484,7 +188,7 @@ (db/exec! conn ["SET LOCAL idle_in_transaction_session_timeout = 0"]) (run! process-file - (->> (get-files conn query pred) + (->> (get-files conn) (filter (fn [{:keys [rown] :as row}] (if (int? partitions) (= current-partition (inc (mod rown partitions))) @@ -603,15 +307,77 @@ :elapsed elapsed)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; FILE PROCESS HELPERS +;; MAIN (SCRIPT ENTRY POINT) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defn delete-broken-files - [{:keys [id data] :as file}] - (if (-> data :options :components-v2 true?) - (do - (l/wrn :hint "found old components-v2 format" - :file-id (str id) - :file-name (:name file)) - (assoc file :deleted-at (dt/now))) - file)) +(def ^:private required-services + [[:app.main/assets :app.storage.s3/backend] + [:app.main/assets :app.storage.fs/backend] + :app.storage/storage + :app.db/pool + :app.setup/props + :app.svgo/optimizer + :app.metrics/metrics + :app.migrations/migrations + :app.http.client/client]) + +(def ^:private sql:get-teams-by-created-at + "SELECT id, features, + row_number() OVER (ORDER BY created_at DESC) AS rown + FROM team + WHERE deleted_at IS NULL + ORDER BY created_at DESC") + +(defn- get-teams + [conn] + (->> (db/cursor conn [sql:get-teams-by-created-at] {:chunk-size 1}) + (map feat/decode-row) + (remove (fn [{:keys [features]}] + (contains? features "components/v2"))))) + +(defn- migrate-teams + [{:keys [::db/conn] :as system}] + (db/exec-one! conn ["SET LOCAL idle_in_transaction_session_timeout = 0"]) + (run! (fn [{:keys [id rown]}] + (try + (-> (assoc system ::db/rollback true) + (feat/migrate-team! id + :rown rown + :label "migration-v2" + :validate? false + :skip-on-graphics-error? true)) + (catch Throwable _ + (swap! feat/*stats* update :errors (fnil inc 0)) + (l/wrn :hint "error on migrating team (skiping)")))) + (get-teams conn))) + +(defn run-migration + [] + (let [config (select-keys main/system-config required-services) + tpoint (dt/tpoint) + stats (atom {})] + (main/start-custom config) + + (binding [feat/*stats* stats] + (db/tx-run! main/system migrate-teams)) + + (let [stats (deref stats) + elapsed (dt/format-duration (tpoint))] + (l/inf :hint "migration finished" + :files (:processed-files stats) + :teams (:processed-teams stats) + :errors (:errors stats) + :elapsed elapsed)) + + (main/stop))) + +(defn -main + [& _args] + (try + (run-migration) + (System/exit 0) + + (catch Throwable cause + (ex/print-throwable cause) + (flush) + (System/exit -1)))) diff --git a/backend/test/backend_tests/rpc_management_test.clj b/backend/test/backend_tests/rpc_management_test.clj index 63018af33..e4dc70dac 100644 --- a/backend/test/backend_tests/rpc_management_test.clj +++ b/backend/test/backend_tests/rpc_management_test.clj @@ -612,7 +612,7 @@ (t/is (fn? result)) (let [events (th/consume-sse result)] - (t/is (= 6 (count events))) + (t/is (= 5 (count events))) (t/is (= :end (first (last events)))))))) (t/deftest get-list-of-buitin-templates -- Gitee From 7b7820952ccca4bdeb3f80cb7289b068c7eebf17 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 9 Apr 2024 14:07:52 +0200 Subject: [PATCH 0257/1266] :sparkles: Update docker related files --- backend/scripts/run.template.sh | 6 ++++-- docker/devenv/Dockerfile | 10 +++++----- docker/images/Dockerfile.backend | 13 ++++--------- docker/images/Dockerfile.exporter | 15 ++++++--------- 4 files changed, 19 insertions(+), 25 deletions(-) diff --git a/backend/scripts/run.template.sh b/backend/scripts/run.template.sh index d2e20ca91..17428ed15 100644 --- a/backend/scripts/run.template.sh +++ b/backend/scripts/run.template.sh @@ -20,5 +20,7 @@ fi export JVM_OPTS="-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager -Dlog4j2.configurationFile=log4j2.xml -XX:-OmitStackTraceInFastThrow --enable-preview $JVM_OPTS" -set -x -exec $JAVA_CMD $JVM_OPTS "$@" -jar penpot.jar -m app.main +ENTRYPOINT=${1:-app.main}; + +set -ex +exec $JAVA_CMD $JVM_OPTS "$@" -jar penpot.jar -m $ENTRYPOINT diff --git a/docker/devenv/Dockerfile b/docker/devenv/Dockerfile index 5e1aaffcb..1f3170c5b 100644 --- a/docker/devenv/Dockerfile +++ b/docker/devenv/Dockerfile @@ -143,23 +143,23 @@ RUN set -eux; \ ARCH="$(dpkg --print-architecture)"; \ case "${ARCH}" in \ aarch64|arm64) \ - BINARY_URL="https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-linux-arm64.tar.xz"; \ + BINARY_URL="https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-linux-arm64.tar.gz"; \ ;; \ amd64|x86_64) \ - BINARY_URL="https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-linux-x64.tar.xz"; \ + BINARY_URL="https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-linux-x64.tar.gz"; \ ;; \ *) \ echo "Unsupported arch: ${ARCH}"; \ exit 1; \ ;; \ esac; \ - curl -LfsSo /tmp/nodejs.tar.xz ${BINARY_URL}; \ + curl -LfsSo /tmp/nodejs.tar.gz ${BINARY_URL}; \ mkdir -p /usr/local/nodejs; \ cd /usr/local/nodejs; \ - tar -xf /tmp/nodejs.tar.xz --strip-components=1; \ + tar -xf /tmp/nodejs.tar.gz --strip-components=1; \ chown -R root /usr/local/nodejs; \ corepack enable; \ - rm -rf /tmp/nodejs.tar.xz; + rm -rf /tmp/nodejs.tar.gz; RUN set -ex; \ ARCH="$(dpkg --print-architecture)"; \ diff --git a/docker/images/Dockerfile.backend b/docker/images/Dockerfile.backend index a878be57a..db789dfd2 100644 --- a/docker/images/Dockerfile.backend +++ b/docker/images/Dockerfile.backend @@ -40,16 +40,12 @@ RUN set -eux; \ ARCH="$(dpkg --print-architecture)"; \ case "${ARCH}" in \ aarch64|arm64) \ - ESUM='1c4be9aa173cb0deb0d215643d9509c8900e5497290b29eee4bee335fa57984f'; \ - BINARY_URL='https://github.com/adoptium/temurin19-binaries/releases/download/jdk-19.0.2%2B7/OpenJDK19U-jdk_aarch64_linux_hotspot_19.0.2_7.tar.gz'; \ - ;; \ - armhf|armv7l) \ - ESUM='6a51cb3868b5a3b81848a0d276267230ff3f8639f20ba9ae9ef1d386440bf1fd'; \ - BINARY_URL='https://github.com/adoptium/temurin19-binaries/releases/download/jdk-19.0.2%2B7/OpenJDK19U-jdk_arm_linux_hotspot_19.0.2_7.tar.gz'; \ + ESUM='3ce6a2b357e2ef45fd6b53d6587aa05bfec7771e7fb982f2c964f6b771b7526a'; \ + BINARY_URL='https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.2%2B13/OpenJDK21U-jdk_aarch64_linux_hotspot_21.0.2_13.tar.gz'; \ ;; \ amd64|x86_64) \ - ESUM='3a3ba7a3f8c3a5999e2c91ea1dca843435a0d1c43737bd2f6822b2f02fc52165'; \ - BINARY_URL='https://github.com/adoptium/temurin19-binaries/releases/download/jdk-19.0.2%2B7/OpenJDK19U-jdk_x64_linux_hotspot_19.0.2_7.tar.gz'; \ + ESUM='454bebb2c9fe48d981341461ffb6bf1017c7b7c6e15c6b0c29b959194ba3aaa5'; \ + BINARY_URL='https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.2%2B13/OpenJDK21U-jdk_x64_linux_hotspot_21.0.2_13.tar.gz'; \ ;; \ *) \ echo "Unsupported arch: ${ARCH}"; \ @@ -63,7 +59,6 @@ RUN set -eux; \ tar -xf /tmp/openjdk.tar.gz --strip-components=1; \ rm -rf /tmp/openjdk.tar.gz; - COPY --chown=penpot:penpot ./bundle-backend/ /opt/penpot/backend/ USER penpot:penpot diff --git a/docker/images/Dockerfile.exporter b/docker/images/Dockerfile.exporter index 9ddd9ecc7..0c47f63a3 100644 --- a/docker/images/Dockerfile.exporter +++ b/docker/images/Dockerfile.exporter @@ -3,7 +3,7 @@ LABEL maintainer="Andrey Antukh " ENV LANG=en_US.UTF-8 \ LC_ALL=en_US.UTF-8 \ - NODE_VERSION=v18.15.0 \ + NODE_VERSION=v20.11.1 \ DEBIAN_FRONTEND=noninteractive \ PATH=/opt/node/bin:$PATH @@ -75,26 +75,23 @@ RUN set -eux; \ ARCH="$(dpkg --print-architecture)"; \ case "${ARCH}" in \ aarch64|arm64) \ - BINARY_URL="https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-linux-arm64.tar.xz"; \ - ;; \ - armhf|armv7l) \ - BINARY_URL="https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-linux-armv7l.tar.xz"; \ + BINARY_URL="https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-linux-arm64.tar.gz"; \ ;; \ amd64|x86_64) \ - BINARY_URL="https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-linux-x64.tar.xz"; \ + BINARY_URL="https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-linux-x64.tar.gz"; \ ;; \ *) \ echo "Unsupported arch: ${ARCH}"; \ exit 1; \ ;; \ esac; \ - curl -LfsSo /tmp/nodejs.tar.xz ${BINARY_URL}; \ + curl -LfsSo /tmp/nodejs.tar.gz ${BINARY_URL}; \ mkdir -p /opt/node; \ cd /opt/node; \ - tar -xf /tmp/nodejs.tar.xz --strip-components=1; \ + tar -xf /tmp/nodejs.tar.gz --strip-components=1; \ chown -R root /opt/node; \ npm install -g yarn; \ - rm -rf /tmp/nodejs.tar.xz; \ + rm -rf /tmp/nodejs.tar.gz; \ mkdir -p /opt/penpot; \ chown -R penpot:penpot /opt/penpot; -- Gitee From 34534c924feb1d842df057dce850ef4bf6155f89 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 10 Apr 2024 09:47:59 +0200 Subject: [PATCH 0258/1266] :sparkles: Set smaller default deletion delay for devenv And make the deletion delay configurable --- backend/scripts/repl | 2 ++ backend/scripts/start-dev | 3 +++ backend/src/app/config.clj | 6 +++++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/backend/scripts/repl b/backend/scripts/repl index ddc2fba5f..057018a11 100755 --- a/backend/scripts/repl +++ b/backend/scripts/repl @@ -29,6 +29,8 @@ export PENPOT_FLAGS="\ enable-file-validation \ enable-file-schema-validation"; +# Default deletion delay for devenv +export PENPOT_DELETION_DELAY="24h" # Setup default upload media file size to 100MiB export PENPOT_MEDIA_MAX_FILE_SIZE=104857600 diff --git a/backend/scripts/start-dev b/backend/scripts/start-dev index fe81a240a..55f5e835a 100755 --- a/backend/scripts/start-dev +++ b/backend/scripts/start-dev @@ -32,6 +32,9 @@ export OPTIONS=" -J-XX:+UnlockDiagnosticVMOptions \ -J-XX:+DebugNonSafepoints" +# Default deletion delay for devenv +export PENPOT_DELETION_DELAY="24h" + # Setup default upload media file size to 100MiB export PENPOT_MEDIA_MAX_FILE_SIZE=104857600 diff --git a/backend/src/app/config.clj b/backend/src/app/config.clj index a9e883b8f..402cbb35c 100644 --- a/backend/src/app/config.clj +++ b/backend/src/app/config.clj @@ -101,6 +101,8 @@ (s/def ::audit-log-archive-uri ::us/string) (s/def ::audit-log-http-handler-concurrency ::us/integer) +(s/def ::deletion-delay ::dt/duration) + (s/def ::admins ::us/set-of-valid-emails) (s/def ::file-change-snapshot-every ::us/integer) (s/def ::file-change-snapshot-timeout ::dt/duration) @@ -214,6 +216,7 @@ (s/keys :opt-un [::secret-key ::flags ::admins + ::deletion-delay ::allow-demo-users ::audit-log-archive-uri ::audit-log-http-handler-concurrency @@ -380,7 +383,8 @@ (defonce ^:dynamic flags (parse-flags config)) (def deletion-delay - (dt/duration {:days 7})) + (or (c/get config :deletion-delay) + (dt/duration {:days 7}))) (defn get "A configuration getter. Helps code be more testable." -- Gitee From f18be260545dcc1338ffbb4a8a8f356e754e1bb5 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 10 Apr 2024 09:48:34 +0200 Subject: [PATCH 0259/1266] :paperclip: Change log levels on webhooks loggers ns --- backend/src/app/loggers/webhooks.clj | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/backend/src/app/loggers/webhooks.clj b/backend/src/app/loggers/webhooks.clj index 3982aa48e..5f13bc55b 100644 --- a/backend/src/app/loggers/webhooks.clj +++ b/backend/src/app/loggers/webhooks.clj @@ -136,11 +136,11 @@ "application/transit+json" (t/encode-str event) "application/x-www-form-urlencoded" (uri/map->query-string event))] - (l/debug :hint "run webhook" - :event-name (:name event) - :webhook-id (:id whook) - :webhook-uri (:uri whook) - :webhook-mtype (:mtype whook)) + (l/dbg :hint "run webhook" + :event-name (:name event) + :webhook-id (:id whook) + :webhook-uri (:uri whook) + :webhook-mtype (:mtype whook)) (let [req {:uri (:uri whook) :headers {"content-type" (:mtype whook) @@ -158,8 +158,8 @@ (report-delivery! whook req nil err) (update-webhook! whook err) (when (= err "unknown") - (l/error :hint "unknown error on webhook request" - :cause cause)))))))))) + (l/err :hint "unknown error on webhook request" + :cause cause)))))))))) (defn interpret-response [{:keys [status] :as response}] -- Gitee From 6b552fd8a9e74253d6f7c5d040d0c321c8b78127 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 10 Apr 2024 09:49:02 +0200 Subject: [PATCH 0260/1266] :bug: Don't run file-gc on deleted files --- backend/src/app/tasks/file_gc.clj | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/app/tasks/file_gc.clj b/backend/src/app/tasks/file_gc.clj index ed7815f68..88f1a74b4 100644 --- a/backend/src/app/tasks/file_gc.clj +++ b/backend/src/app/tasks/file_gc.clj @@ -79,6 +79,7 @@ FROM file AS f WHERE f.has_media_trimmed IS false AND f.modified_at < now() - ?::interval + AND f.deleted_at IS NULL ORDER BY f.modified_at DESC FOR UPDATE SKIP LOCKED") -- Gitee From 9c25723ee3932b3f797ab13484b64569998881db Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 10 Apr 2024 09:49:24 +0200 Subject: [PATCH 0261/1266] :paperclip: Add note about fragments on object-gc ns --- backend/src/app/tasks/objects_gc.clj | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/src/app/tasks/objects_gc.clj b/backend/src/app/tasks/objects_gc.clj index c5e74ce3a..3caed3271 100644 --- a/backend/src/app/tasks/objects_gc.clj +++ b/backend/src/app/tasks/objects_gc.clj @@ -210,6 +210,9 @@ :project-id (str project-id) :deleted-at (dt/format-instant deleted-at)) + ;; NOTE: fragments not handled here because they have + ;; cascade. + ;; And finally, permanently delete the file. (db/delete! conn :file {:id id}) @@ -230,7 +233,6 @@ (inc total)) 0))) - (def ^:private sql:get-file-thumbnails "SELECT file_id, revn, media_id, deleted_at FROM file_thumbnail -- Gitee From fd0a760b779adf3689c066737f18afef6a6f2180 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 10 Apr 2024 09:49:41 +0200 Subject: [PATCH 0262/1266] :paperclip: Fix log levels on common file migrations --- common/src/app/common/files/migrations.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/app/common/files/migrations.cljc b/common/src/app/common/files/migrations.cljc index b62521b8f..36860b43e 100644 --- a/common/src/app/common/files/migrations.cljc +++ b/common/src/app/common/files/migrations.cljc @@ -45,7 +45,7 @@ data data] (if-let [[to-version migrate-fn] (first migrations)] (let [migrate-fn (or migrate-fn identity)] - (l/inf :hint "migrate file" + (l/trc :hint "migrate file" :op (if (>= from-version to-version) "down" "up") :file-id (str (:id data)) :version to-version) -- Gitee From 79fbbe0bee742450bd7d63abc5d006bc4da8886a Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 10 Apr 2024 10:24:56 +0200 Subject: [PATCH 0263/1266] :paperclip: Don't report invalid image validation errors --- backend/src/app/http/errors.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/app/http/errors.clj b/backend/src/app/http/errors.clj index 47a9a4dde..14f4cb223 100644 --- a/backend/src/app/http/errors.clj +++ b/backend/src/app/http/errors.clj @@ -99,7 +99,7 @@ (= code :invalid-image) (binding [l/*context* (request->context request)] (let [cause (or parent-cause err)] - (l/error :hint "unexpected error on processing image" :cause cause) + (l/warn :hint "unexpected error on processing image" :cause cause) {::rres/status 400 ::rres/body data})) :else -- Gitee From 352c13881a92a667e7e99c046c3be4828d87348a Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 10 Apr 2024 11:02:52 +0200 Subject: [PATCH 0264/1266] :bug: Fix exporter dockerfile issue related to yarn update --- .yarnrc.yml | 2 ++ docker/images/Dockerfile.exporter | 7 ++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.yarnrc.yml b/.yarnrc.yml index 896c0eefc..5a0ce9a8b 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -6,4 +6,6 @@ enableImmutableInstalls: false enableTelemetry: false +httpTimeout: 600000 + nodeLinker: node-modules diff --git a/docker/images/Dockerfile.exporter b/docker/images/Dockerfile.exporter index 0c47f63a3..0268324c4 100644 --- a/docker/images/Dockerfile.exporter +++ b/docker/images/Dockerfile.exporter @@ -90,7 +90,7 @@ RUN set -eux; \ cd /opt/node; \ tar -xf /tmp/nodejs.tar.gz --strip-components=1; \ chown -R root /opt/node; \ - npm install -g yarn; \ + corepack enable; \ rm -rf /tmp/nodejs.tar.gz; \ mkdir -p /opt/penpot; \ chown -R penpot:penpot /opt/penpot; @@ -101,7 +101,8 @@ WORKDIR /opt/penpot/exporter USER penpot:penpot RUN set -ex; \ - yarn --network-timeout 1000000; \ - yarn --network-timeout 1000000 run playwright install chromium; + yarn config set httpTimeout 600000; \ + yarn install; \ + yarn run playwright install chromium; CMD ["node", "app.js"] -- Gitee From b3456d0f7f6f3478e1eaf8cddfcc9e7d743c3670 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 10 Apr 2024 12:07:40 +0200 Subject: [PATCH 0265/1266] :bug: Fix incorrect feature handling --- common/src/app/common/features.cljc | 17 +++++++---------- frontend/src/app/main/features.cljs | 1 - 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/common/src/app/common/features.cljc b/common/src/app/common/features.cljc index 7c670a9bd..e0b10c0b2 100644 --- a/common/src/app/common/features.cljc +++ b/common/src/app/common/features.cljc @@ -50,12 +50,8 @@ "styles/v2" "layout/grid"}) -;; A set of features enabled by default for each file, they are -;; implicit and are enabled by default and can't be disabled. The -;; features listed in this set are mainly freatures addedby file -;; migrations process, so all features referenced in migrations should -;; be here. -(def default-enabled-features +;; A set of features enabled by default +(def default-features #{"fdata/shape-data-type" "styles/v2" "layout/grid" @@ -81,7 +77,8 @@ (def no-migration-features (-> #{"fdata/objects-map" "fdata/pointer-map" - "layout/grid"} + "layout/grid" + "fdata/shape-data-type"} (into frontend-only-features))) (sm/def! ::features @@ -132,7 +129,7 @@ (defn get-enabled-features "Get the globally enabled fratures set." [flags] - (into default-enabled-features xf-flag-to-feature flags)) + (into default-features xf-flag-to-feature flags)) (defn get-team-enabled-features "Get the team enabled features. @@ -246,7 +243,7 @@ (let [not-supported (-> (or source-features #{}) (set/difference destination-features) (set/difference no-migration-features) - (set/difference default-enabled-features) + (set/difference default-features) (seq))] (when not-supported (ex/raise :type :restriction @@ -258,7 +255,7 @@ (let [not-supported (-> (or destination-features #{}) (set/difference source-features) (set/difference no-migration-features) - (set/difference default-enabled-features) + (set/difference default-features) (seq))] (when not-supported (ex/raise :type :restriction diff --git a/frontend/src/app/main/features.cljs b/frontend/src/app/main/features.cljs index 51b30ed17..e5a5f7c2b 100644 --- a/frontend/src/app/main/features.cljs +++ b/frontend/src/app/main/features.cljs @@ -35,7 +35,6 @@ (-> global-enabled-features (set/union (:features/runtime state #{})) (set/intersection cfeat/no-migration-features) - (set/union cfeat/default-enabled-features) (set/union (:features/team state #{})))) (def features-ref -- Gitee From c55ceb4bca149f02fa0a46eb8f3cb0b2bef4c76b Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 10 Apr 2024 13:09:48 +0200 Subject: [PATCH 0266/1266] :sparkles: Add automatic v2 migration process on startup --- backend/src/app/config.clj | 3 +- backend/src/app/main.clj | 6 ++ backend/src/app/migrations/v2.clj | 104 ++++++++++++++++++++++++ backend/src/app/setup.clj | 27 +++++- backend/src/app/srepl/components_v2.clj | 77 ------------------ 5 files changed, 137 insertions(+), 80 deletions(-) create mode 100644 backend/src/app/migrations/v2.clj diff --git a/backend/src/app/config.clj b/backend/src/app/config.clj index 402cbb35c..6cb122621 100644 --- a/backend/src/app/config.clj +++ b/backend/src/app/config.clj @@ -338,7 +338,8 @@ :enable-backend-openapi-doc :enable-backend-worker :enable-secure-session-cookies - :enable-email-verification]) + :enable-email-verification + :enable-v2-migration]) (defn- parse-flags [config] diff --git a/backend/src/app/main.clj b/backend/src/app/main.clj index 7aba876e4..6d5fc3d5f 100644 --- a/backend/src/app/main.clj +++ b/backend/src/app/main.clj @@ -24,6 +24,7 @@ [app.loggers.webhooks :as-alias webhooks] [app.metrics :as-alias mtx] [app.metrics.definition :as-alias mdef] + [app.migrations.v2 :as migrations.v2] [app.msgbus :as-alias mbus] [app.redis :as-alias rds] [app.rpc :as-alias rpc] @@ -582,6 +583,11 @@ (nrepl/start-server :bind "0.0.0.0" :port 6064 :handler cider-nrepl-handler)) (start) + + (when (contains? cf/flags :v2-migration) + (px/sleep 5000) + (migrations.v2/migrate app.main/system)) + (deref p)) (catch Throwable cause (binding [*out* *err*] diff --git a/backend/src/app/migrations/v2.clj b/backend/src/app/migrations/v2.clj new file mode 100644 index 000000000..9d9d2e5bf --- /dev/null +++ b/backend/src/app/migrations/v2.clj @@ -0,0 +1,104 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.migrations.v2 + (:require + [app.common.exceptions :as ex] + [app.common.logging :as l] + [app.db :as db] + [app.features.components-v2 :as feat] + [app.setup :as setup] + [app.util.time :as dt])) + +(def ^:private sql:get-teams + "SELECT id, features, + row_number() OVER (ORDER BY created_at DESC) AS rown + FROM team + WHERE deleted_at IS NULL + AND (features <@ '{components/v2}' OR features IS NULL) + ORDER BY created_at DESC") + +(defn- get-teams + [conn] + (->> (db/cursor conn [sql:get-teams] {:chunk-size 1}) + (map feat/decode-row))) + +(defn- migrate-teams + [{:keys [::db/conn] :as system}] + ;; Allow long running transaction for this connection + (db/exec-one! conn ["SET LOCAL idle_in_transaction_session_timeout = 0"]) + + ;; Do not allow other migration running in the same time + (db/xact-lock! conn 0) + + ;; Run teams migration + (run! (fn [{:keys [id rown]}] + (try + (-> (assoc system ::db/rollback true) + (feat/migrate-team! id + :rown rown + :label "v2-migration" + :validate? false + :skip-on-graphics-error? true)) + (catch Throwable _ + (swap! feat/*stats* update :errors (fnil inc 0)) + (l/wrn :hint "error on migrating team (skiping)")))) + (get-teams conn)) + + (setup/set-prop! system :v2-migrated true)) + +(defn migrate + [system] + (let [tpoint (dt/tpoint) + stats (atom {}) + migrated? (setup/get-prop system :v2-migrated false)] + + (when-not migrated? + (l/inf :hint "v2 migration started" + :files (:processed-files stats)) + (try + (binding [feat/*stats* stats] + (db/tx-run! system migrate-teams)) + + (let [stats (deref stats) + elapsed (dt/format-duration (tpoint))] + (l/inf :hint "v2 migration finished" + :files (:processed-files stats) + :teams (:processed-teams stats) + :errors (:errors stats) + :elapsed elapsed)) + + (catch Throwable cause + (l/err :hint "error on aplying v2 migration" :cause cause)))))) + +(def ^:private required-services + [[:app.main/assets :app.storage.s3/backend] + [:app.main/assets :app.storage.fs/backend] + :app.storage/storage + :app.db/pool + :app.setup/props + :app.svgo/optimizer + :app.metrics/metrics + :app.migrations/migrations + :app.http.client/client]) + +(defn -main + [& _args] + (try + (let [config-var (requiring-resolve 'app.main/system-config) + start-var (requiring-resolve 'app.main/start-custom) + stop-var (requiring-resolve 'app.main/stop) + system-var (requiring-resolve 'app.main/system) + config (select-keys @config-var required-services)] + + (start-var config) + (migrate @system-var) + (stop-var) + (System/exit 0)) + (catch Throwable cause + (ex/print-throwable cause) + (flush) + (System/exit -1)))) diff --git a/backend/src/app/setup.clj b/backend/src/app/setup.clj index d187f3e5f..68df58330 100644 --- a/backend/src/app/setup.clj +++ b/backend/src/app/setup.clj @@ -7,6 +7,7 @@ (ns app.setup "Initial data setup of instance." (:require + [app.common.data :as d] [app.common.logging :as l] [app.common.spec :as us] [app.common.uuid :as uuid] @@ -25,7 +26,7 @@ (bc/bytes->b64u) (bc/bytes->str))) -(defn- retrieve-all +(defn- get-all-props [conn] (->> (db/query conn :server-prop {:preload true}) (filter #(not= "secret-key" (:id %))) @@ -50,6 +51,28 @@ :cause cause)))) instance-id))) + +(def sql:add-prop + "INSERT INTO server_prop (id, content, preload) + VALUES (?, ?, ?) + ON CONFLICT (id) + DO UPDATE SET content=?, preload=?") + +(defn get-prop + ([system prop] (get-prop system prop nil)) + ([system prop default] + (let [prop (d/name prop)] + (db/run! system (fn [{:keys [::db/conn]}] + (or (db/get* conn :server-prop {:id prop}) + default)))))) + +(defn set-prop! + [system prop value] + (let [value (db/tjson value) + prop (d/name prop)] + (db/run! system (fn [{:keys [::db/conn]}] + (db/exec-one! conn [sql:add-prop prop value false value false]))))) + (s/def ::key ::us/string) (s/def ::props (s/map-of ::us/keyword some?)) @@ -67,7 +90,7 @@ "PENPOT_SECRET_KEY environment variable"))) (let [secret (or key (generate-random-key))] - (-> (retrieve-all conn) + (-> (get-all-props conn) (assoc :secret-key secret) (assoc :tokens-key (keys/derive secret :salt "tokens")) (update :instance-id handle-instance-id conn (db/read-only? pool)))))) diff --git a/backend/src/app/srepl/components_v2.clj b/backend/src/app/srepl/components_v2.clj index 5553d81d1..27a8d9825 100644 --- a/backend/src/app/srepl/components_v2.clj +++ b/backend/src/app/srepl/components_v2.clj @@ -6,7 +6,6 @@ (ns app.srepl.components-v2 (:require - [app.common.exceptions :as ex] [app.common.fressian :as fres] [app.common.logging :as l] [app.db :as db] @@ -305,79 +304,3 @@ (let [elapsed (dt/format-duration (tpoint))] (l/dbg :hint "populate:end" :elapsed elapsed)))))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; MAIN (SCRIPT ENTRY POINT) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(def ^:private required-services - [[:app.main/assets :app.storage.s3/backend] - [:app.main/assets :app.storage.fs/backend] - :app.storage/storage - :app.db/pool - :app.setup/props - :app.svgo/optimizer - :app.metrics/metrics - :app.migrations/migrations - :app.http.client/client]) - -(def ^:private sql:get-teams-by-created-at - "SELECT id, features, - row_number() OVER (ORDER BY created_at DESC) AS rown - FROM team - WHERE deleted_at IS NULL - ORDER BY created_at DESC") - -(defn- get-teams - [conn] - (->> (db/cursor conn [sql:get-teams-by-created-at] {:chunk-size 1}) - (map feat/decode-row) - (remove (fn [{:keys [features]}] - (contains? features "components/v2"))))) - -(defn- migrate-teams - [{:keys [::db/conn] :as system}] - (db/exec-one! conn ["SET LOCAL idle_in_transaction_session_timeout = 0"]) - (run! (fn [{:keys [id rown]}] - (try - (-> (assoc system ::db/rollback true) - (feat/migrate-team! id - :rown rown - :label "migration-v2" - :validate? false - :skip-on-graphics-error? true)) - (catch Throwable _ - (swap! feat/*stats* update :errors (fnil inc 0)) - (l/wrn :hint "error on migrating team (skiping)")))) - (get-teams conn))) - -(defn run-migration - [] - (let [config (select-keys main/system-config required-services) - tpoint (dt/tpoint) - stats (atom {})] - (main/start-custom config) - - (binding [feat/*stats* stats] - (db/tx-run! main/system migrate-teams)) - - (let [stats (deref stats) - elapsed (dt/format-duration (tpoint))] - (l/inf :hint "migration finished" - :files (:processed-files stats) - :teams (:processed-teams stats) - :errors (:errors stats) - :elapsed elapsed)) - - (main/stop))) - -(defn -main - [& _args] - (try - (run-migration) - (System/exit 0) - - (catch Throwable cause - (ex/print-throwable cause) - (flush) - (System/exit -1)))) -- Gitee From 0bc5a80c5169c04884dc762699d9a55d4dd4c948 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 10 Apr 2024 14:58:12 +0200 Subject: [PATCH 0267/1266] :sparkles: Add missing .yarnrc.yml on exporter bundle --- docker/images/Dockerfile.exporter | 1 - exporter/scripts/build | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/images/Dockerfile.exporter b/docker/images/Dockerfile.exporter index 0268324c4..e4fceec85 100644 --- a/docker/images/Dockerfile.exporter +++ b/docker/images/Dockerfile.exporter @@ -101,7 +101,6 @@ WORKDIR /opt/penpot/exporter USER penpot:penpot RUN set -ex; \ - yarn config set httpTimeout 600000; \ yarn install; \ yarn run playwright install chromium; diff --git a/exporter/scripts/build b/exporter/scripts/build index 2fd75a309..004460584 100755 --- a/exporter/scripts/build +++ b/exporter/scripts/build @@ -16,6 +16,7 @@ clojure -J-Xms100M -J-Xmx1000M -J-XX:+UseSerialGC -M:dev:shadow-cljs release mai rm -rf target/app; # Copy package*.json files +cp ../.yarnrc.yml target/; cp yarn.lock target/; cp package.json target/; -- Gitee From 7d36cf1b5e3d5f46d71183c6b933d3bfb20dbc16 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 10 Apr 2024 15:00:01 +0200 Subject: [PATCH 0268/1266] :sparkles: Add missing jvm parameter on backend run.sh template --- backend/scripts/run.template.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/scripts/run.template.sh b/backend/scripts/run.template.sh index 17428ed15..345cef2fb 100644 --- a/backend/scripts/run.template.sh +++ b/backend/scripts/run.template.sh @@ -18,7 +18,7 @@ if [ -f ./environ ]; then source ./environ fi -export JVM_OPTS="-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager -Dlog4j2.configurationFile=log4j2.xml -XX:-OmitStackTraceInFastThrow --enable-preview $JVM_OPTS" +export JVM_OPTS="-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager -Dlog4j2.configurationFile=log4j2.xml -XX:-OmitStackTraceInFastThrow -Dpolyglot.engine.WarnInterpreterOnly=false --enable-preview $JVM_OPTS" ENTRYPOINT=${1:-app.main}; -- Gitee From 347276fb4e12ff6752c6b2285fac69f61cc36d83 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 10 Apr 2024 15:26:33 +0200 Subject: [PATCH 0269/1266] :bug: Fix incorrect team features handling on onboarding team creation --- backend/src/app/rpc/commands/teams.clj | 7 ++++++- frontend/src/app/main/data/dashboard.cljs | 10 +++++----- frontend/src/app/main/ui/onboarding/team_choice.cljs | 4 ++-- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/backend/src/app/rpc/commands/teams.clj b/backend/src/app/rpc/commands/teams.clj index f62f8bc6a..7a21a1241 100644 --- a/backend/src/app/rpc/commands/teams.clj +++ b/backend/src/app/rpc/commands/teams.clj @@ -869,7 +869,12 @@ ::sm/params schema:create-team-with-invitations} [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id emails role] :as params}] (db/with-atomic [conn pool] - (let [params (assoc params :profile-id profile-id) + + (let [features (-> (cfeat/get-enabled-features cf/flags) + (cfeat/check-client-features! (:features params))) + params (assoc params + :profile-id profile-id + :features features) cfg (assoc cfg ::db/conn conn) team (create-team cfg params) profile (db/get-by-id conn :profile profile-id) diff --git a/frontend/src/app/main/data/dashboard.cljs b/frontend/src/app/main/data/dashboard.cljs index bde91339d..267e299e2 100644 --- a/frontend/src/app/main/data/dashboard.cljs +++ b/frontend/src/app/main/data/dashboard.cljs @@ -425,11 +425,11 @@ (let [{:keys [on-success on-error] :or {on-success identity on-error rx/throw}} (meta params) - features (features/get-enabled-features state)] - params {:name name - :emails #{emails} - :role role - :features features} + features (features/get-enabled-features state) + params {:name name + :emails emails + :role role + :features features}] (->> (rp/cmd! :create-team-with-invitations params) (rx/tap on-success) (rx/map team-created) diff --git a/frontend/src/app/main/ui/onboarding/team_choice.cljs b/frontend/src/app/main/ui/onboarding/team_choice.cljs index a3a007c38..86b710bcf 100644 --- a/frontend/src/app/main/ui/onboarding/team_choice.cljs +++ b/frontend/src/app/main/ui/onboarding/team_choice.cljs @@ -154,7 +154,7 @@ params (:clean-data @form) emails (:emails params) - roles (mf/use-memo #(get-available-roles)) + roles (mf/use-memo get-available-roles) on-success (mf/use-fn @@ -168,7 +168,7 @@ on-error (mf/use-fn - (fn [_form _response] + (fn [_form _cause] (st/emit! (msg/error "Error on creating team.")))) ;; The SKIP branch only creates the team, without invitations -- Gitee From 6fa2137335f4b014a773a06f57bc718354e2d7e4 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 10 Apr 2024 15:50:25 +0200 Subject: [PATCH 0270/1266] :bug: Fix problem with colorpicker --- frontend/src/app/main/ui/workspace/colorpicker.cljs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/colorpicker.cljs b/frontend/src/app/main/ui/workspace/colorpicker.cljs index bfcb839db..048314f55 100644 --- a/frontend/src/app/main/ui/workspace/colorpicker.cljs +++ b/frontend/src/app/main/ui/workspace/colorpicker.cljs @@ -118,12 +118,9 @@ on-change-tab (mf/use-fn - (fn [event] - (let [tab (-> (dom/get-current-target event) - (dom/get-data "tab") - (keyword))] - (reset! active-color-tab tab) - (dc/set-active-color-tab! tab)))) + (fn [tab] + (reset! active-color-tab tab) + (dc/set-active-color-tab! tab))) handle-change-mode (mf/use-fn -- Gitee From 928fbd8e38efe0cad4f528e9f9ecd70ea7027a07 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Wed, 10 Apr 2024 15:47:16 +0200 Subject: [PATCH 0271/1266] :bug: Fix old texts with empty fills --- frontend/src/app/main/data/workspace/texts.cljs | 2 +- frontend/src/app/main/ui/shapes/text/styles.cljs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/src/app/main/data/workspace/texts.cljs b/frontend/src/app/main/data/workspace/texts.cljs index c42a65378..f9c7cbc7c 100644 --- a/frontend/src/app/main/data/workspace/texts.cljs +++ b/frontend/src/app/main/data/workspace/texts.cljs @@ -287,7 +287,7 @@ (nil? (:fills node)) (assoc :fills (:fills txt/default-text-attrs)) - (and (d/not-empty? color-attrs) (nil? (:fills node))) + (and (d/not-empty? color-attrs) (empty? (:fills node))) (-> (dissoc :fill-color :fill-opacity :fill-color-ref-id :fill-color-ref-file :fill-color-gradient) (assoc :fills [color-attrs]))))) diff --git a/frontend/src/app/main/ui/shapes/text/styles.cljs b/frontend/src/app/main/ui/shapes/text/styles.cljs index c8fbf2053..7d46c98ed 100644 --- a/frontend/src/app/main/ui/shapes/text/styles.cljs +++ b/frontend/src/app/main/ui/shapes/text/styles.cljs @@ -101,9 +101,6 @@ :textRendering "geometricPrecision"} fills (cond - (some? (:fills data)) - (:fills data) - ;; DEPRECATED: still here for backward compatibility with ;; old penpot files that still has a single color. (or (some? (:fill-color data)) @@ -113,7 +110,10 @@ :fill-color-ref-id :fill-color-ref-file]))] (nil? (:fills data)) - [{:fill-color "#000000" :fill-opacity 1}]) + [{:fill-color "#000000" :fill-opacity 1}] + + :else + (:fills data)) font (some->> font-id (get fontsdb)) -- Gitee From d22ae22aad5d38c353b7348ee82d1b867b618ba7 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Wed, 10 Apr 2024 10:40:35 +0200 Subject: [PATCH 0272/1266] :bug: Fix no visual cue if user want to create anotation with only spaces --- .../main/ui/workspace/sidebar/options/menus/component.cljs | 2 +- .../main/ui/workspace/sidebar/options/menus/component.scss | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.cljs index 570b25faf..8ae04081b 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.cljs @@ -184,7 +184,7 @@ :class (stl/css-case :icon true :icon-tick true - :hidden invalid-text?)} + :invalid invalid-text?)} i/tick] [:div {:class (stl/css :icon :icon-cross) :title (tr "labels.discard") diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.scss b/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.scss index d024187a7..18300d371 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.scss +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/component.scss @@ -566,6 +566,13 @@ } } + &.icon-tick.invalid:hover { + cursor: default; + svg { + stroke: var(--icon-foreground); + } + } + &.icon-cross:hover, &.icon-trash:hover { svg { -- Gitee From 2f89512a7567fec32039645042621079ff4faa21 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 11 Apr 2024 07:27:36 +0200 Subject: [PATCH 0273/1266] :bug: Fix project line shows an extra space after the number of files --- frontend/src/app/main/ui/dashboard/projects.cljs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/main/ui/dashboard/projects.cljs b/frontend/src/app/main/ui/dashboard/projects.cljs index fc0a51f97..cdd9304e9 100644 --- a/frontend/src/app/main/ui/dashboard/projects.cljs +++ b/frontend/src/app/main/ui/dashboard/projects.cljs @@ -312,11 +312,13 @@ :on-menu-close on-menu-close :on-import on-import}] - [:span {:class (stl/css :info)} (str (tr "labels.num-of-files" (i18n/c file-count)))] + ;; We group these two spans under a div to avoid having extra space between them. + [:div + [:span {:class (stl/css :info)} (str (tr "labels.num-of-files" (i18n/c file-count)))] - (let [time (-> (:modified-at project) - (dt/timeago {:locale locale}))] - [:span {:class (stl/css :recent-files-row-title-info)} (str ", " time)]) + (let [time (-> (:modified-at project) + (dt/timeago {:locale locale}))] + [:span {:class (stl/css :recent-files-row-title-info)} (str ", " time)])] [:div {:class (stl/css-case :project-actions true :pinned-project (:is-pinned project))} -- Gitee From 1b17664ade177b55561c3d01f57e4683fd6bb039 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 11 Apr 2024 07:19:08 +0200 Subject: [PATCH 0274/1266] :bug: Fix gradient stroke breaks arrow-ended paths --- frontend/src/app/main/ui/shapes/custom_stroke.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/shapes/custom_stroke.cljs b/frontend/src/app/main/ui/shapes/custom_stroke.cljs index 35d2bd7f0..ed317cdbd 100644 --- a/frontend/src/app/main/ui/shapes/custom_stroke.cljs +++ b/frontend/src/app/main/ui/shapes/custom_stroke.cljs @@ -91,7 +91,7 @@ color (cond (some? gradient) - (str/ffmt "url(#stroke-color-gradient-%s-%s)" render-id index) + (str/ffmt "url(#stroke-color-gradient-%-%)" render-id index) (some? image) (str/ffmt "url(#stroke-fill-%-%)" render-id index) -- Gitee From 9cbbe1565d22acc7c58646e20ed386336f019262 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Wed, 10 Apr 2024 15:53:52 +0200 Subject: [PATCH 0275/1266] :bug: Fix crash on copy paste a orphan copy inside a copy --- common/src/app/common/types/file.cljc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/src/app/common/types/file.cljc b/common/src/app/common/types/file.cljc index 12775f322..0c5fbf572 100644 --- a/common/src/app/common/types/file.cljc +++ b/common/src/app/common/types/file.cljc @@ -219,11 +219,11 @@ (defn advance-shape-ref "Get the shape-ref of the near main of the shape, recursively repeated as many times as the given levels." - [file container libraries shape levels & options] - (let [ref-shape (find-ref-shape file container libraries shape options)] + [file container libraries shape levels & {:keys [include-deleted?] :or {include-deleted? false}}] + (let [ref-shape (find-ref-shape file container libraries shape :include-deleted? include-deleted? :with-context? true)] (if (or (nil? (:shape-ref ref-shape)) (not (pos? levels))) (:id ref-shape) - (advance-shape-ref file container libraries ref-shape (dec levels) options)))) + (advance-shape-ref file (:container (meta ref-shape)) libraries ref-shape (dec levels) :include-deleted? include-deleted?)))) (defn find-ref-component "Locate the nearest component in the local file or libraries that is referenced by the -- Gitee From 2e23f190815a4c54d8ed178cc98e380cc4a8e5b7 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 11 Apr 2024 10:24:57 +0200 Subject: [PATCH 0276/1266] :bug: Fix problem with text fills --- .../src/app/main/data/workspace/texts.cljs | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/main/data/workspace/texts.cljs b/frontend/src/app/main/data/workspace/texts.cljs index f9c7cbc7c..bf67c549f 100644 --- a/frontend/src/app/main/data/workspace/texts.cljs +++ b/frontend/src/app/main/data/workspace/texts.cljs @@ -285,11 +285,21 @@ (let [color-attrs (select-keys node [:fill-color :fill-opacity :fill-color-ref-id :fill-color-ref-file :fill-color-gradient])] (cond-> node (nil? (:fills node)) - (assoc :fills (:fills txt/default-text-attrs)) + (assoc :fills []) - (and (d/not-empty? color-attrs) (empty? (:fills node))) + ;; Migrate old colors and remove the old fromat + (d/not-empty? color-attrs) (-> (dissoc :fill-color :fill-opacity :fill-color-ref-id :fill-color-ref-file :fill-color-gradient) - (assoc :fills [color-attrs]))))) + (update :fills conj color-attrs)) + + ;; We don't have the fills attribute. It's an old text without color + ;; so need to be black + (and (nil? (:fills node)) (empty? color-attrs)) + (update :fills conj txt/default-text-attrs) + + ;; Remove duplicates from the fills + :always + (update :fills (comp vec distinct))))) (defn migrate-content [content] @@ -323,7 +333,9 @@ update-shape (fn [shape] - (d/update-when shape :content update-content))] + (-> shape + (dissoc :fills) + (d/update-when :content update-content)))] (rx/of (dch/update-shapes shape-ids update-shape))))))) -- Gitee From b684ee2f8338f38ac7deb98f27418699e159acf5 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 10 Apr 2024 16:52:41 +0200 Subject: [PATCH 0277/1266] :bug: Fix problem when moving copys in the layers panel --- frontend/src/app/main/data/workspace.cljs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index 23e8dd546..52aef6249 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -987,7 +987,9 @@ (cond-> shapes-to-deroot deroot? (conj id)) (cond-> shapes-to-reroot reroot? (conj id))])) [[] [] []] - ids) + (->> ids + (mapcat #(ctn/get-child-heads objects %)) + (map :id))) changes (relocate-shapes-changes it objects -- Gitee From a569a350b4137d8dd8a61e46210c228b425884d7 Mon Sep 17 00:00:00 2001 From: AzazelN28 Date: Thu, 11 Apr 2024 10:41:51 +0200 Subject: [PATCH 0278/1266] :bug: Fix toolbar disappearing --- CHANGES.md | 2 +- frontend/src/app/main/data/workspace/path/drawing.cljs | 3 ++- .../src/app/main/ui/workspace/sidebar/layer_item.cljs | 2 +- frontend/src/app/main/ui/workspace/viewport/hooks.cljs | 8 +++++--- .../src/app/main/ui/workspace/viewport/path_actions.cljs | 3 ++- frontend/src/app/util/dom.cljs | 9 +++++---- 6 files changed, 16 insertions(+), 11 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 7482ad9c5..be9785f21 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -131,7 +131,7 @@ - Fix problem with fix scrolling on nested elements [Github #3508](https://github.com/penpot/penpot/issues/3508) - Fix problem when changing typography assets [Github #3683](https://github.com/penpot/penpot/issues/3683) - Internal error when you copy and paste some main components between files [Taiga #7397](https://tree.taiga.io/project/penpot/issue/7397) - +- Fix toolbar disappearing [Taiga #7411](https://tree.taiga.io/project/penpot/issue/7411) ## 1.19.5 diff --git a/frontend/src/app/main/data/workspace/path/drawing.cljs b/frontend/src/app/main/data/workspace/path/drawing.cljs index f536f3369..3841c3f76 100644 --- a/frontend/src/app/main/data/workspace/path/drawing.cljs +++ b/frontend/src/app/main/data/workspace/path/drawing.cljs @@ -357,7 +357,8 @@ (common/finish-path) (dwdc/clear-drawing))))))) -(defn change-edit-mode [mode] +(defn change-edit-mode + [mode] (ptk/reify ::change-edit-mode ptk/UpdateEvent (update [_ state] diff --git a/frontend/src/app/main/ui/workspace/sidebar/layer_item.cljs b/frontend/src/app/main/ui/workspace/sidebar/layer_item.cljs index a2e008fa9..2f4147a68 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/layer_item.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/layer_item.cljs @@ -333,7 +333,7 @@ ;; NOTE: Neither get-parent-at nor get-parent-with-selector ;; work if the component template changes, so we need to ;; seek for an alternate solution. Maybe use-context? - scroll-node (dom/get-parent-with-data node "scrollContainer") + scroll-node (dom/get-parent-with-data node "scroll-container") parent-node (dom/get-parent-at node 2) first-child-node (dom/get-first-child parent-node) diff --git a/frontend/src/app/main/ui/workspace/viewport/hooks.cljs b/frontend/src/app/main/ui/workspace/viewport/hooks.cljs index d9f1dd1b5..0fba36008 100644 --- a/frontend/src/app/main/ui/workspace/viewport/hooks.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/hooks.cljs @@ -47,9 +47,11 @@ on-paste (actions/on-paste disable-paste in-viewport? workspace-read-only?) on-pointer-down (mf/use-fn (mf/deps drawing-tool drawing-path?) - (fn [_] - (when drawing-path? - (st/emit! (dwe/clear-edition-mode))))) + (fn [e] + (let [target (dom/get-target e) + parent? (dom/get-parent-with-data target "dont-clear-path")] + (when (and drawing-path? (not parent?)) + (st/emit! (dwe/clear-edition-mode)))))) on-blur (mf/use-fn #(st/emit! (mse/->BlurEvent)))] (mf/use-effect diff --git a/frontend/src/app/main/ui/workspace/viewport/path_actions.cljs b/frontend/src/app/main/ui/workspace/viewport/path_actions.cljs index 0da613105..353befcd4 100644 --- a/frontend/src/app/main/ui/workspace/viewport/path_actions.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/path_actions.cljs @@ -142,7 +142,8 @@ (fn [_] (st/emit! (drp/toggle-snap))))] - [:div {:class (stl/css :sub-actions)} + [:div {:class (stl/css :sub-actions) + :data-dont-clear-path true} [:div {:class (stl/css :sub-actions-group)} ;; Draw Mode diff --git a/frontend/src/app/util/dom.cljs b/frontend/src/app/util/dom.cljs index 01d34e582..08b89d364 100644 --- a/frontend/src/app/util/dom.cljs +++ b/frontend/src/app/util/dom.cljs @@ -169,10 +169,11 @@ (defn get-parent-with-data [^js node name] - (loop [current node] - (if (or (nil? current) (obj/in? (.-dataset current) name)) - current - (recur (.-parentElement current))))) + (let [name (str/camel name)] + (loop [current node] + (if (or (nil? current) (obj/in? (.-dataset current) name)) + current + (recur (.-parentElement current)))))) (defn get-parent-with-selector [^js node selector] -- Gitee From 87d0c2ac30e6359089406ddec9f49507e023f003 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 11 Apr 2024 09:55:54 +0200 Subject: [PATCH 0279/1266] :bug: Fix internal error on inspect svg --- frontend/src/app/main/ui/viewer/inspect/attributes/svg.cljs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/main/ui/viewer/inspect/attributes/svg.cljs b/frontend/src/app/main/ui/viewer/inspect/attributes/svg.cljs index b353ad5ba..c64f7d8ee 100644 --- a/frontend/src/app/main/ui/viewer/inspect/attributes/svg.cljs +++ b/frontend/src/app/main/ui/viewer/inspect/attributes/svg.cljs @@ -27,7 +27,7 @@ [:& copy-button {:data (map->css value)}]] (for [[attr-key attr-value] value] - [:& svg-attr {:attr attr-key :value attr-value :key (str/join "svg-key-" attr-key)}])] + [:& svg-attr {:attr attr-key :value attr-value :key (str/join "svg-key-" (d/name attr-key))}])] (let [attr-name (as-> attr $ (d/name $) @@ -45,8 +45,7 @@ [{:keys [shape]}] [:* (for [[attr-key attr-value] (:svg-attrs shape)] - [:& svg-attr {:attr attr-key :value attr-value :key (str/join "svg-block-key" attr-key)}])]) - + [:& svg-attr {:attr attr-key :value attr-value :key (str/join "svg-block-key-" (d/name attr-key))}])]) (mf/defc svg-panel [{:keys [shapes]}] -- Gitee From f1685f6e754c8a30a53e9794c12477c83c3a650f Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Wed, 10 Apr 2024 17:21:26 +0200 Subject: [PATCH 0280/1266] :bug: Fix text length on tabs --- CHANGES.md | 1 + .../app/main/ui/components/tab_container.cljs | 4 +- .../app/main/ui/components/tab_container.scss | 128 ++++++++++-------- .../src/app/main/ui/workspace/sidebar.cljs | 2 +- 4 files changed, 73 insertions(+), 62 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index be9785f21..ed15bda2d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -132,6 +132,7 @@ - Fix problem when changing typography assets [Github #3683](https://github.com/penpot/penpot/issues/3683) - Internal error when you copy and paste some main components between files [Taiga #7397](https://tree.taiga.io/project/penpot/issue/7397) - Fix toolbar disappearing [Taiga #7411](https://tree.taiga.io/project/penpot/issue/7411) +- Fix long text on tab breaks UI [Taiga Issue #7421](https://tree.taiga.io/project/penpot/issue/7421) ## 1.19.5 diff --git a/frontend/src/app/main/ui/components/tab_container.cljs b/frontend/src/app/main/ui/components/tab_container.cljs index 4dae9d52b..bd3ff6727 100644 --- a/frontend/src/app/main/ui/components/tab_container.cljs +++ b/frontend/src/app/main/ui/components/tab_container.cljs @@ -56,12 +56,14 @@ title (.-title props) sid (d/name id)] [:div {:key (str/concat "tab-" sid) + :title title :data-id sid :on-click on-click :class (stl/css-case :tab-container-tab-title true :current (= selected id))} - title]))]] + [:span {:class (stl/css :content)} + title]]))]] [:div {:class (dm/str content-class " " (stl/css :tab-container-content))} (d/seek #(= selected (-> % .-props .-id)) diff --git a/frontend/src/app/main/ui/components/tab_container.scss b/frontend/src/app/main/ui/components/tab_container.scss index 7c9b08b52..80e5b3ea6 100644 --- a/frontend/src/app/main/ui/components/tab_container.scss +++ b/frontend/src/app/main/ui/components/tab_container.scss @@ -21,74 +21,82 @@ cursor: pointer; font-size: $fs-12; height: 100%; - .tab-container-tab-wrapper { - @include flexCenter; - flex-direction: row; - height: 100%; - width: 100%; - .tab-container-tab-title { - @include flexCenter; - @include headlineSmallTypography; - height: 100%; - width: 100%; - padding: 0 $s-8; - margin: 0; - border-radius: $br-8; - background-color: transparent; - color: var(--tab-foreground-color); - white-space: nowrap; - border: $s-2 solid var(--tab-border-color); - svg { - @extend .button-icon; - stroke: var(--tab-foreground-color); - } +} + +.tab-container-tab-wrapper { + display: grid; + grid-auto-flow: column; + height: 100%; + width: 100%; +} - &.current, - &.current:hover { - background: var(--tab-background-color-selected); - border-color: var(--tab-border-color-selected); - color: var(--tab-foreground-color-selected); - svg { - stroke: var(--tab-foreground-color-selected); - } - } - &:hover { - color: var(--tab-foreground-color-hover); - svg { - stroke: var(--tab-foreground-color-hover); - } - } +.tab-container-tab-title { + @include flexCenter; + height: 100%; + width: 100%; + padding: 0 $s-8; + margin: 0; + border-radius: $br-8; + background-color: transparent; + color: var(--tab-foreground-color); + border: $s-2 solid var(--tab-border-color); + min-width: 0; + + svg { + @extend .button-icon; + stroke: var(--tab-foreground-color); + } + .content { + @include headlineSmallTypography; + text-align: center; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + &.current, + &.current:hover { + background: var(--tab-background-color-selected); + border-color: var(--tab-border-color-selected); + color: var(--tab-foreground-color-selected); + svg { + stroke: var(--tab-foreground-color-selected); } } + &:hover { + color: var(--tab-foreground-color-hover); + svg { + stroke: var(--tab-foreground-color-hover); + } + } +} - .collapse-sidebar { +.collapse-sidebar { + @include flexCenter; + @include buttonStyle; + height: 100%; + width: $s-24; + min-width: $s-24; + padding: 0 $s-6; + border-radius: $br-5; + svg { @include flexCenter; - @include buttonStyle; - height: 100%; - width: $s-24; - min-width: $s-24; - padding: 0 $s-6; - border-radius: $br-5; + height: $s-16; + width: $s-16; + stroke: var(--icon-foreground); + transform: rotate(180deg); + fill: none; + color: transparent; + } + &:hover { svg { - @include flexCenter; - height: $s-16; - width: $s-16; - stroke: var(--icon-foreground); - transform: rotate(180deg); - fill: none; - color: transparent; - } - &:hover { - svg { - stroke: var(--icon-foreground-hover); - } + stroke: var(--icon-foreground-hover); } + } - &.collapsed { - svg { - transform: rotate(0deg); - padding: 0 0 0 $s-6; - } + &.collapsed { + svg { + transform: rotate(0deg); + padding: 0 0 0 $s-6; } } } diff --git a/frontend/src/app/main/ui/workspace/sidebar.cljs b/frontend/src/app/main/ui/workspace/sidebar.cljs index 2e2ab4a39..d64842075 100644 --- a/frontend/src/app/main/ui/workspace/sidebar.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar.cljs @@ -167,7 +167,7 @@ :id "right-sidebar-aside" :data-size (str size) - :style #js {"--width" (when can-be-expanded? (dm/str size "px"))}} + :style #js {"--width" (if can-be-expanded? (dm/str size "px") 276)}} (when can-be-expanded? [:div {:class (stl/css :resize-area) :on-pointer-down on-pointer-down -- Gitee From fa00fed69496e0a1c2ee948138e8d1a595258ca9 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 11 Apr 2024 13:29:33 +0200 Subject: [PATCH 0281/1266] :bug: Fix issue with v2 manual migration script --- backend/scripts/run.template.sh | 2 +- backend/src/app/migrations/v2.clj | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/backend/scripts/run.template.sh b/backend/scripts/run.template.sh index 345cef2fb..3d04cdcec 100644 --- a/backend/scripts/run.template.sh +++ b/backend/scripts/run.template.sh @@ -23,4 +23,4 @@ export JVM_OPTS="-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogMan ENTRYPOINT=${1:-app.main}; set -ex -exec $JAVA_CMD $JVM_OPTS "$@" -jar penpot.jar -m $ENTRYPOINT +exec $JAVA_CMD $JVM_OPTS -jar penpot.jar -m $ENTRYPOINT diff --git a/backend/src/app/migrations/v2.clj b/backend/src/app/migrations/v2.clj index 9d9d2e5bf..ff38087c0 100644 --- a/backend/src/app/migrations/v2.clj +++ b/backend/src/app/migrations/v2.clj @@ -57,8 +57,7 @@ migrated? (setup/get-prop system :v2-migrated false)] (when-not migrated? - (l/inf :hint "v2 migration started" - :files (:processed-files stats)) + (l/inf :hint "v2 migration started") (try (binding [feat/*stats* stats] (db/tx-run! system migrate-teams)) -- Gitee From 4d29bff9b521c520272992322caefa706a278bb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Fri, 5 Apr 2024 10:32:25 +0200 Subject: [PATCH 0282/1266] :sparkles: Add playwright to the frontend --- docker/devenv/files/start-tmux.sh | 3 +- frontend/.gitignore | 5 + frontend/package.json | 4 + frontend/playwright.config.js | 47 +++ frontend/playwright/example.spec.js | 14 + .../fixtures/get-profile-anonymous.json | 4 + frontend/yarn.lock | 307 +++++++++++++++++- 7 files changed, 379 insertions(+), 5 deletions(-) create mode 100644 frontend/playwright.config.js create mode 100644 frontend/playwright/example.spec.js create mode 100644 frontend/playwright/fixtures/get-profile-anonymous.json diff --git a/docker/devenv/files/start-tmux.sh b/docker/devenv/files/start-tmux.sh index eb7bb39f4..cbf79a847 100755 --- a/docker/devenv/files/start-tmux.sh +++ b/docker/devenv/files/start-tmux.sh @@ -11,10 +11,11 @@ set -e; echo "[start-tmux.sh] Installing node dependencies" pushd ~/penpot/frontend/ yarn install +yarn run playwright install --with-deps chromium popd pushd ~/penpot/exporter/ yarn install -npx playwright install chromium +yarn run playwright install --with-deps chromium popd tmux -2 new-session -d -s penpot diff --git a/frontend/.gitignore b/frontend/.gitignore index 836120c1e..d69ed5d6f 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -5,3 +5,8 @@ !.yarn/releases !.yarn/sdks !.yarn/versions +node_modules/ +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/frontend/package.json b/frontend/package.json index b17f98bde..ba2d09f72 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -30,11 +30,14 @@ "translations:find-unused": "node ./scripts/find-unused-translations.js", "compile": "node ./scripts/compile.js", "watch": "node ./scripts/watch.js", + "e2e:server": "NODE_NO_WARNINGS=1 http-server ./resources/public -p 3500 -a 0.0.0.0", + "e2e:test": "playwright test", "storybook:compile": "gulp template:storybook && clojure -M:dev:shadow-cljs compile storybook", "storybook:watch": "npm run storybook:compile && concurrently \"clojure -M:dev:shadow-cljs watch storybook\" \"storybook dev -p 6006\"", "storybook:build": "npm run storybook:compile && storybook build" }, "devDependencies": { + "@playwright/test": "^1.42.1", "@storybook/addon-essentials": "^7.6.17", "@storybook/addon-interactions": "^7.6.17", "@storybook/addon-links": "^7.6.17", @@ -59,6 +62,7 @@ "gulp-sass": "^5.1.0", "gulp-sourcemaps": "^3.0.0", "gulp-svg-sprite": "^2.0.3", + "http-server": "^14.1.1", "jsdom": "^24.0.0", "map-stream": "0.0.7", "marked": "^12.0.0", diff --git a/frontend/playwright.config.js b/frontend/playwright.config.js new file mode 100644 index 000000000..73245e3ce --- /dev/null +++ b/frontend/playwright.config.js @@ -0,0 +1,47 @@ +import { defineConfig, devices } from "@playwright/test"; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +/** + * @see https://playwright.dev/docs/test-configuration + */ +export default defineConfig({ + testDir: "./playwright", + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: "html", + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + baseURL: "http://0.0.0.0:3500", + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: "on-first-retry", + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: "chromium", + use: { ...devices["Desktop Chrome"] }, + }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + command: "yarn e2e:server", + url: "http://0.0.0.0:3500", + reuseExistingServer: !process.env.CI, + }, +}); diff --git a/frontend/playwright/example.spec.js b/frontend/playwright/example.spec.js new file mode 100644 index 000000000..1c315a71e --- /dev/null +++ b/frontend/playwright/example.spec.js @@ -0,0 +1,14 @@ +import { test, expect } from "@playwright/test"; + +test("has title", async ({ page }) => { + await page.route("**/api/rpc/command/get-profile", (route) => { + route.fulfill({ + status: 200, + contentType: "application/transit+json", + path: "playwright/fixtures/get-profile-anonymous.json", + }); + }); + await page.goto("/"); + + await expect(page).toHaveTitle(/Penpot/); +}); diff --git a/frontend/playwright/fixtures/get-profile-anonymous.json b/frontend/playwright/fixtures/get-profile-anonymous.json new file mode 100644 index 000000000..3c9c6a632 --- /dev/null +++ b/frontend/playwright/fixtures/get-profile-anonymous.json @@ -0,0 +1,4 @@ +{ + "~:id": "~u00000000-0000-0000-0000-000000000000", + "~:fullname": "Anonymous User" +} diff --git a/frontend/yarn.lock b/frontend/yarn.lock index d4531a5c9..5ba630a73 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -2141,6 +2141,17 @@ __metadata: languageName: node linkType: hard +"@playwright/test@npm:^1.42.1": + version: 1.42.1 + resolution: "@playwright/test@npm:1.42.1" + dependencies: + playwright: "npm:1.42.1" + bin: + playwright: cli.js + checksum: e5d7c1ffedabb934643edb010038edcb70d51d224fb6444844a854d94365a6179d4407a83da176cae37ccd42b62c148843e0b6f9b4c6506048e06558c00d4267 + languageName: node + linkType: hard + "@radix-ui/number@npm:1.0.1": version: 1.0.1 resolution: "@radix-ui/number@npm:1.0.1" @@ -4902,6 +4913,15 @@ __metadata: languageName: node linkType: hard +"async@npm:^2.6.4": + version: 2.6.4 + resolution: "async@npm:2.6.4" + dependencies: + lodash: "npm:^4.17.14" + checksum: 0ebb3273ef96513389520adc88e0d3c45e523d03653cc9b66f5c46f4239444294899bfd13d2b569e7dbfde7da2235c35cf5fd3ece9524f935d41bbe4efccdad0 + languageName: node + linkType: hard + "async@npm:^3.2.3, async@npm:^3.2.4": version: 3.2.5 resolution: "async@npm:3.2.5" @@ -5054,6 +5074,15 @@ __metadata: languageName: node linkType: hard +"basic-auth@npm:^2.0.1": + version: 2.0.1 + resolution: "basic-auth@npm:2.0.1" + dependencies: + safe-buffer: "npm:5.1.2" + checksum: 05f56db3a0fc31c89c86b605231e32ee143fb6ae38dc60616bc0970ae6a0f034172def99e69d3aed0e2c9e7cac84e2d63bc51a0b5ff6ab5fc8808cc8b29923c1 + languageName: node + linkType: hard + "better-opn@npm:^3.0.2": version: 3.0.2 resolution: "better-opn@npm:3.0.2" @@ -5482,6 +5511,19 @@ __metadata: languageName: node linkType: hard +"call-bind@npm:^1.0.7": + version: 1.0.7 + resolution: "call-bind@npm:1.0.7" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + set-function-length: "npm:^1.2.1" + checksum: a3ded2e423b8e2a265983dba81c27e125b48eefb2655e7dfab6be597088da3d47c47976c24bc51b8fd9af1061f8f87b4ab78a314f3c77784b2ae2ba535ad8b8d + languageName: node + linkType: hard + "camelcase@npm:^3.0.0": version: 3.0.0 resolution: "camelcase@npm:3.0.0" @@ -6094,6 +6136,13 @@ __metadata: languageName: node linkType: hard +"corser@npm:^2.0.1": + version: 2.0.1 + resolution: "corser@npm:2.0.1" + checksum: 1f319a752a560342dd22d936e5a4c158bfcbc332524ef5b05a7277236dad8b0b2868fd5cf818559f29954ec4d777d82e797fccd76601fcfe431610e4143c8acc + languageName: node + linkType: hard + "create-ecdh@npm:^4.0.0": version: 4.0.4 resolution: "create-ecdh@npm:4.0.4" @@ -6335,7 +6384,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:3.X": +"debug@npm:3.X, debug@npm:^3.2.7": version: 3.2.7 resolution: "debug@npm:3.2.7" dependencies: @@ -6458,6 +6507,17 @@ __metadata: languageName: node linkType: hard +"define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.0.1" + checksum: dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37 + languageName: node + linkType: hard + "define-lazy-prop@npm:^2.0.0": version: 2.0.0 resolution: "define-lazy-prop@npm:2.0.0" @@ -6977,6 +7037,22 @@ __metadata: languageName: node linkType: hard +"es-define-property@npm:^1.0.0": + version: 1.0.0 + resolution: "es-define-property@npm:1.0.0" + dependencies: + get-intrinsic: "npm:^1.2.4" + checksum: 6bf3191feb7ea2ebda48b577f69bdfac7a2b3c9bcf97307f55fd6ef1bbca0b49f0c219a935aca506c993d8c5d8bddd937766cb760cd5e5a1071351f2df9f9aa4 + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 + languageName: node + linkType: hard + "es-get-iterator@npm:^1.1.3": version: 1.1.3 resolution: "es-get-iterator@npm:1.1.3" @@ -7349,6 +7425,13 @@ __metadata: languageName: node linkType: hard +"eventemitter3@npm:^4.0.0": + version: 4.0.7 + resolution: "eventemitter3@npm:4.0.7" + checksum: 5f6d97cbcbac47be798e6355e3a7639a84ee1f7d9b199a07017f1d2f1e2fe236004d14fa5dfaeba661f94ea57805385e326236a6debbc7145c8877fbc0297c6b + languageName: node + linkType: hard + "events@npm:^3.0.0, events@npm:^3.3.0": version: 3.3.0 resolution: "events@npm:3.3.0" @@ -7845,6 +7928,16 @@ __metadata: languageName: node linkType: hard +"follow-redirects@npm:^1.0.0": + version: 1.15.6 + resolution: "follow-redirects@npm:1.15.6" + peerDependenciesMeta: + debug: + optional: true + checksum: 9ff767f0d7be6aa6870c82ac79cf0368cd73e01bbc00e9eb1c2a16fbb198ec105e3c9b6628bb98e9f3ac66fe29a957b9645bcb9a490bb7aa0d35f908b6b85071 + languageName: node + linkType: hard + "for-each@npm:^0.3.3": version: 0.3.3 resolution: "for-each@npm:0.3.3" @@ -7925,6 +8018,7 @@ __metadata: version: 0.0.0-use.local resolution: "frontend@workspace:." dependencies: + "@playwright/test": "npm:^1.42.1" "@storybook/addon-essentials": "npm:^7.6.17" "@storybook/addon-interactions": "npm:^7.6.17" "@storybook/addon-links": "npm:^7.6.17" @@ -7952,6 +8046,7 @@ __metadata: gulp-sourcemaps: "npm:^3.0.0" gulp-svg-sprite: "npm:^2.0.3" highlight.js: "npm:^11.9.0" + http-server: "npm:^14.1.1" js-beautify: "npm:^1.15.1" jsdom: "npm:^24.0.0" jszip: "npm:^3.10.1" @@ -8059,6 +8154,16 @@ __metadata: languageName: node linkType: hard +"fsevents@npm:2.3.2": + version: 2.3.2 + resolution: "fsevents@npm:2.3.2" + dependencies: + node-gyp: "npm:latest" + checksum: be78a3efa3e181cda3cf7a4637cb527bcebb0bd0ea0440105a3bb45b86f9245b307dc10a2507e8f4498a7d4ec349d1910f4d73e4d4495b16103106e07eee735b + conditions: os=darwin + languageName: node + linkType: hard + "fsevents@npm:^1.2.7": version: 1.2.13 resolution: "fsevents@npm:1.2.13" @@ -8080,6 +8185,15 @@ __metadata: languageName: node linkType: hard +"fsevents@patch:fsevents@npm%3A2.3.2#optional!builtin": + version: 2.3.2 + resolution: "fsevents@patch:fsevents@npm%3A2.3.2#optional!builtin::version=2.3.2&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + "fsevents@patch:fsevents@npm%3A^1.2.7#optional!builtin": version: 1.2.13 resolution: "fsevents@patch:fsevents@npm%3A1.2.13#optional!builtin::version=1.2.13&hash=d11327" @@ -8174,6 +8288,19 @@ __metadata: languageName: node linkType: hard +"get-intrinsic@npm:^1.2.4": + version: 1.2.4 + resolution: "get-intrinsic@npm:1.2.4" + dependencies: + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + has-proto: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + hasown: "npm:^2.0.0" + checksum: 0a9b82c16696ed6da5e39b1267104475c47e3a9bdbe8b509dfe1710946e38a87be70d759f4bb3cda042d76a41ef47fe769660f3b7c0d1f68750299344ffb15b7 + languageName: node + linkType: hard + "get-nonce@npm:^1.0.0": version: 1.0.1 resolution: "get-nonce@npm:1.0.1" @@ -8664,6 +8791,15 @@ __metadata: languageName: node linkType: hard +"has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: "npm:^1.0.0" + checksum: 253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236 + languageName: node + linkType: hard + "has-proto@npm:^1.0.1": version: 1.0.1 resolution: "has-proto@npm:1.0.1" @@ -8756,6 +8892,15 @@ __metadata: languageName: node linkType: hard +"he@npm:^1.2.0": + version: 1.2.0 + resolution: "he@npm:1.2.0" + bin: + he: bin/he + checksum: a27d478befe3c8192f006cdd0639a66798979dfa6e2125c6ac582a19a5ebfec62ad83e8382e6036170d873f46e4536a7e795bf8b95bf7c247f4cc0825ccc8c17 + languageName: node + linkType: hard + "highlight.js@npm:^11.9.0": version: 11.9.0 resolution: "highlight.js@npm:11.9.0" @@ -8790,6 +8935,15 @@ __metadata: languageName: node linkType: hard +"html-encoding-sniffer@npm:^3.0.0": + version: 3.0.0 + resolution: "html-encoding-sniffer@npm:3.0.0" + dependencies: + whatwg-encoding: "npm:^2.0.0" + checksum: b17b3b0fb5d061d8eb15121c3b0b536376c3e295ecaf09ba48dd69c6b6c957839db124fe1e2b3f11329753a4ee01aa7dedf63b7677999e86da17fbbdd82c5386 + languageName: node + linkType: hard + "html-encoding-sniffer@npm:^4.0.0": version: 4.0.0 resolution: "html-encoding-sniffer@npm:4.0.0" @@ -8836,6 +8990,40 @@ __metadata: languageName: node linkType: hard +"http-proxy@npm:^1.18.1": + version: 1.18.1 + resolution: "http-proxy@npm:1.18.1" + dependencies: + eventemitter3: "npm:^4.0.0" + follow-redirects: "npm:^1.0.0" + requires-port: "npm:^1.0.0" + checksum: 148dfa700a03fb421e383aaaf88ac1d94521dfc34072f6c59770528c65250983c2e4ec996f2f03aa9f3fe46cd1270a593126068319311e3e8d9e610a37533e94 + languageName: node + linkType: hard + +"http-server@npm:^14.1.1": + version: 14.1.1 + resolution: "http-server@npm:14.1.1" + dependencies: + basic-auth: "npm:^2.0.1" + chalk: "npm:^4.1.2" + corser: "npm:^2.0.1" + he: "npm:^1.2.0" + html-encoding-sniffer: "npm:^3.0.0" + http-proxy: "npm:^1.18.1" + mime: "npm:^1.6.0" + minimist: "npm:^1.2.6" + opener: "npm:^1.5.1" + portfinder: "npm:^1.0.28" + secure-compare: "npm:3.0.1" + union: "npm:~0.5.0" + url-join: "npm:^4.0.1" + bin: + http-server: bin/http-server + checksum: c5770ddd722dd520ce0af25efee6bfb7c6300ff4e934636d4eec83fa995739e64de2e699e89e7a795b3a1894bcc37bec226617c1023600aacd7871fd8d6ffe6d + languageName: node + linkType: hard + "https-browserify@npm:^1.0.0": version: 1.0.0 resolution: "https-browserify@npm:1.0.0" @@ -10196,7 +10384,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.21": +"lodash@npm:^4.17.14, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c @@ -10591,7 +10779,7 @@ __metadata: languageName: node linkType: hard -"mime@npm:1.6.0": +"mime@npm:1.6.0, mime@npm:^1.6.0": version: 1.6.0 resolution: "mime@npm:1.6.0" bin: @@ -10788,7 +10976,7 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^0.5.4": +"mkdirp@npm:^0.5.4, mkdirp@npm:^0.5.6": version: 0.5.6 resolution: "mkdirp@npm:0.5.6" dependencies: @@ -11362,6 +11550,15 @@ __metadata: languageName: node linkType: hard +"opener@npm:^1.5.1": + version: 1.5.2 + resolution: "opener@npm:1.5.2" + bin: + opener: bin/opener-bin.js + checksum: dd56256ab0cf796585617bc28e06e058adf09211781e70b264c76a1dbe16e90f868c974e5bf5309c93469157c7d14b89c35dc53fe7293b0e40b4d2f92073bc79 + languageName: node + linkType: hard + "opentype.js@npm:^1.3.4": version: 1.3.4 resolution: "opentype.js@npm:1.3.4" @@ -11881,6 +12078,30 @@ __metadata: languageName: node linkType: hard +"playwright-core@npm:1.42.1": + version: 1.42.1 + resolution: "playwright-core@npm:1.42.1" + bin: + playwright-core: cli.js + checksum: 9bb0be6defa32eb1b01429615f10c2ad17dcf701656c081a250369c1eb3b0dcc2a0ee21188cd653cdd2303ca73ff94df0d270b178fe3897eba274793dab368ce + languageName: node + linkType: hard + +"playwright@npm:1.42.1": + version: 1.42.1 + resolution: "playwright@npm:1.42.1" + dependencies: + fsevents: "npm:2.3.2" + playwright-core: "npm:1.42.1" + dependenciesMeta: + fsevents: + optional: true + bin: + playwright: cli.js + checksum: 91dcbfe92d75ca9eb4bfff69bb1ec28007b5a96f6187f48e52aa0f6acf8c24f6039ed6467c152964cc92f4ab64b85dc665b13c52b2fb9f7b9182ddb9db404e37 + languageName: node + linkType: hard + "plugin-error@npm:^1.0.0, plugin-error@npm:^1.0.1": version: 1.0.1 resolution: "plugin-error@npm:1.0.1" @@ -11911,6 +12132,17 @@ __metadata: languageName: node linkType: hard +"portfinder@npm:^1.0.28": + version: 1.0.32 + resolution: "portfinder@npm:1.0.32" + dependencies: + async: "npm:^2.6.4" + debug: "npm:^3.2.7" + mkdirp: "npm:^0.5.6" + checksum: cef8b567b78aabccc59fe8e103bac8b394bb45a6a69be626608f099f454124c775aaf47b274c006332c07ab3f501cde55e49aaeb9d49d78d90362d776a565cbf + languageName: node + linkType: hard + "posix-character-classes@npm:^0.1.0": version: 0.1.1 resolution: "posix-character-classes@npm:0.1.1" @@ -12337,6 +12569,15 @@ __metadata: languageName: node linkType: hard +"qs@npm:^6.4.0": + version: 6.12.0 + resolution: "qs@npm:6.12.0" + dependencies: + side-channel: "npm:^1.0.6" + checksum: e165a77ac5f3ca60c15c5f3d51b321ddec7aa438804436b29d160117bc6fb7bf7dab94abd0c7d7c0785890d3a75ae41e1d6346e158aaf1540c6fe53a31f11675 + languageName: node + linkType: hard + "querystring-es3@npm:^0.2.0": version: 0.2.1 resolution: "querystring-es3@npm:0.2.1" @@ -13474,6 +13715,13 @@ __metadata: languageName: node linkType: hard +"secure-compare@npm:3.0.1": + version: 3.0.1 + resolution: "secure-compare@npm:3.0.1" + checksum: af3102f3f555d917c8ffff7a5f6f00f70195708f4faf82d48794485c9f3cb365cee0dd4da6b4e53e8964f172970bce6069b6101ba3ce8c309bff54f460d1f650 + languageName: node + linkType: hard + "semver-greatest-satisfied-range@npm:^1.1.0": version: 1.1.0 resolution: "semver-greatest-satisfied-range@npm:1.1.0" @@ -13564,6 +13812,20 @@ __metadata: languageName: node linkType: hard +"set-function-length@npm:^1.2.1": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + checksum: 82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c + languageName: node + linkType: hard + "set-function-name@npm:^2.0.0": version: 2.0.1 resolution: "set-function-name@npm:2.0.1" @@ -13695,6 +13957,18 @@ __metadata: languageName: node linkType: hard +"side-channel@npm:^1.0.6": + version: 1.0.6 + resolution: "side-channel@npm:1.0.6" + dependencies: + call-bind: "npm:^1.0.7" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.4" + object-inspect: "npm:^1.13.1" + checksum: d2afd163dc733cc0a39aa6f7e39bf0c436293510dbccbff446733daeaf295857dbccf94297092ec8c53e2503acac30f0b78830876f0485991d62a90e9cad305f + languageName: node + linkType: hard + "siginfo@npm:^2.0.0": version: 2.0.0 resolution: "siginfo@npm:2.0.0" @@ -15035,6 +15309,15 @@ __metadata: languageName: node linkType: hard +"union@npm:~0.5.0": + version: 0.5.0 + resolution: "union@npm:0.5.0" + dependencies: + qs: "npm:^6.4.0" + checksum: 9ac158d99991063180e56f408f5991e808fa07594713439c098116da09215c154672ee8c832e16a6b39b037609c08bcaff8ff07c1e3e46c3cc622897972af2aa + languageName: node + linkType: hard + "unique-filename@npm:^3.0.0": version: 3.0.0 resolution: "unique-filename@npm:3.0.0" @@ -15178,6 +15461,13 @@ __metadata: languageName: node linkType: hard +"url-join@npm:^4.0.1": + version: 4.0.1 + resolution: "url-join@npm:4.0.1" + checksum: ac65e2c7c562d7b49b68edddcf55385d3e922bc1dd5d90419ea40b53b6de1607d1e45ceb71efb9d60da02c681d13c6cb3a1aa8b13fc0c989dfc219df97ee992d + languageName: node + linkType: hard + "url-parse@npm:^1.5.3": version: 1.5.10 resolution: "url-parse@npm:1.5.10" @@ -15633,6 +15923,15 @@ __metadata: languageName: node linkType: hard +"whatwg-encoding@npm:^2.0.0": + version: 2.0.0 + resolution: "whatwg-encoding@npm:2.0.0" + dependencies: + iconv-lite: "npm:0.6.3" + checksum: 91b90a49f312dc751496fd23a7e68981e62f33afe938b97281ad766235c4872fc4e66319f925c5e9001502b3040dd25a33b02a9c693b73a4cbbfdc4ad10c3e3e + languageName: node + linkType: hard + "whatwg-encoding@npm:^3.1.1": version: 3.1.1 resolution: "whatwg-encoding@npm:3.1.1" -- Gitee From ca640964d10b2a9df0de84397ffa2427608caa25 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 12 Apr 2024 09:58:07 +0200 Subject: [PATCH 0283/1266] :arrow_up: Update exporter dependencies --- exporter/deps.edn | 2 +- exporter/package.json | 6 +++--- exporter/yarn.lock | 40 ++++++++++++++++++++-------------------- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/exporter/deps.edn b/exporter/deps.edn index 01c4cefcc..547e131f6 100644 --- a/exporter/deps.edn +++ b/exporter/deps.edn @@ -15,7 +15,7 @@ :dev {:extra-deps - {thheller/shadow-cljs {:mvn/version "2.27.4"}}} + {thheller/shadow-cljs {:mvn/version "2.28.3"}}} :shadow-cljs {:main-opts ["-m" "shadow.cljs.devtools.cli"]} diff --git a/exporter/package.json b/exporter/package.json index 86cb78c8d..826e0c2dd 100644 --- a/exporter/package.json +++ b/exporter/package.json @@ -10,19 +10,19 @@ "url": "https://github.com/penpot/penpot" }, "dependencies": { - "archiver": "^6.0.1", + "archiver": "^6.0.2", "cookies": "^0.9.1", "generic-pool": "^3.9.0", "inflation": "^2.1.0", "ioredis": "^5.3.2", "luxon": "^3.4.4", - "playwright": "^1.40.1", + "playwright": "^1.43.0", "raw-body": "^2.5.2", "xml-js": "^1.6.11", "xregexp": "^5.1.1" }, "devDependencies": { - "shadow-cljs": "2.27.4", + "shadow-cljs": "2.28.3", "source-map-support": "^0.5.21" }, "scripts": { diff --git a/exporter/yarn.lock b/exporter/yarn.lock index d5c7dfe79..e4a3aeee6 100644 --- a/exporter/yarn.lock +++ b/exporter/yarn.lock @@ -135,9 +135,9 @@ __metadata: languageName: node linkType: hard -"archiver@npm:^6.0.1": - version: 6.0.1 - resolution: "archiver@npm:6.0.1" +"archiver@npm:^6.0.2": + version: 6.0.2 + resolution: "archiver@npm:6.0.2" dependencies: archiver-utils: "npm:^4.0.1" async: "npm:^3.2.4" @@ -146,7 +146,7 @@ __metadata: readdir-glob: "npm:^1.1.2" tar-stream: "npm:^3.0.0" zip-stream: "npm:^5.0.1" - checksum: 54c5a634b39691114e727d4b4f360439fa7cd40b414c9d909606fbfd7048037f7dccefa49337f9ed19b1f5c209e021ce5e1ff9c6b547907257bc71f1af6f8cf3 + checksum: 23a470d468c01cd40fc13b6bd3dbc6d04c4f7b770785dcc7e1e4af256c3d79c4ffd7f7e0e84ae320437e5b8d0a2117aecfca0586b8c0fbd6edc3e04977c438cc languageName: node linkType: hard @@ -727,15 +727,15 @@ __metadata: version: 0.0.0-use.local resolution: "exporter@workspace:." dependencies: - archiver: "npm:^6.0.1" + archiver: "npm:^6.0.2" cookies: "npm:^0.9.1" generic-pool: "npm:^3.9.0" inflation: "npm:^2.1.0" ioredis: "npm:^5.3.2" luxon: "npm:^3.4.4" - playwright: "npm:^1.40.1" + playwright: "npm:^1.43.0" raw-body: "npm:^2.5.2" - shadow-cljs: "npm:2.27.4" + shadow-cljs: "npm:2.28.3" source-map-support: "npm:^0.5.21" xml-js: "npm:^1.6.11" xregexp: "npm:^5.1.1" @@ -1546,27 +1546,27 @@ __metadata: languageName: node linkType: hard -"playwright-core@npm:1.40.1": - version: 1.40.1 - resolution: "playwright-core@npm:1.40.1" +"playwright-core@npm:1.43.0": + version: 1.43.0 + resolution: "playwright-core@npm:1.43.0" bin: playwright-core: cli.js - checksum: 56c283012974982313a6ae583b975ee4af76d52059fb9a25d9cc616a11224685ec64682b391910c795d2b12d2ab5c7eec31124722c75c0b1703a76ac9b6fd1c2 + checksum: 3afdcc79176e0c872b3bb66994ef6288b10819dfb800234b81134a35daffc8100596d65ccff10faa8941a450a259a78f446db570898e53031abba7f542602c6a languageName: node linkType: hard -"playwright@npm:^1.40.1": - version: 1.40.1 - resolution: "playwright@npm:1.40.1" +"playwright@npm:^1.43.0": + version: 1.43.0 + resolution: "playwright@npm:1.43.0" dependencies: fsevents: "npm:2.3.2" - playwright-core: "npm:1.40.1" + playwright-core: "npm:1.43.0" dependenciesMeta: fsevents: optional: true bin: playwright: cli.js - checksum: 5dae164d1f69162da8d7eee52da651296fb885c76a8b36049f216975c751a0a826ff05795a1c0902dc0bd193fe606ae17d5def655f4cbcccb8d8b71afb74b950 + checksum: 82506d3937416439d42ed7940e03b62225651a049792b7c122cd1fb4318674e5789dbcd38e31c8e2f41d99e3b7dc9aa0898bfdd26dff5456eb3f89a166252bd8 languageName: node linkType: hard @@ -1842,9 +1842,9 @@ __metadata: languageName: node linkType: hard -"shadow-cljs@npm:2.27.4": - version: 2.27.4 - resolution: "shadow-cljs@npm:2.27.4" +"shadow-cljs@npm:2.28.3": + version: 2.28.3 + resolution: "shadow-cljs@npm:2.28.3" dependencies: node-libs-browser: "npm:^2.2.1" readline-sync: "npm:^1.4.7" @@ -1854,7 +1854,7 @@ __metadata: ws: "npm:^7.4.6" bin: shadow-cljs: cli/runner.js - checksum: bae23e71df9c2b2979259a0cde8747c923ee295f58ab4637c9d6b103d82542b40ef39172d4be2dbb94af2e6458a177d1ec96c1eb1e73b1d8f3a4ddb5eaaba7d4 + checksum: 623b536a0d95d7696dd465c09ab3cb5d921c867a577a33463ad58dbc40f51f5d0424ba2791a8803f33a94f5c877198de91c3c7f7616618a6b4ae90e80d5d213e languageName: node linkType: hard -- Gitee From bc279977d5f739e908f559317783de8d343a035c Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 12 Apr 2024 09:58:40 +0200 Subject: [PATCH 0284/1266] :paperclip: Comment playwright installation on frontend directory --- docker/devenv/files/start-tmux.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/devenv/files/start-tmux.sh b/docker/devenv/files/start-tmux.sh index cbf79a847..3eacca507 100755 --- a/docker/devenv/files/start-tmux.sh +++ b/docker/devenv/files/start-tmux.sh @@ -11,7 +11,7 @@ set -e; echo "[start-tmux.sh] Installing node dependencies" pushd ~/penpot/frontend/ yarn install -yarn run playwright install --with-deps chromium +#yarn run playwright install --with-deps chromium popd pushd ~/penpot/exporter/ yarn install -- Gitee From c9fbb21924f814172972c0601da4ab3647b79502 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 12 Apr 2024 10:08:15 +0200 Subject: [PATCH 0285/1266] :sparkles: Don't stop start-tmux if playwright is not found on frontend --- docker/devenv/files/start-tmux.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docker/devenv/files/start-tmux.sh b/docker/devenv/files/start-tmux.sh index 3eacca507..ec6470ea2 100755 --- a/docker/devenv/files/start-tmux.sh +++ b/docker/devenv/files/start-tmux.sh @@ -6,12 +6,10 @@ cd ~; source ~/.bashrc -set -e; - echo "[start-tmux.sh] Installing node dependencies" pushd ~/penpot/frontend/ yarn install -#yarn run playwright install --with-deps chromium +yarn run playwright install --with-deps chromium popd pushd ~/penpot/exporter/ yarn install -- Gitee From 83f8218bf3e23fc74b7a4a37914838f5976d76f2 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 12 Apr 2024 10:50:13 +0200 Subject: [PATCH 0286/1266] :bug: Fix incorrect queryparams handling on default nginx entrypoint --- docker/devenv/files/nginx.conf | 2 +- docker/images/files/nginx.conf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/devenv/files/nginx.conf b/docker/devenv/files/nginx.conf index 5c1ae44db..b9b595ff4 100644 --- a/docker/devenv/files/nginx.conf +++ b/docker/devenv/files/nginx.conf @@ -224,7 +224,7 @@ http { add_header Last-Modified $date_gmt; add_header Cache-Control "no-store, no-cache, max-age=0" always; if_modified_since off; - try_files $uri /index.html$is_args$args =404; + try_files $uri /index.html$is_args$args /index.html =404; } } } diff --git a/docker/images/files/nginx.conf b/docker/images/files/nginx.conf index bdf52f389..4ad7c938a 100644 --- a/docker/images/files/nginx.conf +++ b/docker/images/files/nginx.conf @@ -202,7 +202,7 @@ http { add_header Last-Modified $date_gmt; add_header Cache-Control "no-store, no-cache, max-age=0" always; if_modified_since off; - try_files $uri /index.html$is_args$args =404; + try_files $uri /index.html$is_args$args /index.html =404; } } } -- Gitee From 137e576e63346e5f14035c2f6a2dcabfc64352a5 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Fri, 12 Apr 2024 12:00:50 +0200 Subject: [PATCH 0287/1266] :bug: Fix scrollbar appears on top of UI buttons --- .../src/app/main/ui/components/tab_container.scss | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/frontend/src/app/main/ui/components/tab_container.scss b/frontend/src/app/main/ui/components/tab_container.scss index 80e5b3ea6..c01715bd4 100644 --- a/frontend/src/app/main/ui/components/tab_container.scss +++ b/frontend/src/app/main/ui/components/tab_container.scss @@ -46,6 +46,7 @@ @extend .button-icon; stroke: var(--tab-foreground-color); } + .content { @include headlineSmallTypography; text-align: center; @@ -53,17 +54,21 @@ overflow: hidden; text-overflow: ellipsis; } + &.current, &.current:hover { background: var(--tab-background-color-selected); border-color: var(--tab-border-color-selected); color: var(--tab-foreground-color-selected); + svg { stroke: var(--tab-foreground-color-selected); } } + &:hover { color: var(--tab-foreground-color-hover); + svg { stroke: var(--tab-foreground-color-hover); } @@ -78,6 +83,7 @@ min-width: $s-24; padding: 0 $s-6; border-radius: $br-5; + svg { @include flexCenter; height: $s-16; @@ -87,6 +93,7 @@ fill: none; color: transparent; } + &:hover { svg { stroke: var(--icon-foreground-hover); @@ -107,3 +114,10 @@ display: flex; flex-direction: column; } + +//Firefox doesn't respect scrollbar-gutter +@supports (-moz-appearance: none) { + .tab-container-content { + padding-right: $s-8; + } +} -- Gitee From a7a33440309260ab41b55b59d642169e3302d84e Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Fri, 12 Apr 2024 12:51:53 +0200 Subject: [PATCH 0288/1266] :bug: Inverted highlight constraint for vertical and horizontal constraints --- .../ui/workspace/sidebar/options/menus/constraints.cljs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/constraints.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/menus/constraints.cljs index ce3bdedca..866249bcc 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/constraints.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/constraints.cljs @@ -181,14 +181,14 @@ [:span {:class (stl/css :resalted-area)}]]] [:div {:class (stl/css :constraints-center)} [:button {:class (stl/css-case :constraint-btn true - :active (= constraints-h :center)) - :data-value "centerh" + :active (= constraints-v :center)) + :data-value "centerv" :on-click on-constraint-button-clicked} [:span {:class (stl/css :resalted-area)}]] [:button {:class (stl/css-case :constraint-btn-special true :constraint-btn-rotated true - :active (= constraints-v :center)) - :data-value "centerv" + :active (= constraints-h :center)) + :data-value "centerh" :on-click on-constraint-button-clicked} [:span {:class (stl/css :resalted-area)}]]] [:div {:class (stl/css :constraints-right)} -- Gitee From e636bdd0b0ec0771c4236bb23e0d045f881a311a Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Fri, 12 Apr 2024 11:47:43 +0200 Subject: [PATCH 0289/1266] :bug: Fix problem copy/paste svg text --- frontend/src/app/main/data/workspace.cljs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index 52aef6249..1f48ae4ed 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -1711,8 +1711,14 @@ (process-entry [[type data]] (case type :text - (if (str/empty? data) + (cond + (str/empty? data) (rx/empty) + + (re-find #" pdata wapi/extract-text) transit-data (ex/ignoring (some-> text-data t/decode-str))] (cond - (and (string? text-data) - (str/includes? text-data " Date: Fri, 12 Apr 2024 12:41:55 +0200 Subject: [PATCH 0290/1266] :bug: Fix crash when removing multiple text fills --- .../workspace/sidebar/options/menus/fill.cljs | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/fill.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/menus/fill.cljs index 82e8fe530..7dfc6f075 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/fill.cljs @@ -69,33 +69,34 @@ on-add (mf/use-fn - (mf/deps ids) + (mf/deps ids fills) (fn [_] (st/emit! (dc/add-fill ids {:color default-color :opacity 1})) - (when (not (some? (seq fills))) (open-content)))) + (when (or (= :multiple fills) + (not (some? (seq fills)))) + (open-content)))) on-change - (mf/use-fn - (mf/deps ids) - (fn [index] - (fn [color] - (st/emit! (dc/change-fill ids color index))))) + (fn [index] + (fn [color] + (st/emit! (dc/change-fill ids color index)))) on-reorder - (mf/use-fn - (mf/deps ids) - (fn [new-index] - (fn [index] - (st/emit! (dc/reorder-fills ids index new-index))))) + (fn [new-index] + (fn [index] + (st/emit! (dc/reorder-fills ids index new-index)))) on-remove (fn [index] (fn [] (st/emit! (dc/remove-fill ids {:color default-color :opacity 1} index)) - (when (= 1 (count (seq fills))) (close-content)))) + (when (or (= :multiple fills) + (= 1 (count (seq fills)))) + (close-content)))) + on-remove-all (fn [_] (st/emit! (dc/remove-all-fills ids {:color clr/black -- Gitee From 8e71d219ca1cf4ba7b2b7eb1334b9afd7245da77 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Fri, 12 Apr 2024 12:42:08 +0200 Subject: [PATCH 0291/1266] :bug: Fix editor when several colors are in a single word --- frontend/resources/styles/main/partials/texts.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frontend/resources/styles/main/partials/texts.scss b/frontend/resources/styles/main/partials/texts.scss index 0bece2924..ad53796b6 100644 --- a/frontend/resources/styles/main/partials/texts.scss +++ b/frontend/resources/styles/main/partials/texts.scss @@ -21,6 +21,10 @@ flex-direction: column; } + .public-DraftStyleDefault-block { + white-space: pre; + } + &.align-top { .DraftEditor-root { justify-content: flex-start; -- Gitee From 4838571ec2331bbb34c704386a865b01086604a0 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Fri, 12 Apr 2024 15:21:30 +0200 Subject: [PATCH 0292/1266] :bug: Fix problem with position-data overriding in copies --- .../main/data/workspace/libraries_helpers.cljs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/main/data/workspace/libraries_helpers.cljs b/frontend/src/app/main/data/workspace/libraries_helpers.cljs index f6de7fb46..ff03da46e 100644 --- a/frontend/src/app/main/data/workspace/libraries_helpers.cljs +++ b/frontend/src/app/main/data/workspace/libraries_helpers.cljs @@ -1491,9 +1491,22 @@ container {:type :reg-objects :shapes all-parents})])))) - (let [roperation {:type :set + (let [;; position-data is a special case because can be affected by :geometry-group and :content-group + ;; so, if the position-data changes but the geometry is touched we need to reset the position-data + ;; so it's calculated again + reset-pos-data? + (and (cfh/text-shape? origin-shape) + (= attr :position-data) + (not= (get origin-shape attr) (get dest-shape attr)) + (touched :geometry-group)) + + roperation {:type :set :attr attr - :val (get origin-shape attr) + :val (cond + ;; If position data changes and the geometry group is touched + ;; we need to put to nil so we can regenerate it + reset-pos-data? nil + :else (get origin-shape attr)) :ignore-touched true} uoperation {:type :set :attr attr -- Gitee From 0135b477cab241860b95ce07535c487ad6d89217 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 15 Apr 2024 14:09:22 +0200 Subject: [PATCH 0293/1266] :sparkles: Add improved traceability of climit module --- backend/src/app/rpc/climit.clj | 123 ++++++++++++----------- backend/src/app/rpc/commands/media.clj | 5 +- backend/src/app/rpc/commands/profile.clj | 8 +- 3 files changed, 74 insertions(+), 62 deletions(-) diff --git a/backend/src/app/rpc/climit.clj b/backend/src/app/rpc/climit.clj index 7dbec0861..3ca348e0b 100644 --- a/backend/src/app/rpc/climit.clj +++ b/backend/src/app/rpc/climit.clj @@ -20,6 +20,7 @@ [app.util.time :as dt] [app.worker :as-alias wrk] [clojure.edn :as edn] + [clojure.set :as set] [clojure.spec.alpha :as s] [datoteka.fs :as fs] [integrant.core :as ig] @@ -91,67 +92,77 @@ :timeout (:timeout config) :type :semaphore)) -(defmacro ^:private measure-and-log! - [metrics mlabels stats id action limit-id limit-label profile-id elapsed] - `(let [mpermits# (:max-permits ~stats) - mqueue# (:max-queue ~stats) - permits# (:permits ~stats) - queue# (:queue ~stats) - queue# (- queue# mpermits#) - queue# (if (neg? queue#) 0 queue#) - level# (if (pos? queue#) :warn :trace)] - - (mtx/run! ~metrics - :id :rpc-climit-queue - :val queue# - :labels ~mlabels) - - (mtx/run! ~metrics - :id :rpc-climit-permits - :val permits# - :labels ~mlabels) - - (l/log level# - :hint ~action - :req ~id - :id ~limit-id - :label ~limit-label - :profile-id (str ~profile-id) - :permits permits# - :queue queue# - :max-permits mpermits# - :max-queue mqueue# - ~@(if (some? elapsed) - [:elapsed `(dt/format-duration ~elapsed)] - [])))) + +(defn measure! + [metrics mlabels stats elapsed] + (let [mpermits (:max-permits stats) + permits (:permits stats) + queue (:queue stats) + queue (- queue mpermits) + queue (if (neg? queue) 0 queue)] + + (mtx/run! metrics + :id :rpc-climit-queue + :val queue + :labels mlabels) + + (mtx/run! metrics + :id :rpc-climit-permits + :val permits + :labels mlabels) + + (when elapsed + (mtx/run! metrics + :id :rpc-climit-timing + :val (inst-ms elapsed) + :labels mlabels)))) + +(defn log! + [action req-id stats limit-id limit-label params elapsed] + (let [mpermits (:max-permits stats) + queue (:queue stats) + queue (- queue mpermits) + queue (if (neg? queue) 0 queue) + level (if (pos? queue) :warn :trace)] + + (l/log level + :hint action + :req req-id + :id limit-id + :label limit-label + :queue queue + :elapsed (some-> elapsed dt/format-duration) + :params (-> (select-keys params [::rpc/profile-id :file-id :profile-id]) + (set/rename-keys {::rpc/profile-id :profile-id}) + (update-vals str))))) (def ^:private idseq (AtomicLong. 0)) (defn- invoke - [limiter metrics limit-id limit-key limit-label profile-id f params] + [limiter metrics limit-id limit-key limit-label handler params] (let [tpoint (dt/tpoint) mlabels (into-array String [(id->str limit-id)]) limit-id (id->str limit-id limit-key) stats (pbh/get-stats limiter) - id (.incrementAndGet ^AtomicLong idseq)] + req-id (.incrementAndGet ^AtomicLong idseq)] (try - (measure-and-log! metrics mlabels stats id "enqueued" limit-id limit-label profile-id nil) + (measure! metrics mlabels stats nil) + (log! "enqueued" req-id stats limit-id limit-label params nil) (px/invoke! limiter (fn [] (let [elapsed (tpoint) stats (pbh/get-stats limiter)] - (measure-and-log! metrics mlabels stats id "acquired" limit-id limit-label profile-id elapsed) - (mtx/run! metrics - :id :rpc-climit-timing - :val (inst-ms elapsed) - :labels mlabels) - (apply f params)))) + + (measure! metrics mlabels stats elapsed) + (log! "acquired" req-id stats limit-id limit-label params elapsed) + + (handler params)))) (catch ExceptionInfo cause (let [{:keys [type code]} (ex-data cause)] (if (= :bulkhead-error type) (let [elapsed (tpoint)] - (measure-and-log! metrics mlabels stats id "reject" limit-id limit-label profile-id elapsed) + (log! "rejected" req-id stats limit-id limit-label params elapsed) (ex/raise :type :concurrency-limit :code code :hint "concurrency limit reached" @@ -161,7 +172,9 @@ (finally (let [elapsed (tpoint) stats (pbh/get-stats limiter)] - (measure-and-log! metrics mlabels stats id "finished" limit-id limit-label profile-id elapsed)))))) + + (measure! metrics mlabels stats nil) + (log! "finished" req-id stats limit-id limit-label params elapsed)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; MIDDLEWARE @@ -219,10 +232,8 @@ (let [limit-key (key-fn params) cache-key [limit-id limit-key] limiter (cache/get cache cache-key (partial create-limiter config)) - profile-id (if (= key-fn ::rpc/profile-id) - limit-key - (get params ::rpc/profile-id))] - (invoke limiter metrics limit-id limit-key label profile-id handler [cfg params]))))) + handler (partial handler cfg)] + (invoke limiter metrics limit-id limit-key label handler params))))) (do (l/wrn :hint "no config found for specified queue" :id (id->str limit-id)) @@ -237,15 +248,15 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defn- build-exec-chain - [{:keys [::label ::profile-id ::rpc/climit ::mtx/metrics] :as cfg} f] + [{:keys [::label ::rpc/climit ::mtx/metrics] :as cfg} f] (let [config (get climit ::config) cache (get climit ::cache)] (reduce (fn [handler [limit-id limit-key :as ckey]] (if-let [config (get config limit-id)] - (fn [& params] - (let [limiter (cache/get cache ckey (partial create-limiter config))] - (invoke limiter metrics limit-id limit-key label profile-id handler params))) - + (fn [cfg params] + (let [limiter (cache/get cache ckey (partial create-limiter config)) + handler (partial handler cfg)] + (invoke limiter metrics limit-id limit-key label handler params))) (do (l/wrn :hint "config not found" :label label :id limit-id) f))) @@ -255,9 +266,9 @@ (defn invoke! "Run a function in context of climit. Intended to be used in virtual threads." - [{:keys [::executor] :as cfg} f & params] + [{:keys [::executor] :as cfg} f params] (let [f (if (some? executor) - (fn [& params] (px/await! (px/submit! executor (fn [] (apply f params))))) + (fn [cfg params] (px/await! (px/submit! executor (fn [] (f cfg params))))) f) f (build-exec-chain cfg f)] - (apply f params))) + (f cfg params))) diff --git a/backend/src/app/rpc/commands/media.clj b/backend/src/app/rpc/commands/media.clj index 1bdcd3c50..08232e899 100644 --- a/backend/src/app/rpc/commands/media.clj +++ b/backend/src/app/rpc/commands/media.clj @@ -243,12 +243,13 @@ ;; NOTE: we use the climit here in a dynamic invocation because we ;; don't want saturate the process-image limit with IO (download ;; of external image) + (-> cfg (assoc ::climit/id [[:process-image/by-profile (:profile-id params)] [:process-image/global]]) - (assoc ::climit/profile-id (:profile-id params)) (assoc ::climit/label "create-file-media-object-from-url") - (climit/invoke! db/run! cfg create-file-media-object params)))) + (climit/invoke! #(db/run! %1 create-file-media-object %2) params)))) + ;; --- Clone File Media object (Upload and create from url) diff --git a/backend/src/app/rpc/commands/profile.clj b/backend/src/app/rpc/commands/profile.clj index ccb6a8b2e..89a50b6ad 100644 --- a/backend/src/app/rpc/commands/profile.clj +++ b/backend/src/app/rpc/commands/profile.clj @@ -233,7 +233,7 @@ :file-mtype (:mtype file)}})))) (defn- generate-thumbnail! - [file] + [_ file] (let [input (media/run {:cmd :info :input file}) thumb (media/run {:cmd :profile-thumbnail :format :jpeg @@ -250,15 +250,15 @@ :content-type (:mtype thumb)})) (defn upload-photo - [{:keys [::sto/storage ::wrk/executor] :as cfg} {:keys [file]}] + [{:keys [::sto/storage ::wrk/executor] :as cfg} {:keys [file] :as params}] (let [params (-> cfg - (assoc ::climit/id :process-image/global) + (assoc ::climit/id [[:process-image/by-profile (:profile-id params)] + [:process-image/global]]) (assoc ::climit/label "upload-photo") (assoc ::climit/executor executor) (climit/invoke! generate-thumbnail! file))] (sto/put-object! storage params))) - ;; --- MUTATION: Request Email Change (declare ^:private request-email-change!) -- Gitee From 8c2038e43befe015b85f804520bd2fc14b1b49a5 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 15 Apr 2024 14:09:44 +0200 Subject: [PATCH 0294/1266] :bug: Fix incorrect name on audit event --- frontend/src/app/main/data/users.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/main/data/users.cljs b/frontend/src/app/main/data/users.cljs index 392c6e055..8a540317f 100644 --- a/frontend/src/app/main/data/users.cljs +++ b/frontend/src/app/main/data/users.cljs @@ -163,7 +163,7 @@ (ptk/reify ::logged-in ev/Event (-data [_] - {::ev/name "signing" + {::ev/name "signin" ::ev/type "identify" :email (:email profile) :auth-backend (:auth-backend profile) -- Gitee From acc1fac8debb157bfd23c6c02e11c71062aef828 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Mon, 15 Apr 2024 16:07:05 +0200 Subject: [PATCH 0295/1266] :bug: Fix color picker names are not displayed correctly on their tooltips --- frontend/src/app/main/ui/components/tab_container.cljs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/main/ui/components/tab_container.cljs b/frontend/src/app/main/ui/components/tab_container.cljs index bd3ff6727..20c79a417 100644 --- a/frontend/src/app/main/ui/components/tab_container.cljs +++ b/frontend/src/app/main/ui/components/tab_container.cljs @@ -54,9 +54,10 @@ (let [props (.-props tab) id (.-id props) title (.-title props) - sid (d/name id)] + sid (d/name id) + tooltip (if (string? title) title nil)] [:div {:key (str/concat "tab-" sid) - :title title + :title tooltip :data-id sid :on-click on-click :class (stl/css-case -- Gitee From f0eff95e18ce375da0128d001a7af2572da5d2a7 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Mon, 15 Apr 2024 17:17:20 +0200 Subject: [PATCH 0296/1266] :bug: Fix v2 components migration script --- backend/src/app/migrations/v2.clj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/app/migrations/v2.clj b/backend/src/app/migrations/v2.clj index ff38087c0..1acf7b96b 100644 --- a/backend/src/app/migrations/v2.clj +++ b/backend/src/app/migrations/v2.clj @@ -18,7 +18,7 @@ row_number() OVER (ORDER BY created_at DESC) AS rown FROM team WHERE deleted_at IS NULL - AND (features <@ '{components/v2}' OR features IS NULL) + AND (not (features @> '{components/v2}') OR features IS NULL) ORDER BY created_at DESC") (defn- get-teams @@ -37,7 +37,7 @@ ;; Run teams migration (run! (fn [{:keys [id rown]}] (try - (-> (assoc system ::db/rollback true) + (-> (assoc system ::db/rollback false) (feat/migrate-team! id :rown rown :label "v2-migration" -- Gitee From bb76700c18fffa0ca93ad0721434baa59614d31b Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Mon, 15 Apr 2024 20:55:51 +0200 Subject: [PATCH 0297/1266] :books: Update CHANGES for 2.0.1 --- CHANGES.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index ed15bda2d..6f85b3336 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,11 @@ # CHANGELOG +## 2.0.1 + +### :bug: Bugs fixed + +- Fix different issues related to components v2 migrations including [Github #4443](https://github.com/penpot/penpot/issues/4443) + ## 2.0.0 - I Just Can't Get Enough ### :rocket: Epics and highlights -- Gitee From 7948f565e33a906f8b53c6a9d7f33b7d85be9be0 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 15 Apr 2024 10:05:16 +0200 Subject: [PATCH 0298/1266] :sparkles: Make cron task schedule sync more lock resilent --- backend/src/app/worker/cron.clj | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/backend/src/app/worker/cron.clj b/backend/src/app/worker/cron.clj index 689fcba90..72a66a22b 100644 --- a/backend/src/app/worker/cron.clj +++ b/backend/src/app/worker/cron.clj @@ -27,14 +27,15 @@ "insert into scheduled_task (id, cron_expr) values (?, ?) on conflict (id) - do update set cron_expr=?") + do nothing") (defn- synchronize-cron-entries! - [{:keys [::db/pool ::entries]}] - (db/with-atomic [conn pool] - (doseq [{:keys [id cron]} entries] - (l/trc :hint "register cron task" :id id :cron (str cron)) - (db/exec-one! conn [sql:upsert-cron-task id (str cron) (str cron)])))) + [{:keys [::db/conn ::entries]}] + (doseq [{:keys [id cron]} entries] + (let [result (db/exec-one! conn [sql:upsert-cron-task id (str cron)]) + updated? (pos? (db/get-update-count result))] + (l/dbg :hint "register task" :id id :cron (str cron) + :status (if updated? "created" "exists"))))) (defn- lock-scheduled-task! [conn id] @@ -45,7 +46,7 @@ (declare ^:private schedule-cron-task) (defn- execute-cron-task - [cfg {:keys [id] :as task}] + [cfg {:keys [id cron] :as task}] (px/thread {:name (str "penpot/cron-task/" id)} (let [tpoint (dt/tpoint)] @@ -54,20 +55,25 @@ (db/exec-one! conn ["SET LOCAL statement_timeout=0;"]) (db/exec-one! conn ["SET LOCAL idle_in_transaction_session_timeout=0;"]) (when (lock-scheduled-task! conn id) - (l/dbg :hint "start task" :task-id id) + (db/update! conn :scheduled-task + {:cron-expr (str cron) + :modified-at (dt/now)} + {:id id} + {::db/return-keys false}) + (l/dbg :hint "start" :id id) ((:fn task) task) (let [elapsed (dt/format-duration (tpoint))] - (l/dbg :hint "end task" :task-id id :elapsed elapsed))))) + (l/dbg :hint "end" :id id :elapsed elapsed))))) (catch InterruptedException _ (let [elapsed (dt/format-duration (tpoint))] - (l/debug :hint "task interrupted" :task-id id :elapsed elapsed))) + (l/debug :hint "task interrupted" :id id :elapsed elapsed))) (catch Throwable cause (let [elapsed (dt/format-duration (tpoint))] (binding [l/*context* (get-error-context cause task)] (l/err :hint "unhandled exception on running task" - :task-id id + :id id :elapsed elapsed :cause cause)))) (finally @@ -86,7 +92,7 @@ (let [ts (ms-until-valid cron) ft (px/schedule! ts (partial execute-cron-task cfg task))] - (l/dbg :hint "schedule task" :task-id id + (l/dbg :hint "schedule task" :id id :ts (dt/format-duration ts) :at (dt/format-instant (dt/in-future ts))) @@ -135,7 +141,8 @@ cfg (assoc cfg ::entries entries ::running running)] (l/inf :hint "started" :tasks (count entries)) - (synchronize-cron-entries! cfg) + + (db/tx-run! cfg synchronize-cron-entries!) (->> (filter some? entries) (run! (partial schedule-cron-task cfg))) -- Gitee From ddfe5fbcb8083de396101f548c94e8514e3160e6 Mon Sep 17 00:00:00 2001 From: Jordi Sala Morales Date: Mon, 15 Apr 2024 10:16:07 +0000 Subject: [PATCH 0299/1266] Avoid non existent function warning --- frontend/src/app/libs/file_builder.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/libs/file_builder.cljs b/frontend/src/app/libs/file_builder.cljs index 4d3b21adc..0f0c3d069 100644 --- a/frontend/src/app/libs/file_builder.cljs +++ b/frontend/src/app/libs/file_builder.cljs @@ -253,7 +253,7 @@ (export [_] (->> (export-file file) - (rx/subs + (rx/subs! (fn [value] (when (not (contains? value :type)) (let [[file export-blob] value] -- Gitee From 56ba32b66de00ce232dc2a35e3b304a41d3fda56 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 16 Apr 2024 11:04:16 +0200 Subject: [PATCH 0300/1266] :sparkles: Reduce lock contention on uploading file object thumbnail --- .../src/app/rpc/commands/files_thumbnails.clj | 95 +++++++++---------- backend/test/backend_tests/rpc_file_test.clj | 2 +- 2 files changed, 46 insertions(+), 51 deletions(-) diff --git a/backend/src/app/rpc/commands/files_thumbnails.clj b/backend/src/app/rpc/commands/files_thumbnails.clj index a44a8bdbd..d766acd3c 100644 --- a/backend/src/app/rpc/commands/files_thumbnails.clj +++ b/backend/src/app/rpc/commands/files_thumbnails.clj @@ -228,51 +228,52 @@ ;; MUTATION COMMANDS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; MUTATION COMMAND: create-file-object-thumbnail - -(defn- create-file-object-thumbnail! - [{:keys [::db/conn ::sto/storage]} file-id object-id media tag] - - (let [thumb (db/get* conn :file-tagged-object-thumbnail - {:file-id file-id - :object-id object-id - :tag tag} - {::db/remove-deleted false - ::sql/for-update true}) - - path (:path media) +(def sql:get-file-object-thumbnail + "SELECT * FROM file_tagged_object_thumbnail + WHERE file_id = ? AND object_id = ? AND tag = ? + FOR UPDATE") + +(def sql:create-file-object-thumbnail + "INSERT INTO file_tagged_object_thumbnail (file_id, object_id, tag, media_id) + VALUES (?, ?, ?, ?) + ON CONFLICT (file_id, object_id, tag) + DO UPDATE SET updated_at=?, media_id=?, deleted_at=null + RETURNING *") + +(defn- persist-thumbnail! + [storage media created-at] + (let [path (:path media) mtype (:mtype media) hash (sto/calculate-hash path) data (-> (sto/content path) - (sto/wrap-with-hash hash)) - tnow (dt/now) + (sto/wrap-with-hash hash))] + + (sto/put-object! storage + {::sto/content data + ::sto/deduplicate? true + ::sto/touched-at created-at + :content-type mtype + :bucket "file-object-thumbnail"}))) - media (sto/put-object! storage - {::sto/content data - ::sto/deduplicate? true - ::sto/touched-at tnow - :content-type mtype - :bucket "file-object-thumbnail"})] - (if (some? thumb) - (do - ;; We mark the old media id as touched if it does not matches - (when (not= (:id media) (:media-id thumb)) - (sto/touch-object! storage (:media-id thumb))) - (db/update! conn :file-tagged-object-thumbnail - {:media-id (:id media) - :deleted-at nil - :updated-at tnow} - {:file-id file-id - :object-id object-id - :tag tag})) - (db/insert! conn :file-tagged-object-thumbnail - {:file-id file-id - :object-id object-id - :created-at tnow - :updated-at tnow - :tag tag - :media-id (:id media)})))) + +(defn- create-file-object-thumbnail! + [{:keys [::sto/storage] :as cfg} file-id object-id media tag] + (let [tsnow (dt/now) + media (persist-thumbnail! storage media tsnow) + [th1 th2] (db/tx-run! cfg (fn [{:keys [::db/conn]}] + (let [th1 (db/exec-one! conn [sql:get-file-object-thumbnail file-id object-id tag]) + th2 (db/exec-one! conn [sql:create-file-object-thumbnail + file-id object-id tag (:id media) + tsnow (:id media)])] + [th1 th2])))] + + (when (and (some? th1) + (not= (:media-id th1) + (:media-id th2))) + (sto/touch-object! storage (:media-id th1))) + + th2)) (def ^:private schema:create-file-object-thumbnail @@ -296,16 +297,10 @@ (media/validate-media-type! media) (media/validate-media-size! media) - (db/tx-run! cfg - (fn [{:keys [::db/conn] :as cfg}] - (files/check-edition-permissions! conn profile-id file-id) - (when-not (db/read-only? conn) - (let [cfg (-> cfg - (update ::sto/storage media/configure-assets-storage) - (assoc ::rtry/when rtry/conflict-exception?) - (assoc ::rtry/max-retries 5) - (assoc ::rtry/label "create-file-object-thumbnail"))] - (create-file-object-thumbnail! cfg file-id object-id media (or tag "frame"))))))) + (db/run! cfg files/check-edition-permissions! profile-id file-id) + + (let [cfg (update cfg ::sto/storage media/configure-assets-storage)] + (create-file-object-thumbnail! cfg file-id object-id media (or tag "frame")))) ;; --- MUTATION COMMAND: delete-file-object-thumbnail diff --git a/backend/test/backend_tests/rpc_file_test.clj b/backend/test/backend_tests/rpc_file_test.clj index a684227c8..c50c58252 100644 --- a/backend/test/backend_tests/rpc_file_test.clj +++ b/backend/test/backend_tests/rpc_file_test.clj @@ -1158,7 +1158,7 @@ ;; check that the unknown frame thumbnail is deleted (let [rows (th/db-query :file-tagged-object-thumbnail {:file-id (:id file)})] (t/is (= 2 (count rows))) - (t/is (= 1 (count (remove (comp some? :deleted-at) rows))))) + (t/is (= 1 (count (remove :deleted-at rows))))) (let [res (th/run-task! :objects-gc {:min-age 0})] (t/is (= 3 (:processed res)))) -- Gitee From caaf695352d46c40199b765713d356455f12479d Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 16 Apr 2024 12:01:14 +0200 Subject: [PATCH 0301/1266] :books: Update changelog --- CHANGES.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 6f85b3336..01dfd5b7c 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,13 @@ # CHANGELOG +## 2.0.2 + +### :sparkles: Enhancements + +- Fix locking contention on cron subsystem (causes backend start blocking) +- Fix locking contention on file object thumbails backend RPC calls + + ## 2.0.1 ### :bug: Bugs fixed -- Gitee From 64ff6d05c04bf268a61c586e05ea06eb862ffd11 Mon Sep 17 00:00:00 2001 From: Ikko Eltociear Ashimine Date: Fri, 12 Apr 2024 00:56:41 +0900 Subject: [PATCH 0302/1266] =?UTF-8?q?=F0=9F=90=9B=20Fix=20alt=20typo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Communnity -> Community --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 45cdc44c4..64b9649bc 100644 --- a/README.md +++ b/README.md @@ -114,7 +114,7 @@ You will find the following categories:

- Communnity + Community


-- Gitee From ec8c84744063a0b2df4a6e5b7c3765d66aa77d5d Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Tue, 16 Apr 2024 13:12:21 +0200 Subject: [PATCH 0303/1266] :bug: Fix wrong permissions on shared prototype for owners --- backend/src/app/rpc/commands/viewer.clj | 5 +++++ frontend/src/app/main/ui/viewer/header.cljs | 12 +++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/backend/src/app/rpc/commands/viewer.clj b/backend/src/app/rpc/commands/viewer.clj index c2887ef96..70d5193c1 100644 --- a/backend/src/app/rpc/commands/viewer.clj +++ b/backend/src/app/rpc/commands/viewer.clj @@ -38,6 +38,11 @@ team (-> (db/get conn :team {:id (:team-id project)}) (teams/decode-row)) + members (into #{} (->> (teams/get-team-members conn (:team-id project)) + (map :id))) + + perms (assoc perms :in-team (contains? members profile-id)) + _ (-> (cfeat/get-team-enabled-features cf/flags team) (cfeat/check-client-features! (:features params)) (cfeat/check-file-features! (:features file))) diff --git a/frontend/src/app/main/ui/viewer/header.cljs b/frontend/src/app/main/ui/viewer/header.cljs index 6e3051cf7..77460f0b6 100644 --- a/frontend/src/app/main/ui/viewer/header.cljs +++ b/frontend/src/app/main/ui/viewer/header.cljs @@ -180,7 +180,7 @@ :on-zoom-fit handle-zoom-fit :on-fullscreen toggle-fullscreen}] - (when (:can-edit permissions) + (when (:in-team permissions) [:span {:on-click go-to-workspace :class (stl/css :edit-btn)} i/curve]) @@ -191,7 +191,9 @@ :on-click toggle-fullscreen} i/expand] - (when (:is-admin permissions) + (when (and + (:in-team permissions) + (:is-admin permissions)) [:button {:on-click open-share-dialog :class (stl/css :share-btn)} (tr "labels.share")]) @@ -301,8 +303,8 @@ ;; If the user doesn't have permission we disable the link [:a {:class (stl/css :home-link) :on-click go-to-dashboard - :style {:cursor (when-not (:can-edit permissions) "auto") - :pointer-events (when-not (:can-edit permissions) "none")}} + :style {:cursor (when-not (:in-team permissions) "auto") + :pointer-events (when-not (:in-team permissions) "none")}} [:span {:class (stl/css :logo-icon)} i/logo-icon]] @@ -321,7 +323,7 @@ :title (tr "viewer.header.interactions-section" (sc/get-tooltip :open-interactions))} i/play] - (when (or (:can-edit permissions) + (when (or (:in-team permissions) (= (:who-comment permissions) "all")) [:button {:on-click navigate :data-value "comments" -- Gitee From e27c0b20866394ab7086d47b65299ead0b117c7e Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 16 Apr 2024 13:51:37 +0200 Subject: [PATCH 0304/1266] :sparkles: Add a task for asynchronous object update operation --- backend/src/app/main.clj | 7 +++++- backend/src/app/tasks/object_update.clj | 32 +++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 backend/src/app/tasks/object_update.clj diff --git a/backend/src/app/main.clj b/backend/src/app/main.clj index 6d5fc3d5f..97171825c 100644 --- a/backend/src/app/main.clj +++ b/backend/src/app/main.clj @@ -349,6 +349,8 @@ :audit-log-archive (ig/ref :app.loggers.audit.archive-task/handler) :audit-log-gc (ig/ref :app.loggers.audit.gc-task/handler) + :object-update + (ig/ref :app.tasks.object-update/handler) :process-webhook-event (ig/ref ::webhooks/process-event-handler) :run-webhook @@ -376,7 +378,10 @@ ::sto/storage (ig/ref ::sto/storage)} :app.tasks.orphan-teams-gc/handler - {::db/pool (ig/ref ::db/pool)} + {::db/pool (ig/ref ::db/pool)} + + :app.tasks.object-update/handler + {::db/pool (ig/ref ::db/pool)} :app.tasks.file-gc/handler {::db/pool (ig/ref ::db/pool) diff --git a/backend/src/app/tasks/object_update.clj b/backend/src/app/tasks/object_update.clj new file mode 100644 index 000000000..cfe5fda44 --- /dev/null +++ b/backend/src/app/tasks/object_update.clj @@ -0,0 +1,32 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.tasks.object-update + "A task used for perform simple object properties update + in an asynchronous flow." + (:require + [app.common.data :as d] + [app.common.logging :as l] + [app.db :as db] + [clojure.spec.alpha :as s] + [integrant.core :as ig])) + +(defn- update-object + [{:keys [::db/conn] :as cfg} {:keys [id object key val] :as props}] + (l/trc :hint "update object prop" + :id (str id) + :object (d/name object) + :key (d/name key) + :val val) + (db/update! conn object {key val} {:id id} {::db/return-keys false})) + +(defmethod ig/pre-init-spec ::handler [_] + (s/keys :req [::db/pool])) + +(defmethod ig/init-key ::handler + [_ cfg] + (fn [{:keys [props] :as params}] + (db/tx-run! cfg update-object props))) -- Gitee From c3a0db2431711d48863368434eeada3060d62f41 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 16 Apr 2024 14:52:37 +0200 Subject: [PATCH 0305/1266] :sparkles: Add the ability to schedule storage object touching as a task --- .../src/app/rpc/commands/files_thumbnails.clj | 2 +- backend/src/app/storage.clj | 26 ++++++++--- .../rpc_file_thumbnails_test.clj | 43 ++++++++++++++++++- 3 files changed, 62 insertions(+), 9 deletions(-) diff --git a/backend/src/app/rpc/commands/files_thumbnails.clj b/backend/src/app/rpc/commands/files_thumbnails.clj index d766acd3c..bd982ce17 100644 --- a/backend/src/app/rpc/commands/files_thumbnails.clj +++ b/backend/src/app/rpc/commands/files_thumbnails.clj @@ -271,7 +271,7 @@ (when (and (some? th1) (not= (:media-id th1) (:media-id th2))) - (sto/touch-object! storage (:media-id th1))) + (sto/touch-object! storage (:media-id th1) :async true)) th2)) diff --git a/backend/src/app/storage.clj b/backend/src/app/storage.clj index f6924aedb..070c53f3f 100644 --- a/backend/src/app/storage.clj +++ b/backend/src/app/storage.clj @@ -16,6 +16,7 @@ [app.storage.impl :as impl] [app.storage.s3 :as ss3] [app.util.time :as dt] + [app.worker :as wrk] [clojure.spec.alpha :as s] [datoteka.fs :as fs] [integrant.core :as ig] @@ -170,15 +171,28 @@ (impl/put-object object content)) object))) +(def ^:private default-touch-delay + "A default delay for the asynchronous touch operation" + (dt/duration "5m")) + (defn touch-object! "Mark object as touched." - [{:keys [::db/pool-or-conn] :as storage} object-or-id] + [{:keys [::db/pool-or-conn] :as storage} object-or-id & {:keys [async]}] (us/assert! ::storage storage) - (let [id (if (impl/object? object-or-id) (:id object-or-id) object-or-id) - rs (db/update! pool-or-conn :storage-object - {:touched-at (dt/now)} - {:id id})] - (pos? (db/get-update-count rs)))) + (let [id (if (impl/object? object-or-id) (:id object-or-id) object-or-id)] + (if async + (wrk/submit! ::wrk/conn pool-or-conn + ::wrk/task :object-update + ::wrk/delay default-touch-delay + :object :storage-object + :id id + :key :touched-at + :val (dt/now)) + (-> (db/update! pool-or-conn :storage-object + {:touched-at (dt/now)} + {:id id}) + (db/get-update-count) + (pos?))))) (defn get-object-data "Return an input stream instance of the object content." diff --git a/backend/test/backend_tests/rpc_file_thumbnails_test.clj b/backend/test/backend_tests/rpc_file_thumbnails_test.clj index f0cfc9637..11ed4f352 100644 --- a/backend/test/backend_tests/rpc_file_thumbnails_test.clj +++ b/backend/test/backend_tests/rpc_file_thumbnails_test.clj @@ -277,8 +277,6 @@ (t/is (thrown? org.postgresql.util.PSQLException (th/db-delete! :storage-object {:id (:media-id row1)})))))) - - (t/deftest get-file-object-thumbnail (let [storage (::sto/storage th/*system*) profile (th/create-profile* 1) @@ -317,3 +315,44 @@ (let [result (:result out)] (t/is (contains? result "test-key-2")))))) + +(t/deftest create-file-object-thumbnail + (th/db-delete! :task {:name "object-update"}) + (let [storage (::sto/storage th/*system*) + profile (th/create-profile* 1) + file (th/create-file* 1 {:profile-id (:id profile) + :project-id (:default-project-id profile) + :is-shared false}) + data {::th/type :create-file-object-thumbnail + ::rpc/profile-id (:id profile) + :file-id (:id file) + :object-id "test-key-2" + :media {:filename "sample.jpg" + :mtype "image/jpeg"}}] + + (let [data (update data :media + (fn [media] + (-> media + (assoc :path (th/tempfile "backend_tests/test_files/sample2.jpg")) + (assoc :size 7923)))) + out (th/command! data)] + (t/is (nil? (:error out))) + (t/is (map? (:result out)))) + + (let [data (update data :media + (fn [media] + (-> media + (assoc :path (th/tempfile "backend_tests/test_files/sample.jpg")) + (assoc :size 312043)))) + out (th/command! data)] + (t/is (nil? (:error out))) + (t/is (map? (:result out)))) + + (let [[row1 :as rows] + (->> (th/db-query :task {:name "object-update"}) + (map #(update % :props db/decode-transit-pgobject)))] + + ;; (app.common.pprint/pprint rows) + (t/is (= 1 (count rows))) + (t/is (> (inst-ms (dt/diff (:created-at row1) (:scheduled-at row1))) + (inst-ms (dt/duration "4m"))))))) -- Gitee From 25001e5b806ed29c40e3bfee3ec856a46f1158b3 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 16 Apr 2024 15:01:04 +0200 Subject: [PATCH 0306/1266] :paperclip: Add minor logging improvements on worker module --- backend/src/app/worker.clj | 6 ++++-- backend/src/app/worker/cron.clj | 2 +- backend/src/app/worker/runner.clj | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/backend/src/app/worker.clj b/backend/src/app/worker.clj index a648080f3..1da2e8de0 100644 --- a/backend/src/app/worker.clj +++ b/backend/src/app/worker.clj @@ -119,11 +119,13 @@ :next.jdbc/update-count))] (l/trc :hint "submit task" :name task + :task-id (str id) :queue queue :label label :dedupe (boolean dedupe) - :deleted (or deleted 0) - :in (dt/format-duration duration)) + :delay (dt/format-duration duration) + :replace (or deleted 0)) + (db/exec-one! conn [sql:insert-new-task id task props queue label priority max-retries interval]) diff --git a/backend/src/app/worker/cron.clj b/backend/src/app/worker/cron.clj index 72a66a22b..cb5a69d88 100644 --- a/backend/src/app/worker/cron.clj +++ b/backend/src/app/worker/cron.clj @@ -92,7 +92,7 @@ (let [ts (ms-until-valid cron) ft (px/schedule! ts (partial execute-cron-task cfg task))] - (l/dbg :hint "schedule task" :id id + (l/dbg :hint "schedule" :id id :ts (dt/format-duration ts) :at (dt/format-instant (dt/in-future ts))) diff --git a/backend/src/app/worker/runner.clj b/backend/src/app/worker/runner.clj index 11ca3d972..e68fa484d 100644 --- a/backend/src/app/worker/runner.clj +++ b/backend/src/app/worker/runner.clj @@ -139,7 +139,7 @@ :else (try - (l/trc :hint "start task" + (l/trc :hint "start" :name (:name task) :task-id (str task-id) :queue queue @@ -149,7 +149,7 @@ result (handle-task task) elapsed (dt/format-duration (tpoint))] - (l/trc :hint "end task" + (l/trc :hint "end" :name (:name task) :task-id (str task-id) :queue queue -- Gitee From 16fa0b0330e0a1481a60a8d2f9a57b128357a803 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 16 Apr 2024 17:24:33 +0200 Subject: [PATCH 0307/1266] :sparkles: Improve email clean mechanism --- backend/src/app/rpc/commands/profile.clj | 4 ++++ backend/test/backend_tests/rpc_profile_test.clj | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/backend/src/app/rpc/commands/profile.clj b/backend/src/app/rpc/commands/profile.clj index 89a50b6ad..fe33da10d 100644 --- a/backend/src/app/rpc/commands/profile.clj +++ b/backend/src/app/rpc/commands/profile.clj @@ -46,6 +46,10 @@ (let [email (str/lower email) email (if (str/starts-with? email "mailto:") (subs email 7) + email) + email (if (or (str/starts-with? email "<") + (str/ends-with? email ">")) + (str/trim email "<>") email)] email)) diff --git a/backend/test/backend_tests/rpc_profile_test.clj b/backend/test/backend_tests/rpc_profile_test.clj index cbaff6038..00d2f2ac0 100644 --- a/backend/test/backend_tests/rpc_profile_test.clj +++ b/backend/test/backend_tests/rpc_profile_test.clj @@ -27,6 +27,14 @@ (t/use-fixtures :once th/state-init) (t/use-fixtures :each th/database-reset) + +(t/deftest clean-email + (t/is "foo@example.com" (profile/clean-email "mailto:foo@example.com")) + (t/is "foo@example.com" (profile/clean-email "mailto:")) + (t/is "foo@example.com" (profile/clean-email "")) + (t/is "foo@example.com" (profile/clean-email "foo@example.com>")) + (t/is "foo@example.com" (profile/clean-email " Date: Tue, 16 Apr 2024 17:31:23 +0200 Subject: [PATCH 0308/1266] :sparkles: Add minor improvement to worker module logging --- backend/src/app/worker/runner.clj | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/src/app/worker/runner.clj b/backend/src/app/worker/runner.clj index e68fa484d..be3663365 100644 --- a/backend/src/app/worker/runner.clj +++ b/backend/src/app/worker/runner.clj @@ -139,7 +139,7 @@ :else (try - (l/trc :hint "start" + (l/dbg :hint "start" :name (:name task) :task-id (str task-id) :queue queue @@ -149,7 +149,7 @@ result (handle-task task) elapsed (dt/format-duration (tpoint))] - (l/trc :hint "end" + (l/dbg :hint "end" :name (:name task) :task-id (str task-id) :queue queue @@ -228,9 +228,9 @@ (recur)))) (catch InterruptedException _ - (l/debug :hint "interrupted" - :id id - :queue queue)) + (l/dbg :hint "interrupted" + :id id + :queue queue)) (catch Throwable cause (l/err :hint "unexpected exception" :id id -- Gitee From 57346ab6852d0ac67b2fd59b5eed65267ee59263 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 17 Apr 2024 13:58:02 +0200 Subject: [PATCH 0309/1266] :books: Update changelog to reflect breaking change --- CHANGES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 01dfd5b7c..100296f4d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -28,6 +28,8 @@ ### :boom: Breaking changes & Deprecations - New strokes default to inside border [Taiga #6847](https://tree.taiga.io/project/penpot/issue/6847) +- Change default z ordering on layers in flex layout. The previous behavior was inconsistent with how HTML works and we changed it to be more consistent. Previous layers that overlapped could be hidden, the fastest way to fix this is changing the z-index property but a better way is to change the order of your layers. + ### :heart: Community contributions (Thank you!) - New Hausa, Yoruba and Igbo translations and update translation files (by All For Tech Empowerment Foundation) [Taiga #6950](https://tree.taiga.io/project/penpot/us/6950), [Taiga #6534](https://tree.taiga.io/project/penpot/us/6534) -- Gitee From ef632bcae7adde4e0bfc1b9ca3d235e9af9ebc03 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 27 Feb 2024 14:17:00 +0100 Subject: [PATCH 0310/1266] :sparkles: Trigger email verification on OIDC register process This will happen only if: - the oidc provider properly reports that user has a non-verified email - the oidc does not provides any way to know the email verification status --- backend/src/app/auth/oidc.clj | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/backend/src/app/auth/oidc.clj b/backend/src/app/auth/oidc.clj index 34e2cee57..421336256 100644 --- a/backend/src/app/auth/oidc.clj +++ b/backend/src/app/auth/oidc.clj @@ -20,7 +20,6 @@ [app.http.client :as http] [app.http.session :as session] [app.loggers.audit :as audit] - [app.main :as-alias main] [app.rpc.commands.profile :as profile] [app.setup :as-alias setup] [app.tokens :as tokens] @@ -531,13 +530,21 @@ (->> (redirect-response uri) (sxf request))) - (if (auth/email-domain-in-whitelist? (:email info)) (let [info (assoc info :iss :prepared-register - :is-active true :exp (dt/in-future {:hours 48})) + + props (:props info) + info (if (or (:google/email_verified props) + (:github/email_verified props) + (:gitlab/email_verified props) + (:oidc/email_verified props)) + (assoc info :is-active true) + info) + token (tokens/generate (::setup/props cfg) info) + params (d/without-nils {:token token :fullname (:fullname info)}) @@ -548,7 +555,6 @@ (redirect-response uri)) (generate-error-redirect cfg "email-domain-not-allowed")))) - (defn- auth-handler [cfg {:keys [params] :as request}] (let [props (audit/extract-utm-params params) -- Gitee From 606aeeb38fd79ac76fac9fcd5de0f997e5db06e9 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 27 Feb 2024 17:04:18 +0100 Subject: [PATCH 0311/1266] :sparkles: Allow attach context to audit entry from metadata --- backend/src/app/loggers/audit.clj | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/src/app/loggers/audit.clj b/backend/src/app/loggers/audit.clj index d89809f37..c0814a9f2 100644 --- a/backend/src/app/loggers/audit.clj +++ b/backend/src/app/loggers/audit.clj @@ -150,8 +150,9 @@ (clean-props)) token-id (::actoken/id request) - context (d/without-nils - {:access-token-id (some-> token-id str)})] + context (-> (::context resultm) + (assoc :access-token-id (some-> token-id str)) + (d/without-nils))] {::type (or (::type resultm) (::rpc/type cfg)) -- Gitee From ce790d83fdcd17dd333b7950896d59d18127293c Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 27 Feb 2024 17:06:02 +0100 Subject: [PATCH 0312/1266] :sparkles: Improve internal registration flow --- backend/src/app/auth/oidc.clj | 186 +++++++------- backend/src/app/http/debug.clj | 103 ++++---- backend/src/app/rpc/commands/auth.clj | 237 ++++++++++-------- backend/src/app/rpc/commands/profile.clj | 4 +- backend/src/app/rpc/commands/verify_token.clj | 12 +- backend/src/app/srepl/main.clj | 12 +- .../test/backend_tests/rpc_profile_test.clj | 207 +++++++++------ frontend/src/app/main/ui/auth/login.cljs | 4 +- frontend/src/app/main/ui/auth/register.cljs | 71 ++---- 9 files changed, 453 insertions(+), 383 deletions(-) diff --git a/backend/src/app/auth/oidc.clj b/backend/src/app/auth/oidc.clj index 421336256..e69713d6c 100644 --- a/backend/src/app/auth/oidc.clj +++ b/backend/src/app/auth/oidc.clj @@ -282,12 +282,12 @@ (into [(keyword (:name provider) fitem)] (map keyword) items))) (defn- build-redirect-uri - [{:keys [provider] :as cfg}] + [{:keys [::provider] :as cfg}] (let [public (u/uri (cf/get :public-uri))] (str (assoc public :path (str "/api/auth/oauth/" (:name provider) "/callback"))))) (defn- build-auth-uri - [{:keys [provider] :as cfg} state] + [{:keys [::provider] :as cfg} state] (let [params {:client_id (:client-id provider) :redirect_uri (build-redirect-uri cfg) :response_type "code" @@ -298,15 +298,19 @@ (assoc :query query) (str)))) +(defn- qualify-prop-key + [provider k] + (keyword (:name provider) (name k))) + (defn- qualify-props [provider props] (reduce-kv (fn [result k v] - (assoc result (keyword (:name provider) (name k)) v)) + (assoc result (qualify-prop-key provider k) v)) {} props)) -(defn fetch-access-token - [{:keys [provider] :as cfg} code] +(defn- fetch-access-token + [{:keys [::provider] :as cfg} code] (let [params {:client_id (:client-id provider) :client_secret (:client-secret provider) :code code @@ -363,7 +367,7 @@ :props props}))) (defn- fetch-user-info - [{:keys [provider] :as cfg} tdata] + [{:keys [::provider] :as cfg} tdata] (l/trace :hint "fetch user info" :uri (:user-uri provider) :token (obfuscate-string (:token/access tdata))) @@ -388,7 +392,7 @@ (-> response :body json/decode))) (defn- get-user-info - [{:keys [provider]} tdata] + [{:keys [::provider]} tdata] (try (when (:token/id tdata) (let [{:keys [kid alg] :as theader} (jwt/decode-header (:token/id tdata))] @@ -412,8 +416,8 @@ ::fullname ::props])) -(defn get-info - [{:keys [provider ::setup/props] :as cfg} {:keys [params] :as request}] +(defn- get-info + [{:keys [::provider ::setup/props] :as cfg} {:keys [params] :as request}] (when-let [error (get params :error)] (ex/raise :type :internal :code :error-on-retrieving-code @@ -471,89 +475,101 @@ (update :props merge (:props state))))) (defn- get-profile - [{:keys [::db/pool] :as cfg} info] - (dm/with-open [conn (db/open pool)] - (some->> (:email info) - (profile/clean-email) - (profile/get-profile-by-email conn)))) + [cfg info] + (db/run! cfg (fn [{:keys [::db/conn]}] + (some->> (:email info) + (profile/clean-email) + (profile/get-profile-by-email conn))))) (defn- redirect-response [uri] {::rres/status 302 ::rres/headers {"location" (str uri)}}) -(defn- generate-error-redirect - [_ cause] - (let [data (if (ex/error? cause) (ex-data cause) nil) - code (or (:code data) :unexpected) - type (or (:type data) :internal) - hint (or (:hint data) - (if (ex/exception? cause) - (ex-message cause) - (str cause))) - - params {:error "unable-to-auth" - :hint hint - :type type - :code code} - +(defn- redirect-with-error + ([error] (redirect-with-error error nil)) + ([error hint] + (let [params {:error error :hint hint} + params (d/without-nils params) + uri (-> (u/uri (cf/get :public-uri)) + (assoc :path "/#/auth/login") + (assoc :query (u/map->query-string params)))] + (redirect-response uri)))) + +(defn- redirect-to-register + [cfg info] + (let [info (assoc info + :iss :prepared-register + :exp (dt/in-future {:hours 48})) + + params {:token (tokens/generate (::setup/props cfg) info) + :fullname (:fullname info)} + params (d/without-nils params)] + + (redirect-response + (-> (u/uri (cf/get :public-uri)) + (assoc :path "/#/auth/register/validate") + (assoc :query (u/map->query-string params)))))) + +(defn- redirect-to-verify-token + [token] + (let [params {:token token} uri (-> (u/uri (cf/get :public-uri)) - (assoc :path "/#/auth/login") + (assoc :path "/#/auth/verify-token") (assoc :query (u/map->query-string params)))] (redirect-response uri))) -(defn- generate-redirect +(defn- provider-matches-profile? + [{:keys [::provider] :as cfg} {:keys [props] :as profile}] + (or (= (:auth-backend profile) (:name provider)) + (let [email-prop (qualify-prop-key provider :email)] + (contains? props email-prop)))) + +(defn- provider-has-email-verified? + [{:keys [::provider] :as cfg} {:keys [props] :as info}] + (let [prop (qualify-prop-key provider :email_verified)] + (true? (get props prop)))) + +(defn- process-callback [cfg request info profile] - (if profile - (let [sxf (session/create-fn cfg (:id profile)) - token (or (:invitation-token info) - (tokens/generate (::setup/props cfg) - {:iss :auth - :exp (dt/in-future "15m") - :profile-id (:id profile)})) - params {:token token} - uri (-> (u/uri (cf/get :public-uri)) - (assoc :path "/#/auth/verify-token") - (assoc :query (u/map->query-string params)))] - - (when (:is-blocked profile) - (ex/raise :type :restriction - :code :profile-blocked)) - - (audit/submit! cfg {::audit/type "command" - ::audit/name "login-with-oidc" - ::audit/profile-id (:id profile) - ::audit/ip-addr (audit/parse-client-ip request) - ::audit/props (audit/profile->props profile)}) - - (->> (redirect-response uri) - (sxf request))) - - (if (auth/email-domain-in-whitelist? (:email info)) - (let [info (assoc info - :iss :prepared-register - :exp (dt/in-future {:hours 48})) - - props (:props info) - info (if (or (:google/email_verified props) - (:github/email_verified props) - (:gitlab/email_verified props) - (:oidc/email_verified props)) - (assoc info :is-active true) - info) - - token (tokens/generate (::setup/props cfg) info) - - params (d/without-nils - {:token token - :fullname (:fullname info)}) - uri (-> (u/uri (cf/get :public-uri)) - (assoc :path "/#/auth/register/validate") - (assoc :query (u/map->query-string params)))] - - (redirect-response uri)) - (generate-error-redirect cfg "email-domain-not-allowed")))) + (cond + (some? profile) + (cond + (:is-blocked profile) + (redirect-with-error "profile-blocked") + + (not (provider-matches-profile? cfg profile)) + (redirect-with-error "auth-provider-not-allowed") + + (not (:is-active profile)) + (let [info (assoc info :profile-id (:id profile))] + (redirect-to-register cfg info)) + + :else + (let [sxf (session/create-fn cfg (:id profile)) + token (or (:invitation-token info) + (tokens/generate (::setup/props cfg) + {:iss :auth + :exp (dt/in-future "15m") + :props (:props info) + :profile-id (:id profile)}))] + + (audit/submit! cfg {::audit/type "command" + ::audit/name "login-with-oidc" + ::audit/profile-id (:id profile) + ::audit/ip-addr (audit/parse-client-ip request) + ::audit/props (audit/profile->props profile)}) + + (->> (redirect-to-verify-token token) + (sxf request)))) + + (not (auth/email-domain-in-whitelist? (:email info))) + (redirect-with-error "email-domain-not-allowed") + + :else + (let [info (assoc info :is-active (provider-has-email-verified? cfg info))] + (redirect-to-register cfg info)))) (defn- auth-handler [cfg {:keys [params] :as request}] @@ -572,10 +588,10 @@ (try (let [info (get-info cfg request) profile (get-profile cfg info)] - (generate-redirect cfg request info profile)) + (process-callback cfg request info profile)) (catch Throwable cause - (l/warn :hint "error on oauth process" :cause cause) - (generate-error-redirect cfg cause)))) + (l/err :hint "error on oauth process" :cause cause) + (redirect-with-error "unable-to-auth" (ex-message cause))))) (def provider-lookup {:compile @@ -584,13 +600,12 @@ (fn [request] (let [provider (some-> request :path-params :provider keyword)] (if-let [provider (get providers provider)] - (handler (assoc cfg :provider provider) request) + (handler (assoc cfg ::provider provider) request) (ex/raise :type :restriction :code :provider-not-configured :provider provider :hint "provider not configured"))))))}) - (s/def ::client-id ::cf/oidc-client-id) (s/def ::client-secret ::cf/oidc-client-secret) (s/def ::base-uri ::cf/oidc-base-uri) @@ -603,7 +618,6 @@ (s/def ::email-attr ::cf/oidc-email-attr) (s/def ::name-attr ::cf/oidc-name-attr) -;; FIXME: migrate to qualified-keywords (s/def ::provider (s/keys :req-un [::client-id ::client-secret] diff --git a/backend/src/app/http/debug.clj b/backend/src/app/http/debug.clj index a453c6872..c62202572 100644 --- a/backend/src/app/http/debug.clj +++ b/backend/src/app/http/debug.clj @@ -16,7 +16,6 @@ [app.config :as cf] [app.db :as db] [app.http.session :as session] - [app.main :as-alias main] [app.rpc.commands.auth :as auth] [app.rpc.commands.files-create :refer [create-file]] [app.rpc.commands.profile :as profile] @@ -341,57 +340,57 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defn- resend-email-notification - [{:keys [::db/pool ::setup/props] :as cfg} {:keys [params] :as request}] - - (when-not (contains? params :force) - (ex/raise :type :validation - :code :missing-force - :hint "missing force checkbox")) - - (let [profile (some->> params - :email - (profile/clean-email) - (profile/get-profile-by-email pool))] - - (when-not profile - (ex/raise :type :validation - :code :missing-profile - :hint "unable to find profile by email")) - - (cond - (contains? params :block) - (do - (db/update! pool :profile {:is-blocked true} {:id (:id profile)}) - (db/delete! pool :http-session {:profile-id (:id profile)}) - - {::rres/status 200 - ::rres/headers {"content-type" "text/plain"} - ::rres/body (str/ffmt "PROFILE '%' BLOCKED" (:email profile))}) - - (contains? params :unblock) - (do - (db/update! pool :profile {:is-blocked false} {:id (:id profile)}) - {::rres/status 200 - ::rres/headers {"content-type" "text/plain"} - ::rres/body (str/ffmt "PROFILE '%' UNBLOCKED" (:email profile))}) - - (contains? params :resend) - (if (:is-blocked profile) - {::rres/status 200 - ::rres/headers {"content-type" "text/plain"} - ::rres/body "PROFILE ALREADY BLOCKED"} - (do - (auth/send-email-verification! pool props profile) - {::rres/status 200 - ::rres/headers {"content-type" "text/plain"} - ::rres/body (str/ffmt "RESENDED FOR '%'" (:email profile))})) - - :else - (do - (db/update! pool :profile {:is-active true} {:id (:id profile)}) - {::rres/status 200 - ::rres/headers {"content-type" "text/plain"} - ::rres/body (str/ffmt "PROFILE '%' ACTIVATED" (:email profile))})))) + [cfg {:keys [params] :as request}] + (db/tx-run! cfg (fn [{:keys [::db/conn] :as cfg}] + (when-not (contains? params :force) + (ex/raise :type :validation + :code :missing-force + :hint "missing force checkbox")) + + (let [profile (some->> params + :email + (profile/clean-email) + (profile/get-profile-by-email conn))] + + (when-not profile + (ex/raise :type :validation + :code :missing-profile + :hint "unable to find profile by email")) + + (cond + (contains? params :block) + (do + (db/update! conn :profile {:is-blocked true} {:id (:id profile)}) + (db/delete! conn :http-session {:profile-id (:id profile)}) + + {::rres/status 200 + ::rres/headers {"content-type" "text/plain"} + ::rres/body (str/ffmt "PROFILE '%' BLOCKED" (:email profile))}) + + (contains? params :unblock) + (do + (db/update! conn :profile {:is-blocked false} {:id (:id profile)}) + {::rres/status 200 + ::rres/headers {"content-type" "text/plain"} + ::rres/body (str/ffmt "PROFILE '%' UNBLOCKED" (:email profile))}) + + (contains? params :resend) + (if (:is-blocked profile) + {::rres/status 200 + ::rres/headers {"content-type" "text/plain"} + ::rres/body "PROFILE ALREADY BLOCKED"} + (do + (#'auth/send-email-verification! cfg profile) + {::rres/status 200 + ::rres/headers {"content-type" "text/plain"} + ::rres/body (str/ffmt "RESENDED FOR '%'" (:email profile))})) + + :else + (do + (db/update! conn :profile {:is-active true} {:id (:id profile)}) + {::rres/status 200 + ::rres/headers {"content-type" "text/plain"} + ::rres/body (str/ffmt "PROFILE '%' ACTIVATED" (:email profile))})))))) (defn- reset-file-version diff --git a/backend/src/app/rpc/commands/auth.clj b/backend/src/app/rpc/commands/auth.clj index e87979007..586c60d1c 100644 --- a/backend/src/app/rpc/commands/auth.clj +++ b/backend/src/app/rpc/commands/auth.clj @@ -19,7 +19,6 @@ [app.email :as eml] [app.http.session :as session] [app.loggers.audit :as audit] - [app.main :as-alias main] [app.rpc :as-alias rpc] [app.rpc.climit :as-alias climit] [app.rpc.commands.profile :as profile] @@ -38,6 +37,14 @@ (def schema:token [::sm/word-string {:max 6000}]) +(def ^:private default-verify-threshold + (dt/duration "15m")) + +(defn- elapsed-verify-threshold? + [profile] + (let [elapsed (dt/diff (:modified-at profile) (dt/now))] + (pos? (compare elapsed default-verify-threshold)))) + ;; ---- COMMAND: login with password (defn login-with-password @@ -139,7 +146,7 @@ (update-password [conn profile-id] (let [pwd (profile/derive-password cfg password)] - (db/update! conn :profile {:password pwd} {:id profile-id}) + (db/update! conn :profile {:password pwd :is-active true} {:id profile-id}) nil))] (db/with-atomic [conn pool] @@ -162,8 +169,8 @@ ;; ---- COMMAND: Prepare Register -(defn validate-register-attempt! - [{:keys [::db/pool] :as cfg} params] +(defn- validate-register-attempt! + [cfg params] (when-not (contains? cf/flags :registration) (when-not (contains? params :invitation-token) @@ -171,7 +178,9 @@ :code :registration-disabled))) (when (contains? params :invitation-token) - (let [invitation (tokens/verify (::setup/props cfg) {:token (:invitation-token params) :iss :team-invitation})] + (let [invitation (tokens/verify (::setup/props cfg) + {:token (:invitation-token params) + :iss :team-invitation})] (when-not (= (:email params) (:member-email invitation)) (ex/raise :type :restriction :code :email-does-not-match-invitation @@ -181,13 +190,6 @@ (ex/raise :type :validation :code :email-domain-is-not-allowed)) - ;; Don't allow proceed in preparing registration if the profile is - ;; already reported as spammer. - (when (eml/has-bounce-reports? pool (:email params)) - (ex/raise :type :validation - :code :email-has-permanent-bounces - :hint "looks like the email has one or many bounces reported")) - ;; Perform a basic validation of email & password (when (= (str/lower (:email params)) (str/lower (:password params))) @@ -195,35 +197,13 @@ :code :email-as-password :hint "you can't use your email as password"))) -(def register-retry-threshold - (dt/duration "15m")) - -(defn- elapsed-register-retry-threshold? - [profile] - (let [elapsed (dt/diff (:modified-at profile) (dt/now))] - (pos? (compare elapsed register-retry-threshold)))) - (defn prepare-register [{:keys [::db/pool] :as cfg} {:keys [email] :as params}] (validate-register-attempt! cfg params) (let [email (profile/clean-email email) - profile (when-let [profile (profile/get-profile-by-email pool email)] - (cond - (:is-blocked profile) - (ex/raise :type :restriction - :code :profile-blocked) - - (and (not (:is-active profile)) - (elapsed-register-retry-threshold? profile)) - profile - - :else - (ex/raise :type :validation - :code :email-already-exists - :hint "profile already exists"))) - + profile (profile/get-profile-by-email pool email) params {:email email :password (:password params) :invitation-token (:invitation-token params) @@ -233,7 +213,6 @@ :exp (dt/in-future {:days 7})} params (d/without-nils params) - token (tokens/generate (::setup/props cfg) params)] (with-meta {:token token} {::audit/profile-id uuid/zero}))) @@ -317,17 +296,16 @@ {::db/return-keys true}) (profile/decode-row)))) - (defn send-email-verification! - [conn props profile] - (let [vtoken (tokens/generate props + [{:keys [::db/conn] :as cfg} profile] + (let [vtoken (tokens/generate (::setup/props cfg) {:iss :verify-email :exp (dt/in-future "72h") :profile-id (:id profile) :email (:email profile)}) ;; NOTE: this token is mainly used for possible complains ;; identification on the sns webhook - ptoken (tokens/generate props + ptoken (tokens/generate (::setup/props cfg) {:iss :profile-identity :profile-id (:id profile) :exp (dt/in-future {:days 30})})] @@ -346,69 +324,94 @@ (into params) (assoc :fullname fullname)) - is-active (or (:is-active params) - (not (contains? cf/flags :email-verification))) - profile (if-let [profile-id (:profile-id claims)] (profile/get-profile conn profile-id) - (let [params (-> params - (assoc :is-active is-active) - (update :password #(profile/derive-password cfg %)))] + (let [is-active (or (boolean (:is-active params)) + (not (contains? cf/flags :email-verification))) + params (-> params + (assoc :is-active is-active) + (update :password #(profile/derive-password cfg %)))] (->> (create-profile! conn params) (create-profile-rels! conn)))) invitation (when-let [token (:invitation-token params)] - (tokens/verify (::setup/props cfg) {:token token :iss :team-invitation}))] - - ;; If profile is filled in claims, means it tries to register - ;; again, so we proceed to update the modified-at attr - ;; accordingly. - (when-let [id (:profile-id claims)] - (db/update! conn :profile {:modified-at (dt/now)} {:id id}) - (audit/submit! cfg - {::audit/type "fact" - ::audit/name "register-profile-retry" - ::audit/profile-id id})) + (tokens/verify (::setup/props cfg) {:token token :iss :team-invitation})) + + props (audit/profile->props profile)] + (cond - ;; If invitation token comes in params, this is because the - ;; user comes from team-invitation process; in this case, - ;; regenerate token and send back to the user a new invitation - ;; token (and mark current session as logged). This happens - ;; only if the invitation email matches with the register - ;; email. - (and (some? invitation) (= (:email profile) (:member-email invitation))) + ;; When profile is blocked, we just ignore it and return plain data + (:is-blocked profile) + (do + (l/wrn :hint "register attempt for already blocked profile" + :profile-id (str (:id profile)) + :profile-email (:email profile)) + (rph/with-meta {:email (:email profile)} + {::audit/replace-props props + ::audit/context {:action "ignore-because-blocked"} + ::audit/profile-id (:id profile) + ::audit/name "register-profile-retry"})) + + ;; If invitation token comes in params, this is because the user + ;; comes from team-invitation process; in this case, regenerate + ;; token and send back to the user a new invitation token (and + ;; mark current session as logged). This happens only if the + ;; invitation email matches with the register email. + (and (some? invitation) + (= (:email profile) + (:member-email invitation))) (let [claims (assoc invitation :member-id (:id profile)) - token (tokens/generate (::setup/props cfg) claims) - resp {:invitation-token token}] - (-> resp + token (tokens/generate (::setup/props cfg) claims)] + (-> {:invitation-token token} (rph/with-transform (session/create-fn cfg (:id profile))) - (rph/with-meta {::audit/replace-props (audit/profile->props profile) + (rph/with-meta {::audit/replace-props props + ::audit/context {:action "accept-invitation"} ::audit/profile-id (:id profile)}))) - ;; If auth backend is different from "penpot" means user is - ;; registering using third party auth mechanism; in this case - ;; we need to mark this session as logged. - (not= "penpot" (:auth-backend profile)) - (-> (profile/strip-private-attrs profile) - (rph/with-transform (session/create-fn cfg (:id profile))) - (rph/with-meta {::audit/replace-props (audit/profile->props profile) - ::audit/profile-id (:id profile)})) - - ;; If the `:enable-insecure-register` flag is set, we proceed - ;; to sign in the user directly, without email verification. - (true? is-active) - (-> (profile/strip-private-attrs profile) - (rph/with-transform (session/create-fn cfg (:id profile))) - (rph/with-meta {::audit/replace-props (audit/profile->props profile) - ::audit/profile-id (:id profile)})) - - ;; In all other cases, send a verification email. + ;; When a new user is created and it is already activated by + ;; configuration or specified by OIDC, we just mark the profile + ;; as logged-in + (not (:profile-id claims)) + (if (:is-active claims) + (-> (profile/strip-private-attrs profile) + (rph/with-transform (session/create-fn cfg (:id profile))) + (rph/with-meta + {::audit/replace-props props + ::audit/context {:action "login"} + ::audit/profile-id (:id profile)})) + + (do + (send-email-verification! cfg profile) + (rph/with-meta {:email (:email profile)} + {::audit/replace-props props + ::audit/context {:action "email-verification"} + ::audit/profile-id (:id profile)}))) + :else - (do - (send-email-verification! conn (::setup/props cfg) profile) - (rph/with-meta profile + (let [elapsed? (elapsed-verify-threshold? profile) + bounce? (eml/has-bounce-reports? conn (:email profile)) + action (if bounce? + "ignore-because-bounce" + (if elapsed? + "resend-email-verification" + "ignore"))] + + (l/wrn :hint "repeated registry detected" + :profile-id (str (:id profile)) + :profile-email (:email profile) + :context-action action) + + (when (= action "resend-email-verification") + (db/update! conn :profile + {:modified-at (dt/now)} + {:id (:id profile)}) + (send-email-verification! cfg profile)) + + (rph/with-meta {:email (:email profile)} {::audit/replace-props (audit/profile->props profile) - ::audit/profile-id (:id profile)}))))) + ::audit/context {:action action} + ::audit/profile-id (:id profile) + ::audit/name "register-profile-retry"}))))) (def schema:register-profile [:map {:title "register-profile"} @@ -427,7 +430,7 @@ ;; ---- COMMAND: Request Profile Recovery -(defn request-profile-recovery +(defn- request-profile-recovery [{:keys [::db/pool] :as cfg} {:keys [email] :as params}] (letfn [(create-recovery-token [{:keys [id] :as profile}] (let [token (tokens/generate (::setup/props cfg) @@ -451,26 +454,38 @@ nil))] (db/with-atomic [conn pool] - (when-let [profile (->> (profile/clean-email email) - (profile/get-profile-by-email conn))] - (when-not (eml/allow-send-emails? conn profile) - (ex/raise :type :validation - :code :profile-is-muted - :hint "looks like the profile has reported repeatedly as spam or has permanent bounces.")) - - (when-not (:is-active profile) - (ex/raise :type :validation - :code :profile-not-verified - :hint "the user need to validate profile before recover password")) - - (when (eml/has-bounce-reports? conn (:email profile)) - (ex/raise :type :validation - :code :email-has-permanent-bounces - :hint "looks like the email you invite has been repeatedly reported as spam or permanent bounce")) - - (->> profile - (create-recovery-token) - (send-email-notification conn)))))) + (let [profile (->> (profile/clean-email email) + (profile/get-profile-by-email conn))] + + (cond + (not profile) + (l/wrn :hint "attempt of profile recovery: no profile found" + :profile-email email) + + (not (eml/allow-send-emails? conn profile)) + (l/wrn :hint "attempt of profile recovery: profile is muted" + :profile-id (str (:id profile)) + :profile-email (:email profile)) + + (eml/has-bounce-reports? conn (:email profile)) + (l/wrn :hint "attempt of profile recovery: email has bounces" + :profile-id (str (:id profile)) + :profile-email (:email profile)) + + (not (elapsed-verify-threshold? profile)) + (l/wrn :hint "attempt of profile recovery: retry attempt threshold not elapsed" + :profile-id (str (:id profile)) + :profile-email (:email profile)) + + + :else + (do + (db/update! conn :profile + {:modified-at (dt/now)} + {:id (:id profile)}) + (->> profile + (create-recovery-token) + (send-email-notification conn)))))))) (def schema:request-profile-recovery diff --git a/backend/src/app/rpc/commands/profile.clj b/backend/src/app/rpc/commands/profile.clj index fe33da10d..ef9d15e93 100644 --- a/backend/src/app/rpc/commands/profile.clj +++ b/backend/src/app/rpc/commands/profile.clj @@ -91,8 +91,8 @@ (defn get-profile "Get profile by id. Throws not-found exception if no profile found." - [conn id & {:as attrs}] - (-> (db/get-by-id conn :profile id attrs) + [conn id & {:as opts}] + (-> (db/get-by-id conn :profile id opts) (decode-row))) ;; --- MUTATION: Update Profile (own) diff --git a/backend/src/app/rpc/commands/verify_token.clj b/backend/src/app/rpc/commands/verify_token.clj index e072c90d6..fc92727da 100644 --- a/backend/src/app/rpc/commands/verify_token.clj +++ b/backend/src/app/rpc/commands/verify_token.clj @@ -9,6 +9,7 @@ [app.common.exceptions :as ex] [app.common.spec :as us] [app.db :as db] + [app.db.sql :as-alias sql] [app.http.session :as session] [app.loggers.audit :as audit] [app.main :as-alias main] @@ -82,7 +83,16 @@ (defmethod process-token :auth [{:keys [conn] :as cfg} _params {:keys [profile-id] :as claims}] - (let [profile (profile/get-profile conn profile-id)] + (let [profile (profile/get-profile conn profile-id {::sql/for-update true}) + props (merge (:props profile) + (:props claims)) + profile (assoc profile :props props)] + + (when (not= props (:props profile)) + (db/update! conn :profile + {:props (db/tjson props)} + {:id profile-id})) + (assoc claims :profile profile))) ;; --- Team Invitation diff --git a/backend/src/app/srepl/main.clj b/backend/src/app/srepl/main.clj index 2f538d6f6..48a15d811 100644 --- a/backend/src/app/srepl/main.clj +++ b/backend/src/app/srepl/main.clj @@ -86,13 +86,11 @@ (defn resend-email-verification-email! [email] - (let [sprops (:app.setup/props main/system) - pool (:app.db/pool main/system) - email (profile/clean-email email) - profile (profile/get-profile-by-email pool email)] - - (auth/send-email-verification! pool sprops profile) - :email-sent)) + (db/tx-run! main/system + (fn [{:keys [::db/conn] :as cfg}] + (let [email (profile/clean-email email) + profile (profile/get-profile-by-email conn email)] + (#'auth/send-email-verification! cfg profile))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; PROFILES MANAGEMENT diff --git a/backend/test/backend_tests/rpc_profile_test.clj b/backend/test/backend_tests/rpc_profile_test.clj index 00d2f2ac0..95a275874 100644 --- a/backend/test/backend_tests/rpc_profile_test.clj +++ b/backend/test/backend_tests/rpc_profile_test.clj @@ -229,20 +229,51 @@ (t/is (= "mtma" (:penpot/mtm-campaign props))))))) (t/deftest prepare-register-and-register-profile-2 - (with-redefs [app.rpc.commands.auth/register-retry-threshold (dt/duration 500)] - (with-mocks [mock {:target 'app.email/send! :return nil}] - (let [current-token (atom nil)] - - ;; PREPARE REGISTER - (let [data {::th/type :prepare-register-profile - :email "hello@example.com" - :password "foobar"} - out (th/command! data) - token (get-in out [:result :token])] - (t/is (string? token)) - (reset! current-token token)) - - ;; DO REGISTRATION: try correct register attempt 1 + (with-mocks [mock {:target 'app.email/send! :return nil}] + (let [current-token (atom nil)] + ;; PREPARE REGISTER + (let [data {::th/type :prepare-register-profile + :email "hello@example.com" + :password "foobar"} + out (th/command! data) + token (get-in out [:result :token])] + (t/is (th/success? out)) + (reset! current-token token)) + + ;; DO REGISTRATION + (let [data {::th/type :register-profile + :token @current-token + :fullname "foobar" + :accept-terms-and-privacy true + :accept-newsletter-subscription true} + out (th/command! data)] + (t/is (nil? (:error out))) + (t/is (= 1 (:call-count @mock)))) + + (th/reset-mock! mock) + + ;; PREPARE REGISTER: second attempt + (let [data {::th/type :prepare-register-profile + :email "hello@example.com" + :password "foobar"} + out (th/command! data) + token (get-in out [:result :token])] + (t/is (th/success? out)) + (reset! current-token token)) + + ;; DO REGISTRATION: second attempt + (let [data {::th/type :register-profile + :token @current-token + :fullname "foobar" + :accept-terms-and-privacy true + :accept-newsletter-subscription true} + out (th/command! data)] + (t/is (nil? (:error out))) + (t/is (= 0 (:call-count @mock)))) + + (with-mocks [_ {:target 'app.rpc.commands.auth/elapsed-verify-threshold? + :return true}] + ;; DO REGISTRATION: third attempt (let [data {::th/type :register-profile :token @current-token :fullname "foobar" @@ -250,44 +281,56 @@ :accept-newsletter-subscription true} out (th/command! data)] (t/is (nil? (:error out))) - (t/is (= 1 (:call-count @mock)))) - - (th/reset-mock! mock) - - ;; PREPARE REGISTER without waiting for threshold - (let [data {::th/type :prepare-register-profile - :email "hello@example.com" - :password "foobar"} - out (th/command! data)] - (t/is (not (th/success? out))) - (t/is (= :validation (-> out :error th/ex-type))) - (t/is (= :email-already-exists (-> out :error th/ex-code)))) + (t/is (= 1 (:call-count @mock)))))))) - (th/sleep {:millis 500}) - (th/reset-mock! mock) +(t/deftest prepare-register-and-register-profile-3 + (with-mocks [mock {:target 'app.email/send! :return nil}] + (let [current-token (atom nil)] + ;; PREPARE REGISTER + (let [data {::th/type :prepare-register-profile + :email "hello@example.com" + :password "foobar"} + out (th/command! data) + token (get-in out [:result :token])] + (t/is (th/success? out)) + (reset! current-token token)) + + ;; DO REGISTRATION + (let [data {::th/type :register-profile + :token @current-token + :fullname "foobar" + :accept-terms-and-privacy true + :accept-newsletter-subscription true} + out (th/command! data)] + (t/is (nil? (:error out))) + (t/is (= 1 (:call-count @mock)))) - ;; PREPARE REGISTER waiting the threshold - (let [data {::th/type :prepare-register-profile - :email "hello@example.com" - :password "foobar"} - out (th/command! data)] + (th/reset-mock! mock) - (t/is (th/success? out)) - (t/is (= 0 (:call-count @mock))) + (th/db-update! :profile + {:is-blocked true} + {:email "hello@example.com"}) - (let [result (:result out)] - (t/is (contains? result :token)) - (reset! current-token (:token result)))) + ;; PREPARE REGISTER: second attempt + (let [data {::th/type :prepare-register-profile + :email "hello@example.com" + :password "foobar"} + out (th/command! data) + token (get-in out [:result :token])] + (t/is (th/success? out)) + (reset! current-token token)) - ;; DO REGISTRATION: try correct register attempt 1 + (with-mocks [_ {:target 'app.rpc.commands.auth/elapsed-verify-threshold? + :return true}] + ;; DO REGISTRATION: second attempt (let [data {::th/type :register-profile :token @current-token :fullname "foobar" :accept-terms-and-privacy true :accept-newsletter-subscription true} out (th/command! data)] - (t/is (th/success? out)) - (t/is (= 1 (:call-count @mock)))))))) + (t/is (nil? (:error out))) + (t/is (= 0 (:call-count @mock)))))))) (t/deftest prepare-and-register-with-invitation-and-disabled-registration-1 @@ -359,13 +402,13 @@ :email (:email profile) :password "foobar"} out (th/command! data)] + ;; (th/print-result! out) + (t/is (th/success? out)) + (let [result (:result out)] + (t/is (contains? result :token))))) - (t/is (not (th/success? out))) - (let [edata (-> out :error ex-data)] - (t/is (= :validation (:type edata))) - (t/is (= :email-already-exists (:code edata)))))) +(t/deftest prepare-register-profile-with-bounced-email -(t/deftest register-profile-with-bounced-email (let [pool (:app.db/pool th/*system*) data {::th/type :prepare-register-profile :email "user@example.com" @@ -374,10 +417,9 @@ (th/create-global-complaint-for pool {:type :bounce :email "user@example.com"}) (let [out (th/command! data)] - (t/is (not (th/success? out))) - (let [edata (-> out :error ex-data)] - (t/is (= :validation (:type edata))) - (t/is (= :email-has-permanent-bounces (:code edata))))))) + (t/is (th/success? out)) + (let [result (:result out)] + (t/is (contains? result :token)))))) (t/deftest register-profile-with-complained-email (let [pool (:app.db/pool th/*system*) @@ -455,7 +497,7 @@ (t/deftest request-profile-recovery (with-mocks [mock {:target 'app.email/send! :return nil}] - (let [profile1 (th/create-profile* 1) + (let [profile1 (th/create-profile* 1 {:is-active false}) profile2 (th/create-profile* 2 {:is-active true}) pool (:app.db/pool th/*system*) data {::th/type :request-profile-recovery}] @@ -468,38 +510,47 @@ ;; with valid email inactive user (let [data (assoc data :email (:email profile1)) - out (th/command! data) - error (:error out)] + out (th/command! data)] (t/is (= 0 (:call-count @mock))) - (t/is (th/ex-info? error)) - (t/is (th/ex-of-type? error :validation)) - (t/is (th/ex-of-code? error :profile-not-verified))) + (t/is (nil? (:result out))) + (t/is (nil? (:error out)))) + + (with-mocks [_ {:target 'app.rpc.commands.auth/elapsed-verify-threshold? + :return true}] + ;; with valid email inactive user + (let [data (assoc data :email (:email profile1)) + out (th/command! data)] + (t/is (= 1 (:call-count @mock))) + (t/is (nil? (:result out))) + (t/is (nil? (:error out))))) + + (th/reset-mock! mock) ;; with valid email and active user - (let [data (assoc data :email (:email profile2)) - out (th/command! data)] - ;; (th/print-result! out) - (t/is (nil? (:result out))) - (t/is (= 1 (:call-count @mock)))) + (with-mocks [_ {:target 'app.rpc.commands.auth/elapsed-verify-threshold? + :return true}] + (let [data (assoc data :email (:email profile2)) + out (th/command! data)] + ;; (th/print-result! out) + (t/is (nil? (:result out))) + (t/is (= 1 (:call-count @mock)))) - ;; with valid email and active user with global complaints - (th/create-global-complaint-for pool {:type :complaint :email (:email profile2)}) - (let [data (assoc data :email (:email profile2)) - out (th/command! data)] - ;; (th/print-result! out) - (t/is (nil? (:result out))) - (t/is (= 2 (:call-count @mock)))) + ;; with valid email and active user with global complaints + (th/create-global-complaint-for pool {:type :complaint :email (:email profile2)}) + (let [data (assoc data :email (:email profile2)) + out (th/command! data)] + ;; (th/print-result! out) + (t/is (nil? (:result out))) + (t/is (= 2 (:call-count @mock)))) - ;; with valid email and active user with global bounce - (th/create-global-complaint-for pool {:type :bounce :email (:email profile2)}) - (let [data (assoc data :email (:email profile2)) - out (th/command! data) - error (:error out)] - ;; (th/print-result! out) - (t/is (= 2 (:call-count @mock))) - (t/is (th/ex-info? error)) - (t/is (th/ex-of-type? error :validation)) - (t/is (th/ex-of-code? error :email-has-permanent-bounces)))))) + ;; with valid email and active user with global bounce + (th/create-global-complaint-for pool {:type :bounce :email (:email profile2)}) + (let [data (assoc data :email (:email profile2)) + out (th/command! data)] + (t/is (nil? (:result out))) + (t/is (nil? (:error out))) + ;; (th/print-result! out) + (t/is (= 2 (:call-count @mock)))))))) (t/deftest update-profile-password diff --git a/frontend/src/app/main/ui/auth/login.cljs b/frontend/src/app/main/ui/auth/login.cljs index 79a8c599a..95a620a68 100644 --- a/frontend/src/app/main/ui/auth/login.cljs +++ b/frontend/src/app/main/ui/auth/login.cljs @@ -107,8 +107,8 @@ :initial initial) on-error - (fn [err] - (let [cause (ex-data err)] + (fn [cause] + (let [cause (ex-data cause)] (cond (and (= :restriction (:type cause)) (= :profile-blocked (:code cause))) diff --git a/frontend/src/app/main/ui/auth/register.cljs b/frontend/src/app/main/ui/auth/register.cljs index 633ac1177..90fa8cd30 100644 --- a/frontend/src/app/main/ui/auth/register.cljs +++ b/frontend/src/app/main/ui/auth/register.cljs @@ -26,18 +26,20 @@ ;; --- PAGE: Register -(defn- validate +(defn- validate-password-length [errors data] (let [password (:password data)] (cond-> errors (> 8 (count password)) - (assoc :password {:message "errors.password-too-short"}) - :always - (d/update-when :email - (fn [{:keys [code] :as error}] - (cond-> error - (= code ::us/email) - (assoc :message (tr "errors.email-invalid")))))))) + (assoc :password {:message "errors.password-too-short"})))) + +(defn- validate-email + [errors _] + (d/update-when errors :email + (fn [{:keys [code] :as error}] + (cond-> error + (= code ::us/email) + (assoc :message (tr "errors.email-invalid")))))) (s/def ::fullname ::us/not-empty-string) (s/def ::password ::us/not-empty-string) @@ -49,31 +51,20 @@ (s/keys :req-un [::password ::email] :opt-un [::invitation-token])) -(defn- handle-prepare-register-error +(defn- on-prepare-register-error [form cause] (let [{:keys [type code]} (ex-data cause)] (condp = [type code] [:restriction :registration-disabled] (st/emit! (msg/error (tr "errors.registration-disabled"))) - [:restriction :profile-blocked] - (st/emit! (msg/error (tr "errors.profile-blocked"))) - - [:validation :email-has-permanent-bounces] - (let [email (get @form [:data :email])] - (st/emit! (msg/error (tr "errors.email-has-permanent-bounces" email)))) - - [:validation :email-already-exists] - (swap! form assoc-in [:errors :email] - {:message "errors.email-already-exists"}) - [:validation :email-as-password] (swap! form assoc-in [:errors :password] {:message "errors.email-as-password"}) (st/emit! (msg/error (tr "errors.generic")))))) -(defn- handle-prepare-register-success +(defn- on-prepare-register-success [params] (st/emit! (rt/nav :auth-register-validate {} params))) @@ -81,28 +72,30 @@ [{:keys [params on-success-callback]}] (let [initial (mf/use-memo (mf/deps params) (constantly params)) form (fm/use-form :spec ::register-form - :validators [validate + :validators [validate-password-length + validate-email (fm/validate-not-empty :password (tr "auth.password-not-empty"))] :initial initial) - submitted? (mf/use-state false) - on-success (fn [p] - (if (nil? on-success-callback) - (handle-prepare-register-success p) - (on-success-callback p))) + submitted? (mf/use-state false) on-submit (mf/use-fn + (mf/deps on-success-callback) (fn [form _event] (reset! submitted? true) - (let [cdata (:clean-data @form)] + (let [cdata (:clean-data @form) + on-success (fn [data] + (if (nil? on-success-callback) + (on-prepare-register-success data) + (on-success-callback data))) + on-error (fn [data] + (on-prepare-register-error form data))] + (->> (rp/cmd! :prepare-register-profile cdata) (rx/map #(merge % params)) (rx/finalize #(reset! submitted? false)) - (rx/subs! - on-success - (partial handle-prepare-register-error form))))))] - + (rx/subs! on-success on-error)))))] [:& fm/form {:on-submit on-submit :form form} [:div {:class (stl/css :fields-row)} @@ -126,7 +119,6 @@ :data-test "register-form-submit" :class (stl/css :register-btn)}]])) - (mf/defc register-methods {::mf/props :obj} [{:keys [params on-success-callback]}] @@ -169,15 +161,8 @@ ;; --- PAGE: register validation (defn- handle-register-error - [form error] - (case (:code error) - :email-already-exists - (swap! form assoc-in [:errors :email] - {:message "errors.email-already-exists"}) - - (do - (println (:explain error)) - (st/emit! (msg/error (tr "errors.generic")))))) + [_form _data] + (st/emit! (msg/error (tr "errors.generic")))) (defn- handle-register-success [data] @@ -186,8 +171,6 @@ (let [token (:invitation-token data)] (st/emit! (rt/nav :auth-verify-token {} {:token token}))) - ;; The :is-active flag is true, when insecure-register is enabled - ;; or the user used external auth provider. (:is-active data) (st/emit! (du/login-from-register)) -- Gitee From 90022041e64cf391b4a984294c5b25600180d26c Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 28 Feb 2024 14:42:55 +0100 Subject: [PATCH 0313/1266] :sparkles: Improve error handling on ldap frontend code --- backend/src/app/rpc/commands/ldap.clj | 3 +- frontend/src/app/main/data/users.cljs | 27 ++++++++++ frontend/src/app/main/ui/auth/login.cljs | 60 ++++++++++----------- frontend/src/app/main/ui/auth/register.cljs | 4 +- 4 files changed, 58 insertions(+), 36 deletions(-) diff --git a/backend/src/app/rpc/commands/ldap.clj b/backend/src/app/rpc/commands/ldap.clj index 780f0e100..dff521500 100644 --- a/backend/src/app/rpc/commands/ldap.clj +++ b/backend/src/app/rpc/commands/ldap.clj @@ -12,7 +12,6 @@ [app.db :as db] [app.http.session :as session] [app.loggers.audit :as-alias audit] - [app.main :as-alias main] [app.rpc :as-alias rpc] [app.rpc.commands.auth :as auth] [app.rpc.commands.profile :as profile] @@ -73,7 +72,7 @@ (rph/with-meta {::audit/props (:props profile) ::audit/profile-id (:id profile)}))) - (-> profile + (-> (profile/strip-private-attrs profile) (rph/with-transform (session/create-fn cfg (:id profile))) (rph/with-meta {::audit/props (:props profile) ::audit/profile-id (:id profile)})))))) diff --git a/frontend/src/app/main/data/users.cljs b/frontend/src/app/main/data/users.cljs index 8a540317f..ff8865c50 100644 --- a/frontend/src/app/main/data/users.cljs +++ b/frontend/src/app/main/data/users.cljs @@ -231,8 +231,35 @@ (rx/observe-on :async))))) (rx/catch on-error)))))) +(def ^:private schema:login-with-ldap + (sm/define + [:map + [:email ::sm/email] + [:password :string]])) + +(defn login-with-ldap + [params] + + (dm/assert! + "expected valid params" + (sm/check! schema:login-with-ldap params)) + + (ptk/reify ::login-with-ldap + ptk/WatchEvent + (watch [_ _ _] + (let [{:keys [on-error on-success] + :or {on-error rx/throw + on-success identity}} (meta params)] + (->> (rp/cmd! :login-with-ldap params) + (rx/tap on-success) + (rx/map (fn [profile] + (-> profile + (with-meta {::ev/source "login-with-ldap"}) + (logged-in)))) + (rx/catch on-error)))))) (defn login-from-token + "Used mainly as flow continuation after token validation." [{:keys [profile] :as tdata}] (ptk/reify ::login-from-token ptk/WatchEvent diff --git a/frontend/src/app/main/ui/auth/login.cljs b/frontend/src/app/main/ui/auth/login.cljs index 95a620a68..ac3f2e470 100644 --- a/frontend/src/app/main/ui/auth/login.cljs +++ b/frontend/src/app/main/ui/auth/login.cljs @@ -42,6 +42,10 @@ {:type :warning :content (tr "auth.demo-warning")}]) +(defn create-demo-profile + [] + (st/emit! (du/create-demo-profile))) + (defn- login-with-oidc [event provider params] (dom/prevent-default event) @@ -60,28 +64,6 @@ :else (st/emit! (msg/error (tr "errors.generic")))))))) -(defn- login-with-ldap - [event params] - (dom/prevent-default event) - (dom/stop-propagation event) - (let [{:keys [on-error]} (meta params)] - (->> (rp/cmd! :login-with-ldap params) - (rx/subs! (fn [profile] - (if-let [token (:invitation-token profile)] - (st/emit! (rt/nav :auth-verify-token {} {:token token})) - (st/emit! (du/login-from-token {:profile profile})))) - (fn [{:keys [type code] :as error}] - (cond - (and (= type :restriction) - (= code :ldap-not-initialized)) - (st/emit! (msg/error (tr "errors.ldap-disabled"))) - - (fn? on-error) - (on-error error) - - :else - (st/emit! (msg/error (tr "errors.generic"))))))))) - (s/def ::email ::us/email) (s/def ::password ::us/not-empty-string) (s/def ::invitation-token ::us/not-empty-string) @@ -114,6 +96,11 @@ (= :profile-blocked (:code cause))) (reset! error (tr "errors.profile-blocked")) + (and (= :restriction (:type cause)) + (= :ldap-not-initialized (:code cause))) + (st/emit! (msg/error (tr "errors.ldap-disabled"))) + + (and (= :restriction (:type cause)) (= :admin-only-profile (:code cause))) (reset! error (tr "errors.profile-blocked")) @@ -130,9 +117,10 @@ (reset! error (tr "errors.generic"))))) on-success-default - (fn [data] - (when-let [token (:invitation-token data)] - (st/emit! (rt/nav :auth-verify-token {} {:token token})))) + (mf/use-fn + (fn [data] + (when-let [token (:invitation-token data)] + (st/emit! (rt/nav :auth-verify-token {} {:token token}))))) on-success (fn [data] @@ -153,11 +141,15 @@ (mf/use-callback (mf/deps form) (fn [event] + (dom/prevent-default event) + (dom/stop-propagation event) + (reset! error nil) - (let [params (:clean-data @form)] - (login-with-ldap event (with-meta params - {:on-error on-error - :on-success on-success}))))) + (let [params (:clean-data @form) + params (with-meta params + {:on-error on-error + :on-success on-success})] + (st/emit! (du/login-with-ldap params))))) on-recovery-request (mf/use-fn @@ -308,5 +300,11 @@ [:& lk/link {:action go-register :class (stl/css :register-link) :data-test "register-submit"} - (tr "auth.register-submit")]])]])) - + (tr "auth.register-submit")]])] + + (when (contains? cf/flags :demo-users) + [:div {:class (stl/css :link-entry :demo-account)} + [:span (tr "auth.create-demo-profile") " "] + [:& lk/link {:action create-demo-profile + :data-test "demo-account-link"} + (tr "auth.create-demo-account")]])])) diff --git a/frontend/src/app/main/ui/auth/register.cljs b/frontend/src/app/main/ui/auth/register.cljs index 90fa8cd30..61066fb81 100644 --- a/frontend/src/app/main/ui/auth/register.cljs +++ b/frontend/src/app/main/ui/auth/register.cljs @@ -154,7 +154,7 @@ [:* [:hr {:class (stl/css :separator)}] [:div {:class (stl/css :demo-account)} - [:& lk/link {:action #(st/emit! (du/create-demo-profile)) + [:& lk/link {:action login/create-demo-profile :class (stl/css :demo-account-link)} (tr "auth.create-demo-account")]]])]]) @@ -265,5 +265,3 @@ [:div {:class (stl/css :notification-text)} (tr "auth.verification-email-sent")] [:div {:class (stl/css :notification-text-email)} (:email params "")] [:div {:class (stl/css :notification-text)} (tr "auth.check-your-email")]]) - - -- Gitee From 7e20cf10c5612a53728c0862433c3d04b740732f Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 26 Mar 2024 12:34:32 +0100 Subject: [PATCH 0314/1266] :arrow_up: Update dependencies --- backend/deps.edn | 20 ++++++++++---------- common/deps.edn | 20 ++++++++++---------- docker/devenv/Dockerfile | 4 ++-- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/backend/deps.edn b/backend/deps.edn index 90d78fa21..d74362cef 100644 --- a/backend/deps.edn +++ b/backend/deps.edn @@ -3,8 +3,8 @@ :deps {penpot/common {:local/root "../common"} - org.clojure/clojure {:mvn/version "1.12.0-alpha5"} - org.clojure/tools.namespace {:mvn/version "1.4.4"} + org.clojure/clojure {:mvn/version "1.12.0-alpha9"} + org.clojure/tools.namespace {:mvn/version "1.5.0"} com.github.luben/zstd-jni {:mvn/version "1.5.5-11"} @@ -17,7 +17,7 @@ io.prometheus/simpleclient_httpserver {:mvn/version "0.16.0"} - io.lettuce/lettuce-core {:mvn/version "6.3.0.RELEASE"} + io.lettuce/lettuce-core {:mvn/version "6.3.2.RELEASE"} java-http-clj/java-http-clj {:mvn/version "0.4.3"} funcool/yetti @@ -26,13 +26,13 @@ :git/url "https://github.com/funcool/yetti.git" :exclusions [org.slf4j/slf4j-api]} - com.github.seancorfield/next.jdbc {:mvn/version "1.3.909"} + com.github.seancorfield/next.jdbc {:mvn/version "1.3.925"} metosin/reitit-core {:mvn/version "0.6.0"} - nrepl/nrepl {:mvn/version "1.1.0"} - cider/cider-nrepl {:mvn/version "0.44.0"} + nrepl/nrepl {:mvn/version "1.1.1"} + cider/cider-nrepl {:mvn/version "0.47.1"} - org.postgresql/postgresql {:mvn/version "42.7.1"} - org.xerial/sqlite-jdbc {:mvn/version "3.44.1.0"} + org.postgresql/postgresql {:mvn/version "42.7.3"} + org.xerial/sqlite-jdbc {:mvn/version "3.45.2.0"} com.zaxxer/HikariCP {:mvn/version "5.1.0"} @@ -54,7 +54,7 @@ org.clojars.pntblnk/clj-ldap {:mvn/version "0.0.17"} dawran6/emoji {:mvn/version "0.1.5"} - markdown-clj/markdown-clj {:mvn/version "1.11.7"} + markdown-clj/markdown-clj {:mvn/version "1.12.1"} ;; Pretty Print specs pretty-spec/pretty-spec {:mvn/version "0.1.4"} @@ -74,7 +74,7 @@ :build {:extra-deps - {io.github.clojure/tools.build {:git/tag "v0.9.5" :git/sha "24f2894"}} + {io.github.clojure/tools.build {:git/tag "v0.10.0" :git/sha "3a2c484"}} :ns-default build} :test diff --git a/common/deps.edn b/common/deps.edn index 9819697cf..b014882f9 100644 --- a/common/deps.edn +++ b/common/deps.edn @@ -1,5 +1,5 @@ {:deps - {org.clojure/clojure {:mvn/version "1.11.1"} + {org.clojure/clojure {:mvn/version "1.11.2"} org.clojure/data.json {:mvn/version "2.5.0"} org.clojure/tools.cli {:mvn/version "1.0.219"} org.clojure/clojurescript {:mvn/version "1.11.132"} @@ -7,12 +7,12 @@ org.clojure/data.fressian {:mvn/version "1.0.0"} ;; Logging - org.apache.logging.log4j/log4j-api {:mvn/version "2.22.1"} - org.apache.logging.log4j/log4j-core {:mvn/version "2.22.1"} - org.apache.logging.log4j/log4j-web {:mvn/version "2.22.1"} - org.apache.logging.log4j/log4j-jul {:mvn/version "2.22.1"} - org.apache.logging.log4j/log4j-slf4j2-impl {:mvn/version "2.22.1"} - org.slf4j/slf4j-api {:mvn/version "2.0.10"} + org.apache.logging.log4j/log4j-api {:mvn/version "2.23.1"} + org.apache.logging.log4j/log4j-core {:mvn/version "2.23.1"} + org.apache.logging.log4j/log4j-web {:mvn/version "2.23.1"} + org.apache.logging.log4j/log4j-jul {:mvn/version "2.23.1"} + org.apache.logging.log4j/log4j-slf4j2-impl {:mvn/version "2.23.1"} + org.slf4j/slf4j-api {:mvn/version "2.0.12"} pl.tkowalcz.tjahzi/log4j2-appender {:mvn/version "0.9.32"} selmer/selmer {:mvn/version "1.12.59"} @@ -28,7 +28,7 @@ integrant/integrant {:mvn/version "0.8.1"} org.apache.commons/commons-pool2 {:mvn/version "2.12.0"} - org.graalvm.js/js {:mvn/version "23.0.2"} + org.graalvm.js/js {:mvn/version "23.0.3"} funcool/tubax {:mvn/version "2021.05.20-0"} funcool/cuerdas {:mvn/version "2023.11.09-407"} @@ -41,7 +41,7 @@ :git/tag "3.0.0" :git/url "https://github.com/funcool/datoteka"} - lambdaisland/uri {:mvn/version "1.16.134" + lambdaisland/uri {:mvn/version "1.19.155" :exclusions [org.clojure/data.json]} frankiesardo/linked {:mvn/version "1.3.0"} @@ -72,7 +72,7 @@ :build {:extra-deps - {io.github.clojure/tools.build {:git/tag "v0.9.5" :git/sha "24f2894"}} + {io.github.clojure/tools.build {:git/tag "v0.10.0" :git/sha "3a2c484"}} :ns-default build} :test diff --git a/docker/devenv/Dockerfile b/docker/devenv/Dockerfile index 1f3170c5b..adce010af 100644 --- a/docker/devenv/Dockerfile +++ b/docker/devenv/Dockerfile @@ -5,8 +5,8 @@ ARG DEBIAN_FRONTEND=noninteractive ENV NODE_VERSION=v20.11.1 \ CLOJURE_VERSION=1.11.1.1435 \ - CLJKONDO_VERSION=2024.02.12 \ - BABASHKA_VERSION=1.3.188 \ + CLJKONDO_VERSION=2024.03.13 \ + BABASHKA_VERSION=1.3.189 \ CLJFMT_VERSION=0.12.0 \ LANG=en_US.UTF-8 \ LC_ALL=en_US.UTF-8 -- Gitee From a969550aa42ac16f31fd1cf7487e0fad30956c90 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 26 Mar 2024 12:47:54 +0100 Subject: [PATCH 0315/1266] :sparkles: Trust oidc providers which provides email_verified claim --- backend/src/app/auth/oidc.clj | 19 ++++++++++++------- backend/src/app/rpc/commands/verify_token.clj | 12 ++++++------ 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/backend/src/app/auth/oidc.clj b/backend/src/app/auth/oidc.clj index e69713d6c..145d04a79 100644 --- a/backend/src/app/auth/oidc.clj +++ b/backend/src/app/auth/oidc.clj @@ -520,17 +520,22 @@ (redirect-response uri))) -(defn- provider-matches-profile? - [{:keys [::provider] :as cfg} {:keys [props] :as profile}] - (or (= (:auth-backend profile) (:name provider)) - (let [email-prop (qualify-prop-key provider :email)] - (contains? props email-prop)))) - (defn- provider-has-email-verified? [{:keys [::provider] :as cfg} {:keys [props] :as info}] (let [prop (qualify-prop-key provider :email_verified)] (true? (get props prop)))) +(defn- profile-has-provider-props? + [{:keys [::provider] :as cfg} profile] + (let [prop (qualify-prop-key provider :email)] + (contains? (:props profile) prop))) + +(defn- provider-matches-profile? + [{:keys [::provider] :as cfg} profile info] + (or (= (:auth-backend profile) (:name provider)) + (profile-has-provider-props? cfg profile) + (provider-has-email-verified? cfg info))) + (defn- process-callback [cfg request info profile] (cond @@ -539,7 +544,7 @@ (:is-blocked profile) (redirect-with-error "profile-blocked") - (not (provider-matches-profile? cfg profile)) + (not (provider-matches-profile? cfg profile info)) (redirect-with-error "auth-provider-not-allowed") (not (:is-active profile)) diff --git a/backend/src/app/rpc/commands/verify_token.clj b/backend/src/app/rpc/commands/verify_token.clj index fc92727da..c23c2e993 100644 --- a/backend/src/app/rpc/commands/verify_token.clj +++ b/backend/src/app/rpc/commands/verify_token.clj @@ -83,17 +83,17 @@ (defmethod process-token :auth [{:keys [conn] :as cfg} _params {:keys [profile-id] :as claims}] - (let [profile (profile/get-profile conn profile-id {::sql/for-update true}) - props (merge (:props profile) - (:props claims)) - profile (assoc profile :props props)] - + (let [profile (profile/get-profile conn profile-id {::sql/for-update true}) + props (merge (:props profile) + (:props claims))] (when (not= props (:props profile)) (db/update! conn :profile {:props (db/tjson props)} {:id profile-id})) - (assoc claims :profile profile))) + + (let [profile (assoc profile :props props)] + (assoc claims :profile profile)))) ;; --- Team Invitation -- Gitee From 81b52d7170245aec974f1a17c1bab936150819e8 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 26 Mar 2024 13:38:45 +0100 Subject: [PATCH 0316/1266] :sparkles: Disable oidc registration when `registration` flag is disabled --- backend/src/app/auth/oidc.clj | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/src/app/auth/oidc.clj b/backend/src/app/auth/oidc.clj index 145d04a79..bc0fd83d3 100644 --- a/backend/src/app/auth/oidc.clj +++ b/backend/src/app/auth/oidc.clj @@ -574,7 +574,9 @@ :else (let [info (assoc info :is-active (provider-has-email-verified? cfg info))] - (redirect-to-register cfg info)))) + (if (contains? cf/flags :registration) + (redirect-to-register cfg info) + (redirect-with-error "registration-disabled"))))) (defn- auth-handler [cfg {:keys [params] :as request}] -- Gitee From fd92437f7ddc70224ab588be60757c7125427804 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 26 Mar 2024 13:39:24 +0100 Subject: [PATCH 0317/1266] :sparkles: Show error notificaton on oidc error redirect --- backend/src/app/rpc/commands/verify_token.clj | 1 - frontend/src/app/main/data/users.cljs | 24 ++++++++++++++++++- frontend/src/app/main/ui/auth.cljs | 9 ++++++- frontend/translations/en.po | 8 +++++++ frontend/translations/es.po | 8 +++++++ 5 files changed, 47 insertions(+), 3 deletions(-) diff --git a/backend/src/app/rpc/commands/verify_token.clj b/backend/src/app/rpc/commands/verify_token.clj index c23c2e993..e2641df23 100644 --- a/backend/src/app/rpc/commands/verify_token.clj +++ b/backend/src/app/rpc/commands/verify_token.clj @@ -91,7 +91,6 @@ {:props (db/tjson props)} {:id profile-id})) - (let [profile (assoc profile :props props)] (assoc claims :profile profile)))) diff --git a/frontend/src/app/main/data/users.cljs b/frontend/src/app/main/data/users.cljs index ff8865c50..6c5475083 100644 --- a/frontend/src/app/main/data/users.cljs +++ b/frontend/src/app/main/data/users.cljs @@ -15,10 +15,11 @@ [app.config :as cf] [app.main.data.events :as ev] [app.main.data.media :as di] + [app.main.data.messages :as msg] [app.main.data.websocket :as ws] [app.main.features :as features] [app.main.repo :as rp] - [app.util.i18n :as i18n] + [app.util.i18n :as i18n :refer [tr]] [app.util.router :as rt] [app.util.storage :refer [storage]] [beicon.v2.core :as rx] @@ -683,3 +684,24 @@ (->> (rp/cmd! :delete-access-token params) (rx/tap on-success) (rx/catch on-error)))))) + +(defn show-redirect-error + "A helper event that interprets the OIDC redirect errors on the URI + and shows an appropriate error message using the notification + banners." + [error] + (ptk/reify ::show-redirect-error + ptk/WatchEvent + (watch [_ _ _] + (let [hint (case error + "registration-disabled" + (tr "errors.registration-disabled") + "profile-blocked" + (tr "errors.profile-blocked") + "auth-provider-not-allowed" + (tr "errors.auth-provider-not-allowed") + "email-domain-not-allowed" + (tr "errors.email-domain-not-allowed") + :else + (tr "errors.generic"))] + (rx/of (msg/warn hint)))))) diff --git a/frontend/src/app/main/ui/auth.cljs b/frontend/src/app/main/ui/auth.cljs index 218fc21ce..18b949ab8 100644 --- a/frontend/src/app/main/ui/auth.cljs +++ b/frontend/src/app/main/ui/auth.cljs @@ -9,6 +9,8 @@ (:require [app.common.data.macros :as dm] [app.config :as cf] + [app.main.data.users :as du] + [app.main.store :as st] [app.main.ui.auth.login :refer [login-page]] [app.main.ui.auth.recovery :refer [recovery-page]] [app.main.ui.auth.recovery-request :refer [recovery-request-page]] @@ -42,11 +44,16 @@ {::mf/props :obj} [{:keys [route]}] (let [section (dm/get-in route [:data :name]) - params (:query-params route)] + params (:query-params route) + error (:error params)] (mf/with-effect [] (dom/set-html-title (tr "title.default"))) + (mf/with-effect [error] + (when error + (st/emit! (du/show-redirect-error error)))) + [:main {:class (stl/css :auth-section)} [:a {:href "#/" :class (stl/css :logo-btn)} i/logo] [:div {:class (stl/css :login-illustration)} diff --git a/frontend/translations/en.po b/frontend/translations/en.po index 64d26fe66..747704c55 100644 --- a/frontend/translations/en.po +++ b/frontend/translations/en.po @@ -968,6 +968,14 @@ msgstr "Your profile has emails muted (spam reports or high bounces)." msgid "errors.registration-disabled" msgstr "The registration is currently disabled." +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "Auth provider not allowed for this profile" + +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "Domain not allowed" + msgid "errors.team-leave.insufficient-members" msgstr "Insufficient members to leave team, you probably want to delete it." diff --git a/frontend/translations/es.po b/frontend/translations/es.po index 18ee3b030..9c52e4a47 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -991,6 +991,14 @@ msgstr "" msgid "errors.registration-disabled" msgstr "El registro está actualmente desactivado." +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "El proveedor de autenticación no permitido para este perfil de usuario" + +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "Dominio no permitido" + msgid "errors.team-leave.insufficient-members" msgstr "" "No hay miembros suficientes para salir del equipo, probablemente quieras " -- Gitee From 3bf5648b5b21c4a2742a512370601f3fab172c12 Mon Sep 17 00:00:00 2001 From: AzazelN28 Date: Thu, 18 Apr 2024 11:39:48 +0200 Subject: [PATCH 0318/1266] :paperclip: Fix SEO issues --- .../resources/images/icons/penpot-logo.svg | 4 +++- frontend/resources/templates/index.mustache | 2 +- frontend/src/app/main/ui/auth.cljs | 3 ++- frontend/src/app/main/ui/auth.scss | 18 ++++++++++-------- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/frontend/resources/images/icons/penpot-logo.svg b/frontend/resources/images/icons/penpot-logo.svg index 4493b6d91..6439292bd 100644 --- a/frontend/resources/images/icons/penpot-logo.svg +++ b/frontend/resources/images/icons/penpot-logo.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + \ No newline at end of file diff --git a/frontend/resources/templates/index.mustache b/frontend/resources/templates/index.mustache index 9090976a3..239893399 100644 --- a/frontend/resources/templates/index.mustache +++ b/frontend/resources/templates/index.mustache @@ -1,5 +1,5 @@ - + diff --git a/frontend/src/app/main/ui/auth.cljs b/frontend/src/app/main/ui/auth.cljs index 218fc21ce..e5f28bd70 100644 --- a/frontend/src/app/main/ui/auth.cljs +++ b/frontend/src/app/main/ui/auth.cljs @@ -48,7 +48,8 @@ (dom/set-html-title (tr "title.default"))) [:main {:class (stl/css :auth-section)} - [:a {:href "#/" :class (stl/css :logo-btn)} i/logo] + [:h1 {:class (stl/css :logo-container)} + [:a {:href "#/" :title "Penpot" :class (stl/css :logo-btn)} i/logo]] [:div {:class (stl/css :login-illustration)} i/login-illustration] diff --git a/frontend/src/app/main/ui/auth.scss b/frontend/src/app/main/ui/auth.scss index 81e418e9c..f2d41c34d 100644 --- a/frontend/src/app/main/ui/auth.scss +++ b/frontend/src/app/main/ui/auth.scss @@ -24,6 +24,16 @@ } } +.logo-container { + position: absolute; + top: $s-20; + left: $s-20; + display: flex; + justify-content: flex-start; + width: $s-120; + margin-block-end: $s-52; +} + .login-illustration { display: flex; justify-content: center; @@ -55,14 +65,6 @@ } .logo-btn { - position: absolute; - top: $s-20; - left: $s-20; - display: flex; - justify-content: flex-start; - width: $s-120; - margin-block-end: $s-52; - svg { width: $s-120; height: $s-40; -- Gitee From 3f473ca765179af712b22760cb5808259da68980 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 2 Feb 2024 09:17:10 +0100 Subject: [PATCH 0319/1266] :sparkles: Plugins proof of concept --- common/src/app/common/record.cljc | 12 +- .../resources/public/js/plugins-runtime.mjs | 16 ++ frontend/resources/templates/index.mustache | 24 ++- frontend/shadow-cljs.edn | 2 +- frontend/src/app/main.cljs | 1 + frontend/src/app/plugins.cljs | 155 ++++++++++++++++++ 6 files changed, 200 insertions(+), 10 deletions(-) create mode 100644 frontend/resources/public/js/plugins-runtime.mjs create mode 100644 frontend/src/app/plugins.cljs diff --git a/common/src/app/common/record.cljc b/common/src/app/common/record.cljc index f9d10df0c..f5ac3a39d 100644 --- a/common/src/app/common/record.cljc +++ b/common/src/app/common/record.cljc @@ -430,15 +430,18 @@ (defmacro define-properties! [rsym & properties] - (let [rsym (with-meta rsym {:tag 'js})] + (let [rsym (with-meta rsym {:tag 'js}) + self-sym (gensym "self-") + get-fn-sym (gensym "get-fn-") + set-fn-sym (gensym "set-fn-") + params-sym (gensym "params-") + args-sym (gensym "args-")] `(do ~@(for [params properties :let [pname (get params :name) get-fn (get params :get) set-fn (get params :set)]] - `(.defineProperty js/Object - (.-prototype ~rsym) - ~pname + `(.defineProperty js/Object (.-prototype ~rsym) ~pname (cljs.core/js-obj "enumerable" true "configurable" true @@ -447,4 +450,3 @@ ["get" get-fn]) (when set-fn ["set" set-fn])))))))) - diff --git a/frontend/resources/public/js/plugins-runtime.mjs b/frontend/resources/public/js/plugins-runtime.mjs new file mode 100644 index 000000000..2651e233b --- /dev/null +++ b/frontend/resources/public/js/plugins-runtime.mjs @@ -0,0 +1,16 @@ +export class PluginsElement extends HTMLElement { + connectedCallback() { + console.log('PluginsElement.connectedCallback'); + } +} + +customElements.define('penpot-plugins', PluginsElement); + +// Alternative to message passing +export function initialize(api) { + console.log("PluginsRuntime:initialize", api) + + api.addListener("foobar", "page", (page) => { + console.log("Page Changed:", page.name); + }); +}; diff --git a/frontend/resources/templates/index.mustache b/frontend/resources/templates/index.mustache index 9090976a3..138f244f5 100644 --- a/frontend/resources/templates/index.mustache +++ b/frontend/resources/templates/index.mustache @@ -23,6 +23,11 @@ {{/isDebug}} + + + - - + + {{/manifest}} @@ -44,8 +49,19 @@
{{# manifest}} - - + + + + + {{/manifest}} + + + diff --git a/frontend/shadow-cljs.edn b/frontend/shadow-cljs.edn index 901448197..de3e2dc99 100644 --- a/frontend/shadow-cljs.edn +++ b/frontend/shadow-cljs.edn @@ -18,7 +18,7 @@ {:entries []} :main - {:entries [app.main] + {:entries [app.main app.plugins] :depends-on #{:shared} :init-fn app.main/init} diff --git a/frontend/src/app/main.cljs b/frontend/src/app/main.cljs index 868d4b9ea..381556fc0 100644 --- a/frontend/src/app/main.cljs +++ b/frontend/src/app/main.cljs @@ -25,6 +25,7 @@ [app.main.ui.modal :refer [modal]] [app.main.ui.routes :as rt] [app.main.worker :as worker] + [app.plugins] [app.util.dom :as dom] [app.util.i18n :as i18n] [app.util.theme :as theme] diff --git a/frontend/src/app/plugins.cljs b/frontend/src/app/plugins.cljs new file mode 100644 index 000000000..dfcbb7191 --- /dev/null +++ b/frontend/src/app/plugins.cljs @@ -0,0 +1,155 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.plugins + "RPC for plugins runtime." + (:require + [app.common.data.macros :as dm] + [app.common.exceptions :as ex] + [app.common.record :as crc] + [app.main.refs :as refs] + [app.main.store :as st] + [goog.functions :as gf] + [app.util.array :as array] + [app.util.rxops :as rxops] + [app.util.timers :as tm])) + +;; ---- TYPES + +(deftype ShapeProxy [id name type _data]) + +(defn data->shape-proxy + [data] + (->ShapeProxy (str (:id data)) + (:name data) + (name (:type data)) + data)) + +(def ^:private + xf-map-shape-proxy + (comp + (map val) + (map data->shape-proxy))) + +(deftype PageProxy [id name _data] + Object + (getShapes [_] + ;; Returns a lazy (iterable) of all available shapes + (sequence xf-map-shape-proxy (:objects _data)))) + +(defn- data->page-proxy + [data] + (->PageProxy (str (:id data)) + (:name data) + data)) + +(def ^:private + xf-map-page-proxy + (comp + (map val) + (map data->page-proxy))) + +(deftype FileProxy [id name revn _data] + Object + (getPages [_] + ;; Returns a lazy (iterable) of all available pages + (sequence xf-map-page-proxy (:pages-index _data)))) + +;; ---- PROPERTIES + +(crc/define-properties! + FileProxy + {:name js/Symbol.toStringTag + :get (fn [] (str "FileProxy"))}) + +(crc/define-properties! + PageProxy + {:name js/Symbol.toStringTag + :get (fn [] (str "PageProxy"))}) + +(crc/define-properties! + ShapeProxy + {:name js/Symbol.toStringTag + :get (fn [] (str "ShapeProxy"))}) + +;; ---- PUBLIC API + +(defn ^:export getCurrentFile + [] + (let [data (:workspace-data @st/state)] + (when (some? data) + (let [file (:workspace-file @st/state)] + (->FileProxy (str (:id file)) + (:name file) + (:revn file) + data))))) + +(defn ^:export getCurrentPage + [] + (when-let [page-id (:current-page-id @st/state)] + (when-let [data (get-in @st/state [:workspace-data :pages-index page-id])] + (data->page-proxy data)))) + +(defn ^:export getCurrentSelection + [] + (let [selection (get-in @st/state [:workspace-local :selected])] + (when (some? selection) + selection))) + +(defn ^:export getCurrentTheme + [] + (get-in @st/state [:profile :theme])) + +(defn ^:export getState + [] + @st/state) + +;; (defonce listeners +;; (atom {})) + +(defn ^:export addListener + [key type f] + (let [f (gf/debounce f 500)] + (case type + "file" + (add-watch st/state key + (fn [_ _ old-val new-val] + (let [old-file (:workspace-file old-val) + new-file (:workspace-file new-val) + old-data (:workspace-data old-val) + new-data (:workspace-data new-val)] + (when-not (and (identical? old-file new-file) + (identical? old-data new-data)) + (f (->FileProxy (str (:id new-file)) + (:name new-file) + (:revn new-file) + new-data)))))) + "page" + (add-watch st/state key + (fn [_ _ old-val new-val] + (let [old-page-id (:current-page-id old-val) + new-page-id (:current-page-id new-val) + old-page (dm/get-in old-val [:workspace-data :pages-index old-page-id]) + new-page (dm/get-in new-val [:workspace-data :pages-index new-page-id])] + (when-not (identical? old-page new-page) + (f (data->page-proxy new-page)))))) + "selection" + (add-watch st/state key + (fn [_ _ old-val new-val] + (let [old-selection (get-in old-val [:workspace-local :selected]) + new-selection (get-in new-val [:workspace-local :selected])] + (when-not (identical? old-selection new-selection) + (f (clj->js new-selection)))))) + + "theme" + (add-watch st/state key + (fn [_ _ old-val new-val] + (let [old-theme (get-in old-val [:profile :theme]) + new-theme (get-in new-val [:profile :theme])] + (when-not (identical? old-theme new-theme) + (f new-theme))))) + ))) + -- Gitee From 5a34c25926cf184693c742479e3a52e36e553548 Mon Sep 17 00:00:00 2001 From: Juanfran Date: Fri, 22 Mar 2024 11:31:53 +0100 Subject: [PATCH 0320/1266] :bug: Fix events inside webcomponent --- frontend/src/app/main/data/shortcuts_impl.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/data/shortcuts_impl.js b/frontend/src/app/main/data/shortcuts_impl.js index 9be5beb05..e381cc150 100644 --- a/frontend/src/app/main/data/shortcuts_impl.js +++ b/frontend/src/app/main/data/shortcuts_impl.js @@ -16,7 +16,7 @@ if (Mousetrap.addKeycodes) { } const target = Mousetrap.prototype || Mousetrap; -target.stopCallback = function(e, element, combo) { +target.stopCallback = function (e, element, combo) { // if the element has the data attribute "mousetrap-dont-stop" then no need // to stop. It should be used like
...
// or :div {:data-mousetrap-dont-stop true} @@ -24,6 +24,14 @@ target.stopCallback = function(e, element, combo) { return false } + if ('composedPath' in e && typeof e.composedPath === 'function') { + // For open shadow trees, update `element` so that the following check works. + const initialEventTarget = e.composedPath()[0]; + if (initialEventTarget !== e.target) { + element = initialEventTarget; + } + } + // stop for input, select, textarea and button const shouldStop = element.tagName == "INPUT" || element.tagName == "SELECT" || -- Gitee From 127b481c385720dbdd3166f7e2a8d61819c4366d Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 2 Apr 2024 09:58:21 +0200 Subject: [PATCH 0321/1266] :sparkles: Refactor of the plugins context --- common/src/app/common/record.cljc | 26 ++- .../resources/public/js/plugins-runtime.mjs | 16 -- frontend/resources/templates/index.mustache | 6 +- frontend/shadow-cljs.edn | 2 +- frontend/src/app/main.cljs | 2 +- frontend/src/app/plugins.cljs | 155 ------------------ frontend/src/app/plugins/api.cljs | 57 +++++++ frontend/src/app/plugins/events.cljs | 72 ++++++++ frontend/src/app/plugins/file.cljs | 42 +++++ frontend/src/app/plugins/page.cljs | 38 +++++ frontend/src/app/plugins/shape.cljs | 43 +++++ frontend/src/app/plugins/utils.cljs | 12 ++ 12 files changed, 285 insertions(+), 186 deletions(-) delete mode 100644 frontend/resources/public/js/plugins-runtime.mjs delete mode 100644 frontend/src/app/plugins.cljs create mode 100644 frontend/src/app/plugins/api.cljs create mode 100644 frontend/src/app/plugins/events.cljs create mode 100644 frontend/src/app/plugins/file.cljs create mode 100644 frontend/src/app/plugins/page.cljs create mode 100644 frontend/src/app/plugins/shape.cljs create mode 100644 frontend/src/app/plugins/utils.cljs diff --git a/common/src/app/common/record.cljc b/common/src/app/common/record.cljc index f5ac3a39d..1db90dee2 100644 --- a/common/src/app/common/record.cljc +++ b/common/src/app/common/record.cljc @@ -430,23 +430,31 @@ (defmacro define-properties! [rsym & properties] - (let [rsym (with-meta rsym {:tag 'js}) - self-sym (gensym "self-") - get-fn-sym (gensym "get-fn-") - set-fn-sym (gensym "set-fn-") - params-sym (gensym "params-") - args-sym (gensym "args-")] + (let [rsym (with-meta rsym {:tag 'js})] `(do ~@(for [params properties :let [pname (get params :name) get-fn (get params :get) - set-fn (get params :set)]] + set-fn (get params :set) + enum-p (get params :enumerable) + conf-p (get params :configurable) + writ-p (get params :writable)]] `(.defineProperty js/Object (.-prototype ~rsym) ~pname (cljs.core/js-obj - "enumerable" true - "configurable" true ~@(concat + (if (some? enum-p) + ["enumerable" enum-p] + ["enumerable" true]) + + (if (some? conf-p) + ["configurable" conf-p] + ["configurable" true]) + + (when (some? writ-p) + ["writable" writ-p]) + (when get-fn ["get" get-fn]) + (when set-fn ["set" set-fn])))))))) diff --git a/frontend/resources/public/js/plugins-runtime.mjs b/frontend/resources/public/js/plugins-runtime.mjs deleted file mode 100644 index 2651e233b..000000000 --- a/frontend/resources/public/js/plugins-runtime.mjs +++ /dev/null @@ -1,16 +0,0 @@ -export class PluginsElement extends HTMLElement { - connectedCallback() { - console.log('PluginsElement.connectedCallback'); - } -} - -customElements.define('penpot-plugins', PluginsElement); - -// Alternative to message passing -export function initialize(api) { - console.log("PluginsRuntime:initialize", api) - - api.addListener("foobar", "page", (page) => { - console.log("Page Changed:", page.name); - }); -}; diff --git a/frontend/resources/templates/index.mustache b/frontend/resources/templates/index.mustache index 138f244f5..9a9fe6e08 100644 --- a/frontend/resources/templates/index.mustache +++ b/frontend/resources/templates/index.mustache @@ -23,6 +23,7 @@ {{/isDebug}} + @@ -58,10 +59,7 @@ - diff --git a/frontend/shadow-cljs.edn b/frontend/shadow-cljs.edn index de3e2dc99..7a5b4c4ff 100644 --- a/frontend/shadow-cljs.edn +++ b/frontend/shadow-cljs.edn @@ -18,7 +18,7 @@ {:entries []} :main - {:entries [app.main app.plugins] + {:entries [app.main app.plugins.api] :depends-on #{:shared} :init-fn app.main/init} diff --git a/frontend/src/app/main.cljs b/frontend/src/app/main.cljs index 381556fc0..ccdb0b617 100644 --- a/frontend/src/app/main.cljs +++ b/frontend/src/app/main.cljs @@ -25,7 +25,7 @@ [app.main.ui.modal :refer [modal]] [app.main.ui.routes :as rt] [app.main.worker :as worker] - [app.plugins] + [app.plugins.api] [app.util.dom :as dom] [app.util.i18n :as i18n] [app.util.theme :as theme] diff --git a/frontend/src/app/plugins.cljs b/frontend/src/app/plugins.cljs deleted file mode 100644 index dfcbb7191..000000000 --- a/frontend/src/app/plugins.cljs +++ /dev/null @@ -1,155 +0,0 @@ -;; This Source Code Form is subject to the terms of the Mozilla Public -;; License, v. 2.0. If a copy of the MPL was not distributed with this -;; file, You can obtain one at http://mozilla.org/MPL/2.0/. -;; -;; Copyright (c) KALEIDOS INC - -(ns app.plugins - "RPC for plugins runtime." - (:require - [app.common.data.macros :as dm] - [app.common.exceptions :as ex] - [app.common.record :as crc] - [app.main.refs :as refs] - [app.main.store :as st] - [goog.functions :as gf] - [app.util.array :as array] - [app.util.rxops :as rxops] - [app.util.timers :as tm])) - -;; ---- TYPES - -(deftype ShapeProxy [id name type _data]) - -(defn data->shape-proxy - [data] - (->ShapeProxy (str (:id data)) - (:name data) - (name (:type data)) - data)) - -(def ^:private - xf-map-shape-proxy - (comp - (map val) - (map data->shape-proxy))) - -(deftype PageProxy [id name _data] - Object - (getShapes [_] - ;; Returns a lazy (iterable) of all available shapes - (sequence xf-map-shape-proxy (:objects _data)))) - -(defn- data->page-proxy - [data] - (->PageProxy (str (:id data)) - (:name data) - data)) - -(def ^:private - xf-map-page-proxy - (comp - (map val) - (map data->page-proxy))) - -(deftype FileProxy [id name revn _data] - Object - (getPages [_] - ;; Returns a lazy (iterable) of all available pages - (sequence xf-map-page-proxy (:pages-index _data)))) - -;; ---- PROPERTIES - -(crc/define-properties! - FileProxy - {:name js/Symbol.toStringTag - :get (fn [] (str "FileProxy"))}) - -(crc/define-properties! - PageProxy - {:name js/Symbol.toStringTag - :get (fn [] (str "PageProxy"))}) - -(crc/define-properties! - ShapeProxy - {:name js/Symbol.toStringTag - :get (fn [] (str "ShapeProxy"))}) - -;; ---- PUBLIC API - -(defn ^:export getCurrentFile - [] - (let [data (:workspace-data @st/state)] - (when (some? data) - (let [file (:workspace-file @st/state)] - (->FileProxy (str (:id file)) - (:name file) - (:revn file) - data))))) - -(defn ^:export getCurrentPage - [] - (when-let [page-id (:current-page-id @st/state)] - (when-let [data (get-in @st/state [:workspace-data :pages-index page-id])] - (data->page-proxy data)))) - -(defn ^:export getCurrentSelection - [] - (let [selection (get-in @st/state [:workspace-local :selected])] - (when (some? selection) - selection))) - -(defn ^:export getCurrentTheme - [] - (get-in @st/state [:profile :theme])) - -(defn ^:export getState - [] - @st/state) - -;; (defonce listeners -;; (atom {})) - -(defn ^:export addListener - [key type f] - (let [f (gf/debounce f 500)] - (case type - "file" - (add-watch st/state key - (fn [_ _ old-val new-val] - (let [old-file (:workspace-file old-val) - new-file (:workspace-file new-val) - old-data (:workspace-data old-val) - new-data (:workspace-data new-val)] - (when-not (and (identical? old-file new-file) - (identical? old-data new-data)) - (f (->FileProxy (str (:id new-file)) - (:name new-file) - (:revn new-file) - new-data)))))) - "page" - (add-watch st/state key - (fn [_ _ old-val new-val] - (let [old-page-id (:current-page-id old-val) - new-page-id (:current-page-id new-val) - old-page (dm/get-in old-val [:workspace-data :pages-index old-page-id]) - new-page (dm/get-in new-val [:workspace-data :pages-index new-page-id])] - (when-not (identical? old-page new-page) - (f (data->page-proxy new-page)))))) - "selection" - (add-watch st/state key - (fn [_ _ old-val new-val] - (let [old-selection (get-in old-val [:workspace-local :selected]) - new-selection (get-in new-val [:workspace-local :selected])] - (when-not (identical? old-selection new-selection) - (f (clj->js new-selection)))))) - - "theme" - (add-watch st/state key - (fn [_ _ old-val new-val] - (let [old-theme (get-in old-val [:profile :theme]) - new-theme (get-in new-val [:profile :theme])] - (when-not (identical? old-theme new-theme) - (f new-theme))))) - ))) - diff --git a/frontend/src/app/plugins/api.cljs b/frontend/src/app/plugins/api.cljs new file mode 100644 index 000000000..b2f2b8dff --- /dev/null +++ b/frontend/src/app/plugins/api.cljs @@ -0,0 +1,57 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.plugins.api + "RPC for plugins runtime." + (:require + [app.common.data.macros :as dm] + [app.main.store :as st] + [app.plugins.events :as events] + [app.plugins.file :as file] + [app.plugins.page :as page] + [app.plugins.shape :as shape])) + +;; +;; PLUGINS PUBLIC API - The plugins will able to access this functions +;; +(def ^:private + xf-map-shape-proxy + (comp + (map val) + (map shape/data->shape-proxy))) + +(defn ^:export addListener + [type callback] + (events/add-listener type callback)) + +(defn ^:export getFile + [] + (file/data->file-proxy (:workspace-file @st/state) (:workspace-data @st/state))) + +(defn ^:export getPage + [] + (let [page-id (:current-page-id @st/state)] + (page/data->page-proxy (dm/get-in @st/state [:workspace-data :pages-index page-id])))) + +(defn ^:export getSelected + [] + (let [selection (get-in @st/state [:workspace-local :selected])] + (apply array (map str selection)))) + +(defn ^:export getSelectedShapes + [] + (let [page-id (:current-page-id @st/state) + selection (get-in @st/state [:workspace-local :selected]) + objects (dm/get-in @st/state [:workspace-data :pages-index page-id :objects]) + shapes (select-keys objects selection)] + (apply array (sequence xf-map-shape-proxy shapes)))) + +(defn ^:export getTheme + [] + (let [theme (get-in @st/state [:profile :theme])] + (if (or (not theme) (= theme "default")) + "dark" + (get-in @st/state [:profile :theme])))) diff --git a/frontend/src/app/plugins/events.cljs b/frontend/src/app/plugins/events.cljs new file mode 100644 index 000000000..babbe590c --- /dev/null +++ b/frontend/src/app/plugins/events.cljs @@ -0,0 +1,72 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.plugins.events + (:require + [app.common.data.macros :as dm] + [app.main.store :as st] + [app.plugins.file :as file] + [app.plugins.page :as page] + [goog.functions :as gf])) + +(defmulti handle-state-change (fn [type _] type)) + +(defmethod handle-state-change "filechange" + [_ old-val new-val] + (let [old-file (:workspace-file old-val) + new-file (:workspace-file new-val) + old-data (:workspace-data old-val) + new-data (:workspace-data new-val)] + (if (and (identical? old-file new-file) + (identical? old-data new-data)) + ::not-changed + (file/data->file-proxy new-file new-data)))) + +(defmethod handle-state-change "pagechange" + [_ old-val new-val] + (let [old-page-id (:current-page-id old-val) + new-page-id (:current-page-id new-val) + old-page (dm/get-in old-val [:workspace-data :pages-index old-page-id]) + new-page (dm/get-in new-val [:workspace-data :pages-index new-page-id])] + (if (identical? old-page new-page) + ::not-changed + (page/data->page-proxy new-page)))) + +(defmethod handle-state-change "selectionchange" + [_ old-val new-val] + (let [old-selection (get-in old-val [:workspace-local :selected]) + new-selection (get-in new-val [:workspace-local :selected])] + (if (identical? old-selection new-selection) + ::not-changed + (apply array (map str new-selection))))) + +(defmethod handle-state-change "themechange" + [_ old-val new-val] + (let [old-theme (get-in old-val [:profile :theme]) + new-theme (get-in new-val [:profile :theme])] + (if (identical? old-theme new-theme) + ::not-changed + new-theme))) + +(defmethod handle-state-change :default + [_ _ _] + ::not-changed) + + +(defn add-listener + [type callback] + (let [key (js/Symbol) + callback (gf/debounce callback 10)] + (add-watch + st/state key + (fn [_ _ old-val new-val] + (let [result (handle-state-change type old-val new-val)] + (when (not= ::not-changed result) + (callback result))))) + + ;; return the generated key + key)) + diff --git a/frontend/src/app/plugins/file.cljs b/frontend/src/app/plugins/file.cljs new file mode 100644 index 000000000..cd3ac84ae --- /dev/null +++ b/frontend/src/app/plugins/file.cljs @@ -0,0 +1,42 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.plugins.file + "RPC for plugins runtime." + (:require + [app.common.record :as crc] + [app.plugins.page :as page] + [app.plugins.utils :as utils])) + +(def ^:private + xf-map-page-proxy + (comp + (map val) + (map page/data->page-proxy))) + +(deftype FileProxy [id name revn + #_:clj-kondo/ignore _data] + Object + (getPages [_] + ;; Returns a lazy (iterable) of all available pages + (apply array (sequence xf-map-page-proxy (:pages-index _data))))) + +(crc/define-properties! + FileProxy + {:name js/Symbol.toStringTag + :get (fn [] (str "FileProxy"))} + {:name "pages" + :get (fn [] (this-as this (.getPages ^js this)))}) + +(defn data->file-proxy + [file data] + (utils/hide-data! + (->FileProxy (str (:id file)) + (:name file) + (:revn file) + data))) + + diff --git a/frontend/src/app/plugins/page.cljs b/frontend/src/app/plugins/page.cljs new file mode 100644 index 000000000..1310a4979 --- /dev/null +++ b/frontend/src/app/plugins/page.cljs @@ -0,0 +1,38 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.plugins.page + "RPC for plugins runtime." + (:require + [app.common.record :as crc] + [app.plugins.shape :as shape] + [app.plugins.utils :as utils])) + +(def ^:private + xf-map-shape-proxy + (comp + (map val) + (map shape/data->shape-proxy))) + +(deftype PageProxy [id name + #_:clj-kondo/ignore _data] + Object + (findShapes [_] + ;; Returns a lazy (iterable) of all available shapes + (apply array (sequence xf-map-shape-proxy (:objects _data))))) + +(crc/define-properties! + PageProxy + {:name js/Symbol.toStringTag + :get (fn [] (str "PageProxy"))}) + +(defn data->page-proxy + [data] + (utils/hide-data! + (->PageProxy + (str (:id data)) + (:name data) + data))) diff --git a/frontend/src/app/plugins/shape.cljs b/frontend/src/app/plugins/shape.cljs new file mode 100644 index 000000000..e56373a40 --- /dev/null +++ b/frontend/src/app/plugins/shape.cljs @@ -0,0 +1,43 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.plugins.shape + "RPC for plugins runtime." + (:require + [app.common.data :as d] + [app.common.data.macros :as dm] + [app.common.record :as crc] + [app.plugins.utils :as utils] + [cuerdas.core :as str])) + +(defn- fills + [shape] + ;; TODO: Transform explicitly? + (apply array + (->> (:fills shape) + (map #(clj->js % {:keyword-fn (fn [k] (str/camel (name k)))}))))) + +(deftype ShapeProxy + [id + name + type + fills + _data]) + +(crc/define-properties! + ShapeProxy + {:name js/Symbol.toStringTag + :get (fn [] (str "ShapeProxy"))}) + +(defn data->shape-proxy + [data] + (utils/hide-data! + (->ShapeProxy (dm/str (:id data)) + (:name data) + (d/name (:type data)) + (fills data) + data))) + diff --git a/frontend/src/app/plugins/utils.cljs b/frontend/src/app/plugins/utils.cljs new file mode 100644 index 000000000..0c12b8192 --- /dev/null +++ b/frontend/src/app/plugins/utils.cljs @@ -0,0 +1,12 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.plugins.utils + "RPC for plugins runtime.") + +(defn hide-data! + [proxy] + (.defineProperty js/Object proxy "_data" #js {:enumerable false})) -- Gitee From 432e8943441175bf2c83e507b3c6c72040e40e24 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 15 Apr 2024 17:48:03 +0200 Subject: [PATCH 0322/1266] :sparkles: Experiment for data definition --- frontend/src/app/plugins/events.cljs | 5 ++- frontend/src/app/plugins/shape.cljs | 55 ++++++++++++++++++++-------- 2 files changed, 43 insertions(+), 17 deletions(-) diff --git a/frontend/src/app/plugins/events.cljs b/frontend/src/app/plugins/events.cljs index babbe590c..ae1d17bd0 100644 --- a/frontend/src/app/plugins/events.cljs +++ b/frontend/src/app/plugins/events.cljs @@ -49,7 +49,10 @@ new-theme (get-in new-val [:profile :theme])] (if (identical? old-theme new-theme) ::not-changed - new-theme))) + (if (= new-theme "default") + "dark" + new-theme)))) + (defmethod handle-state-change :default [_ _ _] diff --git a/frontend/src/app/plugins/shape.cljs b/frontend/src/app/plugins/shape.cljs index e56373a40..43b6db02c 100644 --- a/frontend/src/app/plugins/shape.cljs +++ b/frontend/src/app/plugins/shape.cljs @@ -8,36 +8,59 @@ "RPC for plugins runtime." (:require [app.common.data :as d] - [app.common.data.macros :as dm] [app.common.record :as crc] [app.plugins.utils :as utils] + [app.util.object :as obj] [cuerdas.core :as str])) -(defn- fills - [shape] +(defn- make-fills + [fills] ;; TODO: Transform explicitly? (apply array - (->> (:fills shape) + (->> fills (map #(clj->js % {:keyword-fn (fn [k] (str/camel (name k)))}))))) -(deftype ShapeProxy - [id - name - type - fills - _data]) +(deftype ShapeProxy [_data] + Object + (clone [_] (.log js/console (clj->js _data))) + (delete [_] (.log js/console (clj->js _data))) + (appendChild [_] (.log js/console (clj->js _data)))) (crc/define-properties! ShapeProxy {:name js/Symbol.toStringTag :get (fn [] (str "ShapeProxy"))}) + +(defn get-data + ([this attr] + (-> this + (obj/get "_data") + (get attr))) + ([this attr transform-fn] + (-> this + (get-data attr) + (transform-fn)))) + (defn data->shape-proxy [data] - (utils/hide-data! - (->ShapeProxy (dm/str (:id data)) - (:name data) - (d/name (:type data)) - (fills data) - data))) + + (-> (->ShapeProxy data) + (js/Object.defineProperties + #js {"_data" #js {:enumerable false} + + :id + #js {:get #(get-data (js* "this") :id str) + :enumerable true} + + :name + #js {:get #(get-data (js* "this") :name) + ;;:set (fn [] (prn "SET NAME")) + :enumerable true} + + :fills + #js {:get #(get-data (js* "this") :fills make-fills) + ;;:set (fn [] (prn "SET FILLS")) + :enumerable true}} + ))) -- Gitee From 97c3abfd601c1470c10a0ee9cfe42d6f8ee4aca9 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 18 Apr 2024 16:38:24 +0200 Subject: [PATCH 0323/1266] :sparkles: Add nginx configuration for mjs files --- docker/devenv/Dockerfile | 1 + docker/devenv/files/nginx-mime.types | 100 +++++++++++++++++++++++++++ docker/devenv/files/nginx.conf | 4 +- docker/gitpod/Dockerfile | 1 + docker/gitpod/files/nginx-mime.types | 100 +++++++++++++++++++++++++++ docker/images/Dockerfile.frontend | 1 + docker/images/files/nginx-mime.types | 100 +++++++++++++++++++++++++++ docker/images/files/nginx.conf | 4 +- 8 files changed, 307 insertions(+), 4 deletions(-) create mode 100644 docker/devenv/files/nginx-mime.types create mode 100644 docker/gitpod/files/nginx-mime.types create mode 100644 docker/images/files/nginx-mime.types diff --git a/docker/devenv/Dockerfile b/docker/devenv/Dockerfile index adce010af..6b700d433 100644 --- a/docker/devenv/Dockerfile +++ b/docker/devenv/Dockerfile @@ -249,6 +249,7 @@ EXPOSE 6060 EXPOSE 9090 COPY files/nginx.conf /etc/nginx/nginx.conf +COPY files/nginx-mime.types /etc/nginx/mime.types COPY files/phantomjs-mock /usr/bin/phantomjs COPY files/bashrc /root/.bashrc diff --git a/docker/devenv/files/nginx-mime.types b/docker/devenv/files/nginx-mime.types new file mode 100644 index 000000000..91f6aba0a --- /dev/null +++ b/docker/devenv/files/nginx-mime.types @@ -0,0 +1,100 @@ + +types { + text/html html htm shtml; + text/css css; + text/xml xml; + image/gif gif; + image/jpeg jpeg jpg; + application/javascript js; + application/javascript mjs; + application/atom+xml atom; + application/rss+xml rss; + + text/mathml mml; + text/plain txt; + text/vnd.sun.j2me.app-descriptor jad; + text/vnd.wap.wml wml; + text/x-component htc; + + image/avif avif; + image/png png; + image/svg+xml svg svgz; + image/tiff tif tiff; + image/vnd.wap.wbmp wbmp; + image/webp webp; + image/x-icon ico; + image/x-jng jng; + image/x-ms-bmp bmp; + + font/woff woff; + font/woff2 woff2; + + application/java-archive jar war ear; + application/json json; + application/mac-binhex40 hqx; + application/msword doc; + application/pdf pdf; + application/postscript ps eps ai; + application/rtf rtf; + application/vnd.apple.mpegurl m3u8; + application/vnd.google-earth.kml+xml kml; + application/vnd.google-earth.kmz kmz; + application/vnd.ms-excel xls; + application/vnd.ms-fontobject eot; + application/vnd.ms-powerpoint ppt; + application/vnd.oasis.opendocument.graphics odg; + application/vnd.oasis.opendocument.presentation odp; + application/vnd.oasis.opendocument.spreadsheet ods; + application/vnd.oasis.opendocument.text odt; + application/vnd.openxmlformats-officedocument.presentationml.presentation + pptx; + application/vnd.openxmlformats-officedocument.spreadsheetml.sheet + xlsx; + application/vnd.openxmlformats-officedocument.wordprocessingml.document + docx; + application/vnd.wap.wmlc wmlc; + application/wasm wasm; + application/x-7z-compressed 7z; + application/x-cocoa cco; + application/x-java-archive-diff jardiff; + application/x-java-jnlp-file jnlp; + application/x-makeself run; + application/x-perl pl pm; + application/x-pilot prc pdb; + application/x-rar-compressed rar; + application/x-redhat-package-manager rpm; + application/x-sea sea; + application/x-shockwave-flash swf; + application/x-stuffit sit; + application/x-tcl tcl tk; + application/x-x509-ca-cert der pem crt; + application/x-xpinstall xpi; + application/xhtml+xml xhtml; + application/xspf+xml xspf; + application/zip zip; + + application/octet-stream bin exe dll; + application/octet-stream deb; + application/octet-stream dmg; + application/octet-stream iso img; + application/octet-stream msi msp msm; + + audio/midi mid midi kar; + audio/mpeg mp3; + audio/ogg ogg; + audio/x-m4a m4a; + audio/x-realaudio ra; + + video/3gpp 3gpp 3gp; + video/mp2t ts; + video/mp4 mp4; + video/mpeg mpeg mpg; + video/quicktime mov; + video/webm webm; + video/x-flv flv; + video/x-m4v m4v; + video/x-mng mng; + video/x-ms-asf asx asf; + video/x-ms-wmv wmv; + video/x-msvideo avi; +} diff --git a/docker/devenv/files/nginx.conf b/docker/devenv/files/nginx.conf index b9b595ff4..60d025284 100644 --- a/docker/devenv/files/nginx.conf +++ b/docker/devenv/files/nginx.conf @@ -208,13 +208,13 @@ http { add_header Cache-Control "no-store, no-cache, max-age=0" always; } - location ~* \.(js|css|jpg|svg|png)$ { + location ~* \.(js|css|jpg|svg|png|mjs|map)$ { # We set no cache only on devenv add_header Cache-Control "no-store, no-cache, max-age=0" always; # add_header Cache-Control "max-age=604800" always; # 7 days } - location ~ ^/(/|css|fonts|images|js|wasm) { + location ~ ^/(/|css|fonts|images|js|wasm|mjs|map) { } location ~ ^/[^/]+/(.*)$ { diff --git a/docker/gitpod/Dockerfile b/docker/gitpod/Dockerfile index cc4f7f9be..30ec7da8f 100644 --- a/docker/gitpod/Dockerfile +++ b/docker/gitpod/Dockerfile @@ -17,6 +17,7 @@ RUN set -ex; \ sudo chown gitpod:gitpod /var/log/nginx COPY files/nginx.conf /etc/nginx/nginx.conf +COPY files/nginx-mime.types /etc/nginx/mime.types USER root diff --git a/docker/gitpod/files/nginx-mime.types b/docker/gitpod/files/nginx-mime.types new file mode 100644 index 000000000..91f6aba0a --- /dev/null +++ b/docker/gitpod/files/nginx-mime.types @@ -0,0 +1,100 @@ + +types { + text/html html htm shtml; + text/css css; + text/xml xml; + image/gif gif; + image/jpeg jpeg jpg; + application/javascript js; + application/javascript mjs; + application/atom+xml atom; + application/rss+xml rss; + + text/mathml mml; + text/plain txt; + text/vnd.sun.j2me.app-descriptor jad; + text/vnd.wap.wml wml; + text/x-component htc; + + image/avif avif; + image/png png; + image/svg+xml svg svgz; + image/tiff tif tiff; + image/vnd.wap.wbmp wbmp; + image/webp webp; + image/x-icon ico; + image/x-jng jng; + image/x-ms-bmp bmp; + + font/woff woff; + font/woff2 woff2; + + application/java-archive jar war ear; + application/json json; + application/mac-binhex40 hqx; + application/msword doc; + application/pdf pdf; + application/postscript ps eps ai; + application/rtf rtf; + application/vnd.apple.mpegurl m3u8; + application/vnd.google-earth.kml+xml kml; + application/vnd.google-earth.kmz kmz; + application/vnd.ms-excel xls; + application/vnd.ms-fontobject eot; + application/vnd.ms-powerpoint ppt; + application/vnd.oasis.opendocument.graphics odg; + application/vnd.oasis.opendocument.presentation odp; + application/vnd.oasis.opendocument.spreadsheet ods; + application/vnd.oasis.opendocument.text odt; + application/vnd.openxmlformats-officedocument.presentationml.presentation + pptx; + application/vnd.openxmlformats-officedocument.spreadsheetml.sheet + xlsx; + application/vnd.openxmlformats-officedocument.wordprocessingml.document + docx; + application/vnd.wap.wmlc wmlc; + application/wasm wasm; + application/x-7z-compressed 7z; + application/x-cocoa cco; + application/x-java-archive-diff jardiff; + application/x-java-jnlp-file jnlp; + application/x-makeself run; + application/x-perl pl pm; + application/x-pilot prc pdb; + application/x-rar-compressed rar; + application/x-redhat-package-manager rpm; + application/x-sea sea; + application/x-shockwave-flash swf; + application/x-stuffit sit; + application/x-tcl tcl tk; + application/x-x509-ca-cert der pem crt; + application/x-xpinstall xpi; + application/xhtml+xml xhtml; + application/xspf+xml xspf; + application/zip zip; + + application/octet-stream bin exe dll; + application/octet-stream deb; + application/octet-stream dmg; + application/octet-stream iso img; + application/octet-stream msi msp msm; + + audio/midi mid midi kar; + audio/mpeg mp3; + audio/ogg ogg; + audio/x-m4a m4a; + audio/x-realaudio ra; + + video/3gpp 3gpp 3gp; + video/mp2t ts; + video/mp4 mp4; + video/mpeg mpeg mpg; + video/quicktime mov; + video/webm webm; + video/x-flv flv; + video/x-m4v m4v; + video/x-mng mng; + video/x-ms-asf asx asf; + video/x-ms-wmv wmv; + video/x-msvideo avi; +} diff --git a/docker/images/Dockerfile.frontend b/docker/images/Dockerfile.frontend index af5101b29..0edc1b2d9 100644 --- a/docker/images/Dockerfile.frontend +++ b/docker/images/Dockerfile.frontend @@ -9,6 +9,7 @@ RUN set -ex; \ ADD ./bundle-frontend/ /var/www/app/ ADD ./files/config.js /var/www/app/js/config.js ADD ./files/nginx.conf /etc/nginx/nginx.conf.template +ADD ./files/nginx-mime.types /etc/nginx/mime.types ADD ./files/nginx-entrypoint.sh /entrypoint.sh ENTRYPOINT ["/bin/bash", "/entrypoint.sh"] diff --git a/docker/images/files/nginx-mime.types b/docker/images/files/nginx-mime.types new file mode 100644 index 000000000..91f6aba0a --- /dev/null +++ b/docker/images/files/nginx-mime.types @@ -0,0 +1,100 @@ + +types { + text/html html htm shtml; + text/css css; + text/xml xml; + image/gif gif; + image/jpeg jpeg jpg; + application/javascript js; + application/javascript mjs; + application/atom+xml atom; + application/rss+xml rss; + + text/mathml mml; + text/plain txt; + text/vnd.sun.j2me.app-descriptor jad; + text/vnd.wap.wml wml; + text/x-component htc; + + image/avif avif; + image/png png; + image/svg+xml svg svgz; + image/tiff tif tiff; + image/vnd.wap.wbmp wbmp; + image/webp webp; + image/x-icon ico; + image/x-jng jng; + image/x-ms-bmp bmp; + + font/woff woff; + font/woff2 woff2; + + application/java-archive jar war ear; + application/json json; + application/mac-binhex40 hqx; + application/msword doc; + application/pdf pdf; + application/postscript ps eps ai; + application/rtf rtf; + application/vnd.apple.mpegurl m3u8; + application/vnd.google-earth.kml+xml kml; + application/vnd.google-earth.kmz kmz; + application/vnd.ms-excel xls; + application/vnd.ms-fontobject eot; + application/vnd.ms-powerpoint ppt; + application/vnd.oasis.opendocument.graphics odg; + application/vnd.oasis.opendocument.presentation odp; + application/vnd.oasis.opendocument.spreadsheet ods; + application/vnd.oasis.opendocument.text odt; + application/vnd.openxmlformats-officedocument.presentationml.presentation + pptx; + application/vnd.openxmlformats-officedocument.spreadsheetml.sheet + xlsx; + application/vnd.openxmlformats-officedocument.wordprocessingml.document + docx; + application/vnd.wap.wmlc wmlc; + application/wasm wasm; + application/x-7z-compressed 7z; + application/x-cocoa cco; + application/x-java-archive-diff jardiff; + application/x-java-jnlp-file jnlp; + application/x-makeself run; + application/x-perl pl pm; + application/x-pilot prc pdb; + application/x-rar-compressed rar; + application/x-redhat-package-manager rpm; + application/x-sea sea; + application/x-shockwave-flash swf; + application/x-stuffit sit; + application/x-tcl tcl tk; + application/x-x509-ca-cert der pem crt; + application/x-xpinstall xpi; + application/xhtml+xml xhtml; + application/xspf+xml xspf; + application/zip zip; + + application/octet-stream bin exe dll; + application/octet-stream deb; + application/octet-stream dmg; + application/octet-stream iso img; + application/octet-stream msi msp msm; + + audio/midi mid midi kar; + audio/mpeg mp3; + audio/ogg ogg; + audio/x-m4a m4a; + audio/x-realaudio ra; + + video/3gpp 3gpp 3gp; + video/mp2t ts; + video/mp4 mp4; + video/mpeg mpeg mpg; + video/quicktime mov; + video/webm webm; + video/x-flv flv; + video/x-m4v m4v; + video/x-mng mng; + video/x-ms-asf asx asf; + video/x-ms-wmv wmv; + video/x-msvideo avi; +} diff --git a/docker/images/files/nginx.conf b/docker/images/files/nginx.conf index 4ad7c938a..8d0fff0a2 100644 --- a/docker/images/files/nginx.conf +++ b/docker/images/files/nginx.conf @@ -188,11 +188,11 @@ http { add_header Cache-Control "no-store, no-cache, max-age=0" always; } - location ~* \.(js|css|jpg|svg|png)$ { + location ~* \.(js|css|jpg|svg|png|mjs|map)$ { add_header Cache-Control "max-age=604800" always; # 7 days } - location ~ ^/(/|css|fonts|images|js|wasm) { + location ~ ^/(/|css|fonts|images|js|wasm|mjs|map) { } location ~ ^/[^/]+/(.*)$ { -- Gitee From d7324b2e9877e53395112f64fe61c054ec0df49e Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 18 Apr 2024 16:39:04 +0200 Subject: [PATCH 0324/1266] :sparkles: Support development and production plugin runtime --- frontend/resources/templates/index.mustache | 27 ++++++--------------- frontend/scripts/_helpers.js | 4 +++ frontend/scripts/watch.js | 2 +- manage.sh | 2 +- 4 files changed, 13 insertions(+), 22 deletions(-) diff --git a/frontend/resources/templates/index.mustache b/frontend/resources/templates/index.mustache index 9a9fe6e08..b1e635155 100644 --- a/frontend/resources/templates/index.mustache +++ b/frontend/resources/templates/index.mustache @@ -23,25 +23,19 @@ {{/isDebug}} + {{# manifest}} + + + + {{/manifest}} - - - + - - {{# manifest}} - - - - {{/manifest}} - @@ -49,17 +43,10 @@ {{> ../public/images/sprites/symbol/cursors.svg }}
- {{# manifest}} + {{# manifest}} - - {{/manifest}} - - diff --git a/frontend/scripts/_helpers.js b/frontend/scripts/_helpers.js index cb2d36ac9..9633aa488 100644 --- a/frontend/scripts/_helpers.js +++ b/frontend/scripts/_helpers.js @@ -315,9 +315,12 @@ async function generateTemplates() { "../public/images/sprites/symbol/cursors.svg": cursorsSprite, }; + const pluginRuntimeUri = (process.env.PENPOT_PLUGIN_DEV === "true") ? "http://localhost:4200" : "./plugins-runtime"; + content = await renderTemplate("resources/templates/index.mustache", { manifest: manifest, translations: JSON.stringify(translations), + pluginRuntimeUri, }, partials); await fs.writeFile("./resources/public/index.html", content); @@ -401,6 +404,7 @@ export async function copyAssets() { await syncDirs("resources/images/", "resources/public/images/"); await syncDirs("resources/fonts/", "resources/public/fonts/"); + await syncDirs("resources/plugins-runtime/", "resources/public/plugins-runtime/"); const end = process.hrtime(start); log.info("done: copy assets", `(${ppt(end)})`); diff --git a/frontend/scripts/watch.js b/frontend/scripts/watch.js index 80dda26b5..56fb84a8e 100644 --- a/frontend/scripts/watch.js +++ b/frontend/scripts/watch.js @@ -64,7 +64,7 @@ h.watch("resources/templates", null, async function (path) { }); log.info("watch: assets (~)") -h.watch(["resources/images", "resources/fonts"], null, async function (path) { +h.watch(["resources/images", "resources/fonts", "resources/plugins-runtime"], null, async function (path) { log.info("changed:", path); await h.compileSvgSprites(); await h.copyAssets(); diff --git a/manage.sh b/manage.sh index d724fef53..6e13bb7d6 100755 --- a/manage.sh +++ b/manage.sh @@ -85,7 +85,7 @@ function run-devenv-tmux { start-devenv fi - docker exec -ti penpot-devenv-main sudo -EH -u penpot /home/start-tmux.sh + docker exec -ti penpot-devenv-main sudo -EH -u penpot PENPOT_PLUGIN_DEV=$PENPOT_PLUGIN_DEV /home/start-tmux.sh } function run-devenv-shell { -- Gitee From 7b508f2803d2ad15d30847ed3fee09c32a0e4f6c Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 18 Apr 2024 16:41:43 +0200 Subject: [PATCH 0325/1266] :sparkles: Create feature for plugins --- common/src/app/common/features.cljc | 10 +++++++--- frontend/src/app/main.cljs | 5 +++-- frontend/src/app/plugins.cljs | 23 +++++++++++++++++++++++ frontend/src/features.cljs | 5 +++++ 4 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 frontend/src/app/plugins.cljs diff --git a/common/src/app/common/features.cljc b/common/src/app/common/features.cljc index e0b10c0b2..f0c35b26b 100644 --- a/common/src/app/common/features.cljc +++ b/common/src/app/common/features.cljc @@ -48,7 +48,8 @@ "fdata/shape-data-type" "components/v2" "styles/v2" - "layout/grid"}) + "layout/grid" + "plugins/runtime"}) ;; A set of features enabled by default (def default-features @@ -62,7 +63,8 @@ ;; persist on file features field but can be permanently enabled on ;; team feature field (def frontend-only-features - #{"styles/v2"}) + #{"styles/v2" + "plugins/runtime"}) ;; Features that are mainly backend only or there are a proper ;; fallback when frontend reports no support for it @@ -78,7 +80,8 @@ (-> #{"fdata/objects-map" "fdata/pointer-map" "layout/grid" - "fdata/shape-data-type"} + "fdata/shape-data-type" + "plugins/runtime"} (into frontend-only-features))) (sm/def! ::features @@ -97,6 +100,7 @@ :feature-grid-layout "layout/grid" :feature-fdata-objects-map "fdata/objects-map" :feature-fdata-pointer-map "fdata/pointer-map" + :feature-plugins "plugins/runtime" nil)) (defn migrate-legacy-features diff --git a/frontend/src/app/main.cljs b/frontend/src/app/main.cljs index ccdb0b617..522715331 100644 --- a/frontend/src/app/main.cljs +++ b/frontend/src/app/main.cljs @@ -25,7 +25,7 @@ [app.main.ui.modal :refer [modal]] [app.main.ui.routes :as rt] [app.main.worker :as worker] - [app.plugins.api] + [app.plugins :as plugins] [app.util.dom :as dom] [app.util.i18n :as i18n] [app.util.theme :as theme] @@ -105,7 +105,8 @@ (rx/map deref) (rx/filter du/is-authenticated?) (rx/take 1) - (rx/map #(ws/initialize))))))) + (rx/map #(ws/initialize)) + (rx/tap #(plugins/init!))))))) (defn ^:export init [] diff --git a/frontend/src/app/plugins.cljs b/frontend/src/app/plugins.cljs new file mode 100644 index 000000000..1ede1b72c --- /dev/null +++ b/frontend/src/app/plugins.cljs @@ -0,0 +1,23 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.plugins + "RPC for plugins runtime." + (:require + [app.main.features :as features] + [app.main.store :as st] + [app.plugins.api :as api] + [app.util.globals :refer [global]] + [app.util.object :as obj])) + +(defn init! + [] + (when (features/active-feature? @st/state "plugins/runtime") + (when-let [init-runtime (obj/get global "initPluginsRuntime")] + (let [context (api/create-context)] + (when *assert* + (js/console.log "Plugins context" context)) + (init-runtime context))))) diff --git a/frontend/src/features.cljs b/frontend/src/features.cljs index 366a70207..943b5a1f7 100644 --- a/frontend/src/features.cljs +++ b/frontend/src/features.cljs @@ -23,3 +23,8 @@ (defn ^:export get-team-enabled [] (clj->js (features/get-team-enabled-features @st/state))) + +(defn ^:export plugins [] + (tm/schedule-on-idle #(st/emit! (features/toggle-feature "plugins/runtime"))) + nil) + -- Gitee From 0ffd82299fd2d4907d064a9bc1ac8ec227252f9b Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 18 Apr 2024 16:42:09 +0200 Subject: [PATCH 0326/1266] :sparkles: Refactor to the context api --- common/src/app/common/record.cljc | 50 ++++++++++++++++++++- frontend/src/app/plugins.cljs | 2 - frontend/src/app/plugins/api.cljs | 69 ++++++++++++++++++----------- frontend/src/app/plugins/file.cljs | 26 ++++++----- frontend/src/app/plugins/page.cljs | 30 +++++++++---- frontend/src/app/plugins/shape.cljs | 66 ++++++++++++++------------- frontend/src/app/plugins/utils.cljs | 26 +++++++++-- 7 files changed, 187 insertions(+), 82 deletions(-) diff --git a/common/src/app/common/record.cljc b/common/src/app/common/record.cljc index 1db90dee2..385917a0a 100644 --- a/common/src/app/common/record.cljc +++ b/common/src/app/common/record.cljc @@ -429,8 +429,9 @@ `(update ~ssym ~ksym ~f ~@params))) (defmacro define-properties! + "Define properties in the prototype with `.defineProperty`" [rsym & properties] - (let [rsym (with-meta rsym {:tag 'js})] + (let [rsym (with-meta rsym {:tag 'js})] `(do ~@(for [params properties :let [pname (get params :name) @@ -458,3 +459,50 @@ (when set-fn ["set" set-fn])))))))) + +(defmacro add-properties! + "Adds properties to an object using `.defineProperty`" + [rsym & properties] + (let [rsym (with-meta rsym {:tag 'js}) + getf-sym (with-meta (gensym "get-fn") {:tag 'js}) + setf-sym (with-meta (gensym "set-fn") {:tag 'js}) + this-sym (with-meta (gensym "this") {:tag 'js}) + target-sym (with-meta (gensym "target") {:tag 'js})] + `(let [~target-sym ~rsym] + ;; Creates the `.defineProperty` per property + ~@(for [params properties + :let [pname (get params :name) + get-fn (get params :get) + set-fn (get params :set) + enum-p (get params :enumerable) + conf-p (get params :configurable) + writ-p (get params :writable)]] + `(let [~getf-sym ~get-fn + ~setf-sym ~set-fn] + (.defineProperty + js/Object + ~target-sym + ~pname + (cljs.core/js-obj + ~@(concat + (if (some? enum-p) + ["enumerable" enum-p] + ;; Default in JS is false. We default to true + ["enumerable" true]) + + (when (some? conf-p) + ["configurable" conf-p]) + + (when (some? writ-p) + ["writable" writ-p]) + + (when get-fn + ["get" `(fn [] + (cljs.core/this-as ~this-sym + (~getf-sym ~this-sym)))]) + (when set-fn + ["set" `(fn [value#] + (cljs.core/this-as ~this-sym + (~setf-sym ~this-sym value#)))])))))) + ;; Returns the object + ~target-sym))) diff --git a/frontend/src/app/plugins.cljs b/frontend/src/app/plugins.cljs index 1ede1b72c..fcfa21857 100644 --- a/frontend/src/app/plugins.cljs +++ b/frontend/src/app/plugins.cljs @@ -18,6 +18,4 @@ (when (features/active-feature? @st/state "plugins/runtime") (when-let [init-runtime (obj/get global "initPluginsRuntime")] (let [context (api/create-context)] - (when *assert* - (js/console.log "Plugins context" context)) (init-runtime context))))) diff --git a/frontend/src/app/plugins/api.cljs b/frontend/src/app/plugins/api.cljs index b2f2b8dff..74efdb66e 100644 --- a/frontend/src/app/plugins/api.cljs +++ b/frontend/src/app/plugins/api.cljs @@ -8,6 +8,8 @@ "RPC for plugins runtime." (:require [app.common.data.macros :as dm] + [app.common.record :as cr] + [app.common.uuid :as uuid] [app.main.store :as st] [app.plugins.events :as events] [app.plugins.file :as file] @@ -23,35 +25,50 @@ (map val) (map shape/data->shape-proxy))) -(defn ^:export addListener - [type callback] - (events/add-listener type callback)) +(deftype PenpotContext [] + Object + (addListener + [_ type callback] + (events/add-listener type callback)) -(defn ^:export getFile - [] - (file/data->file-proxy (:workspace-file @st/state) (:workspace-data @st/state))) + (getFile + [_] + (file/data->file-proxy (:workspace-file @st/state) (:workspace-data @st/state))) -(defn ^:export getPage - [] - (let [page-id (:current-page-id @st/state)] - (page/data->page-proxy (dm/get-in @st/state [:workspace-data :pages-index page-id])))) + (getPage + [_] + (let [page-id (:current-page-id @st/state)] + (page/data->page-proxy (dm/get-in @st/state [:workspace-data :pages-index page-id])))) -(defn ^:export getSelected - [] - (let [selection (get-in @st/state [:workspace-local :selected])] - (apply array (map str selection)))) + (getSelected + [_] + (let [selection (get-in @st/state [:workspace-local :selected])] + (apply array (map str selection)))) -(defn ^:export getSelectedShapes - [] - (let [page-id (:current-page-id @st/state) - selection (get-in @st/state [:workspace-local :selected]) - objects (dm/get-in @st/state [:workspace-data :pages-index page-id :objects]) - shapes (select-keys objects selection)] - (apply array (sequence xf-map-shape-proxy shapes)))) + (getSelectedShapes + [_] + (let [page-id (:current-page-id @st/state) + selection (get-in @st/state [:workspace-local :selected]) + objects (dm/get-in @st/state [:workspace-data :pages-index page-id :objects]) + shapes (select-keys objects selection)] + (apply array (sequence xf-map-shape-proxy shapes)))) + + (getRoot + [_] + (let [page-id (:current-page-id @st/state) + root (dm/get-in @st/state [:workspace-data :pages-index page-id :objects uuid/zero])] + (shape/data->shape-proxy root))) + + (getTheme + [_] + (let [theme (get-in @st/state [:profile :theme])] + (if (or (not theme) (= theme "default")) + "dark" + (get-in @st/state [:profile :theme]))))) -(defn ^:export getTheme +(defn create-context [] - (let [theme (get-in @st/state [:profile :theme])] - (if (or (not theme) (= theme "default")) - "dark" - (get-in @st/state [:profile :theme])))) + (cr/add-properties! + (PenpotContext.) + {:name "root" :get #(.getRoot ^js %)} + {:name "currentPage" :get #(.getPage ^js %)})) diff --git a/frontend/src/app/plugins/file.cljs b/frontend/src/app/plugins/file.cljs index cd3ac84ae..6d3948bf5 100644 --- a/frontend/src/app/plugins/file.cljs +++ b/frontend/src/app/plugins/file.cljs @@ -9,7 +9,7 @@ (:require [app.common.record :as crc] [app.plugins.page :as page] - [app.plugins.utils :as utils])) + [app.plugins.utils :refer [get-data-fn]])) (def ^:private xf-map-page-proxy @@ -17,8 +17,7 @@ (map val) (map page/data->page-proxy))) -(deftype FileProxy [id name revn - #_:clj-kondo/ignore _data] +(deftype FileProxy [#_:clj-kondo/ignore _data] Object (getPages [_] ;; Returns a lazy (iterable) of all available pages @@ -27,16 +26,21 @@ (crc/define-properties! FileProxy {:name js/Symbol.toStringTag - :get (fn [] (str "FileProxy"))} - {:name "pages" - :get (fn [] (this-as this (.getPages ^js this)))}) + :get (fn [] (str "FileProxy"))}) (defn data->file-proxy [file data] - (utils/hide-data! - (->FileProxy (str (:id file)) - (:name file) - (:revn file) - data))) + (crc/add-properties! + (FileProxy. (merge file data)) + {:name "_data" :enumerable false} + + {:name "id" + :get (get-data-fn :id str)} + + {:name "name" + :get (get-data-fn :name)} + + {:name "pages" + :get #(.getPages ^js %)})) diff --git a/frontend/src/app/plugins/page.cljs b/frontend/src/app/plugins/page.cljs index 1310a4979..b287b1d07 100644 --- a/frontend/src/app/plugins/page.cljs +++ b/frontend/src/app/plugins/page.cljs @@ -8,8 +8,9 @@ "RPC for plugins runtime." (:require [app.common.record :as crc] + [app.common.uuid :as uuid] [app.plugins.shape :as shape] - [app.plugins.utils :as utils])) + [app.plugins.utils :refer [get-data-fn]])) (def ^:private xf-map-shape-proxy @@ -17,9 +18,14 @@ (map val) (map shape/data->shape-proxy))) -(deftype PageProxy [id name - #_:clj-kondo/ignore _data] +(deftype PageProxy [#_:clj-kondo/ignore _data] Object + (getShapeById [_ id] + (shape/data->shape-proxy (get (:objects _data) (uuid/uuid id)))) + + (getRoot [_] + (shape/data->shape-proxy (get (:objects _data) uuid/zero))) + (findShapes [_] ;; Returns a lazy (iterable) of all available shapes (apply array (sequence xf-map-shape-proxy (:objects _data))))) @@ -31,8 +37,16 @@ (defn data->page-proxy [data] - (utils/hide-data! - (->PageProxy - (str (:id data)) - (:name data) - data))) + + (crc/add-properties! + (PageProxy. data) + {:name "_data" :enumerable false} + + {:name "id" + :get (get-data-fn :id str)} + + {:name "name" + :get (get-data-fn :name)} + + {:name "root" + :get #(.getRoot ^js %)})) diff --git a/frontend/src/app/plugins/shape.cljs b/frontend/src/app/plugins/shape.cljs index 43b6db02c..2ff971fe5 100644 --- a/frontend/src/app/plugins/shape.cljs +++ b/frontend/src/app/plugins/shape.cljs @@ -7,12 +7,15 @@ (ns app.plugins.shape "RPC for plugins runtime." (:require - [app.common.data :as d] + [app.common.data.macros :as dm] [app.common.record :as crc] - [app.plugins.utils :as utils] - [app.util.object :as obj] + [app.main.data.workspace.changes :as dwc] + [app.main.store :as st] + [app.plugins.utils :refer [get-data get-data-fn]] [cuerdas.core :as str])) +(declare data->shape-proxy) + (defn- make-fills [fills] ;; TODO: Transform explicitly? @@ -20,8 +23,19 @@ (->> fills (map #(clj->js % {:keyword-fn (fn [k] (str/camel (name k)))}))))) -(deftype ShapeProxy [_data] +(defn- locate-shape + [shape-id] + (let [page-id (:current-page-id @st/state)] + (dm/get-in @st/state [:workspace-data :pages-index page-id :objects shape-id]))) + +(deftype ShapeProxy [#_:clj-kondo/ignore _data] Object + (getChildren + [self] + (apply array (->> (get-data self :shapes) + (map locate-shape) + (map data->shape-proxy)))) + (clone [_] (.log js/console (clj->js _data))) (delete [_] (.log js/console (clj->js _data))) (appendChild [_] (.log js/console (clj->js _data)))) @@ -31,36 +45,28 @@ {:name js/Symbol.toStringTag :get (fn [] (str "ShapeProxy"))}) - -(defn get-data - ([this attr] - (-> this - (obj/get "_data") - (get attr))) - ([this attr transform-fn] - (-> this - (get-data attr) - (transform-fn)))) - (defn data->shape-proxy [data] - (-> (->ShapeProxy data) - (js/Object.defineProperties - #js {"_data" #js {:enumerable false} + (crc/add-properties! + (ShapeProxy. data) + {:name "_data" + :enumerable false} + + {:name "id" + :get (get-data-fn :id str)} - :id - #js {:get #(get-data (js* "this") :id str) - :enumerable true} + {:name "name" + :get (get-data-fn :name) + :set (fn [self value] + (let [id (get-data self :id)] + (st/emit! (dwc/update-shapes [id] #(assoc % :name value)))))} - :name - #js {:get #(get-data (js* "this") :name) - ;;:set (fn [] (prn "SET NAME")) - :enumerable true} + {:name "children" + :get #(.getChildren ^js %)} - :fills - #js {:get #(get-data (js* "this") :fills make-fills) - ;;:set (fn [] (prn "SET FILLS")) - :enumerable true}} - ))) + {:name "fills" + :get (get-data-fn :fills make-fills) + ;;:set (fn [self value] (.log js/console self value)) + })) diff --git a/frontend/src/app/plugins/utils.cljs b/frontend/src/app/plugins/utils.cljs index 0c12b8192..1b392d84c 100644 --- a/frontend/src/app/plugins/utils.cljs +++ b/frontend/src/app/plugins/utils.cljs @@ -5,8 +5,26 @@ ;; Copyright (c) KALEIDOS INC (ns app.plugins.utils - "RPC for plugins runtime.") + "RPC for plugins runtime." + (:require + [app.util.object :as obj])) + +(defn get-data + ([self attr] + (-> (obj/get self "_data") + (get attr))) + + ([self attr transform-fn] + (-> (get-data self attr) + (transform-fn)))) + +(defn get-data-fn + ([attr] + (fn [self] + (get-data self attr))) + + ([attr transform-fn] + (fn [self] + (get-data self attr transform-fn)))) + -(defn hide-data! - [proxy] - (.defineProperty js/Object proxy "_data" #js {:enumerable false})) -- Gitee From d530815860eeffcbf046273306ea9c4009e418ad Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 18 Apr 2024 16:40:00 +0200 Subject: [PATCH 0327/1266] :sparkles: Upload plugins-runtime binary --- frontend/resources/plugins-runtime/index.mjs | 7664 ++++++++++++++++++ 1 file changed, 7664 insertions(+) create mode 100644 frontend/resources/plugins-runtime/index.mjs diff --git a/frontend/resources/plugins-runtime/index.mjs b/frontend/resources/plugins-runtime/index.mjs new file mode 100644 index 000000000..59c2daa7c --- /dev/null +++ b/frontend/resources/plugins-runtime/index.mjs @@ -0,0 +1,7664 @@ +const E = globalThis, { + Array: bs, + Date: ws, + FinalizationRegistry: gt, + Float32Array: xs, + JSON: Ss, + Map: Ie, + Math: Es, + Number: ro, + Object: nn, + Promise: Ps, + Proxy: br, + Reflect: ks, + RegExp: ze, + Set: wt, + String: ie, + Symbol: At, + WeakMap: Pe, + WeakSet: xt +} = globalThis, { + // The feral Error constructor is safe for internal use, but must not be + // revealed to post-lockdown code in any compartment including the start + // compartment since in V8 at least it bears stack inspection capabilities. + Error: le, + RangeError: Ts, + ReferenceError: et, + SyntaxError: Gt, + TypeError: v +} = globalThis, { + assign: wr, + create: H, + defineProperties: F, + entries: te, + freeze: y, + getOwnPropertyDescriptor: ue, + getOwnPropertyDescriptors: Ke, + getOwnPropertyNames: Nt, + getPrototypeOf: G, + is: xr, + isFrozen: Xc, + isSealed: Qc, + isExtensible: el, + keys: no, + prototype: oo, + seal: tl, + preventExtensions: Is, + setPrototypeOf: so, + values: ao, + fromEntries: St +} = nn, { + species: Pn, + toStringTag: Be, + iterator: Ht, + matchAll: io, + unscopables: As, + keyFor: Cs, + for: rl +} = At, { isInteger: Ns } = ro, { stringify: co } = Ss, { defineProperty: $s } = nn, L = (t, e, r) => { + const n = $s(t, e, r); + if (n !== t) + throw v( + `Please report that the original defineProperty silently failed to set ${co( + ie(e) + )}. (SES_DEFINE_PROPERTY_FAILED_SILENTLY)` + ); + return n; +}, { + apply: oe, + construct: sr, + get: Os, + getOwnPropertyDescriptor: Rs, + has: lo, + isExtensible: Ms, + ownKeys: nt, + preventExtensions: Ls, + set: uo +} = ks, { isArray: mt, prototype: ke } = bs, { prototype: Et } = Ie, { prototype: Sr } = RegExp, { prototype: Vt } = wt, { prototype: $e } = ie, { prototype: Er } = Pe, { prototype: fo } = xt, { prototype: on } = Function, { prototype: po } = Ps, Fs = G(Uint8Array.prototype), { bind: kn } = on, k = kn.bind(kn.call), se = k(oo.hasOwnProperty), Ge = k(ke.filter), tt = k(ke.forEach), Pr = k(ke.includes), Pt = k(ke.join), de = ( + /** @type {any} */ + k(ke.map) +), jr = k(ke.pop), ae = k(ke.push), Ds = k(ke.slice), js = k(ke.some), mo = k(ke.sort), Us = k(ke[Ht]), Ae = k(Et.set), Le = k(Et.get), kr = k(Et.has), Zs = k(Et.delete), zs = k(Et.entries), Bs = k(Et[Ht]), Tr = k(Vt.add); +k(Vt.delete); +const Tn = k(Vt.forEach), sn = k(Vt.has), Gs = k(Vt[Ht]), an = k(Sr.test), cn = k(Sr.exec), Hs = k(Sr[io]), ho = k($e.endsWith), Vs = k($e.includes), Ws = k($e.indexOf); +k($e.match); +const ar = ( + /** @type {any} */ + k($e.replace) +), qs = k($e.search), ln = k($e.slice), go = k($e.split), yo = k($e.startsWith), Ks = k($e[Ht]), Js = k(Er.delete), M = k(Er.get), un = k(Er.has), ee = k(Er.set), Ir = k(fo.add), Wt = k(fo.has), Ys = k(on.toString), Xs = k(po.catch), dn = ( + /** @type {any} */ + k(po.then) +), Qs = gt && k(gt.prototype.register); +gt && k(gt.prototype.unregister); +const fn = y(H(null)), He = (t) => nn(t) === t, pn = (t) => t instanceof le, vo = eval, ye = Function, ea = () => { + throw v('Cannot eval with evalTaming set to "noEval" (SES_NO_EVAL)'); +}; +function ta() { + return this; +} +if (ta()) + throw v("SES failed to initialize, sloppy mode (SES_NO_SLOPPY)"); +const { freeze: Xe } = Object, { apply: ra } = Reflect, mn = (t) => (e, ...r) => ra(t, e, r), na = mn(Array.prototype.push), In = mn(Array.prototype.includes), oa = mn(String.prototype.split), Ye = JSON.stringify, Jt = (t, ...e) => { + let r = t[0]; + for (let n = 0; n < e.length; n += 1) + r = `${r}${e[n]}${t[n + 1]}`; + throw Error(r); +}, _o = (t, e = !1) => { + const r = [], n = (c, u, l = void 0) => { + typeof c == "string" || Jt`Environment option name ${Ye(c)} must be a string.`, typeof u == "string" || Jt`Environment option default setting ${Ye( + u + )} must be a string.`; + let d = u; + const f = t.process || void 0, m = typeof f == "object" && f.env || void 0; + if (typeof m == "object" && c in m) { + e || na(r, c); + const p = m[c]; + typeof p == "string" || Jt`Environment option named ${Ye( + c + )}, if present, must have a corresponding string value, got ${Ye( + p + )}`, d = p; + } + return l === void 0 || d === u || In(l, d) || Jt`Unrecognized ${Ye(c)} value ${Ye( + d + )}. Expected one of ${Ye([u, ...l])}`, d; + }; + Xe(n); + const a = (c) => { + const u = n(c, ""); + return Xe(u === "" ? [] : oa(u, ",")); + }; + Xe(a); + const s = (c, u) => In(a(c), u), i = () => Xe([...r]); + return Xe(i), Xe({ + getEnvironmentOption: n, + getEnvironmentOptionsList: a, + environmentOptionsListHas: s, + getCapturedEnvironmentOptionNames: i + }); +}; +Xe(_o); +const { + getEnvironmentOption: me, + getEnvironmentOptionsList: nl, + environmentOptionsListHas: ol +} = _o(globalThis, !0), ir = (t) => (t = `${t}`, t.length >= 1 && Vs("aeiouAEIOU", t[0]) ? `an ${t}` : `a ${t}`); +y(ir); +const bo = (t, e = void 0) => { + const r = new wt(), n = (a, s) => { + switch (typeof s) { + case "object": { + if (s === null) + return null; + if (sn(r, s)) + return "[Seen]"; + if (Tr(r, s), pn(s)) + return `[${s.name}: ${s.message}]`; + if (Be in s) + return `[${s[Be]}]`; + if (mt(s)) + return s; + const i = no(s); + if (i.length < 2) + return s; + let c = !0; + for (let l = 1; l < i.length; l += 1) + if (i[l - 1] >= i[l]) { + c = !1; + break; + } + if (c) + return s; + mo(i); + const u = de(i, (l) => [l, s[l]]); + return St(u); + } + case "function": + return `[Function ${s.name || ""}]`; + case "string": + return yo(s, "[") ? `[${s}]` : s; + case "undefined": + case "symbol": + return `[${ie(s)}]`; + case "bigint": + return `[${s}n]`; + case "number": + return xr(s, NaN) ? "[NaN]" : s === 1 / 0 ? "[Infinity]" : s === -1 / 0 ? "[-Infinity]" : s; + default: + return s; + } + }; + try { + return co(t, n, e); + } catch { + return "[Something that failed to stringify]"; + } +}; +y(bo); +const { isSafeInteger: sa } = Number, { freeze: ft } = Object, { toStringTag: aa } = Symbol, An = (t) => { + const r = { + next: void 0, + prev: void 0, + data: t + }; + return r.next = r, r.prev = r, r; +}, Cn = (t, e) => { + if (t === e) + throw TypeError("Cannot splice a cell into itself"); + if (e.next !== e || e.prev !== e) + throw TypeError("Expected self-linked cell"); + const r = e, n = t.next; + return r.prev = t, r.next = n, t.next = r, n.prev = r, r; +}, Or = (t) => { + const { prev: e, next: r } = t; + e.next = r, r.prev = e, t.prev = t, t.next = t; +}, wo = (t) => { + if (!sa(t) || t < 0) + throw TypeError("keysBudget must be a safe non-negative integer number"); + const e = /* @__PURE__ */ new WeakMap(); + let r = 0; + const n = An(void 0), a = (d) => { + const f = e.get(d); + if (!(f === void 0 || f.data === void 0)) + return Or(f), Cn(n, f), f; + }, s = (d) => a(d) !== void 0; + ft(s); + const i = (d) => { + const f = a(d); + return f && f.data && f.data.get(d); + }; + ft(i); + const c = (d, f) => { + if (t < 1) + return l; + let m = a(d); + if (m === void 0 && (m = An(void 0), Cn(n, m)), !m.data) + for (r += 1, m.data = /* @__PURE__ */ new WeakMap(), e.set(d, m); r > t; ) { + const p = n.prev; + Or(p), p.data = void 0, r -= 1; + } + return m.data.set(d, f), l; + }; + ft(c); + const u = (d) => { + const f = e.get(d); + return f === void 0 || (Or(f), e.delete(d), f.data === void 0) ? !1 : (f.data = void 0, r -= 1, !0); + }; + ft(u); + const l = ft({ + has: s, + get: i, + set: c, + delete: u, + // eslint-disable-next-line jsdoc/check-types + [ + /** @type {typeof Symbol.toStringTag} */ + aa + ]: "LRUCacheMap" + }); + return l; +}; +ft(wo); +const { freeze: rr } = Object, { isSafeInteger: ia } = Number, ca = 1e3, la = 100, xo = (t = ca, e = la) => { + if (!ia(e) || e < 1) + throw TypeError( + "argsPerErrorBudget must be a safe positive integer number" + ); + const r = wo(t), n = (s, i) => { + const c = r.get(s); + c !== void 0 ? (c.length >= e && c.shift(), c.push(i)) : r.set(s, [i]); + }; + rr(n); + const a = (s) => { + const i = r.get(s); + return r.delete(s), i; + }; + return rr(a), rr({ + addLogArgs: n, + takeLogArgsArray: a + }); +}; +rr(xo); +const yt = new Pe(), ot = (t, e = void 0) => { + const r = y({ + toString: y(() => bo(t, e)) + }); + return ee(yt, r, t), r; +}; +y(ot); +const ua = y(/^[\w:-]( ?[\w:-])*$/), Ur = (t, e = void 0) => { + if (typeof t != "string" || !an(ua, t)) + return ot(t, e); + const r = y({ + toString: y(() => t) + }); + return ee(yt, r, t), r; +}; +y(Ur); +const Ar = new Pe(), So = ({ template: t, args: e }) => { + const r = [t[0]]; + for (let n = 0; n < e.length; n += 1) { + const a = e[n]; + let s; + un(yt, a) ? s = `${a}` : pn(a) ? s = `(${ir(a.name)})` : s = `(${ir(typeof a)})`, ae(r, s, t[n + 1]); + } + return Pt(r, ""); +}, Eo = y({ + toString() { + const t = M(Ar, this); + return t === void 0 ? "[Not a DetailsToken]" : So(t); + } +}); +y(Eo.toString); +const vt = (t, ...e) => { + const r = y({ __proto__: Eo }); + return ee(Ar, r, { template: t, args: e }), r; +}; +y(vt); +const Po = (t, ...e) => (e = de( + e, + (r) => un(yt, r) ? r : ot(r) +), vt(t, ...e)); +y(Po); +const ko = ({ template: t, args: e }) => { + const r = [t[0]]; + for (let n = 0; n < e.length; n += 1) { + let a = e[n]; + un(yt, a) && (a = M(yt, a)); + const s = ar(jr(r) || "", / $/, ""); + s !== "" && ae(r, s); + const i = ar(t[n + 1], /^ /, ""); + ae(r, a, i); + } + return r[r.length - 1] === "" && jr(r), r; +}, nr = new Pe(); +let Zr = 0; +const Nn = new Pe(), To = (t, e = t.name) => { + let r = M(Nn, t); + return r !== void 0 || (Zr += 1, r = `${e}#${Zr}`, ee(Nn, t, r)), r; +}, zr = (t = vt`Assert failed`, e = E.Error, { errorName: r = void 0 } = {}) => { + typeof t == "string" && (t = vt([t])); + const n = M(Ar, t); + if (n === void 0) + throw v(`unrecognized details ${ot(t)}`); + const a = So(n), s = new e(a); + return ee(nr, s, ko(n)), r !== void 0 && To(s, r), s; +}; +y(zr); +const { addLogArgs: da, takeLogArgsArray: fa } = xo(), Br = new Pe(), Io = (t, e) => { + typeof e == "string" && (e = vt([e])); + const r = M(Ar, e); + if (r === void 0) + throw v(`unrecognized details ${ot(e)}`); + const n = ko(r), a = M(Br, t); + if (a !== void 0) + for (const s of a) + s(t, n); + else + da(t, n); +}; +y(Io); +const pa = (t) => { + if (!("stack" in t)) + return ""; + const e = `${t.stack}`, r = Ws(e, ` +`); + return yo(e, " ") || r === -1 ? e : ln(e, r + 1); +}, Gr = { + getStackString: E.getStackString || pa, + tagError: (t) => To(t), + resetErrorTagNum: () => { + Zr = 0; + }, + getMessageLogArgs: (t) => M(nr, t), + takeMessageLogArgs: (t) => { + const e = M(nr, t); + return Js(nr, t), e; + }, + takeNoteLogArgsArray: (t, e) => { + const r = fa(t); + if (e !== void 0) { + const n = M(Br, t); + n ? ae(n, e) : ee(Br, t, [e]); + } + return r || []; + } +}; +y(Gr); +const Cr = (t = void 0, e = !1) => { + const r = e ? Po : vt, n = r`Check failed`, a = (f = n, m = E.Error) => { + const p = zr(f, m); + throw t !== void 0 && t(p), p; + }; + y(a); + const s = (f, ...m) => a(r(f, ...m)); + function i(f, m = void 0, p = void 0) { + f || a(m, p); + } + const c = (f, m, p = void 0, h = void 0) => { + xr(f, m) || a( + p || r`Expected ${f} is same as ${m}`, + h || Ts + ); + }; + y(c); + const u = (f, m, p) => { + if (typeof f !== m) { + if (typeof m == "string" || s`${ot(m)} must be a string`, p === void 0) { + const h = ir(m); + p = r`${f} must be ${Ur(h)}`; + } + a(p, v); + } + }; + y(u); + const d = wr(i, { + error: zr, + fail: a, + equal: c, + typeof: u, + string: (f, m = void 0) => u(f, "string", m), + note: Io, + details: r, + Fail: s, + quote: ot, + bare: Ur, + makeAssert: Cr + }); + return y(d); +}; +y(Cr); +const Z = Cr(), Ao = ue( + Fs, + Be +); +Z(Ao); +const Co = Ao.get; +Z(Co); +const ma = (t) => oe(Co, t, []) !== void 0, ha = (t) => { + const e = +ie(t); + return Ns(e) && ie(e) === t; +}, ga = (t) => { + Is(t), tt(nt(t), (e) => { + const r = ue(t, e); + Z(r), ha(e) || L(t, e, { + ...r, + writable: !1, + configurable: !1 + }); + }); +}, ya = () => { + if (typeof E.harden == "function") + return E.harden; + const t = new xt(), { harden: e } = { + /** + * @template T + * @param {T} root + * @returns {T} + */ + harden(r) { + const n = new wt(), a = new Pe(); + function s(d, f = void 0) { + if (!He(d)) + return; + const m = typeof d; + if (m !== "object" && m !== "function") + throw v(`Unexpected typeof: ${m}`); + Wt(t, d) || sn(n, d) || (Tr(n, d), ee(a, d, f)); + } + function i(d) { + ma(d) ? ga(d) : y(d); + const f = M(a, d) || "unknown", m = Ke(d), p = G(d); + s(p, `${f}.__proto__`), tt(nt(m), (h) => { + const _ = `${f}.${ie(h)}`, w = m[ + /** @type {string} */ + h + ]; + se(w, "value") ? s(w.value, `${_}`) : (s(w.get, `${_}(get)`), s(w.set, `${_}(set)`)); + }); + } + function c() { + Tn(n, i); + } + function u(d) { + Ir(t, d); + } + function l() { + Tn(n, u); + } + return s(r), c(), l(), r; + } + }; + return e; +}, No = { + // *** Value Properties of the Global Object + Infinity: 1 / 0, + NaN: NaN, + undefined: void 0 +}, $o = { + // *** Function Properties of the Global Object + isFinite: "isFinite", + isNaN: "isNaN", + parseFloat: "parseFloat", + parseInt: "parseInt", + decodeURI: "decodeURI", + decodeURIComponent: "decodeURIComponent", + encodeURI: "encodeURI", + encodeURIComponent: "encodeURIComponent", + // *** Constructor Properties of the Global Object + Array: "Array", + ArrayBuffer: "ArrayBuffer", + BigInt: "BigInt", + BigInt64Array: "BigInt64Array", + BigUint64Array: "BigUint64Array", + Boolean: "Boolean", + DataView: "DataView", + EvalError: "EvalError", + // https://github.com/tc39/proposal-float16array + Float16Array: "Float16Array", + Float32Array: "Float32Array", + Float64Array: "Float64Array", + Int8Array: "Int8Array", + Int16Array: "Int16Array", + Int32Array: "Int32Array", + Map: "Map", + Number: "Number", + Object: "Object", + Promise: "Promise", + Proxy: "Proxy", + RangeError: "RangeError", + ReferenceError: "ReferenceError", + Set: "Set", + String: "String", + SyntaxError: "SyntaxError", + TypeError: "TypeError", + Uint8Array: "Uint8Array", + Uint8ClampedArray: "Uint8ClampedArray", + Uint16Array: "Uint16Array", + Uint32Array: "Uint32Array", + URIError: "URIError", + WeakMap: "WeakMap", + WeakSet: "WeakSet", + // https://github.com/tc39/proposal-iterator-helpers + Iterator: "Iterator", + // https://github.com/tc39/proposal-async-iterator-helpers + AsyncIterator: "AsyncIterator", + // *** Other Properties of the Global Object + JSON: "JSON", + Reflect: "Reflect", + // *** Annex B + escape: "escape", + unescape: "unescape", + // ESNext + lockdown: "lockdown", + harden: "harden", + HandledPromise: "HandledPromise" + // TODO: Until Promise.delegate (see below). +}, $n = { + // *** Constructor Properties of the Global Object + Date: "%InitialDate%", + Error: "%InitialError%", + RegExp: "%InitialRegExp%", + // Omit `Symbol`, because we want the original to appear on the + // start compartment without passing through the whitelist mechanism, since + // we want to preserve all its properties, even if we never heard of them. + // Symbol: '%InitialSymbol%', + // *** Other Properties of the Global Object + Math: "%InitialMath%", + // ESNext + // From Error-stack proposal + // Only on initial global. No corresponding + // powerless form for other globals. + getStackString: "%InitialGetStackString%" + // TODO https://github.com/Agoric/SES-shim/issues/551 + // Need initial WeakRef and FinalizationGroup in + // start compartment only. +}, Oo = { + // *** Constructor Properties of the Global Object + Date: "%SharedDate%", + Error: "%SharedError%", + RegExp: "%SharedRegExp%", + Symbol: "%SharedSymbol%", + // *** Other Properties of the Global Object + Math: "%SharedMath%" +}, va = [ + EvalError, + RangeError, + ReferenceError, + SyntaxError, + TypeError, + URIError +], Hr = { + "[[Proto]]": "%FunctionPrototype%", + length: "number", + name: "string" + // Do not specify "prototype" here, since only Function instances that can + // be used as a constructor have a prototype property. For constructors, + // since prototype properties are instance-specific, we define it there. +}, _a = { + // This property is not mentioned in ECMA 262, but is present in V8 and + // necessary for lockdown to succeed. + "[[Proto]]": "%AsyncFunctionPrototype%" +}, o = Hr, On = _a, O = { + get: o, + set: "undefined" +}, Te = { + get: o, + set: o +}, Rn = (t) => t === O || t === Te; +function lt(t) { + return { + // Properties of the NativeError Constructors + "[[Proto]]": "%SharedError%", + // NativeError.prototype + prototype: t + }; +} +function ut(t) { + return { + // Properties of the NativeError Prototype Objects + "[[Proto]]": "%ErrorPrototype%", + constructor: t, + message: "string", + name: "string", + // Redundantly present only on v8. Safe to remove. + toString: !1, + // Superfluously present in some versions of V8. + // https://github.com/tc39/notes/blob/master/meetings/2021-10/oct-26.md#:~:text=However%2C%20Chrome%2093,and%20node%2016.11. + cause: !1 + }; +} +function he(t) { + return { + // Properties of the TypedArray Constructors + "[[Proto]]": "%TypedArray%", + BYTES_PER_ELEMENT: "number", + prototype: t + }; +} +function ge(t) { + return { + // Properties of the TypedArray Prototype Objects + "[[Proto]]": "%TypedArrayPrototype%", + BYTES_PER_ELEMENT: "number", + constructor: t + }; +} +const Mn = { + E: "number", + LN10: "number", + LN2: "number", + LOG10E: "number", + LOG2E: "number", + PI: "number", + SQRT1_2: "number", + SQRT2: "number", + "@@toStringTag": "string", + abs: o, + acos: o, + acosh: o, + asin: o, + asinh: o, + atan: o, + atanh: o, + atan2: o, + cbrt: o, + ceil: o, + clz32: o, + cos: o, + cosh: o, + exp: o, + expm1: o, + floor: o, + fround: o, + hypot: o, + imul: o, + log: o, + log1p: o, + log10: o, + log2: o, + max: o, + min: o, + pow: o, + round: o, + sign: o, + sin: o, + sinh: o, + sqrt: o, + tan: o, + tanh: o, + trunc: o, + // See https://github.com/Moddable-OpenSource/moddable/issues/523 + idiv: !1, + // See https://github.com/Moddable-OpenSource/moddable/issues/523 + idivmod: !1, + // See https://github.com/Moddable-OpenSource/moddable/issues/523 + imod: !1, + // See https://github.com/Moddable-OpenSource/moddable/issues/523 + imuldiv: !1, + // See https://github.com/Moddable-OpenSource/moddable/issues/523 + irem: !1, + // See https://github.com/Moddable-OpenSource/moddable/issues/523 + mod: !1, + // See https://github.com/Moddable-OpenSource/moddable/issues/523#issuecomment-1942904505 + irandom: !1 +}, cr = { + // ECMA https://tc39.es/ecma262 + // The intrinsics object has no prototype to avoid conflicts. + "[[Proto]]": null, + // %ThrowTypeError% + "%ThrowTypeError%": o, + // *** The Global Object + // *** Value Properties of the Global Object + Infinity: "number", + NaN: "number", + undefined: "undefined", + // *** Function Properties of the Global Object + // eval + "%UniqueEval%": o, + isFinite: o, + isNaN: o, + parseFloat: o, + parseInt: o, + decodeURI: o, + decodeURIComponent: o, + encodeURI: o, + encodeURIComponent: o, + // *** Fundamental Objects + Object: { + // Properties of the Object Constructor + "[[Proto]]": "%FunctionPrototype%", + assign: o, + create: o, + defineProperties: o, + defineProperty: o, + entries: o, + freeze: o, + fromEntries: o, + getOwnPropertyDescriptor: o, + getOwnPropertyDescriptors: o, + getOwnPropertyNames: o, + getOwnPropertySymbols: o, + getPrototypeOf: o, + hasOwn: o, + is: o, + isExtensible: o, + isFrozen: o, + isSealed: o, + keys: o, + preventExtensions: o, + prototype: "%ObjectPrototype%", + seal: o, + setPrototypeOf: o, + values: o, + // https://github.com/tc39/proposal-array-grouping + groupBy: o, + // Seen on QuickJS + __getClass: !1 + }, + "%ObjectPrototype%": { + // Properties of the Object Prototype Object + "[[Proto]]": null, + constructor: "Object", + hasOwnProperty: o, + isPrototypeOf: o, + propertyIsEnumerable: o, + toLocaleString: o, + toString: o, + valueOf: o, + // Annex B: Additional Properties of the Object.prototype Object + // See note in header about the difference between [[Proto]] and --proto-- + // special notations. + "--proto--": Te, + __defineGetter__: o, + __defineSetter__: o, + __lookupGetter__: o, + __lookupSetter__: o + }, + "%UniqueFunction%": { + // Properties of the Function Constructor + "[[Proto]]": "%FunctionPrototype%", + prototype: "%FunctionPrototype%" + }, + "%InertFunction%": { + "[[Proto]]": "%FunctionPrototype%", + prototype: "%FunctionPrototype%" + }, + "%FunctionPrototype%": { + apply: o, + bind: o, + call: o, + constructor: "%InertFunction%", + toString: o, + "@@hasInstance": o, + // proposed but not yet std. To be removed if there + caller: !1, + // proposed but not yet std. To be removed if there + arguments: !1, + // Seen on QuickJS. TODO grab getter for use by console + fileName: !1, + // Seen on QuickJS. TODO grab getter for use by console + lineNumber: !1 + }, + Boolean: { + // Properties of the Boolean Constructor + "[[Proto]]": "%FunctionPrototype%", + prototype: "%BooleanPrototype%" + }, + "%BooleanPrototype%": { + constructor: "Boolean", + toString: o, + valueOf: o + }, + "%SharedSymbol%": { + // Properties of the Symbol Constructor + "[[Proto]]": "%FunctionPrototype%", + asyncDispose: "symbol", + asyncIterator: "symbol", + dispose: "symbol", + for: o, + hasInstance: "symbol", + isConcatSpreadable: "symbol", + iterator: "symbol", + keyFor: o, + match: "symbol", + matchAll: "symbol", + prototype: "%SymbolPrototype%", + replace: "symbol", + search: "symbol", + species: "symbol", + split: "symbol", + toPrimitive: "symbol", + toStringTag: "symbol", + unscopables: "symbol", + // Seen at core-js https://github.com/zloirock/core-js#ecmascript-symbol + useSimple: !1, + // Seen at core-js https://github.com/zloirock/core-js#ecmascript-symbol + useSetter: !1, + // Seen on QuickJS + operatorSet: !1 + }, + "%SymbolPrototype%": { + // Properties of the Symbol Prototype Object + constructor: "%SharedSymbol%", + description: O, + toString: o, + valueOf: o, + "@@toPrimitive": o, + "@@toStringTag": "string" + }, + "%InitialError%": { + // Properties of the Error Constructor + "[[Proto]]": "%FunctionPrototype%", + prototype: "%ErrorPrototype%", + // Non standard, v8 only, used by tap + captureStackTrace: o, + // Non standard, v8 only, used by tap, tamed to accessor + stackTraceLimit: Te, + // Non standard, v8 only, used by several, tamed to accessor + prepareStackTrace: Te + }, + "%SharedError%": { + // Properties of the Error Constructor + "[[Proto]]": "%FunctionPrototype%", + prototype: "%ErrorPrototype%", + // Non standard, v8 only, used by tap + captureStackTrace: o, + // Non standard, v8 only, used by tap, tamed to accessor + stackTraceLimit: Te, + // Non standard, v8 only, used by several, tamed to accessor + prepareStackTrace: Te + }, + "%ErrorPrototype%": { + constructor: "%SharedError%", + message: "string", + name: "string", + toString: o, + // proposed de-facto, assumed TODO + // Seen on FF Nightly 88.0a1 + at: !1, + // Seen on FF and XS + stack: Te, + // Superfluously present in some versions of V8. + // https://github.com/tc39/notes/blob/master/meetings/2021-10/oct-26.md#:~:text=However%2C%20Chrome%2093,and%20node%2016.11. + cause: !1 + }, + // NativeError + EvalError: lt("%EvalErrorPrototype%"), + RangeError: lt("%RangeErrorPrototype%"), + ReferenceError: lt("%ReferenceErrorPrototype%"), + SyntaxError: lt("%SyntaxErrorPrototype%"), + TypeError: lt("%TypeErrorPrototype%"), + URIError: lt("%URIErrorPrototype%"), + "%EvalErrorPrototype%": ut("EvalError"), + "%RangeErrorPrototype%": ut("RangeError"), + "%ReferenceErrorPrototype%": ut("ReferenceError"), + "%SyntaxErrorPrototype%": ut("SyntaxError"), + "%TypeErrorPrototype%": ut("TypeError"), + "%URIErrorPrototype%": ut("URIError"), + // *** Numbers and Dates + Number: { + // Properties of the Number Constructor + "[[Proto]]": "%FunctionPrototype%", + EPSILON: "number", + isFinite: o, + isInteger: o, + isNaN: o, + isSafeInteger: o, + MAX_SAFE_INTEGER: "number", + MAX_VALUE: "number", + MIN_SAFE_INTEGER: "number", + MIN_VALUE: "number", + NaN: "number", + NEGATIVE_INFINITY: "number", + parseFloat: o, + parseInt: o, + POSITIVE_INFINITY: "number", + prototype: "%NumberPrototype%" + }, + "%NumberPrototype%": { + // Properties of the Number Prototype Object + constructor: "Number", + toExponential: o, + toFixed: o, + toLocaleString: o, + toPrecision: o, + toString: o, + valueOf: o + }, + BigInt: { + // Properties of the BigInt Constructor + "[[Proto]]": "%FunctionPrototype%", + asIntN: o, + asUintN: o, + prototype: "%BigIntPrototype%", + // See https://github.com/Moddable-OpenSource/moddable/issues/523 + bitLength: !1, + // See https://github.com/Moddable-OpenSource/moddable/issues/523 + fromArrayBuffer: !1, + // Seen on QuickJS + tdiv: !1, + // Seen on QuickJS + fdiv: !1, + // Seen on QuickJS + cdiv: !1, + // Seen on QuickJS + ediv: !1, + // Seen on QuickJS + tdivrem: !1, + // Seen on QuickJS + fdivrem: !1, + // Seen on QuickJS + cdivrem: !1, + // Seen on QuickJS + edivrem: !1, + // Seen on QuickJS + sqrt: !1, + // Seen on QuickJS + sqrtrem: !1, + // Seen on QuickJS + floorLog2: !1, + // Seen on QuickJS + ctz: !1 + }, + "%BigIntPrototype%": { + constructor: "BigInt", + toLocaleString: o, + toString: o, + valueOf: o, + "@@toStringTag": "string" + }, + "%InitialMath%": { + ...Mn, + // `%InitialMath%.random()` has the standard unsafe behavior + random: o + }, + "%SharedMath%": { + ...Mn, + // `%SharedMath%.random()` is tamed to always throw + random: o + }, + "%InitialDate%": { + // Properties of the Date Constructor + "[[Proto]]": "%FunctionPrototype%", + now: o, + parse: o, + prototype: "%DatePrototype%", + UTC: o + }, + "%SharedDate%": { + // Properties of the Date Constructor + "[[Proto]]": "%FunctionPrototype%", + // `%SharedDate%.now()` is tamed to always throw + now: o, + parse: o, + prototype: "%DatePrototype%", + UTC: o + }, + "%DatePrototype%": { + constructor: "%SharedDate%", + getDate: o, + getDay: o, + getFullYear: o, + getHours: o, + getMilliseconds: o, + getMinutes: o, + getMonth: o, + getSeconds: o, + getTime: o, + getTimezoneOffset: o, + getUTCDate: o, + getUTCDay: o, + getUTCFullYear: o, + getUTCHours: o, + getUTCMilliseconds: o, + getUTCMinutes: o, + getUTCMonth: o, + getUTCSeconds: o, + setDate: o, + setFullYear: o, + setHours: o, + setMilliseconds: o, + setMinutes: o, + setMonth: o, + setSeconds: o, + setTime: o, + setUTCDate: o, + setUTCFullYear: o, + setUTCHours: o, + setUTCMilliseconds: o, + setUTCMinutes: o, + setUTCMonth: o, + setUTCSeconds: o, + toDateString: o, + toISOString: o, + toJSON: o, + toLocaleDateString: o, + toLocaleString: o, + toLocaleTimeString: o, + toString: o, + toTimeString: o, + toUTCString: o, + valueOf: o, + "@@toPrimitive": o, + // Annex B: Additional Properties of the Date.prototype Object + getYear: o, + setYear: o, + toGMTString: o + }, + // Text Processing + String: { + // Properties of the String Constructor + "[[Proto]]": "%FunctionPrototype%", + fromCharCode: o, + fromCodePoint: o, + prototype: "%StringPrototype%", + raw: o, + // See https://github.com/Moddable-OpenSource/moddable/issues/523 + fromArrayBuffer: !1 + }, + "%StringPrototype%": { + // Properties of the String Prototype Object + length: "number", + at: o, + charAt: o, + charCodeAt: o, + codePointAt: o, + concat: o, + constructor: "String", + endsWith: o, + includes: o, + indexOf: o, + lastIndexOf: o, + localeCompare: o, + match: o, + matchAll: o, + normalize: o, + padEnd: o, + padStart: o, + repeat: o, + replace: o, + replaceAll: o, + // ES2021 + search: o, + slice: o, + split: o, + startsWith: o, + substring: o, + toLocaleLowerCase: o, + toLocaleUpperCase: o, + toLowerCase: o, + toString: o, + toUpperCase: o, + trim: o, + trimEnd: o, + trimStart: o, + valueOf: o, + "@@iterator": o, + // Annex B: Additional Properties of the String.prototype Object + substr: o, + anchor: o, + big: o, + blink: o, + bold: o, + fixed: o, + fontcolor: o, + fontsize: o, + italics: o, + link: o, + small: o, + strike: o, + sub: o, + sup: o, + trimLeft: o, + trimRight: o, + // See https://github.com/Moddable-OpenSource/moddable/issues/523 + compare: !1, + // https://github.com/tc39/proposal-is-usv-string + isWellFormed: o, + toWellFormed: o, + unicodeSets: o, + // Seen on QuickJS + __quote: !1 + }, + "%StringIteratorPrototype%": { + "[[Proto]]": "%IteratorPrototype%", + next: o, + "@@toStringTag": "string" + }, + "%InitialRegExp%": { + // Properties of the RegExp Constructor + "[[Proto]]": "%FunctionPrototype%", + prototype: "%RegExpPrototype%", + "@@species": O, + // The https://github.com/tc39/proposal-regexp-legacy-features + // are all optional, unsafe, and omitted + input: !1, + $_: !1, + lastMatch: !1, + "$&": !1, + lastParen: !1, + "$+": !1, + leftContext: !1, + "$`": !1, + rightContext: !1, + "$'": !1, + $1: !1, + $2: !1, + $3: !1, + $4: !1, + $5: !1, + $6: !1, + $7: !1, + $8: !1, + $9: !1 + }, + "%SharedRegExp%": { + // Properties of the RegExp Constructor + "[[Proto]]": "%FunctionPrototype%", + prototype: "%RegExpPrototype%", + "@@species": O + }, + "%RegExpPrototype%": { + // Properties of the RegExp Prototype Object + constructor: "%SharedRegExp%", + exec: o, + dotAll: O, + flags: O, + global: O, + hasIndices: O, + ignoreCase: O, + "@@match": o, + "@@matchAll": o, + multiline: O, + "@@replace": o, + "@@search": o, + source: O, + "@@split": o, + sticky: O, + test: o, + toString: o, + unicode: O, + unicodeSets: O, + // Annex B: Additional Properties of the RegExp.prototype Object + compile: !1 + // UNSAFE and suppressed. + }, + "%RegExpStringIteratorPrototype%": { + // The %RegExpStringIteratorPrototype% Object + "[[Proto]]": "%IteratorPrototype%", + next: o, + "@@toStringTag": "string" + }, + // Indexed Collections + Array: { + // Properties of the Array Constructor + "[[Proto]]": "%FunctionPrototype%", + from: o, + isArray: o, + of: o, + prototype: "%ArrayPrototype%", + "@@species": O, + // Stage 3: + // https://tc39.es/proposal-relative-indexing-method/ + at: o, + // https://tc39.es/proposal-array-from-async/ + fromAsync: o + }, + "%ArrayPrototype%": { + // Properties of the Array Prototype Object + at: o, + length: "number", + concat: o, + constructor: "Array", + copyWithin: o, + entries: o, + every: o, + fill: o, + filter: o, + find: o, + findIndex: o, + flat: o, + flatMap: o, + forEach: o, + includes: o, + indexOf: o, + join: o, + keys: o, + lastIndexOf: o, + map: o, + pop: o, + push: o, + reduce: o, + reduceRight: o, + reverse: o, + shift: o, + slice: o, + some: o, + sort: o, + splice: o, + toLocaleString: o, + toString: o, + unshift: o, + values: o, + "@@iterator": o, + "@@unscopables": { + "[[Proto]]": null, + copyWithin: "boolean", + entries: "boolean", + fill: "boolean", + find: "boolean", + findIndex: "boolean", + flat: "boolean", + flatMap: "boolean", + includes: "boolean", + keys: "boolean", + values: "boolean", + // Failed tc39 proposal + // Seen on FF Nightly 88.0a1 + at: "boolean", + // See https://github.com/tc39/proposal-array-find-from-last + findLast: "boolean", + findLastIndex: "boolean", + // https://github.com/tc39/proposal-change-array-by-copy + toReversed: "boolean", + toSorted: "boolean", + toSpliced: "boolean", + with: "boolean", + // https://github.com/tc39/proposal-array-grouping + group: "boolean", + groupToMap: "boolean", + groupBy: "boolean" + }, + // See https://github.com/tc39/proposal-array-find-from-last + findLast: o, + findLastIndex: o, + // https://github.com/tc39/proposal-change-array-by-copy + toReversed: o, + toSorted: o, + toSpliced: o, + with: o, + // https://github.com/tc39/proposal-array-grouping + group: o, + // Not in proposal? Where? + groupToMap: o, + // Not in proposal? Where? + groupBy: o + }, + "%ArrayIteratorPrototype%": { + // The %ArrayIteratorPrototype% Object + "[[Proto]]": "%IteratorPrototype%", + next: o, + "@@toStringTag": "string" + }, + // *** TypedArray Objects + "%TypedArray%": { + // Properties of the %TypedArray% Intrinsic Object + "[[Proto]]": "%FunctionPrototype%", + from: o, + of: o, + prototype: "%TypedArrayPrototype%", + "@@species": O + }, + "%TypedArrayPrototype%": { + at: o, + buffer: O, + byteLength: O, + byteOffset: O, + constructor: "%TypedArray%", + copyWithin: o, + entries: o, + every: o, + fill: o, + filter: o, + find: o, + findIndex: o, + forEach: o, + includes: o, + indexOf: o, + join: o, + keys: o, + lastIndexOf: o, + length: O, + map: o, + reduce: o, + reduceRight: o, + reverse: o, + set: o, + slice: o, + some: o, + sort: o, + subarray: o, + toLocaleString: o, + toString: o, + values: o, + "@@iterator": o, + "@@toStringTag": O, + // See https://github.com/tc39/proposal-array-find-from-last + findLast: o, + findLastIndex: o, + // https://github.com/tc39/proposal-change-array-by-copy + toReversed: o, + toSorted: o, + with: o + }, + // The TypedArray Constructors + BigInt64Array: he("%BigInt64ArrayPrototype%"), + BigUint64Array: he("%BigUint64ArrayPrototype%"), + // https://github.com/tc39/proposal-float16array + Float16Array: he("%Float16ArrayPrototype%"), + Float32Array: he("%Float32ArrayPrototype%"), + Float64Array: he("%Float64ArrayPrototype%"), + Int16Array: he("%Int16ArrayPrototype%"), + Int32Array: he("%Int32ArrayPrototype%"), + Int8Array: he("%Int8ArrayPrototype%"), + Uint16Array: he("%Uint16ArrayPrototype%"), + Uint32Array: he("%Uint32ArrayPrototype%"), + Uint8Array: he("%Uint8ArrayPrototype%"), + Uint8ClampedArray: he("%Uint8ClampedArrayPrototype%"), + "%BigInt64ArrayPrototype%": ge("BigInt64Array"), + "%BigUint64ArrayPrototype%": ge("BigUint64Array"), + // https://github.com/tc39/proposal-float16array + "%Float16ArrayPrototype%": ge("Float16Array"), + "%Float32ArrayPrototype%": ge("Float32Array"), + "%Float64ArrayPrototype%": ge("Float64Array"), + "%Int16ArrayPrototype%": ge("Int16Array"), + "%Int32ArrayPrototype%": ge("Int32Array"), + "%Int8ArrayPrototype%": ge("Int8Array"), + "%Uint16ArrayPrototype%": ge("Uint16Array"), + "%Uint32ArrayPrototype%": ge("Uint32Array"), + "%Uint8ArrayPrototype%": ge("Uint8Array"), + "%Uint8ClampedArrayPrototype%": ge("Uint8ClampedArray"), + // *** Keyed Collections + Map: { + // Properties of the Map Constructor + "[[Proto]]": "%FunctionPrototype%", + "@@species": O, + prototype: "%MapPrototype%", + // https://github.com/tc39/proposal-array-grouping + groupBy: o + }, + "%MapPrototype%": { + clear: o, + constructor: "Map", + delete: o, + entries: o, + forEach: o, + get: o, + has: o, + keys: o, + set: o, + size: O, + values: o, + "@@iterator": o, + "@@toStringTag": "string" + }, + "%MapIteratorPrototype%": { + // The %MapIteratorPrototype% Object + "[[Proto]]": "%IteratorPrototype%", + next: o, + "@@toStringTag": "string" + }, + Set: { + // Properties of the Set Constructor + "[[Proto]]": "%FunctionPrototype%", + prototype: "%SetPrototype%", + "@@species": O, + // Seen on QuickJS + groupBy: !1 + }, + "%SetPrototype%": { + add: o, + clear: o, + constructor: "Set", + delete: o, + entries: o, + forEach: o, + has: o, + keys: o, + size: O, + values: o, + "@@iterator": o, + "@@toStringTag": "string", + // See https://github.com/tc39/proposal-set-methods + intersection: o, + // See https://github.com/tc39/proposal-set-methods + union: o, + // See https://github.com/tc39/proposal-set-methods + difference: o, + // See https://github.com/tc39/proposal-set-methods + symmetricDifference: o, + // See https://github.com/tc39/proposal-set-methods + isSubsetOf: o, + // See https://github.com/tc39/proposal-set-methods + isSupersetOf: o, + // See https://github.com/tc39/proposal-set-methods + isDisjointFrom: o + }, + "%SetIteratorPrototype%": { + // The %SetIteratorPrototype% Object + "[[Proto]]": "%IteratorPrototype%", + next: o, + "@@toStringTag": "string" + }, + WeakMap: { + // Properties of the WeakMap Constructor + "[[Proto]]": "%FunctionPrototype%", + prototype: "%WeakMapPrototype%" + }, + "%WeakMapPrototype%": { + constructor: "WeakMap", + delete: o, + get: o, + has: o, + set: o, + "@@toStringTag": "string" + }, + WeakSet: { + // Properties of the WeakSet Constructor + "[[Proto]]": "%FunctionPrototype%", + prototype: "%WeakSetPrototype%" + }, + "%WeakSetPrototype%": { + add: o, + constructor: "WeakSet", + delete: o, + has: o, + "@@toStringTag": "string" + }, + // *** Structured Data + ArrayBuffer: { + // Properties of the ArrayBuffer Constructor + "[[Proto]]": "%FunctionPrototype%", + isView: o, + prototype: "%ArrayBufferPrototype%", + "@@species": O, + // See https://github.com/Moddable-OpenSource/moddable/issues/523 + fromString: !1, + // See https://github.com/Moddable-OpenSource/moddable/issues/523 + fromBigInt: !1 + }, + "%ArrayBufferPrototype%": { + byteLength: O, + constructor: "ArrayBuffer", + slice: o, + "@@toStringTag": "string", + // See https://github.com/Moddable-OpenSource/moddable/issues/523 + concat: !1, + // See https://github.com/tc39/proposal-resizablearraybuffer + transfer: o, + resize: o, + resizable: O, + maxByteLength: O, + // https://github.com/tc39/proposal-arraybuffer-transfer + transferToFixedLength: o, + detached: O + }, + // SharedArrayBuffer Objects + SharedArrayBuffer: !1, + // UNSAFE and purposely suppressed. + "%SharedArrayBufferPrototype%": !1, + // UNSAFE and purposely suppressed. + DataView: { + // Properties of the DataView Constructor + "[[Proto]]": "%FunctionPrototype%", + BYTES_PER_ELEMENT: "number", + // Non std but undeletable on Safari. + prototype: "%DataViewPrototype%" + }, + "%DataViewPrototype%": { + buffer: O, + byteLength: O, + byteOffset: O, + constructor: "DataView", + getBigInt64: o, + getBigUint64: o, + // https://github.com/tc39/proposal-float16array + getFloat16: o, + getFloat32: o, + getFloat64: o, + getInt8: o, + getInt16: o, + getInt32: o, + getUint8: o, + getUint16: o, + getUint32: o, + setBigInt64: o, + setBigUint64: o, + // https://github.com/tc39/proposal-float16array + setFloat16: o, + setFloat32: o, + setFloat64: o, + setInt8: o, + setInt16: o, + setInt32: o, + setUint8: o, + setUint16: o, + setUint32: o, + "@@toStringTag": "string" + }, + // Atomics + Atomics: !1, + // UNSAFE and suppressed. + JSON: { + parse: o, + stringify: o, + "@@toStringTag": "string", + // https://github.com/tc39/proposal-json-parse-with-source/ + rawJSON: o, + isRawJSON: o + }, + // *** Control Abstraction Objects + // https://github.com/tc39/proposal-iterator-helpers + Iterator: { + // Properties of the Iterator Constructor + "[[Proto]]": "%FunctionPrototype%", + prototype: "%IteratorPrototype%", + from: o + }, + "%IteratorPrototype%": { + // The %IteratorPrototype% Object + "@@iterator": o, + // https://github.com/tc39/proposal-iterator-helpers + constructor: "Iterator", + map: o, + filter: o, + take: o, + drop: o, + flatMap: o, + reduce: o, + toArray: o, + forEach: o, + some: o, + every: o, + find: o, + "@@toStringTag": "string", + // https://github.com/tc39/proposal-async-iterator-helpers + toAsync: o, + // See https://github.com/Moddable-OpenSource/moddable/issues/523#issuecomment-1942904505 + "@@dispose": !1 + }, + // https://github.com/tc39/proposal-iterator-helpers + "%WrapForValidIteratorPrototype%": { + "[[Proto]]": "%IteratorPrototype%", + next: o, + return: o + }, + // https://github.com/tc39/proposal-iterator-helpers + "%IteratorHelperPrototype%": { + "[[Proto]]": "%IteratorPrototype%", + next: o, + return: o, + "@@toStringTag": "string" + }, + // https://github.com/tc39/proposal-async-iterator-helpers + AsyncIterator: { + // Properties of the Iterator Constructor + "[[Proto]]": "%FunctionPrototype%", + prototype: "%AsyncIteratorPrototype%", + from: o + }, + "%AsyncIteratorPrototype%": { + // The %AsyncIteratorPrototype% Object + "@@asyncIterator": o, + // https://github.com/tc39/proposal-async-iterator-helpers + constructor: "AsyncIterator", + map: o, + filter: o, + take: o, + drop: o, + flatMap: o, + reduce: o, + toArray: o, + forEach: o, + some: o, + every: o, + find: o, + "@@toStringTag": "string", + // See https://github.com/Moddable-OpenSource/moddable/issues/523#issuecomment-1942904505 + "@@asyncDispose": !1 + }, + // https://github.com/tc39/proposal-async-iterator-helpers + "%WrapForValidAsyncIteratorPrototype%": { + "[[Proto]]": "%AsyncIteratorPrototype%", + next: o, + return: o + }, + // https://github.com/tc39/proposal-async-iterator-helpers + "%AsyncIteratorHelperPrototype%": { + "[[Proto]]": "%AsyncIteratorPrototype%", + next: o, + return: o, + "@@toStringTag": "string" + }, + "%InertGeneratorFunction%": { + // Properties of the GeneratorFunction Constructor + "[[Proto]]": "%InertFunction%", + prototype: "%Generator%" + }, + "%Generator%": { + // Properties of the GeneratorFunction Prototype Object + "[[Proto]]": "%FunctionPrototype%", + constructor: "%InertGeneratorFunction%", + prototype: "%GeneratorPrototype%", + "@@toStringTag": "string" + }, + "%InertAsyncGeneratorFunction%": { + // Properties of the AsyncGeneratorFunction Constructor + "[[Proto]]": "%InertFunction%", + prototype: "%AsyncGenerator%" + }, + "%AsyncGenerator%": { + // Properties of the AsyncGeneratorFunction Prototype Object + "[[Proto]]": "%FunctionPrototype%", + constructor: "%InertAsyncGeneratorFunction%", + prototype: "%AsyncGeneratorPrototype%", + // length prop added here for React Native jsc-android + // https://github.com/endojs/endo/issues/660 + // https://github.com/react-native-community/jsc-android-buildscripts/issues/181 + length: "number", + "@@toStringTag": "string" + }, + "%GeneratorPrototype%": { + // Properties of the Generator Prototype Object + "[[Proto]]": "%IteratorPrototype%", + constructor: "%Generator%", + next: o, + return: o, + throw: o, + "@@toStringTag": "string" + }, + "%AsyncGeneratorPrototype%": { + // Properties of the AsyncGenerator Prototype Object + "[[Proto]]": "%AsyncIteratorPrototype%", + constructor: "%AsyncGenerator%", + next: o, + return: o, + throw: o, + "@@toStringTag": "string" + }, + // TODO: To be replaced with Promise.delegate + // + // The HandledPromise global variable shimmed by `@agoric/eventual-send/shim` + // implements an initial version of the eventual send specification at: + // https://github.com/tc39/proposal-eventual-send + // + // We will likely change this to add a property to Promise called + // Promise.delegate and put static methods on it, which will necessitate + // another whitelist change to update to the current proposed standard. + HandledPromise: { + "[[Proto]]": "Promise", + applyFunction: o, + applyFunctionSendOnly: o, + applyMethod: o, + applyMethodSendOnly: o, + get: o, + getSendOnly: o, + prototype: "%PromisePrototype%", + resolve: o + }, + Promise: { + // Properties of the Promise Constructor + "[[Proto]]": "%FunctionPrototype%", + all: o, + allSettled: o, + // To transition from `false` to `fn` once we also have `AggregateError` + // TODO https://github.com/Agoric/SES-shim/issues/550 + any: !1, + // ES2021 + prototype: "%PromisePrototype%", + race: o, + reject: o, + resolve: o, + // https://github.com/tc39/proposal-promise-with-resolvers + withResolvers: o, + "@@species": O + }, + "%PromisePrototype%": { + // Properties of the Promise Prototype Object + catch: o, + constructor: "Promise", + finally: o, + then: o, + "@@toStringTag": "string", + // Non-standard, used in node to prevent async_hooks from breaking + "UniqueSymbol(async_id_symbol)": Te, + "UniqueSymbol(trigger_async_id_symbol)": Te, + "UniqueSymbol(destroyed)": Te + }, + "%InertAsyncFunction%": { + // Properties of the AsyncFunction Constructor + "[[Proto]]": "%InertFunction%", + prototype: "%AsyncFunctionPrototype%" + }, + "%AsyncFunctionPrototype%": { + // Properties of the AsyncFunction Prototype Object + "[[Proto]]": "%FunctionPrototype%", + constructor: "%InertAsyncFunction%", + // length prop added here for React Native jsc-android + // https://github.com/endojs/endo/issues/660 + // https://github.com/react-native-community/jsc-android-buildscripts/issues/181 + length: "number", + "@@toStringTag": "string" + }, + // Reflection + Reflect: { + // The Reflect Object + // Not a function object. + apply: o, + construct: o, + defineProperty: o, + deleteProperty: o, + get: o, + getOwnPropertyDescriptor: o, + getPrototypeOf: o, + has: o, + isExtensible: o, + ownKeys: o, + preventExtensions: o, + set: o, + setPrototypeOf: o, + "@@toStringTag": "string" + }, + Proxy: { + // Properties of the Proxy Constructor + "[[Proto]]": "%FunctionPrototype%", + revocable: o + }, + // Appendix B + // Annex B: Additional Properties of the Global Object + escape: o, + unescape: o, + // Proposed + "%UniqueCompartment%": { + "[[Proto]]": "%FunctionPrototype%", + prototype: "%CompartmentPrototype%", + toString: o + }, + "%InertCompartment%": { + "[[Proto]]": "%FunctionPrototype%", + prototype: "%CompartmentPrototype%", + toString: o + }, + "%CompartmentPrototype%": { + constructor: "%InertCompartment%", + evaluate: o, + globalThis: O, + name: O, + import: On, + load: On, + importNow: o, + module: o, + "@@toStringTag": "string" + }, + lockdown: o, + harden: { ...o, isFake: "boolean" }, + "%InitialGetStackString%": o +}, ba = (t) => typeof t == "function"; +function wa(t, e, r) { + if (se(t, e)) { + const n = ue(t, e); + if (!n || !xr(n.value, r.value) || n.get !== r.get || n.set !== r.set || n.writable !== r.writable || n.enumerable !== r.enumerable || n.configurable !== r.configurable) + throw v(`Conflicting definitions of ${e}`); + } + L(t, e, r); +} +function xa(t, e) { + for (const [r, n] of te(e)) + wa(t, r, n); +} +function Ro(t, e) { + const r = { __proto__: null }; + for (const [n, a] of te(e)) + se(t, n) && (r[a] = t[n]); + return r; +} +const Mo = () => { + const t = H(null); + let e; + const r = (c) => { + xa(t, Ke(c)); + }; + y(r); + const n = () => { + for (const [c, u] of te(t)) { + if (!He(u) || !se(u, "prototype")) + continue; + const l = cr[c]; + if (typeof l != "object") + throw v(`Expected permit object at whitelist.${c}`); + const d = l.prototype; + if (!d) + throw v(`${c}.prototype property not whitelisted`); + if (typeof d != "string" || !se(cr, d)) + throw v(`Unrecognized ${c}.prototype whitelist entry`); + const f = u.prototype; + if (se(t, d)) { + if (t[d] !== f) + throw v(`Conflicting bindings of ${d}`); + continue; + } + t[d] = f; + } + }; + y(n); + const a = () => (y(t), e = new xt(Ge(ao(t), ba)), t); + y(a); + const s = (c) => { + if (!e) + throw v( + "isPseudoNative can only be called after finalIntrinsics" + ); + return Wt(e, c); + }; + y(s); + const i = { + addIntrinsics: r, + completePrototypes: n, + finalIntrinsics: a, + isPseudoNative: s + }; + return y(i), r(No), r(Ro(E, $o)), i; +}, Sa = (t) => { + const { addIntrinsics: e, finalIntrinsics: r } = Mo(); + return e(Ro(t, Oo)), r(); +}; +function Ea(t, e) { + let r = !1; + const n = (m, ...p) => (r || (console.groupCollapsed("Removing unpermitted intrinsics"), r = !0), console[m](...p)), a = ["undefined", "boolean", "number", "string", "symbol"], s = new Ie( + At ? de( + Ge( + te(cr["%SharedSymbol%"]), + ([m, p]) => p === "symbol" && typeof At[m] == "symbol" + ), + ([m]) => [At[m], `@@${m}`] + ) : [] + ); + function i(m, p) { + if (typeof p == "string") + return p; + const h = Le(s, p); + if (typeof p == "symbol") { + if (h) + return h; + { + const _ = Cs(p); + return _ !== void 0 ? `RegisteredSymbol(${_})` : `Unique${ie(p)}`; + } + } + throw v(`Unexpected property name type ${m} ${p}`); + } + function c(m, p, h) { + if (!He(p)) + throw v(`Object expected: ${m}, ${p}, ${h}`); + const _ = G(p); + if (!(_ === null && h === null)) { + if (h !== void 0 && typeof h != "string") + throw v(`Malformed whitelist permit ${m}.__proto__`); + if (_ !== t[h || "%ObjectPrototype%"]) + throw v(`Unexpected intrinsic ${m}.__proto__ at ${h}`); + } + } + function u(m, p, h, _) { + if (typeof _ == "object") + return f(m, p, _), !0; + if (_ === !1) + return !1; + if (typeof _ == "string") { + if (h === "prototype" || h === "constructor") { + if (se(t, _)) { + if (p !== t[_]) + throw v(`Does not match whitelist ${m}`); + return !0; + } + } else if (Pr(a, _)) { + if (typeof p !== _) + throw v( + `At ${m} expected ${_} not ${typeof p}` + ); + return !0; + } + } + throw v(`Unexpected whitelist permit ${_} at ${m}`); + } + function l(m, p, h, _) { + const w = ue(p, h); + if (!w) + throw v(`Property ${h} not found at ${m}`); + if (se(w, "value")) { + if (Rn(_)) + throw v(`Accessor expected at ${m}`); + return u(m, w.value, h, _); + } + if (!Rn(_)) + throw v(`Accessor not expected at ${m}`); + return u(`${m}`, w.get, h, _.get) && u(`${m}`, w.set, h, _.set); + } + function d(m, p, h) { + const _ = h === "__proto__" ? "--proto--" : h; + if (se(p, _)) + return p[_]; + if (typeof m == "function" && se(Hr, _)) + return Hr[_]; + } + function f(m, p, h) { + if (p == null) + return; + const _ = h["[[Proto]]"]; + c(m, p, _), typeof p == "function" && e(p); + for (const w of nt(p)) { + const I = i(m, w), N = `${m}.${I}`, T = d(p, h, I); + if (!T || !l(N, p, w, T)) { + T !== !1 && n("warn", `Removing ${N}`); + try { + delete p[w]; + } catch (D) { + if (w in p) { + if (typeof p == "function" && w === "prototype" && (p.prototype = void 0, p.prototype === void 0)) { + n( + "warn", + `Tolerating undeletable ${N} === undefined` + ); + continue; + } + n("error", `failed to delete ${N}`, D); + } else + n("error", `deleting ${N} threw`, D); + throw D; + } + } + } + } + try { + f("intrinsics", t, cr); + } finally { + r && console.groupEnd(); + } +} +function Pa() { + try { + ye.prototype.constructor("return 1"); + } catch { + return y({}); + } + const t = {}; + function e(r, n, a) { + let s; + try { + s = (0, eval)(a); + } catch (u) { + if (u instanceof Gt) + return; + throw u; + } + const i = G(s), c = function() { + throw v( + "Function.prototype.constructor is not a valid constructor." + ); + }; + F(c, { + prototype: { value: i }, + name: { + value: r, + writable: !1, + enumerable: !1, + configurable: !0 + } + }), F(i, { + constructor: { value: c } + }), c !== ye.prototype.constructor && so(c, ye.prototype.constructor), t[n] = c; + } + return e("Function", "%InertFunction%", "(function(){})"), e( + "GeneratorFunction", + "%InertGeneratorFunction%", + "(function*(){})" + ), e( + "AsyncFunction", + "%InertAsyncFunction%", + "(async function(){})" + ), e( + "AsyncGeneratorFunction", + "%InertAsyncGeneratorFunction%", + "(async function*(){})" + ), t; +} +function ka(t = "safe") { + if (t !== "safe" && t !== "unsafe") + throw v(`unrecognized dateTaming ${t}`); + const e = ws, r = e.prototype, n = { + /** + * `%SharedDate%.now()` throw a `TypeError` starting with "secure mode". + * See https://github.com/endojs/endo/issues/910#issuecomment-1581855420 + */ + now() { + throw v("secure mode Calling %SharedDate%.now() throws"); + } + }, a = ({ powers: c = "none" } = {}) => { + let u; + return c === "original" ? u = function(...d) { + return new.target === void 0 ? oe(e, void 0, d) : sr(e, d, new.target); + } : u = function(...d) { + if (new.target === void 0) + throw v( + "secure mode Calling %SharedDate% constructor as a function throws" + ); + if (d.length === 0) + throw v( + "secure mode Calling new %SharedDate%() with no arguments throws" + ); + return sr(e, d, new.target); + }, F(u, { + length: { value: 7 }, + prototype: { + value: r, + writable: !1, + enumerable: !1, + configurable: !1 + }, + parse: { + value: e.parse, + writable: !0, + enumerable: !1, + configurable: !0 + }, + UTC: { + value: e.UTC, + writable: !0, + enumerable: !1, + configurable: !0 + } + }), u; + }, s = a({ powers: "original" }), i = a({ powers: "none" }); + return F(s, { + now: { + value: e.now, + writable: !0, + enumerable: !1, + configurable: !0 + } + }), F(i, { + now: { + value: n.now, + writable: !0, + enumerable: !1, + configurable: !0 + } + }), F(r, { + constructor: { value: i } + }), { + "%InitialDate%": s, + "%SharedDate%": i + }; +} +function Ta(t = "safe") { + if (t !== "safe" && t !== "unsafe") + throw v(`unrecognized mathTaming ${t}`); + const e = Es, r = e, { random: n, ...a } = Ke(e), i = H(oo, { + ...a, + random: { + value: { + /** + * `%SharedMath%.random()` throws a TypeError starting with "secure mode". + * See https://github.com/endojs/endo/issues/910#issuecomment-1581855420 + */ + random() { + throw v("secure mode %SharedMath%.random() throws"); + } + }.random, + writable: !0, + enumerable: !1, + configurable: !0 + } + }); + return { + "%InitialMath%": r, + "%SharedMath%": i + }; +} +function Ia(t = "safe") { + if (t !== "safe" && t !== "unsafe") + throw v(`unrecognized regExpTaming ${t}`); + const e = ze.prototype, r = (s = {}) => { + const i = function(...l) { + return new.target === void 0 ? ze(...l) : sr(ze, l, new.target); + }, c = ue(ze, Pn); + if (!c) + throw v("no RegExp[Symbol.species] descriptor"); + return F(i, { + length: { value: 2 }, + prototype: { + value: e, + writable: !1, + enumerable: !1, + configurable: !1 + }, + [Pn]: c + }), i; + }, n = r(), a = r(); + return t !== "unsafe" && delete e.compile, F(e, { + constructor: { value: a } + }), { + "%InitialRegExp%": n, + "%SharedRegExp%": a + }; +} +const Aa = { + "%ObjectPrototype%": { + toString: !0 + }, + "%FunctionPrototype%": { + toString: !0 + // set by "rollup" + }, + "%ErrorPrototype%": { + name: !0 + // set by "precond", "ava", "node-fetch" + }, + "%IteratorPrototype%": { + toString: !0, + // https://github.com/tc39/proposal-iterator-helpers + constructor: !0, + // https://github.com/tc39/proposal-iterator-helpers + [Be]: !0 + } +}, Lo = { + "%ObjectPrototype%": { + toString: !0, + valueOf: !0 + }, + "%ArrayPrototype%": { + toString: !0, + push: !0, + // set by "Google Analytics" + concat: !0, + // set by mobx generated code (old TS compiler?) + [Ht]: !0 + // set by mobx generated code (old TS compiler?) + }, + // Function.prototype has no 'prototype' property to enable. + // Function instances have their own 'name' and 'length' properties + // which are configurable and non-writable. Thus, they are already + // non-assignable anyway. + "%FunctionPrototype%": { + constructor: !0, + // set by "regenerator-runtime" + bind: !0, + // set by "underscore", "express" + toString: !0 + // set by "rollup" + }, + "%ErrorPrototype%": { + constructor: !0, + // set by "fast-json-patch", "node-fetch" + message: !0, + name: !0, + // set by "precond", "ava", "node-fetch", "node 14" + toString: !0 + // set by "bluebird" + }, + "%TypeErrorPrototype%": { + constructor: !0, + // set by "readable-stream" + message: !0, + // set by "tape" + name: !0 + // set by "readable-stream", "node 14" + }, + "%SyntaxErrorPrototype%": { + message: !0, + // to match TypeErrorPrototype.message + name: !0 + // set by "node 14" + }, + "%RangeErrorPrototype%": { + message: !0, + // to match TypeErrorPrototype.message + name: !0 + // set by "node 14" + }, + "%URIErrorPrototype%": { + message: !0, + // to match TypeErrorPrototype.message + name: !0 + // set by "node 14" + }, + "%EvalErrorPrototype%": { + message: !0, + // to match TypeErrorPrototype.message + name: !0 + // set by "node 14" + }, + "%ReferenceErrorPrototype%": { + message: !0, + // to match TypeErrorPrototype.message + name: !0 + // set by "node 14" + }, + "%PromisePrototype%": { + constructor: !0 + // set by "core-js" + }, + "%TypedArrayPrototype%": "*", + // set by https://github.com/feross/buffer + "%Generator%": { + constructor: !0, + name: !0, + toString: !0 + }, + "%IteratorPrototype%": { + toString: !0, + // https://github.com/tc39/proposal-iterator-helpers + constructor: !0, + // https://github.com/tc39/proposal-iterator-helpers + [Be]: !0 + } +}, Ca = { + ...Lo, + /** + * Rollup (as used at least by vega) and webpack + * (as used at least by regenerator) both turn exports into assignments + * to a big `exports` object that inherits directly from + * `Object.prototype`. Some of the exported names we've seen include + * `hasOwnProperty`, `constructor`, and `toString`. But the strategy used + * by rollup and webpack potentionally turns any exported name + * into an assignment rejected by the override mistake. That's why + * the `severe` enablements takes the extreme step of enabling + * everything on `Object.prototype`. + * + * In addition, code doing inheritance manually will often override + * the `constructor` property on the new prototype by assignment. We've + * seen this several times. + * + * The cost of enabling all these is that they create a miserable debugging + * experience specifically on Node. + * https://github.com/Agoric/agoric-sdk/issues/2324 + * explains how it confused the Node console. + * + * (TODO Reexamine the vscode situation. I think it may have improved + * since the following paragraph was written.) + * + * The vscode debugger's object inspector shows the own data properties of + * an object, which is typically what you want, but also shows both getter + * and setter for every accessor property whether inherited or own. + * With the `'*'` setting here, all the properties inherited from + * `Object.prototype` are accessors, creating an unusable display as seen + * at As explained at + * https://github.com/endojs/endo/blob/master/packages/ses/docs/lockdown.md#overridetaming-options + * Open the triangles at the bottom of that section. + */ + "%ObjectPrototype%": "*", + /** + * The widely used Buffer defined at https://github.com/feross/buffer + * on initialization, manually creates the equivalent of a subclass of + * `TypedArray`, which it then initializes by assignment. These assignments + * include enough of the `TypeArray` methods that here, the `severe` + * enablements just enable them all. + */ + "%TypedArrayPrototype%": "*", + /** + * Needed to work with Immer before https://github.com/immerjs/immer/pull/914 + * is accepted. + */ + "%MapPrototype%": "*", + /** + * Needed to work with Immer before https://github.com/immerjs/immer/pull/914 + * is accepted. + */ + "%SetPrototype%": "*" +}; +function Na(t, e, r = []) { + const n = new wt(r); + function a(l, d, f, m) { + if ("value" in m && m.configurable) { + const { value: p } = m, h = sn(n, f), { get: _, set: w } = ue( + { + get [f]() { + return p; + }, + set [f](I) { + if (d === this) + throw v( + `Cannot assign to read only property '${ie( + f + )}' of '${l}'` + ); + se(this, f) ? this[f] = I : (h && console.error(v(`Override property ${f}`)), L(this, f, { + value: I, + writable: !0, + enumerable: !0, + configurable: !0 + })); + } + }, + f + ); + L(_, "originalValue", { + value: p, + writable: !1, + enumerable: !1, + configurable: !1 + }), L(d, f, { + get: _, + set: w, + enumerable: m.enumerable, + configurable: m.configurable + }); + } + } + function s(l, d, f) { + const m = ue(d, f); + m && a(l, d, f, m); + } + function i(l, d) { + const f = Ke(d); + f && tt(nt(f), (m) => a(l, d, m, f[m])); + } + function c(l, d, f) { + for (const m of nt(f)) { + const p = ue(d, m); + if (!p || p.get || p.set) + continue; + const h = `${l}.${ie(m)}`, _ = f[m]; + if (_ === !0) + s(h, d, m); + else if (_ === "*") + i(h, p.value); + else if (He(_)) + c(h, p.value, _); + else + throw v(`Unexpected override enablement plan ${h}`); + } + } + let u; + switch (e) { + case "min": { + u = Aa; + break; + } + case "moderate": { + u = Lo; + break; + } + case "severe": { + u = Ca; + break; + } + default: + throw v(`unrecognized overrideTaming ${e}`); + } + c("root", t, u); +} +const { Fail: Vr, quote: lr } = Z, $a = /^(\w*[a-z])Locale([A-Z]\w*)$/, Fo = { + // See https://tc39.es/ecma262/#sec-string.prototype.localecompare + localeCompare(t) { + if (this === null || this === void 0) + throw v( + 'Cannot localeCompare with null or undefined "this" value' + ); + const e = `${this}`, r = `${t}`; + return e < r ? -1 : e > r ? 1 : (e === r || Vr`expected ${lr(e)} and ${lr(r)} to compare`, 0); + }, + toString() { + return `${this}`; + } +}, Oa = Fo.localeCompare, Ra = Fo.toString; +function Ma(t, e = "safe") { + if (e !== "safe" && e !== "unsafe") + throw v(`unrecognized localeTaming ${e}`); + if (e !== "unsafe") { + L(ie.prototype, "localeCompare", { + value: Oa + }); + for (const r of Nt(t)) { + const n = t[r]; + if (He(n)) + for (const a of Nt(n)) { + const s = cn($a, a); + if (s) { + typeof n[a] == "function" || Vr`expected ${lr(a)} to be a function`; + const i = `${s[1]}${s[2]}`, c = n[i]; + typeof c == "function" || Vr`function ${lr(i)} not found`, L(n, a, { value: c }); + } + } + } + L(ro.prototype, "toLocaleString", { + value: Ra + }); + } +} +const La = (t) => ({ + eval(r) { + return typeof r != "string" ? r : t(r); + } +}).eval, { Fail: Ln } = Z, Fa = (t) => { + const e = function(n) { + const a = `${jr(arguments) || ""}`, s = `${Pt(arguments, ",")}`; + new ye(s, ""), new ye(a); + const i = `(function anonymous(${s} +) { +${a} +})`; + return t(i); + }; + return F(e, { + // Ensure that any function created in any evaluator in a realm is an + // instance of Function in any evaluator of the same realm. + prototype: { + value: ye.prototype, + writable: !1, + enumerable: !1, + configurable: !1 + } + }), G(ye) === ye.prototype || Ln`Function prototype is the same accross compartments`, G(e) === ye.prototype || Ln`Function constructor prototype is the same accross compartments`, e; +}, Da = (t) => { + L( + t, + As, + y( + wr(H(null), { + set: y(() => { + throw v( + "Cannot set Symbol.unscopables of a Compartment's globalThis" + ); + }), + enumerable: !1, + configurable: !1 + }) + ) + ); +}, Do = (t) => { + for (const [e, r] of te(No)) + L(t, e, { + value: r, + writable: !1, + enumerable: !1, + configurable: !1 + }); +}, jo = (t, { + intrinsics: e, + newGlobalPropertyNames: r, + makeCompartmentConstructor: n, + markVirtualizedNativeFunction: a +}) => { + for (const [i, c] of te($o)) + se(e, c) && L(t, i, { + value: e[c], + writable: !0, + enumerable: !1, + configurable: !0 + }); + for (const [i, c] of te(r)) + se(e, c) && L(t, i, { + value: e[c], + writable: !0, + enumerable: !1, + configurable: !0 + }); + const s = { + globalThis: t + }; + s.Compartment = y( + n( + n, + e, + a + ) + ); + for (const [i, c] of te(s)) + L(t, i, { + value: c, + writable: !0, + enumerable: !1, + configurable: !0 + }), typeof c == "function" && a(c); +}, Wr = (t, e, r) => { + { + const n = y(La(e)); + r(n), L(t, "eval", { + value: n, + writable: !0, + enumerable: !1, + configurable: !0 + }); + } + { + const n = y(Fa(e)); + r(n), L(t, "Function", { + value: n, + writable: !0, + enumerable: !1, + configurable: !0 + }); + } +}, { Fail: ja, quote: Uo } = Z, Zo = new br( + fn, + y({ + get(t, e) { + ja`Please report unexpected scope handler trap: ${Uo(ie(e))}`; + } + }) +), Ua = { + get(t, e) { + }, + set(t, e, r) { + throw et(`${ie(e)} is not defined`); + }, + has(t, e) { + return e in E; + }, + // note: this is likely a bug of safari + // https://bugs.webkit.org/show_bug.cgi?id=195534 + getPrototypeOf(t) { + return null; + }, + // See https://github.com/endojs/endo/issues/1510 + // TODO: report as bug to v8 or Chrome, and record issue link here. + getOwnPropertyDescriptor(t, e) { + const r = Uo(ie(e)); + console.warn( + `getOwnPropertyDescriptor trap on scopeTerminatorHandler for ${r}`, + v().stack + ); + }, + // See https://github.com/endojs/endo/issues/1490 + // TODO Report bug to JSC or Safari + ownKeys(t) { + return []; + } +}, zo = y( + H( + Zo, + Ke(Ua) + ) +), Za = new br( + fn, + zo +), Bo = (t) => { + const e = { + // inherit scopeTerminator behavior + ...zo, + // Redirect set properties to the globalObject. + set(a, s, i) { + return uo(t, s, i); + }, + // Always claim to have a potential property in order to be the recipient of a set + has(a, s) { + return !0; + } + }, r = y( + H( + Zo, + Ke(e) + ) + ); + return new br( + fn, + r + ); +}; +y(Bo); +const { Fail: za } = Z, Ba = () => { + const t = H(null), e = y({ + eval: { + get() { + return delete t.eval, vo; + }, + enumerable: !1, + configurable: !0 + } + }), r = { + evalScope: t, + allowNextEvalToBeUnsafe() { + const { revoked: n } = r; + n !== null && za`a handler did not reset allowNextEvalToBeUnsafe ${n.err}`, F(t, e); + }, + /** @type {null | { err: any }} */ + revoked: null + }; + return r; +}, Fn = "\\s*[@#]\\s*([a-zA-Z][a-zA-Z0-9]*)\\s*=\\s*([^\\s\\*]*)", Ga = new ze( + `(?:\\s*//${Fn}|/\\*${Fn}\\s*\\*/)\\s*$` +), hn = (t) => { + let e = ""; + for (; t.length > 0; ) { + const r = cn(Ga, t); + if (r === null) + break; + t = ln(t, 0, t.length - r[0].length), r[3] === "sourceURL" ? e = r[4] : r[1] === "sourceURL" && (e = r[2]); + } + return e; +}; +function gn(t, e) { + const r = qs(t, e); + if (r < 0) + return -1; + const n = t[r] === ` +` ? 1 : 0; + return go(ln(t, 0, r), ` +`).length + n; +} +const Go = new ze("(?:)", "g"), Ho = (t) => { + const e = gn(t, Go); + if (e < 0) + return t; + const r = hn(t); + throw Gt( + `Possible HTML comment rejected at ${r}:${e}. (SES_HTML_COMMENT_REJECTED)` + ); +}, Vo = (t) => ar(t, Go, (r) => r[0] === "<" ? "< ! --" : "-- >"), Wo = new ze( + "(^|[^.]|\\.\\.\\.)\\bimport(\\s*(?:\\(|/[/*]))", + "g" +), qo = (t) => { + const e = gn(t, Wo); + if (e < 0) + return t; + const r = hn(t); + throw Gt( + `Possible import expression rejected at ${r}:${e}. (SES_IMPORT_REJECTED)` + ); +}, Ko = (t) => ar(t, Wo, (r, n, a) => `${n}__import__${a}`), Ha = new ze( + "(^|[^.])\\beval(\\s*\\()", + "g" +), Jo = (t) => { + const e = gn(t, Ha); + if (e < 0) + return t; + const r = hn(t); + throw Gt( + `Possible direct eval expression rejected at ${r}:${e}. (SES_EVAL_REJECTED)` + ); +}, Yo = (t) => (t = Ho(t), t = qo(t), t), Xo = (t, e) => { + for (const r of e) + t = r(t); + return t; +}; +y({ + rejectHtmlComments: y(Ho), + evadeHtmlCommentTest: y(Vo), + rejectImportExpressions: y(qo), + evadeImportExpressionTest: y(Ko), + rejectSomeDirectEvalExpressions: y(Jo), + mandatoryTransforms: y(Yo), + applyTransforms: y(Xo) +}); +const Va = [ + // 11.6.2.1 Keywords + "await", + "break", + "case", + "catch", + "class", + "const", + "continue", + "debugger", + "default", + "delete", + "do", + "else", + "export", + "extends", + "finally", + "for", + "function", + "if", + "import", + "in", + "instanceof", + "new", + "return", + "super", + "switch", + "this", + "throw", + "try", + "typeof", + "var", + "void", + "while", + "with", + "yield", + // Also reserved when parsing strict mode code + "let", + "static", + // 11.6.2.2 Future Reserved Words + "enum", + // Also reserved when parsing strict mode code + "implements", + "package", + "protected", + "interface", + "private", + "public", + // Reserved but not mentioned in specs + "await", + "null", + "true", + "false", + "this", + "arguments" +], Wa = /^[a-zA-Z_$][\w$]*$/, Dn = (t) => t !== "eval" && !Pr(Va, t) && an(Wa, t); +function jn(t, e) { + const r = ue(t, e); + return r && // + // The getters will not have .writable, don't let the falsyness of + // 'undefined' trick us: test with === false, not ! . However descriptors + // inherit from the (potentially poisoned) global object, so we might see + // extra properties which weren't really there. Accessor properties have + // 'get/set/enumerable/configurable', while data properties have + // 'value/writable/enumerable/configurable'. + r.configurable === !1 && r.writable === !1 && // + // Checks for data properties because they're the only ones we can + // optimize (accessors are most likely non-constant). Descriptors can't + // can't have accessors and value properties at the same time, therefore + // this check is sufficient. Using explicit own property deal with the + // case where Object.prototype has been poisoned. + se(r, "value"); +} +const qa = (t, e = {}) => { + const r = Nt(t), n = Nt(e), a = Ge( + n, + (i) => Dn(i) && jn(e, i) + ); + return { + globalObjectConstants: Ge( + r, + (i) => ( + // Can't define a constant: it would prevent a + // lookup on the endowments. + !Pr(n, i) && Dn(i) && jn(t, i) + ) + ), + moduleLexicalConstants: a + }; +}; +function Un(t, e) { + return t.length === 0 ? "" : `const {${Pt(t, ",")}} = this.${e};`; +} +const Ka = (t) => { + const { globalObjectConstants: e, moduleLexicalConstants: r } = qa( + t.globalObject, + t.moduleLexicals + ), n = Un( + e, + "globalObject" + ), a = Un( + r, + "moduleLexicals" + ), s = ye(` + with (this.scopeTerminator) { + with (this.globalObject) { + with (this.moduleLexicals) { + with (this.evalScope) { + ${n} + ${a} + return function() { + 'use strict'; + return eval(arguments[0]); + }; + } + } + } + } + `); + return oe(s, t, []); +}, { Fail: Ja } = Z, yn = ({ + globalObject: t, + moduleLexicals: e = {}, + globalTransforms: r = [], + sloppyGlobalsMode: n = !1 +}) => { + const a = n ? Bo(t) : Za, s = Ba(), { evalScope: i } = s, c = y({ + evalScope: i, + moduleLexicals: e, + globalObject: t, + scopeTerminator: a + }); + let u; + const l = () => { + u || (u = Ka(c)); + }; + return { safeEvaluate: (f, m) => { + const { localTransforms: p = [] } = m || {}; + l(), f = Xo(f, [ + ...p, + ...r, + Yo + ]); + let h; + try { + return s.allowNextEvalToBeUnsafe(), oe(u, t, [f]); + } catch (_) { + throw h = _, _; + } finally { + const _ = "eval" in i; + delete i.eval, _ && (s.revoked = { err: h }, Ja`handler did not reset allowNextEvalToBeUnsafe ${h}`); + } + } }; +}, Ya = ") { [native code] }"; +let Rr; +const Qo = () => { + if (Rr === void 0) { + const t = new xt(); + L(on, "toString", { + value: { + toString() { + const r = Ys(this); + return ho(r, Ya) || !Wt(t, this) ? r : `function ${this.name}() { [native code] }`; + } + }.toString + }), Rr = y( + (r) => Ir(t, r) + ); + } + return Rr; +}; +function Xa(t = "safe") { + if (t !== "safe" && t !== "unsafe") + throw v(`unrecognized domainTaming ${t}`); + if (t === "unsafe") + return; + const e = E.process || void 0; + if (typeof e == "object") { + const r = ue(e, "domain"); + if (r !== void 0 && r.get !== void 0) + throw v( + "SES failed to lockdown, Node.js domains have been initialized (SES_NO_DOMAINS)" + ); + L(e, "domain", { + value: null, + configurable: !1, + writable: !1, + enumerable: !1 + }); + } +} +const es = y([ + ["debug", "debug"], + // (fmt?, ...args) verbose level on Chrome + ["log", "log"], + // (fmt?, ...args) info level on Chrome + ["info", "info"], + // (fmt?, ...args) + ["warn", "warn"], + // (fmt?, ...args) + ["error", "error"], + // (fmt?, ...args) + ["trace", "log"], + // (fmt?, ...args) + ["dirxml", "log"], + // (fmt?, ...args) + ["group", "log"], + // (fmt?, ...args) + ["groupCollapsed", "log"] + // (fmt?, ...args) +]), ts = y([ + ["assert", "error"], + // (value, fmt?, ...args) + ["timeLog", "log"], + // (label?, ...args) no fmt string + // Insensitive to whether any argument is an error. All arguments can pass + // thru to baseConsole as is. + ["clear", void 0], + // () + ["count", "info"], + // (label?) + ["countReset", void 0], + // (label?) + ["dir", "log"], + // (item, options?) + ["groupEnd", "log"], + // () + // In theory tabular data may be or contain an error. However, we currently + // do not detect these and may never. + ["table", "log"], + // (tabularData, properties?) + ["time", "info"], + // (label?) + ["timeEnd", "info"], + // (label?) + // Node Inspector only, MDN, and TypeScript, but not whatwg + ["profile", void 0], + // (label?) + ["profileEnd", void 0], + // (label?) + ["timeStamp", void 0] + // (label?) +]), rs = y([ + ...es, + ...ts +]), Qa = (t, { shouldResetForDebugging: e = !1 } = {}) => { + e && t.resetErrorTagNum(); + let r = []; + const n = St( + de(rs, ([i, c]) => { + const u = (...l) => { + ae(r, [i, ...l]); + }; + return L(u, "name", { value: i }), [i, y(u)]; + }) + ); + y(n); + const a = () => { + const i = y(r); + return r = [], i; + }; + return y(a), y({ loggingConsole: ( + /** @type {VirtualConsole} */ + n + ), takeLog: a }); +}; +y(Qa); +const Tt = { + NOTE: "ERROR_NOTE:", + MESSAGE: "ERROR_MESSAGE:" +}; +y(Tt); +const ns = (t, e) => { + if (!t) + return; + const { getStackString: r, tagError: n, takeMessageLogArgs: a, takeNoteLogArgsArray: s } = e, i = (w, I) => de(w, (T) => pn(T) ? (ae(I, T), `(${n(T)})`) : T), c = (w, I, N, T, D) => { + const U = n(I), q = N === Tt.MESSAGE ? `${U}:` : `${U} ${N}`, K = i(T, D); + t[w](q, ...K); + }, u = (w, I, N = void 0) => { + if (I.length === 0) + return; + if (I.length === 1 && N === void 0) { + f(w, I[0]); + return; + } + let T; + I.length === 1 ? T = "Nested error" : T = `Nested ${I.length} errors`, N !== void 0 && (T = `${T} under ${N}`), t.group(T); + try { + for (const D of I) + f(w, D); + } finally { + t.groupEnd(); + } + }, l = new xt(), d = (w) => (I, N) => { + const T = []; + c(w, I, Tt.NOTE, N, T), u(w, T, n(I)); + }, f = (w, I) => { + if (Wt(l, I)) + return; + const N = n(I); + Ir(l, I); + const T = [], D = a(I), U = s( + I, + d(w) + ); + D === void 0 ? t[w](`${N}:`, I.message) : c( + w, + I, + Tt.MESSAGE, + D, + T + ); + let q = r(I); + typeof q == "string" && q.length >= 1 && !ho(q, ` +`) && (q += ` +`), t[w](q); + for (const K of U) + c(w, I, Tt.NOTE, K, T); + u(w, T, N); + }, m = de(es, ([w, I]) => { + const N = (...T) => { + const D = [], U = i(T, D); + t[w](...U), u(w, D); + }; + return L(N, "name", { value: w }), [w, y(N)]; + }), p = Ge( + ts, + ([w, I]) => w in t + ), h = de(p, ([w, I]) => { + const N = (...T) => { + t[w](...T); + }; + return L(N, "name", { value: w }), [w, y(N)]; + }), _ = St([...m, ...h]); + return ( + /** @type {VirtualConsole} */ + y(_) + ); +}; +y(ns); +const ei = (t, e, r = void 0) => { + const n = Ge( + rs, + ([i, c]) => i in t + ), a = de(n, ([i, c]) => [i, y((...l) => { + (c === void 0 || e.canLog(c)) && t[i](...l); + })]), s = St(a); + return ( + /** @type {VirtualConsole} */ + y(s) + ); +}; +y(ei); +const Zn = (t) => { + if (gt === void 0) + return; + let e = 0; + const r = new Ie(), n = (d) => { + Zs(r, d); + }, a = new Pe(), s = (d) => { + if (kr(r, d)) { + const f = Le(r, d); + n(d), t(f); + } + }, i = new gt(s); + return { + rejectionHandledHandler: (d) => { + const f = M(a, d); + n(f); + }, + unhandledRejectionHandler: (d, f) => { + e += 1; + const m = e; + Ae(r, m, d), ee(a, f, m), Qs(i, f, m, f); + }, + processTerminationHandler: () => { + for (const [d, f] of zs(r)) + n(d), t(f); + } + }; +}, Mr = (t) => { + throw v(t); +}, zn = (t, e) => y((...r) => oe(t, e, r)), ti = (t = "safe", e = "platform", r = "report", n = void 0) => { + t === "safe" || t === "unsafe" || Mr(`unrecognized consoleTaming ${t}`); + let a; + n === void 0 ? a = Gr : a = { + ...Gr, + getStackString: n + }; + const s = ( + /** @type {VirtualConsole} */ + // eslint-disable-next-line no-nested-ternary + typeof E.console < "u" ? E.console : typeof E.print == "function" ? ( + // Make a good-enough console for eshost (including only functions that + // log at a specific level with no special argument interpretation). + // https://console.spec.whatwg.org/#logging + ((l) => y({ debug: l, log: l, info: l, warn: l, error: l }))( + // eslint-disable-next-line no-undef + zn(E.print) + ) + ) : void 0 + ); + if (s && s.log) + for (const l of ["warn", "error"]) + s[l] || L(s, l, { + value: zn(s.log, s) + }); + const i = ( + /** @type {VirtualConsole} */ + t === "unsafe" ? s : ns(s, a) + ), c = E.process || void 0; + if (e !== "none" && typeof c == "object" && typeof c.on == "function") { + let l; + if (e === "platform" || e === "exit") { + const { exit: d } = c; + typeof d == "function" || Mr("missing process.exit"), l = () => d(c.exitCode || -1); + } else + e === "abort" && (l = c.abort, typeof l == "function" || Mr("missing process.abort")); + c.on("uncaughtException", (d) => { + i.error(d), l && l(); + }); + } + if (r !== "none" && typeof c == "object" && typeof c.on == "function") { + const d = Zn((f) => { + i.error("SES_UNHANDLED_REJECTION:", f); + }); + d && (c.on("unhandledRejection", d.unhandledRejectionHandler), c.on("rejectionHandled", d.rejectionHandledHandler), c.on("exit", d.processTerminationHandler)); + } + const u = E.window || void 0; + if (e !== "none" && typeof u == "object" && typeof u.addEventListener == "function" && u.addEventListener("error", (l) => { + l.preventDefault(), i.error(l.error), (e === "exit" || e === "abort") && (u.location.href = "about:blank"); + }), r !== "none" && typeof u == "object" && typeof u.addEventListener == "function") { + const d = Zn((f) => { + i.error("SES_UNHANDLED_REJECTION:", f); + }); + d && (u.addEventListener("unhandledrejection", (f) => { + f.preventDefault(), d.unhandledRejectionHandler(f.reason, f.promise); + }), u.addEventListener("rejectionhandled", (f) => { + f.preventDefault(), d.rejectionHandledHandler(f.promise); + }), u.addEventListener("beforeunload", (f) => { + d.processTerminationHandler(); + })); + } + return { console: i }; +}, ri = [ + // suppress 'getThis' definitely + "getTypeName", + // suppress 'getFunction' definitely + "getFunctionName", + "getMethodName", + "getFileName", + "getLineNumber", + "getColumnNumber", + "getEvalOrigin", + "isToplevel", + "isEval", + "isNative", + "isConstructor", + "isAsync", + // suppress 'isPromiseAll' for now + // suppress 'getPromiseIndex' for now + // Additional names found by experiment, absent from + // https://v8.dev/docs/stack-trace-api + "getPosition", + "getScriptNameOrSourceURL", + "toString" + // TODO replace to use only whitelisted info +], ni = (t) => { + const r = St(de(ri, (n) => { + const a = t[n]; + return [n, () => oe(a, t, [])]; + })); + return H(r, {}); +}, oi = (t) => de(t, ni), si = /\/node_modules\//, ai = /^(?:node:)?internal\//, ii = /\/packages\/ses\/src\/error\/assert.js$/, ci = /\/packages\/eventual-send\/src\//, li = [ + si, + ai, + ii, + ci +], ui = (t) => { + if (!t) + return !0; + for (const e of li) + if (an(e, t)) + return !1; + return !0; +}, di = /^((?:.*[( ])?)[:/\w_-]*\/\.\.\.\/(.+)$/, fi = /^((?:.*[( ])?)[:/\w_-]*\/(packages\/.+)$/, pi = [ + di, + fi +], mi = (t) => { + for (const e of pi) { + const r = cn(e, t); + if (r) + return Pt(Ds(r, 1), ""); + } + return t; +}, hi = (t, e, r, n) => { + const a = t.captureStackTrace, s = (p) => n === "verbose" ? !0 : ui(p.getFileName()), i = (p) => { + let h = `${p}`; + return n === "concise" && (h = mi(h)), ` + at ${h}`; + }, c = (p, h) => Pt( + de(Ge(h, s), i), + "" + ), u = new Pe(), l = { + // The optional `optFn` argument is for cutting off the bottom of + // the stack --- for capturing the stack only above the topmost + // call to that function. Since this isn't the "real" captureStackTrace + // but instead calls the real one, if no other cutoff is provided, + // we cut this one off. + captureStackTrace(p, h = l.captureStackTrace) { + if (typeof a == "function") { + oe(a, t, [p, h]); + return; + } + uo(p, "stack", ""); + }, + // Shim of proposed special power, to reside by default only + // in the start compartment, for getting the stack traceback + // string associated with an error. + // See https://tc39.es/proposal-error-stacks/ + getStackString(p) { + let h = M(u, p); + if (h === void 0 && (p.stack, h = M(u, p), h || (h = { stackString: "" }, ee(u, p, h))), h.stackString !== void 0) + return h.stackString; + const _ = c(p, h.callSites); + return ee(u, p, { stackString: _ }), _; + }, + prepareStackTrace(p, h) { + if (r === "unsafe") { + const _ = c(p, h); + return ee(u, p, { stackString: _ }), `${p}${_}`; + } else + return ee(u, p, { callSites: h }), ""; + } + }, d = l.prepareStackTrace; + t.prepareStackTrace = d; + const f = new xt([d]), m = (p) => { + if (Wt(f, p)) + return p; + const h = { + prepareStackTrace(_, w) { + return ee(u, _, { callSites: w }), p(_, oi(w)); + } + }; + return Ir(f, h.prepareStackTrace), h.prepareStackTrace; + }; + return F(e, { + captureStackTrace: { + value: l.captureStackTrace, + writable: !0, + enumerable: !1, + configurable: !0 + }, + prepareStackTrace: { + get() { + return t.prepareStackTrace; + }, + set(p) { + if (typeof p == "function") { + const h = m(p); + t.prepareStackTrace = h; + } else + t.prepareStackTrace = d; + }, + enumerable: !1, + configurable: !0 + } + }), l.getStackString; +}, Bn = ue(le.prototype, "stack"), Gn = Bn && Bn.get, gi = { + getStackString(t) { + return typeof Gn == "function" ? oe(Gn, t, []) : "stack" in t ? `${t.stack}` : ""; + } +}; +function yi(t = "safe", e = "concise") { + if (t !== "safe" && t !== "unsafe") + throw v(`unrecognized errorTaming ${t}`); + if (e !== "concise" && e !== "verbose") + throw v(`unrecognized stackFiltering ${e}`); + const r = le.prototype, n = typeof le.captureStackTrace == "function" ? "v8" : "unknown", { captureStackTrace: a } = le, s = (l = {}) => { + const d = function(...m) { + let p; + return new.target === void 0 ? p = oe(le, this, m) : p = sr(le, m, new.target), n === "v8" && oe(a, le, [p, d]), p; + }; + return F(d, { + length: { value: 1 }, + prototype: { + value: r, + writable: !1, + enumerable: !1, + configurable: !1 + } + }), d; + }, i = s({ powers: "original" }), c = s({ powers: "none" }); + F(r, { + constructor: { value: c } + }); + for (const l of va) + so(l, c); + F(i, { + stackTraceLimit: { + get() { + if (typeof le.stackTraceLimit == "number") + return le.stackTraceLimit; + }, + set(l) { + if (typeof l == "number" && typeof le.stackTraceLimit == "number") { + le.stackTraceLimit = l; + return; + } + }, + // WTF on v8 stackTraceLimit is enumerable + enumerable: !1, + configurable: !0 + } + }), F(c, { + stackTraceLimit: { + get() { + }, + set(l) { + }, + enumerable: !1, + configurable: !0 + } + }), n === "v8" && F(c, { + prepareStackTrace: { + get() { + return () => ""; + }, + set(l) { + }, + enumerable: !1, + configurable: !0 + }, + captureStackTrace: { + value: (l, d) => { + L(l, "stack", { + value: "" + }); + }, + writable: !1, + enumerable: !1, + configurable: !0 + } + }); + let u = gi.getStackString; + return n === "v8" ? u = hi( + le, + i, + t, + e + ) : t === "unsafe" ? F(r, { + stack: { + get() { + return u(this); + }, + set(l) { + F(this, { + stack: { + value: l, + writable: !0, + enumerable: !0, + configurable: !0 + } + }); + } + } + }) : F(r, { + stack: { + get() { + return `${this}`; + }, + set(l) { + F(this, { + stack: { + value: l, + writable: !0, + enumerable: !0, + configurable: !0 + } + }); + } + } + }), { + "%InitialGetStackString%": u, + "%InitialError%": i, + "%SharedError%": c + }; +} +const { Fail: vi, details: qr, quote: Re } = Z, os = () => { +}, _i = (t, e) => y({ + compartment: t, + specifier: e +}), bi = (t, e, r) => { + const n = H(null); + for (const a of t) { + const s = e(a, r); + n[a] = s; + } + return y(n); +}, Hn = (t, e, r, n, a, s, i, c, u) => { + const { resolveHook: l, moduleRecords: d } = M( + t, + r + ), f = bi( + a.imports, + l, + n + ), m = y({ + compartment: r, + staticModuleRecord: a, + moduleSpecifier: n, + resolvedImports: f, + importMeta: u + }); + for (const p of ao(f)) { + const h = ur( + t, + e, + r, + p, + s, + i, + c + ); + Tr( + s, + dn(h, os, (_) => { + ae(c, _); + }) + ); + } + return Ae(d, n, m), m; +}, wi = async (t, e, r, n, a, s, i) => { + const { importHook: c, moduleMap: u, moduleMapHook: l, moduleRecords: d } = M( + t, + r + ); + let f = u[n]; + if (f === void 0 && l !== void 0 && (f = l(n)), typeof f == "string") + Z.fail( + qr`Cannot map module ${Re(n)} to ${Re( + f + )} in parent compartment, not yet implemented`, + v + ); + else if (f !== void 0) { + const p = M(e, f); + p === void 0 && Z.fail( + qr`Cannot map module ${Re( + n + )} because the value is not a module exports namespace, or is from another realm`, + et + ); + const h = await ur( + t, + e, + p.compartment, + p.specifier, + a, + s, + i + ); + return Ae(d, n, h), h; + } + if (kr(d, n)) + return Le(d, n); + const m = await c(n); + if ((m === null || typeof m != "object") && vi`importHook must return a promise for an object, for module ${Re( + n + )} in compartment ${Re(r.name)}`, m.specifier !== void 0) { + if (m.record !== void 0) { + if (m.compartment !== void 0) + throw v( + "Cannot redirect to an explicit record with a specified compartment" + ); + const { + compartment: p = r, + specifier: h = n, + record: _, + importMeta: w + } = m, I = Hn( + t, + e, + p, + h, + _, + a, + s, + i, + w + ); + return Ae(d, n, I), I; + } + if (m.compartment !== void 0) { + if (m.importMeta !== void 0) + throw v( + "Cannot redirect to an implicit record with a specified importMeta" + ); + const p = await ur( + t, + e, + m.compartment, + m.specifier, + a, + s, + i + ); + return Ae(d, n, p), p; + } + throw v("Unnexpected RedirectStaticModuleInterface record shape"); + } + return Hn( + t, + e, + r, + n, + m, + a, + s, + i + ); +}, ur = async (t, e, r, n, a, s, i) => { + const { name: c } = M( + t, + r + ); + let u = Le(s, r); + u === void 0 && (u = new Ie(), Ae(s, r, u)); + let l = Le(u, n); + return l !== void 0 || (l = Xs( + wi( + t, + e, + r, + n, + a, + s, + i + ), + (d) => { + throw Z.note( + d, + qr`${d.message}, loading ${Re(n)} in compartment ${Re( + c + )}` + ), d; + } + ), Ae(u, n, l)), l; +}, Vn = async (t, e, r, n) => { + const { name: a } = M( + t, + r + ), s = new wt(), i = new Ie(), c = [], u = ur( + t, + e, + r, + n, + s, + i, + c + ); + Tr( + s, + dn(u, os, (l) => { + ae(c, l); + }) + ); + for (const l of s) + await l; + if (c.length > 0) + throw v( + `Failed to load module ${Re(n)} in package ${Re( + a + )} (${c.length} underlying failures: ${Pt( + de(c, (l) => l.message), + ", " + )}` + ); +}, { quote: dt } = Z, xi = () => { + let t = !1; + const e = H(null, { + // Make this appear like an ESM module namespace object. + [Be]: { + value: "Module", + writable: !1, + enumerable: !1, + configurable: !1 + } + }); + return y({ + activate() { + t = !0; + }, + exportsTarget: e, + exportsProxy: new br(e, { + get(r, n, a) { + if (!t) + throw v( + `Cannot get property ${dt( + n + )} of module exports namespace, the module has not yet begun to execute` + ); + return Os(e, n, a); + }, + set(r, n, a) { + throw v( + `Cannot set property ${dt(n)} of module exports namespace` + ); + }, + has(r, n) { + if (!t) + throw v( + `Cannot check property ${dt( + n + )}, the module has not yet begun to execute` + ); + return lo(e, n); + }, + deleteProperty(r, n) { + throw v( + `Cannot delete property ${dt(n)}s of module exports namespace` + ); + }, + ownKeys(r) { + if (!t) + throw v( + "Cannot enumerate keys, the module has not yet begun to execute" + ); + return nt(e); + }, + getOwnPropertyDescriptor(r, n) { + if (!t) + throw v( + `Cannot get own property descriptor ${dt( + n + )}, the module has not yet begun to execute` + ); + return Rs(e, n); + }, + preventExtensions(r) { + if (!t) + throw v( + "Cannot prevent extensions of module exports namespace, the module has not yet begun to execute" + ); + return Ls(e); + }, + isExtensible() { + if (!t) + throw v( + "Cannot check extensibility of module exports namespace, the module has not yet begun to execute" + ); + return Ms(e); + }, + getPrototypeOf(r) { + return null; + }, + setPrototypeOf(r, n) { + throw v("Cannot set prototype of module exports namespace"); + }, + defineProperty(r, n, a) { + throw v( + `Cannot define property ${dt(n)} of module exports namespace` + ); + }, + apply(r, n, a) { + throw v( + "Cannot call module exports namespace, it is not a function" + ); + }, + construct(r, n) { + throw v( + "Cannot construct module exports namespace, it is not a constructor" + ); + } + }) + }); +}, vn = (t, e, r, n) => { + const { deferredExports: a } = e; + if (!kr(a, n)) { + const s = xi(); + ee( + r, + s.exportsProxy, + _i(t, n) + ), Ae(a, n, s); + } + return Le(a, n); +}, Si = (t, e) => { + const { sloppyGlobalsMode: r = !1, __moduleShimLexicals__: n = void 0 } = e; + let a; + if (n === void 0 && !r) + ({ safeEvaluate: a } = t); + else { + let { globalTransforms: s } = t; + const { globalObject: i } = t; + let c; + n !== void 0 && (s = void 0, c = H( + null, + Ke(n) + )), { safeEvaluate: a } = yn({ + globalObject: i, + moduleLexicals: c, + globalTransforms: s, + sloppyGlobalsMode: r + }); + } + return { safeEvaluate: a }; +}, ss = (t, e, r) => { + if (typeof e != "string") + throw v("first argument of evaluate() must be a string"); + const { + transforms: n = [], + __evadeHtmlCommentTest__: a = !1, + __evadeImportExpressionTest__: s = !1, + __rejectSomeDirectEvalExpressions__: i = !0 + // Note default on + } = r, c = [...n]; + a === !0 && ae(c, Vo), s === !0 && ae(c, Ko), i === !0 && ae(c, Jo); + const { safeEvaluate: u } = Si( + t, + r + ); + return u(e, { + localTransforms: c + }); +}, { quote: Yt } = Z, Ei = (t, e, r, n, a, s) => { + const { exportsProxy: i, exportsTarget: c, activate: u } = vn( + r, + M(t, r), + n, + a + ), l = H(null); + if (e.exports) { + if (!mt(e.exports) || js(e.exports, (f) => typeof f != "string")) + throw v( + `SES third-party static module record "exports" property must be an array of strings for module ${a}` + ); + tt(e.exports, (f) => { + let m = c[f]; + const p = []; + L(c, f, { + get: () => m, + set: (w) => { + m = w; + for (const I of p) + I(w); + }, + enumerable: !0, + configurable: !1 + }), l[f] = (w) => { + ae(p, w), w(m); + }; + }), l["*"] = (f) => { + f(c); + }; + } + const d = { + activated: !1 + }; + return y({ + notifiers: l, + exportsProxy: i, + execute() { + if (lo(d, "errorFromExecute")) + throw d.errorFromExecute; + if (!d.activated) { + u(), d.activated = !0; + try { + e.execute( + c, + r, + s + ); + } catch (f) { + throw d.errorFromExecute = f, f; + } + } + } + }); +}, Pi = (t, e, r, n) => { + const { + compartment: a, + moduleSpecifier: s, + staticModuleRecord: i, + importMeta: c + } = r, { + reexports: u = [], + __syncModuleProgram__: l, + __fixedExportMap__: d = {}, + __liveExportMap__: f = {}, + __reexportMap__: m = {}, + __needsImportMeta__: p = !1, + __syncModuleFunctor__: h + } = i, _ = M(t, a), { __shimTransforms__: w, importMetaHook: I } = _, { exportsProxy: N, exportsTarget: T, activate: D } = vn( + a, + _, + e, + s + ), U = H(null), q = H(null), K = H(null), De = H(null), fe = H(null); + c && wr(fe, c), p && I && I(s, fe); + const je = H(null), Je = H(null); + tt(te(d), ([pe, [z]]) => { + let B = je[z]; + if (!B) { + let X, Q = !0, ce = []; + const J = () => { + if (Q) + throw et(`binding ${Yt(z)} not yet initialized`); + return X; + }, ve = y((_e) => { + if (!Q) + throw v( + `Internal: binding ${Yt(z)} already initialized` + ); + X = _e; + const En = ce; + ce = null, Q = !1; + for (const be of En || []) + be(_e); + return _e; + }); + B = { + get: J, + notify: (_e) => { + _e !== ve && (Q ? ae(ce || [], _e) : _e(X)); + } + }, je[z] = B, K[z] = ve; + } + U[pe] = { + get: B.get, + set: void 0, + enumerable: !0, + configurable: !1 + }, Je[pe] = B.notify; + }), tt( + te(f), + ([pe, [z, B]]) => { + let X = je[z]; + if (!X) { + let Q, ce = !0; + const J = [], ve = () => { + if (ce) + throw et( + `binding ${Yt(pe)} not yet initialized` + ); + return Q; + }, ct = y((be) => { + Q = be, ce = !1; + for (const $r of J) + $r(be); + }), _e = (be) => { + if (ce) + throw et(`binding ${Yt(z)} not yet initialized`); + Q = be; + for (const $r of J) + $r(be); + }; + X = { + get: ve, + notify: (be) => { + be !== ct && (ae(J, be), ce || be(Q)); + } + }, je[z] = X, B && L(q, z, { + get: ve, + set: _e, + enumerable: !0, + configurable: !1 + }), De[z] = ct; + } + U[pe] = { + get: X.get, + set: void 0, + enumerable: !0, + configurable: !1 + }, Je[pe] = X.notify; + } + ); + const Ue = (pe) => { + pe(T); + }; + Je["*"] = Ue; + function Kt(pe) { + const z = H(null); + z.default = !1; + for (const [B, X] of pe) { + const Q = Le(n, B); + Q.execute(); + const { notifiers: ce } = Q; + for (const [J, ve] of X) { + const ct = ce[J]; + if (!ct) + throw Gt( + `The requested module '${B}' does not provide an export named '${J}'` + ); + for (const _e of ve) + ct(_e); + } + if (Pr(u, B)) + for (const [J, ve] of te( + ce + )) + z[J] === void 0 ? z[J] = ve : z[J] = !1; + if (m[B]) + for (const [J, ve] of m[B]) + z[ve] = ce[J]; + } + for (const [B, X] of te(z)) + if (!Je[B] && X !== !1) { + Je[B] = X; + let Q; + X((J) => Q = J), U[B] = { + get() { + return Q; + }, + set: void 0, + enumerable: !0, + configurable: !1 + }; + } + tt( + mo(no(U)), + (B) => L(T, B, U[B]) + ), y(T), D(); + } + let kt; + h !== void 0 ? kt = h : kt = ss(_, l, { + globalObject: a.globalThis, + transforms: w, + __moduleShimLexicals__: q + }); + let xn = !1, Sn; + function _s() { + if (kt) { + const pe = kt; + kt = null; + try { + pe( + y({ + imports: y(Kt), + onceVar: y(K), + liveVar: y(De), + importMeta: fe + }) + ); + } catch (z) { + xn = !0, Sn = z; + } + } + if (xn) + throw Sn; + } + return y({ + notifiers: Je, + exportsProxy: N, + execute: _s + }); +}, { Fail: Qe, quote: W } = Z, as = (t, e, r, n) => { + const { name: a, moduleRecords: s } = M( + t, + r + ), i = Le(s, n); + if (i === void 0) + throw et( + `Missing link to module ${W(n)} from compartment ${W( + a + )}` + ); + return Ni(t, e, i); +}; +function ki(t) { + return typeof t.__syncModuleProgram__ == "string"; +} +function Ti(t, e) { + const { __fixedExportMap__: r, __liveExportMap__: n } = t; + He(r) || Qe`Property '__fixedExportMap__' of a precompiled module record must be an object, got ${W( + r + )}, for module ${W(e)}`, He(n) || Qe`Property '__liveExportMap__' of a precompiled module record must be an object, got ${W( + n + )}, for module ${W(e)}`; +} +function Ii(t) { + return typeof t.execute == "function"; +} +function Ai(t, e) { + const { exports: r } = t; + mt(r) || Qe`Property 'exports' of a third-party static module record must be an array, got ${W( + r + )}, for module ${W(e)}`; +} +function Ci(t, e) { + He(t) || Qe`Static module records must be of type object, got ${W( + t + )}, for module ${W(e)}`; + const { imports: r, exports: n, reexports: a = [] } = t; + mt(r) || Qe`Property 'imports' of a static module record must be an array, got ${W( + r + )}, for module ${W(e)}`, mt(n) || Qe`Property 'exports' of a precompiled module record must be an array, got ${W( + n + )}, for module ${W(e)}`, mt(a) || Qe`Property 'reexports' of a precompiled module record must be an array if present, got ${W( + a + )}, for module ${W(e)}`; +} +const Ni = (t, e, r) => { + const { compartment: n, moduleSpecifier: a, resolvedImports: s, staticModuleRecord: i } = r, { instances: c } = M(t, n); + if (kr(c, a)) + return Le(c, a); + Ci(i, a); + const u = new Ie(); + let l; + if (ki(i)) + Ti(i, a), l = Pi( + t, + e, + r, + u + ); + else if (Ii(i)) + Ai(i, a), l = Ei( + t, + i, + n, + e, + a, + s + ); + else + throw v( + `importHook must return a static module record, got ${W( + i + )}` + ); + Ae(c, a, l); + for (const [d, f] of te(s)) { + const m = as( + t, + e, + n, + f + ); + Ae(u, d, m); + } + return l; +}, { quote: Lr } = Z, Ct = new Pe(), Oe = new Pe(), Xt = (t) => { + const { importHook: e, resolveHook: r } = M(Oe, t); + if (typeof e != "function" || typeof r != "function") + throw v( + "Compartment must be constructed with an importHook and a resolveHook for it to be able to load modules" + ); +}, _n = function(e = {}, r = {}, n = {}) { + throw v( + "Compartment.prototype.constructor is not a valid constructor." + ); +}, Wn = (t, e) => { + const { execute: r, exportsProxy: n } = as( + Oe, + Ct, + t, + e + ); + return r(), n; +}, bn = { + constructor: _n, + get globalThis() { + return M(Oe, this).globalObject; + }, + get name() { + return M(Oe, this).name; + }, + /** + * @param {string} source is a JavaScript program grammar construction. + * @param {object} [options] + * @param {Array} [options.transforms] + * @param {boolean} [options.sloppyGlobalsMode] + * @param {object} [options.__moduleShimLexicals__] + * @param {boolean} [options.__evadeHtmlCommentTest__] + * @param {boolean} [options.__evadeImportExpressionTest__] + * @param {boolean} [options.__rejectSomeDirectEvalExpressions__] + */ + evaluate(t, e = {}) { + const r = M(Oe, this); + return ss(r, t, e); + }, + module(t) { + if (typeof t != "string") + throw v("first argument of module() must be a string"); + Xt(this); + const { exportsProxy: e } = vn( + this, + M(Oe, this), + Ct, + t + ); + return e; + }, + async import(t) { + if (typeof t != "string") + throw v("first argument of import() must be a string"); + return Xt(this), dn( + Vn(Oe, Ct, this, t), + () => ({ namespace: Wn( + /** @type {Compartment} */ + this, + t + ) }) + ); + }, + async load(t) { + if (typeof t != "string") + throw v("first argument of load() must be a string"); + return Xt(this), Vn(Oe, Ct, this, t); + }, + importNow(t) { + if (typeof t != "string") + throw v("first argument of importNow() must be a string"); + return Xt(this), Wn( + /** @type {Compartment} */ + this, + t + ); + } +}; +F(bn, { + [Be]: { + value: "Compartment", + writable: !1, + enumerable: !1, + configurable: !0 + } +}); +F(_n, { + prototype: { value: bn } +}); +const Kr = (t, e, r) => { + function n(a = {}, s = {}, i = {}) { + if (new.target === void 0) + throw v( + "Class constructor Compartment cannot be invoked without 'new'" + ); + const { + name: c = "", + transforms: u = [], + __shimTransforms__: l = [], + resolveHook: d, + importHook: f, + moduleMapHook: m, + importMetaHook: p + } = i, h = [...u, ...l], _ = new Ie(), w = new Ie(), I = new Ie(); + for (const [D, U] of te(s || {})) { + if (typeof U == "string") + throw v( + `Cannot map module ${Lr(D)} to ${Lr( + U + )} in parent compartment` + ); + if (M(Ct, U) === void 0) + throw et( + `Cannot map module ${Lr( + D + )} because it has no known compartment in this realm` + ); + } + const N = {}; + Da(N), Do(N); + const { safeEvaluate: T } = yn({ + globalObject: N, + globalTransforms: h, + sloppyGlobalsMode: !1 + }); + jo(N, { + intrinsics: e, + newGlobalPropertyNames: Oo, + makeCompartmentConstructor: t, + markVirtualizedNativeFunction: r + }), Wr( + N, + T, + r + ), wr(N, a), ee(Oe, this, { + name: `${c}`, + globalTransforms: h, + globalObject: N, + safeEvaluate: T, + resolveHook: d, + importHook: f, + moduleMap: s, + moduleMapHook: m, + importMetaHook: p, + moduleRecords: _, + __shimTransforms__: l, + deferredExports: I, + instances: w + }); + } + return n.prototype = bn, n; +}; +function Fr(t) { + return G(t).constructor; +} +function $i() { + return arguments; +} +const Oi = () => { + const t = ye.prototype.constructor, e = ue($i(), "callee"), r = e && e.get, n = Ks(new ie()), a = G(n), s = Sr[io] && Hs(/./), i = s && G(s), c = Us([]), u = G(c), l = G(xs), d = Bs(new Ie()), f = G(d), m = Gs(new wt()), p = G(m), h = G(u); + function* _() { + } + const w = Fr(_), I = w.prototype; + async function* N() { + } + const T = Fr( + N + ), D = T.prototype, U = D.prototype, q = G(U); + async function K() { + } + const De = Fr(K), fe = { + "%InertFunction%": t, + "%ArrayIteratorPrototype%": u, + "%InertAsyncFunction%": De, + "%AsyncGenerator%": D, + "%InertAsyncGeneratorFunction%": T, + "%AsyncGeneratorPrototype%": U, + "%AsyncIteratorPrototype%": q, + "%Generator%": I, + "%InertGeneratorFunction%": w, + "%IteratorPrototype%": h, + "%MapIteratorPrototype%": f, + "%RegExpStringIteratorPrototype%": i, + "%SetIteratorPrototype%": p, + "%StringIteratorPrototype%": a, + "%ThrowTypeError%": r, + "%TypedArray%": l, + "%InertCompartment%": _n + }; + return E.Iterator && (fe["%IteratorHelperPrototype%"] = G( + // eslint-disable-next-line @endo/no-polymorphic-call + E.Iterator.from([]).take(0) + ), fe["%WrapForValidIteratorPrototype%"] = G( + // eslint-disable-next-line @endo/no-polymorphic-call + E.Iterator.from({ next() { + } }) + )), E.AsyncIterator && (fe["%AsyncIteratorHelperPrototype%"] = G( + // eslint-disable-next-line @endo/no-polymorphic-call + E.AsyncIterator.from([]).take(0) + ), fe["%WrapForValidAsyncIteratorPrototype%"] = G( + // eslint-disable-next-line @endo/no-polymorphic-call + E.AsyncIterator.from({ next() { + } }) + )), fe; +}, is = (t, e) => { + if (e !== "safe" && e !== "unsafe") + throw v(`unrecognized fakeHardenOption ${e}`); + if (e === "safe" || (Object.isExtensible = () => !1, Object.isFrozen = () => !0, Object.isSealed = () => !0, Reflect.isExtensible = () => !1, t.isFake)) + return t; + const r = (n) => n; + return r.isFake = !0, y(r); +}; +y(is); +const Ri = () => { + const t = At, e = t.prototype, r = { + Symbol(s) { + return t(s); + } + }.Symbol; + F(e, { + constructor: { + value: r + // leave other `constructor` attributes as is + } + }); + const n = te( + Ke(t) + ), a = St( + de(n, ([s, i]) => [ + s, + { ...i, configurable: !0 } + ]) + ); + return F(r, a), { "%SharedSymbol%": r }; +}, Mi = (t) => { + try { + return t(), !1; + } catch { + return !0; + } +}, qn = (t, e, r) => { + if (t === void 0) + return !1; + const n = ue(t, e); + if (!n || "value" in n) + return !1; + const { get: a, set: s } = n; + if (typeof a != "function" || typeof s != "function" || a() !== r || oe(a, t, []) !== r) + return !1; + const i = "Seems to be a setter", c = { __proto__: null }; + if (oe(s, c, [i]), c[e] !== i) + return !1; + const u = { __proto__: t }; + return oe(s, u, [i]), u[e] !== i || !Mi(() => oe(s, t, [r])) || "originalValue" in a || n.configurable === !1 ? !1 : (L(t, e, { + value: r, + writable: !0, + enumerable: n.enumerable, + configurable: !0 + }), !0); +}, Li = (t) => { + qn( + t["%IteratorPrototype%"], + "constructor", + t.Iterator + ), qn( + t["%IteratorPrototype%"], + Be, + "Iterator" + ); +}, { Fail: Kn, details: Jn, quote: Yn } = Z; +let Qt, er; +const Fi = ya(), Di = () => { + let t = !1; + try { + t = ye( + "eval", + "SES_changed", + ` eval("SES_changed = true"); + return SES_changed; + ` + )(vo, !1), t || delete E.SES_changed; + } catch { + t = !0; + } + if (!t) + throw v( + "SES cannot initialize unless 'eval' is the original intrinsic 'eval', suitable for direct-eval (dynamically scoped eval) (SES_DIRECT_EVAL)" + ); +}, cs = (t = {}) => { + const { + errorTaming: e = me("LOCKDOWN_ERROR_TAMING", "safe"), + errorTrapping: r = ( + /** @type {"platform" | "none" | "report" | "abort" | "exit" | undefined} */ + me("LOCKDOWN_ERROR_TRAPPING", "platform") + ), + unhandledRejectionTrapping: n = ( + /** @type {"none" | "report" | undefined} */ + me("LOCKDOWN_UNHANDLED_REJECTION_TRAPPING", "report") + ), + regExpTaming: a = me("LOCKDOWN_REGEXP_TAMING", "safe"), + localeTaming: s = me("LOCKDOWN_LOCALE_TAMING", "safe"), + consoleTaming: i = ( + /** @type {'unsafe' | 'safe' | undefined} */ + me("LOCKDOWN_CONSOLE_TAMING", "safe") + ), + overrideTaming: c = me("LOCKDOWN_OVERRIDE_TAMING", "moderate"), + stackFiltering: u = me("LOCKDOWN_STACK_FILTERING", "concise"), + domainTaming: l = me("LOCKDOWN_DOMAIN_TAMING", "safe"), + evalTaming: d = me("LOCKDOWN_EVAL_TAMING", "safeEval"), + overrideDebug: f = Ge( + go(me("LOCKDOWN_OVERRIDE_DEBUG", ""), ","), + /** @param {string} debugName */ + (Ue) => Ue !== "" + ), + __hardenTaming__: m = me("LOCKDOWN_HARDEN_TAMING", "safe"), + dateTaming: p = "safe", + // deprecated + mathTaming: h = "safe", + // deprecated + ..._ + } = t; + d === "unsafeEval" || d === "safeEval" || d === "noEval" || Kn`lockdown(): non supported option evalTaming: ${Yn(d)}`; + const w = nt(_); + if (w.length === 0 || Kn`lockdown(): non supported option ${Yn(w)}`, Qt === void 0 || // eslint-disable-next-line @endo/no-polymorphic-call + Z.fail( + Jn`Already locked down at ${Qt} (SES_ALREADY_LOCKED_DOWN)`, + v + ), Qt = v("Prior lockdown (SES_ALREADY_LOCKED_DOWN)"), Qt.stack, Di(), E.Function.prototype.constructor !== E.Function && // @ts-ignore harden is absent on globalThis type def. + typeof E.harden == "function" && // @ts-ignore lockdown is absent on globalThis type def. + typeof E.lockdown == "function" && E.Date.prototype.constructor !== E.Date && typeof E.Date.now == "function" && // @ts-ignore does not recognize that Date constructor is a special + // Function. + // eslint-disable-next-line @endo/no-polymorphic-call + xr(E.Date.prototype.constructor.now(), NaN)) + throw v( + "Already locked down but not by this SES instance (SES_MULTIPLE_INSTANCES)" + ); + Xa(l); + const N = Qo(), { addIntrinsics: T, completePrototypes: D, finalIntrinsics: U } = Mo(), q = is(Fi, m); + T({ harden: q }), T(Pa()), T(ka(p)), T(yi(e, u)), T(Ta(h)), T(Ia(a)), T(Ri()), T(Oi()), D(); + const K = U(), De = { __proto__: null }; + typeof E.Buffer == "function" && (De.Buffer = E.Buffer); + let fe; + e !== "unsafe" && (fe = K["%InitialGetStackString%"]); + const je = ti( + i, + r, + n, + fe + ); + if (E.console = /** @type {Console} */ + je.console, typeof /** @type {any} */ + je.console._times == "object" && (De.SafeMap = G( + // eslint-disable-next-line no-underscore-dangle + /** @type {any} */ + je.console._times + )), e === "unsafe" && E.assert === Z && (E.assert = Cr(void 0, !0)), Ma(K, s), Li(K), Ea(K, N), Do(E), jo(E, { + intrinsics: K, + newGlobalPropertyNames: $n, + makeCompartmentConstructor: Kr, + markVirtualizedNativeFunction: N + }), d === "noEval") + Wr( + E, + ea, + N + ); + else if (d === "safeEval") { + const { safeEvaluate: Ue } = yn({ globalObject: E }); + Wr( + E, + Ue, + N + ); + } + return () => { + er === void 0 || // eslint-disable-next-line @endo/no-polymorphic-call + Z.fail( + Jn`Already locked down at ${er} (SES_ALREADY_LOCKED_DOWN)`, + v + ), er = v( + "Prior lockdown (SES_ALREADY_LOCKED_DOWN)" + ), er.stack, Na(K, c, f); + const Ue = { + intrinsics: K, + hostIntrinsics: De, + globals: { + // Harden evaluators + Function: E.Function, + eval: E.eval, + // @ts-ignore Compartment does exist on globalThis + Compartment: E.Compartment, + // Harden Symbol + Symbol: E.Symbol + } + }; + for (const Kt of Nt($n)) + Ue.globals[Kt] = E[Kt]; + return q(Ue), q; + }; +}; +E.lockdown = (t) => { + const e = cs(t); + E.harden = e(); +}; +E.repairIntrinsics = (t) => { + const e = cs(t); + E.hardenIntrinsics = () => { + E.harden = e(); + }; +}; +const ji = Qo(); +E.Compartment = Kr( + Kr, + Sa(E), + ji +); +E.assert = Z; +const Ui = ` +`; +class Zi extends HTMLElement { + constructor() { + super(), this.attachShadow({ mode: "open" }); + } + connectedCallback() { + const e = this.getAttribute("title"), r = this.getAttribute("iframe-src"), n = Number(this.getAttribute("width") || "300"), a = Number(this.getAttribute("height") || "400"); + if (!e || !r) + throw new Error("title and iframe-src attributes are required"); + if (!this.shadowRoot) + throw new Error("Error creating shadow root"); + const s = document.createElement("div"); + s.classList.add("header"); + const i = document.createElement("h1"); + i.textContent = e, s.appendChild(i); + const c = document.createElement("button"); + c.setAttribute("type", "button"), c.innerHTML = `
${Ui}
`, c.addEventListener("click", () => { + this.shadowRoot && this.shadowRoot.dispatchEvent( + new CustomEvent("close", { + composed: !0, + bubbles: !0 + }) + ); + }), s.appendChild(c); + const u = document.createElement("iframe"); + u.src = r, u.allow = "", u.sandbox.add( + "allow-scripts", + "allow-forms", + "allow-modals", + "allow-popups", + "allow-popups-to-escape-sandbox", + "allow-storage-access-by-user-activation" + ), this.addEventListener("message", (d) => { + u.contentWindow && u.contentWindow.postMessage(d.detail, "*"); + }), this.shadowRoot.appendChild(s), this.shadowRoot.appendChild(u); + const l = document.createElement("style"); + l.textContent = ` + :host { + display: flex; + flex-direction: column; + position: fixed; + inset-block-end: 10px; + inset-inline-start: 10px; + z-index: 1000; + padding: 20px; + border-radius: 20px; + box-shadow: 0 4px 8px rgba(0,0,0,0.1); + inline-size: ${n}px; + block-size: ${a}px; + } + + :host([data-theme="dark"]) { + background: #2e3434; + border: 1px solid #2e3434; + color: #ffffff; + } + + :host([data-theme="light"]) { + background: #ffffff; + border: 1px solid #eef0f2; + color: #18181a; + } + + .header { + display: flex; + justify-content: space-between; + } + + button { + background: transparent; + border: 0; + cursor: pointer; + } + + h1 { + font-family: Arial, sans-serif; + margin: 0; + margin-block-end: 10px; + } + + iframe { + border: none; + inline-size: 100%; + block-size: 100%; + } + `, this.shadowRoot.appendChild(l); + } +} +customElements.define("plugin-modal", Zi); +var R; +(function(t) { + t.assertEqual = (a) => a; + function e(a) { + } + t.assertIs = e; + function r(a) { + throw new Error(); + } + t.assertNever = r, t.arrayToEnum = (a) => { + const s = {}; + for (const i of a) + s[i] = i; + return s; + }, t.getValidEnumValues = (a) => { + const s = t.objectKeys(a).filter((c) => typeof a[a[c]] != "number"), i = {}; + for (const c of s) + i[c] = a[c]; + return t.objectValues(i); + }, t.objectValues = (a) => t.objectKeys(a).map(function(s) { + return a[s]; + }), t.objectKeys = typeof Object.keys == "function" ? (a) => Object.keys(a) : (a) => { + const s = []; + for (const i in a) + Object.prototype.hasOwnProperty.call(a, i) && s.push(i); + return s; + }, t.find = (a, s) => { + for (const i of a) + if (s(i)) + return i; + }, t.isInteger = typeof Number.isInteger == "function" ? (a) => Number.isInteger(a) : (a) => typeof a == "number" && isFinite(a) && Math.floor(a) === a; + function n(a, s = " | ") { + return a.map((i) => typeof i == "string" ? `'${i}'` : i).join(s); + } + t.joinValues = n, t.jsonStringifyReplacer = (a, s) => typeof s == "bigint" ? s.toString() : s; +})(R || (R = {})); +var Jr; +(function(t) { + t.mergeShapes = (e, r) => ({ + ...e, + ...r + // second overwrites first + }); +})(Jr || (Jr = {})); +const b = R.arrayToEnum([ + "string", + "nan", + "number", + "integer", + "float", + "boolean", + "date", + "bigint", + "symbol", + "function", + "undefined", + "null", + "array", + "object", + "unknown", + "promise", + "void", + "never", + "map", + "set" +]), Ze = (t) => { + switch (typeof t) { + case "undefined": + return b.undefined; + case "string": + return b.string; + case "number": + return isNaN(t) ? b.nan : b.number; + case "boolean": + return b.boolean; + case "function": + return b.function; + case "bigint": + return b.bigint; + case "symbol": + return b.symbol; + case "object": + return Array.isArray(t) ? b.array : t === null ? b.null : t.then && typeof t.then == "function" && t.catch && typeof t.catch == "function" ? b.promise : typeof Map < "u" && t instanceof Map ? b.map : typeof Set < "u" && t instanceof Set ? b.set : typeof Date < "u" && t instanceof Date ? b.date : b.object; + default: + return b.unknown; + } +}, g = R.arrayToEnum([ + "invalid_type", + "invalid_literal", + "custom", + "invalid_union", + "invalid_union_discriminator", + "invalid_enum_value", + "unrecognized_keys", + "invalid_arguments", + "invalid_return_type", + "invalid_date", + "invalid_string", + "too_small", + "too_big", + "invalid_intersection_types", + "not_multiple_of", + "not_finite" +]), zi = (t) => JSON.stringify(t, null, 2).replace(/"([^"]+)":/g, "$1:"); +class xe extends Error { + constructor(e) { + super(), this.issues = [], this.addIssue = (n) => { + this.issues = [...this.issues, n]; + }, this.addIssues = (n = []) => { + this.issues = [...this.issues, ...n]; + }; + const r = new.target.prototype; + Object.setPrototypeOf ? Object.setPrototypeOf(this, r) : this.__proto__ = r, this.name = "ZodError", this.issues = e; + } + get errors() { + return this.issues; + } + format(e) { + const r = e || function(s) { + return s.message; + }, n = { _errors: [] }, a = (s) => { + for (const i of s.issues) + if (i.code === "invalid_union") + i.unionErrors.map(a); + else if (i.code === "invalid_return_type") + a(i.returnTypeError); + else if (i.code === "invalid_arguments") + a(i.argumentsError); + else if (i.path.length === 0) + n._errors.push(r(i)); + else { + let c = n, u = 0; + for (; u < i.path.length; ) { + const l = i.path[u]; + u === i.path.length - 1 ? (c[l] = c[l] || { _errors: [] }, c[l]._errors.push(r(i))) : c[l] = c[l] || { _errors: [] }, c = c[l], u++; + } + } + }; + return a(this), n; + } + toString() { + return this.message; + } + get message() { + return JSON.stringify(this.issues, R.jsonStringifyReplacer, 2); + } + get isEmpty() { + return this.issues.length === 0; + } + flatten(e = (r) => r.message) { + const r = {}, n = []; + for (const a of this.issues) + a.path.length > 0 ? (r[a.path[0]] = r[a.path[0]] || [], r[a.path[0]].push(e(a))) : n.push(e(a)); + return { formErrors: n, fieldErrors: r }; + } + get formErrors() { + return this.flatten(); + } +} +xe.create = (t) => new xe(t); +const $t = (t, e) => { + let r; + switch (t.code) { + case g.invalid_type: + t.received === b.undefined ? r = "Required" : r = `Expected ${t.expected}, received ${t.received}`; + break; + case g.invalid_literal: + r = `Invalid literal value, expected ${JSON.stringify(t.expected, R.jsonStringifyReplacer)}`; + break; + case g.unrecognized_keys: + r = `Unrecognized key(s) in object: ${R.joinValues(t.keys, ", ")}`; + break; + case g.invalid_union: + r = "Invalid input"; + break; + case g.invalid_union_discriminator: + r = `Invalid discriminator value. Expected ${R.joinValues(t.options)}`; + break; + case g.invalid_enum_value: + r = `Invalid enum value. Expected ${R.joinValues(t.options)}, received '${t.received}'`; + break; + case g.invalid_arguments: + r = "Invalid function arguments"; + break; + case g.invalid_return_type: + r = "Invalid function return type"; + break; + case g.invalid_date: + r = "Invalid date"; + break; + case g.invalid_string: + typeof t.validation == "object" ? "includes" in t.validation ? (r = `Invalid input: must include "${t.validation.includes}"`, typeof t.validation.position == "number" && (r = `${r} at one or more positions greater than or equal to ${t.validation.position}`)) : "startsWith" in t.validation ? r = `Invalid input: must start with "${t.validation.startsWith}"` : "endsWith" in t.validation ? r = `Invalid input: must end with "${t.validation.endsWith}"` : R.assertNever(t.validation) : t.validation !== "regex" ? r = `Invalid ${t.validation}` : r = "Invalid"; + break; + case g.too_small: + t.type === "array" ? r = `Array must contain ${t.exact ? "exactly" : t.inclusive ? "at least" : "more than"} ${t.minimum} element(s)` : t.type === "string" ? r = `String must contain ${t.exact ? "exactly" : t.inclusive ? "at least" : "over"} ${t.minimum} character(s)` : t.type === "number" ? r = `Number must be ${t.exact ? "exactly equal to " : t.inclusive ? "greater than or equal to " : "greater than "}${t.minimum}` : t.type === "date" ? r = `Date must be ${t.exact ? "exactly equal to " : t.inclusive ? "greater than or equal to " : "greater than "}${new Date(Number(t.minimum))}` : r = "Invalid input"; + break; + case g.too_big: + t.type === "array" ? r = `Array must contain ${t.exact ? "exactly" : t.inclusive ? "at most" : "less than"} ${t.maximum} element(s)` : t.type === "string" ? r = `String must contain ${t.exact ? "exactly" : t.inclusive ? "at most" : "under"} ${t.maximum} character(s)` : t.type === "number" ? r = `Number must be ${t.exact ? "exactly" : t.inclusive ? "less than or equal to" : "less than"} ${t.maximum}` : t.type === "bigint" ? r = `BigInt must be ${t.exact ? "exactly" : t.inclusive ? "less than or equal to" : "less than"} ${t.maximum}` : t.type === "date" ? r = `Date must be ${t.exact ? "exactly" : t.inclusive ? "smaller than or equal to" : "smaller than"} ${new Date(Number(t.maximum))}` : r = "Invalid input"; + break; + case g.custom: + r = "Invalid input"; + break; + case g.invalid_intersection_types: + r = "Intersection results could not be merged"; + break; + case g.not_multiple_of: + r = `Number must be a multiple of ${t.multipleOf}`; + break; + case g.not_finite: + r = "Number must be finite"; + break; + default: + r = e.defaultError, R.assertNever(t); + } + return { message: r }; +}; +let ls = $t; +function Bi(t) { + ls = t; +} +function dr() { + return ls; +} +const fr = (t) => { + const { data: e, path: r, errorMaps: n, issueData: a } = t, s = [...r, ...a.path || []], i = { + ...a, + path: s + }; + let c = ""; + const u = n.filter((l) => !!l).slice().reverse(); + for (const l of u) + c = l(i, { data: e, defaultError: c }).message; + return { + ...a, + path: s, + message: a.message || c + }; +}, Gi = []; +function x(t, e) { + const r = fr({ + issueData: e, + data: t.data, + path: t.path, + errorMaps: [ + t.common.contextualErrorMap, + t.schemaErrorMap, + dr(), + $t + // then global default map + ].filter((n) => !!n) + }); + t.common.issues.push(r); +} +class Y { + constructor() { + this.value = "valid"; + } + dirty() { + this.value === "valid" && (this.value = "dirty"); + } + abort() { + this.value !== "aborted" && (this.value = "aborted"); + } + static mergeArray(e, r) { + const n = []; + for (const a of r) { + if (a.status === "aborted") + return A; + a.status === "dirty" && e.dirty(), n.push(a.value); + } + return { status: e.value, value: n }; + } + static async mergeObjectAsync(e, r) { + const n = []; + for (const a of r) + n.push({ + key: await a.key, + value: await a.value + }); + return Y.mergeObjectSync(e, n); + } + static mergeObjectSync(e, r) { + const n = {}; + for (const a of r) { + const { key: s, value: i } = a; + if (s.status === "aborted" || i.status === "aborted") + return A; + s.status === "dirty" && e.dirty(), i.status === "dirty" && e.dirty(), s.value !== "__proto__" && (typeof i.value < "u" || a.alwaysSet) && (n[s.value] = i.value); + } + return { status: e.value, value: n }; + } +} +const A = Object.freeze({ + status: "aborted" +}), us = (t) => ({ status: "dirty", value: t }), re = (t) => ({ status: "valid", value: t }), Yr = (t) => t.status === "aborted", Xr = (t) => t.status === "dirty", Ot = (t) => t.status === "valid", pr = (t) => typeof Promise < "u" && t instanceof Promise; +var S; +(function(t) { + t.errToObj = (e) => typeof e == "string" ? { message: e } : e || {}, t.toString = (e) => typeof e == "string" ? e : e == null ? void 0 : e.message; +})(S || (S = {})); +class Ce { + constructor(e, r, n, a) { + this._cachedPath = [], this.parent = e, this.data = r, this._path = n, this._key = a; + } + get path() { + return this._cachedPath.length || (this._key instanceof Array ? this._cachedPath.push(...this._path, ...this._key) : this._cachedPath.push(...this._path, this._key)), this._cachedPath; + } +} +const Xn = (t, e) => { + if (Ot(e)) + return { success: !0, data: e.value }; + if (!t.common.issues.length) + throw new Error("Validation failed but no issues detected."); + return { + success: !1, + get error() { + if (this._error) + return this._error; + const r = new xe(t.common.issues); + return this._error = r, this._error; + } + }; +}; +function C(t) { + if (!t) + return {}; + const { errorMap: e, invalid_type_error: r, required_error: n, description: a } = t; + if (e && (r || n)) + throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`); + return e ? { errorMap: e, description: a } : { errorMap: (i, c) => i.code !== "invalid_type" ? { message: c.defaultError } : typeof c.data > "u" ? { message: n ?? c.defaultError } : { message: r ?? c.defaultError }, description: a }; +} +class $ { + constructor(e) { + this.spa = this.safeParseAsync, this._def = e, this.parse = this.parse.bind(this), this.safeParse = this.safeParse.bind(this), this.parseAsync = this.parseAsync.bind(this), this.safeParseAsync = this.safeParseAsync.bind(this), this.spa = this.spa.bind(this), this.refine = this.refine.bind(this), this.refinement = this.refinement.bind(this), this.superRefine = this.superRefine.bind(this), this.optional = this.optional.bind(this), this.nullable = this.nullable.bind(this), this.nullish = this.nullish.bind(this), this.array = this.array.bind(this), this.promise = this.promise.bind(this), this.or = this.or.bind(this), this.and = this.and.bind(this), this.transform = this.transform.bind(this), this.brand = this.brand.bind(this), this.default = this.default.bind(this), this.catch = this.catch.bind(this), this.describe = this.describe.bind(this), this.pipe = this.pipe.bind(this), this.readonly = this.readonly.bind(this), this.isNullable = this.isNullable.bind(this), this.isOptional = this.isOptional.bind(this); + } + get description() { + return this._def.description; + } + _getType(e) { + return Ze(e.data); + } + _getOrReturnCtx(e, r) { + return r || { + common: e.parent.common, + data: e.data, + parsedType: Ze(e.data), + schemaErrorMap: this._def.errorMap, + path: e.path, + parent: e.parent + }; + } + _processInputParams(e) { + return { + status: new Y(), + ctx: { + common: e.parent.common, + data: e.data, + parsedType: Ze(e.data), + schemaErrorMap: this._def.errorMap, + path: e.path, + parent: e.parent + } + }; + } + _parseSync(e) { + const r = this._parse(e); + if (pr(r)) + throw new Error("Synchronous parse encountered promise."); + return r; + } + _parseAsync(e) { + const r = this._parse(e); + return Promise.resolve(r); + } + parse(e, r) { + const n = this.safeParse(e, r); + if (n.success) + return n.data; + throw n.error; + } + safeParse(e, r) { + var n; + const a = { + common: { + issues: [], + async: (n = r == null ? void 0 : r.async) !== null && n !== void 0 ? n : !1, + contextualErrorMap: r == null ? void 0 : r.errorMap + }, + path: (r == null ? void 0 : r.path) || [], + schemaErrorMap: this._def.errorMap, + parent: null, + data: e, + parsedType: Ze(e) + }, s = this._parseSync({ data: e, path: a.path, parent: a }); + return Xn(a, s); + } + async parseAsync(e, r) { + const n = await this.safeParseAsync(e, r); + if (n.success) + return n.data; + throw n.error; + } + async safeParseAsync(e, r) { + const n = { + common: { + issues: [], + contextualErrorMap: r == null ? void 0 : r.errorMap, + async: !0 + }, + path: (r == null ? void 0 : r.path) || [], + schemaErrorMap: this._def.errorMap, + parent: null, + data: e, + parsedType: Ze(e) + }, a = this._parse({ data: e, path: n.path, parent: n }), s = await (pr(a) ? a : Promise.resolve(a)); + return Xn(n, s); + } + refine(e, r) { + const n = (a) => typeof r == "string" || typeof r > "u" ? { message: r } : typeof r == "function" ? r(a) : r; + return this._refinement((a, s) => { + const i = e(a), c = () => s.addIssue({ + code: g.custom, + ...n(a) + }); + return typeof Promise < "u" && i instanceof Promise ? i.then((u) => u ? !0 : (c(), !1)) : i ? !0 : (c(), !1); + }); + } + refinement(e, r) { + return this._refinement((n, a) => e(n) ? !0 : (a.addIssue(typeof r == "function" ? r(n, a) : r), !1)); + } + _refinement(e) { + return new Ee({ + schema: this, + typeName: P.ZodEffects, + effect: { type: "refinement", refinement: e } + }); + } + superRefine(e) { + return this._refinement(e); + } + optional() { + return Me.create(this, this._def); + } + nullable() { + return it.create(this, this._def); + } + nullish() { + return this.nullable().optional(); + } + array() { + return Se.create(this, this._def); + } + promise() { + return bt.create(this, this._def); + } + or(e) { + return Ft.create([this, e], this._def); + } + and(e) { + return Dt.create(this, e, this._def); + } + transform(e) { + return new Ee({ + ...C(this._def), + schema: this, + typeName: P.ZodEffects, + effect: { type: "transform", transform: e } + }); + } + default(e) { + const r = typeof e == "function" ? e : () => e; + return new Bt({ + ...C(this._def), + innerType: this, + defaultValue: r, + typeName: P.ZodDefault + }); + } + brand() { + return new fs({ + typeName: P.ZodBranded, + type: this, + ...C(this._def) + }); + } + catch(e) { + const r = typeof e == "function" ? e : () => e; + return new yr({ + ...C(this._def), + innerType: this, + catchValue: r, + typeName: P.ZodCatch + }); + } + describe(e) { + const r = this.constructor; + return new r({ + ...this._def, + description: e + }); + } + pipe(e) { + return qt.create(this, e); + } + readonly() { + return _r.create(this); + } + isOptional() { + return this.safeParse(void 0).success; + } + isNullable() { + return this.safeParse(null).success; + } +} +const Hi = /^c[^\s-]{8,}$/i, Vi = /^[a-z][a-z0-9]*$/, Wi = /^[0-9A-HJKMNP-TV-Z]{26}$/, qi = /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i, Ki = /^(?!\.)(?!.*\.\.)([A-Z0-9_+-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i, Ji = "^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$"; +let Dr; +const Yi = /^(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))$/, Xi = /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/, Qi = (t) => t.precision ? t.offset ? new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${t.precision}}(([+-]\\d{2}(:?\\d{2})?)|Z)$`) : new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${t.precision}}Z$`) : t.precision === 0 ? t.offset ? new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(([+-]\\d{2}(:?\\d{2})?)|Z)$") : new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$") : t.offset ? new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}(:?\\d{2})?)|Z)$") : new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"); +function ec(t, e) { + return !!((e === "v4" || !e) && Yi.test(t) || (e === "v6" || !e) && Xi.test(t)); +} +class we extends $ { + _parse(e) { + if (this._def.coerce && (e.data = String(e.data)), this._getType(e) !== b.string) { + const s = this._getOrReturnCtx(e); + return x( + s, + { + code: g.invalid_type, + expected: b.string, + received: s.parsedType + } + // + ), A; + } + const n = new Y(); + let a; + for (const s of this._def.checks) + if (s.kind === "min") + e.data.length < s.value && (a = this._getOrReturnCtx(e, a), x(a, { + code: g.too_small, + minimum: s.value, + type: "string", + inclusive: !0, + exact: !1, + message: s.message + }), n.dirty()); + else if (s.kind === "max") + e.data.length > s.value && (a = this._getOrReturnCtx(e, a), x(a, { + code: g.too_big, + maximum: s.value, + type: "string", + inclusive: !0, + exact: !1, + message: s.message + }), n.dirty()); + else if (s.kind === "length") { + const i = e.data.length > s.value, c = e.data.length < s.value; + (i || c) && (a = this._getOrReturnCtx(e, a), i ? x(a, { + code: g.too_big, + maximum: s.value, + type: "string", + inclusive: !0, + exact: !0, + message: s.message + }) : c && x(a, { + code: g.too_small, + minimum: s.value, + type: "string", + inclusive: !0, + exact: !0, + message: s.message + }), n.dirty()); + } else if (s.kind === "email") + Ki.test(e.data) || (a = this._getOrReturnCtx(e, a), x(a, { + validation: "email", + code: g.invalid_string, + message: s.message + }), n.dirty()); + else if (s.kind === "emoji") + Dr || (Dr = new RegExp(Ji, "u")), Dr.test(e.data) || (a = this._getOrReturnCtx(e, a), x(a, { + validation: "emoji", + code: g.invalid_string, + message: s.message + }), n.dirty()); + else if (s.kind === "uuid") + qi.test(e.data) || (a = this._getOrReturnCtx(e, a), x(a, { + validation: "uuid", + code: g.invalid_string, + message: s.message + }), n.dirty()); + else if (s.kind === "cuid") + Hi.test(e.data) || (a = this._getOrReturnCtx(e, a), x(a, { + validation: "cuid", + code: g.invalid_string, + message: s.message + }), n.dirty()); + else if (s.kind === "cuid2") + Vi.test(e.data) || (a = this._getOrReturnCtx(e, a), x(a, { + validation: "cuid2", + code: g.invalid_string, + message: s.message + }), n.dirty()); + else if (s.kind === "ulid") + Wi.test(e.data) || (a = this._getOrReturnCtx(e, a), x(a, { + validation: "ulid", + code: g.invalid_string, + message: s.message + }), n.dirty()); + else if (s.kind === "url") + try { + new URL(e.data); + } catch { + a = this._getOrReturnCtx(e, a), x(a, { + validation: "url", + code: g.invalid_string, + message: s.message + }), n.dirty(); + } + else + s.kind === "regex" ? (s.regex.lastIndex = 0, s.regex.test(e.data) || (a = this._getOrReturnCtx(e, a), x(a, { + validation: "regex", + code: g.invalid_string, + message: s.message + }), n.dirty())) : s.kind === "trim" ? e.data = e.data.trim() : s.kind === "includes" ? e.data.includes(s.value, s.position) || (a = this._getOrReturnCtx(e, a), x(a, { + code: g.invalid_string, + validation: { includes: s.value, position: s.position }, + message: s.message + }), n.dirty()) : s.kind === "toLowerCase" ? e.data = e.data.toLowerCase() : s.kind === "toUpperCase" ? e.data = e.data.toUpperCase() : s.kind === "startsWith" ? e.data.startsWith(s.value) || (a = this._getOrReturnCtx(e, a), x(a, { + code: g.invalid_string, + validation: { startsWith: s.value }, + message: s.message + }), n.dirty()) : s.kind === "endsWith" ? e.data.endsWith(s.value) || (a = this._getOrReturnCtx(e, a), x(a, { + code: g.invalid_string, + validation: { endsWith: s.value }, + message: s.message + }), n.dirty()) : s.kind === "datetime" ? Qi(s).test(e.data) || (a = this._getOrReturnCtx(e, a), x(a, { + code: g.invalid_string, + validation: "datetime", + message: s.message + }), n.dirty()) : s.kind === "ip" ? ec(e.data, s.version) || (a = this._getOrReturnCtx(e, a), x(a, { + validation: "ip", + code: g.invalid_string, + message: s.message + }), n.dirty()) : R.assertNever(s); + return { status: n.value, value: e.data }; + } + _regex(e, r, n) { + return this.refinement((a) => e.test(a), { + validation: r, + code: g.invalid_string, + ...S.errToObj(n) + }); + } + _addCheck(e) { + return new we({ + ...this._def, + checks: [...this._def.checks, e] + }); + } + email(e) { + return this._addCheck({ kind: "email", ...S.errToObj(e) }); + } + url(e) { + return this._addCheck({ kind: "url", ...S.errToObj(e) }); + } + emoji(e) { + return this._addCheck({ kind: "emoji", ...S.errToObj(e) }); + } + uuid(e) { + return this._addCheck({ kind: "uuid", ...S.errToObj(e) }); + } + cuid(e) { + return this._addCheck({ kind: "cuid", ...S.errToObj(e) }); + } + cuid2(e) { + return this._addCheck({ kind: "cuid2", ...S.errToObj(e) }); + } + ulid(e) { + return this._addCheck({ kind: "ulid", ...S.errToObj(e) }); + } + ip(e) { + return this._addCheck({ kind: "ip", ...S.errToObj(e) }); + } + datetime(e) { + var r; + return typeof e == "string" ? this._addCheck({ + kind: "datetime", + precision: null, + offset: !1, + message: e + }) : this._addCheck({ + kind: "datetime", + precision: typeof (e == null ? void 0 : e.precision) > "u" ? null : e == null ? void 0 : e.precision, + offset: (r = e == null ? void 0 : e.offset) !== null && r !== void 0 ? r : !1, + ...S.errToObj(e == null ? void 0 : e.message) + }); + } + regex(e, r) { + return this._addCheck({ + kind: "regex", + regex: e, + ...S.errToObj(r) + }); + } + includes(e, r) { + return this._addCheck({ + kind: "includes", + value: e, + position: r == null ? void 0 : r.position, + ...S.errToObj(r == null ? void 0 : r.message) + }); + } + startsWith(e, r) { + return this._addCheck({ + kind: "startsWith", + value: e, + ...S.errToObj(r) + }); + } + endsWith(e, r) { + return this._addCheck({ + kind: "endsWith", + value: e, + ...S.errToObj(r) + }); + } + min(e, r) { + return this._addCheck({ + kind: "min", + value: e, + ...S.errToObj(r) + }); + } + max(e, r) { + return this._addCheck({ + kind: "max", + value: e, + ...S.errToObj(r) + }); + } + length(e, r) { + return this._addCheck({ + kind: "length", + value: e, + ...S.errToObj(r) + }); + } + /** + * @deprecated Use z.string().min(1) instead. + * @see {@link ZodString.min} + */ + nonempty(e) { + return this.min(1, S.errToObj(e)); + } + trim() { + return new we({ + ...this._def, + checks: [...this._def.checks, { kind: "trim" }] + }); + } + toLowerCase() { + return new we({ + ...this._def, + checks: [...this._def.checks, { kind: "toLowerCase" }] + }); + } + toUpperCase() { + return new we({ + ...this._def, + checks: [...this._def.checks, { kind: "toUpperCase" }] + }); + } + get isDatetime() { + return !!this._def.checks.find((e) => e.kind === "datetime"); + } + get isEmail() { + return !!this._def.checks.find((e) => e.kind === "email"); + } + get isURL() { + return !!this._def.checks.find((e) => e.kind === "url"); + } + get isEmoji() { + return !!this._def.checks.find((e) => e.kind === "emoji"); + } + get isUUID() { + return !!this._def.checks.find((e) => e.kind === "uuid"); + } + get isCUID() { + return !!this._def.checks.find((e) => e.kind === "cuid"); + } + get isCUID2() { + return !!this._def.checks.find((e) => e.kind === "cuid2"); + } + get isULID() { + return !!this._def.checks.find((e) => e.kind === "ulid"); + } + get isIP() { + return !!this._def.checks.find((e) => e.kind === "ip"); + } + get minLength() { + let e = null; + for (const r of this._def.checks) + r.kind === "min" && (e === null || r.value > e) && (e = r.value); + return e; + } + get maxLength() { + let e = null; + for (const r of this._def.checks) + r.kind === "max" && (e === null || r.value < e) && (e = r.value); + return e; + } +} +we.create = (t) => { + var e; + return new we({ + checks: [], + typeName: P.ZodString, + coerce: (e = t == null ? void 0 : t.coerce) !== null && e !== void 0 ? e : !1, + ...C(t) + }); +}; +function tc(t, e) { + const r = (t.toString().split(".")[1] || "").length, n = (e.toString().split(".")[1] || "").length, a = r > n ? r : n, s = parseInt(t.toFixed(a).replace(".", "")), i = parseInt(e.toFixed(a).replace(".", "")); + return s % i / Math.pow(10, a); +} +class Ve extends $ { + constructor() { + super(...arguments), this.min = this.gte, this.max = this.lte, this.step = this.multipleOf; + } + _parse(e) { + if (this._def.coerce && (e.data = Number(e.data)), this._getType(e) !== b.number) { + const s = this._getOrReturnCtx(e); + return x(s, { + code: g.invalid_type, + expected: b.number, + received: s.parsedType + }), A; + } + let n; + const a = new Y(); + for (const s of this._def.checks) + s.kind === "int" ? R.isInteger(e.data) || (n = this._getOrReturnCtx(e, n), x(n, { + code: g.invalid_type, + expected: "integer", + received: "float", + message: s.message + }), a.dirty()) : s.kind === "min" ? (s.inclusive ? e.data < s.value : e.data <= s.value) && (n = this._getOrReturnCtx(e, n), x(n, { + code: g.too_small, + minimum: s.value, + type: "number", + inclusive: s.inclusive, + exact: !1, + message: s.message + }), a.dirty()) : s.kind === "max" ? (s.inclusive ? e.data > s.value : e.data >= s.value) && (n = this._getOrReturnCtx(e, n), x(n, { + code: g.too_big, + maximum: s.value, + type: "number", + inclusive: s.inclusive, + exact: !1, + message: s.message + }), a.dirty()) : s.kind === "multipleOf" ? tc(e.data, s.value) !== 0 && (n = this._getOrReturnCtx(e, n), x(n, { + code: g.not_multiple_of, + multipleOf: s.value, + message: s.message + }), a.dirty()) : s.kind === "finite" ? Number.isFinite(e.data) || (n = this._getOrReturnCtx(e, n), x(n, { + code: g.not_finite, + message: s.message + }), a.dirty()) : R.assertNever(s); + return { status: a.value, value: e.data }; + } + gte(e, r) { + return this.setLimit("min", e, !0, S.toString(r)); + } + gt(e, r) { + return this.setLimit("min", e, !1, S.toString(r)); + } + lte(e, r) { + return this.setLimit("max", e, !0, S.toString(r)); + } + lt(e, r) { + return this.setLimit("max", e, !1, S.toString(r)); + } + setLimit(e, r, n, a) { + return new Ve({ + ...this._def, + checks: [ + ...this._def.checks, + { + kind: e, + value: r, + inclusive: n, + message: S.toString(a) + } + ] + }); + } + _addCheck(e) { + return new Ve({ + ...this._def, + checks: [...this._def.checks, e] + }); + } + int(e) { + return this._addCheck({ + kind: "int", + message: S.toString(e) + }); + } + positive(e) { + return this._addCheck({ + kind: "min", + value: 0, + inclusive: !1, + message: S.toString(e) + }); + } + negative(e) { + return this._addCheck({ + kind: "max", + value: 0, + inclusive: !1, + message: S.toString(e) + }); + } + nonpositive(e) { + return this._addCheck({ + kind: "max", + value: 0, + inclusive: !0, + message: S.toString(e) + }); + } + nonnegative(e) { + return this._addCheck({ + kind: "min", + value: 0, + inclusive: !0, + message: S.toString(e) + }); + } + multipleOf(e, r) { + return this._addCheck({ + kind: "multipleOf", + value: e, + message: S.toString(r) + }); + } + finite(e) { + return this._addCheck({ + kind: "finite", + message: S.toString(e) + }); + } + safe(e) { + return this._addCheck({ + kind: "min", + inclusive: !0, + value: Number.MIN_SAFE_INTEGER, + message: S.toString(e) + })._addCheck({ + kind: "max", + inclusive: !0, + value: Number.MAX_SAFE_INTEGER, + message: S.toString(e) + }); + } + get minValue() { + let e = null; + for (const r of this._def.checks) + r.kind === "min" && (e === null || r.value > e) && (e = r.value); + return e; + } + get maxValue() { + let e = null; + for (const r of this._def.checks) + r.kind === "max" && (e === null || r.value < e) && (e = r.value); + return e; + } + get isInt() { + return !!this._def.checks.find((e) => e.kind === "int" || e.kind === "multipleOf" && R.isInteger(e.value)); + } + get isFinite() { + let e = null, r = null; + for (const n of this._def.checks) { + if (n.kind === "finite" || n.kind === "int" || n.kind === "multipleOf") + return !0; + n.kind === "min" ? (r === null || n.value > r) && (r = n.value) : n.kind === "max" && (e === null || n.value < e) && (e = n.value); + } + return Number.isFinite(r) && Number.isFinite(e); + } +} +Ve.create = (t) => new Ve({ + checks: [], + typeName: P.ZodNumber, + coerce: (t == null ? void 0 : t.coerce) || !1, + ...C(t) +}); +class We extends $ { + constructor() { + super(...arguments), this.min = this.gte, this.max = this.lte; + } + _parse(e) { + if (this._def.coerce && (e.data = BigInt(e.data)), this._getType(e) !== b.bigint) { + const s = this._getOrReturnCtx(e); + return x(s, { + code: g.invalid_type, + expected: b.bigint, + received: s.parsedType + }), A; + } + let n; + const a = new Y(); + for (const s of this._def.checks) + s.kind === "min" ? (s.inclusive ? e.data < s.value : e.data <= s.value) && (n = this._getOrReturnCtx(e, n), x(n, { + code: g.too_small, + type: "bigint", + minimum: s.value, + inclusive: s.inclusive, + message: s.message + }), a.dirty()) : s.kind === "max" ? (s.inclusive ? e.data > s.value : e.data >= s.value) && (n = this._getOrReturnCtx(e, n), x(n, { + code: g.too_big, + type: "bigint", + maximum: s.value, + inclusive: s.inclusive, + message: s.message + }), a.dirty()) : s.kind === "multipleOf" ? e.data % s.value !== BigInt(0) && (n = this._getOrReturnCtx(e, n), x(n, { + code: g.not_multiple_of, + multipleOf: s.value, + message: s.message + }), a.dirty()) : R.assertNever(s); + return { status: a.value, value: e.data }; + } + gte(e, r) { + return this.setLimit("min", e, !0, S.toString(r)); + } + gt(e, r) { + return this.setLimit("min", e, !1, S.toString(r)); + } + lte(e, r) { + return this.setLimit("max", e, !0, S.toString(r)); + } + lt(e, r) { + return this.setLimit("max", e, !1, S.toString(r)); + } + setLimit(e, r, n, a) { + return new We({ + ...this._def, + checks: [ + ...this._def.checks, + { + kind: e, + value: r, + inclusive: n, + message: S.toString(a) + } + ] + }); + } + _addCheck(e) { + return new We({ + ...this._def, + checks: [...this._def.checks, e] + }); + } + positive(e) { + return this._addCheck({ + kind: "min", + value: BigInt(0), + inclusive: !1, + message: S.toString(e) + }); + } + negative(e) { + return this._addCheck({ + kind: "max", + value: BigInt(0), + inclusive: !1, + message: S.toString(e) + }); + } + nonpositive(e) { + return this._addCheck({ + kind: "max", + value: BigInt(0), + inclusive: !0, + message: S.toString(e) + }); + } + nonnegative(e) { + return this._addCheck({ + kind: "min", + value: BigInt(0), + inclusive: !0, + message: S.toString(e) + }); + } + multipleOf(e, r) { + return this._addCheck({ + kind: "multipleOf", + value: e, + message: S.toString(r) + }); + } + get minValue() { + let e = null; + for (const r of this._def.checks) + r.kind === "min" && (e === null || r.value > e) && (e = r.value); + return e; + } + get maxValue() { + let e = null; + for (const r of this._def.checks) + r.kind === "max" && (e === null || r.value < e) && (e = r.value); + return e; + } +} +We.create = (t) => { + var e; + return new We({ + checks: [], + typeName: P.ZodBigInt, + coerce: (e = t == null ? void 0 : t.coerce) !== null && e !== void 0 ? e : !1, + ...C(t) + }); +}; +class Rt extends $ { + _parse(e) { + if (this._def.coerce && (e.data = !!e.data), this._getType(e) !== b.boolean) { + const n = this._getOrReturnCtx(e); + return x(n, { + code: g.invalid_type, + expected: b.boolean, + received: n.parsedType + }), A; + } + return re(e.data); + } +} +Rt.create = (t) => new Rt({ + typeName: P.ZodBoolean, + coerce: (t == null ? void 0 : t.coerce) || !1, + ...C(t) +}); +class st extends $ { + _parse(e) { + if (this._def.coerce && (e.data = new Date(e.data)), this._getType(e) !== b.date) { + const s = this._getOrReturnCtx(e); + return x(s, { + code: g.invalid_type, + expected: b.date, + received: s.parsedType + }), A; + } + if (isNaN(e.data.getTime())) { + const s = this._getOrReturnCtx(e); + return x(s, { + code: g.invalid_date + }), A; + } + const n = new Y(); + let a; + for (const s of this._def.checks) + s.kind === "min" ? e.data.getTime() < s.value && (a = this._getOrReturnCtx(e, a), x(a, { + code: g.too_small, + message: s.message, + inclusive: !0, + exact: !1, + minimum: s.value, + type: "date" + }), n.dirty()) : s.kind === "max" ? e.data.getTime() > s.value && (a = this._getOrReturnCtx(e, a), x(a, { + code: g.too_big, + message: s.message, + inclusive: !0, + exact: !1, + maximum: s.value, + type: "date" + }), n.dirty()) : R.assertNever(s); + return { + status: n.value, + value: new Date(e.data.getTime()) + }; + } + _addCheck(e) { + return new st({ + ...this._def, + checks: [...this._def.checks, e] + }); + } + min(e, r) { + return this._addCheck({ + kind: "min", + value: e.getTime(), + message: S.toString(r) + }); + } + max(e, r) { + return this._addCheck({ + kind: "max", + value: e.getTime(), + message: S.toString(r) + }); + } + get minDate() { + let e = null; + for (const r of this._def.checks) + r.kind === "min" && (e === null || r.value > e) && (e = r.value); + return e != null ? new Date(e) : null; + } + get maxDate() { + let e = null; + for (const r of this._def.checks) + r.kind === "max" && (e === null || r.value < e) && (e = r.value); + return e != null ? new Date(e) : null; + } +} +st.create = (t) => new st({ + checks: [], + coerce: (t == null ? void 0 : t.coerce) || !1, + typeName: P.ZodDate, + ...C(t) +}); +class mr extends $ { + _parse(e) { + if (this._getType(e) !== b.symbol) { + const n = this._getOrReturnCtx(e); + return x(n, { + code: g.invalid_type, + expected: b.symbol, + received: n.parsedType + }), A; + } + return re(e.data); + } +} +mr.create = (t) => new mr({ + typeName: P.ZodSymbol, + ...C(t) +}); +class Mt extends $ { + _parse(e) { + if (this._getType(e) !== b.undefined) { + const n = this._getOrReturnCtx(e); + return x(n, { + code: g.invalid_type, + expected: b.undefined, + received: n.parsedType + }), A; + } + return re(e.data); + } +} +Mt.create = (t) => new Mt({ + typeName: P.ZodUndefined, + ...C(t) +}); +class Lt extends $ { + _parse(e) { + if (this._getType(e) !== b.null) { + const n = this._getOrReturnCtx(e); + return x(n, { + code: g.invalid_type, + expected: b.null, + received: n.parsedType + }), A; + } + return re(e.data); + } +} +Lt.create = (t) => new Lt({ + typeName: P.ZodNull, + ...C(t) +}); +class _t extends $ { + constructor() { + super(...arguments), this._any = !0; + } + _parse(e) { + return re(e.data); + } +} +_t.create = (t) => new _t({ + typeName: P.ZodAny, + ...C(t) +}); +class rt extends $ { + constructor() { + super(...arguments), this._unknown = !0; + } + _parse(e) { + return re(e.data); + } +} +rt.create = (t) => new rt({ + typeName: P.ZodUnknown, + ...C(t) +}); +class Fe extends $ { + _parse(e) { + const r = this._getOrReturnCtx(e); + return x(r, { + code: g.invalid_type, + expected: b.never, + received: r.parsedType + }), A; + } +} +Fe.create = (t) => new Fe({ + typeName: P.ZodNever, + ...C(t) +}); +class hr extends $ { + _parse(e) { + if (this._getType(e) !== b.undefined) { + const n = this._getOrReturnCtx(e); + return x(n, { + code: g.invalid_type, + expected: b.void, + received: n.parsedType + }), A; + } + return re(e.data); + } +} +hr.create = (t) => new hr({ + typeName: P.ZodVoid, + ...C(t) +}); +class Se extends $ { + _parse(e) { + const { ctx: r, status: n } = this._processInputParams(e), a = this._def; + if (r.parsedType !== b.array) + return x(r, { + code: g.invalid_type, + expected: b.array, + received: r.parsedType + }), A; + if (a.exactLength !== null) { + const i = r.data.length > a.exactLength.value, c = r.data.length < a.exactLength.value; + (i || c) && (x(r, { + code: i ? g.too_big : g.too_small, + minimum: c ? a.exactLength.value : void 0, + maximum: i ? a.exactLength.value : void 0, + type: "array", + inclusive: !0, + exact: !0, + message: a.exactLength.message + }), n.dirty()); + } + if (a.minLength !== null && r.data.length < a.minLength.value && (x(r, { + code: g.too_small, + minimum: a.minLength.value, + type: "array", + inclusive: !0, + exact: !1, + message: a.minLength.message + }), n.dirty()), a.maxLength !== null && r.data.length > a.maxLength.value && (x(r, { + code: g.too_big, + maximum: a.maxLength.value, + type: "array", + inclusive: !0, + exact: !1, + message: a.maxLength.message + }), n.dirty()), r.common.async) + return Promise.all([...r.data].map((i, c) => a.type._parseAsync(new Ce(r, i, r.path, c)))).then((i) => Y.mergeArray(n, i)); + const s = [...r.data].map((i, c) => a.type._parseSync(new Ce(r, i, r.path, c))); + return Y.mergeArray(n, s); + } + get element() { + return this._def.type; + } + min(e, r) { + return new Se({ + ...this._def, + minLength: { value: e, message: S.toString(r) } + }); + } + max(e, r) { + return new Se({ + ...this._def, + maxLength: { value: e, message: S.toString(r) } + }); + } + length(e, r) { + return new Se({ + ...this._def, + exactLength: { value: e, message: S.toString(r) } + }); + } + nonempty(e) { + return this.min(1, e); + } +} +Se.create = (t, e) => new Se({ + type: t, + minLength: null, + maxLength: null, + exactLength: null, + typeName: P.ZodArray, + ...C(e) +}); +function pt(t) { + if (t instanceof j) { + const e = {}; + for (const r in t.shape) { + const n = t.shape[r]; + e[r] = Me.create(pt(n)); + } + return new j({ + ...t._def, + shape: () => e + }); + } else + return t instanceof Se ? new Se({ + ...t._def, + type: pt(t.element) + }) : t instanceof Me ? Me.create(pt(t.unwrap())) : t instanceof it ? it.create(pt(t.unwrap())) : t instanceof Ne ? Ne.create(t.items.map((e) => pt(e))) : t; +} +class j extends $ { + constructor() { + super(...arguments), this._cached = null, this.nonstrict = this.passthrough, this.augment = this.extend; + } + _getCached() { + if (this._cached !== null) + return this._cached; + const e = this._def.shape(), r = R.objectKeys(e); + return this._cached = { shape: e, keys: r }; + } + _parse(e) { + if (this._getType(e) !== b.object) { + const l = this._getOrReturnCtx(e); + return x(l, { + code: g.invalid_type, + expected: b.object, + received: l.parsedType + }), A; + } + const { status: n, ctx: a } = this._processInputParams(e), { shape: s, keys: i } = this._getCached(), c = []; + if (!(this._def.catchall instanceof Fe && this._def.unknownKeys === "strip")) + for (const l in a.data) + i.includes(l) || c.push(l); + const u = []; + for (const l of i) { + const d = s[l], f = a.data[l]; + u.push({ + key: { status: "valid", value: l }, + value: d._parse(new Ce(a, f, a.path, l)), + alwaysSet: l in a.data + }); + } + if (this._def.catchall instanceof Fe) { + const l = this._def.unknownKeys; + if (l === "passthrough") + for (const d of c) + u.push({ + key: { status: "valid", value: d }, + value: { status: "valid", value: a.data[d] } + }); + else if (l === "strict") + c.length > 0 && (x(a, { + code: g.unrecognized_keys, + keys: c + }), n.dirty()); + else if (l !== "strip") + throw new Error("Internal ZodObject error: invalid unknownKeys value."); + } else { + const l = this._def.catchall; + for (const d of c) { + const f = a.data[d]; + u.push({ + key: { status: "valid", value: d }, + value: l._parse( + new Ce(a, f, a.path, d) + //, ctx.child(key), value, getParsedType(value) + ), + alwaysSet: d in a.data + }); + } + } + return a.common.async ? Promise.resolve().then(async () => { + const l = []; + for (const d of u) { + const f = await d.key; + l.push({ + key: f, + value: await d.value, + alwaysSet: d.alwaysSet + }); + } + return l; + }).then((l) => Y.mergeObjectSync(n, l)) : Y.mergeObjectSync(n, u); + } + get shape() { + return this._def.shape(); + } + strict(e) { + return S.errToObj, new j({ + ...this._def, + unknownKeys: "strict", + ...e !== void 0 ? { + errorMap: (r, n) => { + var a, s, i, c; + const u = (i = (s = (a = this._def).errorMap) === null || s === void 0 ? void 0 : s.call(a, r, n).message) !== null && i !== void 0 ? i : n.defaultError; + return r.code === "unrecognized_keys" ? { + message: (c = S.errToObj(e).message) !== null && c !== void 0 ? c : u + } : { + message: u + }; + } + } : {} + }); + } + strip() { + return new j({ + ...this._def, + unknownKeys: "strip" + }); + } + passthrough() { + return new j({ + ...this._def, + unknownKeys: "passthrough" + }); + } + // const AugmentFactory = + // (def: Def) => + // ( + // augmentation: Augmentation + // ): ZodObject< + // extendShape, Augmentation>, + // Def["unknownKeys"], + // Def["catchall"] + // > => { + // return new ZodObject({ + // ...def, + // shape: () => ({ + // ...def.shape(), + // ...augmentation, + // }), + // }) as any; + // }; + extend(e) { + return new j({ + ...this._def, + shape: () => ({ + ...this._def.shape(), + ...e + }) + }); + } + /** + * Prior to zod@1.0.12 there was a bug in the + * inferred type of merged objects. Please + * upgrade if you are experiencing issues. + */ + merge(e) { + return new j({ + unknownKeys: e._def.unknownKeys, + catchall: e._def.catchall, + shape: () => ({ + ...this._def.shape(), + ...e._def.shape() + }), + typeName: P.ZodObject + }); + } + // merge< + // Incoming extends AnyZodObject, + // Augmentation extends Incoming["shape"], + // NewOutput extends { + // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation + // ? Augmentation[k]["_output"] + // : k extends keyof Output + // ? Output[k] + // : never; + // }, + // NewInput extends { + // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation + // ? Augmentation[k]["_input"] + // : k extends keyof Input + // ? Input[k] + // : never; + // } + // >( + // merging: Incoming + // ): ZodObject< + // extendShape>, + // Incoming["_def"]["unknownKeys"], + // Incoming["_def"]["catchall"], + // NewOutput, + // NewInput + // > { + // const merged: any = new ZodObject({ + // unknownKeys: merging._def.unknownKeys, + // catchall: merging._def.catchall, + // shape: () => + // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), + // typeName: ZodFirstPartyTypeKind.ZodObject, + // }) as any; + // return merged; + // } + setKey(e, r) { + return this.augment({ [e]: r }); + } + // merge( + // merging: Incoming + // ): //ZodObject = (merging) => { + // ZodObject< + // extendShape>, + // Incoming["_def"]["unknownKeys"], + // Incoming["_def"]["catchall"] + // > { + // // const mergedShape = objectUtil.mergeShapes( + // // this._def.shape(), + // // merging._def.shape() + // // ); + // const merged: any = new ZodObject({ + // unknownKeys: merging._def.unknownKeys, + // catchall: merging._def.catchall, + // shape: () => + // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), + // typeName: ZodFirstPartyTypeKind.ZodObject, + // }) as any; + // return merged; + // } + catchall(e) { + return new j({ + ...this._def, + catchall: e + }); + } + pick(e) { + const r = {}; + return R.objectKeys(e).forEach((n) => { + e[n] && this.shape[n] && (r[n] = this.shape[n]); + }), new j({ + ...this._def, + shape: () => r + }); + } + omit(e) { + const r = {}; + return R.objectKeys(this.shape).forEach((n) => { + e[n] || (r[n] = this.shape[n]); + }), new j({ + ...this._def, + shape: () => r + }); + } + /** + * @deprecated + */ + deepPartial() { + return pt(this); + } + partial(e) { + const r = {}; + return R.objectKeys(this.shape).forEach((n) => { + const a = this.shape[n]; + e && !e[n] ? r[n] = a : r[n] = a.optional(); + }), new j({ + ...this._def, + shape: () => r + }); + } + required(e) { + const r = {}; + return R.objectKeys(this.shape).forEach((n) => { + if (e && !e[n]) + r[n] = this.shape[n]; + else { + let s = this.shape[n]; + for (; s instanceof Me; ) + s = s._def.innerType; + r[n] = s; + } + }), new j({ + ...this._def, + shape: () => r + }); + } + keyof() { + return ds(R.objectKeys(this.shape)); + } +} +j.create = (t, e) => new j({ + shape: () => t, + unknownKeys: "strip", + catchall: Fe.create(), + typeName: P.ZodObject, + ...C(e) +}); +j.strictCreate = (t, e) => new j({ + shape: () => t, + unknownKeys: "strict", + catchall: Fe.create(), + typeName: P.ZodObject, + ...C(e) +}); +j.lazycreate = (t, e) => new j({ + shape: t, + unknownKeys: "strip", + catchall: Fe.create(), + typeName: P.ZodObject, + ...C(e) +}); +class Ft extends $ { + _parse(e) { + const { ctx: r } = this._processInputParams(e), n = this._def.options; + function a(s) { + for (const c of s) + if (c.result.status === "valid") + return c.result; + for (const c of s) + if (c.result.status === "dirty") + return r.common.issues.push(...c.ctx.common.issues), c.result; + const i = s.map((c) => new xe(c.ctx.common.issues)); + return x(r, { + code: g.invalid_union, + unionErrors: i + }), A; + } + if (r.common.async) + return Promise.all(n.map(async (s) => { + const i = { + ...r, + common: { + ...r.common, + issues: [] + }, + parent: null + }; + return { + result: await s._parseAsync({ + data: r.data, + path: r.path, + parent: i + }), + ctx: i + }; + })).then(a); + { + let s; + const i = []; + for (const u of n) { + const l = { + ...r, + common: { + ...r.common, + issues: [] + }, + parent: null + }, d = u._parseSync({ + data: r.data, + path: r.path, + parent: l + }); + if (d.status === "valid") + return d; + d.status === "dirty" && !s && (s = { result: d, ctx: l }), l.common.issues.length && i.push(l.common.issues); + } + if (s) + return r.common.issues.push(...s.ctx.common.issues), s.result; + const c = i.map((u) => new xe(u)); + return x(r, { + code: g.invalid_union, + unionErrors: c + }), A; + } + } + get options() { + return this._def.options; + } +} +Ft.create = (t, e) => new Ft({ + options: t, + typeName: P.ZodUnion, + ...C(e) +}); +const or = (t) => t instanceof Ut ? or(t.schema) : t instanceof Ee ? or(t.innerType()) : t instanceof Zt ? [t.value] : t instanceof qe ? t.options : t instanceof zt ? Object.keys(t.enum) : t instanceof Bt ? or(t._def.innerType) : t instanceof Mt ? [void 0] : t instanceof Lt ? [null] : null; +class Nr extends $ { + _parse(e) { + const { ctx: r } = this._processInputParams(e); + if (r.parsedType !== b.object) + return x(r, { + code: g.invalid_type, + expected: b.object, + received: r.parsedType + }), A; + const n = this.discriminator, a = r.data[n], s = this.optionsMap.get(a); + return s ? r.common.async ? s._parseAsync({ + data: r.data, + path: r.path, + parent: r + }) : s._parseSync({ + data: r.data, + path: r.path, + parent: r + }) : (x(r, { + code: g.invalid_union_discriminator, + options: Array.from(this.optionsMap.keys()), + path: [n] + }), A); + } + get discriminator() { + return this._def.discriminator; + } + get options() { + return this._def.options; + } + get optionsMap() { + return this._def.optionsMap; + } + /** + * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor. + * However, it only allows a union of objects, all of which need to share a discriminator property. This property must + * have a different value for each object in the union. + * @param discriminator the name of the discriminator property + * @param types an array of object schemas + * @param params + */ + static create(e, r, n) { + const a = /* @__PURE__ */ new Map(); + for (const s of r) { + const i = or(s.shape[e]); + if (!i) + throw new Error(`A discriminator value for key \`${e}\` could not be extracted from all schema options`); + for (const c of i) { + if (a.has(c)) + throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(c)}`); + a.set(c, s); + } + } + return new Nr({ + typeName: P.ZodDiscriminatedUnion, + discriminator: e, + options: r, + optionsMap: a, + ...C(n) + }); + } +} +function Qr(t, e) { + const r = Ze(t), n = Ze(e); + if (t === e) + return { valid: !0, data: t }; + if (r === b.object && n === b.object) { + const a = R.objectKeys(e), s = R.objectKeys(t).filter((c) => a.indexOf(c) !== -1), i = { ...t, ...e }; + for (const c of s) { + const u = Qr(t[c], e[c]); + if (!u.valid) + return { valid: !1 }; + i[c] = u.data; + } + return { valid: !0, data: i }; + } else if (r === b.array && n === b.array) { + if (t.length !== e.length) + return { valid: !1 }; + const a = []; + for (let s = 0; s < t.length; s++) { + const i = t[s], c = e[s], u = Qr(i, c); + if (!u.valid) + return { valid: !1 }; + a.push(u.data); + } + return { valid: !0, data: a }; + } else + return r === b.date && n === b.date && +t == +e ? { valid: !0, data: t } : { valid: !1 }; +} +class Dt extends $ { + _parse(e) { + const { status: r, ctx: n } = this._processInputParams(e), a = (s, i) => { + if (Yr(s) || Yr(i)) + return A; + const c = Qr(s.value, i.value); + return c.valid ? ((Xr(s) || Xr(i)) && r.dirty(), { status: r.value, value: c.data }) : (x(n, { + code: g.invalid_intersection_types + }), A); + }; + return n.common.async ? Promise.all([ + this._def.left._parseAsync({ + data: n.data, + path: n.path, + parent: n + }), + this._def.right._parseAsync({ + data: n.data, + path: n.path, + parent: n + }) + ]).then(([s, i]) => a(s, i)) : a(this._def.left._parseSync({ + data: n.data, + path: n.path, + parent: n + }), this._def.right._parseSync({ + data: n.data, + path: n.path, + parent: n + })); + } +} +Dt.create = (t, e, r) => new Dt({ + left: t, + right: e, + typeName: P.ZodIntersection, + ...C(r) +}); +class Ne extends $ { + _parse(e) { + const { status: r, ctx: n } = this._processInputParams(e); + if (n.parsedType !== b.array) + return x(n, { + code: g.invalid_type, + expected: b.array, + received: n.parsedType + }), A; + if (n.data.length < this._def.items.length) + return x(n, { + code: g.too_small, + minimum: this._def.items.length, + inclusive: !0, + exact: !1, + type: "array" + }), A; + !this._def.rest && n.data.length > this._def.items.length && (x(n, { + code: g.too_big, + maximum: this._def.items.length, + inclusive: !0, + exact: !1, + type: "array" + }), r.dirty()); + const s = [...n.data].map((i, c) => { + const u = this._def.items[c] || this._def.rest; + return u ? u._parse(new Ce(n, i, n.path, c)) : null; + }).filter((i) => !!i); + return n.common.async ? Promise.all(s).then((i) => Y.mergeArray(r, i)) : Y.mergeArray(r, s); + } + get items() { + return this._def.items; + } + rest(e) { + return new Ne({ + ...this._def, + rest: e + }); + } +} +Ne.create = (t, e) => { + if (!Array.isArray(t)) + throw new Error("You must pass an array of schemas to z.tuple([ ... ])"); + return new Ne({ + items: t, + typeName: P.ZodTuple, + rest: null, + ...C(e) + }); +}; +class jt extends $ { + get keySchema() { + return this._def.keyType; + } + get valueSchema() { + return this._def.valueType; + } + _parse(e) { + const { status: r, ctx: n } = this._processInputParams(e); + if (n.parsedType !== b.object) + return x(n, { + code: g.invalid_type, + expected: b.object, + received: n.parsedType + }), A; + const a = [], s = this._def.keyType, i = this._def.valueType; + for (const c in n.data) + a.push({ + key: s._parse(new Ce(n, c, n.path, c)), + value: i._parse(new Ce(n, n.data[c], n.path, c)) + }); + return n.common.async ? Y.mergeObjectAsync(r, a) : Y.mergeObjectSync(r, a); + } + get element() { + return this._def.valueType; + } + static create(e, r, n) { + return r instanceof $ ? new jt({ + keyType: e, + valueType: r, + typeName: P.ZodRecord, + ...C(n) + }) : new jt({ + keyType: we.create(), + valueType: e, + typeName: P.ZodRecord, + ...C(r) + }); + } +} +class gr extends $ { + get keySchema() { + return this._def.keyType; + } + get valueSchema() { + return this._def.valueType; + } + _parse(e) { + const { status: r, ctx: n } = this._processInputParams(e); + if (n.parsedType !== b.map) + return x(n, { + code: g.invalid_type, + expected: b.map, + received: n.parsedType + }), A; + const a = this._def.keyType, s = this._def.valueType, i = [...n.data.entries()].map(([c, u], l) => ({ + key: a._parse(new Ce(n, c, n.path, [l, "key"])), + value: s._parse(new Ce(n, u, n.path, [l, "value"])) + })); + if (n.common.async) { + const c = /* @__PURE__ */ new Map(); + return Promise.resolve().then(async () => { + for (const u of i) { + const l = await u.key, d = await u.value; + if (l.status === "aborted" || d.status === "aborted") + return A; + (l.status === "dirty" || d.status === "dirty") && r.dirty(), c.set(l.value, d.value); + } + return { status: r.value, value: c }; + }); + } else { + const c = /* @__PURE__ */ new Map(); + for (const u of i) { + const l = u.key, d = u.value; + if (l.status === "aborted" || d.status === "aborted") + return A; + (l.status === "dirty" || d.status === "dirty") && r.dirty(), c.set(l.value, d.value); + } + return { status: r.value, value: c }; + } + } +} +gr.create = (t, e, r) => new gr({ + valueType: e, + keyType: t, + typeName: P.ZodMap, + ...C(r) +}); +class at extends $ { + _parse(e) { + const { status: r, ctx: n } = this._processInputParams(e); + if (n.parsedType !== b.set) + return x(n, { + code: g.invalid_type, + expected: b.set, + received: n.parsedType + }), A; + const a = this._def; + a.minSize !== null && n.data.size < a.minSize.value && (x(n, { + code: g.too_small, + minimum: a.minSize.value, + type: "set", + inclusive: !0, + exact: !1, + message: a.minSize.message + }), r.dirty()), a.maxSize !== null && n.data.size > a.maxSize.value && (x(n, { + code: g.too_big, + maximum: a.maxSize.value, + type: "set", + inclusive: !0, + exact: !1, + message: a.maxSize.message + }), r.dirty()); + const s = this._def.valueType; + function i(u) { + const l = /* @__PURE__ */ new Set(); + for (const d of u) { + if (d.status === "aborted") + return A; + d.status === "dirty" && r.dirty(), l.add(d.value); + } + return { status: r.value, value: l }; + } + const c = [...n.data.values()].map((u, l) => s._parse(new Ce(n, u, n.path, l))); + return n.common.async ? Promise.all(c).then((u) => i(u)) : i(c); + } + min(e, r) { + return new at({ + ...this._def, + minSize: { value: e, message: S.toString(r) } + }); + } + max(e, r) { + return new at({ + ...this._def, + maxSize: { value: e, message: S.toString(r) } + }); + } + size(e, r) { + return this.min(e, r).max(e, r); + } + nonempty(e) { + return this.min(1, e); + } +} +at.create = (t, e) => new at({ + valueType: t, + minSize: null, + maxSize: null, + typeName: P.ZodSet, + ...C(e) +}); +class ht extends $ { + constructor() { + super(...arguments), this.validate = this.implement; + } + _parse(e) { + const { ctx: r } = this._processInputParams(e); + if (r.parsedType !== b.function) + return x(r, { + code: g.invalid_type, + expected: b.function, + received: r.parsedType + }), A; + function n(c, u) { + return fr({ + data: c, + path: r.path, + errorMaps: [ + r.common.contextualErrorMap, + r.schemaErrorMap, + dr(), + $t + ].filter((l) => !!l), + issueData: { + code: g.invalid_arguments, + argumentsError: u + } + }); + } + function a(c, u) { + return fr({ + data: c, + path: r.path, + errorMaps: [ + r.common.contextualErrorMap, + r.schemaErrorMap, + dr(), + $t + ].filter((l) => !!l), + issueData: { + code: g.invalid_return_type, + returnTypeError: u + } + }); + } + const s = { errorMap: r.common.contextualErrorMap }, i = r.data; + if (this._def.returns instanceof bt) { + const c = this; + return re(async function(...u) { + const l = new xe([]), d = await c._def.args.parseAsync(u, s).catch((p) => { + throw l.addIssue(n(u, p)), l; + }), f = await Reflect.apply(i, this, d); + return await c._def.returns._def.type.parseAsync(f, s).catch((p) => { + throw l.addIssue(a(f, p)), l; + }); + }); + } else { + const c = this; + return re(function(...u) { + const l = c._def.args.safeParse(u, s); + if (!l.success) + throw new xe([n(u, l.error)]); + const d = Reflect.apply(i, this, l.data), f = c._def.returns.safeParse(d, s); + if (!f.success) + throw new xe([a(d, f.error)]); + return f.data; + }); + } + } + parameters() { + return this._def.args; + } + returnType() { + return this._def.returns; + } + args(...e) { + return new ht({ + ...this._def, + args: Ne.create(e).rest(rt.create()) + }); + } + returns(e) { + return new ht({ + ...this._def, + returns: e + }); + } + implement(e) { + return this.parse(e); + } + strictImplement(e) { + return this.parse(e); + } + static create(e, r, n) { + return new ht({ + args: e || Ne.create([]).rest(rt.create()), + returns: r || rt.create(), + typeName: P.ZodFunction, + ...C(n) + }); + } +} +class Ut extends $ { + get schema() { + return this._def.getter(); + } + _parse(e) { + const { ctx: r } = this._processInputParams(e); + return this._def.getter()._parse({ data: r.data, path: r.path, parent: r }); + } +} +Ut.create = (t, e) => new Ut({ + getter: t, + typeName: P.ZodLazy, + ...C(e) +}); +class Zt extends $ { + _parse(e) { + if (e.data !== this._def.value) { + const r = this._getOrReturnCtx(e); + return x(r, { + received: r.data, + code: g.invalid_literal, + expected: this._def.value + }), A; + } + return { status: "valid", value: e.data }; + } + get value() { + return this._def.value; + } +} +Zt.create = (t, e) => new Zt({ + value: t, + typeName: P.ZodLiteral, + ...C(e) +}); +function ds(t, e) { + return new qe({ + values: t, + typeName: P.ZodEnum, + ...C(e) + }); +} +class qe extends $ { + _parse(e) { + if (typeof e.data != "string") { + const r = this._getOrReturnCtx(e), n = this._def.values; + return x(r, { + expected: R.joinValues(n), + received: r.parsedType, + code: g.invalid_type + }), A; + } + if (this._def.values.indexOf(e.data) === -1) { + const r = this._getOrReturnCtx(e), n = this._def.values; + return x(r, { + received: r.data, + code: g.invalid_enum_value, + options: n + }), A; + } + return re(e.data); + } + get options() { + return this._def.values; + } + get enum() { + const e = {}; + for (const r of this._def.values) + e[r] = r; + return e; + } + get Values() { + const e = {}; + for (const r of this._def.values) + e[r] = r; + return e; + } + get Enum() { + const e = {}; + for (const r of this._def.values) + e[r] = r; + return e; + } + extract(e) { + return qe.create(e); + } + exclude(e) { + return qe.create(this.options.filter((r) => !e.includes(r))); + } +} +qe.create = ds; +class zt extends $ { + _parse(e) { + const r = R.getValidEnumValues(this._def.values), n = this._getOrReturnCtx(e); + if (n.parsedType !== b.string && n.parsedType !== b.number) { + const a = R.objectValues(r); + return x(n, { + expected: R.joinValues(a), + received: n.parsedType, + code: g.invalid_type + }), A; + } + if (r.indexOf(e.data) === -1) { + const a = R.objectValues(r); + return x(n, { + received: n.data, + code: g.invalid_enum_value, + options: a + }), A; + } + return re(e.data); + } + get enum() { + return this._def.values; + } +} +zt.create = (t, e) => new zt({ + values: t, + typeName: P.ZodNativeEnum, + ...C(e) +}); +class bt extends $ { + unwrap() { + return this._def.type; + } + _parse(e) { + const { ctx: r } = this._processInputParams(e); + if (r.parsedType !== b.promise && r.common.async === !1) + return x(r, { + code: g.invalid_type, + expected: b.promise, + received: r.parsedType + }), A; + const n = r.parsedType === b.promise ? r.data : Promise.resolve(r.data); + return re(n.then((a) => this._def.type.parseAsync(a, { + path: r.path, + errorMap: r.common.contextualErrorMap + }))); + } +} +bt.create = (t, e) => new bt({ + type: t, + typeName: P.ZodPromise, + ...C(e) +}); +class Ee extends $ { + innerType() { + return this._def.schema; + } + sourceType() { + return this._def.schema._def.typeName === P.ZodEffects ? this._def.schema.sourceType() : this._def.schema; + } + _parse(e) { + const { status: r, ctx: n } = this._processInputParams(e), a = this._def.effect || null, s = { + addIssue: (i) => { + x(n, i), i.fatal ? r.abort() : r.dirty(); + }, + get path() { + return n.path; + } + }; + if (s.addIssue = s.addIssue.bind(s), a.type === "preprocess") { + const i = a.transform(n.data, s); + return n.common.issues.length ? { + status: "dirty", + value: n.data + } : n.common.async ? Promise.resolve(i).then((c) => this._def.schema._parseAsync({ + data: c, + path: n.path, + parent: n + })) : this._def.schema._parseSync({ + data: i, + path: n.path, + parent: n + }); + } + if (a.type === "refinement") { + const i = (c) => { + const u = a.refinement(c, s); + if (n.common.async) + return Promise.resolve(u); + if (u instanceof Promise) + throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead."); + return c; + }; + if (n.common.async === !1) { + const c = this._def.schema._parseSync({ + data: n.data, + path: n.path, + parent: n + }); + return c.status === "aborted" ? A : (c.status === "dirty" && r.dirty(), i(c.value), { status: r.value, value: c.value }); + } else + return this._def.schema._parseAsync({ data: n.data, path: n.path, parent: n }).then((c) => c.status === "aborted" ? A : (c.status === "dirty" && r.dirty(), i(c.value).then(() => ({ status: r.value, value: c.value })))); + } + if (a.type === "transform") + if (n.common.async === !1) { + const i = this._def.schema._parseSync({ + data: n.data, + path: n.path, + parent: n + }); + if (!Ot(i)) + return i; + const c = a.transform(i.value, s); + if (c instanceof Promise) + throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead."); + return { status: r.value, value: c }; + } else + return this._def.schema._parseAsync({ data: n.data, path: n.path, parent: n }).then((i) => Ot(i) ? Promise.resolve(a.transform(i.value, s)).then((c) => ({ status: r.value, value: c })) : i); + R.assertNever(a); + } +} +Ee.create = (t, e, r) => new Ee({ + schema: t, + typeName: P.ZodEffects, + effect: e, + ...C(r) +}); +Ee.createWithPreprocess = (t, e, r) => new Ee({ + schema: e, + effect: { type: "preprocess", transform: t }, + typeName: P.ZodEffects, + ...C(r) +}); +class Me extends $ { + _parse(e) { + return this._getType(e) === b.undefined ? re(void 0) : this._def.innerType._parse(e); + } + unwrap() { + return this._def.innerType; + } +} +Me.create = (t, e) => new Me({ + innerType: t, + typeName: P.ZodOptional, + ...C(e) +}); +class it extends $ { + _parse(e) { + return this._getType(e) === b.null ? re(null) : this._def.innerType._parse(e); + } + unwrap() { + return this._def.innerType; + } +} +it.create = (t, e) => new it({ + innerType: t, + typeName: P.ZodNullable, + ...C(e) +}); +class Bt extends $ { + _parse(e) { + const { ctx: r } = this._processInputParams(e); + let n = r.data; + return r.parsedType === b.undefined && (n = this._def.defaultValue()), this._def.innerType._parse({ + data: n, + path: r.path, + parent: r + }); + } + removeDefault() { + return this._def.innerType; + } +} +Bt.create = (t, e) => new Bt({ + innerType: t, + typeName: P.ZodDefault, + defaultValue: typeof e.default == "function" ? e.default : () => e.default, + ...C(e) +}); +class yr extends $ { + _parse(e) { + const { ctx: r } = this._processInputParams(e), n = { + ...r, + common: { + ...r.common, + issues: [] + } + }, a = this._def.innerType._parse({ + data: n.data, + path: n.path, + parent: { + ...n + } + }); + return pr(a) ? a.then((s) => ({ + status: "valid", + value: s.status === "valid" ? s.value : this._def.catchValue({ + get error() { + return new xe(n.common.issues); + }, + input: n.data + }) + })) : { + status: "valid", + value: a.status === "valid" ? a.value : this._def.catchValue({ + get error() { + return new xe(n.common.issues); + }, + input: n.data + }) + }; + } + removeCatch() { + return this._def.innerType; + } +} +yr.create = (t, e) => new yr({ + innerType: t, + typeName: P.ZodCatch, + catchValue: typeof e.catch == "function" ? e.catch : () => e.catch, + ...C(e) +}); +class vr extends $ { + _parse(e) { + if (this._getType(e) !== b.nan) { + const n = this._getOrReturnCtx(e); + return x(n, { + code: g.invalid_type, + expected: b.nan, + received: n.parsedType + }), A; + } + return { status: "valid", value: e.data }; + } +} +vr.create = (t) => new vr({ + typeName: P.ZodNaN, + ...C(t) +}); +const rc = Symbol("zod_brand"); +class fs extends $ { + _parse(e) { + const { ctx: r } = this._processInputParams(e), n = r.data; + return this._def.type._parse({ + data: n, + path: r.path, + parent: r + }); + } + unwrap() { + return this._def.type; + } +} +class qt extends $ { + _parse(e) { + const { status: r, ctx: n } = this._processInputParams(e); + if (n.common.async) + return (async () => { + const s = await this._def.in._parseAsync({ + data: n.data, + path: n.path, + parent: n + }); + return s.status === "aborted" ? A : s.status === "dirty" ? (r.dirty(), us(s.value)) : this._def.out._parseAsync({ + data: s.value, + path: n.path, + parent: n + }); + })(); + { + const a = this._def.in._parseSync({ + data: n.data, + path: n.path, + parent: n + }); + return a.status === "aborted" ? A : a.status === "dirty" ? (r.dirty(), { + status: "dirty", + value: a.value + }) : this._def.out._parseSync({ + data: a.value, + path: n.path, + parent: n + }); + } + } + static create(e, r) { + return new qt({ + in: e, + out: r, + typeName: P.ZodPipeline + }); + } +} +class _r extends $ { + _parse(e) { + const r = this._def.innerType._parse(e); + return Ot(r) && (r.value = Object.freeze(r.value)), r; + } +} +_r.create = (t, e) => new _r({ + innerType: t, + typeName: P.ZodReadonly, + ...C(e) +}); +const ps = (t, e = {}, r) => t ? _t.create().superRefine((n, a) => { + var s, i; + if (!t(n)) { + const c = typeof e == "function" ? e(n) : typeof e == "string" ? { message: e } : e, u = (i = (s = c.fatal) !== null && s !== void 0 ? s : r) !== null && i !== void 0 ? i : !0, l = typeof c == "string" ? { message: c } : c; + a.addIssue({ code: "custom", ...l, fatal: u }); + } +}) : _t.create(), nc = { + object: j.lazycreate +}; +var P; +(function(t) { + t.ZodString = "ZodString", t.ZodNumber = "ZodNumber", t.ZodNaN = "ZodNaN", t.ZodBigInt = "ZodBigInt", t.ZodBoolean = "ZodBoolean", t.ZodDate = "ZodDate", t.ZodSymbol = "ZodSymbol", t.ZodUndefined = "ZodUndefined", t.ZodNull = "ZodNull", t.ZodAny = "ZodAny", t.ZodUnknown = "ZodUnknown", t.ZodNever = "ZodNever", t.ZodVoid = "ZodVoid", t.ZodArray = "ZodArray", t.ZodObject = "ZodObject", t.ZodUnion = "ZodUnion", t.ZodDiscriminatedUnion = "ZodDiscriminatedUnion", t.ZodIntersection = "ZodIntersection", t.ZodTuple = "ZodTuple", t.ZodRecord = "ZodRecord", t.ZodMap = "ZodMap", t.ZodSet = "ZodSet", t.ZodFunction = "ZodFunction", t.ZodLazy = "ZodLazy", t.ZodLiteral = "ZodLiteral", t.ZodEnum = "ZodEnum", t.ZodEffects = "ZodEffects", t.ZodNativeEnum = "ZodNativeEnum", t.ZodOptional = "ZodOptional", t.ZodNullable = "ZodNullable", t.ZodDefault = "ZodDefault", t.ZodCatch = "ZodCatch", t.ZodPromise = "ZodPromise", t.ZodBranded = "ZodBranded", t.ZodPipeline = "ZodPipeline", t.ZodReadonly = "ZodReadonly"; +})(P || (P = {})); +const oc = (t, e = { + message: `Input not instance of ${t.name}` +}) => ps((r) => r instanceof t, e), ms = we.create, hs = Ve.create, sc = vr.create, ac = We.create, gs = Rt.create, ic = st.create, cc = mr.create, lc = Mt.create, uc = Lt.create, dc = _t.create, fc = rt.create, pc = Fe.create, mc = hr.create, hc = Se.create, gc = j.create, yc = j.strictCreate, vc = Ft.create, _c = Nr.create, bc = Dt.create, wc = Ne.create, xc = jt.create, Sc = gr.create, Ec = at.create, Pc = ht.create, kc = Ut.create, Tc = Zt.create, Ic = qe.create, Ac = zt.create, Cc = bt.create, Qn = Ee.create, Nc = Me.create, $c = it.create, Oc = Ee.createWithPreprocess, Rc = qt.create, Mc = () => ms().optional(), Lc = () => hs().optional(), Fc = () => gs().optional(), Dc = { + string: (t) => we.create({ ...t, coerce: !0 }), + number: (t) => Ve.create({ ...t, coerce: !0 }), + boolean: (t) => Rt.create({ + ...t, + coerce: !0 + }), + bigint: (t) => We.create({ ...t, coerce: !0 }), + date: (t) => st.create({ ...t, coerce: !0 }) +}, jc = A; +var V = /* @__PURE__ */ Object.freeze({ + __proto__: null, + defaultErrorMap: $t, + setErrorMap: Bi, + getErrorMap: dr, + makeIssue: fr, + EMPTY_PATH: Gi, + addIssueToContext: x, + ParseStatus: Y, + INVALID: A, + DIRTY: us, + OK: re, + isAborted: Yr, + isDirty: Xr, + isValid: Ot, + isAsync: pr, + get util() { + return R; + }, + get objectUtil() { + return Jr; + }, + ZodParsedType: b, + getParsedType: Ze, + ZodType: $, + ZodString: we, + ZodNumber: Ve, + ZodBigInt: We, + ZodBoolean: Rt, + ZodDate: st, + ZodSymbol: mr, + ZodUndefined: Mt, + ZodNull: Lt, + ZodAny: _t, + ZodUnknown: rt, + ZodNever: Fe, + ZodVoid: hr, + ZodArray: Se, + ZodObject: j, + ZodUnion: Ft, + ZodDiscriminatedUnion: Nr, + ZodIntersection: Dt, + ZodTuple: Ne, + ZodRecord: jt, + ZodMap: gr, + ZodSet: at, + ZodFunction: ht, + ZodLazy: Ut, + ZodLiteral: Zt, + ZodEnum: qe, + ZodNativeEnum: zt, + ZodPromise: bt, + ZodEffects: Ee, + ZodTransformer: Ee, + ZodOptional: Me, + ZodNullable: it, + ZodDefault: Bt, + ZodCatch: yr, + ZodNaN: vr, + BRAND: rc, + ZodBranded: fs, + ZodPipeline: qt, + ZodReadonly: _r, + custom: ps, + Schema: $, + ZodSchema: $, + late: nc, + get ZodFirstPartyTypeKind() { + return P; + }, + coerce: Dc, + any: dc, + array: hc, + bigint: ac, + boolean: gs, + date: ic, + discriminatedUnion: _c, + effect: Qn, + enum: Ic, + function: Pc, + instanceof: oc, + intersection: bc, + lazy: kc, + literal: Tc, + map: Sc, + nan: sc, + nativeEnum: Ac, + never: pc, + null: uc, + nullable: $c, + number: hs, + object: gc, + oboolean: Fc, + onumber: Lc, + optional: Nc, + ostring: Mc, + pipeline: Rc, + preprocess: Oc, + promise: Cc, + record: xc, + set: Ec, + strictObject: yc, + string: ms, + symbol: cc, + transformer: Qn, + tuple: wc, + undefined: lc, + union: vc, + unknown: fc, + void: mc, + NEVER: jc, + ZodIssueCode: g, + quotelessJson: zi, + ZodError: xe +}); +const Uc = V.object({ + name: V.string(), + code: V.string().url(), + permissions: V.array( + V.enum([ + "page:read", + "page:write", + "file:read", + "file:write", + "selection:read" + ]) + ) +}); +function ys(t) { + return fetch(t).then((e) => e.json()).then((e) => { + if (!Uc.safeParse(e).success) + throw new Error("Invalid plugin manifest"); + return e; + }).catch((e) => { + throw console.error(e), e; + }); +} +function Zc(t) { + return fetch(t).then((e) => e.text()); +} +async function zc(t) { + const e = await ys(t.manifest), r = await Zc(e.code); + return { + manifest: e, + code: r + }; +} +function wn(t, e) { + t.setAttribute("data-theme", e); +} +function Bc(t, e, r, n) { + const a = document.createElement("plugin-modal"); + return wn(a, r), a.setAttribute("title", t), a.setAttribute("iframe-src", e), a.setAttribute("width", String(n.width || 300)), a.setAttribute("height", String(n.height || 400)), document.body.appendChild(a), a; +} +const Gc = V.object({ + width: V.number().positive(), + height: V.number().positive() +}), Hc = V.function().args(V.string(), V.string(), V.enum(["dark", "light"]), Gc).implement((t, e, r, n) => Bc(t, e, r, n)), en = [ + "pagechange", + "filechange", + "selectionchange", + "themechange" +]; +let tn = [], ne = null; +const It = /* @__PURE__ */ new Map(); +window.addEventListener("message", (t) => { + for (const e of tn) + e(t.data); +}); +function Vc(t, e) { + t === "themechange" && ne && wn(ne, e), (It.get(t) || []).forEach((n) => n(e)); +} +function Wc(t, e) { + const r = () => { + ne == null || ne.removeEventListener("close", r), ne && ne.remove(), tn = [], ne = null; + }, n = (s) => { + if (!e.permissions.includes(s)) + throw new Error(`Permission ${s} is not granted`); + }; + return { + ui: { + open: (s, i, c) => { + const u = t.getTheme(); + ne = Hc(s, i, u, c), wn(ne, u), ne.addEventListener("close", r, { + once: !0 + }); + }, + sendMessage(s) { + const i = new CustomEvent("message", { + detail: s + }); + ne == null || ne.dispatchEvent(i); + }, + onMessage: (s) => { + V.function().parse(s), tn.push(s); + } + }, + log: console.log, + setTimeout: V.function().args(V.function(), V.number()).implement((s, i) => { + setTimeout(s, i); + }), + closePlugin: r, + on(s, i) { + V.enum(en).parse(s), V.function().parse(i), s === "pagechange" ? n("page:read") : s === "filechange" ? n("file:read") : s === "selectionchange" && n("selection:read"); + const c = It.get(s) || []; + c.push(i), It.set(s, c); + }, + off(s, i) { + V.enum(en).parse(s), V.function().parse(i); + const c = It.get(s) || []; + It.set( + s, + c.filter((u) => u !== i) + ); + }, + // Penpot State API + getFile() { + return n("file:read"), t.getFile(); + }, + getCurrentPage() { + return n("page:read"), t.getCurrentPage(); + }, + getPage() { + return n("page:read"), t.getPage(); + }, + getSelected() { + return n("selection:read"), t.getSelected(); + }, + getSelectedShapes() { + return n("selection:read"), t.getSelectedShapes(); + }, + getTheme() { + return t.getTheme(); + }, + fetch + }; +} +let eo = !1, tr, rn = null; +function qc(t) { + rn = t; +} +const vs = async function(t) { + const { code: e, manifest: r } = await zc(t); + try { + eo || (eo = !0, hardenIntrinsics()), tr && tr.closePlugin(), rn ? (tr = Wc(rn, r), new Compartment({ + penpot: harden(tr) + }).evaluate(e)) : console.error("Cannot find Penpot Context"); + } catch (n) { + console.error(n); + } +}, Kc = ` +`, to = (t) => { + t.target.tagName === "INSTALLER-MODAL" && t.stopImmediatePropagation(); +}; +class Jc extends HTMLElement { + constructor() { + super(), this.dialog = null, this.attachShadow({ mode: "open" }); + } + createPlugin(e, r) { + var c, u; + const n = document.createElement("li"); + n.classList.add("plugin"), n.textContent = e; + const a = document.createElement("div"); + a.classList.add("actions"); + const s = document.createElement("button"); + s.classList.add("button"), s.textContent = "Open", s.type = "button", s.addEventListener("click", () => { + this.closeModal(), vs({ + manifest: r + }); + }), a.appendChild(s); + const i = document.createElement("button"); + i.classList.add("button", "remove"), i.textContent = "Remove", i.type = "button", i.addEventListener("click", () => { + n.remove(); + const d = this.getPlugins().filter((f) => f.url !== r); + this.savePlugins(d); + }), a.appendChild(i), n.appendChild(a), (u = (c = this.dialog) == null ? void 0 : c.querySelector(".plugins-list")) == null || u.prepend(n); + } + loadPluginList() { + const e = this.getPlugins(); + for (const r of e) + this.createPlugin(r.name, r.url); + } + getPlugins() { + const e = localStorage.getItem("plugins"); + return e ? JSON.parse(e) : []; + } + savePlugins(e) { + localStorage.setItem("plugins", JSON.stringify(e)); + } + submitNewPlugin(e) { + e.preventDefault(); + const n = e.target.querySelector("input"); + if (!n) + return; + const a = n.value; + n.value = "", ys(a).then((s) => { + if (this.createPlugin(s.name, a), !localStorage.getItem("plugins")) + localStorage.setItem( + "plugins", + JSON.stringify([{ name: s.name, url: a }]) + ); + else { + const c = this.getPlugins(); + c.push({ name: s.name, url: a }), this.savePlugins(c); + } + this.error(!1); + }).catch((s) => { + console.error(s), this.error(!0); + }); + } + error(e) { + var r, n; + (n = (r = this.dialog) == null ? void 0 : r.querySelector(".error")) == null || n.classList.toggle("show", e); + } + connectedCallback() { + var r; + if (!this.shadowRoot) + throw new Error("Error creating shadow root"); + this.dialog = document.createElement("dialog"), this.dialog.innerHTML = ` +
+

Plugins

+ +
+
+ + +
+
+ Error instaling plugin +
+ +
    + `, (r = this.dialog.querySelector(".close")) == null || r.addEventListener("click", () => { + this.closeModal(); + }), this.shadowRoot.appendChild(this.dialog), this.dialog.addEventListener("submit", (n) => { + this.submitNewPlugin(n); + }), this.loadPluginList(); + const e = document.createElement("style"); + e.textContent = ` + * { + font-family worksans, sans-serif + } + + ::backdrop { + background-color: rgba(0, 0, 0, 0.8); + } + + dialog { + border: 0; + width: 700px; + height: 500px; + padding: 20px; + background-color: white; + border-radius: 10px; + flex-direction: column; + display: none; + } + + dialog[open] { + display: flex; + } + + .header { + display: flex; + justify-content: space-between; + } + + h1 { + margin: 0; + margin-block-end: 10px; + } + + ul { + padding: 0; + } + + li { + list-style: none; + } + + .input { + display: flex; + border: 1px solid; + border-radius: calc( 0.25rem * 2); + font-size: 12px; + font-weight: 400; + line-height: 1.4; + outline: none; + padding-block: calc( 0.25rem * 2); + padding-inline: calc( 0.25rem * 2); + background-color: #f3f4f6; + border-color: #f3f4f6; + color: #000; + + &:hover { + background-color: #eef0f2; + border-color: #eef0f2; + } + + &:focus { + background-color: #ffffff + border-color: ##6911d4; + } + } + + button { + background: transparent; + border: 0; + cursor: pointer; + } + + .button { + border: 1px solid transparent; + font-weight: 500; + font-size: 12px; + border-radius: 8px; + line-height: 1.2; + padding: 8px 24px 8px 24px; + text-transform: uppercase; + background-color: #7EFFF5; + border: 1px solid 7EFFF5; + outline: 2px solid transparent; + + &:hover:not(:disabled) { + cursor: pointer; + } + + &:focus-visible { + outline: none; + } + } + + .remove { + background-color: #ff3277; + border: 1px solid #ff3277; + outline: 2px solid transparent; + } + + form { + display: flex; + gap: 10px; + margin-block-end: 20px; + } + + .url-input { + inline-size: 400px; + } + + .plugins-list { + display: flex; + flex-direction: column; + gap: 10px; + } + + .plugin { + display: flex; + justify-content: space-between; + } + + .actions { + display: flex; + gap: 10px; + } + + .error { + display: none; + color: red; + + &.show { + display: block; + } + } + `, this.shadowRoot.appendChild(e); + } + closeModal() { + var e, r; + (r = (e = this.shadowRoot) == null ? void 0 : e.querySelector("dialog")) == null || r.close(), window.removeEventListener("paste", to, !0); + } + openModal() { + var e, r; + (r = (e = this.shadowRoot) == null ? void 0 : e.querySelector("dialog")) == null || r.showModal(), window.addEventListener("paste", to, !0); + } +} +function Yc() { + customElements.define("installer-modal", Jc); + const t = document.createElement("installer-modal"); + document.body.appendChild(t), document.addEventListener("keydown", (e) => { + var r; + e.key.toUpperCase() === "I" && e.ctrlKey && ((r = document.querySelector("installer-modal")) == null || r.openModal()); + }); +} +console.log("Loading plugin system"); +repairIntrinsics({ + evalTaming: "unsafeEval" +}); +globalThis.initPluginsRuntime = (t) => { + if (t) { + console.log("Initialize context"), globalThis.ɵcontext = t, globalThis.ɵloadPlugin = vs, Yc(), qc(t); + for (const e of en) + t.addListener(e, Vc.bind(null, e)); + } +}; +//# sourceMappingURL=index.mjs.map -- Gitee From 293ab3c80e3dc61304269df4bc6a01663587ff61 Mon Sep 17 00:00:00 2001 From: AzazelN28 Date: Thu, 18 Apr 2024 12:14:29 +0200 Subject: [PATCH 0328/1266] :bug: Fix color palette sorting --- CHANGES.md | 3 ++ .../ui/workspace/colorpicker/libraries.cljs | 30 ++++++++++++++----- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 100296f4d..3df22277a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -7,6 +7,9 @@ - Fix locking contention on cron subsystem (causes backend start blocking) - Fix locking contention on file object thumbails backend RPC calls +### :bug: Bugs fixed + +- Fix color palette sorting [Taiga Issue #7458](https://tree.taiga.io/project/penpot/issue/7458) ## 2.0.1 diff --git a/frontend/src/app/main/ui/workspace/colorpicker/libraries.cljs b/frontend/src/app/main/ui/workspace/colorpicker/libraries.cljs index 14e851d31..9bb4f067e 100644 --- a/frontend/src/app/main/ui/workspace/colorpicker/libraries.cljs +++ b/frontend/src/app/main/ui/workspace/colorpicker/libraries.cljs @@ -7,6 +7,7 @@ (ns app.main.ui.workspace.colorpicker.libraries (:require-macros [app.main.style :as stl]) (:require + [app.common.colors :as c] [app.common.data :as d] [app.common.data.macros :as dm] [app.main.data.events :as ev] @@ -24,7 +25,7 @@ [rumext.v2 :as mf])) (mf/defc libraries - [{:keys [state on-select-color on-add-library-color disable-gradient disable-opacity disable-image]}] + [{:keys [state on-select-color on-add-library-color disable-gradient disable-opacity disable-image]}] (let [selected (h/use-shared-state mdc/colorpicker-selected-broadcast-key :recent) current-colors (mf/use-state []) @@ -43,10 +44,23 @@ (parse-uuid event))))) check-valid-color? - (fn [color] - (and (or (not disable-gradient) (not (:gradient color))) - (or (not disable-opacity) (= 1 (:opacity color))) - (or (not disable-image) (not (:image color))))) + (mf/use-fn + (fn [color] + (and (or (not disable-gradient) (not (:gradient color))) + (or (not disable-opacity) (= 1 (:opacity color))) + (or (not disable-image) (not (:image color)))))) + + ;; Sort colors by hue and lightness + get-sorted-colors + (mf/use-fn + (fn [colors] + (sort (fn [a b] + (let [[ah _ al] (c/hex->hsl (:color a)) + [bh _ bl] (c/hex->hsl (:color b)) + a (+ (* ah 100) (* al 99)) + b (+ (* bh 100) (* bl 99))] + (compare a b))) + (into [] (filter check-valid-color?) colors)))) toggle-palette (mf/use-fn @@ -89,13 +103,15 @@ (sort-by :name) (map #(assoc % :file-id file-id)))))] - (reset! current-colors (into [] (filter check-valid-color?) colors)))) + (if (not= @selected :recent) + (reset! current-colors (get-sorted-colors colors)) + (reset! current-colors (into [] (filter check-valid-color? colors)))))) ;; If the file colors change and the file option is selected updates the state (mf/with-effect [file-colors] (when (= @selected :file) (let [colors (vals file-colors)] - (reset! current-colors (into [] (filter check-valid-color?) colors))))) + (reset! current-colors (get-sorted-colors colors))))) [:div {:class (stl/css :libraries)} [:div {:class (stl/css :select-wrapper)} -- Gitee From 362d4ea47f06d169dd6e0a34cb9d141200e646e6 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Fri, 19 Apr 2024 11:14:52 +0200 Subject: [PATCH 0329/1266] :sparkles: Command to activate feature plugin --- frontend/src/features.cljs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frontend/src/features.cljs b/frontend/src/features.cljs index 943b5a1f7..5cf4f0488 100644 --- a/frontend/src/features.cljs +++ b/frontend/src/features.cljs @@ -9,6 +9,7 @@ (:require [app.main.features :as features] [app.main.store :as st] + [app.plugins :as plugins] [app.util.timers :as tm])) (defn ^:export is-components-v2 [] @@ -25,6 +26,8 @@ (clj->js (features/get-team-enabled-features @st/state))) (defn ^:export plugins [] + (when (not (features/active-feature? @st/state "plugins/runtime")) + (plugins/init!)) (tm/schedule-on-idle #(st/emit! (features/toggle-feature "plugins/runtime"))) nil) -- Gitee From e1cd6d04d9d62b609e2c18390b39dea94a29e924 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Fri, 19 Apr 2024 11:58:27 +0200 Subject: [PATCH 0330/1266] :recycle: Move common libraries_helpers to libraries_common_helpers --- backend/src/app/features/components_v2.clj | 4 ++-- .../{libraries_helpers.cljc => libraries_common_helpers.cljc} | 2 +- frontend/src/app/main/data/workspace/libraries.cljs | 4 ++-- frontend/src/app/main/data/workspace/selection.cljs | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) rename common/src/app/common/files/{libraries_helpers.cljc => libraries_common_helpers.cljc} (98%) diff --git a/backend/src/app/features/components_v2.clj b/backend/src/app/features/components_v2.clj index 05cd1a084..34fb01f88 100644 --- a/backend/src/app/features/components_v2.clj +++ b/backend/src/app/features/components_v2.clj @@ -12,7 +12,7 @@ [app.common.files.changes :as cp] [app.common.files.changes-builder :as fcb] [app.common.files.helpers :as cfh] - [app.common.files.libraries-helpers :as cflh] + [app.common.files.libraries-common-helpers :as cflch] [app.common.files.migrations :as fmg] [app.common.files.shapes-helpers :as cfsh] [app.common.files.validate :as cfv] @@ -1451,7 +1451,7 @@ (cons shape children)) [_ _ changes2] - (cflh/generate-add-component nil + (cflch/generate-add-component nil [shape] (:objects page) (:id page) diff --git a/common/src/app/common/files/libraries_helpers.cljc b/common/src/app/common/files/libraries_common_helpers.cljc similarity index 98% rename from common/src/app/common/files/libraries_helpers.cljc rename to common/src/app/common/files/libraries_common_helpers.cljc index 8b7f34aca..e7df2d8f3 100644 --- a/common/src/app/common/files/libraries_helpers.cljc +++ b/common/src/app/common/files/libraries_common_helpers.cljc @@ -4,7 +4,7 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns app.common.files.libraries-helpers +(ns app.common.files.libraries-common-helpers (:require [app.common.data :as d] [app.common.files.changes-builder :as pcb] diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index e055ea16e..75d662313 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -11,7 +11,7 @@ [app.common.files.changes :as ch] [app.common.files.changes-builder :as pcb] [app.common.files.helpers :as cfh] - [app.common.files.libraries-helpers :as cflh] + [app.common.files.libraries-common-helpers :as cflch] [app.common.files.shapes-helpers :as cfsh] [app.common.geom.point :as gpt] [app.common.logging :as log] @@ -345,7 +345,7 @@ parents (into #{} (map :parent-id) shapes)] (when-not (empty? shapes) (let [[root _ changes] - (cflh/generate-add-component it shapes objects page-id file-id components-v2 + (cflch/generate-add-component it shapes objects page-id file-id components-v2 dwg/prepare-create-group cfsh/prepare-create-artboard-from-selection)] (when-not (empty? (:redo-changes changes)) diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index 8ce2cfe1f..b5b3d3a0d 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -11,7 +11,7 @@ [app.common.files.changes-builder :as pcb] [app.common.files.focus :as cpf] [app.common.files.helpers :as cfh] - [app.common.files.libraries-helpers :as cflh] + [app.common.files.libraries-common-helpers :as cflch] [app.common.geom.point :as gpt] [app.common.geom.rect :as grc] [app.common.geom.shapes :as gsh] @@ -498,7 +498,7 @@ regenerate-component (fn [changes shape] (let [components-v2 (dm/get-in library-data [:options :components-v2]) - [_ changes] (cflh/generate-add-component-changes changes shape objects file-id (:id page) components-v2)] + [_ changes] (cflch/generate-add-component-changes changes shape objects file-id (:id page) components-v2)] changes)) new-obj -- Gitee From 2e18ce9323887e1823b7645c7f18058bd34f62f7 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Fri, 19 Apr 2024 12:53:23 +0200 Subject: [PATCH 0331/1266] :recycle: Move libraries_helpers to common --- .../app/common/files/libraries_helpers.cljc | 64 +++++++++---------- .../app/main/data/workspace/libraries.cljs | 50 +++++++++------ .../app/main/data/workspace/selection.cljs | 6 +- .../main/data/workspace/state_helpers.cljs | 9 +++ 4 files changed, 71 insertions(+), 58 deletions(-) rename frontend/src/app/main/data/workspace/libraries_helpers.cljs => common/src/app/common/files/libraries_helpers.cljc (97%) diff --git a/frontend/src/app/main/data/workspace/libraries_helpers.cljs b/common/src/app/common/files/libraries_helpers.cljc similarity index 97% rename from frontend/src/app/main/data/workspace/libraries_helpers.cljs rename to common/src/app/common/files/libraries_helpers.cljc index ff03da46e..0be04e5d6 100644 --- a/frontend/src/app/main/data/workspace/libraries_helpers.cljs +++ b/common/src/app/common/files/libraries_helpers.cljc @@ -4,7 +4,7 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns app.main.data.workspace.libraries-helpers +(ns app.common.files.libraries-helpers (:require [app.common.data :as d] [app.common.data.macros :as dm] @@ -25,7 +25,6 @@ [app.common.types.shape-tree :as ctst] [app.common.types.shape.layout :as ctl] [app.common.types.typography :as cty] - [app.main.data.workspace.state-helpers :as wsh] [cljs.spec.alpha :as s] [clojure.set :as set])) @@ -37,7 +36,6 @@ (declare generate-sync-text-shape) (declare uses-assets?) -(declare get-assets) (declare generate-sync-shape-direct) (declare generate-sync-shape-direct-recursive) (declare generate-sync-shape-inverse) @@ -59,10 +57,10 @@ (declare make-change) (defn pretty-file - [file-id state] - (if (= file-id (:current-file-id state)) + [file-id libraries current-file-id] + (if (= file-id current-file-id) "" - (str "<" (get-in state [:workspace-libraries file-id :name]) ">"))) + (str "<" (get-in libraries [file-id :name]) ">"))) (defn pretty-uuid [uuid] @@ -304,7 +302,7 @@ If an asset id is given, only shapes linked to this particular asset will be synchronized." - [it file-id asset-type asset-id library-id state] + [it file-id asset-type asset-id library-id libraries current-file-id] (s/assert #{:colors :components :typographies} asset-type) (s/assert (s/nilable ::us/uuid) asset-id) (s/assert ::us/uuid file-id) @@ -313,10 +311,10 @@ (log/info :msg "Sync file with library" :asset-type asset-type :asset-id asset-id - :file (pretty-file file-id state) - :library (pretty-file library-id state)) + :file (pretty-file file-id libraries current-file-id) + :library (pretty-file library-id libraries current-file-id)) - (let [file (wsh/get-file state file-id) + (let [file (get-in libraries [file-id :data]) components-v2 (get-in file [:options :components-v2])] (loop [containers (ctf/object-containers-seq file) changes (pcb/empty-changes it)] @@ -329,9 +327,10 @@ asset-type asset-id library-id - state container - components-v2)))) + components-v2 + libraries + current-file-id)))) changes)))) (defn generate-sync-library @@ -341,7 +340,7 @@ If an asset id is given, only shapes linked to this particular asset will be synchronized." - [it file-id asset-type asset-id library-id state] + [it file-id asset-type asset-id library-id libraries current-file-id] (s/assert #{:colors :components :typographies} asset-type) (s/assert (s/nilable ::us/uuid) asset-id) (s/assert ::us/uuid file-id) @@ -350,10 +349,10 @@ (log/info :msg "Sync local components with library" :asset-type asset-type :asset-id asset-id - :file (pretty-file file-id state) - :library (pretty-file library-id state)) + :file (pretty-file file-id libraries current-file-id) + :library (pretty-file library-id libraries current-file-id)) - (let [file (wsh/get-file state file-id) + (let [file (get-in libraries [file-id :data]) components-v2 (get-in file [:options :components-v2])] (loop [local-components (ctkl/components-seq file) changes (pcb/empty-changes it)] @@ -365,15 +364,16 @@ asset-type asset-id library-id - state (cfh/make-container local-component :component) - components-v2))) + components-v2 + libraries + current-file-id))) changes)))) (defn- generate-sync-container "Generate changes to synchronize all shapes in a particular container (a page or a component) that use assets of the given type in the given library." - [it asset-type asset-id library-id state container components-v2] + [it asset-type asset-id library-id container components-v2 libraries current-file-id] (if (cfh/page? container) (log/debug :msg "Sync page in local file" :page-id (:id container)) @@ -390,10 +390,11 @@ (generate-sync-shape asset-type changes library-id - state container shape - components-v2)) + components-v2 + libraries + current-file-id)) changes)))) (defmulti uses-assets? @@ -421,33 +422,32 @@ (defmulti generate-sync-shape "Generate changes to synchronize one shape from all assets of the given type that is using, in the given library." - (fn [asset-type _changes _library-id _state _container _shape _components-v2] asset-type)) + (fn [asset-type _changes _library-id _container _shape _components-v2 _libraries _current-file-id] asset-type)) (defmethod generate-sync-shape :components - [_ changes _library-id state container shape components-v2] + [_ changes _library-id container shape components-v2 libraries current-file-id] (let [shape-id (:id shape) - file (wsh/get-local-file-full state) - libraries (wsh/get-libraries state)] + file (get current-file-id libraries)] (generate-sync-shape-direct changes file libraries container shape-id false components-v2))) (defmethod generate-sync-shape :colors - [_ changes library-id state _ shape _] + [_ changes library-id _ shape _ libraries _] (log/debug :msg "Sync colors of shape" :shape (:name shape)) ;; Synchronize a shape that uses some colors of the library. The value of the ;; color in the library is copied to the shape. - (let [library-colors (get-assets library-id :colors state)] + (let [library-colors (get-in libraries [library-id :data :colors])] (pcb/update-shapes changes [(:id shape)] #(ctc/sync-shape-colors % library-id library-colors)))) (defmethod generate-sync-shape :typographies - [_ changes library-id state container shape _] + [_ changes library-id container shape _ libraries _] (log/debug :msg "Sync typographies of shape" :shape (:name shape)) ;; Synchronize a shape that uses some typographies of the library. The attributes ;; of the typography are copied to the shape." - (let [typographies (get-assets library-id :typographies state) + (let [typographies (get-in libraries [library-id :data :typographies]) update-node (fn [node] (if-let [typography (get typographies (:typography-ref-id node))] (merge node (dissoc typography :name :id)) @@ -455,12 +455,6 @@ :typography-ref-file)))] (generate-sync-text-shape changes shape container update-node))) -(defn- get-assets - [library-id asset-type state] - (if (= library-id (:current-file-id state)) - (get-in state [:workspace-data asset-type]) - (get-in state [:workspace-libraries library-id :data asset-type]))) - (defn- generate-sync-text-shape [changes shape container update-node] (let [old-content (:content shape) diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index 75d662313..8ad2a90be 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -12,6 +12,7 @@ [app.common.files.changes-builder :as pcb] [app.common.files.helpers :as cfh] [app.common.files.libraries-common-helpers :as cflch] + [app.common.files.libraries-helpers :as cflh] [app.common.files.shapes-helpers :as cfsh] [app.common.geom.point :as gpt] [app.common.logging :as log] @@ -29,7 +30,6 @@ [app.main.data.workspace :as-alias dw] [app.main.data.workspace.changes :as dch] [app.main.data.workspace.groups :as dwg] - [app.main.data.workspace.libraries-helpers :as dwlh] [app.main.data.workspace.notifications :as-alias dwn] [app.main.data.workspace.selection :as dws] [app.main.data.workspace.shapes :as dwsh] @@ -54,6 +54,13 @@ ;; Change this to :info :debug or :trace to debug this module, or :warn to reset to default (log/set-level! :warn) + +(defn- pretty-file + [file-id state] + (if (= file-id (:current-file-id state)) + "" + (str "<" (get-in state [:workspace-libraries file-id :name]) ">"))) + (defn- log-changes [changes file] (let [extract-change @@ -472,7 +479,7 @@ [new-component-shape new-component-shapes ; <- null in components-v2 new-main-instance-shape new-main-instance-shapes] - (dwlh/duplicate-component component new-component-id (:data library)) + (cflh/duplicate-component component new-component-id (:data library)) changes (-> (pcb/empty-changes it nil) (pcb/with-page main-instance-page) @@ -525,7 +532,7 @@ current-page (dm/get-in state [:workspace-data :pages-index page-id]) objects (wsh/lookup-page-objects state page-id) library-data (wsh/get-file state library-id) - {:keys [changes shape]} (dwlh/prepare-restore-component library-data component-id current-page it) + {:keys [changes shape]} (cflh/prepare-restore-component library-data component-id current-page it) parent-id (:parent-id shape) objects (cond-> (assoc objects (:id shape) shape) (not (nil? parent-id)) @@ -574,7 +581,7 @@ (pcb/with-objects objects)) [new-shape changes] - (dwlh/generate-instantiate-component changes + (cflh/generate-instantiate-component changes objects file-id component-id @@ -606,7 +613,7 @@ changes (-> (pcb/empty-changes it) (pcb/with-container container) (pcb/with-objects (:objects container)) - (dwlh/generate-detach-instance container libraries id))] + (cflh/generate-detach-instance container libraries id))] (rx/of (dch/commit-changes changes)))))) @@ -642,7 +649,7 @@ changes (when can-detach? (reduce (fn [changes id] - (dwlh/generate-detach-instance changes container libraries id)) + (cflh/generate-detach-instance changes container libraries id)) (-> (pcb/empty-changes it) (pcb/with-container container) (pcb/with-objects objects)) @@ -731,7 +738,7 @@ (-> (pcb/empty-changes it) (pcb/with-container container) (pcb/with-objects (:objects container)) - (dwlh/generate-sync-shape-direct file-full libraries container (:id head) false components-v2))] + (cflh/generate-sync-shape-direct file-full libraries container (:id head) false components-v2))] (log/debug :msg "SYNC-head finished" :js/rchanges (log-changes (:redo-changes changes) @@ -767,7 +774,7 @@ (-> (pcb/empty-changes it) (pcb/with-container container) (pcb/with-objects (:objects container)) - (dwlh/generate-sync-shape-direct file-full libraries container id true components-v2))] + (cflh/generate-sync-shape-direct file-full libraries container id true components-v2))] (log/debug :msg "RESET-COMPONENT finished" :js/rchanges (log-changes (:redo-changes changes) @@ -823,7 +830,7 @@ (-> (pcb/empty-changes it) (pcb/set-undo-group undo-group) (pcb/with-container container) - (dwlh/generate-sync-shape-inverse full-file libraries container id components-v2)) + (cflh/generate-sync-shape-inverse full-file libraries container id components-v2)) file-id (:component-file shape) file (wsh/get-file state file-id) @@ -947,7 +954,7 @@ inside-comp? (ctn/in-any-component? objects parent) [new-shape changes] - (dwlh/generate-instantiate-component changes + (cflh/generate-instantiate-component changes objects (:id file) id-new-component @@ -978,7 +985,7 @@ ;; We need to set the same index as the original shape (pcb/change-parent (:parent-id shape) [new-shape] index {:component-swap true :ignore-touched true}) - (dwlh/change-touched new-shape + (cflh/change-touched new-shape shape (ctn/make-container page :page) {}))] @@ -1039,7 +1046,7 @@ (watch [_ state _] (let [undo-id (js/Symbol)] (log/info :msg "COMPONENT-SWAP" - :file (dwlh/pretty-file file-id state) + :file (pretty-file file-id state) :id-new-component id-new-component :undo-id undo-id) (rx/concat @@ -1092,12 +1099,15 @@ (watch [it state _] (when (and (some? file-id) (some? library-id)) ; Prevent race conditions while navigating out of the file (log/info :msg "SYNC-FILE" - :file (dwlh/pretty-file file-id state) - :library (dwlh/pretty-file library-id state) + :file (pretty-file file-id state) + :library (pretty-file library-id state) :asset-type asset-type :asset-id asset-id :undo-group undo-group) (let [file (wsh/get-file state file-id) + libraries (wsh/get-libraries state) + current-file-id (:current-file-id state) + sync-components? (or (nil? asset-type) (= asset-type :components)) sync-colors? (or (nil? asset-type) (= asset-type :colors)) @@ -1108,22 +1118,22 @@ (-> (pcb/empty-changes it) (pcb/set-undo-group undo-group)) [(when sync-components? - (dwlh/generate-sync-library it file-id :components asset-id library-id state)) + (cflh/generate-sync-library it file-id :components asset-id library-id libraries current-file-id)) (when sync-colors? - (dwlh/generate-sync-library it file-id :colors asset-id library-id state)) + (cflh/generate-sync-library it file-id :colors asset-id library-id libraries current-file-id)) (when sync-typographies? - (dwlh/generate-sync-library it file-id :typographies asset-id library-id state))]) + (cflh/generate-sync-library it file-id :typographies asset-id library-id libraries current-file-id))]) file-changes (reduce pcb/concat-changes (-> (pcb/empty-changes it) (pcb/set-undo-group undo-group)) [(when sync-components? - (dwlh/generate-sync-file it file-id :components asset-id library-id state)) + (cflh/generate-sync-file it file-id :components asset-id library-id libraries current-file-id)) (when sync-colors? - (dwlh/generate-sync-file it file-id :colors asset-id library-id state)) + (cflh/generate-sync-file it file-id :colors asset-id library-id libraries current-file-id)) (when sync-typographies? - (dwlh/generate-sync-file it file-id :typographies asset-id library-id state))]) + (cflh/generate-sync-file it file-id :typographies asset-id library-id libraries current-file-id))]) changes (pcb/concat-changes library-changes file-changes) diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index b5b3d3a0d..38e1ec51a 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -12,6 +12,7 @@ [app.common.files.focus :as cpf] [app.common.files.helpers :as cfh] [app.common.files.libraries-common-helpers :as cflch] + [app.common.files.libraries-helpers :as cflh] [app.common.geom.point :as gpt] [app.common.geom.rect :as grc] [app.common.geom.shapes :as gsh] @@ -28,7 +29,6 @@ [app.main.data.modal :as md] [app.main.data.workspace.changes :as dch] [app.main.data.workspace.collapse :as dwc] - [app.main.data.workspace.libraries-helpers :as dwlh] [app.main.data.workspace.specialized-panel :as-alias dwsp] [app.main.data.workspace.state-helpers :as wsh] [app.main.data.workspace.undo :as dwu] @@ -435,7 +435,7 @@ (gpt/subtract (-> origin-frame :selrect gpt/point))) instantiate-component - #(dwlh/generate-instantiate-component changes + #(cflh/generate-instantiate-component changes objects file-id (:component-id component-root) @@ -448,7 +448,7 @@ {}) restore-component - #(let [restore (dwlh/prepare-restore-component changes library-data (:component-id component-root) it page delta (:id component-root) parent-id frame-id)] + #(let [restore (cflh/prepare-restore-component changes library-data (:component-id component-root) it page delta (:id component-root) parent-id frame-id)] [(:shape restore) (:changes restore)]) [_shape changes] diff --git a/frontend/src/app/main/data/workspace/state_helpers.cljs b/frontend/src/app/main/data/workspace/state_helpers.cljs index b04fa88f6..7249a1f3f 100644 --- a/frontend/src/app/main/data/workspace/state_helpers.cljs +++ b/frontend/src/app/main/data/workspace/state_helpers.cljs @@ -123,6 +123,15 @@ (get state :workspace-data) (dm/get-in state [:workspace-libraries file-id :data]))) +(defn get-file-full + "Get the data content of the given file (it may be the current file + or one library)." + [state file-id] + (if (= file-id (:current-file-id state)) + (-> (get state :workspace-file) + (assoc :data (get state :workspace-data))) + (dm/get-in state [:workspace-libraries file-id :data]))) + (defn get-libraries "Retrieve all libraries, including the local file." [state] -- Gitee From a8738b44a185be419b36fd22970afb4fac96a881 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Fri, 19 Apr 2024 15:37:42 +0200 Subject: [PATCH 0332/1266] :recycle: Merge libraries_common_helpers into libraries_helpers --- backend/src/app/features/components_v2.clj | 4 +- .../app/common/files/libraries_helpers.cljc | 94 ++++++++++++++++++- .../app/main/data/workspace/libraries.cljs | 3 +- .../app/main/data/workspace/selection.cljs | 3 +- .../test/frontend_tests/helpers/pages.cljs | 5 +- 5 files changed, 97 insertions(+), 12 deletions(-) diff --git a/backend/src/app/features/components_v2.clj b/backend/src/app/features/components_v2.clj index 34fb01f88..05cd1a084 100644 --- a/backend/src/app/features/components_v2.clj +++ b/backend/src/app/features/components_v2.clj @@ -12,7 +12,7 @@ [app.common.files.changes :as cp] [app.common.files.changes-builder :as fcb] [app.common.files.helpers :as cfh] - [app.common.files.libraries-common-helpers :as cflch] + [app.common.files.libraries-helpers :as cflh] [app.common.files.migrations :as fmg] [app.common.files.shapes-helpers :as cfsh] [app.common.files.validate :as cfv] @@ -1451,7 +1451,7 @@ (cons shape children)) [_ _ changes2] - (cflch/generate-add-component nil + (cflh/generate-add-component nil [shape] (:objects page) (:id page) diff --git a/common/src/app/common/files/libraries_helpers.cljc b/common/src/app/common/files/libraries_helpers.cljc index 0be04e5d6..37d893b12 100644 --- a/common/src/app/common/files/libraries_helpers.cljc +++ b/common/src/app/common/files/libraries_helpers.cljc @@ -25,8 +25,9 @@ [app.common.types.shape-tree :as ctst] [app.common.types.shape.layout :as ctl] [app.common.types.typography :as cty] - [cljs.spec.alpha :as s] - [clojure.set :as set])) + [app.common.uuid :as uuid] + [clojure.set :as set] + [clojure.spec.alpha :as s])) ;; Change this to :info :debug or :trace to debug this module, or :warn to reset to default (log/set-level! :warn) @@ -1662,3 +1663,92 @@ (if (cfh/page? container) (assoc change :page-id (:id container)) (assoc change :component-id (:id container)))) + +(defn generate-add-component-changes + [changes root objects file-id page-id components-v2] + (let [name (:name root) + [path name] (cfh/parse-path-name name) + + [root-shape new-shapes updated-shapes] + (if-not components-v2 + (ctn/make-component-shape root objects file-id components-v2) + (ctn/convert-shape-in-component root objects file-id)) + + changes (-> changes + (pcb/add-component (:id root-shape) + path + name + new-shapes + updated-shapes + (:id root) + page-id))] + [root-shape changes])) + +(defn generate-add-component + "If there is exactly one id, and it's a frame (or a group in v1), and not already a component, + use it as root. Otherwise, create a frame (v2) or group (v1) that contains all ids. Then, make a + component with it, and link all shapes to their corresponding one in the component." + [it shapes objects page-id file-id components-v2 prepare-create-group prepare-create-board] + + (let [changes (pcb/empty-changes it page-id) + shapes-count (count shapes) + first-shape (first shapes) + + from-singe-frame? + (and (= 1 shapes-count) + (cfh/frame-shape? first-shape)) + + [root changes old-root-ids] + (if (and (= shapes-count 1) + (or (and (cfh/group-shape? first-shape) + (not components-v2)) + (cfh/frame-shape? first-shape)) + (not (ctk/instance-head? first-shape))) + [first-shape + (-> (pcb/empty-changes it page-id) + (pcb/with-objects objects)) + (:shapes first-shape)] + + (let [root-name (if (= 1 shapes-count) + (:name first-shape) + "Component 1") + + shape-ids (into (d/ordered-set) (map :id) shapes) + + [root changes] + (if-not components-v2 + (prepare-create-group it ; These functions needs to be passed as argument + objects ; to avoid a circular dependence + page-id + shapes + root-name + (not (ctk/instance-head? first-shape))) + (prepare-create-board changes + (uuid/next) + (:parent-id first-shape) + objects + shape-ids + nil + root-name + true))] + + [root changes shape-ids])) + + changes + (cond-> changes + (not from-singe-frame?) + (pcb/update-shapes + (:shapes root) + (fn [shape] + (assoc shape :constraints-h :scale :constraints-v :scale)))) + + objects' (assoc objects (:id root) root) + + [root-shape changes] (generate-add-component-changes changes root objects' file-id page-id components-v2) + + changes (pcb/update-shapes changes + old-root-ids + #(dissoc % :component-root) + [:component-root])] + + [root (:id root-shape) changes])) diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index 8ad2a90be..9e944f9f4 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -11,7 +11,6 @@ [app.common.files.changes :as ch] [app.common.files.changes-builder :as pcb] [app.common.files.helpers :as cfh] - [app.common.files.libraries-common-helpers :as cflch] [app.common.files.libraries-helpers :as cflh] [app.common.files.shapes-helpers :as cfsh] [app.common.geom.point :as gpt] @@ -352,7 +351,7 @@ parents (into #{} (map :parent-id) shapes)] (when-not (empty? shapes) (let [[root _ changes] - (cflch/generate-add-component it shapes objects page-id file-id components-v2 + (cflh/generate-add-component it shapes objects page-id file-id components-v2 dwg/prepare-create-group cfsh/prepare-create-artboard-from-selection)] (when-not (empty? (:redo-changes changes)) diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index 38e1ec51a..048479e5e 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -11,7 +11,6 @@ [app.common.files.changes-builder :as pcb] [app.common.files.focus :as cpf] [app.common.files.helpers :as cfh] - [app.common.files.libraries-common-helpers :as cflch] [app.common.files.libraries-helpers :as cflh] [app.common.geom.point :as gpt] [app.common.geom.rect :as grc] @@ -498,7 +497,7 @@ regenerate-component (fn [changes shape] (let [components-v2 (dm/get-in library-data [:options :components-v2]) - [_ changes] (cflch/generate-add-component-changes changes shape objects file-id (:id page) components-v2)] + [_ changes] (cflh/generate-add-component-changes changes shape objects file-id (:id page) components-v2)] changes)) new-obj diff --git a/frontend/test/frontend_tests/helpers/pages.cljs b/frontend/test/frontend_tests/helpers/pages.cljs index 8f28aebb4..cb5a080cc 100644 --- a/frontend/test/frontend_tests/helpers/pages.cljs +++ b/frontend/test/frontend_tests/helpers/pages.cljs @@ -6,7 +6,6 @@ (ns frontend-tests.helpers.pages (:require - [app.common.data :as d] [app.common.files.changes :as cp] [app.common.files.changes-builder :as pcb] [app.common.files.helpers :as cfh] @@ -17,8 +16,6 @@ [app.common.uuid :as uuid] [app.main.data.workspace.groups :as dwg] [app.main.data.workspace.layout :as layout] - [app.main.data.workspace.libraries-helpers :as dwlh] - [app.main.data.workspace.shapes :as dwsh] [app.main.data.workspace.state-helpers :as wsh])) ;; ---- Helpers to manage pages and objects @@ -161,7 +158,7 @@ (pcb/with-objects objects)) [new-shape changes] - (dwlh/generate-instantiate-component changes + (cflh/generate-instantiate-component changes objects file-id component-id -- Gitee From c33d4ff3e28bf94413b21d5eb0162e0a3bf89897 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Thu, 18 Apr 2024 17:36:07 +0200 Subject: [PATCH 0333/1266] :sparkles: Add user login front-end integration test --- frontend/playwright/example.spec.js | 2 +- .../get-built-in-templates-empty.json | 1 + .../get-font-variants-empty.json | 1 + .../logged-in-user/get-profile-logged-in.json | 23 ++++++++ .../get-profiles-for-file-comments-empty.json | 1 + .../logged-in-user/get-projects-default.json | 12 ++++ .../get-team-members-your-penpot.json | 16 ++++++ .../get-team-recent-files-empty.json | 1 + .../get-team-users-single-user.json | 1 + .../logged-in-user/get-teams-default.json | 25 +++++++++ .../get-unread-comment-threads-empty.json | 1 + .../login-with-password-success.json | 24 ++++++++ frontend/playwright/helpers/index.js | 9 +++ frontend/playwright/login.spec.js | 56 +++++++++++++++++++ 14 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 frontend/playwright/fixtures/logged-in-user/get-built-in-templates-empty.json create mode 100644 frontend/playwright/fixtures/logged-in-user/get-font-variants-empty.json create mode 100644 frontend/playwright/fixtures/logged-in-user/get-profile-logged-in.json create mode 100644 frontend/playwright/fixtures/logged-in-user/get-profiles-for-file-comments-empty.json create mode 100644 frontend/playwright/fixtures/logged-in-user/get-projects-default.json create mode 100644 frontend/playwright/fixtures/logged-in-user/get-team-members-your-penpot.json create mode 100644 frontend/playwright/fixtures/logged-in-user/get-team-recent-files-empty.json create mode 100644 frontend/playwright/fixtures/logged-in-user/get-team-users-single-user.json create mode 100644 frontend/playwright/fixtures/logged-in-user/get-teams-default.json create mode 100644 frontend/playwright/fixtures/logged-in-user/get-unread-comment-threads-empty.json create mode 100644 frontend/playwright/fixtures/logged-in-user/login-with-password-success.json create mode 100644 frontend/playwright/helpers/index.js create mode 100644 frontend/playwright/login.spec.js diff --git a/frontend/playwright/example.spec.js b/frontend/playwright/example.spec.js index 1c315a71e..f2450fa36 100644 --- a/frontend/playwright/example.spec.js +++ b/frontend/playwright/example.spec.js @@ -1,6 +1,6 @@ import { test, expect } from "@playwright/test"; -test("has title", async ({ page }) => { +test("Has title", async ({ page }) => { await page.route("**/api/rpc/command/get-profile", (route) => { route.fulfill({ status: 200, diff --git a/frontend/playwright/fixtures/logged-in-user/get-built-in-templates-empty.json b/frontend/playwright/fixtures/logged-in-user/get-built-in-templates-empty.json new file mode 100644 index 000000000..0637a088a --- /dev/null +++ b/frontend/playwright/fixtures/logged-in-user/get-built-in-templates-empty.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/frontend/playwright/fixtures/logged-in-user/get-font-variants-empty.json b/frontend/playwright/fixtures/logged-in-user/get-font-variants-empty.json new file mode 100644 index 000000000..0637a088a --- /dev/null +++ b/frontend/playwright/fixtures/logged-in-user/get-font-variants-empty.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/frontend/playwright/fixtures/logged-in-user/get-profile-logged-in.json b/frontend/playwright/fixtures/logged-in-user/get-profile-logged-in.json new file mode 100644 index 000000000..8c1ae192b --- /dev/null +++ b/frontend/playwright/fixtures/logged-in-user/get-profile-logged-in.json @@ -0,0 +1,23 @@ +{ + "~:email": "foo@example.com", + "~:is-demo": false, + "~:auth-backend": "penpot", + "~:fullname": "Princesa Leia", + "~:modified-at": "~m1713533116365", + "~:is-active": true, + "~:default-project-id": "~uc7ce0794-0992-8105-8004-38e630f7920b", + "~:id": "~uc7ce0794-0992-8105-8004-38e630f29a9b", + "~:is-muted": false, + "~:default-team-id": "~uc7ce0794-0992-8105-8004-38e630f40f6d", + "~:created-at": "~m1713533116365", + "~:is-blocked": false, + "~:props": { + "~:nudge": { + "~:big": 10, + "~:small": 1 + }, + "~:v2-info-shown": true, + "~:viewed-tutorial?": false, + "~:viewed-walkthrough?": false + } +} \ No newline at end of file diff --git a/frontend/playwright/fixtures/logged-in-user/get-profiles-for-file-comments-empty.json b/frontend/playwright/fixtures/logged-in-user/get-profiles-for-file-comments-empty.json new file mode 100644 index 000000000..0637a088a --- /dev/null +++ b/frontend/playwright/fixtures/logged-in-user/get-profiles-for-file-comments-empty.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/frontend/playwright/fixtures/logged-in-user/get-projects-default.json b/frontend/playwright/fixtures/logged-in-user/get-projects-default.json new file mode 100644 index 000000000..0d9313b1c --- /dev/null +++ b/frontend/playwright/fixtures/logged-in-user/get-projects-default.json @@ -0,0 +1,12 @@ +[ + { + "~:id": "~uc7ce0794-0992-8105-8004-38e630f7920b", + "~:team-id": "~uc7ce0794-0992-8105-8004-38e630f40f6d", + "~:created-at": "~m1713533116382", + "~:modified-at": "~m1713533116382", + "~:is-default": true, + "~:name": "Drafts", + "~:is-pinned": false, + "~:count": 0 + } +] \ No newline at end of file diff --git a/frontend/playwright/fixtures/logged-in-user/get-team-members-your-penpot.json b/frontend/playwright/fixtures/logged-in-user/get-team-members-your-penpot.json new file mode 100644 index 000000000..3a0aa3ce7 --- /dev/null +++ b/frontend/playwright/fixtures/logged-in-user/get-team-members-your-penpot.json @@ -0,0 +1,16 @@ +[ + { + "~:is-admin": true, + "~:email": "foo@example.com", + "~:team-id": "~uc7ce0794-0992-8105-8004-38e630f40f6d", + "~:name": "Princesa Leia", + "~:fullname": "Princesa Leia", + "~:is-owner": true, + "~:modified-at": "~m1713533116388", + "~:can-edit": true, + "~:is-active": true, + "~:id": "~uc7ce0794-0992-8105-8004-38e630f29a9b", + "~:profile-id": "~uc7ce0794-0992-8105-8004-38e630f29a9b", + "~:created-at": "~m1713533116388" + } +] \ No newline at end of file diff --git a/frontend/playwright/fixtures/logged-in-user/get-team-recent-files-empty.json b/frontend/playwright/fixtures/logged-in-user/get-team-recent-files-empty.json new file mode 100644 index 000000000..0637a088a --- /dev/null +++ b/frontend/playwright/fixtures/logged-in-user/get-team-recent-files-empty.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/frontend/playwright/fixtures/logged-in-user/get-team-users-single-user.json b/frontend/playwright/fixtures/logged-in-user/get-team-users-single-user.json new file mode 100644 index 000000000..eff03c1de --- /dev/null +++ b/frontend/playwright/fixtures/logged-in-user/get-team-users-single-user.json @@ -0,0 +1 @@ +[{"~:id":"~uc7ce0794-0992-8105-8004-38e630f29a9b","~:fullname":"Princesa Leia"}] \ No newline at end of file diff --git a/frontend/playwright/fixtures/logged-in-user/get-teams-default.json b/frontend/playwright/fixtures/logged-in-user/get-teams-default.json new file mode 100644 index 000000000..bf8279c56 --- /dev/null +++ b/frontend/playwright/fixtures/logged-in-user/get-teams-default.json @@ -0,0 +1,25 @@ +[ + { + "~:features": { + "~#set": [ + "layout/grid", + "styles/v2", + "fdata/pointer-map", + "fdata/objects-map", + "components/v2", + "fdata/shape-data-type" + ] + }, + "~:permissions": { + "~:type": "~:membership", + "~:is-owner": true, + "~:is-admin": true, + "~:can-edit": true + }, + "~:name": "Default", + "~:modified-at": "~m1713533116375", + "~:id": "~uc7ce0794-0992-8105-8004-38e630f40f6d", + "~:created-at": "~m1713533116375", + "~:is-default": true + } +] \ No newline at end of file diff --git a/frontend/playwright/fixtures/logged-in-user/get-unread-comment-threads-empty.json b/frontend/playwright/fixtures/logged-in-user/get-unread-comment-threads-empty.json new file mode 100644 index 000000000..0637a088a --- /dev/null +++ b/frontend/playwright/fixtures/logged-in-user/get-unread-comment-threads-empty.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/frontend/playwright/fixtures/logged-in-user/login-with-password-success.json b/frontend/playwright/fixtures/logged-in-user/login-with-password-success.json new file mode 100644 index 000000000..e4c1b1354 --- /dev/null +++ b/frontend/playwright/fixtures/logged-in-user/login-with-password-success.json @@ -0,0 +1,24 @@ +{ + "~:is-admin": false, + "~:email": "foo@example.com", + "~:is-demo": false, + "~:auth-backend": "penpot", + "~:fullname": "Princesa Leia", + "~:modified-at": "~m1713533116365", + "~:is-active": true, + "~:default-project-id": "~uc7ce0794-0992-8105-8004-38e630f7920b", + "~:id": "~uc7ce0794-0992-8105-8004-38e630f29a9b", + "~:is-muted": false, + "~:default-team-id": "~uc7ce0794-0992-8105-8004-38e630f40f6d", + "~:created-at": "~m1713533116365", + "~:is-blocked": false, + "~:props": { + "~:nudge": { + "~:big": 10, + "~:small": 1 + }, + "~:v2-info-shown": true, + "~:viewed-tutorial?": false, + "~:viewed-walkthrough?": false + } +} \ No newline at end of file diff --git a/frontend/playwright/helpers/index.js b/frontend/playwright/helpers/index.js new file mode 100644 index 000000000..50f7e5487 --- /dev/null +++ b/frontend/playwright/helpers/index.js @@ -0,0 +1,9 @@ +export const interceptRPC = async (page, path, jsonFilename) => { + await page.route(`**/api/rpc/command/${path}`, (route) => { + route.fulfill({ + status: 200, + contentType: "application/transit+json", + path: `playwright/fixtures/${jsonFilename}`, + }); + }); +}; diff --git a/frontend/playwright/login.spec.js b/frontend/playwright/login.spec.js new file mode 100644 index 000000000..5463a74f2 --- /dev/null +++ b/frontend/playwright/login.spec.js @@ -0,0 +1,56 @@ +import { test, expect } from "@playwright/test"; +import { interceptRPC } from "./helpers"; + +const setupLoggedOutUser = async (page) => { + await interceptRPC(page, "get-profile", "get-profile-anonymous.json"); + await interceptRPC(page, "login-with-password", "logged-in-user/login-with-password-success.json"); +}; + +// TODO: maybe Playwright's fixtures are the right way to do this? +const setupDashboardUser = async (page) => { + await interceptRPC(page, "get-profile", "logged-in-user/get-profile-logged-in.json"); + await interceptRPC(page, "get-teams", "logged-in-user/get-teams-default.json"); + await interceptRPC(page, "get-font-variants?team-id=*", "logged-in-user/get-font-variants-empty.json"); + await interceptRPC(page, "get-projects?team-id=*", "logged-in-user/get-projects-default.json"); + await interceptRPC(page, "get-team-members?team-id=*", "logged-in-user/get-team-members-your-penpot.json"); + await interceptRPC(page, "get-team-users?team-id=*", "logged-in-user/get-team-users-single-user.json"); + await interceptRPC( + page, + "get-unread-comment-threads?team-id=*", + "logged-in-user/get-team-users-single-user.json", + ); + await interceptRPC( + page, + "get-team-recent-files?team-id=*", + "logged-in-user/get-team-recent-files-empty.json", + ); + await interceptRPC( + page, + "get-profiles-for-file-comments", + "logged-in-user/get-profiles-for-file-comments-empty.json", + ); +}; + +test("Shows login page when going to index and user is logged out", async ({ page }) => { + setupLoggedOutUser(page); + + await page.goto("/"); + + await expect(page).toHaveURL(/auth\/login$/); + await expect(page.getByText("Log into my account")).toBeVisible(); +}); + +test("User logs in by filling the login form", async ({ page }) => { + setupLoggedOutUser(page); + + await page.goto("/#/auth/login"); + + setupDashboardUser(page); + + await page.getByLabel("Email").fill("foo@example.com"); + await page.getByLabel("Password").fill("loremipsum"); + + await page.getByRole("button", { name: "Login" }).click(); + + await expect(page).toHaveURL(/dashboard/); +}); -- Gitee From c6fabc349ea3d6f4481b7dc7128a53eed1f0a682 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Mon, 22 Apr 2024 10:46:35 +0200 Subject: [PATCH 0334/1266] :bug: Fix swap-slot is removed on copy-paste of a chained copy --- frontend/src/app/main/data/workspace/selection.cljs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index 8ce2cfe1f..b233f561d 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -486,6 +486,7 @@ duplicating-component? (or duplicating-component? (ctk/instance-head? obj)) is-component-main? (ctk/main-instance? obj) subinstance-head? (ctk/subinstance-head? obj) + instance-root? (ctk/instance-root? obj) into-component? (and duplicating-component? (ctn/in-any-component? objects parent)) @@ -508,7 +509,9 @@ :parent-id parent-id :frame-id frame-id) - (cond-> (and subinstance-head? remove-swap-slot?) + (cond-> (and (not instance-root?) + subinstance-head? + remove-swap-slot?) (ctk/remove-swap-slot)) (dissoc :shapes @@ -581,8 +584,9 @@ true (and remove-swap-slot? ;; only remove swap slot of children when the current shape - ;; is not a subinstance head - (not subinstance-head?)))) + ;; is not a subinstance head nor a instance root + (not subinstance-head?) + (not instance-root?)))) changes (map (d/getf objects) (:shapes obj))))))) -- Gitee From 2a752e36250ebc288a74b80d235dbc9afba699d2 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Mon, 22 Apr 2024 11:22:25 +0200 Subject: [PATCH 0335/1266] :bug: swap slot is not copied on copy-paste of a main --- common/src/app/common/types/container.cljc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/common/src/app/common/types/container.cljc b/common/src/app/common/types/container.cljc index b50c5058a..d038ca50c 100644 --- a/common/src/app/common/types/container.cljc +++ b/common/src/app/common/types/container.cljc @@ -386,7 +386,8 @@ (fn [new-shape original-shape] (let [new-name (:name new-shape) root? (or (ctk/instance-root? original-shape) ; If shape is inside a component (not components-v2) - (nil? (:parent-id original-shape)))] ; we detect it by having no parent) + (nil? (:parent-id original-shape))) ; we detect it by having no parent) + swap-slot (ctk/get-swap-slot original-shape)] (when root? (vswap! unames conj new-name)) @@ -398,6 +399,9 @@ (-> (gsh/move delta) (dissoc :touched)) + (some? swap-slot) + (assoc :touched #{(ctk/build-swap-slot-group swap-slot)}) + (and main-instance? root?) (assoc :main-instance true) -- Gitee From 908229b7a8f9da0772fe7a73ef7d83aecc234e57 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Mon, 22 Apr 2024 13:04:48 +0200 Subject: [PATCH 0336/1266] :bug: Fix librares and templates links --- frontend/src/app/main/ui/dashboard/templates.cljs | 2 +- frontend/src/app/main/ui/releases/v1_9.cljs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/main/ui/dashboard/templates.cljs b/frontend/src/app/main/ui/dashboard/templates.cljs index f7a42454f..8927ff053 100644 --- a/frontend/src/app/main/ui/dashboard/templates.cljs +++ b/frontend/src/app/main/ui/dashboard/templates.cljs @@ -155,7 +155,7 @@ [:div {:class (stl/css :img-container)} [:a {:id id :tab-index (if (or (not is-visible) collapsed) "-1" "0") - :href "https://penpot.app/libraries-templates.html" + :href "https://penpot.app/libraries-templates" :target "_blank" :on-click on-click :on-key-down on-key-down} diff --git a/frontend/src/app/main/ui/releases/v1_9.cljs b/frontend/src/app/main/ui/releases/v1_9.cljs index e5dda41cc..6a8ddfba8 100644 --- a/frontend/src/app/main/ui/releases/v1_9.cljs +++ b/frontend/src/app/main/ui/releases/v1_9.cljs @@ -99,7 +99,7 @@ [:h2 "Libraries & templates"]] [:div.modal-content [:p "We’ve created a new space on Penpot where you can share your libraries and templates and download the ones you like. Material Design, Cocomaterial or Penpot’s Design System are among them (and a lot more to come!)."] - [:p [:a {:alt "Explore libraries & templates" :target "_blank" :href "https://penpot.app/libraries-templates.html"} "Explore libraries & templates"]]] + [:p [:a {:alt "Explore libraries & templates" :target "_blank" :href "https://penpot.app/libraries-templates"} "Explore libraries & templates"]]] [:div.modal-navigation [:button.btn-secondary {:on-click finish} "Start!"] [:& c/navigation-bullets -- Gitee From 17fb5283cc953eebe9e25ab8041855934b148b61 Mon Sep 17 00:00:00 2001 From: AzazelN28 Date: Mon, 22 Apr 2024 12:11:07 +0200 Subject: [PATCH 0337/1266] :paperclip: Add provider to validate uri --- backend/src/app/auth/oidc.clj | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/app/auth/oidc.clj b/backend/src/app/auth/oidc.clj index 34e2cee57..efdf568e2 100644 --- a/backend/src/app/auth/oidc.clj +++ b/backend/src/app/auth/oidc.clj @@ -540,6 +540,7 @@ token (tokens/generate (::setup/props cfg) info) params (d/without-nils {:token token + :provider (:provider (:path-params request)) :fullname (:fullname info)}) uri (-> (u/uri (cf/get :public-uri)) (assoc :path "/#/auth/register/validate") -- Gitee From b667f1bb2c883cad6653d2cf73ce6f62f6bd38c4 Mon Sep 17 00:00:00 2001 From: Jordi Sala Morales Date: Mon, 22 Apr 2024 08:23:45 +0000 Subject: [PATCH 0338/1266] :bug: Fix adding pages with customized options --- frontend/src/app/libs/file_builder.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/libs/file_builder.cljs b/frontend/src/app/libs/file_builder.cljs index 0f0c3d069..4b09f795e 100644 --- a/frontend/src/app/libs/file_builder.cljs +++ b/frontend/src/app/libs/file_builder.cljs @@ -144,7 +144,7 @@ (str (:current-page-id file))) (addPage [_ name options] - (set! file (fb/add-page file {:name name :options options})) + (set! file (fb/add-page file {:name name :options (parse-data options)})) (str (:current-page-id file))) (closePage [_] -- Gitee From 00de89197ebd65c1682f55568098cee8c5e7ad0b Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 22 Apr 2024 15:40:01 +0200 Subject: [PATCH 0339/1266] :sparkles: Add write apis to the plugins --- common/src/app/common/text.cljc | 47 +++++++++++ frontend/src/app/plugins/api.cljs | 27 ++++++- frontend/src/app/plugins/events.cljs | 2 - frontend/src/app/plugins/shape.cljs | 113 +++++++++++++++++++++------ 4 files changed, 160 insertions(+), 29 deletions(-) diff --git a/common/src/app/common/text.cljc b/common/src/app/common/text.cljc index 8b301d2d4..b164633a8 100644 --- a/common/src/app/common/text.cljc +++ b/common/src/app/common/text.cljc @@ -381,6 +381,53 @@ (-> (rec-style-text-map [] node {}) reverse))) +(defn content->text + "Given a root node of a text content extracts the texts with its associated styles" + [content] + (letfn [(add-node [acc node] + (cond + (is-paragraph-node? node) + (conj acc []) + + (is-text-node? node) + (let [i (dec (count acc))] + (update acc i conj (:text node))) + + :else + acc))] + (->> (node-seq content) + (reduce add-node []) + (map #(str/join "" %)) + (str/join "\n")))) + +(defn change-text + "Changes the content of the text shape to use the text as argument. Will use the styles of the + first paragraph and text that is present in the shape (and override the rest)" + [shape text] + (let [content (:content shape) + + paragraph-style (select-keys (->> content (node-seq is-paragraph-node?) first) text-all-attrs) + text-style (select-keys (->> content (node-seq is-text-node?) first) text-all-attrs) + + paragraph-texts (str/split text "\n") + + paragraphs + (->> paragraph-texts + (mapv + (fn [pt] + (merge + paragraph-style + {:type "paragraph" + :children [(merge {:text pt} text-style)]})))) + + new-content + {:type "root" + :children + [{:type "paragraph-set" + :children paragraphs}]}] + + (assoc shape :content new-content))) + (defn index-content "Adds a property `$id` that identifies the current node inside" ([content] diff --git a/frontend/src/app/plugins/api.cljs b/frontend/src/app/plugins/api.cljs index 74efdb66e..51ed5155c 100644 --- a/frontend/src/app/plugins/api.cljs +++ b/frontend/src/app/plugins/api.cljs @@ -8,8 +8,11 @@ "RPC for plugins runtime." (:require [app.common.data.macros :as dm] + [app.common.files.changes-builder :as cb] [app.common.record :as cr] + [app.common.types.shape :as cts] [app.common.uuid :as uuid] + [app.main.data.workspace.changes :as ch] [app.main.store :as st] [app.plugins.events :as events] [app.plugins.file :as file] @@ -37,8 +40,9 @@ (getPage [_] - (let [page-id (:current-page-id @st/state)] - (page/data->page-proxy (dm/get-in @st/state [:workspace-data :pages-index page-id])))) + (let [page-id (:current-page-id @st/state) + page (dm/get-in @st/state [:workspace-data :pages-index page-id])] + (page/data->page-proxy page))) (getSelected [_] @@ -64,11 +68,26 @@ (let [theme (get-in @st/state [:profile :theme])] (if (or (not theme) (= theme "default")) "dark" - (get-in @st/state [:profile :theme]))))) + (get-in @st/state [:profile :theme])))) + + (createRectangle + [_] + (let [page-id (:current-page-id @st/state) + page (dm/get-in @st/state [:workspace-data :pages-index page-id]) + shape (cts/setup-shape {:type :rect + :x 0 :y 0 :width 100 :height 100}) + changes + (-> (cb/empty-changes) + (cb/with-page page) + (cb/with-objects (:objects page)) + (cb/add-object shape))] + (st/emit! (ch/commit-changes changes)) + (shape/data->shape-proxy shape)))) (defn create-context [] (cr/add-properties! (PenpotContext.) {:name "root" :get #(.getRoot ^js %)} - {:name "currentPage" :get #(.getPage ^js %)})) + {:name "currentPage" :get #(.getPage ^js %)} + {:name "selection" :get #(.getSelectedShapes ^js %)})) diff --git a/frontend/src/app/plugins/events.cljs b/frontend/src/app/plugins/events.cljs index ae1d17bd0..6963174ab 100644 --- a/frontend/src/app/plugins/events.cljs +++ b/frontend/src/app/plugins/events.cljs @@ -53,12 +53,10 @@ "dark" new-theme)))) - (defmethod handle-state-change :default [_ _ _] ::not-changed) - (defn add-listener [type callback] (let [key (js/Symbol) diff --git a/frontend/src/app/plugins/shape.cljs b/frontend/src/app/plugins/shape.cljs index 2ff971fe5..8a7aea836 100644 --- a/frontend/src/app/plugins/shape.cljs +++ b/frontend/src/app/plugins/shape.cljs @@ -7,8 +7,12 @@ (ns app.plugins.shape "RPC for plugins runtime." (:require + [app.common.data :as d] [app.common.data.macros :as dm] + [app.common.files.helpers :as cfh] [app.common.record :as crc] + [app.common.text :as txt] + [app.main.data.workspace :as udw] [app.main.data.workspace.changes :as dwc] [app.main.store :as st] [app.plugins.utils :refer [get-data get-data-fn]] @@ -18,24 +22,51 @@ (defn- make-fills [fills] - ;; TODO: Transform explicitly? - (apply array - (->> fills - (map #(clj->js % {:keyword-fn (fn [k] (str/camel (name k)))}))))) + (.freeze + js/Object + (apply array + (->> fills + ;; TODO: Transform explicitly instead of cljs->js? + (map #(clj->js % {:keyword-fn (fn [k] (str/camel (name k)))})))))) + +(defn- make-strokes + [strokes] + (.freeze + js/Object + (apply array + (->> strokes + ;; TODO: Transform explicitly instead of cljs->js? + (map #(clj->js % {:keyword-fn (fn [k] (str/camel (name k)))})))))) (defn- locate-shape [shape-id] (let [page-id (:current-page-id @st/state)] (dm/get-in @st/state [:workspace-data :pages-index page-id :objects shape-id]))) -(deftype ShapeProxy [#_:clj-kondo/ignore _data] +(defn- get-state + ([self attr] + (let [id (get-data self :id) + page-id (d/nilv (get-data self :page-id) (:current-page-id @st/state))] + (dm/get-in @st/state [:workspace-data :pages-index page-id :objects id attr]))) + ([self attr mapfn] + (-> (get-state self attr) + (mapfn)))) + +(deftype ShapeProxy [^:mutable #_:clj-kondo/ignore _data] Object (getChildren [self] - (apply array (->> (get-data self :shapes) + (apply array (->> (get-state self :shapes) (map locate-shape) (map data->shape-proxy)))) + (resize + [self width height] + + (let [id (get-data self :id)] + (st/emit! (udw/update-dimensions [id] :width width) + (udw/update-dimensions [id] :height height)))) + (clone [_] (.log js/console (clj->js _data))) (delete [_] (.log js/console (clj->js _data))) (appendChild [_] (.log js/console (clj->js _data)))) @@ -48,25 +79,61 @@ (defn data->shape-proxy [data] - (crc/add-properties! - (ShapeProxy. data) - {:name "_data" - :enumerable false} + (-> (ShapeProxy. data) + (crc/add-properties! + {:name "_data" + :enumerable false} + + {:name "id" + :get (get-data-fn :id str)} + + {:name "type" + :get (get-data-fn :type)} + + {:name "x" + :get #(get-state % :x) + :set + (fn [self value] + (let [id (get-data self :id)] + (st/emit! (udw/update-position id {:x value}))))} + + {:name "y" + :get #(get-state % :y) + :set + (fn [self value] + (let [id (get-data self :id)] + (st/emit! (udw/update-position id {:y value}))))} + + {:name "width" + :get #(get-state % :width)} + + {:name "height" + :get #(get-state % :height)} + + {:name "name" + :get #(get-state % :name) + :set (fn [self value] + (let [id (get-data self :id)] + (st/emit! (dwc/update-shapes [id] #(assoc % :name value)))))} - {:name "id" - :get (get-data-fn :id str)} + {:name "children" + :get #(.getChildren ^js %)} - {:name "name" - :get (get-data-fn :name) - :set (fn [self value] - (let [id (get-data self :id)] - (st/emit! (dwc/update-shapes [id] #(assoc % :name value)))))} + {:name "fills" + :get #(get-state % :fills make-fills) + ;;:set (fn [self value] (.log js/console self value)) + } - {:name "children" - :get #(.getChildren ^js %)} + {:name "strokes" + :get #(get-state % :strokes make-strokes) + ;;:set (fn [self value] (.log js/console self value)) + }) - {:name "fills" - :get (get-data-fn :fills make-fills) - ;;:set (fn [self value] (.log js/console self value)) - })) + (cond-> (cfh/text-shape? data) + (crc/add-properties! + {:name "characters" + :get #(get-state % :content txt/content->text) + :set (fn [self value] + (let [id (get-data self :id)] + (st/emit! (dwc/update-shapes [id] #(txt/change-text % value)))))})))) -- Gitee From 0cb2e6d07dc09b5728fb81a030b3b837c5f79d2c Mon Sep 17 00:00:00 2001 From: Jordi Sala Morales Date: Tue, 23 Apr 2024 07:40:16 +0000 Subject: [PATCH 0340/1266] :bug: Fix default features for files exported with penpot lib Avoid having false as features, since it should be an array. --- frontend/src/app/libs/file_builder.cljs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/libs/file_builder.cljs b/frontend/src/app/libs/file_builder.cljs index 4b09f795e..ea046e255 100644 --- a/frontend/src/app/libs/file_builder.cljs +++ b/frontend/src/app/libs/file_builder.cljs @@ -7,6 +7,7 @@ (ns app.libs.file-builder (:require [app.common.data :as d] + [app.common.features :as cfeat] [app.common.files.builder :as fb] [app.common.media :as cm] [app.common.types.components-list :as ctkl] @@ -73,7 +74,7 @@ manifest-stream (->> files-stream - (rx/map #(e/create-manifest (uuid/next) (:id file) :all % false)) + (rx/map #(e/create-manifest (uuid/next) (:id file) :all % cfeat/default-features)) (rx/map (fn [a] (vector "manifest.json" a)))) -- Gitee From 7c80c605d1dc27134c9dd7df3765f36691bc8ee6 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Tue, 23 Apr 2024 11:25:18 +0200 Subject: [PATCH 0341/1266] :bug: Fix background color on scrollbar for firefox --- frontend/resources/styles/common/refactor/basic-rules.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frontend/resources/styles/common/refactor/basic-rules.scss b/frontend/resources/styles/common/refactor/basic-rules.scss index f057974d0..c6141e431 100644 --- a/frontend/resources/styles/common/refactor/basic-rules.scss +++ b/frontend/resources/styles/common/refactor/basic-rules.scss @@ -6,6 +6,10 @@ // SCROLLBAR .new-scrollbar { + scrollbar-color: rgba(170, 181, 186, 0.3) transparent; + &:hover { + scrollbar-color: rgba(170, 181, 186, 0.7) transparent; + } ::-webkit-scrollbar { background-color: transparent; cursor: pointer; -- Gitee From 6fbdc4ff0788e8c225d14bbd6acea8c1c2663342 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 24 Apr 2024 10:25:47 +0200 Subject: [PATCH 0342/1266] :bug: Fix problem activating feature --- frontend/src/features.cljs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/frontend/src/features.cljs b/frontend/src/features.cljs index 5cf4f0488..5b111096f 100644 --- a/frontend/src/features.cljs +++ b/frontend/src/features.cljs @@ -26,8 +26,7 @@ (clj->js (features/get-team-enabled-features @st/state))) (defn ^:export plugins [] - (when (not (features/active-feature? @st/state "plugins/runtime")) - (plugins/init!)) - (tm/schedule-on-idle #(st/emit! (features/toggle-feature "plugins/runtime"))) + (st/emit! (features/enable-feature "plugins/runtime")) + (plugins/init!) nil) -- Gitee From 3c842d2b810371d69a4e3a8a710167c491d199e7 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Wed, 24 Apr 2024 13:17:57 +0200 Subject: [PATCH 0343/1266] :sparkles: Add exception page audit log event --- frontend/src/app/main/ui.cljs | 2 +- frontend/src/app/main/ui/static.cljs | 31 +++++++++++++++++----------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/frontend/src/app/main/ui.cljs b/frontend/src/app/main/ui.cljs index 9c7e3110c..7b2fb0296 100644 --- a/frontend/src/app/main/ui.cljs +++ b/frontend/src/app/main/ui.cljs @@ -170,7 +170,7 @@ [:& (mf/provider ctx/current-route) {:value route} [:& (mf/provider ctx/current-profile) {:value profile} (if edata - [:& static/exception-page {:data edata}] + [:& static/exception-page {:data edata :route route}] [:* [:& msgs/notifications-hub] (when route diff --git a/frontend/src/app/main/ui/static.cljs b/frontend/src/app/main/ui/static.cljs index 54b02f50b..5a0b0a11a 100644 --- a/frontend/src/app/main/ui/static.cljs +++ b/frontend/src/app/main/ui/static.cljs @@ -9,6 +9,8 @@ (:require [app.common.data :as d] [app.common.pprint :as pp] + [app.common.uri :as u] + [app.main.data.events :as ev] [app.main.store :as st] [app.main.ui.icons :as i] [app.util.dom :as dom] @@ -16,6 +18,7 @@ [app.util.i18n :refer [tr]] [app.util.router :as rt] [app.util.webapi :as wapi] + [potok.v2.core :as ptk] [rumext.v2 :as mf])) (mf/defc error-container @@ -146,15 +149,19 @@ (mf/defc exception-page {::mf/props :obj} - [{:keys [data] :as props}] - (case (:type data) - :not-found - [:& not-found] - - :bad-gateway - [:& bad-gateway] - - :service-unavailable - [:& service-unavailable] - - [:> internal-error props])) + [{:keys [data route] :as props}] + (let [type (:type data) + path (:path route) + query-params (u/map->query-string (:query-params route))] + (st/emit! (ptk/event ::ev/event {::ev/name "exception-page" :type type :path path :query-params query-params})) + (case (:type data) + :not-found + [:& not-found] + + :bad-gateway + [:& bad-gateway] + + :service-unavailable + [:& service-unavailable] + + [:> internal-error props]))) -- Gitee From 0be97e1c44e78036db844a92cb82472849385329 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Wed, 24 Apr 2024 13:42:05 +0200 Subject: [PATCH 0344/1266] :bug: Fix validate translations script --- frontend/scripts/validate-translations.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/scripts/validate-translations.js b/frontend/scripts/validate-translations.js index 52674054f..f6ec245ca 100644 --- a/frontend/scripts/validate-translations.js +++ b/frontend/scripts/validate-translations.js @@ -1,7 +1,7 @@ -const fs = require('fs').promises; -const gt = require("gettext-parser"); -const l = require("lodash"); -const path = require('path'); +import {promises as fs} from 'fs'; +import gt from 'gettext-parser'; +import l from 'lodash'; +import path from 'path'; async function* getFiles(dir) { const dirents = await fs.readdir(dir, { withFileTypes: true }); -- Gitee From 268a26b6a435054e5ec28870f781d516c176e2a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Fri, 9 Feb 2024 16:33:44 +0000 Subject: [PATCH 0345/1266] :sparkles: Update translations --- frontend/translations/af.po | 551 ++- frontend/translations/ar.po | 2255 +++++----- frontend/translations/cs.po | 1173 ++--- frontend/translations/de.po | 884 ++-- frontend/translations/en.po | 411 +- frontend/translations/es.po | 389 +- frontend/translations/es_419.po | 343 +- frontend/translations/fr.po | 1285 +++--- frontend/translations/ha.po | 7111 +++++++++++++++---------------- frontend/translations/he.po | 462 +- frontend/translations/hr.po | 1 - frontend/translations/id.po | 249 +- frontend/translations/ig.po | 2098 +++++++++ frontend/translations/lv.po | 566 +-- frontend/translations/ms.po | 2476 ++++++++++- frontend/translations/nl.po | 420 +- frontend/translations/pt_PT.po | 424 +- frontend/translations/ro.po | 88 +- frontend/translations/ru.po | 50 +- frontend/translations/tr.po | 1451 ++++--- frontend/translations/yo.po | 4646 ++++++++++++++++++++ frontend/translations/zh_CN.po | 1069 +++-- 22 files changed, 19056 insertions(+), 9346 deletions(-) create mode 100644 frontend/translations/ig.po create mode 100644 frontend/translations/yo.po diff --git a/frontend/translations/af.po b/frontend/translations/af.po index f037855e1..14d5e8519 100644 --- a/frontend/translations/af.po +++ b/frontend/translations/af.po @@ -2,147 +2,78 @@ msgid "" msgstr "" "PO-Revision-Date: 2023-10-13 18:01+0000\n" "Last-Translator: Hugo Vermaak \n" -"Language-Team: Afrikaans \n" +"Language-Team: Afrikaans " +"\n" "Language: af\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.1-dev\n" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "30 dae" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.add-shared" -msgstr "Voeg by as Gedeelde Biblioteek" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-not-expire" -msgstr "Die token het nie 'n verval datum nie" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-gitlab-submit" -msgstr "GitLab" - -msgid "common.share-link.placeholder" -msgstr "Deelbare skakel sal hier verskyn" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-title" -msgstr "Wagwoord vergeet?" - -msgid "common.share-link.current-tag" -msgstr "(huidige)" - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.invalid-token-error" -msgstr "Die hersteltoken is ongeldig." - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Wonderlik om jou weer te sien!" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "Genereer nuwe token" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "auth.notifications.team-invitation-accepted" -msgstr "Het suksesvol by die span aangesluit" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.title" -msgstr "Span saam!" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "180 dae" - -msgid "dashboard.export-frames" -msgstr "Voer borde as PDF uit" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-profile" -msgstr "Wil jy dit net probeer?" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-submit" -msgstr "Herstel Wagwoord" - -#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs -msgid "dashboard.copy-suffix" -msgstr "(kopieer)" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "Die naam word vereis" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.create-new-team" -msgstr "Skep 'n nuwe span" - -msgid "common.share-link.destroy-link" -msgstr "Vernietig skakel" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.copied-success" -msgstr "Token gekopieer" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.info" -msgstr "Gaan stap deur Penpot en leer sy hoofkenmerke ken." - #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" msgstr "Reeds 'n rekening?" -msgid "common.share-link.view-all" -msgstr "Kies Alles" - #: src/app/main/ui/auth/register.cljs msgid "auth.check-your-email" msgstr "" "Gaan jou e-pos na en klik op die skakel om te verifieer en Penpot te begin " "gebruik." -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "...handelsmerk, illustrasies, bemarkingsstukke, ens." +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.confirm-password" +msgstr "Bevestig wagwoord" -msgid "auth.terms-of-service" -msgstr "Diensbepalings" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-account" +msgstr "Skep demo rekening" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-profile" +msgstr "Wil jy dit net probeer?" #: src/app/main/ui/auth/register.cljs msgid "auth.demo-warning" msgstr "" -"Dit is 'n DEMO-diens, MOENIE vir werklike werk gebruik nie, die projekte sal " -"periodiek uitgevee word." +"Dit is 'n DEMO-diens, MOENIE vir werklike werk gebruik nie, die projekte " +"sal periodiek uitgevee word." -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-90-days" -msgstr "90 dae" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.email" +msgstr "E-pos" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.forgot-password" +msgstr "Wagwoord vergeet?" #: src/app/main/ui/auth/register.cljs -msgid "auth.register-title" -msgstr "Skep 'n rekening" +msgid "auth.fullname" +msgstr "Volle naam" -#: src/app/main/ui/export.cljs -msgid "dashboard.export-frames.title" -msgstr "Voer as PDF uit" +#: src/app/main/ui/auth/register.cljs +msgid "auth.login-here" +msgstr "Meld hier aan" -#: src/app/main/ui/auth.cljs -msgid "auth.sidebar-tagline" -msgstr "Die oopbron-oplossing vir ontwerp en prototipering." +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-submit" +msgstr "Meld aan" -msgid "common.share-link.get-link" -msgstr "Kry skakel" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-title" +msgstr "Wonderlik om jou weer te sien!" #: src/app/main/ui/auth/login.cljs -msgid "auth.register" -msgstr "Nog nie 'n rekening nie?" +msgid "auth.login-with-github-submit" +msgstr "GitHub" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-gitlab-submit" +msgstr "GitLab" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-google-submit" +msgstr "Google" #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-ldap-submit" @@ -152,162 +83,177 @@ msgstr "LDAP" msgid "auth.login-with-oidc-submit" msgstr "OpenID" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "Het verval op %s" +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "Die naam moet 'n ander karakter as spasie bevat." -msgid "dashboard.export-multi" -msgstr "Voer %s Penpot lêers uit" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "Die naam moet hoogstens 250 karakters bevat." -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-not-empty" -msgstr "Wagwoord moet 'n ander karakter as spasie bevat." +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.new-password" +msgstr "Tik 'n nuwe wagwoord in" -msgid "common.unpublish" -msgstr "Depubliseer" +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.invalid-token-error" +msgstr "Die hersteltoken is ongeldig." -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-60-days" -msgstr "60 dae" +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.password-changed-successfully" +msgstr "Wagwoord suksesvol verander" -msgid "common.share-link.confirm-deletion-link-description" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.profile-not-verified" msgstr "" -"Is jy seker jy wil hierdie skakel verwyder? As jy dit doen, is dit nie meer " -"vir enigiemand beskikbaar nie" +"Profiel is nie geverifieer nie, verifieer asseblief profiel voordat jy " +"voortgaan." -msgid "dashboard.download-binary-file" -msgstr "Laai Penpot-lêer (.penpot) af" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.recovery-token-sent" +msgstr "Wagwoordherwinningskakel na jou inkassie gestuur." -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.confirm-password" -msgstr "Bevestig wagwoord" +#: src/app/main/ui/auth/verify_token.cljs +msgid "auth.notifications.team-invitation-accepted" +msgstr "Het suksesvol by die span aangesluit" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.password" +msgstr "Wagwoord" #: src/app/main/ui/auth/register.cljs -msgid "auth.fullname" -msgstr "Volle naam" +msgid "auth.password-length-hint" +msgstr "Ten minste 8 karakters" -msgid "common.share-link.permissions-hint" -msgstr "Enigiemand met skakel sal toegang hê" +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "Wagwoord moet 'n ander karakter as spasie bevat." -msgid "common.share-link.permissions-can-comment" -msgstr "Kan kommentaar lewer" +msgid "auth.privacy-policy" +msgstr "Privaatheidsbeleid" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-expire" -msgstr "Die token sal verval op %s" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-submit" +msgstr "Herstel Wagwoord" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.management" -msgstr "Spanbestuur" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-subtitle" +msgstr "Ons sal vir jou 'n e-pos stuur met instruksies" -msgid "dashboard.download-standard-file" -msgstr "Laai standaardlêer af (.svg + .json)" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-title" +msgstr "Wagwoord vergeet?" -msgid "common.share-link.page-shared" -msgid_plural "common.share-link.page-shared" -msgstr[0] "bladsy gedeel" -msgstr[1] "%s bladsye gedeel" +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.recovery-submit" +msgstr "Verander jou wagwoord" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.register" +msgstr "Nog nie 'n rekening nie?" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.register-submit" +msgstr "Skep 'n rekening" #: src/app/main/ui/auth/register.cljs msgid "auth.register-subtitle" msgstr "Dit is gratis, dit is oopbron" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-submit" -msgstr "Meld aan" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.default-team-name" -msgstr "Jou Penpot" +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-title" +msgstr "Skep 'n rekening" -msgid "common.share-link.permissions-can-inspect" -msgstr "Kan kode inspekteer" +#: src/app/main/ui/auth.cljs +msgid "auth.sidebar-tagline" +msgstr "Die oopbron-oplossing vir ontwerp en prototipering." -msgid "common.share-link.team-members" -msgstr "Slegs spanlede" +msgid "auth.terms-of-service" +msgstr "Diensbepalings" #: src/app/main/ui/auth/register.cljs msgid "auth.terms-privacy-agreement" msgstr "" "Wanneer jy 'n nuwe rekening skep, stem jy in tot ons diensbepalings en " -"privaatheidsbeleid." - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.new-password" -msgstr "Tik 'n nuwe wagwoord in" - -msgid "common.share-link.title" -msgstr "Deel prototipes" - -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.duplicate" -msgstr "Dupliseer" +"privaatheidsbeleid." #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "Ons het 'n verifikasie-e-pos aan gestuur" -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.profile-not-verified" +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...handelsmerk, illustrasies, bemarkingsstukke, ens." + +msgid "common.publish" +msgstr "Publiseer" + +msgid "common.share-link.all-users" +msgstr "Alle Penpot-gebruikers" + +msgid "common.share-link.confirm-deletion-link-description" msgstr "" -"Profiel is nie geverifieer nie, verifieer asseblief profiel voordat jy " -"voortgaan." +"Is jy seker jy wil hierdie skakel verwyder? As jy dit doen, is dit nie meer " +"vir enigiemand beskikbaar nie" -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-subtitle" -msgstr "Ons sal vir jou 'n e-pos stuur met instruksies" +msgid "common.share-link.current-tag" +msgstr "(huidige)" -#: src/app/main/ui/auth/login.cljs -msgid "auth.forgot-password" -msgstr "Wagwoord vergeet?" +msgid "common.share-link.destroy-link" +msgstr "Vernietig skakel" -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.recovery-token-sent" -msgstr "Wagwoordherwinningskakel na jou inkassie gestuur." +msgid "common.share-link.get-link" +msgstr "Kry skakel" -msgid "common.publish" -msgstr "Publiseer" +msgid "common.share-link.link-copied-success" +msgstr "Skakel suksesvol gekopieer" -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.recovery-submit" -msgstr "Verander jou wagwoord" +msgid "common.share-link.manage-ops" +msgstr "Bestuur toestemmings" -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.change-email" -msgstr "Verander e-pos" +msgid "common.share-link.page-shared" +msgid_plural "common.share-link.page-shared" +msgstr[0] "bladsy gedeel" +msgstr[1] "%s bladsye gedeel" -msgid "auth.privacy-policy" -msgstr "Privaatheidsbeleid" +msgid "common.share-link.permissions-can-comment" +msgstr "Kan kommentaar lewer" -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.password-changed-successfully" -msgstr "Wagwoord suksesvol verander" +msgid "common.share-link.permissions-can-inspect" +msgstr "Kan kode inspekteer" -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "Die naam moet 'n ander karakter as spasie bevat." +msgid "common.share-link.permissions-hint" +msgstr "Enigiemand met skakel sal toegang hê" msgid "common.share-link.permissions-pages" msgstr "Bladsye gedeel" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-account" -msgstr "Skep demo rekening" +msgid "common.share-link.placeholder" +msgstr "Deelbare skakel sal hier verskyn" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.title" -msgstr "Koppelvlak Deurloop" +msgid "common.share-link.team-members" +msgstr "Slegs spanlede" -msgid "common.share-link.manage-ops" -msgstr "Bestuur toestemmings" +msgid "common.share-link.title" +msgstr "Deel prototipes" + +msgid "common.share-link.view-all" +msgstr "Kies Alles" + +msgid "common.unpublish" +msgstr "Depubliseer" #: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.start" -msgstr "Begin die tutoriaal" +msgid "dasboard.team-hero.management" +msgstr "Spanbestuur" -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-length-hint" -msgstr "Ten minste 8 karakters" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.text" +msgstr "Penpot is bedoel vir spanne. Nooi lede om saam te werk aan projekte en lêers" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.title" +msgstr "Span saam!" #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.tutorial-hero.info" @@ -315,99 +261,152 @@ msgstr "" "Leer die basiese beginsels by Penpot terwyl jy pret het met hierdie " "praktiese tutoriaal." -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.no-access-tokens" -msgstr "Jy het tot dusver geen tokens nie." +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.start" +msgstr "Begin die tutoriaal" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"Persoonlike toegangtokens funksioneer soos 'n alternatief vir ons aanmeld-/" -"wagwoord-verifikasiestelsel en kan gebruik word om 'n toepassing toe te laat " -"om toegang tot die interne Penpot API te verkry" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.info" +msgstr "Gaan stap deur Penpot en leer sy hoofkenmerke ken." #: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.text" -msgstr "" -"Penpot is bedoel vir spanne. Nooi lede om saam te werk aan projekte en lêers" +msgid "dasboard.walkthrough-hero.start" +msgstr "Begin die toer" -msgid "common.share-link.all-users" -msgstr "Alle Penpot-gebruikers" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.title" +msgstr "Koppelvlak Deurloop" #: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "Persoonlike toegangstokens" +msgid "dashboard.access-tokens.copied-success" +msgstr "Token gekopieer" #: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expires-on" -msgstr "Verval op %s" +msgid "dashboard.access-tokens.create" +msgstr "Genereer nuwe token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "Toegangstoken is suksesvol geskep." #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.empty.add-one" msgstr "Druk die knoppie \"Genereer nuwe token\" om een te genereer." -#: src/app/main/ui/dashboard/grid.cljs -#, markdown -msgid "dashboard.empty-placeholder-drafts" -msgstr "" -"Lêers wat by biblioteke gevoeg is, sal hier verskyn. Probeer om jou lêers te " -"deel of voeg by vanaf ons [Biblioteke en sjablone](https://penpot.app/" -"libraries-templates.html)." +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "Jy het tot dusver geen tokens nie." -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-github-submit" -msgstr "GitHub" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "Die naam word vereis" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-google-submit" -msgstr "Google" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "180 dae" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.delete-team" -msgstr "Verwyder span" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "30 dae" #: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "Toegangstoken is suksesvol geskep." +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "60 dae" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "90 dae" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.expiration-never" msgstr "Nooit" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.password" -msgstr "Wagwoord" - -msgid "common.share-link.link-copied-success" -msgstr "Skakel suksesvol gekopieer" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.email" -msgstr "E-pos" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "Het verval op %s" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.register-submit" -msgstr "Skep 'n rekening" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "Verval op %s" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.no-expiration" msgstr "Geen verval datum nie" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "Die naam moet hoogstens 250 karakters bevat." +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "Persoonlike toegangstokens" -msgid "dashboard.export-binary-multi" -msgstr "Laai %s Penpot lêers (.penpot) af" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"Persoonlike toegangtokens funksioneer soos 'n alternatief vir ons " +"aanmeld-/wagwoord-verifikasiestelsel en kan gebruik word om 'n toepassing " +"toe te laat om toegang tot die interne Penpot API te verkry" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.start" -msgstr "Begin die toer" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "Die token sal verval op %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "Die token het nie 'n verval datum nie" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.add-shared" +msgstr "Voeg by as Gedeelde Biblioteek" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.change-email" +msgstr "Verander e-pos" + +#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs +msgid "dashboard.copy-suffix" +msgstr "(kopieer)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.create-new-team" +msgstr "Skep 'n nuwe span" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.default-team-name" +msgstr "Jou Penpot" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.delete-team" +msgstr "Verwyder span" + +msgid "dashboard.download-binary-file" +msgstr "Laai Penpot-lêer (.penpot) af" + +msgid "dashboard.download-standard-file" +msgstr "Laai standaardlêer af (.svg + .json)" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate" +msgstr "Dupliseer" #: src/app/main/ui/dashboard/file_menu.cljs msgid "dashboard.duplicate-multi" msgstr "Dupliseer %s lêers" -#: src/app/main/ui/auth/register.cljs -msgid "auth.login-here" -msgstr "Meld hier aan" +#: src/app/main/ui/dashboard/grid.cljs +#, markdown +msgid "dashboard.empty-placeholder-drafts" +msgstr "" +"Lêers wat by biblioteke gevoeg is, sal hier verskyn. Probeer om jou lêers " +"te deel of voeg by vanaf ons [Biblioteke en " +"sjablone](https://penpot.app/libraries-templates.html)." + +msgid "dashboard.export-binary-multi" +msgstr "Laai %s Penpot lêers (.penpot) af" + +msgid "dashboard.export-frames" +msgstr "Voer borde as PDF uit" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-frames.title" +msgstr "Voer as PDF uit" + +msgid "dashboard.export-multi" +msgstr "Voer %s Penpot lêers uit" diff --git a/frontend/translations/ar.po b/frontend/translations/ar.po index 9bc152ac5..400b28221 100644 --- a/frontend/translations/ar.po +++ b/frontend/translations/ar.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-01-02 16:16+0000\n" "Last-Translator: Alejandro Alonso \n" -"Language-Team: Arabic \n" +"Language-Team: Arabic " +"\n" "Language: ar\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -157,8 +157,7 @@ msgstr "شروط الخدمة" #: src/app/main/ui/auth/register.cljs msgid "auth.terms-privacy-agreement" -msgstr "" -"عند إنشاء حساب جديد ، فإنك توافق على شروط الخدمة وسياسة الخصوصية الخاصة بنا." +msgstr "عند إنشاء حساب جديد ، فإنك توافق على شروط الخدمة وسياسة الخصوصية الخاصة بنا." #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" @@ -2258,6 +2257,58 @@ msgstr "أداة انتقاء اللون" msgid "shortcuts.open-dashboard" msgstr "إذهب إلى لوحة المعلومات" +msgid "shortcuts.toggle-layers" +msgstr "تبديل الطبقات" + +msgid "shortcuts.toggle-layout-flex" +msgstr "أضف\\أزل ثني التخطيط" + +msgid "shortcuts.toggle-lock" +msgstr "قفل\\فتح" + +msgid "shortcuts.toggle-lock-size" +msgstr "قفل النسب" + +msgid "shortcuts.toggle-rules" +msgstr "إظهار\\إخفاء المسطرة" + +msgid "shortcuts.toggle-textpalette" +msgstr "تبديل لوحة النص" + +msgid "shortcuts.toggle-visibility" +msgstr "أظهر\\أخف" + +msgid "shortcuts.toggle-zoom-style" +msgstr "تبديل أسلوب التكبير" + +msgid "shortcuts.underline" +msgstr "الخط التحتي" + +msgid "shortcuts.undo" +msgstr "الغاء" + +msgid "shortcuts.ungroup" +msgstr "فك التجميع" + +msgid "shortcuts.unmask" +msgstr "كشف القناع" + +msgid "shortcuts.v-distribute" +msgstr "النشر عموديا" + +msgid "shortcuts.zoom-lense-decrease" +msgstr "تنقيص عدسة التكبير" + +msgid "shortcuts.zoom-lense-increase" +msgstr "زيادة عدسة التكبير" + +msgid "shortcuts.zoom-selected" +msgstr "كبر المحدد" + +#: src/app/main/ui/dashboard/team.cljs +msgid "team.webhooks.max-length" +msgstr "يجب الا يزيد اسم الويبهوك على 2048 حرفا" + #: src/app/main/ui/dashboard/files.cljs msgid "title.dashboard.files" msgstr "%s - Penpotعنوان ملفات لوحة القيادة" @@ -2286,6 +2337,10 @@ msgstr "المكاتب المقسمة - %s - Penpot" msgid "title.default" msgstr "Penpot - صمم حرية الفرق" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "رموز الوصول للحساب" + #: src/app/main/ui/settings/feedback.cljs msgid "title.settings.feedback" msgstr "جواب الرد - Penpot" @@ -2302,6 +2357,10 @@ msgstr "كلمة المرور - Penpot" msgid "title.settings.profile" msgstr "واجهة الحساب - Penpot" +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-invitations" +msgstr "الدعوات - %s - Penpot" + #: src/app/main/ui/dashboard/team.cljs msgid "title.team-members" msgstr "أعضاء الفريق - %s - Penpot" @@ -2310,6 +2369,9 @@ msgstr "أعضاء الفريق - %s - Penpot" msgid "title.team-settings" msgstr "إعدادات - %s - Penpot" +msgid "title.team-webhooks" +msgstr "خطافات الويب - %s - Penpot" + #: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs msgid "title.viewer" msgstr "%s -أسلوب العرض - Penpot" @@ -2318,6 +2380,15 @@ msgstr "%s -أسلوب العرض - Penpot" msgid "title.workspace" msgstr "%s -مساحة العمل Penpot" +msgid "viewer.breaking-change.description" +msgstr "" +"وصف كسر التغييرThis shareable link is no longer valid. Create a new one or " +"ask the owner for a new one.هذا الرابط القابل للمشاركة لم يعد صالحا.صمم " +"جديدا أو اسأل مالكه للجديد" + +msgid "viewer.breaking-change.message" +msgstr "آسف" + #: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs msgid "viewer.empty-state" msgstr "No boards found on the page." @@ -2326,6 +2397,9 @@ msgstr "No boards found on the page." msgid "viewer.frame-not-found" msgstr "لم يعثر على البورد ." +msgid "viewer.header.comments-section" +msgstr "التعليقات (%s)" + #: src/app/main/ui/viewer/header.cljs msgid "viewer.header.dont-show-interactions" msgstr "لا تطهر التفاعلات" @@ -2334,10 +2408,16 @@ msgstr "لا تطهر التفاعلات" msgid "viewer.header.fullscreen" msgstr "تكبير الشاشة" +msgid "viewer.header.inspect-section" +msgstr "التفحص (%s)" + #: src/app/main/ui/viewer/header.cljs msgid "viewer.header.interactions" msgstr "التفاعلات" +msgid "viewer.header.interactions-section" +msgstr "التفاعلات (%s)" + #: src/app/main/ui/viewer/header.cljs msgid "viewer.header.share.copy-link" msgstr "نسخ الرابط" @@ -2354,6 +2434,9 @@ msgstr "أطهر التفاعلات بالنقر" msgid "viewer.header.sitemap" msgstr "خريطة الموقع" +msgid "webhooks.last-delivery.success" +msgstr "محاذاة المركز الأفقي" + #: src/app/main/ui/workspace/sidebar/align.cljs msgid "workspace.align.hcenter" msgstr "محاذاة المركز الأفقي (%s)" @@ -2423,6 +2506,9 @@ msgstr "امسح" msgid "workspace.assets.duplicate" msgstr "انسخ" +msgid "workspace.assets.duplicate-main" +msgstr "انسخ الأصل" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.edit" @@ -2445,10 +2531,16 @@ msgstr "اسم المجموعة" msgid "workspace.assets.libraries" msgstr "المكتبات" +msgid "workspace.assets.local-library" +msgstr "المكتبة المحلية" + #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.not-found" msgstr "الأصل غير موجود" +msgid "workspace.assets.open-library" +msgstr "افتح ملف المكتب" + #: src/app/main/ui/workspace/sidebar/sitemap.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs @@ -2473,6 +2565,10 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "مكتبة مشتركة" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" @@ -2508,6 +2604,9 @@ msgstr "طول الخط" msgid "workspace.assets.typography.sample" msgstr "أسلوب خط النص" +msgid "workspace.assets.typography.text-styles" +msgstr "أسلوب خط النص" + #: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs msgid "workspace.assets.typography.text-transform" msgstr "تحويل النص" @@ -2516,6 +2615,18 @@ msgstr "تحويل النص" msgid "workspace.assets.ungroup" msgstr "فك التجميع" +msgid "workspace.focus.focus-mode" +msgstr "وضع التركيز" + +msgid "workspace.focus.focus-off" +msgstr "تعطيل التركيز" + +msgid "workspace.focus.focus-on" +msgstr "تشغيل التركيز" + +msgid "workspace.focus.selection" +msgstr "تحديد" + #: src/app/main/data/workspace/libraries.cljs, #: src/app/main/ui/components/color_bullet.cljs msgid "workspace.gradients.linear" @@ -2530,38 +2641,110 @@ msgstr "الانحدار الشعاعي" msgid "workspace.header.menu.disable-dynamic-alignment" msgstr "إبطال المحاذاة الدينماكية" +msgid "workspace.header.menu.disable-scale-content" +msgstr "Disable proportional scale" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-scale-text" msgstr "إبطال المقياس النسبي" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-guides" +msgstr "إبطال الفرقعة للخ\\وط الإرشادية" + +msgid "workspace.header.menu.disable-snap-pixel-grid" +msgstr "إبطال الفرقعة للبكسل" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-dynamic-alignment" msgstr "تككين المحاذاة الدينماكية" +msgid "workspace.header.menu.enable-scale-content" +msgstr "تمكين المقياس النسبي" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-scale-text" msgstr "تمكين نص المقياس" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-guides" +msgstr "الفرقعة للخطوط الإرشادية" + +msgid "workspace.header.menu.enable-snap-pixel-grid" +msgstr "تمكين الفرقعة للبكسل" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-artboard-names" +msgstr "إخفاء أسماء البورد" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "إخفاء لون اللوحة" +msgid "workspace.header.menu.hide-pixel-grid" +msgstr "إخفاء تشبيك اللوحة" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-rules" msgstr "إخفاء المسطرات" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-textpalette" +msgstr "إخفاء لوحة أسلوب خط" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.edit" +msgstr "التحرير" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.file" +msgstr "الملف" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.help-info" +msgstr "المساعدة و المعلومة" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.preferences" +msgstr "التفضيلات" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.view" +msgstr "المنظر" + +msgid "workspace.header.menu.redo" +msgstr "إعادة" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.select-all" msgstr "حدد الجميع" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-artboard-names" +msgstr "أظهر أسماء البورد" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "أظهر لون اللوحة" +msgid "workspace.header.menu.show-pixel-grid" +msgstr "Show pixel grid" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-rules" msgstr "أظهر المسطرات" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-textpalette" +msgstr "أظهر لوخة أسلوب الخط" + +msgid "workspace.header.menu.undo" +msgstr "الإلغاء" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.reset-zoom" +msgstr "إعادة ضبط" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.save-error" msgstr "خطأ في حفظ الملف" @@ -2582,6 +2765,33 @@ msgstr "تغييرات غير محفوظة" msgid "workspace.header.viewer" msgstr "وضع العرض (%s)" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "تكبير" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fill" +msgstr "مقياس الملأ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fit" +msgstr "تقليص المقياس للتناسب" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fit-all" +msgstr "التكبير لتناسب الجميع" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-full-screen" +msgstr "تكبير الشاشة" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-selected" +msgstr "تكبير" + +msgid "workspace.layout_grid.editor.title" +msgstr "تحرير التشبيك" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "الإضافة" @@ -2590,16 +2800,36 @@ msgstr "الإضافة" msgid "workspace.libraries.colors" msgstr "%s الألوان" +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "لا يوجد أنماط اللون في مكتبتك" + +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "لا يوجد أنماط الكتابة في مكتبتك" + #: src/app/main/ui/workspace/colorpicker/libraries.cljs, #: src/app/main/ui/workspace/colorpalette.cljs msgid "workspace.libraries.colors.file-library" msgstr "مكتبة الملفات" +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.hsv" +msgstr "HSV" + #: src/app/main/ui/workspace/colorpicker/libraries.cljs, #: src/app/main/ui/workspace/colorpalette.cljs msgid "workspace.libraries.colors.recent-colors" msgstr "الألوان المؤخرة" +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgb-complementary" +msgstr "RGB مكملات" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgba" +msgstr "RGBA" + #: src/app/main/ui/workspace/colorpicker.cljs msgid "workspace.libraries.colors.save-color" msgstr "حفظ أسلوب اللون" @@ -2628,6 +2858,10 @@ msgstr "المكتبات" msgid "workspace.libraries.library" msgstr "المكتبة" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library-updates" +msgstr "تحديث المكتبة" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "لا يوجد مكتبات مشتركة تحتاج إلى تحديث" @@ -2664,10 +2898,18 @@ msgstr "%s الكتابات" msgid "workspace.libraries.update" msgstr "التحديث" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "رؤية جميع التغييرات" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.updates" msgstr "التحديثات" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.add-interaction" +msgstr "انقر على زر +لإضافة التفاعلات" + #: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs msgid "workspace.options.blur-options.title" msgstr "الطمس" @@ -2684,17 +2926,35 @@ msgstr "تطميس المحدد" msgid "workspace.options.canvas-background" msgstr "خلفية اللوحة القماشية" +msgid "workspace.options.clip-content" +msgstr "محتوى المقطع" + #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs msgid "workspace.options.component" msgstr "العنصر" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints" -msgstr "قيود" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.bottom" -msgstr "أسفل" +msgid "workspace.options.component.annotation" +msgstr "حاشية" + +msgid "workspace.options.component.copy" +msgstr "النسخ" + +msgid "workspace.options.component.create-annotation" +msgstr "إنشاء حاشية" + +msgid "workspace.options.component.edit-annotation" +msgstr "تحرير حاشية" + +msgid "workspace.options.component.main" +msgstr "أصل" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints" +msgstr "قيود" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.bottom" +msgstr "أسفل" #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints.center" @@ -2737,19 +2997,47 @@ msgstr "تصميم" msgid "workspace.options.export" msgstr "تصدير" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export-multiple" +msgstr "تحديد المصدر" + #: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs msgid "workspace.options.export.suffix" msgstr "لاحقة" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-complete" +msgstr "تم التصدير" + #: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, #: src/app/main/ui/inspect/exports.cljs msgid "workspace.options.exporting-object" msgstr "جاري التصدير…" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object-error" +msgstr "Export failed" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object-slow" +msgstr "التصدير بطيء بشكل غير متوقع" + #: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs msgid "workspace.options.fill" msgstr "الملأ" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.add-flow-start" +msgstr "إضافة المخطط" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-start" +msgstr "إضافة المخطط" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-starts" +msgstr "جاري التخطيط" + #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.auto" msgstr "تلقائي" @@ -2758,6 +3046,13 @@ msgstr "تلقائي" msgid "workspace.options.grid.column" msgstr "أعمدة" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.grid-title" +msgstr "تشبيك" + +msgid "workspace.options.grid.params.color" +msgstr "لون" + #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.params.columns" msgstr "أعمدة" @@ -2834,1477 +3129,1181 @@ msgstr "مربع" msgid "workspace.options.group-fill" msgstr "ملأ المجموعة" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.color" -msgstr "اللون" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.group-stroke" +msgstr "ضرب المجموعة" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.color-burn" -msgstr "احتراق اللون" +msgid "workspace.options.height" +msgstr "طول" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.color-dodge" -msgstr "انقاص كثافة اللون" +msgid "workspace.options.inspect" +msgstr "Inspectفحص" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.darken" -msgstr "أغمق" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-action" +msgstr "فعل" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.difference" -msgstr "الفارق" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-after-delay" +msgstr "بعد التأخير" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.there-are-updates" -msgstr "يوجد تحديثات في المكتبة المشتركة" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation" +msgstr "الرسومات المتحركة" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.update" -msgstr "تحديث" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-dissolve" +msgstr "تذوب" -msgid "workspace.viewport.click-to-close-path" -msgstr "انقر لتغلق المسار" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-none" +msgstr "لا شيء" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-out" -msgstr "خارج" +msgid "workspace.options.interaction-animation-push" +msgstr "دفع" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.move" -msgstr "تحريك (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-slide" +msgstr "انزلاق" -#: src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.empty-palette" -msgstr "لا يوجد أنماط اللون في مكتبتك" +msgid "workspace.options.interaction-auto" +msgstr "تلقائي" -msgid "workspace.options.component.copy" -msgstr "النسخ" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-background" +msgstr "إضافة تراكب الخلفية" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interactions" -msgstr "التفاعلات" +msgid "workspace.options.interaction-close-outside" +msgstr "عطل إذا نقر في الخارج" -msgid "workspace.undo.entry.multiple.circle" -msgstr "دوائر" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay" +msgstr "إغلاق التراكب" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-action" -msgstr "فعل" +msgid "workspace.options.interaction-close-overlay-dest" +msgstr "إغلاق التراكب: %s" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-center" -msgstr "المركز السفلي" +msgid "workspace.options.interaction-delay" +msgstr "تأخير" -msgid "workspace.shape.menu.transform-to-path" -msgstr "تحويل الى المسار" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-destination" +msgstr "وجهة" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-push" -msgstr "دفع" +msgid "workspace.options.interaction-duration" +msgstr "مدة" -msgid "workspace.options.inspect" -msgstr "Inspectفحص" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing" +msgstr "تخفيف" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-center" -msgstr "المركز العلوي" +msgid "workspace.options.interaction-easing-ease" +msgstr "خفف" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.multiply" -msgstr "تضاعف" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in" +msgstr "خفف داخل" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.letter-spacing" -msgstr "تباعد الحروف" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in-out" +msgstr "خفف داخل و خارج" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.direction-rtl" -msgstr "RTL" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-out" +msgstr "خفف خارج" -msgid "workspace.options.component.create-annotation" -msgstr "إنشاء حاشية" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-linear" +msgstr "خطي" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-auto-width" -msgstr "العرض التلقائي" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-in" +msgstr "داخل" -msgid "workspace.options.shadow-options.color" -msgstr "لون الظل" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-enter" +msgstr "إدخال الفأرة" -msgid "viewer.header.inspect-section" -msgstr "التفحص (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-leave" +msgstr "إخراج الفأرة" -msgid "workspace.shape.menu.flatten" -msgstr "تسطيح" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-ms" +msgstr "القوائم" -msgid "workspace.header.menu.hide-pixel-grid" -msgstr "إخفاء تشبيك اللوحة" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to" +msgstr "الإنتقال الى" -msgid "workspace.undo.entry.multiple.page" -msgstr "صفحات" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to-dest" +msgstr "انتقال الى: %s" -msgid "shortcuts.ungroup" -msgstr "فك التجميع" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-none" +msgstr "(غير مهيء)" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.empty" -msgstr "لا يوجد تغييرات في التاريخ الى الآن" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-offset-effect" +msgstr "تأثير الإزاحة" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin-simple" -msgstr "هامش بسيط" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-on-click" +msgstr "بعد النقر" -msgid "workspace.undo.entry.multiple.rect" -msgstr "مستطيلات" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay" +msgstr "فتح التراكب" -msgid "shortcuts.zoom-selected" -msgstr "كبر المحدد" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay-dest" +msgstr "فتح التراكب: %s" -msgid "workspace.options.grid.params.color" -msgstr "لون" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-url" +msgstr "رابط مفتوح" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.group" -msgstr "مجموعة" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-out" +msgstr "خارج" -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs -msgid "workspace.options.size-presets" -msgstr "الإعدادات المسبقة للحجم" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-center" +msgstr "المركز السفلي" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin" -msgstr "هامش" - -msgid "workspace.options.opacity" -msgstr "العتامة" - -msgid "workspace.options.component.edit-annotation" -msgstr "تحرير حاشية" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-left" +msgstr "اأسفل اليسار" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.file" -msgstr "الملف" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-right" +msgstr "أسفل اليمين" -msgid "workspace.undo.entry.multiple.media" -msgstr "الأصول الرسومية" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-center" +msgstr "مركز" -msgid "workspace.options.show-in-viewer" -msgstr "أظهر في وضع العرض" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-manual" +msgstr "يدوي" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.lowercase" -msgstr "أحرف صغيرة" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-center" +msgstr "المركز العلوي" -msgid "workspace.undo.entry.multiple.group" -msgstr "مجموعات" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-left" +msgstr "أعلى اليسار" -msgid "workspace.shape.menu.create-multiple-components" -msgstr "إنشاء عناصر جديدة" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-right" +msgstr "أعلى اليمين" -msgid "webhooks.last-delivery.success" -msgstr "محاذاة المركز الأفقي" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-position" +msgstr "موضع" -msgid "workspace.options.stroke-width" -msgstr "عرض الضرب" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-preserve-scroll" +msgstr "حفظ موضع التمرير" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-out" -msgstr "خفف خارج" +msgid "workspace.options.interaction-prev-screen" +msgstr "الشاشة السابقة" -msgid "workspace.options.x" -msgstr "X محور" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-relative-to" +msgstr "بالنسبة الى" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-self" msgstr "الذات" -msgid "workspace.shape.menu.path" -msgstr "طريق" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.offsety" -msgstr "Y" - -msgid "workspace.focus.focus-mode" -msgstr "وضع التركيز" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay" +msgstr "تبديل التراكب" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-ms" -msgstr "القوائم" +msgid "workspace.options.interaction-toggle-overlay-dest" +msgstr "تبديل التراكب: %s" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.right" -msgstr "يمين" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-trigger" +msgstr "مشغل" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.ellipse" -msgstr "الشكل البيضاوي (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-url" +msgstr "الرابط المفتوح" -msgid "workspace.sidebar.layers.groups" -msgstr "مجموعات" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-hovering" +msgstr "حين التحوم" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "مستطيل" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-pressing" +msgstr "حين الضغط" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-left" -msgstr "أعلى اليسار" +msgid "workspace.options.interactions" +msgstr "التفاعلات" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.color-palette" -msgstr "لوحة اللون (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color" +msgstr "اللون" -msgid "workspace.undo.entry.multiple.frame" -msgstr "لوحة" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color-burn" +msgstr "احتراق اللون" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-min-h" -msgstr "الحد الأدنى للطول" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color-dodge" +msgstr "انقاص كثافة اللون" -msgid "workspace.path.actions.add-node" -msgstr "أضف العقدة (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.darken" +msgstr "أغمق" -msgid "workspace.options.component.main" -msgstr "أصل" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.difference" +msgstr "الفارق" -msgid "workspace.undo.entry.single.frame" -msgstr "لوحة" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.exclusion" +msgstr "الإستبعاد" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow-starts" -msgstr "جاري التخطيط" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.hard-light" +msgstr "ضوء الثابت" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-position" -msgstr "موضع" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.hue" +msgstr "مسحة" -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.more-colors" -msgstr "المزيد من الألوان" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.lighten" +msgstr "تفتيح" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-bottom" -msgstr "محاذاة الأسفل" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.luminosity" +msgstr "لمعان" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.new" -msgstr "جديد %s" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.multiply" +msgstr "تضاعف" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.create-artboard-from-selection" -msgstr "تحديد محتوى اللوحة" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.normal" +msgstr "عادي" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-top-right" -msgstr "أعلى اليمين" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.overlay" +msgstr "تراكب" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-in" -msgstr "داخل" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.saturation" +msgstr "التشبع" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay" -msgstr "تبديل التراكب" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.screen" +msgstr "شاشة" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow" -msgstr "سهم المثلث" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.soft-light" +msgstr "ضوء خافت" -msgid "workspace.undo.entry.multiple.curve" -msgstr "منحنيات" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title" +msgstr "طبقة" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-guides" -msgstr "إبطال الفرقعة للخ\\وط الإرشادية" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title.group" +msgstr "طبقات المجموعة" -msgid "workspace.path.actions.snap-nodes" -msgstr "كسر العقد (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title.multiple" +msgstr "الطبقات المحددة" -msgid "workspace.undo.entry.multiple.multiple" -msgstr "أشياء" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.advanced-ops" +msgstr "خيارات متقدمة" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-slide" -msgstr "انزلاق" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-max-h" +msgstr "أقصى ارتفاع" #: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-min-w" -msgstr "الحد الأدنى للعرض" +msgid "workspace.options.layout-item.layout-item-max-w" +msgstr "أقصى عرض" #: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs msgid "workspace.options.layout-item.layout-item-min-h" msgstr "الحد الأدنو للارتفاع" -msgid "workspace.sidebar.layers.masks" -msgstr "قناعات" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-min-w" +msgstr "الحد الأدنى للعرض" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.screen" -msgstr "شاشة" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-max-h" +msgstr "أقصى ارتفاع" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "رؤية جميع التغييرات" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-max-w" +msgstr "أقصى عرض" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.inner-shadow" -msgstr "التظليل الداخلي" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-min-h" +msgstr "الحد الأدنى للطول" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.frame" -msgstr "لوحة (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-min-w" +msgstr "الحد الأدنى للعرض" -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "لا يوجد أنماط الكتابة في مكتبتك" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.bottom" +msgstr "أسفل" -#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.paste" -msgstr "معجون" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column" +msgstr "عمود" -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.selection-fill" -msgstr "اختر نوع الملأ" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column-reverse" +msgstr "العموج العكسي" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-middle" -msgstr "محاذاة الوسط" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row" +msgstr "الصف" -msgid "viewer.breaking-change.description" -msgstr "" -"وصف كسر التغييرThis shareable link is no longer valid. Create a new one or " -"ask the owner for a new one.هذا الرابط القابل للمشاركة لم يعد صالحا.صمم " -"جديدا أو اسأل مالكه للجديد" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row-reverse" +msgstr "الصف العكسي" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-background" -msgstr "إضافة تراكب الخلفية" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.gap" +msgstr "فجوة" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.unknown" -msgstr "انتهت العملية %s" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.left" +msgstr "شمال" -msgid "shortcuts.zoom-lense-increase" -msgstr "زيادة عدسة التكبير" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin" +msgstr "هامش" -msgid "workspace.shape.menu.add-grid" -msgstr "إضافة تخطيط التشبيك" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin-all" +msgstr "جميع النواحي" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-complete" -msgstr "تم التصدير" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin-simple" +msgstr "هامش بسيط" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-delay" -msgstr "تأخير" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.packed" +msgstr "معباة" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.luminosity" -msgstr "لمعان" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding" +msgstr "حشوة" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flip-vertical" -msgstr "التوجيه الرئسي" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-all" +msgstr "جميع النواحي" -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.position" -msgstr "الموضع" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-simple" +msgstr "حشوة بسيطة" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square" -msgstr "مربع" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.right" +msgstr "يمين" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-justify" -msgstr "تعديل (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-around" +msgstr "التباعد حول" #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.space-between" msgstr "التباعد بين" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.uppercase" -msgstr "الأحرف الكبيرة" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom" -msgstr "تكبير" - -msgid "workspace.options.component.annotation" -msgstr "حاشية" - -msgid "shortcuts.toggle-layers" -msgstr "تبديل الطبقات" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-preserve-scroll" -msgstr "حفظ موضع التمرير" - -msgid "workspace.undo.entry.single.typography" -msgstr "أصل الكتابة" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.top" +msgstr "أعلى" #: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.selection-color" -msgstr "الألوان المختارة" +msgid "workspace.options.more-colors" +msgstr "المزيد من الألوان" #: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs msgid "workspace.options.more-lib-colors" msgstr "المزيد من ألوان المكتبة" -msgid "workspace.header.menu.disable-snap-pixel-grid" -msgstr "إبطال الفرقعة للبكسل" +msgid "workspace.options.opacity" +msgstr "العتامة" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in" -msgstr "خفف داخل" +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.position" +msgstr "الموضع" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.solid" -msgstr "صلب" +#: src/app/main/ui/workspace/sidebar/options.cljs +msgid "workspace.options.prototype" +msgstr "النموذج المبدئي" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.delete" -msgstr "محذوف %s" +msgid "workspace.options.radius" +msgstr "نصف القطر" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.top" -msgstr "أعلى" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-bottom-left" +msgstr "أسفل اليسار" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-bottom-right" +msgstr "أسفل اليمين" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-top-left" +msgstr "أعلى الشمال" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-top-right" +msgstr "أعلى اليمين" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius.all-corners" +msgstr "كل الزوايا" #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.radius.single-corners" msgstr "زوايا مستقلة" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.dotted" -msgstr "منقط" +msgid "workspace.options.recent-fonts" +msgstr "مؤخر" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-artboard-names" -msgstr "إخفاء أسماء البورد" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.retry" +msgstr "أعد المحاولة" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.backward" -msgstr "أرسل الى الخلف" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.rotation" +msgstr "دوران" + +msgid "workspace.options.search-font" +msgstr "البخث عن نوع الخط" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.select-a-shape" msgstr "اختر الشكل أو اللوحة لجر الإتصال الى لوحة أو شكل آخر" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke" -msgstr "ضرب" +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.selection-color" +msgstr "الألوان المختارة" -msgid "workspace.layout_grid.editor.title" -msgstr "تحرير التشبيك" +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.selection-fill" +msgstr "اختر نوع الملأ" -msgid "workspace.undo.entry.single.page" -msgstr "صفحة" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.selection-stroke" +msgstr "ضرب الإختيار" -#: src/app/main/ui/dashboard/team.cljs -msgid "team.webhooks.max-length" -msgstr "يجب الا يزيد اسم الويبهوك على 2048 حرفا" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.blur" +msgstr "تطميس" -msgid "workspace.sidebar.layers.images" -msgstr "صور" +msgid "workspace.options.shadow-options.color" +msgstr "لون الظل" -msgid "workspace.header.menu.show-pixel-grid" -msgstr "Show pixel grid" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.drop-shadow" +msgstr "إسقاط الظل" -msgid "workspace.header.menu.undo" -msgstr "الإلغاء" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.inner-shadow" +msgstr "التظليل الداخلي" -msgid "workspace.undo.entry.single.color" -msgstr "أصل اللون" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsetx" +msgstr "X" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.line-height" -msgstr "ارتفاع الخط" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsety" +msgstr "Y" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.ungroup" -msgstr "فك التجميع" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.spread" +msgstr "الانتشار" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-auto-height" -msgstr "الإرتفاع التلقائي" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title" +msgstr "الظل" -msgid "workspace.focus.focus-on" -msgstr "تشغيل التركيز" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title.group" +msgstr "ظل المجموعة" -msgid "viewer.header.comments-section" -msgstr "التعليقات (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title.multiple" +msgstr "ظلال الإختيار" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.unlock" -msgstr "الغاء القفل" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-bottom-right" -msgstr "أسفل اليمين" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay" -msgstr "فتح التراكب" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-dissolve" -msgstr "تذوب" +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.show-fill-on-export" +msgstr "أظهر في المصدر" -msgid "workspace.undo.entry.single.rect" -msgstr "مستطيل" +msgid "workspace.options.show-in-viewer" +msgstr "أظهر في وضع العرض" -msgid "shortcuts.toggle-visibility" -msgstr "أظهر\\أخف" +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.size" +msgstr "مقاس" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-full-screen" -msgstr "تكبير الشاشة" +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs +msgid "workspace.options.size-presets" +msgstr "الإعدادات المسبقة للحجم" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.cut" -msgstr "قطع" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke" +msgstr "ضرب" -msgid "workspace.header.menu.disable-scale-content" -msgstr "Disable proportional scale" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker" +msgstr "معلم الدائرة" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-object-slow" -msgstr "التصدير بطيء بشكل غير متوقع" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "الدائرة" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.lock" -msgstr "إغلاق" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker" +msgstr "معلم الماس" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.modify" -msgstr "معدل %s" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "الماس" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin-all" -msgstr "جميع النواحي" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow" +msgstr "سهم الخط" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.strikethrough" -msgstr "الإضراب من خلال(%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "سهم" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.reset-overrides" -msgstr "إعادة ضبط التجاوزات" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.none" +msgstr "لا شيء" -msgid "workspace.undo.entry.multiple.typography" -msgstr "أصول الكتابة" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.round" +msgstr "دائري" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-center" -msgstr "محاذاة المركز (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square" +msgstr "مربع" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.text-palette" -msgstr "الكتابات (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker" +msgstr "معلم المربع" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.titlecase" -msgstr "Title case" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "مستطيل" -msgid "workspace.sidebar.layers.frames" -msgstr "لوحات" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow" +msgstr "سهم المثلث" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fit" -msgstr "تقليص المقياس للتناسب" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "المثلث" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-object-error" -msgstr "Export failed" +msgid "workspace.options.stroke-color" +msgstr "لون الضرب" -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.hsv" -msgstr "HSV" +msgid "workspace.options.stroke-width" +msgstr "عرض الضرب" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.delete-flow-start" -msgstr "حذف المخطط" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.center" +msgstr "مركز" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-left" -msgstr "اأسفل اليسار" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.dashed" +msgstr "متقطع" #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "الماس" +msgid "workspace.options.stroke.dotted" +msgstr "منقط" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-offset-effect" -msgstr "تأثير الإزاحة" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.inner" +msgstr "داخل" #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke.mixed" msgstr "مختلط" -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgba" -msgstr "RGBA" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row" -msgstr "الصف" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to" -msgstr "الإنتقال الى" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.outer" +msgstr "خارج" #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.inner" -msgstr "داخل" +msgid "workspace.options.stroke.solid" +msgstr "صلب" #: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.underline" -msgstr "تسطير (%s)" +msgid "workspace.options.text-options.align-bottom" +msgstr "محاذاة الأسفل" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay-dest" -msgstr "إغلاق التراكب: %s" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-middle" +msgstr "محاذاة الوسط" -msgid "workspace.header.menu.redo" -msgstr "إعادة" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-top" +msgstr "محاذاة أعلى" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.detach-instance" -msgstr "فصل المثال" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.direction-ltr" +msgstr "LTR" #: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-right" -msgstr "محاذاة اليمين (%s)" +msgid "workspace.options.text-options.direction-rtl" +msgstr "RTL" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-textpalette" -msgstr "أظهر لوخة أسلوب الخط" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-auto-height" +msgstr "الإرتفاع التلقائي" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flip-horizontal" -msgstr "Flip horizontal" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-auto-width" +msgstr "العرض التلقائي" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.hard-light" -msgstr "ضوء الثابت" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-fixed" +msgstr "مثبت" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-max-w" -msgstr "أقصى عرض" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.letter-spacing" +msgstr "تباعد الحروف" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column-reverse" -msgstr "العموج العكسي" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.line-height" +msgstr "ارتفاع الخط" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.front" -msgstr "النقل الى الأمام" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.lowercase" +msgstr "أحرف صغيرة" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-center" -msgstr "مركز" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.none" +msgstr "لا شيء" -msgid "workspace.undo.entry.single.multiple" -msgstr "عنصر" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.strikethrough" +msgstr "الإضراب من خلال(%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.add-interaction" -msgstr "انقر على زر +لإضافة التفاعلات" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-center" +msgstr "محاذاة المركز (%s)" -msgid "workspace.shape.menu.difference" -msgstr "الفارق" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-justify" +msgstr "تعديل (%s)" -msgid "workspace.assets.duplicate-main" -msgstr "انسخ الأصل" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-left" +msgstr "محاذاة (%s)" -msgid "workspace.undo.entry.multiple.path" -msgstr "مسارات" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-right" +msgstr "محاذاة اليمين (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-right" -msgstr "أسفل اليمين" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title" +msgstr "نص" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show-main" -msgstr "أظهر المكون الرئيسي" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title-group" +msgstr "نص للمجموعة" -msgid "shortcuts.v-distribute" -msgstr "النشر عموديا" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title-selection" +msgstr "نص الإختيار" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.grid-title" -msgstr "تشبيك" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.titlecase" +msgstr "Title case" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.offsetx" -msgstr "X" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.underline" +msgstr "تسطير (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.none" -msgstr "لا شيء" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.uppercase" +msgstr "الأحرف الكبيرة" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.exclusion" -msgstr "الإستبعاد" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.use-play-button" +msgstr "استعمل زر التشغيل أعلاه لتشغيل منظر النموذج المبدئي." -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.title" -msgstr "تاريخ" +msgid "workspace.options.width" +msgstr "عرض" -msgid "workspace.options.recent-fonts" -msgstr "مؤخر" +msgid "workspace.options.x" +msgstr "X محور" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-textpalette" -msgstr "إخفاء لوحة أسلوب خط" +msgid "workspace.options.y" +msgstr "Y محور" -msgid "workspace.undo.entry.single.component" -msgstr "component" +msgid "workspace.path.actions.add-node" +msgstr "أضف العقدة (%s)" -msgid "workspace.assets.local-library" -msgstr "المكتبة المحلية" +msgid "workspace.path.actions.delete-node" +msgstr "احذف العقدة (%s)" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.unmask" -msgstr "كشف القناع" +msgid "workspace.path.actions.draw-nodes" +msgstr "جر العقدة (%s)" -msgid "shortcuts.toggle-textpalette" -msgstr "تبديل لوحة النص" +msgid "workspace.path.actions.join-nodes" +msgstr "صل العقد (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-top" -msgstr "محاذاة أعلى" +msgid "workspace.path.actions.make-corner" +msgstr "الى الزاوية (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-pressing" -msgstr "حين الضغط" +msgid "workspace.path.actions.make-curve" +msgstr "الى المنحنى (%s)" -msgid "workspace.sidebar.collapse" -msgstr "انهيار الشريط الجانبي" +msgid "workspace.path.actions.merge-nodes" +msgstr "دمج العقد (%s)" -msgid "workspace.options.height" -msgstr "طول" +msgid "workspace.path.actions.move-nodes" +msgstr "نقل العقد (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.update-main" -msgstr "تحديث العنصر الرئيسي" +msgid "workspace.path.actions.separate-nodes" +msgstr "فصل العقد (%s)" -msgid "shortcuts.toggle-rules" -msgstr "إظهار\\إخفاء المسطرة" +msgid "workspace.path.actions.snap-nodes" +msgstr "كسر العقد (%s)" #: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flow-start" -msgstr "بداية المخطط" +msgid "workspace.shape.menu.add-flex" +msgstr "إضافة تخطيط الثني" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.remove-flex" -msgstr "إزالة تخطيط المنحنى" +msgid "workspace.shape.menu.add-grid" +msgstr "إضافة تخطيط التشبيك" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow-start" -msgstr "إضافة المخطط" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.back" +msgstr "أرسل الى الخلف" -msgid "workspace.sidebar.layers.components" -msgstr "العناصر" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.backward" +msgstr "أرسل الى الخلف" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease" -msgstr "خفف" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.copy" +msgstr "انسخ" -#: src/app/main/ui/workspace/sidebar/options/menus/svg_attrs.cljs, src/app/main/ui/inspect/attributes/svg.cljs -msgid "workspace.sidebar.options.svg-attrs.title" -msgstr "السمات المستوردةSVG" +msgid "workspace.shape.menu.create-annotation" +msgstr "إنشاء تعليق توضيحي" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.comments" -msgstr "تعليقات (%s)" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.create-artboard-from-selection" +msgstr "تحديد محتوى اللوحة" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-none" -msgstr "لا شيء" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.create-component" +msgstr "إنشاء نعصر" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.lighten" -msgstr "تفتيح" +msgid "workspace.shape.menu.create-multiple-components" +msgstr "إنشاء عناصر جديدة" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "workspace.options.export-multiple" -msgstr "تحديد المصدر" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.cut" +msgstr "قطع" #: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.hide" -msgstr "إخفاء" +msgid "workspace.shape.menu.delete" +msgstr "حذف" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.retry" -msgstr "أعد المحاولة" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete-flow-start" +msgstr "حذف المخطط" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-relative-to" -msgstr "بالنسبة الى" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.detach-instance" +msgstr "فصل المثال" #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.update-components-in-bulk" -msgstr "تحديث العناصر الرئيسية" +msgid "workspace.shape.menu.detach-instances-in-bulk" +msgstr "فصل الامثلة" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.sidebar.history" -msgstr "التاريخ (%s)" +msgid "workspace.shape.menu.difference" +msgstr "الفارق" -msgid "workspace.options.clip-content" -msgstr "محتوى المقطع" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.duplicate" +msgstr "ينسخ" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.path" -msgstr "مسار (%s)" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.edit" +msgstr "تحرير" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius.all-corners" -msgstr "كل الزوايا" +msgid "workspace.shape.menu.exclude" +msgstr "استبعاد" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-right" -msgstr "أعلى اليمين" +msgid "workspace.shape.menu.flatten" +msgstr "تسطيح" #: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.select-layer" -msgstr "اختيار الطبقة" - -msgid "workspace.undo.entry.single.image" -msgstr "صورة" +msgid "workspace.shape.menu.flip-horizontal" +msgstr "Flip horizontal" -msgid "workspace.shape.menu.intersection" -msgstr "التفاعلات" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flip-vertical" +msgstr "التوجيه الرئسي" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-trigger" -msgstr "مشغل" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flow-start" +msgstr "بداية المخطط" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.shortcuts" -msgstr "الإختصار (%s)" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.forward" +msgstr "النقل الى الأمام" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding" -msgstr "حشوة" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.front" +msgstr "النقل الى الأمام" -msgid "title.team-webhooks" -msgstr "خطافات الويب - %s - Penpot" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.go-main" +msgstr "انتقل الى ملف العنصر الأصلي" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library-updates" -msgstr "تحديث المكتبة" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.group" +msgstr "مجموعة" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.none" -msgstr "لا شيء" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.hide" +msgstr "إخفاء" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-none" -msgstr "(غير مهيء)" +msgid "workspace.shape.menu.hide-ui" +msgstr "أظهر أو إخف UI" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing" -msgstr "تخفيف" +msgid "workspace.shape.menu.intersection" +msgstr "التفاعلات" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "المثلث" - -msgid "workspace.path.actions.draw-nodes" -msgstr "جر العقدة (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row-reverse" -msgstr "الصف العكسي" - -msgid "workspace.undo.entry.single.media" -msgstr "أصل الرسومات" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.packed" -msgstr "معباة" - -msgid "workspace.header.menu.enable-snap-pixel-grid" -msgstr "تمكين الفرقعة للبكسل" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-enter" -msgstr "إدخال الفأرة" - -msgid "workspace.undo.entry.single.circle" -msgstr "دائرة" - -msgid "viewer.header.interactions-section" -msgstr "التفاعلات (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title.group" -msgstr "ظل المجموعة" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title.group" -msgstr "طبقات المجموعة" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.reset-zoom" -msgstr "إعادة ضبط" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.assets" -msgstr "أصول" - -msgid "workspace.assets.open-library" -msgstr "افتح ملف المكتب" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.lock" +msgstr "إغلاق" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title-selection" -msgstr "نص الإختيار" +#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.mask" +msgstr "قناع" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "مكتبة مشتركة" +#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.paste" +msgstr "معجون" -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.size" -msgstr "مقاس" +msgid "workspace.shape.menu.path" +msgstr "طريق" -msgid "workspace.undo.entry.multiple.component" -msgstr "عناصر" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-flex" +msgstr "إزالة تخطيط المنحنى" -msgid "workspace.focus.selection" -msgstr "تحديد" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.reset-overrides" +msgstr "إعادة ضبط التجاوزات" -msgid "workspace.path.actions.merge-nodes" -msgstr "دمج العقد (%s)" +msgid "workspace.shape.menu.restore-main" +msgstr "استعادة العنصر الرئيسي" #: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.create-component" -msgstr "إنشاء نعصر" +msgid "workspace.shape.menu.select-layer" +msgstr "اختيار الطبقة" -msgid "workspace.undo.entry.multiple.color" -msgstr "أصول اللون" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show" +msgstr "العرض" -msgid "workspace.header.menu.enable-scale-content" -msgstr "تمكين المقياس النسبي" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-in-assets" +msgstr "العرض في لوحة الاصول" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.group-stroke" -msgstr "ضرب المجموعة" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-main" +msgstr "أظهر المكون الرئيسي" -msgid "workspace.shape.menu.union" -msgstr "اتحاد" +msgid "workspace.shape.menu.thumbnail-remove" +msgstr "أطهر الصورة المصغرة" msgid "workspace.shape.menu.thumbnail-set" msgstr "تعيين كصورة مصغرة" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fill" -msgstr "مقياس الملأ" - -msgid "workspace.sidebar.layers.texts" -msgstr "نصوص" +msgid "workspace.shape.menu.transform-to-path" +msgstr "تحويل الى المسار" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-left" -msgstr "محاذاة (%s)" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.ungroup" +msgstr "فك التجميع" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.dismiss" -msgstr "رفض" +msgid "workspace.shape.menu.union" +msgstr "اتحاد" #: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.duplicate" -msgstr "ينسخ" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "مزيد من المعلومات" +msgid "workspace.shape.menu.unlock" +msgstr "الغاء القفل" #: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.forward" -msgstr "النقل الى الأمام" +msgid "workspace.shape.menu.unmask" +msgstr "كشف القناع" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-hovering" -msgstr "حين التحوم" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.update-components-in-bulk" +msgstr "تحديث العناصر الرئيسية" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show" -msgstr "العرض" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.update-main" +msgstr "تحديث العنصر الرئيسي" -msgid "workspace.shape.menu.hide-ui" -msgstr "أظهر أو إخف UI" +msgid "workspace.sidebar.collapse" +msgstr "انهيار الشريط الجانبي" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.center" -msgstr "مركز" +msgid "workspace.sidebar.expand" +msgstr "توسيع الشريط الجانبي" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-manual" -msgstr "يدوي" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.sidebar.history" +msgstr "التاريخ (%s)" #: src/app/main/ui/workspace/left_toolbar.cljs msgid "workspace.sidebar.layers" msgstr "الطبقات" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-leave" -msgstr "إخراج الفأرة" - -msgid "workspace.assets.typography.text-styles" -msgstr "أسلوب خط النص" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker" -msgstr "معلم الدائرة" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-min-w" -msgstr "الحد الأدنى للعرض" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.gap" -msgstr "فجوة" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker" -msgstr "معلم المربع" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column" -msgstr "عمود" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation" -msgstr "الرسومات المتحركة" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.drop-shadow" -msgstr "إسقاط الظل" - -msgid "workspace.undo.entry.single.curve" -msgstr "منحنى" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.overlay" -msgstr "تراكب" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in-out" -msgstr "خفف داخل و خارج" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-guides" -msgstr "الفرقعة للخطوط الإرشادية" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-linear" -msgstr "خطي" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-on-click" -msgstr "بعد النقر" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to-dest" -msgstr "انتقال الى: %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.spread" -msgstr "الانتشار" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.bottom" -msgstr "أسفل" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-duration" -msgstr "مدة" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.advanced-ops" -msgstr "خيارات متقدمة" - -msgid "shortcuts.toggle-zoom-style" -msgstr "تبديل أسلوب التكبير" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-outside" -msgstr "عطل إذا نقر في الخارج" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.blur" -msgstr "تطميس" - -msgid "workspace.path.actions.separate-nodes" -msgstr "فصل العقد (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.selection-stroke" -msgstr "ضرب الإختيار" - -#: src/app/main/ui/workspace/sidebar/options.cljs -msgid "workspace.options.prototype" -msgstr "النموذج المبدئي" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.use-play-button" -msgstr "استعمل زر التشغيل أعلاه لتشغيل منظر النموذج المبدئي." - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.hue" -msgstr "مسحة" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-artboard-names" -msgstr "أظهر أسماء البورد" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.dashed" -msgstr "متقطع" +msgid "workspace.sidebar.layers.components" +msgstr "العناصر" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.left" -msgstr "شمال" +msgid "workspace.sidebar.layers.frames" +msgstr "لوحات" -msgid "workspace.shape.menu.thumbnail-remove" -msgstr "أطهر الصورة المصغرة" +msgid "workspace.sidebar.layers.groups" +msgstr "مجموعات" -msgid "shortcuts.toggle-layout-flex" -msgstr "أضف\\أزل ثني التخطيط" +msgid "workspace.sidebar.layers.images" +msgstr "صور" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.space-around" -msgstr "التباعد حول" +msgid "workspace.sidebar.layers.masks" +msgstr "قناعات" -msgid "workspace.options.width" -msgstr "عرض" +msgid "workspace.sidebar.layers.shapes" +msgstr "بسومات" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.rect" -msgstr "مستطيل (%s)" +msgid "workspace.sidebar.layers.texts" +msgstr "نصوص" -msgid "workspace.undo.entry.single.group" -msgstr "مجموعة" +#: src/app/main/ui/workspace/sidebar/options/menus/svg_attrs.cljs, src/app/main/ui/inspect/attributes/svg.cljs +msgid "workspace.sidebar.options.svg-attrs.title" +msgstr "السمات المستوردةSVG" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-max-w" -msgstr "أقصى عرض" +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "workspace.sidebar.sitemap" +msgstr "صفحات" #: src/app/main/ui/workspace/header.cljs msgid "workspace.sitemap" msgstr "خريطة الموقع" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-bottom-left" -msgstr "أسفل اليسار" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay" -msgstr "إغلاق التراكب" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker" -msgstr "معلم الماس" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.soft-light" -msgstr "ضوء خافت" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding-simple" -msgstr "حشوة بسيطة" - -msgid "workspace.shape.menu.create-annotation" -msgstr "إنشاء تعليق توضيحي" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-selected" -msgstr "تكبير" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay-dest" -msgstr "فتح التراكب: %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-url" -msgstr "رابط مفتوح" - -msgid "workspace.path.actions.delete-node" -msgstr "احذف العقدة (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-destination" -msgstr "وجهة" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.go-main" -msgstr "انتقل الى ملف العنصر الأصلي" - -msgid "shortcuts.undo" -msgstr "الغاء" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "سهم" - -msgid "workspace.path.actions.make-curve" -msgstr "الى المنحنى (%s)" - -msgid "workspace.options.search-font" -msgstr "البخث عن نوع الخط" - -msgid "workspace.path.actions.move-nodes" -msgstr "نقل العقد (%s)" - -msgid "workspace.path.actions.join-nodes" -msgstr "صل العقد (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-url" -msgstr "الرابط المفتوح" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.move" -msgstr "المكونات المعدلة" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title.multiple" -msgstr "الطبقات المحددة" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.direction-ltr" -msgstr "LTR" - -#: src/app/main/ui/dashboard/team.cljs -msgid "title.team-invitations" -msgstr "الدعوات - %s - Penpot" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.delete" -msgstr "حذف" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show-in-assets" -msgstr "العرض في لوحة الاصول" - -msgid "workspace.undo.entry.multiple.shape" -msgstr "أشكال" - -msgid "workspace.options.interaction-auto" -msgstr "تلقائي" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title.multiple" -msgstr "ظلال الإختيار" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-prev-screen" -msgstr "الشاشة السابقة" - #: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.text" -msgstr "نص (%s)" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.copy" -msgstr "انسخ" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.curve" -msgstr "منحنى (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding-all" -msgstr "جميع النواحي" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title" -msgstr "نص" - -msgid "shortcuts.underline" -msgstr "الخط التحتي" - -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgb-complementary" -msgstr "RGB مكملات" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.edit" -msgstr "التحرير" +msgid "workspace.toolbar.assets" +msgstr "أصول" -msgid "shortcuts.unmask" -msgstr "كشف القناع" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.color-palette" +msgstr "لوحة اللون (%s)" -msgid "workspace.options.y" -msgstr "Y محور" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.comments" +msgstr "تعليقات (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.round" -msgstr "دائري" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.curve" +msgstr "منحنى (%s)" -msgid "shortcuts.toggle-lock" -msgstr "قفل\\فتح" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.ellipse" +msgstr "الشكل البيضاوي (%s)" -msgid "viewer.breaking-change.message" -msgstr "آسف" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.frame" +msgstr "لوحة (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title" -msgstr "طبقة" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.image" +msgstr "صورة (%s)" -msgid "workspace.undo.entry.multiple.text" -msgstr "نصوص" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.move" +msgstr "تحريك (%s)" -msgid "workspace.sidebar.layers.shapes" -msgstr "بسومات" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.path" +msgstr "مسار (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.add-flow-start" -msgstr "إضافة المخطط" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.rect" +msgstr "مستطيل (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.show-fill-on-export" -msgstr "أظهر في المصدر" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.shortcuts" +msgstr "الإختصار (%s)" -msgid "shortcuts.toggle-lock-size" -msgstr "قفل النسب" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text" +msgstr "نص (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-max-h" -msgstr "أقصى ارتفاع" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text-palette" +msgstr "الكتابات (%s)" -msgid "workspace.shape.menu.restore-main" -msgstr "استعادة العنصر الرئيسي" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.empty" +msgstr "لا يوجد تغييرات في التاريخ الى الآن" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.saturation" -msgstr "التشبع" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.delete" +msgstr "محذوف %s" -msgid "workspace.sidebar.expand" -msgstr "توسيع الشريط الجانبي" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.modify" +msgstr "معدل %s" -#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.mask" -msgstr "قناع" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.move" +msgstr "المكونات المعدلة" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay-dest" -msgstr "تبديل التراكب: %s" +msgid "workspace.undo.entry.multiple.circle" +msgstr "دوائر" -msgid "workspace.path.actions.make-corner" -msgstr "الى الزاوية (%s)" +msgid "workspace.undo.entry.multiple.color" +msgstr "أصول اللون" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "الدائرة" +msgid "workspace.undo.entry.multiple.component" +msgstr "عناصر" -msgid "workspace.options.stroke-color" -msgstr "لون الضرب" +msgid "workspace.undo.entry.multiple.curve" +msgstr "منحنيات" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.outer" -msgstr "خارج" +msgid "workspace.undo.entry.multiple.frame" +msgstr "لوحة" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-top-left" -msgstr "أعلى الشمال" +msgid "workspace.undo.entry.multiple.group" +msgstr "مجموعات" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.normal" -msgstr "عادي" +msgid "workspace.undo.entry.multiple.media" +msgstr "الأصول الرسومية" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.preferences" -msgstr "التفضيلات" +msgid "workspace.undo.entry.multiple.multiple" +msgstr "أشياء" -msgid "workspace.shape.menu.exclude" -msgstr "استبعاد" +msgid "workspace.undo.entry.multiple.page" +msgstr "صفحات" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.rotation" -msgstr "دوران" +msgid "workspace.undo.entry.multiple.path" +msgstr "مسارات" -msgid "shortcuts.zoom-lense-decrease" -msgstr "تنقيص عدسة التكبير" +msgid "workspace.undo.entry.multiple.rect" +msgstr "مستطيلات" -msgid "workspace.undo.entry.single.shape" -msgstr "شكل" +msgid "workspace.undo.entry.multiple.shape" +msgstr "أشكال" -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "workspace.sidebar.sitemap" -msgstr "صفحات" +msgid "workspace.undo.entry.multiple.text" +msgstr "نصوص" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.view" -msgstr "المنظر" +msgid "workspace.undo.entry.multiple.typography" +msgstr "أصول الكتابة" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.detach-instances-in-bulk" -msgstr "فصل الامثلة" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.new" +msgstr "جديد %s" -msgid "workspace.focus.focus-off" -msgstr "تعطيل التركيز" +msgid "workspace.undo.entry.single.circle" +msgstr "دائرة" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "title.settings.access-tokens" -msgstr "رموز الوصول للحساب" +msgid "workspace.undo.entry.single.color" +msgstr "أصل اللون" -msgid "workspace.options.radius" -msgstr "نصف القطر" +msgid "workspace.undo.entry.single.component" +msgstr "component" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.back" -msgstr "أرسل الى الخلف" +msgid "workspace.undo.entry.single.curve" +msgstr "منحنى" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow" -msgstr "سهم الخط" +msgid "workspace.undo.entry.single.frame" +msgstr "لوحة" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.edit" -msgstr "تحرير" +msgid "workspace.undo.entry.single.group" +msgstr "مجموعة" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fit-all" -msgstr "التكبير لتناسب الجميع" +msgid "workspace.undo.entry.single.image" +msgstr "صورة" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-after-delay" -msgstr "بعد التأخير" +msgid "workspace.undo.entry.single.media" +msgstr "أصل الرسومات" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-max-h" -msgstr "أقصى ارتفاع" +msgid "workspace.undo.entry.single.multiple" +msgstr "عنصر" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title" -msgstr "الظل" +msgid "workspace.undo.entry.single.page" +msgstr "صفحة" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.help-info" -msgstr "المساعدة و المعلومة" +msgid "workspace.undo.entry.single.path" +msgstr "مسار" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title-group" -msgstr "نص للمجموعة" +msgid "workspace.undo.entry.single.rect" +msgstr "مستطيل" + +msgid "workspace.undo.entry.single.shape" +msgstr "شكل" msgid "workspace.undo.entry.single.text" msgstr "نص" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-fixed" -msgstr "مثبت" +msgid "workspace.undo.entry.single.typography" +msgstr "أصل الكتابة" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.image" -msgstr "صورة (%s)" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.unknown" +msgstr "انتهت العملية %s" -msgid "workspace.undo.entry.single.path" -msgstr "مسار" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.title" +msgstr "تاريخ" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.add-flex" -msgstr "إضافة تخطيط الثني" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.dismiss" +msgstr "رفض" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "مزيد من المعلومات" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.there-are-updates" +msgstr "يوجد تحديثات في المكتبة المشتركة" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.update" +msgstr "تحديث" + +msgid "workspace.viewport.click-to-close-path" +msgstr "انقر لتغلق المسار" diff --git a/frontend/translations/cs.po b/frontend/translations/cs.po index b2f2225f4..d0b667449 100644 --- a/frontend/translations/cs.po +++ b/frontend/translations/cs.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-01-23 15:02+0000\n" "Last-Translator: \"Amerey.eu\" \n" -"Language-Team: Czech \n" +"Language-Team: Czech " +"\n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -84,6 +84,14 @@ msgstr "LDAP" msgid "auth.login-with-oidc-submit" msgstr "OpenID" +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "Název musí obsahovat jiný znak než mezeru." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "Název musí obsahovat maximálně 250 znaků." + #: src/app/main/ui/auth/recovery.cljs msgid "auth.new-password" msgstr "Zadejte nové heslo" @@ -116,6 +124,10 @@ msgstr "Heslo" msgid "auth.password-length-hint" msgstr "Minimálně 8 znaků" +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "Heslo musí obsahovat jiný znak než mezeru." + msgid "auth.privacy-policy" msgstr "Zásady ochrany osobních údajů" @@ -164,10 +176,21 @@ msgstr "" "Vytvořením nového účtu souhlasíte s všeobecnými podmínkami poskytování " "služeb a zásadami ochrany osobních údajů." +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Při vytváření nového účtu souhlasíte s našimi [smluvními podmínkami](%s) a " +"[zásadami ochrany soukromí](%s)." + #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "Ověřovací e-mail jsme odeslali na adresu" +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...branding, ilustrace, marketing atd." + msgid "common.publish" msgstr "Zveřejnit" @@ -265,6 +288,83 @@ msgstr "Začít prohlídku" msgid "dasboard.walkthrough-hero.title" msgstr "Průvodce rozhraním" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.copied-success" +msgstr "Zkopírovaný token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "Generovat nový token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "Přístupový token byl úspěšně vytvořen." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "" +"Pro vygenerování nového tokenu stiskněte tlačítko \"Vygenerovat nový " +"token\"." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "Zatím nemáte žádné tokeny." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "Jméno je povinné" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "180 dní" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "30 dní" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "60 dní" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "90 dní" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "Nikdy" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "Platnost vypršela %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "Platnost vyprší %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.no-expiration" +msgstr "Žádné datum vypršení platnosti" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "Osobní přístupové tokeny" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"Osobní přístupové tokeny fungují jako alternativa k našemu systému " +"ověřování přihlašovacích údajů/hesel a lze je použít k tomu, aby aplikaci " +"umožnily přístup k internímu rozhraní Penpot API" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "Platnost tokenu vyprší %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "Token nemá žádné datum vypršení platnosti" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "dashboard.add-shared" @@ -756,6 +856,9 @@ msgstr "Písmo %s se nepodařilo načíst" msgid "errors.bad-font-plural" msgstr "Písma %s se nepodařilo načíst" +msgid "errors.cannot-upload" +msgstr "Nelze nahrát soubor médií." + #: src/app/main/data/workspace.cljs msgid "errors.clipboard-not-implemented" msgstr "Váš prohlížeč tuto operaci nedokáže provést" @@ -794,13 +897,20 @@ msgstr "E-mail «%s» byl nahlášen jako spam nebo byl trvale nedostupný." #: src/app/main/errors.cljs msgid "errors.feature-mismatch" msgstr "" -"Vypadá to, že otevíráte soubor, který má povolenou funkci '%s', ale aktuální " -"verze penpotu ji nepodporuje nebo je deaktivovaná." +"Vypadá to, že otevíráte soubor, který má povolenou funkci '%s', ale " +"aktuální verze penpotu ji nepodporuje nebo je deaktivovaná." #: src/app/main/errors.cljs msgid "errors.feature-not-supported" msgstr "Funkce '%s' není podporována." +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Zdá se, že existuje nesoulad mezi povolenými funkcemi a funkcemi souboru, " +"který se pokoušíte otevřít. Před otevřením souboru je třeba provést migraci " +"pro '%s'." + #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -851,6 +961,9 @@ msgstr "Potvrzovací heslo se musí shodovat" msgid "errors.password-too-short" msgstr "Heslo by mělo mít nejméně 8 znaků" +msgid "errors.paste-data-validation" +msgstr "Neplatná data ve schránce" + msgid "errors.profile-blocked" msgstr "Profil je zablokován" @@ -864,6 +977,10 @@ msgstr "Váš profil má ztlumené e-maily (zprávy o spamu nebo vysoká nedoru msgid "errors.registration-disabled" msgstr "Registrace je momentálně zakázána." +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Zjištěna nekompatibilní funkce '%s'" + msgid "errors.team-leave.insufficient-members" msgstr "" "Nedostatečný počet členů pro opuštění týmu, pravděpodobně jste chtěli tým " @@ -885,6 +1002,13 @@ msgstr "Došlo k neočekávané chybě." msgid "errors.unexpected-token" msgstr "Neznámý token" +msgid "errors.validation" +msgstr "Chyba ověření" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Soubor má nekompatibilní číslo verze" + msgid "errors.webhooks.connection" msgstr "Chyba připojení, adresa URL není dostupná" @@ -1118,6 +1242,9 @@ msgstr "Žádná" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "První písmena velká" +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Nenastaveno" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Velká písmena" @@ -1186,6 +1313,10 @@ msgstr "Zkratky" msgid "labels.accept" msgstr "Přijmout" +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "Přístupové tokeny" + msgid "labels.active" msgstr "Aktivní" @@ -1289,6 +1420,9 @@ msgstr "Smazat pozvánku" msgid "labels.delete-multi-files" msgstr "Smazat soubory %s" +msgid "labels.discard" +msgstr "Zahodit" + #: src/app/main/ui/dashboard/projects.cljs, #: src/app/main/ui/dashboard/sidebar.cljs, #: src/app/main/ui/dashboard/files.cljs, @@ -1520,6 +1654,9 @@ msgstr "Role" msgid "labels.save" msgstr "Uložit" +msgid "labels.search" +msgstr "Hledat" + msgid "labels.search-font" msgstr "Hledat písmo" @@ -1544,6 +1681,9 @@ msgstr "Služba je nedostupná" msgid "labels.settings" msgstr "Nastavení" +msgid "labels.share" +msgstr "Sdílet" + msgid "labels.share-prototype" msgstr "Sdílet prototyp" @@ -1613,10 +1753,34 @@ msgstr "(vy)" msgid "labels.your-account" msgstr "Váš účet" +msgid "media.choose-image" +msgstr "Vyberte obrázek" + +msgid "media.gradient" +msgstr "Přechod" + +msgid "media.image" +msgstr "Obrázek" + +msgid "media.linear" +msgstr "Lineární" + #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Načítání obrázku…" +msgid "media.radial" +msgstr "Radiální" + +msgid "media.solid" +msgstr "Plná" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Vaše knihovna je prázdná. Po přidání jako sdílená knihovna budou položky, " +"které vytvoříte, k dispozici pro použití se zbytkem vašich souborů. Opravdu " +"ji chcete publikovat?" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -1660,6 +1824,30 @@ msgstr "Změnit e-mail" msgid "modals.change-email.title" msgstr "Změňte svůj e-mail" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.copy-token" +msgstr "Kopírovat token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.expiration-date.label" +msgstr "Datum vypršení platnosti" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "Jméno" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.placeholder" +msgstr "Název může pomoci zjistit, k čemu token slouží" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "Vytvořit token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "Vygenerujte přístupový token" + msgid "modals.create-webhook.submit-label" msgstr "Vytvořit webhook" @@ -1672,6 +1860,18 @@ msgstr "Adresa URL datové části" msgid "modals.create-webhook.url.placeholder" msgstr "https://example.com/postreceive" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "Smazat token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.message" +msgstr "Opravdu chcete tento token smazat?" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "Smazat token" + #: src/app/main/ui/settings/delete_account.cljs msgid "modals.delete-account.cancel" msgstr "Zrušit a ponechat si můj účet" @@ -1702,6 +1902,12 @@ msgstr "" msgid "modals.delete-comment-thread.title" msgstr "Smazat konverzaci" +msgid "modals.delete-component-annotation.message" +msgstr "Opravdu chcete smazat tuto anotaci?" + +msgid "modals.delete-component-annotation.title" +msgstr "Smazat anotaci" + #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-file-confirm.accept" msgstr "Smazat soubor" @@ -1768,6 +1974,20 @@ msgstr[0] "Smazat soubor" msgstr[1] "Smazat soubory" msgstr[2] "Smazat soubory" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "Není aktivován v žádném souboru." +msgstr[1] "Nejsou aktivovány v žádném souboru." +msgstr[2] "Nejsou aktivovány v žádném souboru." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.scd-message" +msgid_plural "modals.delete-shared-confirm.activated.scd-message" +msgstr[0] "Tato knihovna je aktivována zde: " +msgstr[1] "Tyto knihovny jsou aktivovány zde: " +msgstr[2] "Tyto knihovny jsou aktivovány zde: " + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-shared-confirm.message" @@ -1810,6 +2030,19 @@ msgstr "Opravdu chcete tohoto člena smazat z týmu?" msgid "modals.delete-team-member-confirm.title" msgstr "Smazat člena týmu" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "" +"Aktiva, která již byla v tomto souboru použita, tam zůstanou (nebude " +"porušen žádný návrh)." +msgstr[1] "" +"Aktiva, která již byla v těchto souborech použita, tam zůstanou (nebude " +"porušen žádný návrh)." +msgstr[2] "" +"Aktiva, která již byla v těchto souborech použita, tam zůstanou (nebude " +"porušen žádný návrh)." + msgid "modals.delete-webhook.accept" msgstr "Smazat webhook" @@ -1910,6 +2143,15 @@ msgstr "" msgid "modals.promote-owner-confirm.title" msgstr "Nový majitel týmu" +msgid "modals.publish-empty-library.accept" +msgstr "Publikovat" + +msgid "modals.publish-empty-library.message" +msgstr "Vaše knihovna je prázdná. Opravdu to chcete publikovat?" + +msgid "modals.publish-empty-library.title" +msgstr "Publikovat prázdnou knihovnu" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.remove-shared-confirm.accept" @@ -1986,6 +2228,10 @@ msgstr "" msgid "modals.update-remote-component.message" msgstr "Aktualizovat komponentu ve sdílené knihovně" +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "K dispozici je nová verze, obnovte prosím stránku" + #: src/app/main/ui/dashboard/team.cljs msgid "notifications.invitation-email-sent" msgstr "Pozvánka byla úspěšně odeslána" @@ -2071,15 +2317,36 @@ msgstr "Průvodce přispíváním" msgid "onboarding-v2.welcome.title" msgstr "Vítejte v Penpot!" +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Pokračujte ve vytváření týmu" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Pokračovat bez týmu" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Vytvořte tým a pozvěte" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Vytvořte tým a odešlete pozvánky" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Budete moci pozvat později" + msgid "onboarding.choice.team-up.create-team-desc" msgstr "Po pojmenování svého týmu budete moci pozvat lidi, aby se přidali." msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "Zadejte název týmu" -msgid "onboarding.choice.team-up.invite-members" -msgstr "Pozvat členy" - +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Vytvořte tým" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Vytvořte tým bez pozvánek" + +msgid "onboarding.choice.team-up.invite-members" +msgstr "Pozvat členy" + msgid "onboarding.choice.team-up.invite-members-info" msgstr "" "Nezapomeňte zahrnout všechny. Vývojáře, designéry, manažéry... rozmanitost " @@ -2088,6 +2355,12 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Pozvat s rolí:" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Začněte bez týmu" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Později budete moci vytvořit tým." + msgid "onboarding.newsletter.accept" msgstr "Ano, přihlásit se k odběru" @@ -2136,6 +2409,176 @@ msgstr "Penpot" msgid "profile.recovery.go-to-login" msgstr "Přejít na přihlášení" +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "S jakým designovým nástrojem máte více zkušeností?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "Hodně" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canva" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "Jak byste nejlépe popsali své zkušenosti s prací na..." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Designer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Vývojář" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "Zjistěte více o Penpot" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Zakladatel / viceprezident" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Jsem freelancer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Získejte kód z mého týmového projektu " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... design rozhraní, vizuální aktiva, návrhové systémy atd." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "InVision" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Zanechte zpětnou vazbu pro můj týmový projekt" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "Pusťme se do toho!" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Produktový nebo projektový manažer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Marketing" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "Více než 50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Další" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Žádný" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Jiné (upřesněte)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "Pracuji na osobním projektu" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "Předchozí" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Jak plánujete používat Penpot?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Jaká je vaše role?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Vyberte možnost" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Sketch" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Nějaké" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Start" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Začněte pracovat na mém projektu" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Student nebo učitel" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "Jaká je velikost vašeho týmu?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Vyzkoušejte Penpot, abyste zjistili, zda je vhodný pro tým " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Před použitím Penpot on-premise si to vyzkoušejte" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "... drátové modely, cesty a toky uživatelů, navigační stromy atd." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Práce v konceptech" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Vaše zpětná vazba nám pomůže porozumět vašim zvykům a preferencím, abychom " +"mohli i nadále dělat Penpot užitečným nástrojem." + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Odpojit" + #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, @@ -2507,6 +2950,9 @@ msgstr "Vybrat vše" msgid "shortcuts.select-next" msgstr "Vybrat další vrstvu" +msgid "shortcuts.select-parent-layer" +msgstr "Vybrat nadřazenou vrstvu" + msgid "shortcuts.select-prev" msgstr "Vybrat předchozí vrstvu" @@ -2534,6 +2980,18 @@ msgstr "Začít měření" msgid "shortcuts.stop-measure" msgstr "Zastavit měření" +msgid "shortcuts.text-align-center" +msgstr "Zarovnat na střed" + +msgid "shortcuts.text-align-justify" +msgstr "Zarovnat do bloku" + +msgid "shortcuts.text-align-left" +msgstr "Zarovnat vlevo" + +msgid "shortcuts.text-align-right" +msgstr "Zarovnat vpravo" + msgid "shortcuts.thumbnail-set" msgstr "Nastavit náhledy" @@ -2607,6 +3065,10 @@ msgstr "Zvětšení zoomu" msgid "shortcuts.zoom-selected" msgstr "Přiblížit na vybrané" +#: src/app/main/ui/dashboard/team.cljs +msgid "team.webhooks.max-length" +msgstr "Název webhooku musí obsahovat maximálně 2048 znaků." + #: src/app/main/ui/dashboard/files.cljs msgid "title.dashboard.files" msgstr "%s - Penpot" @@ -2635,6 +3097,10 @@ msgstr "Sdílené knihovny - %s - Penpot" msgid "title.default" msgstr "Penpot – Svoboda designu pro týmy" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "Profil – Přístupové tokeny" + #: src/app/main/ui/settings/feedback.cljs msgid "title.settings.feedback" msgstr "Poskytněte zpětnou vazbu – Penpot" @@ -2831,6 +3297,9 @@ msgstr "místní knihovna" msgid "workspace.assets.not-found" msgstr "Nebyly nalezeny žádné podklady" +msgid "workspace.assets.open-library" +msgstr "Otevřete soubor knihovny" + #: src/app/main/ui/workspace/sidebar/sitemap.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs @@ -2852,6 +3321,10 @@ msgstr[0] "%s položka vybrána" msgstr[1] "Počet vybraných položek: %s" msgstr[2] "Počet vybraných položek: %s" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "Sdílená knihovna" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" @@ -3048,6 +3521,10 @@ msgstr "Neuložené změny" msgid "workspace.header.viewer" msgstr "Režim zobrazení (%s)" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "Přiblížení" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.zoom-fill" msgstr "Výplň – přizpůsobit, aby vyplnil" @@ -3068,6 +3545,21 @@ msgstr "Celá obrazovka" msgid "workspace.header.zoom-selected" msgstr "Přiblížit na vybrané" +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Upravit mřížku" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Odejít" + +msgid "workspace.layout_grid.editor.title" +msgstr "Úprava mřížky" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Hotovo" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Lokalizovat" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Přidat" @@ -3076,6 +3568,14 @@ msgstr "Přidat" msgid "workspace.libraries.colors" msgstr "barvy %s" +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "Ve vaší knihovně zatím nejsou žádné barevné styly" + +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "Ve vaší knihovně zatím nejsou žádné typografické styly" + #: src/app/main/ui/workspace/colorpicker/libraries.cljs, #: src/app/main/ui/workspace/colorpalette.cljs msgid "workspace.libraries.colors.file-library" @@ -3126,6 +3626,10 @@ msgstr "KNIHOVNY" msgid "workspace.libraries.library" msgstr "KNIHOVNA" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library-updates" +msgstr "AKTUALIZACE KNIHOVNY" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "Neexistují žádné sdílené knihovny, které by potřebovaly aktualizaci" @@ -3162,6 +3666,10 @@ msgstr "%s typografie" msgid "workspace.libraries.update" msgstr "Aktualizace" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "zobrazit všechny změny" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.updates" msgstr "AKTUALIZACE" @@ -3193,11 +3701,32 @@ msgstr "Oříznout obsah" msgid "workspace.options.component" msgstr "Komponent" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints" -msgstr "Omezení" +msgid "workspace.options.component.annotation" +msgstr "Anotace" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.component.copy" +msgstr "Kopírovat" + +msgid "workspace.options.component.create-annotation" +msgstr "Vytvořte anotaci" + +msgid "workspace.options.component.edit-annotation" +msgstr "Upravit anotaci" + +msgid "workspace.options.component.main" +msgstr "Hlavní" + +msgid "workspace.options.component.swap" +msgstr "Vyměnit komponent" + +msgid "workspace.options.component.swap.empty" +msgstr "V této knihovně zatím nejsou žádné položky" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints" +msgstr "Omezení" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints.bottom" msgstr "Dole" @@ -3287,6 +3816,10 @@ msgstr "Výplň" msgid "workspace.options.flows.add-flow-start" msgstr "Přidat počáteční bod" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Flow" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "Začátek" @@ -3390,6 +3923,9 @@ msgstr "Výplň skupiny" msgid "workspace.options.group-stroke" msgstr "Ohraničení skupiny" +msgid "workspace.options.guides.title" +msgstr "Vodítka" + msgid "workspace.options.height" msgstr "Výška" @@ -3936,14 +4472,26 @@ msgstr "Tah" msgid "workspace.options.stroke-cap.circle-marker" msgstr "Zakončení - kruh" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Kruh" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "Zakončení - diamant" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Diamant" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "Zakončení - šipka" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Šipka" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "Žádné" @@ -3960,10 +4508,18 @@ msgstr "Čtvercové" msgid "workspace.options.stroke-cap.square-marker" msgstr "Zakončení - čtverec" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Obdélník" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "Zakončení - trojúhelník" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Trojúhelník" + msgid "workspace.options.stroke-color" msgstr "Barva tahu" @@ -4138,6 +4694,9 @@ msgstr "Přichytit uzly (%s)" msgid "workspace.shape.menu.add-flex" msgstr "Přidat flexibilní rozložení" +msgid "workspace.shape.menu.add-grid" +msgstr "Přidat rozvržení mřížky" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.back" msgstr "Poslat na konec" @@ -4150,6 +4709,9 @@ msgstr "Poslat dozadu" msgid "workspace.shape.menu.copy" msgstr "Kopírovat" +msgid "workspace.shape.menu.create-annotation" +msgstr "Vytvořit anotaci" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.create-artboard-from-selection" msgstr "Výběr na tabuli" @@ -4158,6 +4720,9 @@ msgstr "Výběr na tabuli" msgid "workspace.shape.menu.create-component" msgstr "Vytvořit komponent" +msgid "workspace.shape.menu.create-multiple-components" +msgstr "Vytvořte více komponent" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.cut" msgstr "Vyjmout" @@ -4425,6 +4990,13 @@ msgstr "Text (%s)" msgid "workspace.toolbar.text-palette" msgstr "Typografie (%s)" +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**Režim kontroly** (Pouze zobrazení)" + +msgid "workspace.top-bar.read-only.done" +msgstr "Hotovo" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Zatím nedošlo k žádným změnám v historii" @@ -4544,6 +5116,10 @@ msgstr "Historie" msgid "workspace.updates.dismiss" msgstr "Zrušit" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "Více informací" + #: src/app/main/data/workspace/libraries.cljs msgid "workspace.updates.there-are-updates" msgstr "Ve sdílených knihovnách jsou aktualizace" @@ -4554,578 +5130,3 @@ msgstr "Aktualizace" msgid "workspace.viewport.click-to-close-path" msgstr "Kliknutím zavřete cestu" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-never" -msgstr "Nikdy" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "Platnost vypršela %s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.no-expiration" -msgstr "Žádné datum vypršení platnosti" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Soubor má nekompatibilní číslo verze" - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Zjištěna nekompatibilní funkce '%s'" - -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Nenastaveno" - -msgid "labels.discard" -msgstr "Zahodit" - -msgid "labels.share" -msgstr "Sdílet" - -msgid "labels.search" -msgstr "Hledat" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.submit-label" -msgstr "Vytvořit token" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.scd-message" -msgid_plural "modals.delete-shared-confirm.activated.scd-message" -msgstr[0] "Tato knihovna je aktivována zde: " -msgstr[1] "Tyto knihovny jsou aktivovány zde: " -msgstr[2] "Tyto knihovny jsou aktivovány zde: " - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Vytvořte tým a odešlete pozvánky" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Vytvořte tým bez pozvánek" - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Vytvořte tým" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Budete moci pozvat později" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "31-50" - -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Pokračujte ve vytváření týmu" - -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Začněte bez týmu" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Později budete moci vytvořit tým." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Canva" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Odpojit" - -#: src/app/main/ui/dashboard/team.cljs -msgid "team.webhooks.max-length" -msgstr "Název webhooku musí obsahovat maximálně 2048 znaků." - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom" -msgstr "Přiblížení" - -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Upravit mřížku" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Odejít" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library-updates" -msgstr "AKTUALIZACE KNIHOVNY" - -msgid "workspace.options.component.swap" -msgstr "Vyměnit komponent" - -msgid "workspace.options.component.swap.empty" -msgstr "V této knihovně zatím nejsou žádné položky" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Flow" - -msgid "workspace.top-bar.read-only.done" -msgstr "Hotovo" - -msgid "media.image" -msgstr "Obrázek" - -msgid "media.solid" -msgstr "Plná" - -msgid "media.linear" -msgstr "Lineární" - -msgid "media.radial" -msgstr "Radiální" - -msgid "media.gradient" -msgstr "Přechod" - -msgid "media.choose-image" -msgstr "Vyberte obrázek" - -msgid "workspace.options.guides.title" -msgstr "Vodítka" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Při vytváření nového účtu souhlasíte s našimi [smluvními podmínkami](%s) a [" -"zásadami ochrany soukromí](%s)." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.copied-success" -msgstr "Zkopírovaný token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"Osobní přístupové tokeny fungují jako alternativa k našemu systému ověřování " -"přihlašovacích údajů/hesel a lze je použít k tomu, aby aplikaci umožnily " -"přístup k internímu rozhraní Penpot API" - -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Zdá se, že existuje nesoulad mezi povolenými funkcemi a funkcemi souboru, " -"který se pokoušíte otevřít. Před otevřením souboru je třeba provést migraci " -"pro '%s'." - -msgid "errors.validation" -msgstr "Chyba ověření" - -msgid "errors.paste-data-validation" -msgstr "Neplatná data ve schránce" - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Pokračovat bez týmu" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Vytvořte tým a pozvěte" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Adobe XD" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "Vývojář" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Figma" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "InVision" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "Zanechte zpětnou vazbu pro můj týmový projekt" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "Další" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "Jiné (upřesněte)" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "Pracuji na osobním projektu" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "Předchozí" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "Jak plánujete používat Penpot?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "Jaká je vaše role?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "Vyberte možnost" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "Jaká je velikost vašeho týmu?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "Vyzkoušejte Penpot, abyste zjistili, zda je vhodný pro tým " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"Vaše zpětná vazba nám pomůže porozumět vašim zvykům a preferencím, abychom " -"mohli i nadále dělat Penpot užitečným nástrojem." - -msgid "shortcuts.text-align-center" -msgstr "Zarovnat na střed" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Lokalizovat" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Hotovo" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "zobrazit všechny změny" - -msgid "workspace.options.component.annotation" -msgstr "Anotace" - -msgid "workspace.shape.menu.create-multiple-components" -msgstr "Vytvořte více komponent" - -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Režim kontroly** (Pouze zobrazení)" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Vaše knihovna je prázdná. Po přidání jako sdílená knihovna budou položky, " -"které vytvoříte, k dispozici pro použití se zbytkem vašich souborů. Opravdu " -"ji chcete publikovat?" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.copy-token" -msgstr "Kopírovat token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.label" -msgstr "Jméno" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.placeholder" -msgstr "Název může pomoci zjistit, k čemu token slouží" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.message" -msgstr "Opravdu chcete tento token smazat?" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.title" -msgstr "Smazat token" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "" -"Aktiva, která již byla v tomto souboru použita, tam zůstanou (nebude porušen " -"žádný návrh)." -msgstr[1] "" -"Aktiva, která již byla v těchto souborech použita, tam zůstanou (nebude " -"porušen žádný návrh)." -msgstr[2] "" -"Aktiva, která již byla v těchto souborech použita, tam zůstanou (nebude " -"porušen žádný návrh)." - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "Název musí obsahovat maximálně 250 znaků." - -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "Název musí obsahovat jiný znak než mezeru." - -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-not-empty" -msgstr "Heslo musí obsahovat jiný znak než mezeru." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.no-access-tokens" -msgstr "Zatím nemáte žádné tokeny." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "Přístupový token byl úspěšně vytvořen." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expires-on" -msgstr "Platnost vyprší %s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-60-days" -msgstr "60 dní" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "30 dní" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "180 dní" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-90-days" -msgstr "90 dní" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "Jméno je povinné" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-expire" -msgstr "Platnost tokenu vyprší %s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-not-expire" -msgstr "Token nemá žádné datum vypršení platnosti" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.access-tokens" -msgstr "Přístupové tokeny" - -msgid "workspace.options.component.edit-annotation" -msgstr "Upravit anotaci" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "Začněte pracovat na mém projektu" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "Žádný" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "... drátové modely, cesty a toky uživatelů, navigační stromy atd." - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.no-files-message" -msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "Není aktivován v žádném souboru." -msgstr[1] "Nejsou aktivovány v žádném souboru." -msgstr[2] "Nejsou aktivovány v žádném souboru." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "Generovat nový token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "" -"Pro vygenerování nového tokenu stiskněte tlačítko \"Vygenerovat nový token\"." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "Osobní přístupové tokeny" - -msgid "errors.cannot-upload" -msgstr "Nelze nahrát soubor médií." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.expiration-date.label" -msgstr "Datum vypršení platnosti" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.accept" -msgstr "Smazat token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.title" -msgstr "Vygenerujte přístupový token" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "Designer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Zakladatel / viceprezident" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "Pusťme se do toho!" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "Jsem freelancer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "Produktový nebo projektový manažer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Marketing" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "Více než 50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Sketch" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "Start" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "Před použitím Penpot on-premise si to vyzkoušejte" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "Práce v konceptech" - -msgid "shortcuts.select-parent-layer" -msgstr "Vybrat nadřazenou vrstvu" - -msgid "workspace.options.component.copy" -msgstr "Kopírovat" - -msgid "workspace.options.component.main" -msgstr "Hlavní" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Kruh" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Diamant" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Šipka" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Obdélník" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Trojúhelník" - -msgid "workspace.shape.menu.add-grid" -msgstr "Přidat rozvržení mřížky" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "Více informací" - -msgid "modals.delete-component-annotation.message" -msgstr "Opravdu chcete smazat tuto anotaci?" - -msgid "modals.delete-component-annotation.title" -msgstr "Smazat anotaci" - -msgid "modals.publish-empty-library.title" -msgstr "Publikovat prázdnou knihovnu" - -msgid "modals.publish-empty-library.accept" -msgstr "Publikovat" - -msgid "modals.publish-empty-library.message" -msgstr "Vaše knihovna je prázdná. Opravdu to chcete publikovat?" - -msgid "shortcuts.text-align-justify" -msgstr "Zarovnat do bloku" - -msgid "shortcuts.text-align-left" -msgstr "Zarovnat vlevo" - -msgid "shortcuts.text-align-right" -msgstr "Zarovnat vpravo" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "title.settings.access-tokens" -msgstr "Profil – Přístupové tokeny" - -msgid "workspace.assets.open-library" -msgstr "Otevřete soubor knihovny" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "Sdílená knihovna" - -#: src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.empty-palette" -msgstr "Ve vaší knihovně zatím nejsou žádné barevné styly" - -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "Ve vaší knihovně zatím nejsou žádné typografické styly" - -msgid "workspace.options.component.create-annotation" -msgstr "Vytvořte anotaci" - -msgid "workspace.shape.menu.create-annotation" -msgstr "Vytvořit anotaci" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "Jak byste nejlépe popsali své zkušenosti s prací na..." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "Zjistěte více o Penpot" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "Získejte kód z mého týmového projektu " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "...branding, ilustrace, marketing atd." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "Hodně" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "... design rozhraní, vizuální aktiva, návrhové systémy atd." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.some" -msgstr "Nějaké" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "S jakým designovým nástrojem máte více zkušeností?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "11-30" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "Student nebo učitel" - -msgid "workspace.layout_grid.editor.title" -msgstr "Úprava mřížky" - -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "K dispozici je nová verze, obnovte prosím stránku" diff --git a/frontend/translations/de.po b/frontend/translations/de.po index fe563da32..84195a044 100644 --- a/frontend/translations/de.po +++ b/frontend/translations/de.po @@ -1,15 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-01-23 15:01+0000\n" +"PO-Revision-Date: 2024-03-22 16:01+0000\n" "Last-Translator: Stas Haas \n" -"Language-Team: German \n" +"Language-Team: German " +"\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -178,10 +178,21 @@ msgstr "" "Wenn Sie ein neues Konto erstellen, stimmen Sie unseren Nutzungsbedingungen " "und Datenschutzrichtlinien zu." +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Wenn Sie ein neues Konto erstellen, stimmen Sie unseren " +"[Nutzungsbedingungen](%s) und [Datenschutzrichtlinien](%s) zu." + #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "Wir haben eine Bestätigungs-E-Mail gesendet an" +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...Branding, Illustrationen, Marketingmaterialien, usw." + msgid "common.publish" msgstr "Veröffentlichen" @@ -536,6 +547,11 @@ msgstr "Dateien importieren" msgid "dashboard.import.analyze-error" msgstr "Huch! Wir konnten diese Datei nicht importieren" +msgid "dashboard.import.analyze-error.components-v2" +msgstr "" +"Datei mit Komponenten v2 aktiviert, aber dieses Team unterstützt es noch " +"nicht." + msgid "dashboard.import.import-error" msgstr "" "Beim Importieren der Datei ist ein Fehler aufgetreten. Die Datei wurde " @@ -911,6 +927,13 @@ msgstr "" msgid "errors.feature-not-supported" msgstr "Die Funktion '%s' wird nicht unterstützt." +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Es scheint eine Nichtübereinstimmung zwischen den aktivierten Funktionen " +"und den Funktionen der Datei zu geben. Die Migrationen für '%s' müssen " +"durchgeführt werden, bevor die Datei geöffnet werden kann." + #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -963,6 +986,9 @@ msgstr "Bestätigungspasswort muss übereinstimmen" msgid "errors.password-too-short" msgstr "Das Passwort sollte mindestens 8 Zeichen lang sein" +msgid "errors.paste-data-validation" +msgstr "Ungültige Daten in der Zwischenablage" + msgid "errors.profile-blocked" msgstr "Das Profil ist gesperrt" @@ -978,6 +1004,10 @@ msgstr "" msgid "errors.registration-disabled" msgstr "Die Registrierung ist derzeit deaktiviert." +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Inkompatible Funktion '%s' erkannt" + msgid "errors.team-leave.insufficient-members" msgstr "" "Nicht genügend Mitglieder, um das Team zu verlassen, wahrscheinlich wollen " @@ -1001,6 +1031,13 @@ msgstr "Ein unerwarteter Fehler ist aufgetreten." msgid "errors.unexpected-token" msgstr "Unbekannter Token" +msgid "errors.validation" +msgstr "Validierungsfehler" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Die Datei hat eine inkompatible Versionsnummer" + msgid "errors.webhooks.connection" msgstr "Verbindungsfehler, URL ist nicht erreichbar" @@ -1235,6 +1272,9 @@ msgstr "Keine" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "Kapitälchen" +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Nicht gesetzt" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Großbuchstaben" @@ -1646,6 +1686,9 @@ msgstr "Rolle" msgid "labels.save" msgstr "Speichern" +msgid "labels.search" +msgstr "Suchen" + msgid "labels.search-font" msgstr "Schriftart suchen" @@ -1670,6 +1713,9 @@ msgstr "Service nicht verfügbar" msgid "labels.settings" msgstr "Einstellungen" +msgid "labels.share" +msgstr "Teilen" + #: src/app/main/ui/viewer/header.cljs, src/app/main/ui/viewer/header.cljs msgid "labels.share-prototype" msgstr "Prototyp teilen" @@ -1740,10 +1786,34 @@ msgstr "(Sie)" msgid "labels.your-account" msgstr "Ihr Konto" +msgid "media.choose-image" +msgstr "Bild auswählen" + +msgid "media.gradient" +msgstr "Verlauf" + +msgid "media.image" +msgstr "Bild" + +msgid "media.linear" +msgstr "Linear" + #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Bild laden…" +msgid "media.radial" +msgstr "Radial" + +msgid "media.solid" +msgstr "Einfarbig" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Ihre Bibliothek ist leer. Sobald es als Geteilte Bibliothek hinzugefügt " +"wurde, können die von Ihnen erstellten Assets in den übrigen Dateien " +"verwendet werden. Sind Sie sicher, dass Sie es veröffentlichen möchten?" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -1940,6 +2010,12 @@ msgid_plural "modals.delete-shared-confirm.accept" msgstr[0] "Datei löschen" msgstr[1] "Dateien löschen" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "Es ist in keiner Datei aktiviert." +msgstr[1] "Sie sind in keiner Datei aktiviert." + #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-shared-confirm.activated.scd-message" msgid_plural "modals.delete-shared-confirm.activated.scd-message" @@ -1986,6 +2062,16 @@ msgstr "Sind Sie sicher, dass Sie dieses Mitglied aus dem Team löschen möchten msgid "modals.delete-team-member-confirm.title" msgstr "Teammitglied löschen" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "" +"Assets, die bereits in dieser Datei verwendet wurden, bleiben dort erhalten " +"(das Design bleibt erhalten)." +msgstr[1] "" +"Assets, die bereits in diesen Dateien verwendet wurden, bleiben dort " +"erhalten (das Design bleibt erhalten)." + msgid "modals.delete-webhook.accept" msgstr "Webhook löschen" @@ -2258,7 +2344,7 @@ msgstr "" "Gegenwart und Zukunft mit der gesamten Community und dem Penpot-Kernteam." msgid "onboarding-v2.welcome.desc2.title" -msgstr "In der Community mitmachen" +msgstr "Mitwirkung in der Community" msgid "onboarding-v2.welcome.desc3" msgstr "" @@ -2271,12 +2357,33 @@ msgstr "Leitfaden für Mitwirkende" msgid "onboarding-v2.welcome.title" msgstr "Willkommen bei Penpot!" +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Mit der Erstellung eines Teams fortsetzen" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Ohne Team fortsetzen" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Team erstellen & einladen" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Team erstellen und Einladungen versenden" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Sie können später einladen" + msgid "onboarding.choice.team-up.create-team-desc" msgstr "Nach der Bennenung Ihres Teams, können Sie andere Personen einladen." msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "Geben Sie den Namen des Teams ein" +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Team erstellen" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Team ohne Einladungen erstellen" + msgid "onboarding.choice.team-up.invite-members" msgstr "Mitglieder einladen" @@ -2288,6 +2395,12 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Einladen mit der Rolle:" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Ohne Team starten" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Sie können später ein Team erstellen." + msgid "onboarding.newsletter.accept" msgstr "Ja, abonnieren" @@ -2339,102 +2452,269 @@ msgid "profile.recovery.go-to-login" msgstr "Zur Anmeldung" #: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "Los geht's!" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "settings.multiple" -msgstr "Mehrere" +msgid "question.design-tool-more-experienced-with" +msgstr "Mit welchem Design-Tool haben Sie mehr Erfahrung?" -# SECTIONS -msgid "shortcut-section.basics" -msgstr "Grundlagen" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" -msgid "shortcut-section.dashboard" -msgstr "Dashboard" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" -msgid "shortcut-section.viewer" -msgstr "Ansicht" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" -msgid "shortcut-section.workspace" -msgstr "Arbeitsbereich" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "Viel" -# SUBSECTIONS -msgid "shortcut-subsection.alignment" -msgstr "Ausrichtung" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" -msgid "shortcut-subsection.edit" -msgstr "Bearbeiten" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canva" -msgid "shortcut-subsection.general-dashboard" -msgstr "Allgemein" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "Wie würden Sie Ihre Erfahrungen bei der Arbeit an … am besten beschreiben?" -msgid "shortcut-subsection.general-viewer" -msgstr "Allgemein" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Designer" -msgid "shortcut-subsection.main-menu" -msgstr "Hauptmenü" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Developer" -msgid "shortcut-subsection.modify-layers" -msgstr "Ändern von Ebenen" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "Mehr über Penpot erfahren" -msgid "shortcut-subsection.navigation-dashboard" -msgstr "Navigation" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" -msgid "shortcut-subsection.navigation-viewer" -msgstr "Navigation" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Gründer/VP" -msgid "shortcut-subsection.navigation-workspace" -msgstr "Navigation" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Ich bin ein Freelancer" -msgid "shortcut-subsection.panels" -msgstr "Paneele" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Code aus meinem Teamprojekt erhalten " -msgid "shortcut-subsection.path-editor" -msgstr "Pfade" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... Interface-Design, visuelle Assets, Designsysteme usw." -msgid "shortcut-subsection.shape" -msgstr "Formen" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "InVision" -msgid "shortcut-subsection.text-editor" -msgstr "Texte" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Feedback für mein Team-Projekt hinterlassen" -msgid "shortcut-subsection.tools" -msgstr "Werkzeuge" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "Los geht's!" -msgid "shortcut-subsection.zoom-viewer" -msgstr "Zoom" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Produkt- oder Projektmanager" -msgid "shortcut-subsection.zoom-workspace" -msgstr "Zoom" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Marketing" -msgid "shortcuts.add-comment" -msgstr "Kommentare" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "Mehr als 50" -msgid "shortcuts.add-node" -msgstr "Punkt hinzufügen" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Weiter" -msgid "shortcuts.align-bottom" -msgstr "Unten ausrichten" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Keine" -msgid "shortcuts.align-center" -msgstr "Zentrieren" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Sonstiges (bitte angeben)" -msgid "shortcuts.align-hcenter" -msgstr "Horizontal zentrieren" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "Ich arbeite an einem persönlichen Projekt" -msgid "shortcuts.align-justify" -msgstr "Blocksatz" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "Zurück" -msgid "shortcuts.align-left" -msgstr "Linksbündig ausrichten" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Wie wollen Sie Penpot nutzen?" -msgid "shortcuts.align-right" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Was ist Ihre Rolle?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Wählen Sie eine Option" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Sketch" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Einige" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Start" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Mit der Arbeit an meinem Projekt beginnen" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Schüler oder Lehrer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "Wie groß ist Ihr Team?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Testen Sie Penpot, um zu sehen, ob es für das Team geeignet ist " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Testen Sie Penpot, bevor Sie es auf einem eigenen Server verwenden" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "... Wireframes, User Journeys & Flows, Navigationsbäume usw." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Arbeiten an Konzeptideen" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Ihr Feedback wird uns helfen, Ihre Gewohnheiten und Vorlieben zu verstehen, " +"damit wir Penpot weiterhin zu einem nützlichen und angenehmen Werkzeug " +"machen können." + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Trennen" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "settings.multiple" +msgstr "Mehrere" + +# SECTIONS +msgid "shortcut-section.basics" +msgstr "Grundlagen" + +msgid "shortcut-section.dashboard" +msgstr "Dashboard" + +msgid "shortcut-section.viewer" +msgstr "Ansicht" + +msgid "shortcut-section.workspace" +msgstr "Arbeitsbereich" + +# SUBSECTIONS +msgid "shortcut-subsection.alignment" +msgstr "Ausrichtung" + +msgid "shortcut-subsection.edit" +msgstr "Bearbeiten" + +msgid "shortcut-subsection.general-dashboard" +msgstr "Allgemein" + +msgid "shortcut-subsection.general-viewer" +msgstr "Allgemein" + +msgid "shortcut-subsection.main-menu" +msgstr "Hauptmenü" + +msgid "shortcut-subsection.modify-layers" +msgstr "Ändern von Ebenen" + +msgid "shortcut-subsection.navigation-dashboard" +msgstr "Navigation" + +msgid "shortcut-subsection.navigation-viewer" +msgstr "Navigation" + +msgid "shortcut-subsection.navigation-workspace" +msgstr "Navigation" + +msgid "shortcut-subsection.panels" +msgstr "Paneele" + +msgid "shortcut-subsection.path-editor" +msgstr "Pfade" + +msgid "shortcut-subsection.shape" +msgstr "Formen" + +msgid "shortcut-subsection.text-editor" +msgstr "Texte" + +msgid "shortcut-subsection.tools" +msgstr "Werkzeuge" + +msgid "shortcut-subsection.zoom-viewer" +msgstr "Zoom" + +msgid "shortcut-subsection.zoom-workspace" +msgstr "Zoom" + +msgid "shortcuts.add-comment" +msgstr "Kommentare" + +msgid "shortcuts.add-node" +msgstr "Punkt hinzufügen" + +msgid "shortcuts.align-bottom" +msgstr "Unten ausrichten" + +msgid "shortcuts.align-center" +msgstr "Zentrieren" + +msgid "shortcuts.align-hcenter" +msgstr "Horizontal zentrieren" + +msgid "shortcuts.align-justify" +msgstr "Blocksatz" + +msgid "shortcuts.align-left" +msgstr "Linksbündig ausrichten" + +msgid "shortcuts.align-right" msgstr "Rechtsbündig ausrichten" msgid "shortcuts.align-top" @@ -2798,6 +3078,9 @@ msgstr "Lineale ein-/ausblenden" msgid "shortcuts.toggle-textpalette" msgstr "Textpalette ein-/ausblenden" +msgid "shortcuts.toggle-theme" +msgstr "Theme ändern" + msgid "shortcuts.toggle-visibility" msgstr "Elemente ein-/ausblenden" @@ -3085,6 +3368,10 @@ msgid_plural "workspace.assets.selected-count" msgstr[0] "%s Element ausgewählt" msgstr[1] "%s Elemente ausgewählt" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "Geteilte Bibliothek" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" @@ -3131,6 +3418,45 @@ msgstr "Texttransformation" msgid "workspace.assets.ungroup" msgstr "Gruppierung aufheben" +msgid "workspace.context-menu.grid-cells.area" +msgstr "Bereich erstellen" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Board erstellen" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Zellen zusammenführen" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "1 Spalte rechts einfügen" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "1 Spalte links einfügen" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Spalte löschen" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Spalte und Formen löschen" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Spalte duplizieren" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "1 Zeile unterhalb einfügen" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "1 Zeile oberhalb einfügen" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Zeile löschen" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Zeile und Formen löschen" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Zeile duplizieren" + msgid "workspace.focus.focus-mode" msgstr "Fokus-Modus" @@ -3254,6 +3580,12 @@ msgstr "Lineale einblenden" msgid "workspace.header.menu.show-textpalette" msgstr "Schriftartenpalette anzeigen" +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Zum dunklen Theme wechseln" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "Zum hellen Theme wechseln" + msgid "workspace.header.menu.undo" msgstr "Rückgängig" @@ -3305,6 +3637,21 @@ msgstr "Vollbild" msgid "workspace.header.zoom-selected" msgstr "Zur Auswahl zoomen" +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Grid bearbeiten" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Beenden" + +msgid "workspace.layout_grid.editor.title" +msgstr "Raster bearbeiten" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Fertig" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Lokalisieren" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Hinzufügen" @@ -3375,6 +3722,10 @@ msgstr "BIBLIOTHEK" msgid "workspace.libraries.library-updates" msgstr "AKTUALISIERUNGEN DER BIBLIOTHEK" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Laden…" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "" @@ -3451,12 +3802,24 @@ msgstr "Komponente" msgid "workspace.options.component.annotation" msgstr "Anmerkung" +msgid "workspace.options.component.copy" +msgstr "Kopie" + msgid "workspace.options.component.create-annotation" msgstr "Eine Anmerkung erstellen" msgid "workspace.options.component.edit-annotation" msgstr "Eine Anmerkung bearbeiten" +msgid "workspace.options.component.main" +msgstr "Hauptkomponente" + +msgid "workspace.options.component.swap" +msgstr "Komponente austauschen" + +msgid "workspace.options.component.swap.empty" +msgstr "Es gibt noch keine Assets in dieser Bibliothek" + #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Beschränkungen" @@ -3550,6 +3913,10 @@ msgstr "Fläche" msgid "workspace.options.flows.add-flow-start" msgstr "Flow-Startpunkt hinzufügen" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Flow" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "Flow-Startpunkt" @@ -3653,6 +4020,9 @@ msgstr "Gruppe füllen" msgid "workspace.options.group-stroke" msgstr "Gruppe einrahmen" +msgid "workspace.options.guides.title" +msgstr "Hilfslinien" + msgid "workspace.options.height" msgstr "Höhe" @@ -4201,14 +4571,26 @@ msgstr "Rahmen" msgid "workspace.options.stroke-cap.circle-marker" msgstr "Punkt" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Kreis" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "Diamant-Marker" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Diamant" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "Pfeil" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Pfeil" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "Keine" @@ -4225,10 +4607,18 @@ msgstr "Rechteckig" msgid "workspace.options.stroke-cap.square-marker" msgstr "Quadrat" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Rechteck" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "Dreieckiger Pfeil" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Dreieck" + msgid "workspace.options.stroke-color" msgstr "Konturfarbe" @@ -4701,6 +5091,13 @@ msgstr "Text (%s)" msgid "workspace.toolbar.text-palette" msgstr "Typografien (%s)" +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**Inspektionsmodus** (nur Ansicht)" + +msgid "workspace.top-bar.read-only.done" +msgstr "Fertig" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Es gibt bisher keine Änderungen im Verlauf" @@ -4834,344 +5231,3 @@ msgstr "Aktualisieren" msgid "workspace.viewport.click-to-close-path" msgstr "Klicken Sie, um den Pfad zu schließen" - -msgid "workspace.options.component.copy" -msgstr "Kopieren" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "Developer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "Produkt- oder Projektmanager" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Marketing" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "Ich arbeite an einem persönlichen Projekt" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Rechteck" - -msgid "workspace.options.component.main" -msgstr "Main" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "Ich bin ein Freelancer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Figma" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "...Branding, Illustrationen, Marketingmaterialien, usw." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.some" -msgstr "Einige" - -msgid "workspace.layout_grid.editor.title" -msgstr "Raster bearbeiten" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "Mehr als 50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "Weiter" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "Wie groß ist Ihr Team?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "... Wireframes, User Journeys & Flows, Navigationsbäume usw." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "Viel" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "Start" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Diamant" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "Wie wollen Sie Penpot nutzen?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "Wählen Sie eine Option" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "Designer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "Keine" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Adobe XD" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Trennen" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Sketch" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Dreieck" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.no-files-message" -msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "Es ist in keiner Datei aktiviert." -msgstr[1] "Sie sind in keiner Datei aktiviert." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "Sonstiges (bitte angeben)" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "Testen Sie Penpot, um zu sehen, ob es für das Team geeignet ist " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "Schüler oder Lehrer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "Feedback für mein Team-Projekt hinterlassen" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "31-50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "InVision" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Canva" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "Mehr über Penpot erfahren" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "Zurück" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "Mit der Arbeit an meinem Projekt beginnen" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Pfeil" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "Mit welchem Design-Tool haben Sie mehr Erfahrung?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "Was ist Ihre Rolle?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Gründer/VP" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Kreis" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "11-30" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "... Interface-Design, visuelle Assets, Designsysteme usw." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "Arbeiten an Konzeptideen" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"Ihr Feedback wird uns helfen, Ihre Gewohnheiten und Vorlieben zu verstehen, " -"damit wir Penpot weiterhin zu einem nützlichen und angenehmen Werkzeug " -"machen können." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "" -"Wie würden Sie Ihre Erfahrungen bei der Arbeit an … am besten beschreiben?" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "Geteilte Bibliothek" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "Testen Sie Penpot, bevor Sie es auf einem eigenen Server verwenden" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "Code aus meinem Teamprojekt erhalten " - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "" -"Assets, die bereits in dieser Datei verwendet wurden, bleiben dort erhalten (" -"das Design bleibt erhalten)." -msgstr[1] "" -"Assets, die bereits in diesen Dateien verwendet wurden, bleiben dort " -"erhalten (das Design bleibt erhalten)." - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Ihre Bibliothek ist leer. Sobald es als Geteilte Bibliothek hinzugefügt " -"wurde, können die von Ihnen erstellten Assets in den übrigen Dateien " -"verwendet werden. Sind Sie sicher, dass Sie es veröffentlichen möchten?" - -msgid "media.radial" -msgstr "Radial" - -msgid "workspace.top-bar.read-only.done" -msgstr "Fertig" - -msgid "media.image" -msgstr "Bild" - -msgid "media.linear" -msgstr "Linear" - -msgid "media.gradient" -msgstr "Verlauf" - -msgid "media.solid" -msgstr "Einfarbig" - -msgid "media.choose-image" -msgstr "Bild auswählen" - -msgid "workspace.options.guides.title" -msgstr "Hilfslinien" - -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Inspektionsmodus** (nur Ansicht)" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Die Datei hat eine inkompatible Versionsnummer" - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Inkompatible Funktion '%s' erkannt" - -msgid "errors.validation" -msgstr "Validierungsfehler" - -msgid "errors.paste-data-validation" -msgstr "Ungültige Daten in der Zwischenablage" - -msgid "labels.search" -msgstr "Suchen" - -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Ohne Team starten" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Sie können später ein Team erstellen." - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Ohne Team fortsetzen" - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Team erstellen und Einladungen versenden" - -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Mit der Erstellung eines Teams fortsetzen" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Team ohne Einladungen erstellen" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Team erstellen & einladen" - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Team erstellen" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Sie können später einladen" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Fertig" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Beenden" - -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Grid bearbeiten" - -msgid "workspace.options.component.swap" -msgstr "Komponente austauschen" - -msgid "workspace.options.component.swap.empty" -msgstr "Es gibt noch keine Assets in dieser Bibliothek" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Wenn Sie ein neues Konto erstellen, stimmen Sie unseren " -"[Nutzungsbedingungen](%s) und [Datenschutzrichtlinien](%s) zu." - -msgid "labels.share" -msgstr "Teilen" - -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Nicht gesetzt" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Lokalisieren" - -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Es scheint eine Nichtübereinstimmung zwischen den aktivierten Funktionen und " -"den Funktionen der Datei zu geben. Die Migrationen für '%s' müssen " -"durchgeführt werden, bevor die Datei geöffnet werden kann." - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Flow" diff --git a/frontend/translations/en.po b/frontend/translations/en.po index 747704c55..1dffa2c85 100644 --- a/frontend/translations/en.po +++ b/frontend/translations/en.po @@ -49,6 +49,10 @@ msgstr "Forgot password?" msgid "auth.fullname" msgstr "Full Name" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "Log into my account" + #: src/app/main/ui/auth/register.cljs msgid "auth.login-here" msgstr "Login here" @@ -57,10 +61,6 @@ msgstr "Login here" msgid "auth.login-submit" msgstr "Login" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-account-title" -msgstr "Log into my account" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-tagline" msgstr "Penpot is the free open-source design tool for Design and Code collaboration" @@ -171,15 +171,17 @@ msgstr "The open-source solution for design and prototyping." msgid "auth.terms-of-service" msgstr "Terms of service" +msgid "auth.terms-privacy-agreement" +msgstr "" +"When creating a new account, you agree to ourf terms of service and privacy " +"policy." + #: src/app/main/ui/auth/register.cljs #, markdown msgid "auth.terms-privacy-agreement-md" msgstr "" -"When creating a new account, you agree to our [terms of service](%s) and [privacy policy](%s)." - -msgid "auth.terms-privacy-agreement" -msgstr "" -"When creating a new account, you agree to ourf terms of service and privacy policy." +"When creating a new account, you agree to our [terms of service](%s) and " +"[privacy policy](%s)." #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" @@ -838,6 +840,10 @@ msgstr "Ok" msgid "ds.confirm-title" msgstr "Are you sure?" +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "Auth provider not allowed for this profile" + #: src/app/main/ui/auth/login.cljs msgid "errors.auth-provider-not-configured" msgstr "Authentication provider not configured." @@ -869,6 +875,10 @@ msgstr "Email already validated." msgid "errors.email-as-password" msgstr "You can't use your email as password" +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "Domain not allowed" + #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.email-has-permanent-bounces" msgstr "The email «%s» has many permanent bounce reports." @@ -887,28 +897,19 @@ msgstr "The email «%s» has been reported as spam or permanently bounce." #: src/app/main/errors.cljs msgid "errors.feature-mismatch" msgstr "" -"Looks like you are opening a file that has the feature '%s' enabled but " -"the current penpot version does not supports it or has it disabled." +"Looks like you are opening a file that has the feature '%s' enabled but the " +"current penpot version does not supports it or has it disabled." #: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "" -"File has an incompatible version number" +msgid "errors.feature-not-supported" +msgstr "Feature '%s' is not supported." #: src/app/main/errors.cljs msgid "errors.file-feature-mismatch" msgstr "" "It seems that there is a mismatch between the enabled features and the " -"features of the file you are trying to open. Migrations for '%s' need " -"to be applied before the file can be opened." - -#: src/app/main/errors.cljs -msgid "errors.feature-not-supported" -msgstr "Feature '%s' is not supported." - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Detected incompatible feature '%s'" +"features of the file you are trying to open. Migrations for '%s' need to be " +"applied before the file can be opened." #: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -957,6 +958,9 @@ msgstr "Confirmation password must match" msgid "errors.password-too-short" msgstr "Password should at least be 8 characters" +msgid "errors.paste-data-validation" +msgstr "Invalid data in clipboard" + msgid "errors.profile-blocked" msgstr "The profile is blocked" @@ -968,13 +972,9 @@ msgstr "Your profile has emails muted (spam reports or high bounces)." msgid "errors.registration-disabled" msgstr "The registration is currently disabled." -#: src/app/main/data/users.cljs -msgid "errors.auth-provider-not-allowed" -msgstr "Auth provider not allowed for this profile" - -#: src/app/main/data/users.cljs -msgid "errors.email-domain-not-allowed" -msgstr "Domain not allowed" +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Detected incompatible feature '%s'" msgid "errors.team-leave.insufficient-members" msgstr "Insufficient members to leave team, you probably want to delete it." @@ -993,6 +993,13 @@ msgstr "An unexpected error occurred." msgid "errors.unexpected-token" msgstr "Unknown token" +msgid "errors.validation" +msgstr "Validation Error" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "File has an incompatible version number" + msgid "errors.webhooks.connection" msgstr "Connection error, URL not reacheable" @@ -1022,13 +1029,6 @@ msgstr "Email or password is incorrect." msgid "errors.wrong-old-password" msgstr "Old password is incorrect" -msgid "errors.validation" -msgstr "Validation Error" - -msgid "errors.paste-data-validation" -msgstr "Invalid data in clipboard" - - #: src/app/main/ui/settings/feedback.cljs msgid "feedback.description" msgstr "Description" @@ -1232,12 +1232,12 @@ msgstr "Lower Case" msgid "inspect.attributes.typography.text-transform.none" msgstr "None" -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Unset" - msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "Title Case" +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Unset" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Upper Case" @@ -1626,6 +1626,9 @@ msgstr "Role" msgid "labels.save" msgstr "Save" +msgid "labels.search" +msgstr "Search" + msgid "labels.search-font" msgstr "Search font" @@ -1649,12 +1652,12 @@ msgstr "Service Unavailable" msgid "labels.settings" msgstr "Settings" -msgid "labels.share-prototype" -msgstr "Share prototype" - msgid "labels.share" msgstr "Share" +msgid "labels.share-prototype" +msgstr "Share prototype" + #: src/app/main/ui/dashboard/sidebar.cljs msgid "labels.shared-libraries" msgstr "Libraries" @@ -1721,13 +1724,34 @@ msgstr "(you)" msgid "labels.your-account" msgstr "Your account" -msgid "labels.search" -msgstr "Search" +msgid "media.choose-image" +msgstr "Choose image" + +msgid "media.gradient" +msgstr "Gradient" + +msgid "media.image" +msgstr "Image" + +msgid "media.image.short" +msgstr "img" + +msgid "media.keep-aspect-ratio" +msgstr "Keep aspect ratio" + +msgid "media.linear" +msgstr "Linear" #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Loading image…" +msgid "media.radial" +msgstr "Radial" + +msgid "media.solid" +msgstr "Solid" + msgid "modals.add-shared-confirm-empty.hint" msgstr "" "Your library is empty. Once added as Shared Library, the assets you create " @@ -2058,6 +2082,21 @@ msgstr "Are you sure you want to leave this team?" msgid "modals.leave-confirm.title" msgstr "Leaving team" +msgid "modals.move-shared-confirm.accept" +msgid_plural "modals.move-shared-confirm.accept" +msgstr[0] "Move" +msgstr[1] "Move" + +msgid "modals.move-shared-confirm.message" +msgid_plural "modals.move-shared-confirm.message" +msgstr[0] "Are you sure you want to move this library?" +msgstr[1] "Are you sure you want to move these libraries?" + +msgid "modals.move-shared-confirm.title" +msgid_plural "modals.move-shared-confirm.title" +msgstr[0] "Move library" +msgstr[1] "Move libraries" + #: src/app/main/ui/workspace/nudge.cljs msgid "modals.nudge-title" msgstr "Nudge amount" @@ -2115,33 +2154,18 @@ msgid_plural "modals.unpublish-shared-confirm.accept" msgstr[0] "Unpublish" msgstr[1] "Unpublish" -msgid "modals.move-shared-confirm.accept" -msgid_plural "modals.move-shared-confirm.accept" -msgstr[0] "Move" -msgstr[1] "Move" - #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.message" msgid_plural "modals.unpublish-shared-confirm.message" msgstr[0] "Are you sure you want to unpublish this library?" msgstr[1] "Are you sure you want to unpublish these libraries?" -msgid "modals.move-shared-confirm.message" -msgid_plural "modals.move-shared-confirm.message" -msgstr[0] "Are you sure you want to move this library?" -msgstr[1] "Are you sure you want to move these libraries?" - #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.title" msgid_plural "modals.unpublish-shared-confirm.title" msgstr[0] "Unpublish library" msgstr[1] "Unpublish libraries" -msgid "modals.move-shared-confirm.title" -msgid_plural "modals.move-shared-confirm.title" -msgstr[0] "Move library" -msgstr[1] "Move libraries" - #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs msgid "modals.update-remote-component-in-bulk.hint" msgstr "" @@ -2260,38 +2284,32 @@ msgstr "Contributing guide" msgid "onboarding-v2.welcome.title" msgstr "Welcome to Penpot!" -msgid "onboarding.choice.team-up.create-team-desc" -msgstr "After naming your team, you will be able to invite people to join." - -msgid "onboarding.choice.team-up.create-team-placeholder" -msgstr "Enter the name of the team" - msgid "onboarding.choice.team-up.continue-creating-team" msgstr "Continue creating team" -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Start without a team" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "You will be able to create a team later." - msgid "onboarding.choice.team-up.continue-without-a-team" msgstr "Continue without team" +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Create team & invite" + msgid "onboarding.choice.team-up.create-team-and-send-invites" msgstr "Create team and send invites" -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Create team without inviting" +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "You'll be able to invite later" -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Create team & invite" +msgid "onboarding.choice.team-up.create-team-desc" +msgstr "After naming your team, you will be able to invite people to join." + +msgid "onboarding.choice.team-up.create-team-placeholder" +msgstr "Enter the name of the team" msgid "onboarding.choice.team-up.create-team-without-invite" msgstr "Create team" -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "You'll be able to invite later" +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Create team without inviting" msgid "onboarding.choice.team-up.invite-members" msgstr "Invite members" @@ -2304,6 +2322,12 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Invite with the role:" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Start without a team" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "You will be able to create a team later." + msgid "onboarding.newsletter.accept" msgstr "Yes, subscribe" @@ -2321,9 +2345,6 @@ msgstr "Want to receive Penpot news?" msgid "onboarding.team-modal.create-team" msgstr "Create a team" -msgid "onboarding.team-modal.team-definition" -msgstr "What's a team?" - msgid "onboarding.team-modal.create-team-desc" msgstr "" "A team allows you to collaborate with other Penpot users working in the " @@ -2344,6 +2365,9 @@ msgstr "Unlimited members" msgid "onboarding.team-modal.create-team-feature-5" msgstr "100% free!" +msgid "onboarding.team-modal.team-definition" +msgstr "What's a team?" + msgid "onboarding.templates.subtitle" msgstr "Here are some templates." @@ -2892,6 +2916,9 @@ msgstr "Redo" msgid "shortcuts.reset-zoom" msgstr "Reset zoom" +msgid "shortcuts.scale" +msgstr "Scale" + msgid "shortcuts.search-placeholder" msgstr "Search shortcuts" @@ -2977,6 +3004,9 @@ msgstr "Toggle layers" msgid "shortcuts.toggle-layout-flex" msgstr "Add / Remove flex layout" +msgid "shortcuts.toggle-layout-grid" +msgstr "Add/remove grid layout" + msgid "shortcuts.toggle-lock" msgstr "Lock / Unlock" @@ -2986,9 +3016,6 @@ msgstr "Lock proportions" msgid "shortcuts.toggle-rulers" msgstr "Show / Hide rulers" -msgid "shortcuts.scale" -msgstr "Scale" - msgid "shortcuts.toggle-snap-guides" msgstr "Snap to guides" @@ -3031,9 +3058,6 @@ msgstr "Zoom lense increase" msgid "shortcuts.zoom-selected" msgstr "Zoom to selected" -msgid "shortcuts.toggle-layout-grid" -msgstr "Add/remove grid layout" - #: src/app/main/ui/dashboard/team.cljs msgid "team.webhooks.max-length" msgstr "The webhook name must contain at most 2048 characters." @@ -3236,6 +3260,10 @@ msgstr "Duplicate main" msgid "workspace.assets.edit" msgstr "Edit" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.filter" +msgstr "Filter" + #: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.graphics" msgstr "Graphics" @@ -3274,14 +3302,6 @@ msgstr "Rename group" msgid "workspace.assets.search" msgstr "Search assets" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.filter" -msgstr "Filter" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.sort" -msgstr "Sort" - #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.selected-count" msgid_plural "workspace.assets.selected-count" @@ -3292,6 +3312,16 @@ msgstr[1] "%s items selected" msgid "workspace.assets.shared-library" msgstr "Shared library" +#: src/app/main/ui/workspace/sidebar/assets/common.cljs +msgid "workspace.assets.sidebar.components" +msgid_plural "workspace.assets.sidebar.components" +msgstr[0] "1 component" +msgstr[1] "%s components" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "Sort" + #: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" msgstr "Typographies" @@ -3335,6 +3365,45 @@ msgstr "Text Transform" msgid "workspace.assets.ungroup" msgstr "Ungroup" +msgid "workspace.context-menu.grid-cells.area" +msgstr "Create area" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Create board" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Merge cells" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Add 1 column to the right" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Add 1 column to the left" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Delete column" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Delete column and shapes" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Duplicate column" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Add 1 row below" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Add 1 row above" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Delete row" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Delete row and shapes" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Duplicate row" + msgid "workspace.focus.focus-mode" msgstr "Focus mode" @@ -3370,13 +3439,13 @@ msgstr "Disable scale text" msgid "workspace.header.menu.disable-snap-guides" msgstr "Disable snap to guides" +msgid "workspace.header.menu.disable-snap-pixel-grid" +msgstr "Disable snap to pixel" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-snap-ruler-guides" msgstr "Disable snap to ruler guides" -msgid "workspace.header.menu.disable-snap-pixel-grid" -msgstr "Disable snap to pixel" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-dynamic-alignment" msgstr "Enable dynamic alignment" @@ -3392,13 +3461,13 @@ msgstr "Enable scale text" msgid "workspace.header.menu.enable-snap-guides" msgstr "Snap to guides" +msgid "workspace.header.menu.enable-snap-pixel-grid" +msgstr "Enable snap to pixel" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-ruler-guides" msgstr "Snap to ruler guides" -msgid "workspace.header.menu.enable-snap-pixel-grid" -msgstr "Enable snap to pixel" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-artboard-names" msgstr "Hide board names" @@ -3472,14 +3541,14 @@ msgstr "Show rulers" msgid "workspace.header.menu.show-textpalette" msgstr "Show fonts palette" -msgid "workspace.header.menu.undo" -msgstr "Undo" +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Switch to dark theme" msgid "workspace.header.menu.toggle-light-theme" msgstr "Switch to light theme" -msgid "workspace.header.menu.toggle-dark-theme" -msgstr "Switch to dark theme" +msgid "workspace.header.menu.undo" +msgstr "Undo" #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.reset-zoom" @@ -3529,18 +3598,6 @@ msgstr "Full screen" msgid "workspace.header.zoom-selected" msgstr "Zoom to selected" -msgid "workspace.layout_grid.editor.title" -msgstr "Editing grid" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Locate" - -msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" -msgstr "Locate grid layout" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Done" - msgid "workspace.layout_grid.editor.options.edit-grid" msgstr "Edit grid" @@ -3550,6 +3607,18 @@ msgstr "Exit" msgid "workspace.layout_grid.editor.padding.expand" msgstr "Show 4 sided padding options" +msgid "workspace.layout_grid.editor.title" +msgstr "Editing grid" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Done" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Locate" + +msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" +msgstr "Locate grid layout" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Add" @@ -3618,6 +3687,10 @@ msgstr "LIBRARY" msgid "workspace.libraries.library-updates" msgstr "LIBRARY UPDATES" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Loading…" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "There are no Shared Libraries that need update" @@ -3642,14 +3715,6 @@ msgstr "SHARED LIBRARIES" msgid "workspace.libraries.shared-library-btn" msgstr "Connect library" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.unlink-library-btn" -msgstr "Disconnect library" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.loading" -msgstr "Loading…" - #: src/app/main/ui/workspace/sidebar/options/menus/text.cljs msgid "workspace.libraries.text.multiple-typography" msgstr "Multiple typographies" @@ -3662,6 +3727,10 @@ msgstr "Unlink all typographies" msgid "workspace.libraries.typography" msgstr "%s typographies" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.unlink-library-btn" +msgstr "Disconnect library" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.update" msgstr "Update" @@ -3722,12 +3791,6 @@ msgstr "Swap component" msgid "workspace.options.component.swap.empty" msgstr "There are no assets in this library yet" -#: src/app/main/ui/workspace/sidebar/assets/common.cljs -msgid "workspace.assets.sidebar.components" -msgid_plural "workspace.assets.sidebar.components" -msgstr[0] "1 component" -msgstr[1] "%s components" - #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Constraints" @@ -3921,6 +3984,9 @@ msgstr "Group fill" msgid "workspace.options.group-stroke" msgstr "Group stroke" +msgid "workspace.options.guides.title" +msgstr "Guides" + msgid "workspace.options.height" msgstr "Height" @@ -4969,6 +5035,13 @@ msgstr "Text (%s)" msgid "workspace.toolbar.text-palette" msgstr "Typographies (%s)" +msgid "workspace.top-bar.read-only.done" +msgstr "Done" + +#, markdown +msgid "workspace.top-bar.view-only" +msgstr "**Inspecting code** (View Only)" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "There are no history changes so far" @@ -5102,77 +5175,3 @@ msgstr "Update" msgid "workspace.viewport.click-to-close-path" msgstr "Click to close the path" - -#, markdown -msgid "workspace.top-bar.view-only" -msgstr "**Inspecting code** (View Only)" - -msgid "workspace.top-bar.read-only.done" -msgstr "Done" - -msgid "media.image" -msgstr "Image" - -msgid "media.image.short" -msgstr "img" - -msgid "media.solid" -msgstr "Solid" - -msgid "media.linear" -msgstr "Linear" - -msgid "media.radial" -msgstr "Radial" - -msgid "media.gradient" -msgstr "Gradient" - -msgid "media.choose-image" -msgstr "Choose image" - -msgid "media.keep-aspect-ratio" -msgstr "Keep aspect ratio" - -msgid "workspace.options.guides.title" -msgstr "Guides" - -msgid "workspace.context-menu.grid-track.column.duplicate" -msgstr "Duplicate column" - -msgid "workspace.context-menu.grid-track.column.add-before" -msgstr "Add 1 column to the left" - -msgid "workspace.context-menu.grid-track.column.add-after" -msgstr "Add 1 column to the right" - -msgid "workspace.context-menu.grid-track.column.delete" -msgstr "Delete column" - -msgid "workspace.context-menu.grid-track.column.delete-shapes" -msgstr "Delete column and shapes" - -msgid "workspace.context-menu.grid-track.row.duplicate" -msgstr "Duplicate row" - -msgid "workspace.context-menu.grid-track.row.add-before" -msgstr "Add 1 row above" - -msgid "workspace.context-menu.grid-track.row.add-after" -msgstr "Add 1 row below" - -msgid "workspace.context-menu.grid-track.row.delete" -msgstr "Delete row" - -msgid "workspace.context-menu.grid-track.row.delete-shapes" -msgstr "Delete row and shapes" - -msgid "workspace.context-menu.grid-cells.merge" -msgstr "Merge cells" - -msgid "workspace.context-menu.grid-cells.area" -msgstr "Create area" - -msgid "workspace.context-menu.grid-cells.create-board" -msgstr "Create board" - diff --git a/frontend/translations/es.po b/frontend/translations/es.po index 9c52e4a47..ff0bc53de 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-01-25 12:01+0000\n" "Last-Translator: Yessenia Villarte Vaca \n" -"Language-Team: Spanish \n" +"Language-Team: Spanish " +"\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -52,6 +52,10 @@ msgstr "¿Olvidaste tu contraseña?" msgid "auth.fullname" msgstr "Nombre completo" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "Entrar en mi cuenta" + #: src/app/main/ui/auth/register.cljs msgid "auth.login-here" msgstr "Inicia sesión aquí" @@ -60,13 +64,11 @@ msgstr "Inicia sesión aquí" msgid "auth.login-submit" msgstr "Entrar" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-account-title" -msgstr "Entrar en mi cuenta" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-tagline" -msgstr "Penpot es la herramienta de diseño libre y open-source para la colaboración entre Diseño y Código" +msgstr "" +"Penpot es la herramienta de diseño libre y open-source para la colaboración " +"entre Diseño y Código" #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" @@ -176,15 +178,17 @@ msgstr "La solución de código abierto para diseñar y prototipar." msgid "auth.terms-of-service" msgstr "Términos de servicio" +msgid "auth.terms-privacy-agreement" +msgstr "" +"Al crear una nueva cuenta, aceptas nuestros [términos de servicio](%s) y " +"[política de privacidad](%s)." + #: src/app/main/ui/auth/register.cljs #, markdown msgid "auth.terms-privacy-agreement-md" msgstr "" -"Al crear una nueva cuenta, aceptas nuestros [términos de servicio](%s) y [política de privacidad](%s)." - -msgid "auth.terms-privacy-agreement" -msgstr "" -"Al crear una nueva cuenta, aceptas nuestros [términos de servicio](%s) y [política de privacidad](%s)." +"Al crear una nueva cuenta, aceptas nuestros [términos de servicio](%s) y " +"[política de privacidad](%s)." #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" @@ -547,7 +551,9 @@ msgid "dashboard.import.analyze-error" msgstr "¡Vaya! No hemos podido importar el fichero" msgid "dashboard.import.analyze-error.components-v2" -msgstr "Fichero exportado con componentes-v2 pero el equipo actual no lo soporta aún." +msgstr "" +"Fichero exportado con componentes-v2 pero el equipo actual no lo soporta " +"aún." msgid "dashboard.import.import-error" msgstr "Hubo un problema importando el fichero. No ha podido ser importado." @@ -857,6 +863,10 @@ msgstr "Ok" msgid "ds.confirm-title" msgstr "¿Está Seguro?" +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "El proveedor de autenticación no permitido para este perfil de usuario" + #: src/app/main/ui/auth/login.cljs msgid "errors.auth-provider-not-configured" msgstr "Proveedor de autenticación no configurado." @@ -889,6 +899,10 @@ msgstr "Este correo ya está validado." msgid "errors.email-as-password" msgstr "No puedes usar tu correo electrónico como contraseña" +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "Dominio no permitido" + #: src/app/main/ui/auth/register.cljs, #: src/app/main/ui/auth/recovery_request.cljs, #: src/app/main/ui/settings/change_email.cljs, @@ -913,6 +927,10 @@ msgstr "" "Parece que está abriendo un archivo que tiene la función '%s' habilitada, " "pero la versión actual de penpot no la admite o la tiene deshabilitada." +#: src/app/main/errors.cljs +msgid "errors.feature-not-supported" +msgstr "Caracteristica no soportada: '%s'." + #: src/app/main/errors.cljs msgid "errors.file-feature-mismatch" msgstr "" @@ -920,10 +938,6 @@ msgstr "" "del fichero que se esta intentando abrir. Falta aplicar migraciones para " "'%s' antes de poder abrir el fichero." -#: src/app/main/errors.cljs -msgid "errors.feature-not-supported" -msgstr "Caracteristica no soportada: '%s'." - #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -991,14 +1005,6 @@ msgstr "" msgid "errors.registration-disabled" msgstr "El registro está actualmente desactivado." -#: src/app/main/data/users.cljs -msgid "errors.auth-provider-not-allowed" -msgstr "El proveedor de autenticación no permitido para este perfil de usuario" - -#: src/app/main/data/users.cljs -msgid "errors.email-domain-not-allowed" -msgstr "Dominio no permitido" - msgid "errors.team-leave.insufficient-members" msgstr "" "No hay miembros suficientes para salir del equipo, probablemente quieras " @@ -1253,12 +1259,12 @@ msgstr "Minúsculas" msgid "inspect.attributes.typography.text-transform.none" msgstr "Ninguna" -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Sin asignar" - msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "Primera en mayúscula" +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Sin asignar" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Mayúsculas" @@ -1659,6 +1665,9 @@ msgstr "Rol" msgid "labels.save" msgstr "Guardar" +msgid "labels.search" +msgstr "Buscar" + msgid "labels.search-font" msgstr "Buscar fuente" @@ -1683,13 +1692,13 @@ msgstr "El servicio no está disponible" msgid "labels.settings" msgstr "Configuración" +msgid "labels.share" +msgstr "Compartir" + #: src/app/main/ui/viewer/header.cljs, src/app/main/ui/viewer/header.cljs msgid "labels.share-prototype" msgstr "Compartir prototipo" -msgid "labels.share" -msgstr "Compartir" - #: src/app/main/ui/dashboard/sidebar.cljs msgid "labels.shared-libraries" msgstr "Bibliotecas" @@ -1756,13 +1765,34 @@ msgstr "(tú)" msgid "labels.your-account" msgstr "Tu cuenta" -msgid "labels.search" -msgstr "Buscar" +msgid "media.choose-image" +msgstr "Elegir imagen" + +msgid "media.gradient" +msgstr "Gradiente" + +msgid "media.image" +msgstr "Imagen" + +msgid "media.image.short" +msgstr "img" + +msgid "media.keep-aspect-ratio" +msgstr "Mantener la proporción" + +msgid "media.linear" +msgstr "Linear" #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Cargando imagen…" +msgid "media.radial" +msgstr "Radial" + +msgid "media.solid" +msgstr "Sólido" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -2090,6 +2120,21 @@ msgstr "¿Seguro que quieres abandonar este equipo?" msgid "modals.leave-confirm.title" msgstr "Abandonando el equipo" +msgid "modals.move-shared-confirm.accept" +msgid_plural "modals.move-shared-confirm.accept" +msgstr[0] "Mover" +msgstr[1] "Mover" + +msgid "modals.move-shared-confirm.message" +msgid_plural "modals.move-shared-confirm.message" +msgstr[0] "¿Seguro que quieres mover esta biblioteca?" +msgstr[1] "¿Seguro que quieres mover estas bibliotecas?" + +msgid "modals.move-shared-confirm.title" +msgid_plural "modals.move-shared-confirm.title" +msgstr[0] "Mover biblioteca" +msgstr[1] "Mover bibliotecas" + #: src/app/main/ui/workspace/nudge.cljs msgid "modals.nudge-title" msgstr "Desplazamiento" @@ -2150,33 +2195,18 @@ msgid_plural "modals.unpublish-shared-confirm.accept" msgstr[0] "Despublicar" msgstr[1] "Despublicar" -msgid "modals.move-shared-confirm.accept" -msgid_plural "modals.move-shared-confirm.accept" -msgstr[0] "Mover" -msgstr[1] "Mover" - #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.message" msgid_plural "modals.unpublish-shared-confirm.message" msgstr[0] "¿Seguro que quieres despublicar esta biblioteca?" msgstr[1] "¿Seguro que quieres despublicar estas bibliotecas?" -msgid "modals.move-shared-confirm.message" -msgid_plural "modals.move-shared-confirm.message" -msgstr[0] "¿Seguro que quieres mover esta biblioteca?" -msgstr[1] "¿Seguro que quieres mover estas bibliotecas?" - #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.title" msgid_plural "modals.unpublish-shared-confirm.title" msgstr[0] "Despublicar biblioteca" msgstr[1] "Despublicar bibliotecas" -msgid "modals.move-shared-confirm.title" -msgid_plural "modals.move-shared-confirm.title" -msgstr[0] "Mover biblioteca" -msgstr[1] "Mover bibliotecas" - #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, #: src/app/main/ui/workspace/context_menu.cljs msgid "modals.update-remote-component-in-bulk.hint" @@ -2301,38 +2331,32 @@ msgstr "Guía de contribución" msgid "onboarding-v2.welcome.title" msgstr "¡Te damos la bienvenida a Penpot!" -msgid "onboarding.choice.team-up.create-team-desc" -msgstr "Tras nombrar tu equipo podrás invitar a personas para que se unan." - -msgid "onboarding.choice.team-up.create-team-placeholder" -msgstr "Introduce el nombre del equipo" - msgid "onboarding.choice.team-up.continue-creating-team" msgstr "Continuar creando equipo" -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Comenzar sin equipo" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Podrás crear un equipo después." - msgid "onboarding.choice.team-up.continue-without-a-team" msgstr "Seguir sin equipo" +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Crear equipo e invitar" + msgid "onboarding.choice.team-up.create-team-and-send-invites" msgstr "Crear equipo y enviar invitaciones" -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Crear equipo sin invitar" +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Podrás enviar invitaciones después" -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Crear equipo e invitar" +msgid "onboarding.choice.team-up.create-team-desc" +msgstr "Tras nombrar tu equipo podrás invitar a personas para que se unan." + +msgid "onboarding.choice.team-up.create-team-placeholder" +msgstr "Introduce el nombre del equipo" msgid "onboarding.choice.team-up.create-team-without-invite" msgstr "Crear equipo" -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Podrás enviar invitaciones después" +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Crear equipo sin invitar" msgid "onboarding.choice.team-up.invite-members" msgstr "Invitar integrantes" @@ -2345,6 +2369,12 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Invitar con el rol:" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Comenzar sin equipo" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Podrás crear un equipo después." + msgid "onboarding.newsletter.accept" msgstr "Si, suscribirme" @@ -2362,9 +2392,6 @@ msgstr "¿Quieres recibir noticias sobre Penpot?" msgid "onboarding.team-modal.create-team" msgstr "Crea un equipo" -msgid "onboarding.team-modal.team-definition" -msgstr "¿Qué es un equipo?" - msgid "onboarding.team-modal.create-team-desc" msgstr "" "Un equipo permite colaborar en Penpot trabajando en los mismos archivos y " @@ -2385,6 +2412,9 @@ msgstr "Sin límite de integrantes" msgid "onboarding.team-modal.create-team-feature-5" msgstr "¡100% gratis!" +msgid "onboarding.team-modal.team-definition" +msgstr "¿Qué es un equipo?" + msgid "onboarding.templates.subtitle" msgstr "Aquí tienes algunas plantillas." @@ -2938,6 +2968,9 @@ msgstr "Rehacer" msgid "shortcuts.reset-zoom" msgstr "Reiniciar zoom" +msgid "shortcuts.scale" +msgstr "Escalado" + msgid "shortcuts.search-placeholder" msgstr "Buscar atajos" @@ -3023,6 +3056,9 @@ msgstr "Mostrar/ocultar capas" msgid "shortcuts.toggle-layout-flex" msgstr "Añadir/eliminar flex layout" +msgid "shortcuts.toggle-layout-grid" +msgstr "Añadir/eliminar grid layout" + msgid "shortcuts.toggle-lock" msgstr "Bloquear/Desbloquear" @@ -3032,9 +3068,6 @@ msgstr "Bloquear/Desbloquear proporciones" msgid "shortcuts.toggle-rulers" msgstr "Mostrar/ocultar reglas" -msgid "shortcuts.scale" -msgstr "Escalado" - msgid "shortcuts.toggle-snap-guides" msgstr "Alinear a las guías" @@ -3077,9 +3110,6 @@ msgstr "Incrementar zoom a objetivo" msgid "shortcuts.zoom-selected" msgstr "Zoom a selección" -msgid "shortcuts.toggle-layout-grid" -msgstr "Añadir/eliminar grid layout" - #: src/app/main/ui/dashboard/team.cljs msgid "team.webhooks.max-length" msgstr "El nombre del webhook debe contener como máximo 2048 caracteres." @@ -3290,6 +3320,10 @@ msgstr "Duplicar principal" msgid "workspace.assets.edit" msgstr "Editar" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.filter" +msgstr "Filtrar" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.graphics" @@ -3331,14 +3365,6 @@ msgstr "Renombrar grupo" msgid "workspace.assets.search" msgstr "Buscar recursos" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.filter" -msgstr "Filtrar" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.sort" -msgstr "Ordenar" - #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.selected-count" msgid_plural "workspace.assets.selected-count" @@ -3349,6 +3375,16 @@ msgstr[1] "%s elementos seleccionados" msgid "workspace.assets.shared-library" msgstr "Biblioteca compartida" +#: src/app/main/ui/workspace/sidebar/assets/common.cljs +msgid "workspace.assets.sidebar.components" +msgid_plural "workspace.assets.sidebar.components" +msgstr[0] "1 componente" +msgstr[1] "%s componentes" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "Ordenar" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" @@ -3395,6 +3431,45 @@ msgstr "Transformar texto" msgid "workspace.assets.ungroup" msgstr "Desagrupar" +msgid "workspace.context-menu.grid-cells.area" +msgstr "Crear area" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Crear tablero" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Fusionar celdas" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Añadir 1 columna a la derecha" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Añadir 1 columna a la izquierda" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Borrar columna" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Borrar columna con el contenido" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Duplicar columna" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Añadir 1 fila debajo" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Añadir 1 fila encima" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Borrar fila" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Borrar fila con el contenido" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Duplicar fila" + msgid "workspace.focus.focus-mode" msgstr "Modo foco" @@ -3432,13 +3507,13 @@ msgstr "Desactivar escalar texto" msgid "workspace.header.menu.disable-snap-guides" msgstr "Desactivar alinear a las guias" +msgid "workspace.header.menu.disable-snap-pixel-grid" +msgstr "Desactivar ajuste al pixel" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-snap-ruler-guides" msgstr "Desactivar alinear a las guias de reglas" -msgid "workspace.header.menu.disable-snap-pixel-grid" -msgstr "Desactivar ajuste al pixel" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-dynamic-alignment" msgstr "Activar alineamiento dinámico" @@ -3454,13 +3529,13 @@ msgstr "Activar escalar texto" msgid "workspace.header.menu.enable-snap-guides" msgstr "Alinear a las guias" +msgid "workspace.header.menu.enable-snap-pixel-grid" +msgstr "Activar ajuste al pixel" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-ruler-guides" msgstr "Alinear a las guias de reglas" -msgid "workspace.header.menu.enable-snap-pixel-grid" -msgstr "Activar ajuste al pixel" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-artboard-names" msgstr "Ocultar nombres de tableros" @@ -3534,14 +3609,14 @@ msgstr "Mostrar reglas" msgid "workspace.header.menu.show-textpalette" msgstr "Mostrar paleta de textos" -msgid "workspace.header.menu.undo" -msgstr "Deshacer" +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Cambiar a tema oscuro" msgid "workspace.header.menu.toggle-light-theme" msgstr "Cambiar a tema claro" -msgid "workspace.header.menu.toggle-dark-theme" -msgstr "Cambiar a tema oscuro" +msgid "workspace.header.menu.undo" +msgstr "Deshacer" #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.reset-zoom" @@ -3591,18 +3666,6 @@ msgstr "Pantalla completa" msgid "workspace.header.zoom-selected" msgstr "Zoom a selección" -msgid "workspace.layout_grid.editor.title" -msgstr "Editando rejilla" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Mostrar" - -msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" -msgstr "Mostrar grid layout" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Hecho" - msgid "workspace.layout_grid.editor.options.edit-grid" msgstr "Editar rejilla" @@ -3612,6 +3675,18 @@ msgstr "Salir" msgid "workspace.layout_grid.editor.padding.expand" msgstr "Mostrar el padding a 4 lados" +msgid "workspace.layout_grid.editor.title" +msgstr "Editando rejilla" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Hecho" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Mostrar" + +msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" +msgstr "Mostrar grid layout" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Añadir" @@ -3706,10 +3781,6 @@ msgstr "BIBLIOTECAS COMPARTIDAS" msgid "workspace.libraries.shared-library-btn" msgstr "Conectar biblioteca" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.unlink-library-btn" -msgstr "Desconectar biblioteca" - #: src/app/main/ui/workspace/sidebar/options/menus/text.cljs msgid "workspace.libraries.text.multiple-typography" msgstr "Varias tipografías" @@ -3722,11 +3793,9 @@ msgstr "Desvincular todas las tipografías" msgid "workspace.libraries.typography" msgstr "%s tipografías" -#: src/app/main/ui/workspace/sidebar/assets/common.cljs -msgid "workspace.assets.sidebar.components" -msgid_plural "workspace.assets.sidebar.components" -msgstr[0] "1 componente" -msgstr[1] "%s componentes" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.unlink-library-btn" +msgstr "Desconectar biblioteca" #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.update" @@ -3877,14 +3946,14 @@ msgstr "Relleno" msgid "workspace.options.flows.add-flow-start" msgstr "Añadir inicio de flujo" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow-start" -msgstr "Inicio de flujo" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow" msgstr "Flujo" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-start" +msgstr "Inicio de flujo" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-starts" msgstr "Inicios de flujo" @@ -3984,6 +4053,9 @@ msgstr "Relleno de grupo" msgid "workspace.options.group-stroke" msgstr "Borde de grupo" +msgid "workspace.options.guides.title" +msgstr "Guías" + msgid "workspace.options.height" msgstr "Altura" @@ -5054,6 +5126,13 @@ msgstr "Texto (%s)" msgid "workspace.toolbar.text-palette" msgstr "Tipografías (%s)" +msgid "workspace.top-bar.read-only.done" +msgstr "Hecho" + +#, markdown +msgid "workspace.top-bar.view-only" +msgstr "**Inspeccionando código** (View only)" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Todavía no hay cambios en el histórico" @@ -5187,77 +5266,3 @@ msgstr "Actualizar" msgid "workspace.viewport.click-to-close-path" msgstr "Pulsar para cerrar la ruta" - -#, markdown -msgid "workspace.top-bar.view-only" -msgstr "**Inspeccionando código** (View only)" - -msgid "workspace.top-bar.read-only.done" -msgstr "Hecho" - -msgid "media.image" -msgstr "Imagen" - -msgid "media.image.short" -msgstr "img" - -msgid "media.solid" -msgstr "Sólido" - -msgid "media.linear" -msgstr "Linear" - -msgid "media.radial" -msgstr "Radial" - -msgid "media.gradient" -msgstr "Gradiente" - -msgid "media.choose-image" -msgstr "Elegir imagen" - -msgid "media.keep-aspect-ratio" -msgstr "Mantener la proporción" - -msgid "workspace.options.guides.title" -msgstr "Guías" - -msgid "workspace.context-menu.grid-track.column.duplicate" -msgstr "Duplicar columna" - -msgid "workspace.context-menu.grid-track.column.add-before" -msgstr "Añadir 1 columna a la izquierda" - -msgid "workspace.context-menu.grid-track.column.add-after" -msgstr "Añadir 1 columna a la derecha" - -msgid "workspace.context-menu.grid-track.column.delete" -msgstr "Borrar columna" - -msgid "workspace.context-menu.grid-track.column.delete-shapes" -msgstr "Borrar columna con el contenido" - -msgid "workspace.context-menu.grid-track.row.duplicate" -msgstr "Duplicar fila" - -msgid "workspace.context-menu.grid-track.row.add-before" -msgstr "Añadir 1 fila encima" - -msgid "workspace.context-menu.grid-track.row.add-after" -msgstr "Añadir 1 fila debajo" - -msgid "workspace.context-menu.grid-track.row.delete" -msgstr "Borrar fila" - -msgid "workspace.context-menu.grid-track.row.delete-shapes" -msgstr "Borrar fila con el contenido" - -msgid "workspace.context-menu.grid-cells.merge" -msgstr "Fusionar celdas" - -msgid "workspace.context-menu.grid-cells.area" -msgstr "Crear area" - -msgid "workspace.context-menu.grid-cells.create-board" -msgstr "Crear tablero" - diff --git a/frontend/translations/es_419.po b/frontend/translations/es_419.po index 725523935..bc62bb5a1 100644 --- a/frontend/translations/es_419.po +++ b/frontend/translations/es_419.po @@ -2,15 +2,25 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-02-02 13:01+0000\n" "Last-Translator: Yessenia Villarte Vaca \n" -"Language-Team: Spanish (Latin America) \n" +"Language-Team: Spanish (Latin America) " +"\n" "Language: es_419\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.4-dev\n" +#: src/app/main/ui/auth/register.cljs +msgid "auth.already-have-account" +msgstr "¿Ya tienes una cuenta?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.check-your-email" +msgstr "" +"Revise su correo electrónico y haga clic en el enlace para verificar y " +"comenzar a usar Penpot." + #: src/app/main/ui/auth/recovery.cljs msgid "auth.confirm-password" msgstr "Confirmar Contraseña" @@ -23,6 +33,12 @@ msgstr "Crear cuenta demo" msgid "auth.create-demo-profile" msgstr "¿Solo quieres probarlo?" +#: src/app/main/ui/auth/register.cljs +msgid "auth.demo-warning" +msgstr "" +"Este es un servicio DEMO, NO LO UTILICE para trabajos reales, los proyectos " +"se borrarán periódicamente." + #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs msgid "auth.email" msgstr "Correo electrónico" @@ -31,6 +47,10 @@ msgstr "Correo electrónico" msgid "auth.forgot-password" msgstr "¿Has olvidado tu contraseña?" +#: src/app/main/ui/auth/register.cljs +msgid "auth.fullname" +msgstr "Nombre completo" + #: src/app/main/ui/auth/register.cljs msgid "auth.login-here" msgstr "Inicie sesión aquí" @@ -39,6 +59,10 @@ msgstr "Inicie sesión aquí" msgid "auth.login-submit" msgstr "Iniciar sesión" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-title" +msgstr "¡Qué bueno verte de nuevo!" + #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -47,6 +71,10 @@ msgstr "GitHub" msgid "auth.login-with-gitlab-submit" msgstr "GitLab" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-google-submit" +msgstr "Google" + #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-ldap-submit" msgstr "LDAP" @@ -55,6 +83,14 @@ msgstr "LDAP" msgid "auth.login-with-oidc-submit" msgstr "Open ID" +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "El nombre debe contener algún carácter distinto al del espacio." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "El nombre debe contener como máximo 250 caracteres." + #: src/app/main/ui/auth/recovery.cljs msgid "auth.new-password" msgstr "Escribe una nueva contraseña" @@ -71,6 +107,16 @@ msgstr "Contraseña cambiada correctamente" msgid "auth.notifications.profile-not-verified" msgstr "El perfil no está verificado, verifique el perfil antes de continuar." +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.recovery-token-sent" +msgstr "" +"El enlace de recuperación de contraseña ha sido enviado a su bandeja de " +"entrada de su correo electrónico." + +#: src/app/main/ui/auth/verify_token.cljs +msgid "auth.notifications.team-invitation-accepted" +msgstr "Se unió al equipo con éxito" + #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.password" msgstr "Contraseña" @@ -90,6 +136,10 @@ msgstr "Política de privacidad" msgid "auth.recovery-request-submit" msgstr "Recuperar contraseña" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-subtitle" +msgstr "Le enviaremos un correo electrónico con instrucciones" + #: src/app/main/ui/auth/recovery_request.cljs msgid "auth.recovery-request-title" msgstr "¿Has olvidado tu contraseña?" @@ -106,15 +156,33 @@ msgstr "¿No tienes cuenta aún?" msgid "auth.register-submit" msgstr "Crea una cuenta" +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-subtitle" +msgstr "Es gratis, es de código abierto" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-title" +msgstr "Crea una cuenta" + #: src/app/main/ui/auth.cljs msgid "auth.sidebar-tagline" msgstr "La solución de código abierto para diseño y creación de prototipos." +msgid "auth.terms-of-service" +msgstr "Términos de servicio" + msgid "auth.terms-privacy-agreement" msgstr "" "Al crear una nueva cuenta, acepta nuestros términos de servicio y política " "de privacidad." +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Al crear una nueva cuenta, acepta nuestros [terms of service](%s) y nuestra " +"[privacy policy](%s)." + #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "Hemos enviado un correo electrónico de verificación" @@ -129,6 +197,11 @@ msgstr "Publicar" msgid "common.share-link.all-users" msgstr "Todos los usuarios de Penpot" +msgid "common.share-link.confirm-deletion-link-description" +msgstr "" +"¿Estás seguro de que deseas eliminar este enlace? Si lo haces ya no estará " +"disponible para nadie" + msgid "common.share-link.current-tag" msgstr "(actual)" @@ -138,6 +211,12 @@ msgstr "Borrar enlace" msgid "common.share-link.get-link" msgstr "Conseguir enlace" +msgid "common.share-link.link-copied-success" +msgstr "Enlace copiado exitosamente" + +msgid "common.share-link.manage-ops" +msgstr "Administrar permisos" + msgid "common.share-link.page-shared" msgid_plural "common.share-link.page-shared" msgstr[0] "1 página compartida" @@ -155,17 +234,53 @@ msgstr "Cualquier persona con enlace tendrá acceso" msgid "common.share-link.permissions-pages" msgstr "Páginas compartidas" +msgid "common.share-link.placeholder" +msgstr "El enlace para compartir aparecerá aquí" + +msgid "common.share-link.team-members" +msgstr "Solo miembros del equipo" + +msgid "common.share-link.title" +msgstr "Compartir prototipos" + msgid "common.share-link.view-all" msgstr "Seleccionar todo" +msgid "common.unpublish" +msgstr "Despublicar" + #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.team-hero.management" msgstr "Gestión de equipos" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.text" +msgstr "" +"Penpot está destinado a equipos. Invite a miembros a trabajar juntos en " +"proyectos y archivos" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.title" +msgstr "¡En equipo!" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.info" +msgstr "" +"Aprenda los conceptos básicos en Penpot mientras se divierte con este " +"tutorial práctico." + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.start" +msgstr "Iniciar el tutorial" + #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.tutorial-hero.title" msgstr "Tutorial práctico" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.info" +msgstr "Date un paseo por Penpot y conoce sus principales características." + #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.walkthrough-hero.start" msgstr "Iniciar el recorrido" @@ -178,14 +293,26 @@ msgstr "Tutorial de la interfaz" msgid "dashboard.access-tokens.copied-success" msgstr "Token copiado" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "Generar nuevo token" + #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.create.success" msgstr "Token de acceso creado correctamente." +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "Presione el botón \"Generar nuevo token\" para generar uno." + #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.empty.no-access-tokens" msgstr "No tienes tokens hasta el momento." +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "El nombre es requerido" + #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.expiration-180-days" msgstr "180 días" @@ -206,6 +333,10 @@ msgstr "90 días" msgid "dashboard.access-tokens.expiration-never" msgstr "Nunca" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "Expirado el %s" + #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.expires-on" msgstr "Vence el %s" @@ -214,6 +345,17 @@ msgstr "Vence el %s" msgid "dashboard.access-tokens.no-expiration" msgstr "Sin fecha de vencimiento" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "Tokens de acceso personal" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"Los tokens de acceso personal funcionan como una alternativa a nuestro " +"sistema de autenticación de inicio de sesión/contraseña y pueden usarse " +"para permitir que una aplicación acceda a la API interna de Penpot" + #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.token-will-expire" msgstr "El token caducará el %s" @@ -230,6 +372,14 @@ msgstr "Agregar como biblioteca compartida" msgid "dashboard.change-email" msgstr "Cambiar el correo electrónico" +#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs +msgid "dashboard.copy-suffix" +msgstr "(copiar)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.create-new-team" +msgstr "Crear nuevo equipo" + #: src/app/main/ui/dashboard/sidebar.cljs msgid "dashboard.default-team-name" msgstr "Tu Penpot" @@ -263,164 +413,6 @@ msgstr "" msgid "dashboard.export-binary-multi" msgstr "Descargar %s archivos Penpot (.penpot)" -#: src/app/main/ui/auth/register.cljs -msgid "auth.already-have-account" -msgstr "¿Ya tienes una cuenta?" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.check-your-email" -msgstr "" -"Revise su correo electrónico y haga clic en el enlace para verificar y " -"comenzar a usar Penpot." - -#: src/app/main/ui/auth/register.cljs -msgid "auth.demo-warning" -msgstr "" -"Este es un servicio DEMO, NO LO UTILICE para trabajos reales, los proyectos " -"se borrarán periódicamente." - -#: src/app/main/ui/auth/register.cljs -msgid "auth.fullname" -msgstr "Nombre completo" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "¡Qué bueno verte de nuevo!" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-google-submit" -msgstr "Google" - -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "El nombre debe contener algún carácter distinto al del espacio." - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "El nombre debe contener como máximo 250 caracteres." - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.recovery-token-sent" -msgstr "" -"El enlace de recuperación de contraseña ha sido enviado a su bandeja de " -"entrada de su correo electrónico." - -#: src/app/main/ui/auth/verify_token.cljs -msgid "auth.notifications.team-invitation-accepted" -msgstr "Se unió al equipo con éxito" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-subtitle" -msgstr "Le enviaremos un correo electrónico con instrucciones" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-subtitle" -msgstr "Es gratis, es de código abierto" - -msgid "auth.terms-of-service" -msgstr "Términos de servicio" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Al crear una nueva cuenta, acepta nuestros [terms of service](%s) y nuestra [" -"privacy policy](%s)." - -msgid "common.share-link.confirm-deletion-link-description" -msgstr "" -"¿Estás seguro de que deseas eliminar este enlace? Si lo haces ya no estará " -"disponible para nadie" - -msgid "common.share-link.link-copied-success" -msgstr "Enlace copiado exitosamente" - -msgid "common.share-link.manage-ops" -msgstr "Administrar permisos" - -msgid "common.share-link.placeholder" -msgstr "El enlace para compartir aparecerá aquí" - -msgid "common.share-link.team-members" -msgstr "Solo miembros del equipo" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-title" -msgstr "Crea una cuenta" - -msgid "common.share-link.title" -msgstr "Compartir prototipos" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.text" -msgstr "" -"Penpot está destinado a equipos. Invite a miembros a trabajar juntos en " -"proyectos y archivos" - -msgid "common.unpublish" -msgstr "Despublicar" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.title" -msgstr "¡En equipo!" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.info" -msgstr "" -"Aprenda los conceptos básicos en Penpot mientras se divierte con este " -"tutorial práctico." - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.start" -msgstr "Iniciar el tutorial" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.info" -msgstr "Date un paseo por Penpot y conoce sus principales características." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "Presione el botón \"Generar nuevo token\" para generar uno." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "Generar nuevo token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "El nombre es requerido" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "Expirado el %s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "Tokens de acceso personal" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"Los tokens de acceso personal funcionan como una alternativa a nuestro " -"sistema de autenticación de inicio de sesión/contraseña y pueden usarse para " -"permitir que una aplicación acceda a la API interna de Penpot" - -#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs -msgid "dashboard.copy-suffix" -msgstr "(copiar)" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.create-new-team" -msgstr "Crear nuevo equipo" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to-link" -msgstr "Información sobre cómo configurar las exportaciones en Penpot." - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.no-elements" -msgstr "No hay elementos con configuración de exportación." - msgid "dashboard.export-frames" msgstr "Exportar tableros como PDF" @@ -445,20 +437,28 @@ msgstr "" "Puede agregar configuraciones de exportación a elementos desde las " "propiedades de diseño (en la parte inferior de la barra lateral derecha)." -msgid "dashboard.export-standard-multi" -msgstr "Descargar %s archivos estándar (.svg + .json)" +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to-link" +msgstr "Información sobre cómo configurar las exportaciones en Penpot." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.no-elements" +msgstr "No hay elementos con configuración de exportación." #: src/app/main/ui/export.cljs msgid "dashboard.export-shapes.title" msgstr "Selección de exportación" +msgid "dashboard.export-standard-multi" +msgstr "Descargar %s archivos estándar (.svg + .json)" + msgid "dashboard.export.detail" msgstr "* Puede incluir componentes, gráficos, colores y/o tipografías." msgid "dashboard.export.explain" msgstr "" -"Uno o más archivos que desea exportar utilizan bibliotecas compartidas. ¿Qué " -"quiere hacer con sus activos*?" +"Uno o más archivos que desea exportar utilizan bibliotecas compartidas. " +"¿Qué quiere hacer con sus activos*?" msgid "dashboard.export.options.all.message" msgstr "" @@ -504,6 +504,12 @@ msgstr "dejar el equipo" msgid "dashboard.libraries-and-templates" msgstr "Bibliotecas y plantillas" +msgid "dashboard.libraries-and-templates.explore" +msgstr "Explore más de ellos y sepa cómo contribuir" + +msgid "dashboard.libraries-and-templates.import-error" +msgstr "Hubo un problema al importar la plantilla. La plantilla no fue importada." + #: src/app/main/ui/dashboard/libraries.cljs msgid "dashboard.libraries-title" msgstr "Bibliotecas" @@ -512,13 +518,6 @@ msgstr "Bibliotecas" msgid "dashboard.loading-files" msgstr "cargando tus archivos…" -msgid "dashboard.libraries-and-templates.explore" -msgstr "Explore más de ellos y sepa cómo contribuir" - -msgid "dashboard.libraries-and-templates.import-error" -msgstr "" -"Hubo un problema al importar la plantilla. La plantilla no fue importada." - msgid "dashboard.loading-fonts" msgstr "cargando tus fuentes…" diff --git a/frontend/translations/fr.po b/frontend/translations/fr.po index 87d06e573..b978a7da3 100644 --- a/frontend/translations/fr.po +++ b/frontend/translations/fr.po @@ -1,15 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-11-16 18:03+0000\n" -"Last-Translator: Swapnil C \n" -"Language-Team: French \n" +"PO-Revision-Date: 2024-02-24 15:02+0000\n" +"Last-Translator: Louis Chance \n" +"Language-Team: French " +"\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" -"X-Generator: Weblate 5.2\n" +"X-Generator: Weblate 5.5-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -180,6 +180,10 @@ msgstr "" msgid "auth.verification-email-sent" msgstr "Nous avons envoyé un e-mail de vérification à" +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...image de marque, illustrations, supports marketing, etc." + msgid "common.publish" msgstr "Publier" @@ -908,6 +912,13 @@ msgstr "" msgid "errors.feature-not-supported" msgstr "La fonctionnalité '%s' n'est pas prise en charge." +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Il semble y avoir une incompatibilité entre les fonctionnalités actives et " +"celles du fichier que tentez d'ouvrir. Vous devez activer les migrations " +"pour '%s' avant de pouvoir ouvrir le fichier." + #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -977,6 +988,10 @@ msgstr "" msgid "errors.registration-disabled" msgstr "L’enregistrement est actuellement désactivé." +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Fonctionnalité incompatible détectée '%s'" + msgid "errors.team-leave.insufficient-members" msgstr "" "Il n'y a pas assez de membres pour quitter l'équipe, vous voulez " @@ -1000,6 +1015,10 @@ msgstr "Une erreur inattendue s’est produite." msgid "errors.unexpected-token" msgstr "Jeton inconnu" +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Le numéro de version du fichier est incompatible" + msgid "errors.webhooks.connection" msgstr "Erreur de connexion, URL inaccessible" @@ -1739,6 +1758,12 @@ msgstr "Votre compte" msgid "media.loading" msgstr "Chargement de l’image…" +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Votre bibliothèque est vide. Une fois ajoutées comme Bibliothèque Partagée, " +"les ressources que vous créez seront utilisables dans vos autres fichiers. " +"Voulez-vous vraiment les publier ?" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -2171,6 +2196,10 @@ msgstr "" msgid "modals.update-remote-component.message" msgstr "Actualiser le composant d’une bibliothèque" +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "Une nouvelle version est disponible, merci de rafraîchir la page" + #: src/app/main/ui/dashboard/team.cljs msgid "notifications.invitation-email-sent" msgstr "E‑mail d'invitation envoyé avec succès" @@ -2267,7 +2296,7 @@ msgid "onboarding-v2.welcome.desc3.title" msgstr "Guide du contributeur" msgid "onboarding-v2.welcome.title" -msgstr "Bienvenu sur Penpot !" +msgstr "Bienvenue sur Penpot !" msgid "onboarding.choice.team-up.create-team-desc" msgstr "" @@ -2336,6 +2365,178 @@ msgstr "Penpot" msgid "profile.recovery.go-to-login" msgstr "Aller à la page de connexion" +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "Quel est l'outil de design avec lequel vous avez plus d'expérience?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "Beaucoup" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canevas" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "Comment décririez-vous votre expérience de travail sur..." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Designer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Développeur" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "En découvrir plus à propos de Penpot" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Fondateur/Direction" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Je suis freelance" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Obtenir le code du projet de mon équipe " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... design d'interface, éléments visuels, systèmes de conception, etc." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "InVision" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Laisser un commentaire sur mon projet d'équipe" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "C'est parti !" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Gestionnaire de produit ou de projet" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Marketing" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "Plus que 50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Suivant" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Aucune" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Autres (préciser)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "Je travaille sur un projet personnel" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "Précédent" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Comment comptez-vous utiliser Penpot ?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Quel est votre rôle ?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Sélectionnez une option" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Sketch" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Un peu" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Commencer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Commencer à travailler sur mon projet" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Étudiant ou enseignant" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "Quelle est la taille de votre équipe ?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Tester Penpot pour voir si ça convient à mon équipe " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Essayer Penpot avant de l'utiliser en local" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "" +"... wireframes, parcours et flux utilisateurs, arborescence de navigation, " +"etc." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Travailler sur des idées de concept" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Vos retours nous aideront à comprendre vos habitudes et préférences afin " +"que nous puissions continuer à améliorer Penpot." + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Détacher" + #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, @@ -2813,6 +3014,12 @@ msgstr "Démasquer" msgid "shortcuts.v-distribute" msgstr "Distribuer verticalement" +msgid "shortcuts.zoom-lense-decrease" +msgstr "Diminuer le zoom" + +msgid "shortcuts.zoom-lense-increase" +msgstr "Augmenter le zoom" + msgid "shortcuts.zoom-selected" msgstr "Zoomer sur la sélection" @@ -2848,6 +3055,10 @@ msgstr "Bibliothèques Partagées - %s - Penpot" msgid "title.default" msgstr "Penpot - Liberté de conception pour les équipes" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "Profil - Jetons d'accès" + #: src/app/main/ui/settings/feedback.cljs msgid "title.settings.feedback" msgstr "Donnez votre avis - Penpot" @@ -2876,6 +3087,9 @@ msgstr "Membres - %s - Penpot" msgid "title.team-settings" msgstr "Configuration - %s - Penpot" +msgid "title.team-webhooks" +msgstr "Webhooks - %s - Penpot" + #: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs msgid "title.viewer" msgstr "%s - Mode spectateur - Penpot" @@ -2911,6 +3125,9 @@ msgstr "Ne pas afficher les interactions" msgid "viewer.header.fullscreen" msgstr "Plein écran" +msgid "viewer.header.inspect-section" +msgstr "Inspecter (%s)" + #: src/app/main/ui/viewer/header.cljs msgid "viewer.header.interactions" msgstr "Interactions" @@ -2934,6 +3151,9 @@ msgstr "Afficher les interactions au clic" msgid "viewer.header.sitemap" msgstr "Plan du site" +msgid "webhooks.last-delivery.success" +msgstr "Le dernier envoi a réussi." + #: src/app/main/ui/workspace/sidebar/align.cljs msgid "workspace.align.hcenter" msgstr "Aligner horizontalement au centre (%s)" @@ -3005,6 +3225,9 @@ msgstr "Supprimer" msgid "workspace.assets.duplicate" msgstr "Dupliquer" +msgid "workspace.assets.duplicate-main" +msgstr "Dupliquer le principal" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.edit" @@ -3034,6 +3257,9 @@ msgstr "Bibliothèque locale" msgid "workspace.assets.not-found" msgstr "Aucune ressource trouvée" +msgid "workspace.assets.open-library" +msgstr "Ouvrir le fichier de la bibliothèque" + #: src/app/main/ui/workspace/sidebar/sitemap.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs @@ -3054,6 +3280,10 @@ msgid_plural "workspace.assets.selected-count" msgstr[0] "%s élément sélectionné" msgstr[1] "%s éléments sélectionnés" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "Bibliothèque partagée" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" @@ -3089,6 +3319,9 @@ msgstr "Interlignage" msgid "workspace.assets.typography.sample" msgstr "Ag" +msgid "workspace.assets.typography.text-styles" +msgstr "Styles de texte" + #: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs msgid "workspace.assets.typography.text-transform" msgstr "Transformer le texte" @@ -3123,6 +3356,9 @@ msgstr "Dégradé radial" msgid "workspace.header.menu.disable-dynamic-alignment" msgstr "Désactiver l’alignement dynamique" +msgid "workspace.header.menu.disable-scale-content" +msgstr "Désactiver l'échelle proportionnelle" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-scale-text" msgstr "Désactiver la mise à l'échelle du texte" @@ -3138,6 +3374,9 @@ msgstr "Désactiver l’accrochage au pixel" msgid "workspace.header.menu.enable-dynamic-alignment" msgstr "Activer l’alignement dynamique" +msgid "workspace.header.menu.enable-scale-content" +msgstr "Activer l'échelle proportionnelle" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-scale-text" msgstr "Activer le redimensionnement du texte" @@ -3188,6 +3427,9 @@ msgstr "Préférences" msgid "workspace.header.menu.option.view" msgstr "Vue" +msgid "workspace.header.menu.redo" +msgstr "Répéter" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.select-all" msgstr "Tout sélectionner" @@ -3211,6 +3453,9 @@ msgstr "Montrer les règles" msgid "workspace.header.menu.show-textpalette" msgstr "Afficher la palette des polices" +msgid "workspace.header.menu.undo" +msgstr "Annuler" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.reset-zoom" msgstr "Réinitialiser" @@ -3235,6 +3480,10 @@ msgstr "Modifications non sauvegardées" msgid "workspace.header.viewer" msgstr "Mode spectateur (%s)" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "Zoom" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.zoom-fill" msgstr "Remplir l’écran" @@ -3255,6 +3504,9 @@ msgstr "Plein écran" msgid "workspace.header.zoom-selected" msgstr "Zoomer sur la sélection" +msgid "workspace.layout_grid.editor.title" +msgstr "Édition de la grille" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Ajouter" @@ -3263,19 +3515,35 @@ msgstr "Ajouter" msgid "workspace.libraries.colors" msgstr "%s couleurs" +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "Il n'y a pas encore de styles de couleur dans votre bibliothèque" + +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "Il n'y a pas encore de styles typographiques dans votre bibliothèque" + #: src/app/main/ui/workspace/colorpicker/libraries.cljs, #: src/app/main/ui/workspace/colorpalette.cljs msgid "workspace.libraries.colors.file-library" msgstr "Bibliothèque du fichier" +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.hsv" +msgstr "HSV" + #: src/app/main/ui/workspace/colorpicker/libraries.cljs, #: src/app/main/ui/workspace/colorpalette.cljs msgid "workspace.libraries.colors.recent-colors" msgstr "Couleurs récentes" #: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgba" -msgstr "RVBA" +msgid "workspace.libraries.colors.rgb-complementary" +msgstr "Complémentaire en RVB" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgba" +msgstr "RVBA" #: src/app/main/ui/workspace/colorpicker.cljs msgid "workspace.libraries.colors.save-color" @@ -3305,6 +3573,10 @@ msgstr "BIBLIOTHÈQUES" msgid "workspace.libraries.library" msgstr "BIBLIOTHÈQUE" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library-updates" +msgstr "MISES À JOUR DE LA BIBLIOTHÈQUE" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "Aucune Bibliothèque Partagée n’a besoin d’être mise à jour" @@ -3341,6 +3613,10 @@ msgstr "%s typographies" msgid "workspace.libraries.update" msgstr "Actualiser" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "Voir tous les changements" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.updates" msgstr "MISES À JOUR" @@ -3365,10 +3641,28 @@ msgstr "Flou de sélection" msgid "workspace.options.canvas-background" msgstr "Couleur de fond du canvas" +msgid "workspace.options.clip-content" +msgstr "Tronquer le contenu" + #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs msgid "workspace.options.component" msgstr "Composant" +msgid "workspace.options.component.annotation" +msgstr "Note" + +msgid "workspace.options.component.copy" +msgstr "Copier" + +msgid "workspace.options.component.create-annotation" +msgstr "Créer une note" + +msgid "workspace.options.component.edit-annotation" +msgstr "Éditer une note" + +msgid "workspace.options.component.main" +msgstr "Principal" + #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Contraintes" @@ -3422,6 +3716,12 @@ msgstr "Export" msgid "workspace.options.export-multiple" msgstr "Exporter la sélection" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export-object" +msgid_plural "workspace.options.export-object" +msgstr[0] "Exporter 1 élément" +msgstr[1] "Exporter %s éléments" + #: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs msgid "workspace.options.export.suffix" msgstr "Suffixe" @@ -3455,6 +3755,10 @@ msgstr "Indiquer le début du flux" msgid "workspace.options.flows.flow-start" msgstr "Début du flux" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-starts" +msgstr "Départs des flux" + #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.auto" msgstr "Automatique" @@ -3553,26 +3857,136 @@ msgstr "Contour de groupe" msgid "workspace.options.height" msgstr "Hauteur" +msgid "workspace.options.inspect" +msgstr "Inspecter" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-action" msgstr "Action" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-after-delay" +msgstr "Après un délai" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation" +msgstr "Animation" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-dissolve" +msgstr "Dissolution" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-animation-none" msgstr "Aucune" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-push" +msgstr "Pousser" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-slide" +msgstr "Glissement" + +msgid "workspace.options.interaction-auto" +msgstr "automatique" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-background" +msgstr "Ajouter une superposition d'arrière-plan" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-close-outside" msgstr "Fermer en cliquant a l'extérieur" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay" +msgstr "Fermer la superposition" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay-dest" +msgstr "Fermer la superposition : %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-delay" +msgstr "Délai" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-destination" +msgstr "Destination" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-duration" msgstr "Durée" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing" +msgstr "Easing" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease" +msgstr "Ease" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in" +msgstr "Ease in" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in-out" +msgstr "Ease in out" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-out" +msgstr "Ease out" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-linear" +msgstr "Linéaire" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-in" +msgstr "Dans" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-enter" +msgstr "Entrée de la souris" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-leave" +msgstr "Sortie de la souris" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-ms" +msgstr "ms" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to" +msgstr "Naviguer vers" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to-dest" +msgstr "Naviguer vers : %s" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-none" msgstr "(non définie)" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-offset-effect" +msgstr "Effet de décalage" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-on-click" +msgstr "Au clic" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay" +msgstr "Ouvrir la superposition" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay-dest" +msgstr "Ouvrir la superposition : %s" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-open-url" msgstr "Ouvrir l'URL" @@ -3581,6 +3995,10 @@ msgstr "Ouvrir l'URL" msgid "workspace.options.interaction-out" msgstr "Sortie" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-center" +msgstr "Centré en bas" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-pos-bottom-left" msgstr "En bas à gauche" @@ -3593,6 +4011,10 @@ msgstr "En bas à droite" msgid "workspace.options.interaction-pos-center" msgstr "Au centre" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-manual" +msgstr "Manuel" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-pos-top-center" msgstr "Centrer en haut" @@ -3605,6 +4027,10 @@ msgstr "En haut à gauche" msgid "workspace.options.interaction-pos-top-right" msgstr "En haut à droite" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-position" +msgstr "Position" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-preserve-scroll" msgstr "Conserver la position du défilement" @@ -3613,6 +4039,22 @@ msgstr "Conserver la position du défilement" msgid "workspace.options.interaction-prev-screen" msgstr "Écran précédent" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-relative-to" +msgstr "Relatif à" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-self" +msgstr "soi" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay" +msgstr "Activer/désactiver la superposition" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay-dest" +msgstr "Activer/désactiver la superposition : %s" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-trigger" msgstr "Déclencheur" @@ -3621,6 +4063,18 @@ msgstr "Déclencheur" msgid "workspace.options.interaction-url" msgstr "URL" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-hovering" +msgstr "En survolant" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-pressing" +msgstr "En appuyant" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interactions" +msgstr "Interactions" + #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs msgid "workspace.options.layer-options.blend-mode.color" msgstr "Couleur" @@ -3737,6 +4191,26 @@ msgstr "Largeur minimale" msgid "workspace.options.layout.bottom" msgstr "En bas" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column" +msgstr "Colonne" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column-reverse" +msgstr "Colonne inversée" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row" +msgstr "Ligne" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row-reverse" +msgstr "Ligne inversée" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.gap" +msgstr "Gap" + #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.left" msgstr "A gauche" @@ -3753,14 +4227,34 @@ msgstr "Tous les côtés" msgid "workspace.options.layout.margin-simple" msgstr "Une marge simple" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.packed" +msgstr "compacté" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding" +msgstr "Marge intérieure" + #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.padding-all" msgstr "Tous les côtés" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-simple" +msgstr "Marge intérieure simple" + #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.right" msgstr "À droite" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-around" +msgstr "espace autour" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-between" +msgstr "espace entre" + #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.top" msgstr "En haut" @@ -3769,6 +4263,13 @@ msgstr "En haut" msgid "workspace.options.more-colors" msgstr "Plus de couleurs" +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.more-lib-colors" +msgstr "Plus de couleurs de la bibliothèque" + +msgid "workspace.options.opacity" +msgstr "Opacité" + #: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.position" @@ -3805,6 +4306,9 @@ msgstr "Tous les coins" msgid "workspace.options.radius.single-corners" msgstr "Coins individuels" +msgid "workspace.options.recent-fonts" +msgstr "Récentes" + #: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs msgid "workspace.options.retry" msgstr "Réessayer" @@ -3813,6 +4317,9 @@ msgstr "Réessayer" msgid "workspace.options.rotation" msgstr "Rotation" +msgid "workspace.options.search-font" +msgstr "Rechercher une police" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.select-a-shape" msgstr "" @@ -3870,6 +4377,13 @@ msgstr "Ombre de groupe" msgid "workspace.options.shadow-options.title.multiple" msgstr "Ombres de la sélection" +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.show-fill-on-export" +msgstr "Afficher à l'export" + +msgid "workspace.options.show-in-viewer" +msgstr "Montrer en mode spectateur" + #: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.size" @@ -3884,8 +4398,62 @@ msgid "workspace.options.stroke" msgstr "Bordure" #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.none" -msgstr "Aucune" +msgid "workspace.options.stroke-cap.circle-marker" +msgstr "Marqueur cercle" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Cercle" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker" +msgstr "Marqueur diamant" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Diamant" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow" +msgstr "Flèche de ligne" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Flèche" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.none" +msgstr "Aucune" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.round" +msgstr "Rond" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square" +msgstr "Carré" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker" +msgstr "Marqueur carré" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Rectangle" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow" +msgstr "Flèche triangle" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Triangle" + +msgid "workspace.options.stroke-color" +msgstr "Couleur du tracé" + +msgid "workspace.options.stroke-width" +msgstr "Largeur du tracé" #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke.center" @@ -4053,6 +4621,13 @@ msgstr "Dissocier les nœuds (%s)" msgid "workspace.path.actions.snap-nodes" msgstr "Aligner les nœuds (%s)" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.add-flex" +msgstr "Ajouter flex layout" + +msgid "workspace.shape.menu.add-grid" +msgstr "Ajouter grid layout" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.back" msgstr "Envoyer au fond" @@ -4065,6 +4640,9 @@ msgstr "Éloigner" msgid "workspace.shape.menu.copy" msgstr "Copier" +msgid "workspace.shape.menu.create-annotation" +msgstr "Créer une note" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.create-artboard-from-selection" msgstr "Créer un plan de travail depuis la sélection" @@ -4073,6 +4651,9 @@ msgstr "Créer un plan de travail depuis la sélection" msgid "workspace.shape.menu.create-component" msgstr "Créer un composant" +msgid "workspace.shape.menu.create-multiple-components" +msgstr "Créer plusieurs composants" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.cut" msgstr "Couper" @@ -4081,6 +4662,10 @@ msgstr "Couper" msgid "workspace.shape.menu.delete" msgstr "Supprimer" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete-flow-start" +msgstr "Supprimer le départ du flux" + #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, #: src/app/main/ui/workspace/context_menu.cljs, #: src/app/main/ui/workspace/context_menu.cljs @@ -4116,6 +4701,10 @@ msgstr "Retourner horizontalement" msgid "workspace.shape.menu.flip-vertical" msgstr "Retourner verticalement" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flow-start" +msgstr "Départ du flux" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.forward" msgstr "Avancer" @@ -4140,6 +4729,9 @@ msgstr "Masquer" msgid "workspace.shape.menu.hide-ui" msgstr "Montrer/Masquer l'interface" +msgid "workspace.shape.menu.intersection" +msgstr "Intersection" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.lock" msgstr "Bloquer" @@ -4157,21 +4749,42 @@ msgstr "Coller" msgid "workspace.shape.menu.path" msgstr "Chemin" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-flex" +msgstr "Retirer flex layout" + #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, #: src/app/main/ui/workspace/context_menu.cljs, #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.reset-overrides" msgstr "Annuler les modifications" +msgid "workspace.shape.menu.restore-main" +msgstr "Rétablir le composant principal" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.select-layer" +msgstr "Sélectionner le calque" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.show" msgstr "Montrer" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-in-assets" +msgstr "Afficher dans le panneau des ressources" + #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.show-main" msgstr "Afficher le composant principal" +msgid "workspace.shape.menu.thumbnail-remove" +msgstr "Retirer la miniature" + +msgid "workspace.shape.menu.thumbnail-set" +msgstr "Définir comme miniature" + msgid "workspace.shape.menu.transform-to-path" msgstr "Transformer en chemin" @@ -4190,12 +4803,22 @@ msgstr "Débloquer" msgid "workspace.shape.menu.unmask" msgstr "Supprimer le masque" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.update-components-in-bulk" +msgstr "Mettre à jour les composants" + #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, #: src/app/main/ui/workspace/context_menu.cljs, #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.update-main" msgstr "Actualiser le composant principal" +msgid "workspace.sidebar.collapse" +msgstr "Réduire la barre latérale" + +msgid "workspace.sidebar.expand" +msgstr "Ouvrir la barre latérale" + #: src/app/main/ui/workspace/left_toolbar.cljs msgid "workspace.sidebar.history" msgstr "Historique (%s)" @@ -4204,6 +4827,12 @@ msgstr "Historique (%s)" msgid "workspace.sidebar.layers" msgstr "Calques" +msgid "workspace.sidebar.layers.components" +msgstr "Composants" + +msgid "workspace.sidebar.layers.frames" +msgstr "Plans de travail" + msgid "workspace.sidebar.layers.groups" msgstr "Groupes" @@ -4213,6 +4842,9 @@ msgstr "Images" msgid "workspace.sidebar.layers.masks" msgstr "Les masques" +msgid "workspace.sidebar.layers.search" +msgstr "Rechercher des calques" + msgid "workspace.sidebar.layers.shapes" msgstr "Formes" @@ -4280,6 +4912,10 @@ msgstr "Raccourcis (%s)" msgid "workspace.toolbar.text" msgstr "Texte (%s)" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text-palette" +msgstr "Polices (%s)" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Il n’y a aucun changement dans l’historique pour l’instant" @@ -4399,6 +5035,10 @@ msgstr "Historique" msgid "workspace.updates.dismiss" msgstr "Ignorer" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "Plus d'information" + #: src/app/main/data/workspace/libraries.cljs msgid "workspace.updates.there-are-updates" msgstr "Il y a des mises à jour dans les Bibliothèques Partagées" @@ -4409,628 +5049,3 @@ msgstr "Actualiser" msgid "workspace.viewport.click-to-close-path" msgstr "Cliquez pour fermer le chemin" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "Développeur" - -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "Une nouvelle version est disponible, merci de rafraîchir la page" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Figma" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "Beaucoup" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "Comment décririez-vous votre expérience de travail sur..." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Adobe XD" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "31-50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Canevas" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "En découvrir plus à propos de Penpot" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "Quel est l'outil de design avec lequel vous avez plus d'expérience?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "11-30" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "Je travaille sur un projet personnel" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "Quelle est la taille de votre équipe ?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "Comment comptez-vous utiliser Penpot ?" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "Bibliothèque partagée" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "Autres (préciser)" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "Étudiant ou enseignant" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "Essayer Penpot avant de l'utiliser en local" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "Travailler sur des idées de concept" - -#: src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.empty-palette" -msgstr "Il n'y a pas encore de styles de couleur dans votre bibliothèque" - -msgid "workspace.options.component.copy" -msgstr "Copier" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interactions" -msgstr "Interactions" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-center" -msgstr "Centré en bas" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"Vos retours nous aideront à comprendre vos habitudes et préférences afin que " -"nous puissions continuer à améliorer Penpot." - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-push" -msgstr "Pousser" - -msgid "workspace.options.inspect" -msgstr "Inspecter" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "Gestionnaire de produit ou de projet" - -msgid "workspace.options.component.create-annotation" -msgstr "Créer une note" - -msgid "viewer.header.inspect-section" -msgstr "Inspecter (%s)" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Marketing" - -msgid "workspace.options.opacity" -msgstr "Opacité" - -msgid "workspace.options.component.edit-annotation" -msgstr "Éditer une note" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "Obtenir le code du projet de mon équipe " - -msgid "workspace.options.show-in-viewer" -msgstr "Montrer en mode spectateur" - -msgid "workspace.shape.menu.create-multiple-components" -msgstr "Créer plusieurs composants" - -msgid "webhooks.last-delivery.success" -msgstr "Le dernier envoi a réussi." - -msgid "workspace.options.stroke-width" -msgstr "Largeur du tracé" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-out" -msgstr "Ease out" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-self" -msgstr "soi" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-ms" -msgstr "ms" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Rectangle" - -msgid "workspace.options.component.main" -msgstr "Principal" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow-starts" -msgstr "Départs des flux" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-position" -msgstr "Position" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "Je suis freelance" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-in" -msgstr "Dans" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay" -msgstr "Activer/désactiver la superposition" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow" -msgstr "Flèche triangle" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-slide" -msgstr "Glissement" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "Voir tous les changements" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "...image de marque, illustrations, supports marketing, etc." - -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "Il n'y a pas encore de styles typographiques dans votre bibliothèque" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-background" -msgstr "Ajouter une superposition d'arrière-plan" - -msgid "workspace.sidebar.layers.search" -msgstr "Rechercher des calques" - -msgid "shortcuts.zoom-lense-increase" -msgstr "Augmenter le zoom" - -msgid "workspace.shape.menu.add-grid" -msgstr "Ajouter grid layout" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-delay" -msgstr "Délai" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square" -msgstr "Carré" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.space-between" -msgstr "espace entre" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom" -msgstr "Zoom" - -msgid "workspace.options.component.annotation" -msgstr "Note" - -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.more-lib-colors" -msgstr "Plus de couleurs de la bibliothèque" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in" -msgstr "Ease in" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.some" -msgstr "Un peu" - -msgid "workspace.layout_grid.editor.title" -msgstr "Édition de la grille" - -msgid "workspace.header.menu.undo" -msgstr "Annuler" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "Plus que 50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "Suivant" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay" -msgstr "Ouvrir la superposition" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-dissolve" -msgstr "Dissolution" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "" -"... wireframes, parcours et flux utilisateurs, arborescence de navigation, " -"etc." - -msgid "workspace.header.menu.disable-scale-content" -msgstr "Désactiver l'échelle proportionnelle" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "Commencer" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.text-palette" -msgstr "Polices (%s)" - -msgid "workspace.sidebar.layers.frames" -msgstr "Plans de travail" - -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.hsv" -msgstr "HSV" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.delete-flow-start" -msgstr "Supprimer le départ du flux" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Diamant" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-offset-effect" -msgstr "Effet de décalage" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row" -msgstr "Ligne" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to" -msgstr "Naviguer vers" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay-dest" -msgstr "Fermer la superposition : %s" - -msgid "workspace.header.menu.redo" -msgstr "Répéter" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column-reverse" -msgstr "Colonne inversée" - -msgid "workspace.assets.duplicate-main" -msgstr "Dupliquer le principal" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "Sélectionnez une option" - -msgid "workspace.options.recent-fonts" -msgstr "Récentes" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-pressing" -msgstr "En appuyant" - -msgid "workspace.sidebar.collapse" -msgstr "Réduire la barre latérale" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "Designer" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flow-start" -msgstr "Départ du flux" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "Aucune" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "C'est parti !" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.remove-flex" -msgstr "Retirer flex layout" - -msgid "workspace.sidebar.layers.components" -msgstr "Composants" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease" -msgstr "Ease" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Détacher" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Sketch" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-relative-to" -msgstr "Relatif à" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.update-components-in-bulk" -msgstr "Mettre à jour les composants" - -msgid "workspace.options.clip-content" -msgstr "Tronquer le contenu" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.select-layer" -msgstr "Sélectionner le calque" - -msgid "workspace.shape.menu.intersection" -msgstr "Intersection" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding" -msgstr "Marge intérieure" - -msgid "title.team-webhooks" -msgstr "Webhooks - %s - Penpot" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library-updates" -msgstr "MISES À JOUR DE LA BIBLIOTHÈQUE" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing" -msgstr "Easing" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Triangle" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row-reverse" -msgstr "Ligne inversée" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "workspace.options.export-object" -msgid_plural "workspace.options.export-object" -msgstr[0] "Exporter 1 élément" -msgstr[1] "Exporter %s éléments" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.packed" -msgstr "compacté" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-enter" -msgstr "Entrée de la souris" - -msgid "workspace.assets.open-library" -msgstr "Ouvrir le fichier de la bibliothèque" - -msgid "workspace.header.menu.enable-scale-content" -msgstr "Activer l'échelle proportionnelle" - -msgid "workspace.shape.menu.thumbnail-set" -msgstr "Définir comme miniature" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "Plus d'information" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-hovering" -msgstr "En survolant" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-manual" -msgstr "Manuel" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-leave" -msgstr "Sortie de la souris" - -msgid "workspace.assets.typography.text-styles" -msgstr "Styles de texte" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker" -msgstr "Marqueur cercle" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.gap" -msgstr "Gap" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker" -msgstr "Marqueur carré" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column" -msgstr "Colonne" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation" -msgstr "Animation" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "Tester Penpot pour voir si ça convient à mon équipe " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "Laisser un commentaire sur mon projet d'équipe" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in-out" -msgstr "Ease in out" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-linear" -msgstr "Linéaire" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-on-click" -msgstr "Au clic" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to-dest" -msgstr "Naviguer vers : %s" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "InVision" - -msgid "workspace.shape.menu.thumbnail-remove" -msgstr "Retirer la miniature" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.space-around" -msgstr "espace autour" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "Précédent" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay" -msgstr "Fermer la superposition" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker" -msgstr "Marqueur diamant" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding-simple" -msgstr "Marge intérieure simple" - -msgid "workspace.shape.menu.create-annotation" -msgstr "Créer une note" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay-dest" -msgstr "Ouvrir la superposition : %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-destination" -msgstr "Destination" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "Commencer à travailler sur mon projet" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Flèche" - -msgid "workspace.options.search-font" -msgstr "Rechercher une police" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "Quel est votre rôle ?" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show-in-assets" -msgstr "Afficher dans le panneau des ressources" - -msgid "workspace.options.interaction-auto" -msgstr "automatique" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Votre bibliothèque est vide. Une fois ajoutées comme Bibliothèque Partagée, " -"les ressources que vous créez seront utilisables dans vos autres fichiers. " -"Voulez-vous vraiment les publier ?" - -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgb-complementary" -msgstr "Complémentaire en RVB" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.round" -msgstr "Rond" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Fondateur/Direction" - -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.show-fill-on-export" -msgstr "Afficher à l'export" - -msgid "workspace.shape.menu.restore-main" -msgstr "Rétablir le composant principal" - -msgid "workspace.sidebar.expand" -msgstr "Ouvrir la barre latérale" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay-dest" -msgstr "Activer/désactiver la superposition : %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Cercle" - -msgid "workspace.options.stroke-color" -msgstr "Couleur du tracé" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "... design d'interface, éléments visuels, systèmes de conception, etc." - -msgid "shortcuts.zoom-lense-decrease" -msgstr "Diminuer le zoom" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "title.settings.access-tokens" -msgstr "Profil - Jetons d'accès" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow" -msgstr "Flèche de ligne" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-after-delay" -msgstr "Après un délai" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.add-flex" -msgstr "Ajouter flex layout" diff --git a/frontend/translations/ha.po b/frontend/translations/ha.po index 27661a3aa..f276a92b7 100644 --- a/frontend/translations/ha.po +++ b/frontend/translations/ha.po @@ -2,4883 +2,4880 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-01-02 16:16+0000\n" "Last-Translator: Alejandro Alonso \n" -"Language-Team: Hausa \n" +"Language-Team: Hausa " +"\n" "Language: ha\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.4-dev\n" -msgid "shortcut-subsection.navigation-dashboard" -msgstr "shawagi" - -msgid "shortcuts.insert-image" -msgstr "sa hoto" - -msgid "shortcuts.bold" -msgstr "fito da shi barobaro" - -msgid "shortcuts.open-viewer" -msgstr "tafi sashin da masu kallo suke hulda" - -msgid "onboarding-v2.before-start.title" -msgstr "kafin ka fara" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-out" -msgstr "fita" +#: src/app/main/ui/auth/register.cljs +msgid "auth.already-have-account" +msgstr "ka na da taska?" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.create-group-hint" +#: src/app/main/ui/auth/register.cljs +msgid "auth.check-your-email" msgstr "" -"abubuwanka za a samu su suna nan take kamar \"sunan kungiya/ sunan abubuwan\"" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.use-default" -msgstr "yi amfani da tsoho" - -#, permanent -msgid "inspect.attributes.stroke.alignment.outer" -msgstr "daga waje" - -#: src/app/main/ui/comments.cljs -msgid "labels.edit" -msgstr "gyara" - -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.height" -msgstr "tsawo" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography" -msgstr "tsara rubutu" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "jaraba kafin ka yi aiki da fenfot" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.title" -msgstr "cire memban tawaga" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.move" -msgstr "motsa (%s)" - -msgid "shortcuts.make-curve" -msgstr "kirkiri lankwasa" - -msgid "shortcuts.snap-nodes" -msgstr "yanke kauri" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "yin aikin kan tunani mai kyau" - -#: src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.empty-palette" -msgstr "Babu salon kaloli a ma'ajiya yanzu" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.title" -msgid_plural "modals.delete-shared-confirm.title" -msgstr[0] "goge kundi" -msgstr[1] "goge kundaye" +"bincika taskarka ta imel,ka danna alamar mahaxa domin tabbatarwa,sannan ka " +"fara amfani da fenfot." -msgid "dashboard.fonts.empty-placeholder" -msgstr "fonts da ka xora nan za ya bayyana." +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.confirm-password" +msgstr "tabbatar da kalmar buxewa" -# SUBSECTIONS -msgid "shortcut-subsection.alignment" -msgstr "kwaskwarima" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-account" +msgstr "qirqiri taskar gwaji" -msgid "errors.webhooks.unexpected" -msgstr "matsalar da ba zata ba lokacin farfaxowa" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-profile" +msgstr "ka na son gwadawa ne kawai?" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "kwanaki 30" +#: src/app/main/ui/auth/register.cljs +msgid "auth.demo-warning" +msgstr "" +"wannan aikin gwaji ne kawai,kar ka yi amfani da shi a aikin gaske,lokaci " +"zuwa lokaci za ya ringa vacewa ne." -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "settings.multiple" -msgstr "gauraya" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.email" +msgstr "imel" -#: src/app/main/ui/dashboard/team.cljs -msgid "errors.member-is-muted" -msgstr "bayanan da ka nema imel din su ya suma (bayanan matsaloli)." +#: src/app/main/ui/auth/login.cljs +msgid "auth.forgot-password" +msgstr "ka manta lambar tsaro?" -msgid "workspace.options.component.copy" -msgstr "Kwafa" +#: src/app/main/ui/auth/register.cljs +msgid "auth.fullname" +msgstr "cikakken suna" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.column" -msgstr "shafi" +#: src/app/main/ui/auth/register.cljs +msgid "auth.login-here" +msgstr "shiga nan" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.add-shared" -msgstr "tura tamkar fenfot" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-submit" +msgstr "shiga ciki" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interactions" -msgstr "yayin hulda" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-title" +msgstr "na ji daxin sake haxuwa da kai!" #: src/app/main/ui/auth/login.cljs -msgid "errors.auth-provider-not-configured" -msgstr "manhajar tantancewar ba ta tsaru ba." +msgid "auth.login-with-github-submit" +msgstr "matattarar manazarta" -msgid "workspace.undo.entry.multiple.circle" -msgstr "da'ira" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-gitlab-submit" +msgstr "wurin nazari" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.message" -msgstr "ka tabbata kana son goge wannan alamar?" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-google-submit" +msgstr "Gugul" -#: src/app/main/ui/static.cljs -msgid "labels.bad-gateway.desc-message" -msgstr "" -"ka jinkirta kaxan sannan ka qara gwadawa; mu na aiki daidai domin tattala " -"aikinmu." +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-ldap-submit" +msgstr "LDAP" -#: src/app/main/ui/inspect/attributes/fill.cljs -msgid "inspect.attributes.fill" -msgstr "cika" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-oidc-submit" +msgstr "shaidar buxewa" -#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs -msgid "media.loading" -msgstr "xora hoto …" +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "dole suna ya qumshi waxansu alamimon rubutu, sannan tazara." -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.access-tokens" -msgstr "lambobi masu xauke da bayani" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "suna dole ya qunshi alamomin rubutu 250." -msgid "shortcuts.open-color-picker" -msgstr "abin daukan kala" +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.new-password" +msgstr "sanya sabuwar lambar tsaro" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-action" -msgstr "aiki" +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.invalid-token-error" +msgstr "lambar tsaron da ka sanya ba daidai ba ce." -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-not-expire" -msgstr "lambar tsaron ba ta da lokacin daina aiki" +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.password-changed-successfully" +msgstr "ka canza lambar tsaro" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-object" -msgstr "Ana fitarwa" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.profile-not-verified" +msgstr "ba a tantance bayananka ba,sai an tantance a ci gaba." -#: src/app/main/ui/workspace/header.cljs -msgid "label.shortcuts" -msgstr "yanke" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.recovery-token-sent" +msgstr "an aika maka da saqon matakan da za a bi domin dawo da lambar tsaronka." -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.colors" -msgstr "%s kala" +#: src/app/main/ui/auth/verify_token.cljs +msgid "auth.notifications.team-invitation-accepted" +msgstr "ka zama dan tawaga" -msgid "shortcuts.delete" -msgstr "goge" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.password" +msgstr "lambar tsaro" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-center" -msgstr "kasa tsakiya" +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-length-hint" +msgstr "aqalla a sami alamoni 8" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.in-this-file" -msgstr "Ma'adana a wanna fiyal" +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "dole lambar tsaro ta qunshi wasu alamomi, sannan tazara." -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-gitlab-submit" -msgstr "wurin nazari" +msgid "auth.privacy-policy" +msgstr "matakan kaxaita" -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-info" -msgstr "bayanin tawaga" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-submit" +msgstr "gano lambar tsaro" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.top" -msgstr "sama" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-subtitle" +msgstr "za mu aika maka da saqon qa'idoji ta imel" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"bayaninka za ya sanya mu fahimci kwarewarka da xabi'unka ta haka ne za mu " -"mayar maka da fenfot kayan aikin da ka ke jin daxin aiki da shi." +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-title" +msgstr "an manta lambar tsaro?" -msgid "shortcuts.move-unit-down" -msgstr "Matsa da sashin kasa" +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.recovery-submit" +msgstr "canza lambar tsaro" -msgid "common.share-link.placeholder" -msgstr "hanya mai kyau za ta bayyana a nan" +#: src/app/main/ui/auth/login.cljs +msgid "auth.register" +msgstr "ba ka da kunxi har yanzu?" -msgid "dashboard.import.import-message" -msgid_plural "dashboard.import.import-message" -msgstr[0] "an shigar kundi 1." -msgstr[1] "%s kundaye sun shiga." +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.register-submit" +msgstr "qirqiri kundi" -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.hleft" -msgstr "Daidaita hagu (%s)" +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-subtitle" +msgstr "kyauta ne,an buxe hanyar samu" -msgid "labels.accept" -msgstr "karva" +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-title" +msgstr "qirqiri sabon kundi" -msgid "workspace.shape.menu.transform-to-path" -msgstr "sauya zuwa hanya" +#: src/app/main/ui/auth.cljs +msgid "auth.sidebar-tagline" +msgstr "samun hanyar magance matsalar zane-zane." -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-title" -msgstr "an manta lambar tsaro?" +msgid "auth.terms-of-service" +msgstr "dokokin aiki" -msgid "shortcut-subsection.edit" -msgstr "Tace" +msgid "auth.terms-privacy-agreement" +msgstr "" +"lokacin qirqirar kundi, sai ka amincewa da yanayi aikin da " +"qa'idojinmuqa'idoji." -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.auto" -msgstr "da kanshi" +#: src/app/main/ui/auth/register.cljs +msgid "auth.verification-email-sent" +msgstr "mun aika maka da saqon tantancewa ta imel" -msgid "shortcuts.draw-rect" -msgstr "Ractangula" +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...branding, illustrations, marketing pieces, etc." -msgid "onboarding.choice.team-up.invite-members-info" -msgstr "" -"ka tuna da kowa. masu qirqira, masu tsarawa, shuwagabanniS... daban-daban ya " -"qara :)" +msgid "common.publish" +msgstr "wallafawa" -msgid "modals.invite-member.repeated-invitation" -msgstr "" -"waxansu imel daga membobin qungiyar na yanzu. ba za a aikawa da gayyatarsu " -"ba ." +msgid "common.share-link.all-users" +msgstr "duk fenfot" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-push" -msgstr "Tura" +msgid "common.share-link.confirm-deletion-link-description" +msgstr "ka tabbata ka na son rufe wannan hanyar? idan ka rufe ba mai iya sake bi" -#: src/app/main/ui/settings/delete_account.cljs -msgid "notifications.profile-deletion-not-allowed" -msgstr "ba za ka iya goge kundin ba. ka jira umarnin tawaga ka fin ka ci gaba." +msgid "common.share-link.current-tag" +msgstr "(yanzu)" -msgid "workspace.options.inspect" -msgstr "Duba" +msgid "common.share-link.destroy-link" +msgstr "tarwatsa hanya" -msgid "inspect.attributes.typography.text-decoration.strikethrough" -msgstr "zana layi tsakiyar rubutu" +msgid "common.share-link.get-link" +msgstr "samun hanya" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-center" -msgstr "sama tsakiya" +msgid "common.share-link.link-copied-success" +msgstr "an samo kwafi" -msgid "shortcuts.move-nodes" -msgstr "matsa a hade" +msgid "common.share-link.manage-ops" +msgstr "amincewar shugaba" -#: src/app/main/ui/settings.cljs -msgid "dashboard.your-account-title" -msgstr "gidanka" +msgid "common.share-link.page-shared" +msgid_plural "common.share-link.page-shared" +msgstr[0] "tura shafi 1" +msgstr[1] "%s an tura shafi" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.search-placeholder" -msgstr "nema …" +msgid "common.share-link.permissions-can-comment" +msgstr "sharhi" -msgid "shortcuts.redo" -msgstr "gyara" +msgid "common.share-link.permissions-can-inspect" +msgstr "iya bincka lamba" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.multiply" -msgstr "sau" +msgid "common.share-link.permissions-hint" +msgstr "duk wanda ya mallaki mataki,za ya iya shiga" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.left" -msgstr "Hagu" +msgid "common.share-link.permissions-pages" +msgstr "tura shafuka" -msgid "dashboard.webhooks.active" -msgstr "ya na amfani" +msgid "common.share-link.placeholder" +msgstr "hanya mai kyau za ta bayyana a nan" -msgid "common.share-link.current-tag" -msgstr "(yanzu)" +msgid "common.share-link.team-members" +msgstr "memba kaxai" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs -msgid "errors.email-invalid" -msgstr "sanya imel mai amfani" +msgid "common.share-link.title" +msgstr "fenfot" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.stretch" -msgstr "mikewa" +msgid "common.share-link.view-all" +msgstr "zavi duka" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.letter-spacing" -msgstr "tazarar harafi" +msgid "common.unpublish" +msgstr "maras wallafa" -msgid "shortcuts.bring-backward" -msgstr "komawa baya" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.management" +msgstr "shuwagabannin tawaga" -msgid "shortcuts.show-shortcuts" -msgstr "nuna / boye yanken" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.text" +msgstr "fenfot ta menbobin tawaga ce. kirawo kowa domin yin aiki tarekundaye" #: src/app/main/ui/dashboard/projects.cljs -msgid "dashboard.new-project" -msgstr "+ sabon aiki" +msgid "dasboard.team-hero.title" +msgstr "haxin guiwa!" -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.invalid-token-error" -msgstr "lambar tsaron da ka sanya ba daidai ba ce." +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.info" +msgstr "ka san dokokin fenfot lokacin da ka ke tare da masoya koyarwa." -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "ma su qirqira" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.start" +msgstr "fara jagoranci" -msgid "labels.show-comments-list" -msgstr "jerin ire-iren yabo" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.title" +msgstr "jagoranci" -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.dont-show-interactions" -msgstr "Karka/ki nuna hulda" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.info" +msgstr "bincika manhaja domin sanin manyan sassanta." -msgid "dashboard.export.options.detach.message" -msgstr "" -"manhajar tura kundi ba ta shiga cikin fitarwa, wani amfaniqarawa a taska. " +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.start" +msgstr "fara koyarwa" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "na ji daxin sake haxuwa da kai!" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.title" +msgstr "ma'aunin karvuwar aiki" -msgid "shortcut-subsection.shape" -msgstr "Siffa" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.copied-success" +msgstr "kwafar lambar tsaro" -#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs -msgid "title.viewer" -msgstr "%s - duba kumburi - Mazubin biruka" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "samo sabuwar lambar tsaro" -msgid "dashboard.export.options.merge.title" -msgstr "tura taska ya qunshi bayanan da ke cikin kundin taskoki" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "ka sami lambar tsaron da aka yi." -#: src/app/main/ui/dashboard/team.cljs -msgid "title.team-members" -msgstr "Yan kungiya - %s - Mazubin biruka" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "" +"danna maddanin qasa\"danna qasa\n" +"emo sabuwar lambar tsaro\" samar da wani." -msgid "shortcuts.align-justify" -msgstr "Tabbataccan tsari" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "ba ka da wasu lambobin tsaro yanzu." -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.direction-rtl" -msgstr "RTL" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "ana buqatar suna" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "shugaban aiki" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "kwanaki 180" -msgid "workspace.options.component.create-annotation" -msgstr "Kirkiri sharhin rubuta" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "kwanaki 30" -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.rotation" -msgstr "jujjuyawa" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "kwanaki 60" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to-other-team" -msgstr "tura ma sauran tawaga" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "kwanaki 90" -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.num-of-members" -msgstr "%s memba" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "bai yiwuwa" -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.admin" -msgstr "shugaba" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "gama aiki kan %s" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-auto-width" -msgstr "sarrafaffen fadi" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "gama aiki kan %s" -msgid "errors.team-leave.member-does-not-exists" -msgstr "mamban da ka ke son sanyawa ba ya a ciki." +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.no-expiration" +msgstr "ba lokacin daina amfani" -msgid "workspace.options.shadow-options.color" -msgstr "inuwar kala" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "mallakar lambobin shiga na sirri" -#, markdown -msgid "dashboard.fonts.warning-text" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" msgstr "" -"matsalolin lasisi daga sama zuwa qasa magwajin da ke aiki iri-iri. domin " -"bincikawa za ka iya amfani da aikin ma'aunin sama da qasa [shi ne " -"haka](https://ma'aunin sama da qasa.matattarar bayanai.app/). bugu da qari, " -"mun aminta da amfani da [taransifota](https://taransifota.org/) domin samo " -"webfonts da adana kurakurai. " +"lambarka ta shiga na a matsayin zabin hanyar shiga/lambar tsaronmuza a iya " +"amfani tsarin tantancewa,domin shiga manhajar cikin fenfot API" #: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "samo sabuwar lambar tsaro" +msgid "dashboard.access-tokens.token-will-expire" +msgstr "lambar tsaron za ta gama aiki %s" -#: src/app/main/ui/dashboard/team.cljs -msgid "notifications.invitation-email-sent" -msgstr "an aika da saqon" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "lambar tsaron ba ta da lokacin daina aiki" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.add-shared" +msgstr "tura tamkar fenfot" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.change-email" +msgstr "canza imel" + +#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs +msgid "dashboard.copy-suffix" +msgstr "(kwafi)" #: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.select-member-to-promote" -msgstr "zavi memba domin havakawa" +msgid "dashboard.create-new-team" +msgstr "yi sabuwar tawaga" -msgid "shortcuts.draw-text" -msgstr "rubutaccan sako" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.default-team-name" +msgstr "manhajar fenfot" -msgid "viewer.header.inspect-section" -msgstr "Duba (%s)" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.delete-team" +msgstr "goge tawaga" -msgid "workspace.shape.menu.flatten" -msgstr "mikad da abu" +msgid "dashboard.download-binary-file" +msgstr "sauke manhajar fenfot(.manhajar fenfot)" -msgid "shortcuts.delete-node" -msgstr "fita da ga cikin net wok" +msgid "dashboard.download-standard-file" +msgstr "sauke cikakken kundi(.svg + .json)" -msgid "onboarding-v2.before-start.desc3" -msgstr "za ka iya kallon koyarwarmu da mutanenmu ke yi." +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate" +msgstr "kwafi" -msgid "workspace.header.menu.hide-pixel-grid" -msgstr "boye pixel akwati" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate-multi" +msgstr "kwafi %s kundaye" -#: src/app/main/ui/auth/verify_token.cljs -msgid "auth.notifications.team-invitation-accepted" -msgstr "ka zama dan tawaga" +#: src/app/main/ui/dashboard/grid.cljs +#, markdown +msgid "dashboard.empty-placeholder-drafts" +msgstr "" +"nan za a sami kundayen da aka sanya a taska. gwada sanya na ka kundin \"a " +"taskirarmumaginar kundi](https://manhajar fenfot/taskokin maginar " +"kundaye.html)." -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.feedback-sent" -msgstr "aika bayani" +msgid "dashboard.export-binary-multi" +msgstr "sauke %s kundayen manhajar fenfot(.penpot)" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.title" -msgstr "haxin guiwa!" +msgid "dashboard.export-frames" +msgstr "Allon fitarwa na PDF" -msgid "workspace.undo.entry.multiple.page" -msgstr "shafi" +#: src/app/main/ui/export.cljs +msgid "dashboard.export-frames.title" +msgstr "Fitarwa a PDF" -msgid "shortcuts.ungroup" -msgstr "Fita daka rukuni" +msgid "dashboard.export-multi" +msgstr "fitar da fenfot %s kundaye" -#: src/app/main/ui/static.cljs -msgid "labels.bad-gateway.main-message" -msgstr "akwai matsala" +#: src/app/main/ui/export.cljs +msgid "dashboard.export-multiple.selected" +msgstr "%s of %s tubullan da aka zava" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.hint" +#: src/app/main/ui/workspace/header.cljs +msgid "dashboard.export-shapes" +msgstr "Fitarwa" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to" msgstr "" -"idan ba ka cire taskar shirye-shirye ba, kundin taskar na wannan kundin zai " -"tsaya kasancewar za ka iya amfani da shi a cikin kundayenka." +"za ka iya daidaita kayan zanenka ta hanyar (amfani da madannin qasa sashen " +"dama)." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to-link" +msgstr "bayanin yadda ake fitarwa daga fenfot" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.no-elements" +msgstr "ba wasu abubuwan da ake daidaitawa wajen tsara fitarwa." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.title" +msgstr "Fitar da zavi" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.empty" -msgstr "babu labaran da su ka canja a yanzu" +msgid "dashboard.export-standard-multi" +msgstr "Sauke %s cikakken kundi (.svg + .json)" -msgid "dashboard.libraries-and-templates" -msgstr "taska da shaidar kamfanoni" +msgid "dashboard.export.detail" +msgstr "*akwai sassan,hotuna,launuka,da/kozane-zane." -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin-simple" -msgstr "Samfarin gefe" +msgid "dashboard.export.explain" +msgstr "za ka iya fitar da kundi daya ko fiye ta hanyar tura taska. \"me \"*?" -msgid "workspace.undo.entry.multiple.rect" -msgstr "rectangles" +msgid "dashboard.export.options.all.message" +msgstr "manhajar tura kundi ta kunshi fitarwa, tattali mahaxarsu." -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "akwai sabon yayi, fatan za a sabunta fage" +msgid "dashboard.export.options.all.title" +msgstr "fitar da manhajar tura kundi" -msgid "shortcuts.go-to-drafts" -msgstr "ta fi rumbu" +msgid "dashboard.export.options.detach.message" +msgstr "manhajar tura kundi ba ta shiga cikin fitarwa, wani amfaniqarawa a taska. " -msgid "onboarding.welcome.alt" -msgstr "fenfot" +msgid "dashboard.export.options.detach.title" +msgstr "lura da bayanan da ke cikin manhajar tura kundi" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.bottom" -msgstr "Kasa" +msgid "dashboard.export.options.merge.message" +msgstr "" +"za ka iya fitar da kundi tare da haxe muhimman abubuwa, na waje a " +"kunditaskira." -msgid "shortcuts.zoom-selected" -msgstr "Zuko wanda aka zaba" +msgid "dashboard.export.options.merge.title" +msgstr "tura taska ya qunshi bayanan da ke cikin kundin taskoki" -msgid "modals.delete-component-annotation.message" -msgstr "ka tabbata kana son goge wannan bayanin?" +msgid "dashboard.export.title" +msgstr "fitar da kundayr" -msgid "inspect.attributes.stroke.style.none" -msgstr "babu" +msgid "dashboard.fonts.deleted-placeholder" +msgstr "rashin font" -msgid "errors.auth.unable-to-login" -msgstr "lokacin ya qare ko ba a tantance ka ba." +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.dismiss-all" +msgstr "goge duka" -msgid "workspace.options.grid.params.color" -msgstr "Kala" +msgid "dashboard.fonts.empty-placeholder" +msgstr "fonts da ka xora nan za ya bayyana." -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.top" -msgstr "sama" +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.fonts-added" +msgid_plural "dashboard.fonts.fonts-added" +msgstr[0] "an qara font 1" +msgstr[1] "%s an qara fonts da yawa" -msgid "shortcuts.add-node" -msgstr "kara Girma" +#, markdown +msgid "dashboard.fonts.hero-text1" +msgstr "" +"duk wani adireshi da ka xora a nan dangin font ne a wannan tawagar za a " +"sami kundayen da ke xauke da kayan rubutu. Da fontfont iri daya ne ake " +"kasawa**gwaurayen font**. Za ka iya xora font ta waxannan hanyoyin: **TTF, " +"OTF and WOFF** (xaya kawai ake buqata)." -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.group" -msgstr "rukuni" +#, markdown +msgid "dashboard.fonts.hero-text2" +msgstr "" +"za ka iya xora fonts dinka ne domin ka sami dammar amfani da fenfot. gano " +"akwai qarin abubuwan das u ka dace da dokokin " +"fpntaiki](https://fenfot.app/dokoki.html). Za ka so bayani game " +"da[ffonts](https://www.rubutu.com/faq)." -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.accept" -msgid_plural "modals.delete-shared-confirm.accept" -msgstr[0] "goge kundi" -msgstr[1] "goge kundaye" +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.upload-all" +msgstr "xora duka" -#: src/app/main/ui/inspect/attributes/stroke.cljs -msgid "inspect.attributes.stroke" -msgstr "yankewa" +#, markdown +msgid "dashboard.fonts.warning-text" +msgstr "" +"matsalolin lasisi daga sama zuwa qasa magwajin da ke aiki iri-iri. domin " +"bincikawa za ka iya amfani da aikin ma'aunin sama da qasa [shi ne " +"haka](https://ma'aunin sama da qasa.matattarar bayanai.app/). bugu da qari, " +"mun aminta da amfani da [taransifota](https://taransifota.org/) domin samo " +"webfonts da adana kurakurai. " -msgid "onboarding.team-modal.create-team-feature-5" -msgstr "100% kyauta!" +msgid "dashboard.import" +msgstr "shigo da kundin fenfot" -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs -msgid "workspace.options.size-presets" -msgstr "yanayin girman yanayin" +msgid "dashboard.import.analyze-error" +msgstr "kash! mun gaza shigo da kundinka" -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.sitemap" -msgstr "taswirar wuri" +msgid "dashboard.import.import-error" +msgstr "akwi matsala a kundin. ba a shio da kundin ba." -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs -msgid "labels.no-comments-available" -msgstr "an dakatar da kai duka! Alamar sabon sharhi za ta fito nan." +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "an shigar kundi 1." +msgstr[1] "%s kundaye sun shiga." -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.feedback-disabled" -msgstr "kasa samun bayani" +msgid "dashboard.import.import-warning" +msgstr "wasu kundayen na dauke da abubuwan da ba su da amfani." -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.accept" -msgid_plural "modals.unpublish-shared-confirm.accept" -msgstr[0] "maras wallafa" -msgstr[1] "maras wallafa" +msgid "dashboard.import.progress.process-colors" +msgstr "aikin rini" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "kasuwanci" +msgid "dashboard.import.progress.process-components" +msgstr "aikin sassa" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.update" -msgstr "Sabuntawa" +msgid "dashboard.import.progress.process-media" +msgstr "kammala aiki" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin" -msgstr "gefe" +msgid "dashboard.import.progress.process-page" +msgstr "fejin kasuwar duniya: %s" -msgid "shortcuts.align-hcenter" -msgstr "tsarin tsakiya ko ina" +msgid "dashboard.import.progress.process-typographies" +msgstr "kula da rubutu" -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.show-all-comments" -msgstr "fito da yabo" +msgid "dashboard.import.progress.upload-data" +msgstr "xora bayani akan sabis (%s/%s)" -#: src/app/main/ui/settings.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.logout" -msgstr "fita" +msgid "dashboard.import.progress.upload-media" +msgstr "xora kundaye: %s" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "kwanaki 180" +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.invite-profile" +msgstr "neman mutane" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.color-burn" -msgstr "kala konanniya" +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.leave-team" +msgstr "fita tawaga" -msgid "workspace.options.opacity" -msgstr "dishi dishi" +msgid "dashboard.libraries-and-templates" +msgstr "taska da shaidar kamfanoni" -msgid "shortcuts.prev-frame" -msgstr "allon da ya gabata" +msgid "dashboard.libraries-and-templates.explore" +msgstr "bincika su da kyau kasan ta yadda za ka bayar da gudunmawa" -msgid "workspace.options.component.edit-annotation" -msgstr "Tace sharhin rubutu" +msgid "dashboard.libraries-and-templates.import-error" +msgstr "akwai matsala wurin shigo da fejin talla. fejin tallar ba ya xauko." -msgid "dashboard.import.progress.upload-data" -msgstr "xora bayani akan sabis (%s/%s)" +#: src/app/main/ui/dashboard/libraries.cljs +msgid "dashboard.libraries-title" +msgstr "taskoki" -msgid "shortcuts.draw-curve" -msgstr "Ratse" +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.loading-files" +msgstr "aikin dora kundaye …" -#: src/app/main/ui/workspace/comments.cljs -msgid "labels.all" -msgstr "duk" +msgid "dashboard.loading-fonts" +msgstr "xora abin adonka …" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.file" -msgstr "fayil" +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to" +msgstr "tura a" -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.hsla" -msgstr "HSLA" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-multi" +msgstr "tura %s kundaye a" -#: src/app/main/ui/auth/register.cljs -msgid "errors.registration-disabled" -msgstr "rigitar ba ta yi ba." +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-other-team" +msgstr "tura ma sauran tawaga" -msgid "workspace.undo.entry.multiple.media" -msgstr "kadarar zane" +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/files.cljs +msgid "dashboard.new-file" +msgstr "+ sabon kundi" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "sami lambar kowane aiki " +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-file-prefix" +msgstr "sabon kundi" -msgid "workspace.options.show-in-viewer" -msgstr "fito da kaurin sosai" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.new-project" +msgstr "+ sabon aiki" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.lowercase" -msgstr "yanayin kasa" +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-project-prefix" +msgstr "sabon aiki" -#: src/app/main/ui/settings/password.cljs -msgid "errors.password-invalid-confirmation" -msgstr "tabbata labar tsaro ta yi daidai" +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.no-matches-for" +msgstr "ba wanda ya yi daidai da “%s“" -msgid "workspace.undo.entry.multiple.group" -msgstr "rukunis" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.no-projects-placeholder" +msgstr "nan za a ga bayanin aiki" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.updates" -msgstr "sabuntawa" +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-changed-successfully" +msgstr "ka zamanantar da adireshinka na imel" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-verified-successfully" +msgstr "an tantance adireshinka na imel" -msgid "dashboard.export-frames" -msgstr "Allon fitarwa na PDF" +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.notifications.password-saved" +msgstr "an tsare maka shaidar tsaro!" -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "modals.delete-page.title" -msgstr "goge shafi" +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.num-of-members" +msgstr "%s memba" -#: src/app/main/ui/static.cljs -msgid "labels.service-unavailable.main-message" -msgstr "ba sabis" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.open-in-new-tab" +msgstr "buxe kundi a sabon wurin buxewa" -msgid "shortcuts.opacity-2" -msgstr "Saita dishi dishi zuwa kashi 20" +msgid "dashboard.options" +msgstr "zavi" -msgid "workspace.shape.menu.create-multiple-components" -msgstr "kirkiri abubuwa da yawa" +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.password-change" +msgstr "sauya lambar tsaro" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.rename-group" -msgstr "sake sunan kungiyar" +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.pin-unpin" +msgstr "rufewa/buxewa" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-profile" -msgstr "ka na son gwadawa ne kawai?" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.projects-title" +msgstr "aiki" -msgid "webhooks.last-delivery.success" -msgstr "Sakon karshe ya isa." +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.remove-account" +msgstr "ka na son cire taskarka?" -msgid "shortcuts.bool-intersection" -msgstr "ma'aunin abubuwa daban daban" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.remove-shared" +msgstr "cire matattarar kundate" -msgid "workspace.options.stroke-width" -msgstr "gigciye fadin" +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.save-settings" +msgstr "wurin ajiyar saiti" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-out" -msgstr "sauki waje" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.search-placeholder" +msgstr "nema …" -#: src/app/main/ui/static.cljs -msgid "labels.not-found.desc-message" -msgstr "babu wannan fagen, ko ba ka da izinin shiga." +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.searching-for" +msgstr "neman “%s“…" -msgid "workspace.options.x" -msgstr "X layi" +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-language" +msgstr "zavavven harshen UI" -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.members" -msgstr "mambobi" +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-theme" +msgstr "zaven batu" -#: src/app/main/ui/auth/verify_token.cljs -msgid "dashboard.notifications.email-verified-successfully" -msgstr "an tantance adireshinka na imel" +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.show-all-files" +msgstr "duk kundaye" -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.show-interactions" -msgstr "Nuna hulda" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-delete-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "an goge kundinka" +msgstr[1] "an goge kundayenka" -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.hint" -msgstr "" -"idan ka canza wurin mallaka, ba za ka iya sauya matsayin shugaba ba, gazawar " -"wasu dokokin wannan tawaagar. " +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-delete-project" +msgstr "ka goge aikinka" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-self" -msgstr "kai/ni" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-duplicate-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "an kwafi kundinka" +msgstr[1] "an kwafi kundayenka" -msgid "errors.webhooks.invalid-uri" -msgstr "URL bai gyaru ba." +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-duplicate-project" +msgstr "an kwafi aikinka" -msgid "modals.create-webhook.url.placeholder" -msgstr "https://misali.com/postreceive" +#: src/app/main/ui/dashboard/grid.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-file" +msgstr "an tura aikinka" -msgid "shortcuts.draw-nodes" -msgstr "samar da hanya" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-files" +msgstr "an tura kundayenka" -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.you" -msgstr "(kai)" +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-move-project" +msgstr "an tura aikinka" -msgid "dashboard.options" -msgstr "zavi" +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-info" +msgstr "bayanin tawaga" -msgid "workspace.shape.menu.path" -msgstr "hanya" +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-members" +msgstr "mambobin tawaga" -msgid "onboarding.templates.title" -msgstr "fara tsarawa" +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-projects" +msgstr "aiyukan tawaga" -msgid "labels.go-back" -msgstr "koma baya" +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.theme-change" +msgstr "batun UI" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.message" -msgid_plural "modals.unpublish-shared-confirm.message" -msgstr[0] "ka tabbata ka na son rufe taskar nan?" -msgstr[1] "ka tabbata ka na son rufe taskokin nan?" +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.title-search" +msgstr "neman sakamako" -#: src/app/main/ui/settings/password.cljs -msgid "errors.wrong-old-password" -msgstr "tsohuwar lambar tsaro ba daidai ba ce" +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.type-something" +msgstr "rubuta neman sakamako" #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "dashboard.unpublish-shared" msgstr "wallafa taska" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "ina aikin kaina" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.offsety" -msgstr "Y" +#: src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs +msgid "dashboard.update-settings" +msgstr "zamanartarwa wurin gyara" -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.size" -msgstr "wurin daxa girma" +msgid "dashboard.webhooks.active" +msgstr "ya na amfani" -#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs -msgid "viewer.frame-not-found" -msgstr "Ba'a sami allon ba." +msgid "dashboard.webhooks.active.explain" +msgstr "idan an sami sauyi a nan ake kawo shi" -msgid "workspace.focus.focus-mode" -msgstr "tsarin maida hankali" +msgid "dashboard.webhooks.content-type" +msgstr "irin ra'ayi" -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-submit" -msgstr "gano lambar tsaro" +msgid "dashboard.webhooks.create" +msgstr "yin webhook" -msgid "shortcuts.cut" -msgstr "cire" +msgid "dashboard.webhooks.create.success" +msgstr "an gina Webhook." -#: src/app/main/ui/confirm.cljs -msgid "ds.component-subtitle" -msgstr "zamanantar da sassa:" +msgid "dashboard.webhooks.description" +msgstr "" +"Webhooks hanyar sanar da manhajoji da addireshi intanet idan wani ya faru a " +"Penpot. za a tura maka da saqon talla URLs ka samar da." -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.delete" -msgstr "goge" +msgid "dashboard.webhooks.empty.add-one" +msgstr "danna qasa \"sanya webhook\" qara xaya." -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs -msgid "workspace.options.component" -msgstr "Bangarori" +msgid "dashboard.webhooks.empty.no-webhooks" +msgstr "ba a gina wani webhooks ba." -#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs -msgid "dashboard.copy-suffix" -msgstr "(kwafi)" +msgid "dashboard.webhooks.update.success" +msgstr "sabunta Webhook." -msgid "labels.export" -msgstr "fitarwa" +#: src/app/main/ui/settings.cljs +msgid "dashboard.your-account-title" +msgstr "gidanka" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-ms" -msgstr "ms" +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-email" +msgstr "imel" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.right" -msgstr "dama" +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-name" +msgstr "sunanka" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.cancel" -msgstr "soke" +#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.your-penpot" +msgstr "fenfot na ka" -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.save-color" -msgstr "Adana salon kala" +#: src/app/main/ui/alert.cljs +msgid "ds.alert-ok" +msgstr "haka" -msgid "shortcuts.opacity-8" -msgstr "seta dishi dishin zuwa kashi 8o" +#: src/app/main/ui/alert.cljs +msgid "ds.alert-title" +msgstr "natsu" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.ellipse" -msgstr "siffar kwai (%s)" +#: src/app/main/ui/confirm.cljs +msgid "ds.component-subtitle" +msgstr "zamanantar da sassa:" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.search" -msgstr "nemo kadarar" +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-cancel" +msgstr "goge" -msgid "shortcuts.or" -msgstr " ko " +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-ok" +msgstr "haka" -msgid "shortcuts.opacity-5" -msgstr "Saita dishi dishi zuwa kashi 50" +#: src/app/main/ui/confirm.cljs, src/app/main/ui/confirm.cljs +msgid "ds.confirm-title" +msgstr "ka tabbata?" -msgid "onboarding-v2.newsletter.desc" -msgstr "" -"domin jin daxin fenfot , sai ka biya kuxi domin labarai da ci gaban da ake " -"samu." +#: src/app/main/ui/auth/login.cljs +msgid "errors.auth-provider-not-configured" +msgstr "manhajar tantancewar ba ta tsaru ba." -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.nudge-title" -msgstr "adadin jan hankali" +msgid "errors.auth.unable-to-login" +msgstr "lokacin ya qare ko ba a tantance ka ba." -msgid "workspace.sidebar.layers.groups" -msgstr "rukuni" +msgid "errors.bad-font" +msgstr "ba za a iya xora fonts %s ba" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Rectangle" +msgid "errors.bad-font-plural" +msgstr "ba za a iya xora fonts %s ba" -#: src/app/main/ui/settings/password.cljs -msgid "labels.new-password" -msgstr "sabuwar lambar tsaro" +msgid "errors.cannot-upload" +msgstr "kasa xora xan aiken kundi." -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "ana buqatar suna" +#: src/app/main/data/workspace.cljs +msgid "errors.clipboard-not-implemented" +msgstr "manhajar binciken nan ba ta iya yin wannan aikin" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-left" -msgstr "sama hagu" +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs +msgid "errors.email-already-exists" +msgstr "an yi amfani da imel" -msgid "shortcut-section.dashboard" -msgstr "allon kallo" +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.email-already-validated" +msgstr "an farfaxo da imel." -msgid "dashboard.webhooks.active.explain" -msgstr "idan an sami sauyi a nan ake kawo shi" +msgid "errors.email-as-password" +msgstr "ba za ka iya amfani da imel ba a matsayin lambar tsaro ba" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.create-new-team" -msgstr "yi sabuwar tawaga" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.email-has-permanent-bounces" +msgstr "imel «%s» na da bayanan matsaloli na dindindin." -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.color-palette" -msgstr "farantin kala (%s)" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs +msgid "errors.email-invalid" +msgstr "sanya imel mai amfani" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.scd-message" -msgid_plural "modals.delete-shared-confirm.activated.scd-message" -msgstr[0] "za a iya buxe wannan taskirar a nan: " -msgstr[1] "za a iya buxe taskirorin nan a nan: " +#: src/app/main/ui/settings/change_email.cljs +msgid "errors.email-invalid-confirmation" +msgstr "tabbata imel xinka ya yi daidai" -msgid "shortcuts.move-fast-left" -msgstr "Matsa hagu da sauri" +msgid "errors.email-spam-or-permanent-bounces" +msgstr "saqonni marasa amfani na imel «%s»." -msgid "workspace.undo.entry.multiple.frame" -msgstr "allo" +#: src/app/main/errors.cljs +msgid "errors.feature-mismatch" +msgstr "" +"tamkar ka buxe wani kundi da ke da muhimmanci '%s' bayar da dama qarin da " +"ka yi ma fenfot xinka bai karbu ba ko ba zai yi aiki ba." -#: src/app/main/ui/settings/profile.cljs -msgid "labels.update" -msgstr "sabunta" +#: src/app/main/errors.cljs +msgid "errors.feature-not-supported" +msgstr "sassa '%s' ba za su yi aiki ba." -msgid "labels.num-of-frames" -msgid_plural "labels.num-of-frames" -msgstr[0] "allo 1" -msgstr[1] "alluna %s" +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.generic" +msgstr "wata matsala ta faru." -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-min-h" -msgstr "tsaho mafi kankanta" +#: src/app/main/ui/components/color_input.cljs +msgid "errors.invalid-color" +msgstr "launin bai yi ba" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.message" -msgstr "qara “%s” xakin ajiya" +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.invite-invalid" +msgstr "gaiyar ba ta yi ba" -#: src/app/main/ui/dashboard/grid.cljs -msgid "dashboard.loading-files" -msgstr "aikin dora kundaye …" +msgid "errors.invite-invalid.info" +msgstr "za a iya soke gayyata ko ta ki aiki." -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component-in-bulk.hint" -msgstr "" -"ka kusa sabunta taskar ajiyar shir-shirye. zai iya shafar sauran kundayen da " -"ke amfani da ita." +#: src/app/main/ui/auth/login.cljs +msgid "errors.ldap-disabled" +msgstr "LDAP ya gaza tantancewa." -msgid "workspace.path.actions.add-node" -msgstr "kara kauri (%s)" +#: src/app/main/errors.cljs +msgid "errors.max-quote-reached" +msgstr "kammala adadin '%s' madogara. gyara." -msgid "workspace.options.component.main" -msgstr "Ainahin" +#: src/app/main/data/workspace/persistence.cljs +msgid "errors.media-too-large" +msgstr "hoton da za ka sanya ya yi girma." -#: src/app/main/ui/workspace/sidebar/options.cljs -msgid "workspace.options.design" -msgstr "zane" +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "errors.media-type-mismatch" +msgstr "hoton da aka sanya bai yi daidai da kundin da ake son faxaxawa ba." -#: src/app/main/ui/dashboard/projects.cljs -msgid "dashboard.projects-title" -msgstr "aiki" +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "errors.media-type-not-allowed" +msgstr "wannan hoton ba ya aiki." -msgid "workspace.undo.entry.single.frame" -msgstr "allo" +#: src/app/main/ui/dashboard/team.cljs +msgid "errors.member-is-muted" +msgstr "bayanan da ka nema imel din su ya suma (bayanan matsaloli)." -msgid "shortcuts.flip-vertical" -msgstr "kifa ta tsaye" +#: src/app/main/ui/settings/password.cljs +msgid "errors.password-invalid-confirmation" +msgstr "tabbata labar tsaro ta yi daidai" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow-starts" -msgstr "gudun farko" +#: src/app/main/ui/settings/password.cljs +msgid "errors.password-too-short" +msgstr "lambar tsaro dole ta kai yawan alamu 8" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-position" -msgstr "Mataki" +msgid "errors.profile-blocked" +msgstr "bayanan a rufe suke" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-dynamic-alignment" -msgstr "bada damar daidaitawa mai canjawa" +#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.profile-is-muted" +msgstr "bayananka su na da imel maras motsi (baiyana matsaloli)." -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.more-colors" -msgstr "kaloli masu yawa" +#: src/app/main/ui/auth/register.cljs +msgid "errors.registration-disabled" +msgstr "rigitar ba ta yi ba." -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.accept" -msgstr "goge kundi" +msgid "errors.team-leave.insufficient-members" +msgstr "ba sauran masu fita daga tawaga, ba bu tabbacin gogewa." -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "ni mai zaman kansa ne" +msgid "errors.team-leave.member-does-not-exists" +msgstr "mamban da ka ke son sanyawa ba ya a ciki." -msgid "shortcuts.paste" -msgstr "manna" +msgid "errors.team-leave.owner-cant-leave" +msgstr "mai abu ba ya barin tawaga, dole adubi matsayin mai abu." -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-bottom" -msgstr "jerin kasa" +#: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "errors.unexpected-error" +msgstr "afkuwar kuskuren da ba a zata ba." -msgid "labels.fonts" -msgstr "Font" +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.unexpected-token" +msgstr "tukuicin da ba a san da shi ba" -msgid "shortcuts.not-found" -msgstr "babu gajeriyar hanya" +msgid "errors.webhooks.connection" +msgstr "hadin bai yi ba, ba a iya samun URL" -msgid "common.share-link.destroy-link" -msgstr "tarwatsa hanya" +msgid "errors.webhooks.invalid-uri" +msgstr "URL bai gyaru ba." -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-close-confirm.hint" -msgstr "" -"ka tabbata memban tawaga kaxai, za ya iya goge tawaga tare da aikinta da " -"kundaye." +msgid "errors.webhooks.last-delivery" +msgstr "saqon qarshe bai je ba." -#: src/app/main/ui/settings/password.cljs -msgid "labels.old-password" -msgstr "tsohuwar lambar tsaro" +msgid "errors.webhooks.ssl-validation" +msgstr "kuskure kan farfaxo da SSL." -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.new" -msgstr "sabo %s" +msgid "errors.webhooks.timeout" +msgstr "dakatarwa" -msgid "onboarding-v2.welcome.desc3.title" -msgstr "gudunmawar jagora" +msgid "errors.webhooks.unexpected" +msgstr "matsalar da ba zata ba lokacin farfaxowa" -msgid "shortcuts.toggle-assets" -msgstr "Danna kadara" +msgid "errors.webhooks.unexpected-status" +msgstr "matsayin da ba zato %s" -msgid "onboarding-v2.newsletter.updates" -msgstr "" -"aiko man da sabbin abubuwan da aka yi (sabbib fasali, fitowa, gyara...)." +#: src/app/main/ui/auth/login.cljs +msgid "errors.wrong-credentials" +msgstr "kuskuren imel ko lambar tsaro." -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.create-artboard-from-selection" -msgstr "zababban allo" +#: src/app/main/ui/settings/password.cljs +msgid "errors.wrong-old-password" +msgstr "tsohuwar lambar tsaro ba daidai ba ce" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.description" +msgstr "bayani" -msgid "onboarding.newsletter.title" -msgstr "ka buqatar labaran fenfot?" +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-go-to" +msgstr "je ka taskar fenfot" -msgid "errors.team-leave.insufficient-members" -msgstr "ba sauran masu fita daga tawaga, ba bu tabbacin gogewa." +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-subtitle1" +msgstr "" +"mun yi farin ciki da samunka a nan. idan ka na da buqatar taimako sai ka " +"tuntuvi na gaba da kai matsayi." -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.copied-success" -msgstr "kwafar lambar tsaro" +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-title" +msgstr "dangin fenfot" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.fix-when-scrolling" -msgstr "gyara nemowa" +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subject" +msgstr "shugabanci" #: src/app/main/ui/settings/feedback.cljs -msgid "feedback.description" -msgstr "bayani" +msgid "feedback.subtitle" +msgstr "" +"bayyana dalilin imel dinka, faiyace idan akwai matsala, an shawarwari ko " +"hasashe. tawaga ko mamba za a kula da kai." -msgid "labels.installed-fonts" -msgstr "sanya fenfot" +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.title" +msgstr "imel" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-top-right" -msgstr "saman dama" +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-go-to" +msgstr "je ka tiwita" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-in" -msgstr "ciki" +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-subtitle1" +msgstr "tambayoyin da ke buqatar amsa." -msgid "modals.publish-empty-library.title" -msgstr "wallafa taska maras komai" +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-title" +msgstr "wurin karvar qorafin tiwita" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay" -msgstr "Juya mai murfi" +#: src/app/main/ui/settings/password.cljs +msgid "generic.error" +msgstr "afkuwar matsala" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.info" -msgstr "bincika manhaja domin sanin manyan sassanta." +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur" +msgstr "xige-xige" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Figma" +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur.value" +msgstr "muhimmanci" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow" -msgstr "Triangle mashi" +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hex" +msgstr "HEX" -msgid "modals.leave-and-reassign.forbidden" -msgstr "" -"ba za ku iya bari ba idan ba wani memba da zai ingata wa mai shi. ku na iya " -"goge tawaga." +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hsla" +msgstr "HSLA" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-scale-text" -msgstr "kashe sikelin rubutu" +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.rgba" +msgstr "RGBA" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.rows" -msgstr "jere" +#: src/app/main/ui/inspect/attributes/fill.cljs +msgid "inspect.attributes.fill" +msgstr "cika" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.tutorials" -msgstr "koyarwa" +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.download" +msgstr "sauke hanyar hoto" -msgid "workspace.undo.entry.multiple.curve" -msgstr "kwana" +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.height" +msgstr "tsawo" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-guides" -msgstr "kashe tsinkewa zuwa mai jagora" +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.width" +msgstr "faxi" -#: src/app/main/ui/auth/register.cljs -msgid "auth.already-have-account" -msgstr "ka na da taska?" +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout" +msgstr "shiri" -msgid "dashboard.import.progress.process-typographies" -msgstr "kula da rubutu" +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.height" +msgstr "tsawo" -msgid "shortcuts.opacity-1" -msgstr "saita dishi dishi zuwa kashi 10" +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.left" +msgstr "hagu" -msgid "workspace.path.actions.snap-nodes" -msgstr "tsinke kauri (%s)" +#: src/app/main/ui/inspect/attributes/layout.cljs, src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.radius" +msgstr "tsakiya" -msgid "shortcuts.bring-front" -msgstr "kawo zuwa gaba" +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.rotation" +msgstr "jujjuyawa" -#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.typography" -msgstr "rubutun rubutu" +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.top" +msgstr "sama" -msgid "common.share-link.view-all" -msgstr "zavi duka" +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.width" +msgstr "fadi" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.give-feedback" -msgstr "bada bayani" +#: src/app/main/ui/inspect/attributes/shadow.cljs +msgid "inspect.attributes.shadow" +msgstr "inuwa" -msgid "shortcuts.bool-exclude" -msgstr "kebentaccan ma'auni" +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.size" +msgstr "wurin daxa girma" -msgid "workspace.undo.entry.multiple.multiple" -msgstr "abu" +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke" +msgstr "yankewa" -msgid "dashboard.export-standard-multi" -msgstr "Sauke %s cikakken kundi (.svg + .json)" +#, permanent +msgid "inspect.attributes.stroke.alignment.center" +msgstr "tsakiya" -#: src/app/main/data/workspace/persistence.cljs -msgid "errors.media-too-large" -msgstr "hoton da za ka sanya ya yi girma." +#, permanent +msgid "inspect.attributes.stroke.alignment.inner" +msgstr "daga ciki" -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.invitations" -msgstr "gayyata" +#, permanent +msgid "inspect.attributes.stroke.alignment.outer" +msgstr "daga waje" -msgid "shortcut-subsection.navigation-viewer" -msgstr "shawagi" +msgid "inspect.attributes.stroke.style.dotted" +msgstr "xige-xige" -#: src/app/main/ui/auth/register.cljs -msgid "auth.check-your-email" -msgstr "" -"bincika taskarka ta imel,ka danna alamar mahaxa domin tabbatarwa,sannan ka " -"fara amfani da fenfot." +msgid "inspect.attributes.stroke.style.mixed" +msgstr "gauraya" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-slide" -msgstr "Ja" +msgid "inspect.attributes.stroke.style.none" +msgstr "babu" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-min-w" -msgstr "fadi mafi kankanta" +msgid "inspect.attributes.stroke.style.solid" +msgstr "tauri" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-min-h" -msgstr "tsawo mafi kankanta" +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke.width" +msgstr "fadi" -msgid "workspace.sidebar.layers.masks" -msgstr "takunkumi" +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography" +msgstr "tsara rubutu" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.screen" -msgstr "allo" +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-family" +msgstr "gidan salo" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "Aga duka canjin" +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-size" +msgstr "girman salo" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.inner-shadow" -msgstr "Inuwar ciki" +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-style" +msgstr "tsarin salo" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.frame" -msgstr "allo (%s)" +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-weight" +msgstr "kaurin salon" -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "...branding, illustrations, marketing pieces, etc." +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.letter-spacing" +msgstr "tazarar harafi" -msgid "onboarding.team-modal.create-team-feature-4" -msgstr "Unlimited members" +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.line-height" +msgstr "tsawon layi" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs -msgid "workspace.options.export.suffix" -msgstr "Kari na bayan baki" +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-decoration" +msgstr "kwalliyar rubutu" -msgid "errors.webhooks.connection" -msgstr "hadin bai yi ba, ba a iya samun URL" +msgid "inspect.attributes.typography.text-decoration.none" +msgstr "babu" -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.confirm-email" -msgstr "tantance sabon imel" +msgid "inspect.attributes.typography.text-decoration.strikethrough" +msgstr "zana layi tsakiyar rubutu" -msgid "auth.terms-of-service" -msgstr "dokokin aiki" +msgid "inspect.attributes.typography.text-decoration.underline" +msgstr "jan layi" -msgid "dashboard.export.options.all.message" -msgstr "manhajar tura kundi ta kunshi fitarwa, tattali mahaxarsu." +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-transform" +msgstr "masarrafin rubu,manya ko qanana" -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.group-fill" -msgstr "Cika rukuni" +msgid "inspect.attributes.typography.text-transform.lowercase" +msgstr "qananan baqaqe" -msgid "shortcuts.stop-measure" -msgstr "dena aunawa" +msgid "inspect.attributes.typography.text-transform.none" +msgstr "babu" -#: src/app/main/ui/comments.cljs -msgid "labels.write-new-comment" -msgstr "rubuta s abon yabo" +msgid "inspect.attributes.typography.text-transform.titlecase" +msgstr "yadda ake rubuta batu" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-subtitle1" -msgstr "" -"mun yi farin ciki da samunka a nan. idan ka na da buqatar taimako sai ka " -"tuntuvi na gaba da kai matsayi." +msgid "inspect.attributes.typography.text-transform.uppercase" +msgstr "manyan baqaqe" -msgid "dashboard.libraries-and-templates.explore" -msgstr "bincika su da kyau kasan ta yadda za ka bayar da gudunmawa" +msgid "inspect.empty.help" +msgstr "domin neman qarin bayani game da fenfot a tuntubi sashen agaji" -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "Babu rubutun rubutu a ma'ajiya yanzu" +msgid "inspect.empty.more-info" +msgstr "qarin bayani a fagen lura" -#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.paste" -msgstr "manna" +msgid "inspect.empty.select" +msgstr "zabar zubi, hukumar masu sa ido akan bangarorinsu da lambobinsu" -msgid "labels.edit-file" -msgstr "gyara kundi" +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code" +msgstr "lamba" -msgid "onboarding.templates.subtitle" -msgstr "ga wasu hotunan talla nan." +msgid "inspect.tabs.code.selected.circle" +msgstr "da'ira" -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.selection-fill" -msgstr "cika zabi" +msgid "inspect.tabs.code.selected.component" +msgstr "bangare" msgid "inspect.tabs.code.selected.curve" msgstr "lankwasa" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.unsaved" -msgstr "Canja canjan da ba'a adana ba" +msgid "inspect.tabs.code.selected.frame" +msgstr "hukuma" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-middle" -msgstr "jerin tsakiya" +msgid "inspect.tabs.code.selected.group" +msgstr "qungiya" -msgid "viewer.breaking-change.description" -msgstr "" -"Wannan mahadar da aka raba yanxu batada ingaci. Ka/ki kirkiri wata ko ka/ki " -"tamayi maishi a baka/ki sabuwa." +msgid "inspect.tabs.code.selected.image" +msgstr "hoto" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.color-dodge" -msgstr "kala gudajjiya" +msgid "inspect.tabs.code.selected.mask" +msgstr "marfi" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.saving" -msgstr "Adanawa" +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code.selected.multiple" +msgstr "%s zavavve" -msgid "shortcuts.next-frame" -msgstr "wani tsari" +msgid "inspect.tabs.code.selected.path" +msgstr "hanya" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library" -msgstr "ma'adana" +msgid "inspect.tabs.code.selected.rect" +msgstr "rektangul" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-background" -msgstr "kara mai rufin bayan" +msgid "inspect.tabs.code.selected.svg-raw" +msgstr "SVG" -msgid "workspace.sidebar.layers.search" -msgstr "nemo shimfida" +msgid "inspect.tabs.code.selected.text" +msgstr "rubutu" -msgid "inspect.attributes.stroke.style.solid" -msgstr "tauri" +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.info" +msgstr "bayani" -#: src/app/main/ui/auth/register.cljs -msgid "auth.demo-warning" -msgstr "" -"wannan aikin gwaji ne kawai,kar ka yi amfani da shi a aikin gaske,lokaci " -"zuwa lokaci za ya ringa vacewa ne." +#: src/app/main/ui/workspace/header.cljs +msgid "label.shortcuts" +msgstr "yanke" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-90-days" -msgstr "kwanaki 90" +msgid "labels.accept" +msgstr "karva" -#: src/app/main/ui/dashboard/search.cljs -msgid "title.dashboard.search" -msgstr "nema - %s - Mazubin biruka" +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "lambobi masu xauke da bayani" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.unknown" -msgstr "yanayi fiye da %s" +msgid "labels.active" +msgstr "mai amfani" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.accept" -msgstr "goge tawaga" +msgid "labels.add-custom-font" +msgstr "inganta font" -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.height" -msgstr "tsawo" +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.admin" +msgstr "shugaba" -msgid "shortcuts.zoom-lense-increase" -msgstr "Zuko karuwar ido" +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.all" +msgstr "duk" -msgid "workspace.shape.menu.add-grid" -msgstr "kara akwatin tsari" +msgid "labels.and" +msgstr "da" -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.interactions" -msgstr "Hulda" +msgid "labels.back" +msgstr "baya" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/inspect/attributes/text.cljs, src/app/main/ui/inspect/attributes/text.cljs -msgid "workspace.assets.typography.sample" -msgstr "Ag" +#: src/app/main/ui/static.cljs +msgid "labels.bad-gateway.desc-message" +msgstr "" +"ka jinkirta kaxan sannan ka qara gwadawa; mu na aiki daidai domin tattala " +"aikinmu." -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.dismiss-all" -msgstr "goge duka" +#: src/app/main/ui/static.cljs +msgid "labels.bad-gateway.main-message" +msgstr "akwai matsala" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "" -"duk aikin da aka yi a wannan kundin, nan za a same shi (ba zanen da za a " -"iya tsinkawa)." -msgstr[1] "" -"duk aikin da aka yi a waxancan kundayen, can za a same su (ba zane da za iya " -"tsinkawa)." +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.cancel" +msgstr "sokewa" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-complete" -msgstr "An gama fitarwa" +msgid "labels.close" +msgstr "rufewa" -msgid "labels.continue-with-penpot" -msgstr "za ka iya ci gaba a idanka na fenfot" +#: src/app/main/ui/dashboard/comments.cljs +msgid "labels.comments" +msgstr "yabo" -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-size" -msgstr "girman salo" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.community" +msgstr "matattara" -msgid "shortcuts.hide-ui" -msgstr "fito / boye UI" +#: src/app/main/ui/settings/password.cljs +msgid "labels.confirm-password" +msgstr "tabbatar da lambar tsaro" -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-title" -msgstr "qirqiri sabon kundi" +msgid "labels.continue" +msgstr "ci gaba" -#: src/app/main/ui/dashboard/libraries.cljs -msgid "dashboard.libraries-title" -msgstr "taskoki" +msgid "labels.continue-with" +msgstr "ci gaba da" -msgid "inspect.tabs.code.selected.rect" -msgstr "rektangul" +msgid "labels.continue-with-penpot" +msgstr "za ka iya ci gaba a idanka na fenfot" -#: src/app/main/ui/export.cljs -msgid "dashboard.export-frames.title" -msgstr "Fitarwa a PDF" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.copy-invitation-link" +msgstr "kwafar hanya" #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "labels.create" msgstr "yi" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-delay" -msgstr "jinkiri" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-multiple.selected" -msgstr "%s of %s tubullan da aka zava" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-confirm.accept" -msgstr "barin tawaga" - -#: src/app/main/ui/components/color_input.cljs -msgid "errors.invalid-color" -msgstr "launin bai yi ba" - -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.small-nudge" -msgstr "qaramin jan hankali" - -msgid "shortcuts.duplicate" -msgstr "maimaita" +#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team" +msgstr "yi sabuwar tawaga" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.saved" -msgstr "An adana" +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team.placeholder" +msgstr "shigar da sabon sunan tawaga" -msgid "shortcuts.create-new-project" -msgstr "samar da sabo abu" +msgid "labels.custom-fonts" +msgstr "kwalliya da fenfot" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.luminosity" -msgstr "warewa" +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.dashboard" +msgstr "dashbod" -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.share.copy-link" -msgstr "Kwafi mahada" +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete" +msgstr "goge" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.color" -msgstr "kala" +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment" +msgstr "goge yabo" -msgid "onboarding.team-modal.create-team-feature-1" -msgstr "aiyuka da kundaye da yawa" +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment-thread" +msgstr "goge rubutu" -#: src/app/main/ui/workspace/sidebar/shortcuts.cljs -msgid "shortcuts.title" -msgstr "allon harufa yanke" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.delete-invitation" +msgstr "goge gayyata" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flip-vertical" -msgstr "kifa ta kwance" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete-multi-files" +msgstr "goge %s kundaye" -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.position" -msgstr "matsayi" +msgid "labels.discard" +msgstr "vatar" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square" -msgstr "murabba'i" +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.drafts" +msgstr "adana" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-justify" -msgstr "tabbatarwa (%s)" +#: src/app/main/ui/comments.cljs +msgid "labels.edit" +msgstr "gyara" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.space-between" -msgstr "sarari tsakani" +msgid "labels.edit-file" +msgstr "gyara kundi" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.open-in-new-tab" -msgstr "buxe kundi a sabon wurin buxewa" +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.editor" +msgstr "maigyara" -#: src/app/main/ui/auth.cljs -msgid "auth.sidebar-tagline" -msgstr "samun hanyar magance matsalar zane-zane." +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.expired-invitation" +msgstr "daina aiki" -#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs -msgid "labels.create-team" -msgstr "yi sabuwar tawaga" +msgid "labels.export" +msgstr "fitarwa" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.uppercase" -msgstr "yanayin sama" +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-disabled" +msgstr "kasa samun bayani" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.assets" -msgstr "kadara" +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-sent" +msgstr "aika bayani" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom" -msgstr "Zuko" +msgid "labels.font-family" +msgstr "ire-iren font" -#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.edit" -msgstr "tace" +msgid "labels.font-providers" +msgstr "ma su fenfot" -msgid "dashboard.import.import-error" -msgstr "akwi matsala a kundin. ba a shio da kundin ba." +msgid "labels.font-variants" +msgstr "salo" -msgid "onboarding-v2.newsletter.privacy1" -msgstr "mu na kula da sirri, a nan za ka karanta na mu " +msgid "labels.fonts" +msgstr "Font" -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.success-move-project" -msgstr "an tura aikinka" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.github-repo" +msgstr "taskar rubuce-rubuce" -msgid "workspace.options.component.annotation" -msgstr "Yin sharhin rubutu" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.give-feedback" +msgstr "bada bayani" -msgid "shortcuts.toggle-layers" -msgstr "Danna shimfida" +msgid "labels.go-back" +msgstr "koma baya" -msgid "labels.uploading" -msgstr "ana dorawa…" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.help-center" +msgstr "sashen taimako" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-preserve-scroll" -msgstr "adana komawa sama da kasa" +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.hide-resolved-comments" +msgstr "voye saqon da aka buxa" -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.accept" -msgstr "goge memba" +msgid "labels.inactive" +msgstr "maras amfani" -msgid "workspace.undo.entry.single.typography" -msgstr "rubutun rubuta kadara" +msgid "labels.installed-fonts" +msgstr "sanya fenfot" -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.selection-color" -msgstr "zababbabbin kaloli" +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.desc-message" +msgstr "" +"an sami matsala. sake gwadawa idan matsalar ba ta kauce ba, tuntubi sashen " +"taimako." -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.more-lib-colors" -msgstr "Ma'ajiyar kaloli masu yawa" +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.main-message" +msgstr "kuskuren ciki" -msgid "inspect.tabs.code.selected.image" -msgstr "hoto" +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.invitations" +msgstr "gayyata" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.create-group" -msgstr "kirkiri rukuni" +#: src/app/main/ui/settings/options.cljs +msgid "labels.language" +msgstr "harshe" -msgid "modals.delete-webhook.accept" -msgstr "goge webhook" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.libraries-and-templates" +msgstr "taskoki & allunan talla" -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.invite-member-confirm.accept" -msgstr "aika saqon" +msgid "labels.log-or-sign" +msgstr "yi ko shiga" + +#: src/app/main/ui/settings.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.logout" +msgstr "fita" #: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs msgid "labels.member" msgstr "mamba" -msgid "onboarding.newsletter.policy" -msgstr "dokoki." +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.members" +msgstr "mambobi" -#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs -msgid "errors.email-already-exists" -msgstr "an yi amfani da imel" +#: src/app/main/ui/settings/password.cljs +msgid "labels.new-password" +msgstr "sabuwar lambar tsaro" -#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs -msgid "errors.media-type-not-allowed" -msgstr "wannan hoton ba ya aiki." +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs +msgid "labels.no-comments-available" +msgstr "an dakatar da kai duka! Alamar sabon sharhi za ta fito nan." -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.text-transform" -msgstr "masarrafin rubu,manya ko qanana" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.no-invitations" +msgstr "ba saqon da ba a buxa ba." -msgid "dashboard.webhooks.create" -msgstr "yin webhook" +#: src/app/main/ui/dashboard/team.cljs +#, markdown +msgid "labels.no-invitations-hint" +msgstr "danna **gayyato mutane** wurin da ake nemo mutane a wannan tawaga." -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.bottom" -msgstr "Kasa" +#: src/app/main/ui/static.cljs +msgid "labels.not-found.desc-message" +msgstr "babu wannan fagen, ko ba ka da izinin shiga." -msgid "common.share-link.get-link" -msgstr "samun hanya" +#: src/app/main/ui/static.cljs +msgid "labels.not-found.main-message" +msgstr "alama!" -msgid "shortcuts.open-comments" -msgstr "tafi inda 'yan kallo za su bayyana ra'ayi" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.num-of-files" +msgid_plural "labels.num-of-files" +msgstr[0] "kundi 1" +msgstr[1] "kundaye %s" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.subtitle" -msgstr "" -"bayyana dalilin imel dinka, faiyace idan akwai matsala, an shawarwari ko " -"hasashe. tawaga ko mamba za a kula da kai." +msgid "labels.num-of-frames" +msgid_plural "labels.num-of-frames" +msgstr[0] "allo 1" +msgstr[1] "alluna %s" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-multi-confirm.title" -msgstr "gogewa %s kundaye" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.num-of-projects" +msgid_plural "labels.num-of-projects" +msgstr[0] "aiki" +msgstr[1] "aiyuka %s" -msgid "workspace.header.menu.disable-snap-pixel-grid" -msgstr "kashe tsinkewa zuwa pixel" +#: src/app/main/ui/settings/password.cljs +msgid "labels.old-password" +msgstr "tsohuwar lambar tsaro" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in" -msgstr "sauki ciki" +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.only-yours" +msgstr "naka kawai" -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-family" -msgstr "gidan salo" +msgid "labels.or" +msgstr "ko" -#: src/app/main/ui/auth/login.cljs -msgid "auth.register" -msgstr "ba ka da kunxi har yanzu?" +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.owner" +msgstr "mai" #: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs msgid "labels.password" msgstr "lambar tsaro" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.pending-invitation" +msgstr "tukuna" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.profile" +msgstr "kundi" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.projects" +msgstr "aiyuka" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.release-notes" +msgstr "bayar da bayani" + +#: src/app/main/ui/workspace.cljs +msgid "labels.reload-file" +msgstr "qara dora kundi" + #: src/app/main/ui/workspace/libraries.cljs, src/app/main/ui/dashboard/team.cljs msgid "labels.remove" msgstr "cire" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.solid" -msgstr "mai tauri" - -#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.generic" -msgstr "wata matsala ta faru." +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.remove-member" +msgstr "cire mamba" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.some" -msgstr "wasu" +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.rename" +msgstr "sake suna" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.there-are-updates" -msgstr "a kwai na zamani a rababban ma'ajiya" +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.rename-team" +msgstr "sake suna tawaga" -#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.leave-team" -msgstr "fita tawaga" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.resend-invitation" +msgstr "sake aika saqon gayyata" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.delete" -msgstr "gogagge %s" +#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs +msgid "labels.retry" +msgstr "sake gwadawa" -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.line-height" -msgstr "tsawon layi" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.role" +msgstr "matsayi" -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.code" -msgstr "lamba" +msgid "labels.save" +msgstr "ajiye" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.top" -msgstr "sama" +msgid "labels.search-font" +msgstr "neman font" -msgid "shortcuts.bring-back" -msgstr "tura zuwa baya" +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.send" +msgstr "aika" -msgid "shortcuts.text-align-justify" -msgstr "jera da inganci" +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.sending" +msgstr "aikawa…" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius.single-corners" -msgstr "kwanar da take cin gashin kanta" +#: src/app/main/ui/static.cljs +msgid "labels.service-unavailable.desc-message" +msgstr "mu na cikin kula a tsarinka." -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.unexpected-token" -msgstr "tukuicin da ba a san da shi ba" +#: src/app/main/ui/static.cljs +msgid "labels.service-unavailable.main-message" +msgstr "ba sabis" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.dotted" -msgstr "digo digo" +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.settings" +msgstr "gyara" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-artboard-names" -msgstr "Boye allom suna" +msgid "labels.share-prototype" +msgstr "tura manhajar rubutu" -msgid "dashboard.export.options.merge.message" -msgstr "" -"za ka iya fitar da kundi tare da haxe muhimman abubuwa, na waje a " -"kunditaskira." +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.shared-libraries" +msgstr "taskoki" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.backward" -msgstr "tura zuwa baya" +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-all-comments" +msgstr "fito da yabo" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-ldap-submit" -msgstr "LDAP" +msgid "labels.show-comments-list" +msgstr "jerin ire-iren yabo" -msgid "onboarding-v2.newsletter.privacy2" -msgstr "" -"za mu aika maka da imel mai amfani. za ka iya biya a kowane lokaci za ka iya " -"ta kowace hanyar biyanmu." +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-your-comments" +msgstr "bayyana na ka ra’ayin" #: src/app/main/ui/dashboard/team.cljs -msgid "labels.copy-invitation-link" -msgstr "kwafar hanya" +msgid "labels.status" +msgstr "daraja" -#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.rename" -msgstr "sake suna" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.tutorials" +msgstr "koyarwa" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.select-a-shape" -msgstr "zabi surar allo, ko rukuni ta hadu da daya allon." +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.unpublish-multi-files" +msgstr "kundayen da ba a wallafa ba %s" -msgid "onboarding.newsletter.accept" -msgstr "haka, za a biya" +#: src/app/main/ui/settings/profile.cljs +msgid "labels.update" +msgstr "sabunta" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke" -msgstr "gigciye" +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.update-team" +msgstr "sabunta tawaga" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.leftright" -msgstr "hagu & dama" +msgid "labels.upload" +msgstr "xorawa" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-rules" -msgstr "Nuna ma'auni" +msgid "labels.upload-custom-fonts" +msgstr "Upload custom fonts" -msgid "shortcuts.toggle-focus-mode" -msgstr "Danna yanayin maida hankali" +msgid "labels.uploading" +msgstr "ana dorawa…" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "workspace.options.export" -msgstr "fitarwa" +msgid "labels.view-only" +msgstr "gani kaxai" -msgid "workspace.layout_grid.editor.title" -msgstr "tace akwati" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.viewer" +msgstr "ma su kallo" -msgid "workspace.undo.entry.single.page" -msgstr "shafi" +msgid "labels.webhooks" +msgstr "Webhooks" -msgid "dashboard.export.explain" -msgstr "za ka iya fitar da kundi daya ko fiye ta hanyar tura taska. \"me \"*?" +#: src/app/main/ui/comments.cljs +msgid "labels.write-new-comment" +msgstr "rubuta s abon yabo" -msgid "shortcuts.open-interactions" -msgstr "tafi sashin da masu kallo suke hulda" +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.you" +msgstr "(kai)" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-multi-confirm.message" -msgstr "ka tabbata kana son goge %s kundaye?" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.your-account" +msgstr "fagenka" -#: src/app/main/ui/dashboard/team.cljs -msgid "team.webhooks.max-length" -msgstr "Sunan shafin yanar gizon zai kunshi a mafi yawa haruffa 2048." +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "media.loading" +msgstr "xora hoto …" -msgid "shortcuts.show-pixel-grid" -msgstr "nuna / boye akwatin pixel" +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"xakin ba komai. wurin ajiyar tawaga, turken da ka yi za ya yi aiki a sauran " +"kundaye. ka tabbata kai ne ka ke son wallafa shi?" -msgid "modals.delete-font.title" -msgstr "goge font" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.accept" +msgstr "qara yin wurin ajiyar tawaga" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-oidc-submit" -msgstr "shaidar buxewa" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.hint" +msgstr "" +"idan ka aje a wurin ajiyar tawaga, turken kundin xakin ajiyar za ya kasance " +"za a iya amfani da shi a sauran kundaye." -msgid "inspect.attributes.typography.text-decoration.underline" -msgstr "jan layi" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.message" +msgstr "qara “%s” xakin ajiya" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "gama aiki kan %s" +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.big-nudge" +msgstr "jan hankali" -#, markdown -msgid "dashboard.fonts.hero-text2" +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.confirm-email" +msgstr "tantance sabon imel" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.info" msgstr "" -"za ka iya xora fonts dinka ne domin ka sami dammar amfani da fenfot. gano " -"akwai qarin abubuwan das u ka dace da dokokin fpntaiki](https://fenfot.app/" -"dokoki.html). Za ka so bayani game da[ffonts](https://www.rubutu.com/faq)." +"za mu aika maka da imel ta wannan imel xin “%s” domin tantance " +"shaidarka." -msgid "workspace.sidebar.layers.images" -msgstr "hoto" +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.new-email" +msgstr "sabon imel" -msgid "dashboard.webhooks.content-type" -msgstr "irin ra'ayi" +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.submit" +msgstr "sake imel" -msgid "workspace.header.menu.show-pixel-grid" -msgstr "Nuna akwatin pixel" +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.title" +msgstr "sake imel xinka" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.copy-token" +msgstr "kwafar kyauta" #: src/app/main/ui/settings/access-tokens.cljs msgid "modals.create-access-token.expiration-date.label" msgstr "lokacin daina aiki" -msgid "shortcuts.h-distribute" -msgstr "raba ta tsaye" - -msgid "workspace.header.menu.undo" -msgstr "Cire" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "fiye da 50" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "suna" -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.show-interactions-on-click" -msgstr "Nuna hulda da an danna" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.placeholder" +msgstr "sunan zai iya taimakawa wajen sanin menene alama" -#: src/app/main/ui/workspace/colorpicker/libraries.cljs, src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.file-library" -msgstr "F" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "yi sabuwar alama" -msgid "dashboard.export-multi" -msgstr "fitar da fenfot %s kundaye" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "samar da alamar shiga" -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.email-already-validated" -msgstr "an farfaxo da imel." +msgid "modals.create-webhook.submit-label" +msgstr "qirqirar webhook" -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-weight" -msgstr "kaurin salon" +msgid "modals.create-webhook.title" +msgstr "qirqirar webhook" -msgid "shortcuts.artboard-selection" -msgstr "kirkiri allo daga zabi" +msgid "modals.create-webhook.url.label" +msgstr "farashin URL" -#: src/app/main/ui/dashboard/grid.cljs -msgid "dashboard.show-all-files" -msgstr "duk kundaye" +msgid "modals.create-webhook.url.placeholder" +msgstr "https://misali.com/postreceive" -msgid "errors.team-leave.owner-cant-leave" -msgstr "mai abu ba ya barin tawaga, dole adubi matsayin mai abu." +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "goge alama" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.left" -msgstr "Hagu" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.message" +msgstr "ka tabbata kana son goge wannan alamar?" -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.select-ui-language" -msgstr "zavavven harshen UI" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "goge alama" -msgid "workspace.undo.entry.single.color" -msgstr "kalar kadara" +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.cancel" +msgstr "ajiye asusu da soke shi" -#: src/app/main/data/workspace.cljs -msgid "errors.clipboard-not-implemented" -msgstr "manhajar binciken nan ba ta iya yin wannan aikin" +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.confirm" +msgstr "haka, goge asusu" -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-not-empty" -msgstr "dole lambar tsaro ta qunshi wasu alamomi, sannan tazara." +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.info" +msgstr "idan ka cire asusunka za ka iya rasa aikin da ka kammala." -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.line-height" -msgstr "tsahon layi" +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.title" +msgstr "ka tabbata ka na son goge asusunka?" -#: src/app/main/ui/confirm.cljs, src/app/main/ui/confirm.cljs -msgid "ds.confirm-title" -msgstr "ka tabbata?" +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.accept" +msgstr "goge fira" -msgid "labels.search-font" -msgstr "neman font" +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.message" +msgstr "ka tabbata ka na son goge fira? duk sharhi a nan za a goge matsaloli." -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.ungroup" -msgstr "raba rukunin" +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.title" +msgstr "goge tattaunawa" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "na gaba" +msgid "modals.delete-component-annotation.message" +msgstr "ka tabbata kana son goge wannan bayanin?" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-auto-height" -msgstr "sarrafaffan tsaho" +msgid "modals.delete-component-annotation.title" +msgstr "goge bayani" -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.profile" -msgstr "kundi" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.accept" +msgstr "goge kundi" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "bayyana yawan tawagarka?" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.message" +msgstr "ka tabbata kana son goge wannan kundin?" -msgid "workspace.focus.focus-on" -msgstr "maida hankali" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.title" +msgstr "goge kundi" -msgid "inspect.tabs.code.selected.frame" -msgstr "hukuma" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.accept" +msgstr "goge kundaye" -msgid "viewer.header.comments-section" -msgstr "Bayyana ra'ayi(%s)" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.message" +msgstr "ka tabbata kana son goge %s kundaye?" -msgid "labels.webhooks" -msgstr "Webhooks" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.title" +msgstr "gogewa %s kundaye" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.unlock" -msgstr "bude" +msgid "modals.delete-font-variant.message" +msgstr "" +"ka tabbata kana son goge wannan salon font din? ba zai xoru ba idan an yi " +"amfani da shi a kundi." -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-bottom-right" -msgstr "kasan dama" +msgid "modals.delete-font-variant.title" +msgstr "goge salon font" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay" -msgstr "bude mai rufi" +msgid "modals.delete-font.message" +msgstr "" +"ka tabbata kana son goge wannan font xin ? ba zai yi aiki ba idan an yi " +"amfani da shi a kundi." -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-dissolve" -msgstr "narkewa" +msgid "modals.delete-font.title" +msgstr "goge font" -msgid "onboarding-v2.newsletter.news" -msgstr "aiko man da bayanin fenfot (rubutun blog, bidiyon koyarwa, kallo...)." +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.body" +msgstr "ka tabbata kana son goge wannan shafin?" -msgid "common.unpublish" -msgstr "maras wallafa" +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.title" +msgstr "goge shafi" -msgid "workspace.undo.entry.single.rect" -msgstr "rectangle" +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.accept" +msgstr "goge aiki" -msgid "shortcuts.toggle-visibility" -msgstr "Nuna/boye" +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.message" +msgstr "ka tabbata kana son goge wannan aikin?" -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.settings" -msgstr "gyara" +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.title" +msgstr "goge aikin" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-full-screen" -msgstr "Cika allon" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.accept" +msgid_plural "modals.delete-shared-confirm.accept" +msgstr[0] "goge kundi" +msgstr[1] "goge kundaye" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.cut" -msgstr "cire" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "ba zai yi aiki a kowane kundi ba." +msgstr[1] "ba za su yi aiki a kowane kundi ba." -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "... jagora, yawan amfani da shiga, leqe-leqe, dss." +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.scd-message" +msgid_plural "modals.delete-shared-confirm.activated.scd-message" +msgstr[0] "za a iya buxe wannan taskirar a nan: " +msgstr[1] "za a iya buxe taskirorin nan a nan: " -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-60-days" -msgstr "kwanaki 60" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.message" +msgid_plural "modals.delete-shared-confirm.message" +msgstr[0] "ka tabbata kana son goge wannan kundin?" +msgstr[1] "ka tabbata kana son goge waxannan kundayen?" -msgid "shortcut-section.viewer" -msgstr "Dankallo" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.title" +msgid_plural "modals.delete-shared-confirm.title" +msgstr[0] "goge kundi" +msgstr[1] "goge kundaye" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.unpublish-multi-files" -msgstr "kundayen da ba a wallafa ba %s" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.accept" +msgstr "goge tawaga" -msgid "common.share-link.confirm-deletion-link-description" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.message" msgstr "" -"ka tabbata ka na son rufe wannan hanyar? idan ka rufe ba mai iya sake bi" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.accept" -msgstr "goge aiki" +"ka tabbata kana son goge wannan tawagar? Duk aiyukanka na kundayen da suka " +"danganci tawagar za su yi gogewar dindindin." -#: src/app/main/ui/settings/password.cljs -msgid "generic.error" -msgstr "afkuwar matsala" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.title" +msgstr "gogewar tawaga" -msgid "workspace.header.menu.disable-scale-content" -msgstr "kashe sikelin rabo" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.accept" +msgstr "goge memba" -msgid "dashboard.export.options.detach.title" -msgstr "lura da bayanan da ke cikin manhajar tura kundi" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.message" +msgstr "ka tabbata kana son cire wannan memban a wannan tawaar?" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-object-slow" -msgstr "Fitarwa ba tsammani ta sami tsaiko" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.title" +msgstr "cire memban tawaga" -#: src/app/main/ui/workspace/header.cljs -msgid "dashboard.export-shapes" -msgstr "Fitarwa" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "" +"duk aikin da aka yi a wannan kundin, nan za a same shi (ba zanen da za a " +"iya tsinkawa)." +msgstr[1] "" +"duk aikin da aka yi a waxancan kundayen, can za a same su (ba zane da za " +"iya tsinkawa)." -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.lock" -msgstr "kulle" +msgid "modals.delete-webhook.accept" +msgstr "goge webhook" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.help-center" -msgstr "sashen taimako" +msgid "modals.delete-webhook.message" +msgstr "ka tabbata ka na son goge webhook?" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.modify" -msgstr "gyaggyarawa %s" +msgid "modals.delete-webhook.title" +msgstr "gogewa webhook" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "da yawa" +msgid "modals.edit-webhook.submit-label" +msgstr "gyara webhook" -msgid "dashboard.download-binary-file" -msgstr "sauke manhajar fenfot(.manhajar fenfot)" +msgid "modals.edit-webhook.title" +msgstr "gyara webhook" -msgid "dashboard.fonts.deleted-placeholder" -msgstr "rashin font" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-member-confirm.accept" +msgstr "aika saqon" -msgid "shortcuts.opacity-6" -msgstr "Saita dishi dishi zuwa kashi 60" +msgid "modals.invite-member.emails" +msgstr "imel, rabawar waqafi" -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.hex" -msgstr "HEX" +msgid "modals.invite-member.repeated-invitation" +msgstr "" +"waxansu imel daga membobin qungiyar na yanzu. ba za a aikawa da gayyatarsu " +"ba ." #: src/app/main/ui/dashboard/team.cljs -msgid "labels.expired-invitation" -msgstr "daina aiki" +msgid "modals.invite-team-member.title" +msgstr "gayyato membobi zuwa ga tawaga" -msgid "onboarding.team-modal.create-team-desc" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.hint" msgstr "" -"tawaga na ba ka damar haduwa da masu amfani da fenfot domin yi aiki daya " -"akan kundaye." +"ka tabbata memban tawaga kaxai, za ya iya goge tawaga tare da aikinta da " +"kundaye." -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.email-has-permanent-bounces" -msgstr "imel «%s» na da bayanan matsaloli na dindindin." +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.message" +msgstr "ka tabbata ka na son fita daga %s tawaga?" -msgid "errors.webhooks.unexpected-status" -msgstr "matsayin da ba zato %s" +msgid "modals.leave-and-reassign.forbidden" +msgstr "" +"ba za ku iya bari ba idan ba wani memba da zai ingata wa mai shi. ku na iya " +"goge tawaga." -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.typography" -msgstr "%s Rubutun rubutu" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.hint1" +msgstr "" +"kai ne mai wannan tawagar. zabi wani memba da za ya iya inganta wa mai shi " +"kafin ka fita." -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.your-email" -msgstr "imel" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.promote-and-leave" +msgstr "inganta sannan ka bari" -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.title" -msgstr "goge tattaunawa" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.select-member-to-promote" +msgstr "zavi memba domin havakawa" -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.big-nudge" -msgstr "jan hankali" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.title" +msgstr "kafin ka fita" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.accept" +msgstr "barin tawaga" #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.leave-confirm.message" msgstr "ka tabbata ka na son barin wannan tawagar?" -msgid "dashboard.webhooks.empty.no-webhooks" -msgstr "ba a gina wani webhooks ba." - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.invite-team-member.title" -msgstr "gayyato membobi zuwa ga tawaga" - -msgid "shortcut-section.workspace" -msgstr "fagen aiki" - #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.leave-confirm.title" msgstr "barin tawaga" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "fara" +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.nudge-title" +msgstr "adadin jan hankali" #: src/app/main/ui/dashboard/team.cljs -msgid "labels.resend-invitation" -msgstr "sake aika saqon gayyata" +msgid "modals.promote-owner-confirm.accept" +msgstr "canza wurin mallaka" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.difference" -msgstr "banbanci" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.hint" +msgstr "" +"idan ka canza wurin mallaka, ba za ka iya sauya matsayin shugaba ba, " +"gazawar wasu dokokin wannan tawaagar. " -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.hide-resolved-comments" -msgstr "voye saqon da aka buxa" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.message" +msgstr "kai ke da wannan tawagar yanzu. ka tabbata kana son yin %s sabon mai tawaga?" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin-all" -msgstr "gefen duka" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.title" +msgstr "mallakar tawaga" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.github-repo" -msgstr "taskar rubuce-rubuce" +msgid "modals.publish-empty-library.accept" +msgstr "wallafa" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.strikethrough" -msgstr "gigciye ta cikinsa (%s)" +msgid "modals.publish-empty-library.message" +msgstr "ba komai a taskarka. ka na son wallafa ta?" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.darken" -msgstr "kara masa duhu" +msgid "modals.publish-empty-library.title" +msgstr "wallafa taska maras komai" -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.confirm-password" -msgstr "tabbatar da kalmar buxewa" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.accept" +msgstr "cire taskar shiye-shirye" -msgid "shortcuts.open-workspace" -msgstr "tafi fagen aiki" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.hint" +msgstr "" +"idan ba ka cire taskar shirye-shirye ba, kundin taskar na wannan kundin zai " +"tsaya kasancewar za ka iya amfani da shi a cikin kundayenka." -msgid "labels.and" -msgstr "da" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.message" +msgstr "cire “%s” a taskar shirye-shirye" -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.top" -msgstr "sama" +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.small-nudge" +msgstr "qaramin jan hankali" -msgid "shortcut-subsection.main-menu" -msgstr "Babbar kumshiya" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.accept" +msgid_plural "modals.unpublish-shared-confirm.accept" +msgstr[0] "maras wallafa" +msgstr[1] "maras wallafa" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.message" +msgid_plural "modals.unpublish-shared-confirm.message" +msgstr[0] "ka tabbata ka na son rufe taskar nan?" +msgstr[1] "ka tabbata ka na son rufe taskokin nan?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.title" +msgid_plural "modals.unpublish-shared-confirm.title" +msgstr[0] "rufe taska" +msgstr[1] "rufe taskoki" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.hint" +msgstr "" +"ka kusa sabunta taskar ajiyar shir-shirye. zai iya shafar sauran kundayen " +"da ke amfani da ita." + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.accept" +msgstr "sabunta" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.cancel" +msgstr "soke" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.hint" +msgstr "" +"ka kusa sabunta sashe a babbar taska. wannan za ya iya aiki a sauran " +"kundayen da ke amfani da ita." -#: src/app/main/ui/auth/register.cljs -msgid "auth.fullname" -msgstr "cikakken suna" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.message" +msgstr "sabunta sashe a babbar taska" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.reset-overrides" -msgstr "sake saita sokewa" +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "akwai sabon yayi, fatan za a sabunta fage" -msgid "common.share-link.permissions-hint" -msgstr "duk wanda ya mallaki mataki,za ya iya shiga" +#: src/app/main/ui/dashboard/team.cljs +msgid "notifications.invitation-email-sent" +msgstr "an aika da saqon" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.accept" -msgstr "cire taskar shiye-shirye" +#: src/app/main/ui/dashboard/team.cljs +msgid "notifications.invitation-link-copied" +msgstr "kwafar hanyar gayya" -msgid "workspace.undo.entry.multiple.typography" -msgstr "rubutun rubuta kadara" +#: src/app/main/ui/settings/delete_account.cljs +msgid "notifications.profile-deletion-not-allowed" +msgstr "ba za ka iya goge kundin ba. ka jira umarnin tawaga ka fin ka ci gaba." -msgid "shortcuts.align-center" -msgstr "tsarin tsakiya" +#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs +msgid "notifications.profile-saved" +msgstr "an ajiye bayanai!" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-center" -msgstr "jerin tsakiya (%s)" +#: src/app/main/ui/settings/change_email.cljs +msgid "notifications.validation-email-sent" +msgstr "an aika da imel din tantancewa %s. bincika imel xinka!" -msgid "dashboard.webhooks.description" +msgid "onboarding-v2.before-start.desc1" msgstr "" -"Webhooks hanyar sanar da manhajoji da addireshi intanet idan wani ya faru a " -"Penpot. za a tura maka da saqon talla URLs ka samar da." - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.text-palette" -msgstr "rubutub rubutu (%s)" +"ya kamata kasan akwai kayayyaki da yawa da za su iya taimaka maka ka sami " +"damar fara aiki da fenfot, kamar jagoran mai amfani tasharmu ta youtub." -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.titlecase" -msgstr "yanayin lakani" +msgid "onboarding-v2.before-start.desc2" +msgstr "" +"cikakken bayanin yadda za a yi amfani da fenfot. daga rubutu zuwa tsara ko " +"rarraba iri." -msgid "workspace.sidebar.layers.frames" -msgstr "allo" +msgid "onboarding-v2.before-start.desc2.title" +msgstr "xanjagora" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fit" -msgstr "dace - ja sikeli ya dace da shi" +msgid "onboarding-v2.before-start.desc3" +msgstr "za ka iya kallon koyarwarmu da mutanenmu ke yi." -#: src/app/main/ui/dashboard/files.cljs -msgid "title.dashboard.files" -msgstr "%s - Tukunyar aje biro" +msgid "onboarding-v2.before-start.desc3.title" +msgstr "koyarwa ta hoto mai motsi" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-object-error" -msgstr "An gaza fitarwa" +msgid "onboarding-v2.before-start.title" +msgstr "kafin ka fara" -#: src/app/main/ui/alert.cljs -msgid "ds.alert-ok" -msgstr "haka" +msgid "onboarding-v2.newsletter.desc" +msgstr "" +"domin jin daxin fenfot , sai ka biya kuxi domin labarai da ci gaban da ake " +"samu." -msgid "shortcuts.escape" -msgstr "kubuta" +msgid "onboarding-v2.newsletter.news" +msgstr "aiko man da bayanin fenfot (rubutun blog, bidiyon koyarwa, kallo...)." -msgid "shortcuts.copy" -msgstr "kwafi" +msgid "onboarding-v2.newsletter.privacy1" +msgstr "mu na kula da sirri, a nan za ka karanta na mu " -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.hsv" -msgstr "HSV" +msgid "onboarding-v2.newsletter.privacy2" +msgstr "" +"za mu aika maka da imel mai amfani. za ka iya biya a kowane lokaci za ka " +"iya ta kowace hanyar biyanmu." -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.delete-flow-start" -msgstr "goge kwararar farko" +msgid "onboarding-v2.newsletter.updates" +msgstr "aiko man da sabbin abubuwan da aka yi (sabbib fasali, fitowa, gyara...)." -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-left" -msgstr "kasa hagu" +msgid "onboarding-v2.welcome.desc1" +msgstr "" +"fenfot ne ke yin kelaidos kamar yadda mutane ke yi, mutane na taimakon " +"junansu. kowa za ya iya hada hannu da:" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "mai daraja" +msgid "onboarding-v2.welcome.desc2" +msgstr "" +"wurin da kowa zai iya koyo, fahimtar ta juna a kan fenfot, kasancewarta " +"manyan tawagar fenfot da sauran mutane." -msgid "dashboard.export.detail" -msgstr "*akwai sassan,hotuna,launuka,da/kozane-zane." +msgid "onboarding-v2.welcome.desc2.title" +msgstr "hulxa da kai cikin mutane" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.hint" +msgid "onboarding-v2.welcome.desc3" msgstr "" -"idan ka aje a wurin ajiyar tawaga, turken kundin xakin ajiyar za ya kasance " -"za a iya amfani da shi a sauran kundaye." +"wurin da za ka san yadda za ka hada-hannu da fassara, neman fasali, manyan " +"gudunmawa, magance matsala…" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-offset-effect" -msgstr "cire tasiri" +msgid "onboarding-v2.welcome.desc3.title" +msgstr "gudunmawar jagora" -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to" -msgstr "tura a" +msgid "onboarding-v2.welcome.title" +msgstr "barka da zuwa fenfot!" -msgid "modals.create-webhook.title" -msgstr "qirqirar webhook" +msgid "onboarding.choice.team-up.create-team-desc" +msgstr "bayan ka yi wa tawagarka suna, za ka iya gaiyato mutane ku hadu." -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.rgba" -msgstr "RGBA" +msgid "onboarding.choice.team-up.create-team-placeholder" +msgstr "sanya sunan tawaga" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.mixed" -msgstr "gauraya" +msgid "onboarding.choice.team-up.invite-members" +msgstr "gayyato mambobi" -msgid "shortcuts.detach-component" -msgstr "rarraba abubuwan da su ke a ware" +msgid "onboarding.choice.team-up.invite-members-info" +msgstr "" +"ka tuna da kowa. masu qirqira, masu tsarawa, shuwagabanniS... daban-daban " +"ya qara :)" -msgid "shortcuts.reset-zoom" -msgstr "zake zukowa" +msgid "onboarding.choice.team-up.roles" +msgstr "gayyata tare da bayar da matsayi:" -msgid "onboarding-v2.welcome.desc3" +msgid "onboarding.newsletter.accept" +msgstr "haka, za a biya" + +msgid "onboarding.newsletter.acceptance-message" msgstr "" -"wurin da za ka san yadda za ka hada-hannu da fassara, neman fasali, manyan " -"gudunmawa, magance matsala…" +"an aika maka da saqon buqatar biya, za mu aika maka da saqon imel tabbatar " +"da shi." -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.hright" -msgstr "Daidaita dama (%s)" +msgid "onboarding.newsletter.policy" +msgstr "dokoki." -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.status" -msgstr "daraja" +msgid "onboarding.newsletter.title" +msgstr "ka buqatar labaran fenfot?" -msgid "common.share-link.permissions-can-comment" -msgstr "sharhi" +msgid "onboarding.team-modal.create-team" +msgstr "yin tawaga" -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgba" -msgstr "RGBA" +msgid "onboarding.team-modal.create-team-desc" +msgstr "" +"tawaga na ba ka damar haduwa da masu amfani da fenfot domin yi aiki daya " +"akan kundaye." -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row" -msgstr "jerawa" +msgid "onboarding.team-modal.create-team-feature-1" +msgstr "aiyuka da kundaye da yawa" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to" -msgstr "kewayawa zuwa" +msgid "onboarding.team-modal.create-team-feature-2" +msgstr "ma su yin shiri dayawa lokaci xaya" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "ya kake tunanin aiki da fenfot?" +msgid "onboarding.team-modal.create-team-feature-3" +msgstr "aiyukan shugaba" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.inner" -msgstr "ciki" +msgid "onboarding.team-modal.create-team-feature-4" +msgstr "Unlimited members" -msgid "onboarding-v2.before-start.desc1" -msgstr "" -"ya kamata kasan akwai kayayyaki da yawa da za su iya taimaka maka ka sami " -"damar fara aiki da fenfot, kamar jagoran mai amfani tasharmu ta youtub." +msgid "onboarding.team-modal.create-team-feature-5" +msgstr "100% kyauta!" -msgid "shortcut-subsection.general-viewer" -msgstr "gamayya" +msgid "onboarding.templates.subtitle" +msgstr "ga wasu hotunan talla nan." -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-members" -msgstr "mambobin tawaga" +msgid "onboarding.templates.title" +msgstr "fara tsarawa" -#: src/app/main/data/dashboard.cljs -msgid "dashboard.new-file-prefix" -msgstr "sabon kundi" +msgid "onboarding.welcome.alt" +msgstr "fenfot" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-expire" -msgstr "lambar tsaron za ta gama aiki %s" +#: src/app/main/ui/auth/recovery.cljs +msgid "profile.recovery.go-to-login" +msgstr "je ka hanyar shiga" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.underline" -msgstr "ja layi (%s)" +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "wane kayan zane ka fi iya aiki da shi?" -msgid "onboarding.choice.team-up.create-team-desc" -msgstr "bayan ka yi wa tawagarka suna, za ka iya gaiyato mutane ku hadu." +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to" -msgstr "" -"za ka iya daidaita kayan zanenka ta hanyar (amfani da madannin qasa sashen " -"dama)." +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.accept" -msgstr "goge fira" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.success-duplicate-project" -msgstr "an kwafi aikinka" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "da yawa" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.cancel" -msgstr "sokewa" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay-dest" -msgstr "kulle mai rufi %s" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canva" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.accept" -msgstr "goge alama" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "ta ya za ka bayyana kwarewarka akai..." -#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.your-penpot" -msgstr "fenfot na ka" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "ma su tsarawa" -msgid "shortcuts.bring-forward" -msgstr "tura gaba" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "ma su qirqira" -msgid "workspace.header.menu.redo" -msgstr "sake" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "qara samun bayanin fenfot" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.detach-instance" -msgstr "raba yanayin abin" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" -msgid "shortcuts.opacity-9" -msgstr "Seta dish dishi zuwa 90" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "mawallafi/VP" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-right" -msgstr "jera dama (%s)" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "ni mai zaman kansa ne" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-textpalette" -msgstr "Nuna launukan tsarin rubutu" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "sami lambar kowane aiki " -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flip-horizontal" -msgstr "kifa ta tsaye" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... zane-zane, kayan kallo, tsarin qira, etc." -msgid "labels.continue" -msgstr "ci gaba" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "teburin aiki" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.hard-light" -msgstr "Haske mai muya" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "barin aikin tawaga" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-max-w" -msgstr "fadi mafi yawa" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "za mu fara!" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.management" -msgstr "shuwagabannin tawaga" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "shugaban aiki" -msgid "inspect.tabs.code.selected.component" -msgstr "bangare" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "kasuwanci" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column-reverse" -msgstr "sake shafi" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "fiye da 50" -msgid "dashboard.download-standard-file" -msgstr "sauke cikakken kundi(.svg + .json)" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "na gaba" -#: src/app/main/ui/static.cljs -msgid "labels.internal-error.desc-message" -msgstr "" -"an sami matsala. sake gwadawa idan matsalar ba ta kauce ba, tuntubi sashen " -"taimako." +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "babu" -msgid "labels.font-variants" -msgstr "salo" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "idan akwai qari (bayyana)" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.title" -msgstr "kafin ka fita" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "ina aikin kaina" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.front" -msgstr "kawo zuwa gaba" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "can baya" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-center" -msgstr "tsakiya" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "ya kake tunanin aiki da fenfot?" -#: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "errors.unexpected-error" -msgstr "afkuwar kuskuren da ba a zata ba." +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "mi ne ne matsayinka?" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.no-shared-libraries-available" -msgstr "Babu rababbun ma'adanai wanda aka samu" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "dauki wanda kake so" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.square" -msgstr "murabba'i" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "zana" -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.fullscreen" -msgstr "Cika fuskar" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "wasu" -msgid "workspace.undo.entry.single.multiple" -msgstr "wani abu" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "fara" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.role" -msgstr "matsayi" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "fara aiki na" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.add-interaction" -msgstr "Danna wannan madannin + domin saka hulda." +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "malami ko dalibi" -msgid "workspace.shape.menu.difference" -msgstr "bambanci" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "bayyana yawan tawagarka?" -msgid "workspace.assets.duplicate-main" -msgstr "maimaita ainihin" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "jaraba fenfot ka ga ko ta yi daidai da tawaga " -msgid "shortcuts.fit-all" -msgstr "fitar da abubuwan da zai dace da ko wane abu" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "jaraba kafin ka yi aiki da fenfot" -msgid "workspace.undo.entry.multiple.path" -msgstr "hanya" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "... jagora, yawan amfani da shiga, leqe-leqe, dss." -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-right" -msgstr "kasa dama" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "yin aikin kan tunani mai kyau" -#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.duplicate" -msgstr "maimaita" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"bayaninka za ya sanya mu fahimci kwarewarka da xabi'unka ta haka ne za mu " +"mayar maka da fenfot kayan aikin da ka ke jin daxin aiki da shi." -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show-main" -msgstr "nuna ainihin wurin" +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "cire" -msgid "onboarding-v2.before-start.desc2.title" -msgstr "xanjagora" +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "settings.multiple" +msgstr "gauraya" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "ta ya za ka bayyana kwarewarka akai..." +# SECTIONS +msgid "shortcut-section.basics" +msgstr "shikashikai" -msgid "shortcut-subsection.zoom-viewer" -msgstr "Zukowa" +msgid "shortcut-section.dashboard" +msgstr "allon kallo" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.remove-shared" -msgstr "cire matattarar kundate" +msgid "shortcut-section.viewer" +msgstr "Dankallo" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "dauki wanda kake so" +msgid "shortcut-section.workspace" +msgstr "fagen aiki" -msgid "shortcuts.v-distribute" -msgstr "Rarraba ta tsaye" +# SUBSECTIONS +msgid "shortcut-subsection.alignment" +msgstr "kwaskwarima" -msgid "common.share-link.page-shared" -msgid_plural "common.share-link.page-shared" -msgstr[0] "tura shafi 1" -msgstr[1] "%s an tura shafi" +msgid "shortcut-subsection.edit" +msgstr "Tace" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.grid-title" -msgstr "Akwati" +msgid "shortcut-subsection.general-dashboard" +msgstr "gamayya" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.offsetx" -msgstr "X" +msgid "shortcut-subsection.general-viewer" +msgstr "gamayya" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.twitter-go-to" -msgstr "je ka tiwita" +msgid "shortcut-subsection.main-menu" +msgstr "Babbar kumshiya" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.none" -msgstr "ba komai" +msgid "shortcut-subsection.modify-layers" +msgstr "gyara shimfida" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.exclusion" -msgstr "warewa" +msgid "shortcut-subsection.navigation-dashboard" +msgstr "shawagi" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.title" -msgstr "labari" +msgid "shortcut-subsection.navigation-viewer" +msgstr "shawagi" -msgid "workspace.options.recent-fonts" -msgstr "da dimi dimi" +msgid "shortcut-subsection.navigation-workspace" +msgstr "shawagi" -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.new-email" -msgstr "sabon imel" +msgid "shortcut-subsection.panels" +msgstr "allon sarrarfav naura" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.search-shared-libraries" -msgstr "Duba rabbaun ma'adanai" +msgid "shortcut-subsection.path-editor" +msgstr "Hanya" -msgid "shortcuts.text-align-left" -msgstr "jera hagu" +msgid "shortcut-subsection.shape" +msgstr "Siffa" -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-subtitle" -msgstr "kyauta ne,an buxe hanyar samu" +msgid "shortcut-subsection.text-editor" +msgstr "Rubutu" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-textpalette" -msgstr "boye launukan yanayin tsarin rubutu" +msgid "shortcut-subsection.tools" +msgstr "Kayan aiki" -msgid "labels.view-only" -msgstr "gani kaxai" +msgid "shortcut-subsection.zoom-viewer" +msgstr "Zukowa" -msgid "workspace.undo.entry.single.component" -msgstr "bangarori" +msgid "shortcut-subsection.zoom-workspace" +msgstr "Zukowa" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.row" -msgstr "layuka" +msgid "shortcuts.add-comment" +msgstr "Bayyana Ra'ayi" -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.upload-all" -msgstr "xora duka" +msgid "shortcuts.add-node" +msgstr "kara Girma" -msgid "inspect.attributes.typography.text-transform.none" -msgstr "babu" +msgid "shortcuts.align-bottom" +msgstr "tsarin kasa" -msgid "workspace.assets.local-library" -msgstr "dakin karatun gida" +msgid "shortcuts.align-center" +msgstr "tsarin tsakiya" -msgid "shortcuts.move-fast-right" -msgstr "matsa dama da sauri" +msgid "shortcuts.align-hcenter" +msgstr "tsarin tsakiya ko ina" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.unmask" -msgstr "bude takunkumi" +msgid "shortcuts.align-justify" +msgstr "Tabbataccan tsari" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-submit" -msgstr "shiga ciki" +msgid "shortcuts.align-left" +msgstr "tsarin hagu" -msgid "shortcuts.toggle-textpalette" -msgstr "Juya zuwa launukan rubutu" +msgid "shortcuts.align-right" +msgstr "tsarin dama" -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.update-team" -msgstr "sabunta tawaga" +msgid "shortcuts.align-top" +msgstr "tsarin sama" -#: src/app/main/ui/workspace/sidebar/options/page.cljs -msgid "workspace.options.canvas-background" -msgstr "bayan zane" +msgid "shortcuts.align-vcenter" +msgstr "tsarin tsakiya a tsaye" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-top" -msgstr "jerin sama" +msgid "shortcuts.artboard-selection" +msgstr "kirkiri allo daga zabi" -msgid "shortcuts.font-size-dec" -msgstr "rage girman rubutu" +msgid "shortcuts.bold" +msgstr "fito da shi barobaro" -msgid "dashboard.webhooks.empty.add-one" -msgstr "danna qasa \"sanya webhook\" qara xaya." +msgid "shortcuts.bool-difference" +msgstr "ma'auni mabanbanci" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.default-team-name" -msgstr "manhajar fenfot" +msgid "shortcuts.bool-exclude" +msgstr "kebentaccan ma'auni" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-pressing" -msgstr "yayin dannawa" +msgid "shortcuts.bool-intersection" +msgstr "ma'aunin abubuwa daban daban" -msgid "shortcuts.open-dashboard" -msgstr "tafi gaban allon" +msgid "shortcuts.bool-union" +msgstr "ma'auni hadaka" -#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.profile-is-muted" -msgstr "bayananka su na da imel maras motsi (baiyana matsaloli)." +msgid "shortcuts.bring-back" +msgstr "tura zuwa baya" -msgid "shortcuts.start-measure" -msgstr "fara aunawa" +msgid "shortcuts.bring-backward" +msgstr "komawa baya" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.center" -msgstr "Tsakiya" +msgid "shortcuts.bring-forward" +msgstr "tura gaba" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.submit-label" -msgstr "yi sabuwar alama" +msgid "shortcuts.bring-front" +msgstr "kawo zuwa gaba" -msgid "workspace.sidebar.collapse" -msgstr "ruguza a'ajiyar bayani" +msgid "shortcuts.clear-undo" +msgstr "goge sake" -msgid "common.share-link.permissions-can-inspect" -msgstr "iya bincka lamba" +msgid "shortcuts.copy" +msgstr "kwafi" -msgid "workspace.options.height" -msgstr "Tsawo" +msgid "shortcuts.create-component" +msgstr "samar da abubuwa iri- iri" -msgid "shortcuts.draw-ellipse" -msgstr "siffar kwai" +msgid "shortcuts.create-new-project" +msgstr "samar da sabo abu" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "ma su tsarawa" +msgid "shortcuts.cut" +msgstr "cire" -#, markdown -msgid "dashboard.fonts.hero-text1" -msgstr "" -"duk wani adireshi da ka xora a nan dangin font ne a wannan tawagar za a sami " -"kundayen da ke xauke da kayan rubutu. Da fontfont iri daya ne ake kasawa**" -"gwaurayen font**. Za ka iya xora font ta waxannan hanyoyin: **TTF, OTF and " -"WOFF** (xaya kawai ake buqata)." +msgid "shortcuts.decrease-zoom" +msgstr "fito da shi waje" -#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.drafts" -msgstr "adana" +msgid "shortcuts.delete" +msgstr "goge" -#: src/app/main/ui/dashboard/projects.cljs -msgid "title.dashboard.projects" -msgstr "tsare tsare - %s - Mazubin biruka" +msgid "shortcuts.delete-node" +msgstr "fita da ga cikin net wok" -#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs -msgid "labels.retry" -msgstr "sake gwadawa" +msgid "shortcuts.detach-component" +msgstr "rarraba abubuwan da su ke a ware" -msgid "modals.delete-webhook.title" -msgstr "gogewa webhook" +msgid "shortcuts.draw-curve" +msgstr "Ratse" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.update-main" -msgstr "sabunta ainihin wurin" +msgid "shortcuts.draw-ellipse" +msgstr "siffar kwai" -msgid "shortcuts.toggle-rules" -msgstr "Nuna / boye magwaji" +msgid "shortcuts.draw-frame" +msgstr "Allo" + +msgid "shortcuts.draw-nodes" +msgstr "samar da hanya" msgid "shortcuts.draw-path" msgstr "Hanya" -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.code.selected.multiple" -msgstr "%s zavavve" +msgid "shortcuts.draw-rect" +msgstr "Ractangula" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flow-start" -msgstr "fara malala" +msgid "shortcuts.draw-text" +msgstr "rubutaccan sako" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "babu" +msgid "shortcuts.duplicate" +msgstr "maimaita" -msgid "inspect.attributes.typography.text-transform.titlecase" -msgstr "yadda ake rubuta batu" +msgid "shortcuts.escape" +msgstr "kubuta" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "za mu fara!" +msgid "shortcuts.export-shapes" +msgstr "samar da sabbabbin abubuwa" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.remove-flex" -msgstr "cire sassaukan tsari" +msgid "shortcuts.fit-all" +msgstr "fitar da abubuwan da zai dace da ko wane abu" -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "modals.delete-page.body" -msgstr "ka tabbata kana son goge wannan shafin?" +msgid "shortcuts.flip-horizontal" +msgstr "kifa shi dai dai" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow-start" -msgstr "Gudun farko" +msgid "shortcuts.flip-vertical" +msgstr "kifa ta tsaye" -msgid "shortcuts.move" -msgstr "matsa" +msgid "shortcuts.font-size-dec" +msgstr "rage girman rubutu" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.message" -msgstr "ka tabbata kana son goge wannan kundin?" +msgid "shortcuts.font-size-inc" +msgstr "kara gaban yanayi" -msgid "shortcuts.opacity-3" -msgstr "Seta dashi dashi zuwa kashi 50" +msgid "shortcuts.go-to-drafts" +msgstr "ta fi rumbu" -msgid "common.share-link.team-members" -msgstr "memba kaxai" +msgid "shortcuts.go-to-libs" +msgstr "ta fi zuwa rabbabben ma'ajiya" -msgid "workspace.sidebar.layers.components" -msgstr "bangare" +msgid "shortcuts.go-to-search" +msgstr "gajeran sako" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease" -msgstr "sauki" +msgid "shortcuts.group" +msgstr "rukuni" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.placeholder" -msgstr "sunan zai iya taimakawa wajen sanin menene alama" +msgid "shortcuts.h-distribute" +msgstr "raba ta tsaye" -#: src/app/main/ui/settings/password.cljs -msgid "labels.confirm-password" -msgstr "tabbatar da lambar tsaro" +msgid "shortcuts.hide-ui" +msgstr "fito / boye UI" -#: src/app/main/ui/workspace/sidebar/options/menus/svg_attrs.cljs, src/app/main/ui/inspect/attributes/svg.cljs -msgid "workspace.sidebar.options.svg-attrs.title" -msgstr "shigo da shi SVG halaye" +msgid "shortcuts.increase-zoom" +msgstr "zuko ciki" -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to-link" -msgstr "bayanin yadda ake fitarwa daga fenfot" +msgid "shortcuts.insert-image" +msgstr "sa hoto" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.comments" -msgstr "ra'ayi (%s)" +msgid "shortcuts.italic" +msgstr "juya zuwa kwantaccen rubuyu" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-none" -msgstr "Babu" +msgid "shortcuts.join-nodes" +msgstr "hada abubuwan" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.columns" -msgstr "shafi" +msgid "shortcuts.letter-spacing-dec" +msgstr "rage filin harafin" -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.accept" -msgstr "canza wurin mallaka" +msgid "shortcuts.letter-spacing-inc" +msgstr "kara filin harafin" -msgid "workspace.viewport.click-to-close-path" -msgstr "latsa kusa da hanya" +msgid "shortcuts.line-height-dec" +msgstr "rage tsawon layi" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Adobe XD" +msgid "shortcuts.line-height-inc" +msgstr "kara tsawon layi" -msgid "labels.close" -msgstr "rufewa" +msgid "shortcuts.line-through" +msgstr "danna layin duk" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.lighten" -msgstr "kara masa haske" +msgid "shortcuts.make-corner" +msgstr "kirkiri kwana" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "workspace.options.export-multiple" -msgstr "Fitar da zababbun" +msgid "shortcuts.make-curve" +msgstr "kirkiri lankwasa" -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "cire" +msgid "shortcuts.mask" +msgstr "takunkumi" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.hide" -msgstr "boye" +msgid "shortcuts.merge-nodes" +msgstr "hada da kauri" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "zana" +msgid "shortcuts.move" +msgstr "matsa" -#: src/app/main/ui/settings/change_email.cljs -msgid "errors.email-invalid-confirmation" -msgstr "tabbata imel xinka ya yi daidai" +msgid "shortcuts.move-fast-down" +msgstr "Matsa kasa da sauri" -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.title" -msgstr "Fitar da zavi" +msgid "shortcuts.move-fast-left" +msgstr "Matsa hagu da sauri" -msgid "onboarding-v2.welcome.desc2.title" -msgstr "hulxa da kai cikin mutane" +msgid "shortcuts.move-fast-right" +msgstr "matsa dama da sauri" -msgid "dashboard.import.progress.process-page" -msgstr "fejin kasuwar duniya: %s" +msgid "shortcuts.move-fast-up" +msgstr "Matsa sama da sauri" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.set-default" -msgstr "saita a tsoho" +msgid "shortcuts.move-nodes" +msgstr "matsa a hade" -#: src/app/main/errors.cljs -msgid "errors.feature-mismatch" -msgstr "" -"tamkar ka buxe wani kundi da ke da muhimmanci '%s' bayar da dama qarin da ka " -"yi ma fenfot xinka bai karbu ba ko ba zai yi aiki ba." +msgid "shortcuts.move-unit-down" +msgstr "Matsa da sashin kasa" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.retry" -msgstr "sake" +msgid "shortcuts.move-unit-left" +msgstr "Matsa da sashin hagu" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-palette" -msgstr "nuna launukan kala" +msgid "shortcuts.move-unit-right" +msgstr "Matsa da sashin dama" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-relative-to" -msgstr "alaka zuwa" +msgid "shortcuts.move-unit-up" +msgstr "Matsa da sashin samu" -msgid "errors.webhooks.ssl-validation" -msgstr "kuskure kan farfaxo da SSL." +msgid "shortcuts.next-frame" +msgstr "wani tsari" -msgid "shortcuts.create-component" -msgstr "samar da abubuwa iri- iri" +msgid "shortcuts.not-found" +msgstr "babu gajeriyar hanya" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.update-components-in-bulk" -msgstr "sabunta ainihin wurin" +msgid "shortcuts.opacity-0" +msgstr "Saita dishi dishi zuwa kashi 100" -msgid "auth.terms-privacy-agreement" -msgstr "" -"lokacin qirqirar kundi, sai ka amincewa da yanayi aikin da " -"qa'idojinmuqa'idoji." +msgid "shortcuts.opacity-1" +msgstr "saita dishi dishi zuwa kashi 10" -msgid "modals.delete-font-variant.title" -msgstr "goge salon font" +msgid "shortcuts.opacity-2" +msgstr "Saita dishi dishi zuwa kashi 20" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.sidebar.history" -msgstr "labari (%s)" +msgid "shortcuts.opacity-3" +msgstr "Seta dashi dashi zuwa kashi 50" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.no-libraries-need-sync" -msgstr "Babu rabben ma'adanai da suke bukatar sabuntawa" +msgid "shortcuts.opacity-4" +msgstr "Saita dishi dishi zuwa kashi 40" -#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "workspace.options.blur-options.title" -msgstr "Dishi dishi" +msgid "shortcuts.opacity-5" +msgstr "Saita dishi dishi zuwa kashi 50" -msgid "dashboard.export.options.all.title" -msgstr "fitar da manhajar tura kundi" +msgid "shortcuts.opacity-6" +msgstr "Saita dishi dishi zuwa kashi 60" -msgid "workspace.options.clip-content" -msgstr "Matse abun ciki" +msgid "shortcuts.opacity-7" +msgstr "Saita dishi dishi zuwa kashi 70" -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.editor" -msgstr "maigyara" +msgid "shortcuts.opacity-8" +msgstr "seta dishi dishin zuwa kashi 8o" -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.new-password" -msgstr "sanya sabuwar lambar tsaro" +msgid "shortcuts.opacity-9" +msgstr "Seta dish dishi zuwa 90" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.path" -msgstr "hanya (%s)" +msgid "shortcuts.open-color-picker" +msgstr "abin daukan kala" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius.all-corners" -msgstr "duka kwanar" +msgid "shortcuts.open-comments" +msgstr "tafi inda 'yan kallo za su bayyana ra'ayi" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-right" -msgstr "sama dama" +msgid "shortcuts.open-dashboard" +msgstr "tafi gaban allon" -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.sending" -msgstr "aikawa…" +msgid "shortcuts.open-inspect" +msgstr "tafi sashin da 'yan kallo za su duba" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.select-layer" -msgstr "zabi shimfida" +msgid "shortcuts.open-interactions" +msgstr "tafi sashin da masu kallo suke hulda" -msgid "workspace.undo.entry.single.image" -msgstr "hoto" +msgid "shortcuts.open-viewer" +msgstr "tafi sashin da masu kallo suke hulda" -msgid "workspace.shape.menu.intersection" -msgstr "mahada" +msgid "shortcuts.open-workspace" +msgstr "tafi fagen aiki" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-trigger" -msgstr "Jawo" +msgid "shortcuts.or" +msgstr " ko " -#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/files.cljs -msgid "dashboard.new-file" -msgstr "+ sabon kundi" +msgid "shortcuts.paste" +msgstr "manna" -#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/auth.cljs -msgid "title.default" -msgstr "Mazubin biruka - Tsara yanci ga tawaga" +msgid "shortcuts.prev-frame" +msgstr "allon da ya gabata" -#: src/app/main/ui/alert.cljs -msgid "ds.alert-title" -msgstr "natsu" +msgid "shortcuts.redo" +msgstr "gyara" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.shortcuts" -msgstr "yanke (%s)" +msgid "shortcuts.reset-zoom" +msgstr "zake zukowa" -#: src/app/main/ui/inspect/attributes/shadow.cljs -msgid "inspect.attributes.shadow" -msgstr "inuwa" +msgid "shortcuts.search-placeholder" +msgstr "takaitaccen sako yanken" -msgid "common.share-link.title" -msgstr "fenfot" +msgid "shortcuts.select-all" +msgstr "zabi duka" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding" -msgstr "filla filla" +msgid "shortcuts.select-next" +msgstr "zabi wani shafi" -msgid "shortcuts.toggle-history" -msgstr "Danna tarihi" +msgid "shortcuts.select-parent-layer" +msgstr "zabi ainihin shafi" -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.select-ui-theme" -msgstr "zaven batu" +msgid "shortcuts.select-prev" +msgstr "zabi shafin da ya gabata" -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.duplicate" -msgstr "kwafi" +msgid "shortcuts.separate-nodes" +msgstr "raba kauri" -msgid "title.team-webhooks" -msgstr "gidan yanar gizo - %s - Mazubin biruka" +msgid "shortcuts.show-pixel-grid" +msgstr "nuna / boye akwatin pixel" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library-updates" -msgstr "sabunta ma'adana" +msgid "shortcuts.show-shortcuts" +msgstr "nuna / boye yanken" -#: src/app/main/ui/dashboard/team.cljs -#, markdown -msgid "labels.no-invitations-hint" -msgstr "danna **gayyato mutane** wurin da ake nemo mutane a wannan tawaga." +msgid "shortcuts.snap-nodes" +msgstr "yanke kauri" -msgid "inspect.tabs.code.selected.mask" -msgstr "marfi" +msgid "shortcuts.snap-pixel-grid" +msgstr "yanke zuwa ga akwatin pixel" -msgid "modals.edit-webhook.submit-label" -msgstr "gyara webhook" +msgid "shortcuts.start-editing" +msgstr "fara gyarawa" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.none" -msgstr "babu" +msgid "shortcuts.start-measure" +msgstr "fara aunawa" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-rules" -msgstr "boye ma'auni" +msgid "shortcuts.stop-measure" +msgstr "dena aunawa" -msgid "dashboard.webhooks.create.success" -msgstr "an gina Webhook." +msgid "shortcuts.text-align-center" +msgstr "jera tsakiya" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.go-to-edit" -msgstr "tafi zuwa salon dakin karatu don a tace" +msgid "shortcuts.text-align-justify" +msgstr "jera da inganci" -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.confirm" -msgstr "haka, goge asusu" +msgid "shortcuts.text-align-left" +msgstr "jera hagu" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.no-matches-for" -msgstr "Babu daidaituwa da aka samu na “%s“" +msgid "shortcuts.text-align-right" +msgstr "jera dama" -msgid "shortcuts.move-unit-right" -msgstr "Matsa da sashin dama" +msgid "shortcuts.thumbnail-set" +msgstr "saita babban yatsa" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.projects" -msgstr "aiyuka" +#: src/app/main/ui/workspace/sidebar/shortcuts.cljs +msgid "shortcuts.title" +msgstr "allon harufa yanke" -#: src/app/main/ui/auth/register.cljs -msgid "auth.verification-email-sent" -msgstr "mun aika maka da saqon tantancewa ta imel" +msgid "shortcuts.toggle-alignment" +msgstr "Danna a jere" -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.your-name" -msgstr "sunanka" +msgid "shortcuts.toggle-assets" +msgstr "Danna kadara" -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout" -msgstr "shiri" +msgid "shortcuts.toggle-colorpalette" +msgstr "Danna launukan kala" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-none" -msgstr "(ba'a saita ba )" +msgid "shortcuts.toggle-focus-mode" +msgstr "Danna yanayin maida hankali" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing" -msgstr "saukakawa" +msgid "shortcuts.toggle-fullscreen" +msgstr "Danna fuskar ta cika duka" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Triangle" +msgid "shortcuts.toggle-history" +msgstr "Danna tarihi" -msgid "workspace.path.actions.draw-nodes" -msgstr "zane da kauri (%s)" +msgid "shortcuts.toggle-layers" +msgstr "Danna shimfida" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-scale-text" -msgstr "bada damar sikelin rubutu" +msgid "shortcuts.toggle-layout-flex" +msgstr "Tara/fitar da lankwasashhiyar shimfida" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row-reverse" -msgstr "jera sauyin fasali" +msgid "shortcuts.toggle-lock" +msgstr "Rufe/bude" -msgid "errors.email-spam-or-permanent-bounces" -msgstr "saqonni marasa amfani na imel «%s»." +msgid "shortcuts.toggle-lock-size" +msgstr "Rufe rabo" -msgid "labels.add-custom-font" -msgstr "inganta font" +msgid "shortcuts.toggle-rules" +msgstr "Nuna / boye magwaji" -#: src/app/main/ui/dashboard/libraries.cljs -msgid "title.dashboard.shared-libraries" -msgstr "Rababban dakin karatu- %s - Mazubin biruka" +msgid "shortcuts.toggle-textpalette" +msgstr "Juya zuwa launukan rubutu" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "workspace.options.export-object" -msgid_plural "workspace.options.export-object" -msgstr[0] "Fitarwa 1 Sashi" -msgstr[1] "Fitarwa %s sashi-sashi" +msgid "shortcuts.toggle-visibility" +msgstr "Nuna/boye" -msgid "errors.bad-font" -msgstr "ba za a iya xora fonts %s ba" +msgid "shortcuts.toggle-zoom-style" +msgstr "Danna salon zukowa" -msgid "shortcuts.align-bottom" -msgstr "tsarin kasa" +msgid "shortcuts.underline" +msgstr "Danna ta layi a kasa" -msgid "shortcuts.align-top" -msgstr "tsarin sama" +msgid "shortcuts.undo" +msgstr "Cire" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.message" -msgstr "sabunta sashe a babbar taska" +msgid "shortcuts.ungroup" +msgstr "Fita daka rukuni" -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.profile-not-verified" -msgstr "ba a tantance bayananka ba,sai an tantance a ci gaba." +msgid "shortcuts.unmask" +msgstr "Cire takunkumi" -#: src/app/main/ui/inspect/attributes/layout.cljs, src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.radius" -msgstr "tsakiya" +msgid "shortcuts.v-distribute" +msgstr "Rarraba ta tsaye" -msgid "workspace.undo.entry.single.media" -msgstr "kadarar zanen hotuna" +msgid "shortcuts.zoom-lense-decrease" +msgstr "Zuko raguwar ido" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.twitter-title" -msgstr "wurin karvar qorafin tiwita" +msgid "shortcuts.zoom-lense-increase" +msgstr "Zuko karuwar ido" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.packed" -msgstr "cushe" +msgid "shortcuts.zoom-selected" +msgstr "Zuko wanda aka zaba" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.label" -msgstr "suna" +#: src/app/main/ui/dashboard/team.cljs +msgid "team.webhooks.max-length" +msgstr "Sunan shafin yanar gizon zai kunshi a mafi yawa haruffa 2048." -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-style" -msgstr "tsarin salo" +#: src/app/main/ui/dashboard/files.cljs +msgid "title.dashboard.files" +msgstr "%s - Tukunyar aje biro" -msgid "dashboard.import.analyze-error" -msgstr "kash! mun gaza shigo da kundinka" +#: src/app/main/ui/dashboard/fonts.cljs +msgid "title.dashboard.font-providers" +msgstr "samar da jerin harufa - %s - Mazubin biruka" -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-subtitle" -msgstr "za mu aika maka da saqon qa'idoji ta imel" +#: src/app/main/ui/dashboard/fonts.cljs +msgid "title.dashboard.fonts" +msgstr "jerin harufa - %s - Mazubin biruka" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.no-files-message" -msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "ba zai yi aiki a kowane kundi ba." -msgstr[1] "ba za su yi aiki a kowane kundi ba." +#: src/app/main/ui/dashboard/projects.cljs +msgid "title.dashboard.projects" +msgstr "tsare tsare - %s - Mazubin biruka" -#: src/app/main/ui/settings/password.cljs -msgid "title.settings.password" -msgstr "Nambobin sirri - Mazubin biruka" +#: src/app/main/ui/dashboard/search.cljs +msgid "title.dashboard.search" +msgstr "nema - %s - Mazubin biruka" -msgid "workspace.header.menu.enable-snap-pixel-grid" -msgstr "Bda damar tsinkewa zuwa akwatin pixel" +#: src/app/main/ui/dashboard/libraries.cljs +msgid "title.dashboard.shared-libraries" +msgstr "Rababban dakin karatu- %s - Mazubin biruka" -msgid "shortcuts.add-comment" -msgstr "Bayyana Ra'ayi" +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/auth.cljs +msgid "title.default" +msgstr "Mazubin biruka - Tsara yanci ga tawaga" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-enter" -msgstr "linzamin kwamfuter ya shiga" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "karin bayani - Shiga alama" -msgid "workspace.undo.entry.single.circle" -msgstr "da'ira" +#: src/app/main/ui/settings/feedback.cljs +msgid "title.settings.feedback" +msgstr "bada martani - Mazubin biruka" -msgid "labels.back" -msgstr "baya" +#: src/app/main/ui/settings/options.cljs +msgid "title.settings.options" +msgstr "Saiti - Mazubin biruka" -msgid "viewer.header.interactions-section" -msgstr "Hulda (%s)" +#: src/app/main/ui/settings/password.cljs +msgid "title.settings.password" +msgstr "Nambobin sirri - Mazubin biruka" -#: src/app/main/ui/auth/login.cljs -msgid "auth.forgot-password" -msgstr "ka manta lambar tsaro?" +#: src/app/main/ui/settings/profile.cljs +msgid "title.settings.profile" +msgstr "Karin bayani - Mazubin biruka" -msgid "shortcut-subsection.tools" -msgstr "Kayan aiki" +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-invitations" +msgstr "Gayyata - %s - Mazubin biruka" -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.recovery-token-sent" -msgstr "an aika maka da saqon matakan da za a bi domin dawo da lambar tsaronka." +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-members" +msgstr "Yan kungiya - %s - Mazubin biruka" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title.group" -msgstr "rukunin inuwa" +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-settings" +msgstr "Saiti - %s - Mazubin biruka" -msgid "modals.publish-empty-library.message" -msgstr "ba komai a taskarka. ka na son wallafa ta?" +msgid "title.team-webhooks" +msgstr "gidan yanar gizo - %s - Mazubin biruka" -#: src/app/main/ui/workspace/comments.cljs -msgid "labels.only-yours" -msgstr "naka kawai" +#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs +msgid "title.viewer" +msgstr "%s - duba kumburi - Mazubin biruka" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title.group" -msgstr "rukunin shafi" +#: src/app/main/ui/workspace.cljs +msgid "title.workspace" +msgstr "%s - Mazubin biruka" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.reset-zoom" -msgstr "Kara saitawa" +msgid "viewer.breaking-change.description" +msgstr "" +"Wannan mahadar da aka raba yanxu batada ingaci. Ka/ki kirkiri wata ko ka/ki " +"tamayi maishi a baka/ki sabuwa." -msgid "shortcuts.opacity-7" -msgstr "Saita dishi dishi zuwa kashi 70" +msgid "viewer.breaking-change.message" +msgstr "Sannu!" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.assets" -msgstr "kadara" +#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs +msgid "viewer.empty-state" +msgstr "Babu allon da aka samu a wannan fejin." -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.width" -msgstr "faxi" +#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs +msgid "viewer.frame-not-found" +msgstr "Ba'a sami allon ba." -msgid "shortcuts.snap-pixel-grid" -msgstr "yanke zuwa ga akwatin pixel" +msgid "viewer.header.comments-section" +msgstr "Bayyana ra'ayi(%s)" -#: src/app/main/ui/auth/login.cljs -msgid "errors.ldap-disabled" -msgstr "LDAP ya gaza tantancewa." +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.dont-show-interactions" +msgstr "Karka/ki nuna hulda" -msgid "workspace.assets.open-library" -msgstr "bude fiyal din dakin karatu" +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.fullscreen" +msgstr "Cika fuskar" -#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs -msgid "workspace.gradients.linear" -msgstr "a layi mikakke" +msgid "viewer.header.inspect-section" +msgstr "Duba (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title-selection" -msgstr "zababbun rubutu" +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.interactions" +msgstr "Hulda" -msgid "modals.delete-component-annotation.title" -msgstr "goge bayani" +msgid "viewer.header.interactions-section" +msgstr "Hulda (%s)" -msgid "shortcuts.select-parent-layer" -msgstr "zabi ainihin shafi" +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.share.copy-link" +msgstr "Kwafi mahada" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.promote-and-leave" -msgstr "inganta sannan ka bari" +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.show-interactions" +msgstr "Nuna hulda" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.libraries.text.multiple-typography" -msgstr "Rubutun rubutu dayawa" +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.show-interactions-on-click" +msgstr "Nuna hulda da an danna" -msgid "dashboard.import.progress.upload-media" -msgstr "xora kundaye: %s" +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.sitemap" +msgstr "taswirar wuri" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-multi-confirm.accept" -msgstr "goge kundaye" +msgid "webhooks.last-delivery.success" +msgstr "Sakon karshe ya isa." -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "rababben dakin karatu" +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hcenter" +msgstr "Daidaita tsakiya a kwance (%s)" -msgid "labels.share-prototype" -msgstr "tura manhajar rubutu" +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hdistribute" +msgstr "rarraba filin kwance (%s)" -msgid "shortcuts.export-shapes" -msgstr "samar da sabbabbin abubuwa" +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hleft" +msgstr "Daidaita hagu (%s)" -#: src/app/main/ui/dashboard/team.cljs -msgid "notifications.invitation-link-copied" -msgstr "kwafar hanyar gayya" +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hright" +msgstr "Daidaita dama (%s)" -#: src/app/main/ui/settings/password.cljs -msgid "dashboard.notifications.password-saved" -msgstr "an tsare maka shaidar tsaro!" +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vbottom" +msgstr "Daidaita kasa (%s)" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.group-name" -msgstr "sunan kungiya" +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vcenter" +msgstr "Daidaita a kwance tsakiya (%s)" -msgid "shortcuts.search-placeholder" -msgstr "takaitaccen sako yanken" +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vdistribute" +msgstr "rarraba filin tsaye (%s)" -msgid "inspect.tabs.code.selected.svg-raw" -msgstr "SVG" +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vtop" +msgstr "Daidaita sama(%s)" -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.size" -msgstr "girma" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.assets" +msgstr "kadara" -msgid "workspace.undo.entry.multiple.component" -msgstr "bangare" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.box-filter-all" +msgstr "duka kadara" -msgid "workspace.focus.selection" -msgstr "zaba" +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.colors" +msgstr "kala" -msgid "workspace.path.actions.merge-nodes" -msgstr "hade kauri (%s)" +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.components" +msgstr "Bangarori" -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.info" -msgstr "" -"za mu aika maka da imel ta wannan imel xin “%s” domin tantance shaidarka." +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.create-group" +msgstr "kirkiri rukuni" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.remove-member" -msgstr "cire mamba" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.create-group-hint" +msgstr "abubuwanka za a samu su suna nan take kamar \"sunan kungiya/ sunan abubuwan\"" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.create-component" -msgstr "kirkiri abubuwa" +#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.delete" +msgstr "goge" -msgid "common.publish" -msgstr "wallafawa" +#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.duplicate" +msgstr "maimaita" -msgid "shortcuts.select-next" -msgstr "zabi wani shafi" +msgid "workspace.assets.duplicate-main" +msgstr "maimaita ainihin" -msgid "workspace.undo.entry.multiple.color" -msgstr "kadarar kala" +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.edit" +msgstr "tace" -#: src/app/main/ui/settings/options.cljs -msgid "title.settings.options" -msgstr "Saiti - Mazubin biruka" +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.graphics" +msgstr "zane zane" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.no-invitations" -msgstr "ba saqon da ba a buxa ba." +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.group" +msgstr "rukuni" -msgid "workspace.header.menu.enable-scale-content" -msgstr "bada damar sikelin rabo" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.group-name" +msgstr "sunan kungiya" -msgid "modals.delete-font-variant.message" -msgstr "" -"ka tabbata kana son goge wannan salon font din? ba zai xoru ba idan an yi " -"amfani da shi a kundi." +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.libraries" +msgstr "dakunan karatu" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.group-stroke" -msgstr "Ja layi a rukuni" +msgid "workspace.assets.local-library" +msgstr "dakin karatun gida" -msgid "workspace.shape.menu.union" -msgstr "hadakan" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.not-found" +msgstr "ba'a samu kadara ba" -msgid "workspace.shape.menu.thumbnail-set" -msgstr "kara kamar girman babban yatsa" +msgid "workspace.assets.open-library" +msgstr "bude fiyal din dakin karatu" -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.recovery-submit" -msgstr "canza lambar tsaro" +#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.rename" +msgstr "sake suna" -#: src/app/main/ui/confirm.cljs -msgid "ds.confirm-cancel" -msgstr "goge" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.rename-group" +msgstr "sake sunan kungiyar" -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.download" -msgstr "sauke hanyar hoto" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.search" +msgstr "nemo kadarar" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fill" -msgstr "cike - cika sikeli" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.selected-count" +msgid_plural "workspace.assets.selected-count" +msgstr[0] "%s" +msgstr[1] "%s zababbun abubuwan" -msgid "errors.bad-font-plural" -msgstr "ba za a iya xora fonts %s ba" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "rababben dakin karatu" -msgid "inspect.empty.help" -msgstr "domin neman qarin bayani game da fenfot a tuntubi sashen agaji" +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.typography" +msgstr "rubutun rubutu" -msgid "workspace.sidebar.layers.texts" -msgstr "rubutu" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.font-id" +msgstr "tsarin haruffa" -#: src/app/main/ui/settings/profile.cljs -msgid "title.settings.profile" -msgstr "Karin bayani - Mazubin biruka" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.font-size" +msgstr "girma" -#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.delete" -msgstr "goge" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.font-variant-id" +msgstr "bambanci" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-left" -msgstr "jera hagu (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.go-to-edit" +msgstr "tafi zuwa salon dakin karatu don a tace" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.your-account" -msgstr "fagenka" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.letter-spacing" +msgstr "fili a tsakanin haruffa" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.dismiss" -msgstr "watsar" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.line-height" +msgstr "tsawon layi" -#: src/app/main/ui/settings/feedback.cljs -msgid "title.settings.feedback" -msgstr "bada martani - Mazubin biruka" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/inspect/attributes/text.cljs, src/app/main/ui/inspect/attributes/text.cljs +msgid "workspace.assets.typography.sample" +msgstr "Ag" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.duplicate" -msgstr "maimaita" +msgid "workspace.assets.typography.text-styles" +msgstr "salon rubutu" -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.change-email" -msgstr "canza imel" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.text-transform" +msgstr "canja rubutu" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.title" -msgstr "gogewar tawaga" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.ungroup" +msgstr "kashe daga kungiya" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "bayanai masu yawa" +msgid "workspace.focus.focus-mode" +msgstr "tsarin maida hankali" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.forward" -msgstr "kawo ta gaba" +msgid "workspace.focus.focus-off" +msgstr "karka maida hankali" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.title" -msgstr "imel" +msgid "workspace.focus.focus-on" +msgstr "maida hankali" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.font-size" -msgstr "girma" +msgid "workspace.focus.selection" +msgstr "zaba" -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.message" -msgstr "" -"kai ke da wannan tawagar yanzu. ka tabbata kana son yin %s sabon mai tawaga?" +#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs +msgid "workspace.gradients.linear" +msgstr "a layi mikakke" + +#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs +msgid "workspace.gradients.radial" +msgstr "a da'ira" #: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-palette" -msgstr "farantin launuka" +msgid "workspace.header.menu.disable-dynamic-alignment" +msgstr "kashe daidaitawa mai canjawa" -msgid "shortcuts.group" -msgstr "rukuni" +msgid "workspace.header.menu.disable-scale-content" +msgstr "kashe sikelin rabo" -msgid "auth.privacy-policy" -msgstr "matakan kaxaita" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-scale-text" +msgstr "kashe sikelin rubutu" -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.password-changed-successfully" -msgstr "ka canza lambar tsaro" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-guides" +msgstr "kashe tsinkewa zuwa mai jagora" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-hovering" -msgstr "yayin shawagi" +msgid "workspace.header.menu.disable-snap-pixel-grid" +msgstr "kashe tsinkewa zuwa pixel" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show" -msgstr "nuna" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-dynamic-alignment" +msgstr "bada damar daidaitawa mai canjawa" -msgid "workspace.shape.menu.hide-ui" -msgstr "nuna / boye UI" +msgid "workspace.header.menu.enable-scale-content" +msgstr "bada damar sikelin rabo" -msgid "shortcuts.move-fast-up" -msgstr "Matsa sama da sauri" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-scale-text" +msgstr "bada damar sikelin rubutu" -#: src/app/main/data/dashboard.cljs -msgid "dashboard.new-project-prefix" -msgstr "sabon aiki" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-guides" +msgstr "Tsinke zuwa mai jagora" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.center" -msgstr "tsakiya" +msgid "workspace.header.menu.enable-snap-pixel-grid" +msgstr "Bda damar tsinkewa zuwa akwatin pixel" -#: src/app/main/ui/dashboard/team.cljs -msgid "title.team-settings" -msgstr "Saiti - %s - Mazubin biruka" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-artboard-names" +msgstr "Boye allom suna" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-manual" -msgstr "Yi da kanka" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-palette" +msgstr "farantin launuka" -msgid "labels.save" -msgstr "ajiye" +msgid "workspace.header.menu.hide-pixel-grid" +msgstr "boye pixel akwati" -msgid "dashboard.import.progress.process-media" -msgstr "kammala aiki" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-rules" +msgstr "boye ma'auni" -#: src/app/main/ui/confirm.cljs -msgid "ds.confirm-ok" -msgstr "haka" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-textpalette" +msgstr "boye launukan yanayin tsarin rubutu" -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "dole suna ya qumshi waxansu alamimon rubutu, sannan tazara." +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.edit" +msgstr "Tace" -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.message" -msgstr "ka tabbata kana son goge wannan aikin?" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.file" +msgstr "fayil" -msgid "shortcuts.line-height-inc" -msgstr "kara tsawon layi" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.help-info" +msgstr "taimako & bayani" -msgid "onboarding-v2.before-start.desc2" -msgstr "" -"cikakken bayanin yadda za a yi amfani da fenfot. daga rubutu zuwa tsara ko " -"rarraba iri." +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.preferences" +msgstr "fifiko" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.sidebar.layers" -msgstr "shafi" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.view" +msgstr "gani" -msgid "shortcuts.select-all" +msgid "workspace.header.menu.redo" +msgstr "sake" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.select-all" msgstr "zabi duka" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.graphics" -msgstr "%s zane zane" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-artboard-names" +msgstr "Nuna sunayen allo" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-palette" +msgstr "nuna launukan kala" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-leave" -msgstr "linzamin kwamfutar ya fita" +msgid "workspace.header.menu.show-pixel-grid" +msgstr "Nuna akwatin pixel" -msgid "labels.log-or-sign" -msgstr "yi ko shiga" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-rules" +msgstr "Nuna ma'auni" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "idan akwai qari (bayyana)" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-textpalette" +msgstr "Nuna launukan tsarin rubutu" -msgid "workspace.assets.typography.text-styles" -msgstr "salon rubutu" +msgid "workspace.header.menu.undo" +msgstr "Cire" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker" -msgstr "da'irar kasuwa" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.reset-zoom" +msgstr "Kara saitawa" -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.searching-for" -msgstr "neman “%s“…" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.save-error" +msgstr "an samu kuskure wajen adanawa" -msgid "inspect.attributes.typography.text-decoration.none" -msgstr "babu" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.saved" +msgstr "An adana" -msgid "labels.discard" -msgstr "vatar" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.saving" +msgstr "Adanawa" -msgid "shortcuts.font-size-inc" -msgstr "kara gaban yanayi" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.unsaved" +msgstr "Canja canjan da ba'a adana ba" -msgid "common.share-link.permissions-pages" -msgstr "tura shafuka" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.viewer" +msgstr "yanayin kallo (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-min-w" -msgstr "fadi mafi kankanta" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "Zuko" -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.hcenter" -msgstr "Daidaita tsakiya a kwance (%s)" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fill" +msgstr "cike - cika sikeli" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.gap" -msgstr "Gibi" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fit" +msgstr "dace - ja sikeli ya dace da shi" -msgid "inspect.tabs.code.selected.group" -msgstr "qungiya" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fit-all" +msgstr "zuko yayi daidai da ko'ina" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker" -msgstr "murabba'in kasuwa" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-full-screen" +msgstr "Cika allon" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column" -msgstr "shafi" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-selected" +msgstr "zuko zababbe" -#: src/app/main/ui/comments.cljs -msgid "labels.delete-comment-thread" -msgstr "goge rubutu" +msgid "workspace.layout_grid.editor.title" +msgstr "tace akwati" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation" -msgstr "hotuna masu motsi" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.add" +msgstr "tarawa" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.drop-shadow" -msgstr "ajiye inuwa" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.colors" +msgstr "%s kala" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "jaraba fenfot ka ga ko ta yi daidai da tawaga " +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "Babu salon kaloli a ma'ajiya yanzu" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "malami ko dalibi" +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "Babu rubutun rubutu a ma'ajiya yanzu" -msgid "workspace.undo.entry.single.curve" -msgstr "lankwasa" +#: src/app/main/ui/workspace/colorpicker/libraries.cljs, src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.file-library" +msgstr "F" -#: src/app/main/ui/static.cljs -msgid "labels.not-found.main-message" -msgstr "alama!" +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.hsv" +msgstr "HSV" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.overlay" -msgstr "mai rufi" +#: src/app/main/ui/workspace/colorpicker/libraries.cljs, src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.recent-colors" +msgstr "kalar yanzu" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgb-complementary" +msgstr "Jituwar RGB" -msgid "onboarding.team-modal.create-team" -msgstr "yin tawaga" +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgba" +msgstr "RGBA" -msgid "dashboard.import.progress.process-colors" -msgstr "aikin rini" +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.save-color" +msgstr "Adana salon kala" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-account" -msgstr "qirqiri taskar gwaji" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.components" +msgstr "%s bangarori" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.title" -msgstr "ma'aunin karvuwar aiki" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.file-library" +msgstr "Ma'adanar fiyal" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.margin" -msgstr "gefe" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.graphics" +msgstr "%s zane zane" -msgid "onboarding-v2.welcome.title" -msgstr "barka da zuwa fenfot!" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.in-this-file" +msgstr "Ma'adana a wanna fiyal" -#, permanent -msgid "inspect.attributes.stroke.alignment.center" -msgstr "tsakiya" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.libraries" +msgstr "ma'adanai" -#: src/app/main/ui/auth/verify_token.cljs -msgid "dashboard.notifications.email-changed-successfully" -msgstr "ka zamanantar da adireshinka na imel" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library" +msgstr "ma'adana" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "barin aikin tawaga" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library-updates" +msgstr "sabunta ma'adana" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.accept" -msgstr "qara yin wurin ajiyar tawaga" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.no-libraries-need-sync" +msgstr "Babu rabben ma'adanai da suke bukatar sabuntawa" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in-out" -msgstr "sauki ciki waje" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.no-matches-for" +msgstr "Babu daidaituwa da aka samu na “%s“" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-guides" -msgstr "Tsinke zuwa mai jagora" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.no-shared-libraries-available" +msgstr "Babu rababbun ma'adanai wanda aka samu" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-linear" -msgstr "mikakke" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.search-shared-libraries" +msgstr "Duba rabbaun ma'adanai" -#: src/app/main/ui/inspect/attributes/blur.cljs -msgid "inspect.attributes.blur.value" -msgstr "muhimmanci" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.shared-libraries" +msgstr "Rabban ma'adanai" -msgid "common.share-link.manage-ops" -msgstr "amincewar shugaba" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.libraries.text.multiple-typography" +msgstr "Rubutun rubutu dayawa" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.start" -msgstr "fara jagoranci" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.libraries.text.multiple-typography-tooltip" +msgstr "Cire mahadar duka rabutun rubutu" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-on-click" -msgstr "da an danna" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.typography" +msgstr "%s Rubutun rubutu" -msgid "onboarding.choice.team-up.invite-members" -msgstr "gayyato mambobi" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.update" +msgstr "Sabuntawa" -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.hdistribute" -msgstr "rarraba filin kwance (%s)" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "Aga duka canjin" -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-length-hint" -msgstr "aqalla a sami alamoni 8" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.updates" +msgstr "sabuntawa" -msgid "modals.delete-webhook.message" -msgstr "ka tabbata ka na son goge webhook?" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.add-interaction" +msgstr "Danna wannan madannin + domin saka hulda." -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.title" -msgstr "goge kundi" +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "workspace.options.blur-options.title" +msgstr "Dishi dishi" -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.title" -msgstr "goge aikin" +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "workspace.options.blur-options.title.group" +msgstr "rukuni" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to-dest" -msgstr "kewayawa zywa: %s" +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "workspace.options.blur-options.title.multiple" +msgstr "zabin dishi dishi" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.selected-count" -msgid_plural "workspace.assets.selected-count" -msgstr[0] "%s" -msgstr[1] "%s zababbun abubuwan" +#: src/app/main/ui/workspace/sidebar/options/page.cljs +msgid "workspace.options.canvas-background" +msgstr "bayan zane" -msgid "dashboard.libraries-and-templates.import-error" -msgstr "akwai matsala wurin shigo da fejin talla. fejin tallar ba ya xauko." +msgid "workspace.options.clip-content" +msgstr "Matse abun ciki" -# SECTIONS -msgid "shortcut-section.basics" -msgstr "shikashikai" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs +msgid "workspace.options.component" +msgstr "Bangarori" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-go-to" -msgstr "je ka taskar fenfot" +msgid "workspace.options.component.annotation" +msgstr "Yin sharhin rubutu" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.libraries-and-templates" -msgstr "taskoki & allunan talla" +msgid "workspace.options.component.copy" +msgstr "Kwafa" -#: src/app/main/ui/auth/login.cljs -msgid "errors.wrong-credentials" -msgstr "kuskuren imel ko lambar tsaro." +msgid "workspace.options.component.create-annotation" +msgstr "Kirkiri sharhin rubuta" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.spread" -msgstr "bazu" +msgid "workspace.options.component.edit-annotation" +msgstr "Tace sharhin rubutu" -msgid "shortcuts.open-inspect" -msgstr "tafi sashin da 'yan kallo za su duba" +msgid "workspace.options.component.main" +msgstr "Ainahin" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.info" -msgstr "ka san dokokin fenfot lokacin da ka ke tare da masoya koyarwa." +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints" +msgstr "Takura" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "31-50" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.bottom" +msgstr "Kasa" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.bottom" -msgstr "kasa" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.center" +msgstr "Tsakiya" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-duration" -msgstr "tsahon lokaci" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.fix-when-scrolling" +msgstr "gyara nemowa" -msgid "shortcuts.go-to-libs" -msgstr "ta fi zuwa rabbabben ma'ajiya" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.left" +msgstr "Hagu" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.advanced-ops" -msgstr "zabi na ci gaba" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.leftright" +msgstr "hagu & dama" -#: src/app/main/ui/settings/change_email.cljs -msgid "notifications.validation-email-sent" -msgstr "an aika da imel din tantancewa %s. bincika imel xinka!" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.right" +msgstr "dama" -msgid "shortcuts.toggle-zoom-style" -msgstr "Danna salon zukowa" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.scale" +msgstr "maauni" -msgid "shortcut-subsection.zoom-workspace" -msgstr "Zukowa" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.top" +msgstr "sama" -msgid "shortcuts.increase-zoom" -msgstr "zuko ciki" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.topbottom" +msgstr "sama & kasa" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-outside" -msgstr "rufe yayin matsewa ta waje" +#: src/app/main/ui/workspace/sidebar/options.cljs +msgid "workspace.options.design" +msgstr "zane" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.blur" -msgstr "dishi dishi" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export" +msgstr "fitarwa" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.no-access-tokens" -msgstr "ba ka da wasu lambobin tsaro yanzu." +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export-multiple" +msgstr "Fitar da zababbun" -msgid "workspace.path.actions.separate-nodes" -msgstr "raba kauri (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export-object" +msgid_plural "workspace.options.export-object" +msgstr[0] "Fitarwa 1 Sashi" +msgstr[1] "Fitarwa %s sashi-sashi" -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.title-search" -msgstr "neman sakamako" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs +msgid "workspace.options.export.suffix" +msgstr "Kari na bayan baki" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "teburin aiki" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-complete" +msgstr "An gama fitarwa" -#: src/app/main/ui/workspace.cljs -msgid "labels.reload-file" -msgstr "qara dora kundi" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object" +msgstr "Ana fitarwa" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.font-id" -msgstr "tsarin haruffa" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object-error" +msgstr "An gaza fitarwa" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.selection-stroke" -msgstr "gigciye zabi" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object-slow" +msgstr "Fitarwa ba tsammani ta sami tsaiko" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"lambarka ta shiga na a matsayin zabin hanyar shiga/lambar tsaronmuza a iya " -"amfani tsarin tantancewa,domin shiga manhajar cikin fenfot API" +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.fill" +msgstr "Cikawa" -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.title" -msgstr "mallakar tawaga" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.add-flow-start" +msgstr "Kara gudun farko" -msgid "dashboard.import" -msgstr "shigo da kundin fenfot" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-start" +msgstr "Gudun farko" -#: src/app/main/ui/workspace/sidebar/options.cljs -msgid "workspace.options.prototype" -msgstr "samfur" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-starts" +msgstr "gudun farko" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.right" -msgstr "dama" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.auto" +msgstr "da kanshi" -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.success-delete-project" -msgstr "ka goge aikinka" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.column" +msgstr "shafi" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.text" -msgstr "fenfot ta menbobin tawaga ce. kirawo kowa domin yin aiki tarekundaye" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.grid-title" +msgstr "Akwati" -#: src/app/main/ui/auth/recovery.cljs -msgid "profile.recovery.go-to-login" -msgstr "je ka hanyar shiga" +msgid "workspace.options.grid.params.color" +msgstr "Kala" -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.theme-change" -msgstr "batun UI" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.columns" +msgstr "shafi" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.use-play-button" -msgstr "yi amfani da madanneta ta sama ki tafi da samfuri." +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.gutter" +msgstr "mahada" -msgid "modals.delete-font.message" -msgstr "" -"ka tabbata kana son goge wannan font xin ? ba zai yi aiki ba idan an yi " -"amfani da shi a kundi." +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.height" +msgstr "tsawo" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.hue" -msgstr "Haske haske" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.margin" +msgstr "gefe" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-artboard-names" -msgstr "Nuna sunayen allo" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.rows" +msgstr "jere" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.save-error" -msgstr "an samu kuskure wajen adanawa" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.set-default" +msgstr "saita a tsoho" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.dashed" -msgstr "layin raba abu" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.size" +msgstr "girma" -msgid "common.share-link.all-users" -msgstr "duk fenfot" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type" +msgstr "Nau'i" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "mallakar lambobin shiga na sirri" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.bottom" +msgstr "Kasa" -#: src/app/main/ui/settings/password.cljs -msgid "dashboard.password-change" -msgstr "sauya lambar tsaro" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.center" +msgstr "Tsakiya" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Canva" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.left" +msgstr "Hagu" -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.fill" -msgstr "Cikawa" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.right" +msgstr "Dama" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.left" -msgstr "hagu" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.stretch" +msgstr "mikewa" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "qara samun bayanin fenfot" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.top" +msgstr "sama" -msgid "workspace.shape.menu.thumbnail-remove" -msgstr "cire girman babban danyatsa" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.use-default" +msgstr "yi amfani da tsoho" -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.width" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.width" msgstr "fadi" -msgid "inspect.empty.select" -msgstr "zabar zubi, hukumar masu sa ido akan bangarorinsu da lambobinsu" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expires-on" -msgstr "gama aiki kan %s" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.row" +msgstr "layuka" -msgid "shortcuts.toggle-layout-flex" -msgstr "Tara/fitar da lankwasashhiyar shimfida" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.square" +msgstr "murabba'i" -msgid "labels.or" -msgstr "ko" +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.group-fill" +msgstr "Cika rukuni" -msgid "onboarding.choice.team-up.roles" -msgstr "gayyata tare da bayar da matsayi:" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.group-stroke" +msgstr "Ja layi a rukuni" -msgid "labels.font-providers" -msgstr "ma su fenfot" +msgid "workspace.options.height" +msgstr "Tsawo" -msgid "shortcuts.italic" -msgstr "juya zuwa kwantaccen rubuyu" +msgid "workspace.options.inspect" +msgstr "Duba" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.space-around" -msgstr "kewayayyen sarrari" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-action" +msgstr "aiki" -msgid "errors.webhooks.timeout" -msgstr "dakatarwa" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-after-delay" +msgstr "Bayan jinkiri" -msgid "errors.profile-blocked" -msgstr "bayanan a rufe suke" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation" +msgstr "hotuna masu motsi" -msgid "workspace.options.width" -msgstr "fadi" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-dissolve" +msgstr "narkewa" -msgid "shortcuts.letter-spacing-dec" -msgstr "rage filin harafin" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-none" +msgstr "Babu" -msgid "errors.webhooks.last-delivery" -msgstr "saqon qarshe bai je ba." +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-push" +msgstr "Tura" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-move-files" -msgstr "an tura kundayenka" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-slide" +msgstr "Ja" -msgid "shortcut-subsection.general-dashboard" -msgstr "gamayya" +msgid "workspace.options.interaction-auto" +msgstr "da kanshi" -#: src/app/main/ui/settings/password.cljs -msgid "errors.password-too-short" -msgstr "lambar tsaro dole ta kai yawan alamu 8" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-background" +msgstr "kara mai rufin bayan" -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.title" -msgstr "ka tabbata ka na son goge asusunka?" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-outside" +msgstr "rufe yayin matsewa ta waje" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.title" -msgstr "jagoranci" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay" +msgstr "kulle mai rufi" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.rect" -msgstr "Rectangle (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay-dest" +msgstr "kulle mai rufi %s" -msgid "labels.continue-with" -msgstr "ci gaba da" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-delay" +msgstr "jinkiri" -msgid "inspect.attributes.typography.text-transform.lowercase" -msgstr "qananan baqaqe" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-destination" +msgstr "makoma" -msgid "workspace.undo.entry.single.group" -msgstr "rukuni" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-duration" +msgstr "tsahon lokaci" -msgid "inspect.attributes.stroke.style.dotted" -msgstr "xige-xige" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing" +msgstr "saukakawa" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-max-w" -msgstr "fadi mafi yawa" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease" +msgstr "sauki" -msgid "shortcuts.align-right" -msgstr "tsarin dama" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in" +msgstr "sauki ciki" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "can baya" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in-out" +msgstr "sauki ciki waje" -msgid "modals.invite-member.emails" -msgstr "imel, rabawar waqafi" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-out" +msgstr "sauki waje" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.sitemap" -msgstr "taswirar wuri" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-linear" +msgstr "mikakke" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-dynamic-alignment" -msgstr "kashe daidaitawa mai canjawa" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-in" +msgstr "ciki" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-bottom-left" -msgstr "kasan hagu" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-enter" +msgstr "linzamin kwamfuter ya shiga" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.right" -msgstr "Dama" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-leave" +msgstr "linzamin kwamfutar ya fita" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay" -msgstr "kulle mai rufi" +msgid "workspace.options.interaction-ms" +msgstr "ms" -msgid "errors.invite-invalid.info" -msgstr "za a iya soke gayyata ko ta ki aiki." +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to" +msgstr "kewayawa zuwa" -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.fonts-added" -msgid_plural "dashboard.fonts.fonts-added" -msgstr[0] "an qara font 1" -msgstr[1] "%s an qara fonts da yawa" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to-dest" +msgstr "kewayawa zywa: %s" -msgid "modals.create-webhook.submit-label" -msgstr "qirqirar webhook" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-none" +msgstr "(ba'a saita ba )" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "" -"danna maddanin qasa\"danna qasa\n" -"emo sabuwar lambar tsaro\" samar da wani." +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-offset-effect" +msgstr "cire tasiri" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.title" -msgstr "goge alama" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-on-click" +msgstr "da an danna" -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.vtop" -msgstr "Daidaita sama(%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay" +msgstr "bude mai rufi" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.viewer" -msgstr "ma su kallo" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay-dest" +msgstr "bude mai rufi: %s" -msgid "shortcuts.toggle-alignment" -msgstr "Danna a jere" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-url" +msgstr "bude URL" -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.invite-profile" -msgstr "neman mutane" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-out" +msgstr "fita" -#: src/app/main/ui/dashboard/grid.cljs -#, markdown -msgid "dashboard.empty-placeholder-drafts" -msgstr "" -"nan za a sami kundayen da aka sanya a taska. gwada sanya na ka kundin \"a " -"taskirarmumaginar kundi](https://manhajar fenfot/taskokin maginar kundaye." -"html)." +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-center" +msgstr "kasa tsakiya" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker" -msgstr "darajar kasuwa" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-left" +msgstr "kasa hagu" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.soft-light" -msgstr "haske mai sauki" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-right" +msgstr "kasa dama" -msgid "shortcuts.decrease-zoom" -msgstr "fito da shi waje" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-center" +msgstr "tsakiya" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding-simple" -msgstr "sassaukan ciko" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-manual" +msgstr "Yi da kanka" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.gutter" -msgstr "mahada" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-center" +msgstr "sama tsakiya" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.group" -msgstr "rukuni" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-left" +msgstr "sama hagu" -msgid "dashboard.webhooks.update.success" -msgstr "sabunta Webhook." +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-right" +msgstr "sama dama" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-github-submit" -msgstr "matattarar manazarta" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-position" +msgstr "Mataki" -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.letter-spacing" -msgstr "tazarar harafi" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-preserve-scroll" +msgstr "adana komawa sama da kasa" -msgid "inspect.tabs.code.selected.text" -msgstr "rubutu" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-prev-screen" +msgstr "allon daya gabata" -msgid "shortcuts.opacity-4" -msgstr "Saita dishi dishi zuwa kashi 40" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-relative-to" +msgstr "alaka zuwa" -#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "workspace.options.blur-options.title.multiple" -msgstr "zabin dishi dishi" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-self" +msgstr "kai/ni" -msgid "shortcuts.align-vcenter" -msgstr "tsarin tsakiya a tsaye" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay" +msgstr "Juya mai murfi" -msgid "workspace.shape.menu.create-annotation" -msgstr "kirkiri hoto mai motsi" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay-dest" +msgstr "Juya mai murfi: %s" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-selected" -msgstr "zuko zababbe" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-trigger" +msgstr "Jawo" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.message" -msgstr "" -"ka tabbata kana son goge wannan tawagar? Duk aiyukanka na kundayen da suka " -"danganci tawagar za su yi gogewar dindindin." +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-url" +msgstr "URL" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay-dest" -msgstr "bude mai rufi: %s" +msgid "workspace.options.interaction-while-hovering" +msgstr "yayin shawagi" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type" -msgstr "Nau'i" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-pressing" +msgstr "yayin dannawa" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-url" -msgstr "bude URL" +msgid "workspace.options.interactions" +msgstr "yayin hulda" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.delete-invitation" -msgstr "goge gayyata" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color" +msgstr "kala" -msgid "workspace.path.actions.delete-node" -msgstr "goge kauri (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color-burn" +msgstr "kala konanniya" -msgid "shortcuts.letter-spacing-inc" -msgstr "kara filin harafin" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color-dodge" +msgstr "kala gudajjiya" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-destination" -msgstr "makoma" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.darken" +msgstr "kara masa duhu" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-google-submit" -msgstr "Gugul" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.difference" +msgstr "banbanci" -msgid "onboarding.newsletter.acceptance-message" -msgstr "" -"an aika maka da saqon buqatar biya, za mu aika maka da saqon imel tabbatar " -"da shi." +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.exclusion" +msgstr "warewa" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.go-main" -msgstr "tafi ainihin wurin fal" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.hard-light" +msgstr "Haske mai muya" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "fara aiki na" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.hue" +msgstr "Haske haske" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.delete-team" -msgstr "goge tawaga" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.lighten" +msgstr "kara masa haske" -msgid "shortcuts.draw-frame" -msgstr "Allo" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.luminosity" +msgstr "warewa" -msgid "shortcuts.text-align-center" -msgstr "jera tsakiya" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.multiply" +msgstr "sau" -msgid "shortcuts.undo" -msgstr "Cire" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.normal" +msgstr "na kullum" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "mashi" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.overlay" +msgstr "mai rufi" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.accept" -msgstr "sabunta" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.saturation" +msgstr "jikewa" -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.vcenter" -msgstr "Daidaita a kwance tsakiya (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.screen" +msgstr "allo" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.twitter-subtitle1" -msgstr "tambayoyin da ke buqatar amsa." +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.soft-light" +msgstr "haske mai sauki" -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.remove-account" -msgstr "ka na son cire taskarka?" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title" +msgstr "shafi" -msgid "labels.font-family" -msgstr "ire-iren font" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title.group" +msgstr "rukunin shafi" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title.multiple" +msgstr "dayawa" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.advanced-ops" +msgstr "zabi na ci gaba" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-max-h" +msgstr "tsawo mafi yawa" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-max-w" +msgstr "fadi mafi yawa" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.viewer" -msgstr "yanayin kallo (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-min-h" +msgstr "tsawo mafi kankanta" -msgid "workspace.path.actions.make-curve" -msgstr "Ta lankwasa (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-min-w" +msgstr "fadi mafi kankanta" -msgid "workspace.options.search-font" -msgstr "nemo jerin harufa" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-max-h" +msgstr "tsawo mafi yawa" -msgid "onboarding.team-modal.create-team-feature-3" -msgstr "aiyukan shugaba" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-max-w" +msgstr "fadi mafi yawa" -msgid "workspace.path.actions.move-nodes" -msgstr "tafi da kauri (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-min-h" +msgstr "tsaho mafi kankanta" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-title" -msgstr "dangin fenfot" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-min-w" +msgstr "fadi mafi kankanta" -msgid "workspace.path.actions.join-nodes" -msgstr "hada kauri (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.bottom" +msgstr "kasa" -msgid "shortcuts.merge-nodes" -msgstr "hada da kauri" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column" +msgstr "shafi" -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "wane kayan zane ka fi iya aiki da shi?" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column-reverse" +msgstr "sake shafi" -msgid "shortcuts.bool-difference" -msgstr "ma'auni mabanbanci" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row" +msgstr "jerawa" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-url" -msgstr "URL" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row-reverse" +msgstr "jera sauyin fasali" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "ka sami lambar tsaron da aka yi." +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.gap" +msgstr "Gibi" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.community" -msgstr "matattara" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.left" +msgstr "hagu" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.move" -msgstr "motsa abun" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin" +msgstr "gefe" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title.multiple" -msgstr "dayawa" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin-all" +msgstr "gefen duka" -msgid "shortcuts.make-corner" -msgstr "kirkiri kwana" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin-simple" +msgstr "Samfarin gefe" -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.show-your-comments" -msgstr "bayyana na ka ra’ayin" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.packed" +msgstr "cushe" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "mi ne ne matsayinka?" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding" +msgstr "filla filla" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.letter-spacing" -msgstr "fili a tsakanin haruffa" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-all" +msgstr "duka gefan" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.direction-ltr" -msgstr "LTR" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-simple" +msgstr "sassaukan ciko" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.shared-libraries" -msgstr "taskoki" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.right" +msgstr "dama" -#: src/app/main/ui/dashboard/team.cljs -msgid "title.team-invitations" -msgstr "Gayyata - %s - Mazubin biruka" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-around" +msgstr "kewayayyen sarrari" -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.pin-unpin" -msgstr "rufewa/buxewa" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-between" +msgstr "sarari tsakani" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.num-of-files" -msgid_plural "labels.num-of-files" -msgstr[0] "kundi 1" -msgstr[1] "kundaye %s" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.top" +msgstr "sama" -msgid "labels.custom-fonts" -msgstr "kwalliya da fenfot" +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.more-colors" +msgstr "kaloli masu yawa" -#: src/app/main/ui/dashboard/comments.cljs -msgid "labels.comments" -msgstr "yabo" +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.more-lib-colors" +msgstr "Ma'ajiyar kaloli masu yawa" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.height" -msgstr "tsawo" +msgid "workspace.options.opacity" +msgstr "dishi dishi" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.delete" -msgstr "goge" +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.position" +msgstr "matsayi" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show-in-assets" -msgstr "nuna ta kusuwar kadara" +#: src/app/main/ui/workspace/sidebar/options.cljs +msgid "workspace.options.prototype" +msgstr "samfur" -msgid "workspace.undo.entry.multiple.shape" -msgstr "siffa" +msgid "workspace.options.radius" +msgstr "digon tsakiyar da'ira" -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.info" -msgstr "bayani" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-bottom-left" +msgstr "kasan hagu" -msgid "workspace.options.interaction-auto" -msgstr "da kanshi" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-bottom-right" +msgstr "kasan dama" -msgid "onboarding.team-modal.create-team-feature-2" -msgstr "ma su yin shiri dayawa lokaci xaya" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-top-left" +msgstr "saman hagu" -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"xakin ba komai. wurin ajiyar tawaga, turken da ka yi za ya yi aiki a sauran " -"kundaye. ka tabbata kai ne ka ke son wallafa shi?" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-top-right" +msgstr "saman dama" -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.dashboard" -msgstr "dashbod" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius.all-corners" +msgstr "duka kwanar" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title.multiple" -msgstr "inuwar zabi" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius.single-corners" +msgstr "kwanar da take cin gashin kanta" -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.save-settings" -msgstr "wurin ajiyar saiti" +msgid "workspace.options.recent-fonts" +msgstr "da dimi dimi" -#: src/app/main/errors.cljs -msgid "errors.max-quote-reached" -msgstr "kammala adadin '%s' madogara. gyara." +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.retry" +msgstr "sake" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-prev-screen" -msgstr "allon daya gabata" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.rotation" +msgstr "juyawa" -msgid "labels.active" -msgstr "mai amfani" +msgid "workspace.options.search-font" +msgstr "nemo jerin harufa" -msgid "shortcuts.text-align-right" -msgstr "jera dama" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.select-a-shape" +msgstr "zabi surar allo, ko rukuni ta hadu da daya allon." -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.add" -msgstr "tarawa" +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.selection-color" +msgstr "zababbabbin kaloli" -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.text-decoration" -msgstr "kwalliyar rubutu" +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.selection-fill" +msgstr "cika zabi" -msgid "dashboard.import.import-warning" -msgstr "wasu kundayen na dauke da abubuwan da ba su da amfani." +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.selection-stroke" +msgstr "gigciye zabi" -#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs -msgid "errors.media-type-mismatch" -msgstr "hoton da aka sanya bai yi daidai da kundin da ake son faxaxawa ba." +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.blur" +msgstr "dishi dishi" -msgid "shortcuts.opacity-0" -msgstr "Saita dishi dishi zuwa kashi 100" +msgid "workspace.options.shadow-options.color" +msgstr "inuwar kala" -msgid "shortcuts.clear-undo" -msgstr "goge sake" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.drop-shadow" +msgstr "ajiye inuwa" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.text" -msgstr "rubutu (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.inner-shadow" +msgstr "Inuwar ciki" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.update" -msgstr "sabintawas" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsetx" +msgstr "X" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.copy" -msgstr "kwafi" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsety" +msgstr "Y" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.curve" -msgstr "kwana(%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.spread" +msgstr "bazu" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding-all" -msgstr "duka gefan" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title" +msgstr "inuwa" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title" -msgstr "rubutu" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title.group" +msgstr "rukunin inuwa" -#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs -msgid "viewer.empty-state" -msgstr "Babu allon da aka samu a wannan fejin." +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title.multiple" +msgstr "inuwar zabi" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.file-library" -msgstr "Ma'adanar fiyal" +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.show-fill-on-export" +msgstr "fito da shi a ga" -msgid "inspect.tabs.code.selected.path" -msgstr "hanya" +msgid "workspace.options.show-in-viewer" +msgstr "fito da kaurin sosai" -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.left" -msgstr "hagu" +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.size" +msgstr "girma" -msgid "shortcut-subsection.navigation-workspace" -msgstr "shawagi" +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs +msgid "workspace.options.size-presets" +msgstr "yanayin girman yanayin" -msgid "shortcuts.bool-union" -msgstr "ma'auni hadaka" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke" +msgstr "gigciye" -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.submit" -msgstr "sake imel" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker" +msgstr "da'irar kasuwa" -#: src/app/main/errors.cljs -msgid "errors.feature-not-supported" -msgstr "sassa '%s' ba za su yi aiki ba." +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "da'ira" -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.rename-team" -msgstr "sake suna tawaga" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker" +msgstr "darajar kasuwa" -#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "workspace.options.blur-options.title.group" -msgstr "rukuni" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "mai daraja" -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-projects" -msgstr "aiyukan tawaga" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow" +msgstr "layin mashiw" -msgid "shortcuts.underline" -msgstr "Danna ta layi a kasa" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "mashi" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-never" -msgstr "bai yiwuwa" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.none" +msgstr "ba komai" -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgb-complementary" -msgstr "Jituwar RGB" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.round" +msgstr "da'ira" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.edit" -msgstr "Tace" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square" +msgstr "murabba'i" -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.message" -msgstr "ka tabbata kana son cire wannan memban a wannan tawaar?" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker" +msgstr "murabba'in kasuwa" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.hint" -msgstr "" -"ka kusa sabunta sashe a babbar taska. wannan za ya iya aiki a sauran " -"kundayen da ke amfani da ita." +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Rectangle" -#: src/app/main/ui/static.cljs -msgid "labels.internal-error.main-message" -msgstr "kuskuren ciki" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow" +msgstr "Triangle mashi" -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.title" -msgstr "sake imel xinka" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Triangle" -msgid "shortcut-subsection.modify-layers" -msgstr "gyara shimfida" +msgid "workspace.options.stroke-color" +msgstr "gigciye kalar" -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.release-notes" -msgstr "bayar da bayani" +msgid "workspace.options.stroke-width" +msgstr "gigciye fadin" -msgid "shortcuts.unmask" -msgstr "Cire takunkumi" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.center" +msgstr "tsakiya" -msgid "workspace.options.y" -msgstr "Y layi" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.dashed" +msgstr "layin raba abu" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.message" -msgstr "cire “%s” a taskar shirye-shirye" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.dotted" +msgstr "digo digo" #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.round" -msgstr "da'ira" +msgid "workspace.options.stroke.inner" +msgstr "ciki" -msgid "shortcuts.toggle-lock" -msgstr "Rufe/bude" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.mixed" +msgstr "gauraya" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.password" -msgstr "lambar tsaro" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.outer" +msgstr "waje" -msgid "viewer.breaking-change.message" -msgstr "Sannu!" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.solid" +msgstr "mai tauri" -msgid "shortcut-subsection.panels" -msgstr "allon sarrarfav naura" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-bottom" +msgstr "jerin kasa" -msgid "inspect.tabs.code.selected.circle" -msgstr "da'ira" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-middle" +msgstr "jerin tsakiya" -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.info" -msgstr "idan ka cire asusunka za ka iya rasa aikin da ka kammala." +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-top" +msgstr "jerin sama" -msgid "dashboard.loading-fonts" -msgstr "xora abin adonka …" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.direction-ltr" +msgstr "LTR" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.hint1" -msgstr "" -"kai ne mai wannan tawagar. zabi wani memba da za ya iya inganta wa mai shi " -"kafin ka fita." +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.direction-rtl" +msgstr "RTL" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to-multi" -msgstr "tura %s kundaye a" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-auto-height" +msgstr "sarrafaffan tsaho" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.topbottom" -msgstr "sama & kasa" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-auto-width" +msgstr "sarrafaffen fadi" -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.vdistribute" -msgstr "rarraba filin tsaye (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-fixed" +msgstr "dasa" -msgid "shortcuts.separate-nodes" -msgstr "raba kauri" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.letter-spacing" +msgstr "tazarar harafi" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-close-confirm.message" -msgstr "ka tabbata ka na son fita daga %s tawaga?" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.line-height" +msgstr "tsahon layi" -msgid "shortcut-subsection.path-editor" -msgstr "Hanya" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.lowercase" +msgstr "yanayin kasa" -msgid "common.share-link.link-copied-success" -msgstr "an samo kwafi" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.none" +msgstr "babu" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "mawallafi/VP" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.strikethrough" +msgstr "gigciye ta cikinsa (%s)" -#: src/app/main/ui/inspect/attributes/stroke.cljs -msgid "inspect.attributes.stroke.width" -msgstr "fadi" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-center" +msgstr "jerin tsakiya (%s)" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.message" -msgid_plural "modals.delete-shared-confirm.message" -msgstr[0] "ka tabbata kana son goge wannan kundin?" -msgstr[1] "ka tabbata kana son goge waxannan kundayen?" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-justify" +msgstr "tabbatarwa (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title" -msgstr "shafi" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-left" +msgstr "jera hagu (%s)" -#: src/app/main/ui/dashboard/fonts.cljs -msgid "title.dashboard.fonts" -msgstr "jerin harufa - %s - Mazubin biruka" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-right" +msgstr "jera dama (%s)" -msgid "workspace.undo.entry.multiple.text" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title" msgstr "rubutu" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.email" -msgstr "imel" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title-group" +msgstr "rukunin rubutu" -msgid "workspace.sidebar.layers.shapes" -msgstr "Siffa" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title-selection" +msgstr "zababbun rubutu" -#: src/app/main/ui/workspace/colorpicker/libraries.cljs, src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.recent-colors" -msgstr "kalar yanzu" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.titlecase" +msgstr "yanayin lakani" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.add-flow-start" -msgstr "Kara gudun farko" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.underline" +msgstr "ja layi (%s)" -msgid "inspect.attributes.typography.text-transform.uppercase" -msgstr "manyan baqaqe" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.uppercase" +msgstr "yanayin sama" -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.show-fill-on-export" -msgstr "fito da shi a ga" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.use-play-button" +msgstr "yi amfani da madanneta ta sama ki tafi da samfuri." -msgid "labels.inactive" -msgstr "maras amfani" +msgid "workspace.options.width" +msgstr "fadi" -msgid "dashboard.export.title" -msgstr "fitar da kundayr" +msgid "workspace.options.x" +msgstr "X layi" -msgid "modals.publish-empty-library.accept" -msgstr "wallafa" +msgid "workspace.options.y" +msgstr "Y layi" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.center" -msgstr "Tsakiya" +msgid "workspace.path.actions.add-node" +msgstr "kara kauri (%s)" -msgid "shortcuts.toggle-lock-size" -msgstr "Rufe rabo" +msgid "workspace.path.actions.delete-node" +msgstr "goge kauri (%s)" -#: src/app/main/ui/comments.cljs -msgid "labels.delete-comment" -msgstr "goge yabo" +msgid "workspace.path.actions.draw-nodes" +msgstr "zane da kauri (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-max-h" -msgstr "tsawo mafi yawa" +msgid "workspace.path.actions.join-nodes" +msgstr "hada kauri (%s)" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.register-submit" -msgstr "qirqiri kundi" +msgid "workspace.path.actions.make-corner" +msgstr "ta kwana (%s)" -msgid "onboarding-v2.before-start.desc3.title" -msgstr "koyarwa ta hoto mai motsi" +msgid "workspace.path.actions.make-curve" +msgstr "Ta lankwasa (%s)" -msgid "shortcuts.thumbnail-set" -msgstr "saita babban yatsa" +msgid "workspace.path.actions.merge-nodes" +msgstr "hade kauri (%s)" -msgid "workspace.shape.menu.restore-main" -msgstr "saita ainihin wurin" +msgid "workspace.path.actions.move-nodes" +msgstr "tafi da kauri (%s)" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.no-projects-placeholder" -msgstr "nan za a ga bayanin aiki" +msgid "workspace.path.actions.separate-nodes" +msgstr "raba kauri (%s)" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.libraries" -msgstr "ma'adanai" +msgid "workspace.path.actions.snap-nodes" +msgstr "tsinke kauri (%s)" -msgid "onboarding-v2.welcome.desc1" -msgstr "" -"fenfot ne ke yin kelaidos kamar yadda mutane ke yi, mutane na taimakon " -"junansu. kowa za ya iya hada hannu da:" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.add-flex" +msgstr "kara sassaukan tsarit" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.title" -msgstr "samar da alamar shiga" +msgid "workspace.shape.menu.add-grid" +msgstr "kara akwatin tsari" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.no-expiration" -msgstr "ba lokacin daina amfani" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.back" +msgstr "tura zuwa baya" -msgid "shortcuts.go-to-search" -msgstr "gajeran sako" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.backward" +msgstr "tura zuwa baya" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "suna dole ya qunshi alamomin rubutu 250." +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.copy" +msgstr "kwafi" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.libraries" -msgstr "dakunan karatu" +msgid "workspace.shape.menu.create-annotation" +msgstr "kirkiri hoto mai motsi" -#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.components" -msgstr "Bangarori" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.create-artboard-from-selection" +msgstr "zababban allo" -#, permanent -msgid "inspect.attributes.stroke.alignment.inner" -msgstr "daga ciki" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.create-component" +msgstr "kirkiri abubuwa" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.select-all" -msgstr "zabi duka" +msgid "workspace.shape.menu.create-multiple-components" +msgstr "kirkiri abubuwa da yawa" -msgid "labels.upload-custom-fonts" -msgstr "Upload custom fonts" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.cut" +msgstr "cire" -msgid "shortcuts.flip-horizontal" -msgstr "kifa shi dai dai" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete" +msgstr "goge" -msgid "dashboard.import.progress.process-components" -msgstr "aikin sassa" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete-flow-start" +msgstr "goge kwararar farko" -#: src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs -msgid "dashboard.update-settings" -msgstr "zamanartarwa wurin gyara" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.detach-instance" +msgstr "raba yanayin abin" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints" -msgstr "Takura" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.detach-instances-in-bulk" +msgstr "raba yanayin abin" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.saturation" -msgstr "jikewa" +msgid "workspace.shape.menu.difference" +msgstr "bambanci" -msgid "workspace.sidebar.expand" -msgstr "kara yankin ma'agiyar bayani" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.duplicate" +msgstr "maimaita" -#: src/app/main/ui/inspect/attributes/blur.cljs -msgid "inspect.attributes.blur" -msgstr "xige-xige" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.edit" +msgstr "tace" -#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.mask" -msgstr "takunkumik" +msgid "workspace.shape.menu.exclude" +msgstr "kebe" -#: src/app/main/ui/dashboard/fonts.cljs -msgid "title.dashboard.font-providers" -msgstr "samar da jerin harufa - %s - Mazubin biruka" +msgid "workspace.shape.menu.flatten" +msgstr "mikad da abu" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.num-of-projects" -msgid_plural "labels.num-of-projects" -msgstr[0] "aiki" -msgstr[1] "aiyuka %s" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flip-horizontal" +msgstr "kifa ta tsaye" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flip-vertical" +msgstr "kifa ta kwance" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.libraries.text.multiple-typography-tooltip" -msgstr "Cire mahadar duka rabutun rubutu" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flow-start" +msgstr "fara malala" -msgid "shortcuts.start-editing" -msgstr "fara gyarawa" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.forward" +msgstr "kawo ta gaba" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay-dest" -msgstr "Juya mai murfi: %s" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.front" +msgstr "kawo zuwa gaba" -#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.graphics" -msgstr "zane zane" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.go-main" +msgstr "tafi ainihin wurin fal" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.pending-invitation" -msgstr "tukuna" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.group" +msgstr "rukuni" -msgid "workspace.path.actions.make-corner" -msgstr "ta kwana (%s)" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.hide" +msgstr "boye" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.line-height" -msgstr "tsawon layi" +msgid "workspace.shape.menu.hide-ui" +msgstr "nuna / boye UI" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "da'ira" +msgid "workspace.shape.menu.intersection" +msgstr "mahada" -msgid "modals.create-webhook.url.label" -msgstr "farashin URL" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.lock" +msgstr "kulle" -msgid "workspace.options.stroke-color" -msgstr "gigciye kalar" +#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.mask" +msgstr "takunkumik" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "11-30" +#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.paste" +msgstr "manna" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.copy-token" -msgstr "kwafar kyauta" +msgid "workspace.shape.menu.path" +msgstr "hanya" -msgid "dashboard.export-binary-multi" -msgstr "sauke %s kundayen manhajar fenfot(.penpot)" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-flex" +msgstr "cire sassaukan tsari" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.components" -msgstr "%s bangarori" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.reset-overrides" +msgstr "sake saita sokewa" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.title" -msgid_plural "modals.unpublish-shared-confirm.title" -msgstr[0] "rufe taska" -msgstr[1] "rufe taskoki" +msgid "workspace.shape.menu.restore-main" +msgstr "saita ainihin wurin" -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.no-elements" -msgstr "ba wasu abubuwan da ake daidaitawa wajen tsara fitarwa." +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.select-layer" +msgstr "zabi shimfida" -#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs -msgid "workspace.gradients.radial" -msgstr "a da'ira" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show" +msgstr "nuna" -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.cancel" -msgstr "ajiye asusu da soke shi" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-in-assets" +msgstr "nuna ta kusuwar kadara" -msgid "shortcuts.move-unit-left" -msgstr "Matsa da sashin hagu" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-main" +msgstr "nuna ainihin wurin" -msgid "inspect.attributes.stroke.style.mixed" -msgstr "gauraya" +msgid "workspace.shape.menu.thumbnail-remove" +msgstr "cire girman babban danyatsa" -msgid "shortcuts.toggle-colorpalette" -msgstr "Danna launukan kala" +msgid "workspace.shape.menu.thumbnail-set" +msgstr "kara kamar girman babban yatsa" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.outer" -msgstr "waje" +msgid "workspace.shape.menu.transform-to-path" +msgstr "sauya zuwa hanya" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-top-left" -msgstr "saman hagu" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.ungroup" +msgstr "raba rukunin" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.start" -msgstr "fara koyarwa" +msgid "workspace.shape.menu.union" +msgstr "hadakan" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.box-filter-all" -msgstr "duka kadara" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.unlock" +msgstr "bude" -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.invite-invalid" -msgstr "gaiyar ba ta yi ba" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.unmask" +msgstr "bude takunkumi" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.normal" -msgstr "na kullum" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.update-components-in-bulk" +msgstr "sabunta ainihin wurin" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.delete-multi-files" -msgstr "goge %s kundaye" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.update-main" +msgstr "sabunta ainihin wurin" -msgid "shortcuts.join-nodes" -msgstr "hada abubuwan" +msgid "workspace.sidebar.collapse" +msgstr "ruguza a'ajiyar bayani" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.preferences" -msgstr "fifiko" +msgid "workspace.sidebar.expand" +msgstr "kara yankin ma'agiyar bayani" -#: src/app/main/ui/static.cljs -msgid "labels.service-unavailable.desc-message" -msgstr "mu na cikin kula a tsarinka." +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.sidebar.history" +msgstr "labari (%s)" -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.vbottom" -msgstr "Daidaita kasa (%s)" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.sidebar.layers" +msgstr "shafi" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.font-variant-id" -msgstr "bambanci" +msgid "workspace.sidebar.layers.components" +msgstr "bangare" -#: src/app/main/ui/settings/options.cljs -msgid "labels.language" -msgstr "harshe" +msgid "workspace.sidebar.layers.frames" +msgstr "allo" -msgid "shortcut-subsection.text-editor" -msgstr "Rubutu" +msgid "workspace.sidebar.layers.groups" +msgstr "rukuni" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.shared-libraries" -msgstr "Rabban ma'adanai" +msgid "workspace.sidebar.layers.images" +msgstr "hoto" -msgid "workspace.shape.menu.exclude" -msgstr "kebe" +msgid "workspace.sidebar.layers.masks" +msgstr "takunkumi" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-delete-file" -msgid_plural "dashboard.success-delete-file" -msgstr[0] "an goge kundinka" -msgstr[1] "an goge kundayenka" +msgid "workspace.sidebar.layers.search" +msgstr "nemo shimfida" -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.message" -msgstr "ka tabbata ka na son goge fira? duk sharhi a nan za a goge matsaloli." +msgid "workspace.sidebar.layers.shapes" +msgstr "Siffa" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.rotation" -msgstr "juyawa" +msgid "workspace.sidebar.layers.texts" +msgstr "rubutu" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "... zane-zane, kayan kallo, tsarin qira, etc." +#: src/app/main/ui/workspace/sidebar/options/menus/svg_attrs.cljs, src/app/main/ui/inspect/attributes/svg.cljs +msgid "workspace.sidebar.options.svg-attrs.title" +msgstr "shigo da shi SVG halaye" -msgid "shortcuts.move-unit-up" -msgstr "Matsa da sashin samu" +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "workspace.sidebar.sitemap" +msgstr "shafi" -msgid "labels.upload" -msgstr "xorawa" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.sitemap" +msgstr "taswirar wuri" -msgid "onboarding-v2.welcome.desc2" -msgstr "" -"wurin da kowa zai iya koyo, fahimtar ta juna a kan fenfot, kasancewarta " -"manyan tawagar fenfot da sauran mutane." +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.assets" +msgstr "kadara" -#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.rename" -msgstr "sake suna" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.color-palette" +msgstr "farantin kala (%s)" -msgid "shortcuts.zoom-lense-decrease" -msgstr "Zuko raguwar ido" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.comments" +msgstr "ra'ayi (%s)" -msgid "modals.edit-webhook.title" -msgstr "gyara webhook" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.curve" +msgstr "kwana(%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.ellipse" +msgstr "siffar kwai (%s)" -msgid "workspace.undo.entry.single.shape" -msgstr "siffa" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.frame" +msgstr "allo (%s)" -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "workspace.sidebar.sitemap" -msgstr "shafi" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.image" +msgstr "hoto (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.width" -msgstr "fadi" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.move" +msgstr "motsa (%s)" -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.send" -msgstr "aika" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.path" +msgstr "hanya (%s)" -#: src/app/main/ui/workspace.cljs -msgid "title.workspace" -msgstr "%s - Mazubin biruka" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.rect" +msgstr "Rectangle (%s)" -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.no-matches-for" -msgstr "ba wanda ya yi daidai da “%s“" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.shortcuts" +msgstr "yanke (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.text-transform" -msgstr "canja rubutu" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text" +msgstr "rubutu (%s)" -msgid "errors.email-as-password" -msgstr "ba za ka iya amfani da imel ba a matsayin lambar tsaro ba" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text-palette" +msgstr "rubutub rubutu (%s)" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.duplicate-multi" -msgstr "kwafi %s kundaye" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.empty" +msgstr "babu labaran da su ka canja a yanzu" -msgid "shortcuts.line-height-dec" -msgstr "rage tsawon layi" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.delete" +msgstr "gogagge %s" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.view" -msgstr "gani" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.modify" +msgstr "gyaggyarawa %s" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.detach-instances-in-bulk" -msgstr "raba yanayin abin" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.move" +msgstr "motsa abun" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.scale" -msgstr "maauni" +msgid "workspace.undo.entry.multiple.circle" +msgstr "da'ira" -msgid "inspect.empty.more-info" -msgstr "qarin bayani a fagen lura" +msgid "workspace.undo.entry.multiple.color" +msgstr "kadarar kala" -#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs -msgid "notifications.profile-saved" -msgstr "an ajiye bayanai!" +msgid "workspace.undo.entry.multiple.component" +msgstr "bangare" -msgid "workspace.focus.focus-off" -msgstr "karka maida hankali" +msgid "workspace.undo.entry.multiple.curve" +msgstr "kwana" -msgid "shortcuts.toggle-fullscreen" -msgstr "Danna fuskar ta cika duka" +msgid "workspace.undo.entry.multiple.frame" +msgstr "allo" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "title.settings.access-tokens" -msgstr "karin bayani - Shiga alama" +msgid "workspace.undo.entry.multiple.group" +msgstr "rukunis" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-duplicate-file" -msgid_plural "dashboard.success-delete-file" -msgstr[0] "an kwafi kundinka" -msgstr[1] "an kwafi kundayenka" +msgid "workspace.undo.entry.multiple.media" +msgstr "kadarar zane" -#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.colors" -msgstr "kala" +msgid "workspace.undo.entry.multiple.multiple" +msgstr "abu" -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.owner" -msgstr "mai" +msgid "workspace.undo.entry.multiple.page" +msgstr "shafi" -msgid "shortcuts.select-prev" -msgstr "zabi shafin da ya gabata" +msgid "workspace.undo.entry.multiple.path" +msgstr "hanya" -#: src/app/main/ui/dashboard/grid.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-move-file" -msgstr "an tura aikinka" +msgid "workspace.undo.entry.multiple.rect" +msgstr "rectangles" -msgid "workspace.options.radius" -msgstr "digon tsakiyar da'ira" +msgid "workspace.undo.entry.multiple.shape" +msgstr "siffa" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.back" -msgstr "tura zuwa baya" +msgid "workspace.undo.entry.multiple.text" +msgstr "rubutu" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow" -msgstr "layin mashiw" +msgid "workspace.undo.entry.multiple.typography" +msgstr "rubutun rubuta kadara" -msgid "shortcuts.align-left" -msgstr "tsarin hagu" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.new" +msgstr "sabo %s" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.edit" -msgstr "tace" +msgid "workspace.undo.entry.single.circle" +msgstr "da'ira" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.ungroup" -msgstr "kashe daga kungiya" +msgid "workspace.undo.entry.single.color" +msgstr "kalar kadara" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.not-found" -msgstr "ba'a samu kadara ba" +msgid "workspace.undo.entry.single.component" +msgstr "bangarori" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fit-all" -msgstr "zuko yayi daidai da ko'ina" +msgid "workspace.undo.entry.single.curve" +msgstr "lankwasa" -#: src/app/main/ui/auth/register.cljs -msgid "auth.login-here" -msgstr "shiga nan" +msgid "workspace.undo.entry.single.frame" +msgstr "allo" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.subject" -msgstr "shugabanci" +msgid "workspace.undo.entry.single.group" +msgstr "rukuni" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-after-delay" -msgstr "Bayan jinkiri" +msgid "workspace.undo.entry.single.image" +msgstr "hoto" -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.create-team.placeholder" -msgstr "shigar da sabon sunan tawaga" +msgid "workspace.undo.entry.single.media" +msgstr "kadarar zanen hotuna" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-max-h" -msgstr "tsawo mafi yawa" +msgid "workspace.undo.entry.single.multiple" +msgstr "wani abu" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title" -msgstr "inuwa" +msgid "workspace.undo.entry.single.page" +msgstr "shafi" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.size" -msgstr "girma" +msgid "workspace.undo.entry.single.path" +msgstr "hanya" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.help-info" -msgstr "taimako & bayani" +msgid "workspace.undo.entry.single.rect" +msgstr "rectangle" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title-group" -msgstr "rukunin rubutu" +msgid "workspace.undo.entry.single.shape" +msgstr "siffa" msgid "workspace.undo.entry.single.text" msgstr "sako" -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.type-something" -msgstr "rubuta neman sakamako" - -msgid "shortcuts.mask" -msgstr "takunkumi" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-fixed" -msgstr "dasa" +msgid "workspace.undo.entry.single.typography" +msgstr "rubutun rubuta kadara" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.image" -msgstr "hoto (%s)" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.unknown" +msgstr "yanayi fiye da %s" -msgid "shortcuts.line-through" -msgstr "danna layin duk" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.title" +msgstr "labari" -msgid "workspace.undo.entry.single.path" -msgstr "hanya" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.dismiss" +msgstr "watsar" -msgid "errors.cannot-upload" -msgstr "kasa xora xan aiken kundi." +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "bayanai masu yawa" -msgid "onboarding.choice.team-up.create-team-placeholder" -msgstr "sanya sunan tawaga" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.there-are-updates" +msgstr "a kwai na zamani a rababban ma'ajiya" -msgid "shortcuts.move-fast-down" -msgstr "Matsa kasa da sauri" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.update" +msgstr "sabintawas" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.add-flex" -msgstr "kara sassaukan tsarit" +msgid "workspace.viewport.click-to-close-path" +msgstr "latsa kusa da hanya" diff --git a/frontend/translations/he.po b/frontend/translations/he.po index eafd1cd44..5ea29f18a 100644 --- a/frontend/translations/he.po +++ b/frontend/translations/he.po @@ -1,16 +1,16 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-10-16 04:09+0000\n" +"PO-Revision-Date: 2024-02-17 14:02+0000\n" "Last-Translator: Yaron Shahrabani \n" -"Language-Team: Hebrew \n" +"Language-Team: Hebrew " +"\n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " "n % 10 == 0) ? 2 : 3));\n" -"X-Generator: Weblate 5.1-dev\n" +"X-Generator: Weblate 5.4\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -171,6 +171,13 @@ msgstr "תנאי השירות" msgid "auth.terms-privacy-agreement" msgstr "יצירת חשבון חדש מהווה את הסכמתך לתנאי השירות ולמדיניות הפרטיות." +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"עצם יצירת חשבון חדש מהווה הסכמה ל[תנאי השירות](%s) ול[מדיניות הפרטיות](%s) " +"שלנו." + #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "שלחנו הודעת דוא״ל לאימות אל" @@ -285,6 +292,10 @@ msgstr "יצירת אסימון חדש" msgid "dashboard.access-tokens.create.success" msgstr "אסימון הגישה נוצר בהצלחה." +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "נא ללחוץ על הכפתור „יצירת אסימון חדש” כדי ליצור אחד חדש." + #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.empty.no-access-tokens" msgstr "אין לך אסימונים עדיין." @@ -329,6 +340,12 @@ msgstr "אין תאריך תפוגה" msgid "dashboard.access-tokens.personal" msgstr "אסימוני כניסה אישיים" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"אסימוני גישה אישיים הם דרך חלופית למערכת אימות הכניסה/סיסמה שלנו ומאפשרים " +"ליישום לגשת ל־API הפנימי של Penpot" + #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.token-will-expire" msgstr "האסימון יפוג ב־%s" @@ -501,9 +518,19 @@ msgstr "ייבוא קובצי Penpot" msgid "dashboard.import.analyze-error" msgstr "אופס! לא הצלחנו לייבא את הקובץ הזה" +msgid "dashboard.import.analyze-error.components-v2" +msgstr "קובץ עם רכיבים בגרסה 2 מופעל אך הצוות הזה לא תומך בזה עדיין." + msgid "dashboard.import.import-error" msgstr "אירעה תקלה בייבוא הקובץ. הוא לא ייובא." +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "קובץ יובא בהצלחה." +msgstr[1] "%s קבצים יובאו בהצלחה." +msgstr[2] "%s קבצים יובאו בהצלחה." +msgstr[3] "%s קבצים יובאו בהצלחה." + msgid "dashboard.import.import-warning" msgstr "חלק מהקבצים הכילו פריטים שגויים שהוסרו." @@ -869,6 +896,12 @@ msgstr "" msgid "errors.feature-not-supported" msgstr "אין תמיכה ביכולת ‚%s’." +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"נראה שאין התאמ בין היכולות הפעילות לבין הקובץ שניסית לפתוח. יש להחיל הסבות " +"עבור ‚%s’ לפני שיתאפשר לפתוח את הקובץ הזה." + #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -917,6 +950,9 @@ msgstr "סיסמת האימות חייבת להיות תואמת" msgid "errors.password-too-short" msgstr "הסיסמה חייבת להיות באורך 8 תווים לפחות" +msgid "errors.paste-data-validation" +msgstr "נתונים שגויים בלוח הגזירים" + msgid "errors.profile-blocked" msgstr "הפרופיל חסום" @@ -930,6 +966,10 @@ msgstr "הודעות הדוא״ל לפרופיל שלך מושתקות (דיוו msgid "errors.registration-disabled" msgstr "ההרשמה מושבתת כרגע." +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "התגלתה יכולת לא תואמת ‚%s’" + msgid "errors.team-leave.insufficient-members" msgstr "אין מספיק חברים כדי לעזוב את הצוות, כנראה יהיה עליך למחוק אותו." @@ -949,6 +989,13 @@ msgstr "אירעה שגיאה בלתי צפויה." msgid "errors.unexpected-token" msgstr "אסימון בלתי ידוע" +msgid "errors.validation" +msgstr "שגיאת אימות" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "מספר גרסת הקובץ לא תואם" + msgid "errors.webhooks.connection" msgstr "שגיאת תקשורת, הכתובת אינה נגישה" @@ -1180,6 +1227,9 @@ msgstr "ללא" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "ראשונות גדולות" +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "ביטול הגדרה" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "אותיות גדולות" @@ -1587,6 +1637,9 @@ msgstr "תפקיד" msgid "labels.save" msgstr "שמירה" +msgid "labels.search" +msgstr "חיפוש" + msgid "labels.search-font" msgstr "חיפוש גופן" @@ -1611,6 +1664,9 @@ msgstr "השירות אינו זמין" msgid "labels.settings" msgstr "הגדרות" +msgid "labels.share" +msgstr "שיתוף" + msgid "labels.share-prototype" msgstr "שיתוף אבטיפוס" @@ -1680,10 +1736,33 @@ msgstr "(אני)" msgid "labels.your-account" msgstr "החשבון שלך" +msgid "media.choose-image" +msgstr "בחירת תמונה" + +msgid "media.gradient" +msgstr "מדרג" + +msgid "media.image" +msgstr "תמונה" + +msgid "media.linear" +msgstr "קווי" + #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "התמונה נטענת…" +msgid "media.radial" +msgstr "מעגלי" + +msgid "media.solid" +msgstr "אחיד" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"הספרייה שלך ריקה. לאחר שנוספה כתיקייה משותפת, הנכסים שנוצרים על ידיך יהיו " +"זמינים לצד שאר הקבצים שלך. לפרסם אותה?" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -1801,6 +1880,12 @@ msgstr "למחוק את הדיון הזה? כל התגובות בשרשור תי msgid "modals.delete-comment-thread.title" msgstr "מחיקת דיון" +msgid "modals.delete-component-annotation.message" +msgstr "למחוק את הסימון הזה?" + +msgid "modals.delete-component-annotation.title" +msgstr "מחיקת סימון" + #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-file-confirm.accept" msgstr "מחיקת קובץ" @@ -1866,6 +1951,22 @@ msgstr[1] "מחיקת קבצים" msgstr[2] "מחיקת קבצים" msgstr[3] "מחיקת קבצים" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "לא מופעל באף קובץ." +msgstr[1] "לא מופעלים באף קובץ." +msgstr[2] "לא מופעלים באף קובץ." +msgstr[3] "לא מופעלים באף קובץ." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.scd-message" +msgid_plural "modals.delete-shared-confirm.activated.scd-message" +msgstr[0] "הספרייה הזאת מופעלת כאן: " +msgstr[1] "הספריות האלו מופעלות כאן: " +msgstr[2] "הספריות האלו מופעלות כאן: " +msgstr[3] "הספריות האלו מופעלות כאן: " + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-shared-confirm.message" @@ -1908,6 +2009,14 @@ msgstr "למחוק את החבר הזה מהצוות?" msgid "modals.delete-team-member-confirm.title" msgstr "למחוק חבר בצוות" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "נכסים שכבר נעשה בהם שימוש בקובץ הזה יישארו שם (אף עיצוב לא ייפגע)." +msgstr[1] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." +msgstr[2] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." +msgstr[3] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." + msgid "modals.delete-webhook.accept" msgstr "מחיקת התליה" @@ -2180,12 +2289,33 @@ msgstr "מדריך למתנדבים" msgid "onboarding-v2.welcome.title" msgstr "ברוך בואך ל־Penpot!" +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "להמשיך ביצירת צוות" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "להמשיך בלי צוות" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "ליצור צוות ולהזמין" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "ליצור צוות ולשלוח הזמנות" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "אפשר להזמין בהמשך" + msgid "onboarding.choice.team-up.create-team-desc" msgstr "לאחר מתן שם לצוות שלך, יתאפשר לך להזמין אנשים להצטרף." msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "נא למלא את שם הצוות" +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "ליצור צוות" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "ליצור צוות בלי לשלוח הזמנות" + msgid "onboarding.choice.team-up.invite-members" msgstr "הזמנת חברים" @@ -2195,6 +2325,12 @@ msgstr "רצוי לזכור לכלול את כולם. מפתחים, מעצבים msgid "onboarding.choice.team-up.roles" msgstr "הזמנה עם התפקיד:" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "להתחיל בלי צוות" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "אפשר ליצור צוות בהמשך." + msgid "onboarding.newsletter.accept" msgstr "כן, להירשם" @@ -2291,14 +2427,30 @@ msgstr "היכרות מעמיקה יותר עם Penpot" msgid "questions.figma" msgstr "Figma" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "מייסד/סגן נשיא" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.freelancer" msgstr "יש לי עסק משלי" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "הורדת הקוד מהמיזם הצוותי שלי " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "… עיצוב מנשק, נכסים חזותיים, מערכות עיצוב, וכו׳." + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.invision" msgstr "InVision" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "להשאיר משוב למיזם הצוותי שלי" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.lets-get-started" msgstr "מתחילים!" @@ -2363,10 +2515,40 @@ msgstr "התחלה" msgid "questions.start-to-work-on-my-project" msgstr "התחלת עבודה על מיזם משלי" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "סטודנט/ית או מרצה" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.team-size" msgstr "מה גודל הצוות שלך?" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "לבדוק את Penpot ולראות אם הוא מתאים לצוות שלי " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "אפשר להתנסות לפני שימוש ב־Penpot אצלך בעבודה" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "… תרשימי מתאר, סיפורי ותהליכי משתמשים, עצי ניווט ועוד." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "עבודה עם רעיונות למימוש" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"המשוב שלך יסייע לנו להבין מה הם ההרגלים וההעדפות שלך כדי שנוכל להמשיך להפוך " +"את Penpot לכלי מהנה ושימושי." + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "ניתוק" + #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, @@ -2823,6 +3005,9 @@ msgstr "הצגת/הסתרת סרגלים" msgid "shortcuts.toggle-textpalette" msgstr "החלפת לוח טקסט" +msgid "shortcuts.toggle-theme" +msgstr "החלפת ערכת עיצוב" + msgid "shortcuts.toggle-visibility" msgstr "החלפת מצב הצגה" @@ -3160,6 +3345,45 @@ msgstr "התמרת טקסט" msgid "workspace.assets.ungroup" msgstr "פירוק קבוצה" +msgid "workspace.context-menu.grid-cells.area" +msgstr "יצירת שטח" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "יצירת לוח" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "מיזוג תאים" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "הוספת עמודה מימין" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "הוספת עמודה משמאל" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "מחיקת עמודה" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "מחיקת עמודה וצורות" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "שכפול עמודה" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "הוספת שורה מתחת" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "הוספת שורה למעלה" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "מחיקת שורה" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "מחיקת שורה וצורות" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "שכפול שורה" + msgid "workspace.focus.focus-mode" msgstr "מצב מיקוד" @@ -3283,6 +3507,12 @@ msgstr "הצגת סרגלים" msgid "workspace.header.menu.show-textpalette" msgstr "הצגת לוח גופנים" +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "החלפה לערכת עיצוב כהה" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "החלפה לערכת עיצוב בהירה" + msgid "workspace.header.menu.undo" msgstr "החזרה" @@ -3334,6 +3564,21 @@ msgstr "מסך מלא" msgid "workspace.header.zoom-selected" msgstr "התמקדות על הנבחר" +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "עריכת רשת" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "יציאה מהמערכת" + +msgid "workspace.layout_grid.editor.title" +msgstr "רשת עריכה" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "בוצע" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "איתור" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "הוספה" @@ -3346,6 +3591,10 @@ msgstr "%s צבעים" msgid "workspace.libraries.colors.empty-palette" msgstr "אין עדיין סגנונות צבע בספרייה שלך" +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "עדיין אין סוגי טיפוגרפיה בספרייה שלך" + #: src/app/main/ui/workspace/colorpicker/libraries.cljs, #: src/app/main/ui/workspace/colorpalette.cljs msgid "workspace.libraries.colors.file-library" @@ -3400,6 +3649,10 @@ msgstr "ספרייה" msgid "workspace.libraries.library-updates" msgstr "עדכוני ספרייה" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "בטעינה…" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "אין ספריות משותפות שדורשות עדכון" @@ -3471,6 +3724,27 @@ msgstr "חיתוך התוכן" msgid "workspace.options.component" msgstr "רכיב" +msgid "workspace.options.component.annotation" +msgstr "הסבר" + +msgid "workspace.options.component.copy" +msgstr "העתקה" + +msgid "workspace.options.component.create-annotation" +msgstr "יצירת הסבר" + +msgid "workspace.options.component.edit-annotation" +msgstr "עריכת הסבר" + +msgid "workspace.options.component.main" +msgstr "ראשי" + +msgid "workspace.options.component.swap" +msgstr "החלפת רכיב" + +msgid "workspace.options.component.swap.empty" +msgstr "עדיין אין נכסים בתיקייה הזאת" + #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "הגבלות" @@ -3566,6 +3840,10 @@ msgstr "מילוי" msgid "workspace.options.flows.add-flow-start" msgstr "הוספת תחילת זרימה" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "זרימה" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "התחלת זרימה" @@ -3669,6 +3947,9 @@ msgstr "מילוי קבוצה" msgid "workspace.options.group-stroke" msgstr "מתאר קבוצה" +msgid "workspace.options.guides.title" +msgstr "קווים מנחים" + msgid "workspace.options.height" msgstr "גובה" @@ -4215,14 +4496,26 @@ msgstr "מתאר" msgid "workspace.options.stroke-cap.circle-marker" msgstr "סמן עגול" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "עיגול" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "סמן יהלום" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "יהלום" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "חץ קו" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "חץ" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "ללא" @@ -4239,10 +4532,18 @@ msgstr "ריבוע" msgid "workspace.options.stroke-cap.square-marker" msgstr "סמן ריבוע" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "מרובע" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "חץ משולש" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "משולש" + msgid "workspace.options.stroke-color" msgstr "צבע מתאר" @@ -4432,6 +4733,9 @@ msgstr "הרחקה לאחור" msgid "workspace.shape.menu.copy" msgstr "העתקה" +msgid "workspace.shape.menu.create-annotation" +msgstr "יצירת הסבר" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.create-artboard-from-selection" msgstr "בחירה ללוח" @@ -4710,6 +5014,13 @@ msgstr "טקסט (%s)" msgid "workspace.toolbar.text-palette" msgstr "טיפוגרפיות (%s)" +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**מצב חקירה** (צפייה בלבד)" + +msgid "workspace.top-bar.read-only.done" +msgstr "בוצע" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "אין שינויים היסטוריים עד כה" @@ -4843,146 +5154,3 @@ msgstr "עדכון" msgid "workspace.viewport.click-to-close-path" msgstr "לחיצה תסגור את הנתיב" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "אפשר להתנסות לפני שימוש ב־Penpot אצלך בעבודה" - -msgid "dashboard.import.import-message" -msgid_plural "dashboard.import.import-message" -msgstr[0] "קובץ יובא בהצלחה." -msgstr[1] "%s קבצים יובאו בהצלחה." -msgstr[2] "%s קבצים יובאו בהצלחה." -msgstr[3] "%s קבצים יובאו בהצלחה." - -msgid "modals.delete-component-annotation.message" -msgstr "למחוק את הסימון הזה?" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.scd-message" -msgid_plural "modals.delete-shared-confirm.activated.scd-message" -msgstr[0] "הספרייה הזאת מופעלת כאן: " -msgstr[1] "הספריות האלו מופעלות כאן: " -msgstr[2] "הספריות האלו מופעלות כאן: " -msgstr[3] "הספריות האלו מופעלות כאן: " - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.no-files-message" -msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "לא מופעל באף קובץ." -msgstr[1] "לא מופעלים באף קובץ." -msgstr[2] "לא מופעלים באף קובץ." -msgstr[3] "לא מופעלים באף קובץ." - -msgid "modals.delete-component-annotation.title" -msgstr "מחיקת סימון" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "לבדוק את Penpot ולראות אם הוא מתאים לצוות שלי " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "סטודנט/ית או מרצה" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "להשאיר משוב למיזם הצוותי שלי" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"אסימוני גישה אישיים הם דרך חלופית למערכת אימות הכניסה/סיסמה שלנו ומאפשרים " -"ליישום לגשת ל־API הפנימי של Penpot" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "נא ללחוץ על הכפתור „יצירת אסימון חדש” כדי ליצור אחד חדש." - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"הספרייה שלך ריקה. לאחר שנוספה כתיקייה משותפת, הנכסים שנוצרים על ידיך יהיו " -"זמינים לצד שאר הקבצים שלך. לפרסם אותה?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "… עיצוב מנשק, נכסים חזותיים, מערכות עיצוב, וכו׳." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "עבודה עם רעיונות למימוש" - -msgid "workspace.options.component.copy" -msgstr "העתקה" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"המשוב שלך יסייע לנו להבין מה הם ההרגלים וההעדפות שלך כדי שנוכל להמשיך להפוך " -"את Penpot לכלי מהנה ושימושי." - -msgid "workspace.options.component.create-annotation" -msgstr "יצירת הסבר" - -msgid "workspace.options.component.edit-annotation" -msgstr "עריכת הסבר" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "הורדת הקוד מהמיזם הצוותי שלי " - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "מרובע" - -msgid "workspace.options.component.main" -msgstr "ראשי" - -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "עדיין אין סוגי טיפוגרפיה בספרייה שלך" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "נכסים שכבר נעשה בהם שימוש בקובץ הזה יישארו שם (אף עיצוב לא ייפגע)." -msgstr[1] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." -msgstr[2] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." -msgstr[3] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." - -msgid "workspace.options.component.annotation" -msgstr "הסבר" - -msgid "workspace.layout_grid.editor.title" -msgstr "רשת עריכה" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "… תרשימי מתאר, סיפורי ותהליכי משתמשים, עצי ניווט ועוד." - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "יהלום" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "ניתוק" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "משולש" - -msgid "workspace.shape.menu.create-annotation" -msgstr "יצירת הסבר" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "חץ" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "מייסד/סגן נשיא" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "עיגול" diff --git a/frontend/translations/hr.po b/frontend/translations/hr.po index a0e38637e..9075ac5de 100644 --- a/frontend/translations/hr.po +++ b/frontend/translations/hr.po @@ -2697,7 +2697,6 @@ msgstr "Omogući dinamičko poravnanje" msgid "workspace.header.menu.enable-scale-text" msgstr "Omogući skaliranje teksta" - #: src/app/main/ui/workspace/header.cljs #, fuzzy msgid "workspace.header.menu.enable-snap-guides" diff --git a/frontend/translations/id.po b/frontend/translations/id.po index 037737bdd..86d745eef 100644 --- a/frontend/translations/id.po +++ b/frontend/translations/id.po @@ -1,15 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-10-07 12:12+0000\n" +"PO-Revision-Date: 2024-04-08 15:01+0000\n" "Last-Translator: Linerly \n" -"Language-Team: Indonesian \n" +"Language-Team: Indonesian " +"\n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.1-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -176,6 +176,13 @@ msgstr "" "Ketika membuat akun baru, Anda menyetujui kebijakan layanan dan kebijakan " "privasi kami." +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Ketika membuat akun baru, Anda menyetujui [persyaratan layanan](%s) dan " +"[kebijakan privasi](%s) kami." + #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "Kami telah mengirimkan surel verifikasi ke" @@ -528,6 +535,9 @@ msgstr "Impor berkas Penpot" msgid "dashboard.import.analyze-error" msgstr "Aduh! Kami tidak dapat mengimpor berkas ini" +msgid "dashboard.import.analyze-error.components-v2" +msgstr "Berkas dengan komponen v2 diaktifkan tetapi tim ini belum mendukungnya." + msgid "dashboard.import.import-error" msgstr "Terdapat masalah saat mengimpor berkas. Berkasnya tidak terimpor." @@ -894,6 +904,13 @@ msgstr "" msgid "errors.feature-not-supported" msgstr "Fitur '%s' tidak didukung." +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Sepertinya ada ketidakcocokan antara fitur yang diaktifkan dengan fitur " +"berkas yang sedang Anda buka. Migrasi untuk '%s' harus diterapkan sebelum " +"berkasnya dapat dibuka." + #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -944,6 +961,9 @@ msgstr "Kata sandi konfirmasi harus cocok" msgid "errors.password-too-short" msgstr "Kata sandi setidaknya 8 karakter" +msgid "errors.paste-data-validation" +msgstr "Data tidak valid dalam papan klip" + msgid "errors.profile-blocked" msgstr "Profil diblokir" @@ -957,6 +977,10 @@ msgstr "Profil Anda membisukan surel (laporan spam atau lompatan tinggi)." msgid "errors.registration-disabled" msgstr "Pendaftaran saat ini dinonaktifkan." +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Fitur '%s' tidak kompatibel terdeteksi" + msgid "errors.team-leave.insufficient-members" msgstr "" "Anggota tidak cukup untuk meninggalkan tim, Anda mungkin ingin menghapusnya " @@ -980,6 +1004,13 @@ msgstr "Sebuah kesalahan tidak terduga terjadi." msgid "errors.unexpected-token" msgstr "Token tidak diketahui" +msgid "errors.validation" +msgstr "Kesalahan Validasi" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Berkas memiliki nomor versi tidak kompatibel" + msgid "errors.webhooks.connection" msgstr "Kesalahan koneksi, URL tidak dapat diraih" @@ -1214,6 +1245,9 @@ msgstr "Tidak ada" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "Huruf Judul" +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Tidak ditetapkan" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Huruf Besar" @@ -1615,6 +1649,9 @@ msgstr "Peran" msgid "labels.save" msgstr "Simpan" +msgid "labels.search" +msgstr "Cari" + msgid "labels.search-font" msgstr "Cari fon" @@ -1639,6 +1676,9 @@ msgstr "Layanan Tidak Tersedia" msgid "labels.settings" msgstr "Pengaturan" +msgid "labels.share" +msgstr "Bagikan" + msgid "labels.share-prototype" msgstr "Bagikan prototipe" @@ -1708,10 +1748,34 @@ msgstr "(Anda)" msgid "labels.your-account" msgstr "Akun Anda" +msgid "media.choose-image" +msgstr "Pilih gambar" + +msgid "media.gradient" +msgstr "Gradien" + +msgid "media.image" +msgstr "Gambar" + +msgid "media.linear" +msgstr "Linear" + #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Memuat gambar…" +msgid "media.radial" +msgstr "Radial" + +msgid "media.solid" +msgstr "Padat" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Pustaka Anda saat ini kosong. Ketika ditambahkan sebagai Pustaka Terbagi, " +"aset yang Anda buat akan tersedia untuk digunakan bersama dengan berkas " +"Anda. Apakah Anda yakin ingin menerbitkannya?" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -2240,6 +2304,21 @@ msgstr "Panduan berkontribusi" msgid "onboarding-v2.welcome.title" msgstr "Selamat datang di Penpot!" +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Lanjutkan membuat tim" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Lanjutkan tanpa tim" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Buat tim & undang" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Buat tim dan kirim undangan" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Anda nanti akan dapat mengundang" + msgid "onboarding.choice.team-up.create-team-desc" msgstr "" "Setelah memberi nama tim, Anda akan dapat mengundang orang-orang untuk " @@ -2248,6 +2327,12 @@ msgstr "" msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "Masukkan nama tim" +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Buat tim" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Buat tim tanpa mengundang" + msgid "onboarding.choice.team-up.invite-members" msgstr "Undang anggota" @@ -2259,6 +2344,12 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Undang dengan peran:" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Mulai tanpa tim" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Anda nanti akan dapat membuat tim." + msgid "onboarding.newsletter.accept" msgstr "Ya, berlangganan" @@ -2475,6 +2566,10 @@ msgstr "" "Masukan Anda akan membantu kami mengerti kebiasaan dan preferensi Anda " "supaya kami dapat membuat Penpot sebuah alat yang berguna dan nyaman." +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Copot" + #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, @@ -2931,6 +3026,9 @@ msgstr "Tampilkan/sembunyikan penggaris" msgid "shortcuts.toggle-textpalette" msgstr "Alih palet teks" +msgid "shortcuts.toggle-theme" +msgstr "Ubah tema" + msgid "shortcuts.toggle-visibility" msgstr "Alih keterlihatan" @@ -3265,6 +3363,45 @@ msgstr "Transformasi Teks" msgid "workspace.assets.ungroup" msgstr "Lepas kelompok" +msgid "workspace.context-menu.grid-cells.area" +msgstr "Buat area" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Buat papan" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Gabungkan sel" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Tambah 1 kolom ke kanan" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Tambah 1 kolom ke kiri" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Hapus kolom" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Hapus kolom dan bentuk" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Gandakan kolom" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Tambah 1 baris di bawah" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Tambah 1 baris di atas" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Hapus baris" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Hapus baris dan bentuk" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Gandakan baris" + msgid "workspace.focus.focus-mode" msgstr "Mode fokus" @@ -3388,6 +3525,12 @@ msgstr "Tampilkan penggaris" msgid "workspace.header.menu.show-textpalette" msgstr "Tampilkan palet fon" +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Ubah ke tema gelap" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "Ubah ke tema terang" + msgid "workspace.header.menu.undo" msgstr "Urungkan" @@ -3439,9 +3582,21 @@ msgstr "Layar penuh" msgid "workspace.header.zoom-selected" msgstr "Zum ke terpilih" +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Sunting kisi" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Keluar" + msgid "workspace.layout_grid.editor.title" msgstr "Kisi penyuntingan" +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Selesai" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Cari lokasi" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Tambahkan" @@ -3512,6 +3667,10 @@ msgstr "PUSTAKA" msgid "workspace.libraries.library-updates" msgstr "PEMBARUAN PUSTAKA" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Memuat…" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "Tidak ada Pustaka Terbagi yang membutuhkan pembaruan" @@ -3586,12 +3745,24 @@ msgstr "Komponen" msgid "workspace.options.component.annotation" msgstr "Anotasi" +msgid "workspace.options.component.copy" +msgstr "Salin" + msgid "workspace.options.component.create-annotation" msgstr "Buat anotasi" msgid "workspace.options.component.edit-annotation" msgstr "Sunting anotasi" +msgid "workspace.options.component.main" +msgstr "Utama" + +msgid "workspace.options.component.swap" +msgstr "Ganti komponen" + +msgid "workspace.options.component.swap.empty" +msgstr "Belum ada aset dalam pustaka ini" + #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Pasangan" @@ -3684,6 +3855,10 @@ msgstr "Isian" msgid "workspace.options.flows.add-flow-start" msgstr "Tambahkan awalan alur" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Alur" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "Awalan alur" @@ -3787,6 +3962,9 @@ msgstr "Isian kelompok" msgid "workspace.options.group-stroke" msgstr "Sapuan kelompok" +msgid "workspace.options.guides.title" +msgstr "Panduan" + msgid "workspace.options.height" msgstr "Tinggi" @@ -4333,14 +4511,26 @@ msgstr "Sapuan" msgid "workspace.options.stroke-cap.circle-marker" msgstr "Penanda lingkaran" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Lingkaran" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "Penanda berlian" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Berlian" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "Panah garis" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Tanda panah" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "Tidak ada" @@ -4357,10 +4547,18 @@ msgstr "Kotak" msgid "workspace.options.stroke-cap.square-marker" msgstr "Penanda kotak" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Persegi panjang" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "Panah segi tiga" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Segitiga" + msgid "workspace.options.stroke-color" msgstr "Warna sapuan" @@ -4831,6 +5029,13 @@ msgstr "Teks (%s)" msgid "workspace.toolbar.text-palette" msgstr "Tipografi (%s)" +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**Mode inspeksi** (Hanya Tampilan)" + +msgid "workspace.top-bar.read-only.done" +msgstr "Selesai" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Tidak ada riwayat perubahan sejauh ini" @@ -4964,39 +5169,3 @@ msgstr "Perbarui" msgid "workspace.viewport.click-to-close-path" msgstr "Klik untuk menutup jalur" - -msgid "workspace.options.component.copy" -msgstr "Salin" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Persegi panjang" - -msgid "workspace.options.component.main" -msgstr "Utama" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Berlian" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Copot" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Segitiga" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Tanda panah" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Pustaka Anda saat ini kosong. Ketika ditambahkan sebagai Pustaka Terbagi, " -"aset yang Anda buat akan tersedia untuk digunakan bersama dengan berkas " -"Anda. Apakah Anda yakin ingin menerbitkannya?" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Lingkaran" diff --git a/frontend/translations/ig.po b/frontend/translations/ig.po new file mode 100644 index 000000000..79a03c878 --- /dev/null +++ b/frontend/translations/ig.po @@ -0,0 +1,2098 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2024-02-14 08:02+0000\n" +"Last-Translator: Alejandro Alonso \n" +"Language-Team: Igbo " +"\n" +"Language: ig\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.4-dev\n" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.check-your-email" +msgstr "Nyoo ozi- n gị ma pịa na njikọ inyocha ma bido jiri ite mkpịsị rụwa ọrụ ." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.confirm-password" +msgstr "kpebie akara mpibanye" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-account" +msgstr "mebeta akara ozigosi" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-profile" +msgstr "Chọọ nọọ ị nwa ya. ?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.demo-warning" +msgstr "" +"Ihe bụ ọrụ ozigosi ,e jile ya rụọ ezigbo ọrụ , ọrụ ndị a ga-ekpochapụ site " +"na oge ruo na oge" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.email" +msgstr "Ozi- n" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.forgot-password" +msgstr "Chefuru akara mpibanye ?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.fullname" +msgstr "Aha n'uju" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.login-here" +msgstr "Banye ebe a" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-submit" +msgstr "Banye" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-title" +msgstr "Ihe ịtụnanya ịhụ gị !" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-github-submit" +msgstr "Obi Git" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-gitlab-submit" +msgstr "Ụlọ nchọcha Git" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-google-submit" +msgstr "Gọgụlụ" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-ldap-submit" +msgstr "LDAP" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-oidc-submit" +msgstr "Mepe ID" + +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "Aha ga-enweriri ụfọdụ mkpụrụ edemede karịa oghere ." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "Aha ga-enweriri ọ karịa mkpụrụ okwu narị abụọ na iri ise" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.new-password" +msgstr "Pinye akara mpịbanye ọhụrụ" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.invalid-token-error" +msgstr "Ọdịmara e nweghachitere adabaghị ." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.password-changed-successfully" +msgstr "Akara mpịbanye a gbanwere gara aga" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.profile-not-verified" +msgstr "E nyochaghị nchịkọta , Biko nyocha nchịkọta tupu ị gaa n'ihu." + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.recovery-token-sent" +msgstr "E zigara akara njikọ nnweghachi akara mpibanye n'igbe mbata ozi gị ." + +#: src/app/main/ui/auth/verify_token.cljs +msgid "auth.notifications.team-invitation-accepted" +msgstr "Sonyere n'otu nke ọma" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-length-hint" +msgstr "Ọ karịa mkpụrụ ederede asatọ" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "Akara mpịbanye ga-enweriri ụfọdụ leta/akara mpị karịa oghere ." + +msgid "auth.privacy-policy" +msgstr "Iwu oñiño onwe" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-submit" +msgstr "Nweghachite akara mpịbanye" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-subtitle" +msgstr "Anyị ga-ezita ozi n na ndụmọdụ" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-title" +msgstr "Chefuru akara mpịbanye ?" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.recovery-submit" +msgstr "Gbanye akara mpịbanye." + +#: src/app/main/ui/auth/login.cljs +msgid "auth.register" +msgstr "E nweghị ebe Ntinye ihe ma kịta?" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.register-submit" +msgstr "Mepee ebe Ntinye ihe" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-subtitle" +msgstr "Ọ bụ n'efu , ọ bụ ebe nsị a jere oje" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-title" +msgstr "Mepee ebe ntinye ihe" + +#: src/app/main/ui/auth.cljs +msgid "auth.sidebar-tagline" +msgstr "Nsina ghere oghe iji mee nse na atụtụ" + +msgid "auth.terms-of-service" +msgstr "Ọnọdụ ọrụ" + +msgid "auth.terms-privacy-agreement" +msgstr "" +"Mgbe Ị na-emepe akara mbata ọhụrụ , ị ga-ekwe nye n'ọnọdụ ọrụ anyị na iwu " +"oñiño onwe" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.verification-email-sent" +msgstr "Anyị ezigaala ozi nnyocha na" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...onyinye aha, nkọwa gasị, ngwa ire ahịa dịrị gabazịa." + +msgid "common.publish" +msgstr "bipụta" + +msgid "common.share-link.all-users" +msgstr "Ndị niile ji ite mkpịsị arụ ọrụ" + +msgid "common.share-link.current-tag" +msgstr "(kee ugbu a )" + +msgid "common.share-link.destroy-link" +msgstr "Mebie njiko" + +msgid "common.share-link.get-link" +msgstr "Weta njiko" + +msgid "common.share-link.link-copied-success" +msgstr "E setere njiko nke ọma" + +msgid "common.share-link.manage-ops" +msgstr "Jikwa ikike" + +msgid "common.share-link.permissions-can-comment" +msgstr "nwere ike ikwu okwu" + +msgid "common.share-link.permissions-can-inspect" +msgstr "Nwere Ike inyocha akara" + +msgid "common.share-link.permissions-hint" +msgstr "Onye ọ bụla ga-enwe ohere mbanye" + +msgid "common.share-link.permissions-pages" +msgstr "Ihu akwụkwọ ekekoritara" + +msgid "common.share-link.placeholder" +msgstr "Njikọ e nwere ike ikekorita ga-apụta" + +msgid "common.share-link.team-members" +msgstr "Sọọsọ ndị otu" + +msgid "common.share-link.title" +msgstr "Kee atụ gasị" + +msgid "common.unpublish" +msgstr "Ebiputaghị" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.text" +msgstr "" +"Ite mkpịsị bụ maka otu . Kpọọ ndị otu ka arụkọta ọnụ on arụmarụ na ederede " +"ọnụ" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.title" +msgstr "Jikota ọnụ !" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.info" +msgstr "Mụọ ntọala na ite mkpịsị maka iji nkuzi mmemmekwa eme ihe egwu" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.start" +msgstr "Bido ọmụmụ" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.title" +msgstr "Nkuzi mmemmekwa" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.info" +msgstr "Mee ngagharị na ite mkpịsị ma mata isi a gwara ya." + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.start" +msgstr "Bido njem" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.title" +msgstr "Aba ngagharị" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "Mepụta ọdịmara ọhụrụ" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "Mmepụtara ọdịmara nnweta gara nke ọma ." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "Pịa mpi \"Nweta ọdịmara ọhụrụ \" inweta otu ." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "A chọrọ aha" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "Mkpụrụ ụbọchị narị na iri asatọ" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "Mkpụrụ ụbọchị iri atọ" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "Mkpụrụ ụbọchị iri isii" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "Mkpụrụ ụbọchị iri itoolu" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "Ncha ncha" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "Mebiri na%s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "Na-emebi na%s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.no-expiration" +msgstr "Enweghị ụbọchị mmebi" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "Ọdịmara nkeonwe" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"Ọdịmara nnweta nke onwe na-arụ ọrụ dị ka mgbamonwe mbanye anyị /akara " +"mpịbanye e nwere ike iji usoro mbinye aka kwe ka ngwa nweta ndịnime ite " +"mkpịsị API" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "Ọdịmara ga-emebi na%s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "Ọdịmara enweghị ụbọchị mmebi" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.add-shared" +msgstr "Tinye dị ka ọ a nkwekọrịta" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.change-email" +msgstr "Gbanwee ozi - n" + +#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs +msgid "dashboard.copy-suffix" +msgstr "(sere)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.create-new-team" +msgstr "Mebe otu ọhụrụ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.default-team-name" +msgstr "Ite mkpịsị gị" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.delete-team" +msgstr "kacha otu" + +msgid "dashboard.download-binary-file" +msgstr "Butuo ederede ite mkpịsị (.penpot)" + +msgid "dashboard.download-standard-file" +msgstr "Butuo ederede tozuru etozu (.svg + .json)" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate" +msgstr "mee oyiri" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate-multi" +msgstr "Mee o yiri %s ederede" + +#: src/app/main/ui/dashboard/grid.cljs +#, markdown +msgid "dashboard.empty-placeholder-drafts" +msgstr "" +"Ederede a tinyere n'ọba ederede ga-apụta ebe a. Gbalịa ikesa ma ọ bụ tinye " +"site n'[Ọba ederede na ndebiri anyị ](https://itemkpịsị.app/ọba ederede " +"gasị-ndebiri gasị.html)." + +msgid "dashboard.export-binary-multi" +msgstr "Butuo %s ederede ite mkpịsị (.penpot)" + +msgid "dashboard.export-frames" +msgstr "Bupu bọọdụ dị ka PDF" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-frames.title" +msgstr "Bupu dị ka PDF" + +msgid "dashboard.export-multi" +msgstr "Bupu %s ederede Ite mkpịsị" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-multiple.selected" +msgstr "A họrọ %s nke %s ndị na" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to" +msgstr "" +"Ị nwere ike ị tinye ntọala mbupu na ndịna site na ngwongwo nse (n'ala akụkụ " +"aka nri ihe ndepụta)" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to-link" +msgstr "Ozi etu esi ahazi mbupu n'ite mkpịsị" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.no-elements" +msgstr "E nweghị ndịna ọ bụla na ntọala mbupu" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.title" +msgstr "Nhọrọ mbupu" + +msgid "dashboard.export-standard-multi" +msgstr "Buto %s ederede tozuru etozu (.svg + .json)" + +msgid "dashboard.export.detail" +msgstr "* Nwere Ike ịgụnye ngwa , esereese gasị, agwụgwara na/ma ọ bụ akara nkụpụta." + +msgid "dashboard.export.options.all.message" +msgstr "" +"A ga-atinye ederede nwere ọba ederede nkekọrịta ma gụnyere mbupu , ma " +"jidekwa ụkpụrụ njikọ ha" + +msgid "dashboard.export.options.all.title" +msgstr "Bupu ọba ederede nkekọrịta" + +msgid "dashboard.export.options.detach.message" +msgstr "" +"Agaghị a tinye ọba ederede nkekọrịta na mbupu ma o nweghị ihe nnwe a ga a " +"tinye ọ a ederede . " + +msgid "dashboard.export.options.merge.title" +msgstr "Tinye ihe nnwe ọba ederede nkekọrịta n'ime ọ a ederede." + +msgid "dashboard.export.title" +msgstr "Ederede mbupu gasị" + +msgid "dashboard.fonts.deleted-placeholder" +msgstr "Mkpụrụ edemede na-efu efu" + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.dismiss-all" +msgstr "Gbasaa ha niile" + +msgid "dashboard.fonts.empty-placeholder" +msgstr "Mkpụrụ edemede ndị ị bugoro ga-apụta ebe." + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.upload-all" +msgstr "Bugo ha niile" + +#, markdown +msgid "dashboard.fonts.warning-text" +msgstr "" +"Anyị chọpụtara nsogbu nwere ike ịpụta na mkpụrụ edide gị gbasara ntụ kwụ " +"ọtọ " + +msgid "dashboard.import.analyze-error" +msgstr "Ewuu! Anyị enweghị ike bubata ederede a" + +msgid "dashboard.import.import-error" +msgstr "E nwere nsogbu na ibubata ederede . E bubataghị ederede ." + +msgid "dashboard.import.import-warning" +msgstr "Ụfọdụ ederede nwere ihe ndị adabaghị na ya nke ewepugoro. ." + +msgid "dashboard.import.progress.process-colors" +msgstr "Nhazi agwụgwara gasị" + +msgid "dashboard.import.progress.process-components" +msgstr "Nhazi ngwa gasị" + +msgid "dashboard.import.progress.process-media" +msgstr "Nhazi mgbasa ozi" + +msgid "dashboard.import.progress.process-page" +msgstr "Nhazi ihu akwụkwọ : %s" + +msgid "dashboard.import.progress.process-typographies" +msgstr "Nhazi akara nkụpụta" + +msgid "dashboard.import.progress.upload-data" +msgstr "Ibugo njatụle n'ebe nkesa (%s/%s)" + +msgid "dashboard.import.progress.upload-media" +msgstr "Ibugo ederede : %s" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.invite-profile" +msgstr "Kpọta mmadụ" + +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.leave-team" +msgstr "Hapụ otu" + +msgid "dashboard.libraries-and-templates" +msgstr "Ọba ederede gasị & ndebiri" + +msgid "dashboard.libraries-and-templates.explore" +msgstr "Nyocha ọtụtụ n'ime ha ma mara etu ị ga-esi tinye ọnụ" + +msgid "dashboard.libraries-and-templates.import-error" +msgstr "E nwere nsogbu ibu aba ndebiri . E bubataghị ndebiri." + +#: src/app/main/ui/dashboard/libraries.cljs +msgid "dashboard.libraries-title" +msgstr "Ọba ederede gasị" + +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.loading-files" +msgstr "Mbụbata ederede gị …" + +msgid "dashboard.loading-fonts" +msgstr "mbubata mkpụrụ edemede gị …" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to" +msgstr "Ga na" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-multi" +msgstr "Buga %s ederede gasị na" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-other-team" +msgstr "Gaa n'otu ọzọ" + +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/files.cljs +msgid "dashboard.new-file" +msgstr "+ Ederede ọhụrụ" + +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-file-prefix" +msgstr "Ederede ọhụrụ" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.new-project" +msgstr "+ Nchọcha ọhụrụ" + +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-project-prefix" +msgstr "Arụmarụ ọhụrụ" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.no-matches-for" +msgstr "Ọ nweghị ihe ndabara e nwetara maka “%s“" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.no-projects-placeholder" +msgstr "Arụmarụ a kụdoro ga-apụta ebe a" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-changed-successfully" +msgstr "Adreesị ozi - n gị ahazigharịala gara nke ọma" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-verified-successfully" +msgstr "E nyochala adreesị ozi - n gị nke ọma" + +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.notifications.password-saved" +msgstr "E dọkwara akara mpịbanye nke ọma !" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.num-of-members" +msgstr "%s Ndị otu" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.open-in-new-tab" +msgstr "Mepe ederede na tabụ ọhụrụ" + +msgid "dashboard.options" +msgstr "Nhọrọ gasị" + +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.password-change" +msgstr "Gbanwee akara mpịbanye" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.pin-unpin" +msgstr "Nọmba /Wepụ nọmba" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.projects-title" +msgstr "Arụmarụ" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.remove-account" +msgstr "Chọọ iwepu ebe Ntinye ihe gị ?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.remove-shared" +msgstr "Wepụ dị ka ọba ederede nkekọrịta" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.save-settings" +msgstr "Dokwa ntọala" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.search-placeholder" +msgstr "Chọọ…" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.searching-for" +msgstr "Na-achọ “%s“…" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-language" +msgstr "Họrọ asụsụ UI" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-duplicate-project" +msgstr "E megharịala arụmarụ gị nke ọma\"" + +#: src/app/main/ui/dashboard/grid.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-file" +msgstr "E wepula ederede gị nke ọma\"" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-move-project" +msgstr "E bupula arụmarụ gị nke ọma" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-info" +msgstr "Ozi otu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-members" +msgstr "Ndị otu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-projects" +msgstr "Arụmarụ otu" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.theme-change" +msgstr "Isiokwu UI" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.title-search" +msgstr "Chọọ risọltụ gasị" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.type-something" +msgstr "Pinye ịchọ risọltụ" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.unpublish-shared" +msgstr "Ọba ederede ebiputaghị" + +#: src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs +msgid "dashboard.update-settings" +msgstr "Hazie ntọala" + +msgid "dashboard.webhooks.active" +msgstr "Dị gara gara" + +msgid "dashboard.webhooks.active.explain" +msgstr "Mgbe a kpọlitere nkọ a, ọ ga-Ezipụta nkọwa emume n'uju" + +msgid "dashboard.webhooks.content-type" +msgstr "Ụdị ndịna" + +msgid "dashboard.webhooks.create" +msgstr "Mepe nko - ududọ" + +msgid "dashboard.webhooks.create.success" +msgstr "E mepere nko-ududọ nke ọma ." + +msgid "dashboard.webhooks.description" +msgstr "" +"Nko-ududọ bụ ụzọ dị mfe ga-ekwe ka ebe ududọ na apps ndị ọzọ nweta ozi Mgbe " +"ụfọdụ emume na eme n'ite mkpịsị . Anyị ga e ziga OZI arịrịọ nwe URLs ọ bụla " +"ị nwetara" + +msgid "dashboard.webhooks.empty.add-one" +msgstr "Pịa mpị \"Tinye nko-ududọ \" ịtinye otu ." + +msgid "dashboard.webhooks.empty.no-webhooks" +msgstr "E nweghị Nko-ududọ e ebere ruo ugbu a ." + +msgid "dashboard.webhooks.update.success" +msgstr "Ahazigharịrị nko-ududọ nke ọma ." + +#: src/app/main/ui/settings.cljs +msgid "dashboard.your-account-title" +msgstr "Ebe Ntinye ihe gị" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-email" +msgstr "Ozi-n" + +#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.your-penpot" +msgstr "Ite mkpịsị. gị" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-ok" +msgstr "Okay" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-title" +msgstr "Gee ntị" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-cancel" +msgstr "Kagbuo" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-ok" +msgstr "Okay" + +#: src/app/main/ui/confirm.cljs, src/app/main/ui/confirm.cljs +msgid "ds.confirm-title" +msgstr "Ọ doro gị anya ?" + +msgid "errors.auth.unable-to-login" +msgstr "Ọ dị ka enyochaghị gị ma ọ bụ na oge agwụla ." + +msgid "errors.bad-font" +msgstr "E nweghị ike bugo %s mkpụrụ edide" + +msgid "errors.bad-font-plural" +msgstr "E nweghị ike bugo %s mkpụrụ edide" + +msgid "errors.cannot-upload" +msgstr "E nweghị ike ị ugo ederede ." + +#: src/app/main/data/workspace.cljs +msgid "errors.clipboard-not-implemented" +msgstr "Your browser cannot do this operation" + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs +msgid "errors.email-already-exists" +msgstr "E jibuola ozi - n rụọ ọrụ" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.email-already-validated" +msgstr "Aha ozi-n adabala." + +msgid "errors.email-as-password" +msgstr "Ị nweghị ike iji aha ozi-n gị dị ka akara mpịbanye" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.email-has-permanent-bounces" +msgstr "Ozi-n «%s» nwere ọtụtụ ozi nkọwa mbịaghachigide." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs +msgid "errors.email-invalid" +msgstr "Debanye aha ozi-n dabara adaba" + +#: src/app/main/ui/settings/change_email.cljs +msgid "errors.email-invalid-confirmation" +msgstr "Ozi-n nnabata ga-adabrịrị" + +msgid "errors.email-spam-or-permanent-bounces" +msgstr "E nwela ozi nkọwa na ozi-n«%s» dị ka ozi abaghị uru ma ọ bụ mbịaghachigide." + +#: src/app/main/errors.cljs +msgid "errors.feature-mismatch" +msgstr "" +"Ọ dị ka ị na-emepe ederede nwere a gwara naọ gara aga '%s' mana ihu " +"itemkpịsị gị akwadoghị ya ma ọ bụ gosiri ọ gaghị aga." + +#: src/app/main/errors.cljs +msgid "errors.feature-not-supported" +msgstr "Akwadoghị agwara '%s' ." + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.generic" +msgstr "Ihe ezighị ezi emela ." + +#: src/app/main/ui/components/color_input.cljs +msgid "errors.invalid-color" +msgstr "Agwụgwara adabaghị" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.invite-invalid" +msgstr "kpọọ òkù adabaghị" + +msgid "errors.invite-invalid.info" +msgstr "This invite might be canceled or may be expired." + +#: src/app/main/ui/auth/login.cljs +msgid "errors.ldap-disabled" +msgstr "LDAP mbinye aka agaghị ." + +#: src/app/main/errors.cljs +msgid "errors.max-quote-reached" +msgstr "I ruola '%s' ole a chọrọ . Chọọ enyemaka nkwado ." + +#: src/app/main/data/workspace/persistence.cljs +msgid "errors.media-too-large" +msgstr "Onyinyo a ebuka ibu maka itinye ." + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "errors.media-type-mismatch" +msgstr "Dị ka ihe dị na onyinyo adabaghị na mgbatị ederede." + +#: src/app/main/ui/dashboard/team.cljs +msgid "errors.member-is-muted" +msgstr "" +"Nchịkọta gị nwere ozi-n mechiri emechi (akụkọ ozi-n adịghị mma ma ọ bụ " +"nwere oké bịaghachiri )." + +msgid "errors.profile-blocked" +msgstr "A gbachiri nchịkọta agbachi" + +#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.profile-is-muted" +msgstr "" +"Nchịkọta gị lnwere ozi-n mechiri emechi(akụkọ ozi-n adịghị mma ma ọ bụ " +"nwere oké bịaghachiri ).\")." + +#: src/app/main/ui/auth/register.cljs +msgid "errors.registration-disabled" +msgstr "Ndebanye merụrụ emerụ ugbu a." + +msgid "errors.team-leave.insufficient-members" +msgstr "Ndị otu ezughị okè ịhapụ otu, ọ nyere ike na ị chọrọ ihichapụ ya ." + +msgid "errors.team-leave.member-does-not-exists" +msgstr "Onye otu ị na-achọ inye adịghị ." + +msgid "errors.team-leave.owner-cant-leave" +msgstr "O wee enweghị ike ịhapụ otu, ị ga-enyegharịrị ọrụ onwee." + +#: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "errors.unexpected-error" +msgstr "Ndejo atughị anya ya pụtara ." + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.unexpected-token" +msgstr "Ọdịmara amaghị ama" + +msgid "errors.webhooks.connection" +msgstr "Mmejọ, e nwetaghị URL" + +msgid "errors.webhooks.invalid-uri" +msgstr "URL enweghị nkwado ." + +msgid "errors.webhooks.ssl-validation" +msgstr "Mmejọ na nkwado SSL ." + +msgid "errors.webhooks.timeout" +msgstr "Oge ezuola" + +#: src/app/main/ui/auth/login.cljs +msgid "errors.wrong-credentials" +msgstr "Ozi-na ma ọ bụ akara mpịbanye adịghị mma ." + +#: src/app/main/ui/settings/password.cljs +msgid "errors.wrong-old-password" +msgstr "Akara mpịbanye ochie adịghị mma" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.description" +msgstr "Nkọwa" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-go-to" +msgstr "Gaa n'ebe ite mkpịsị" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-subtitle1" +msgstr "" +"Obi dị anyị añụrị ịhụ gị ebea. Ọ bụrụ na enyemaka dị mkpa , biko chọọ tupu " +"ị ịga ozi ." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-title" +msgstr "Ogbe Ite mkpịsị" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subject" +msgstr "Isiokwu" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subtitle" +msgstr "" +"Biko, kọwaa ihe isi ozi-n gị , kwuo ma ọ bụ nsogbu , ncheputara ma ọ bụ " +"ekaenyeghị. Onye otu anyị ga-azaghachi ozugbo ọ nwere ike ." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.title" +msgstr "Ozi- n" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-go-to" +msgstr "Gaa na Twita" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-subtitle1" +msgstr "Ebe inyere gị aka n'ajụjụ nkà gị ." + +#: src/app/main/ui/settings/password.cljs +msgid "generic.error" +msgstr "Mmehie apụtala" + +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur" +msgstr "Inyogo" + +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur.value" +msgstr "Uru" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hex" +msgstr "HEX" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hsla" +msgstr "HSLA" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.rgba" +msgstr "RGBA" + +#: src/app/main/ui/inspect/attributes/fill.cljs +msgid "inspect.attributes.fill" +msgstr "Wunye" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.download" +msgstr "Butuo onyinyo nsina" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.height" +msgstr "Ogo" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.width" +msgstr "Uhie" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout" +msgstr "Mpụta" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.height" +msgstr "Ogo" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.left" +msgstr "Aka ekpe" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.rotation" +msgstr "Ntụgharị" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.top" +msgstr "Elu" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.width" +msgstr "Uhie" + +#: src/app/main/ui/inspect/attributes/shadow.cljs +msgid "inspect.attributes.shadow" +msgstr "Oninyo" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.size" +msgstr "Nhazi na ọnọdụ" + +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke" +msgstr "Akara" + +#, permanent +msgid "inspect.attributes.stroke.alignment.center" +msgstr "Etiti" + +#, permanent +msgid "inspect.attributes.stroke.alignment.inner" +msgstr "Ime" + +#, permanent +msgid "inspect.attributes.stroke.alignment.outer" +msgstr "Ezi" + +msgid "inspect.attributes.stroke.style.dotted" +msgstr "Atụrụ kpọm kpọm" + +msgid "inspect.attributes.stroke.style.mixed" +msgstr "Gwakọtara" + +msgid "inspect.attributes.stroke.style.none" +msgstr "Ncha ncha" + +msgid "inspect.attributes.stroke.style.solid" +msgstr "Akpụrụka" + +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke.width" +msgstr "Uhie" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography" +msgstr "Akara nkụpụta" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-family" +msgstr "Ezinụlọ mkpụrụ edide" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-size" +msgstr "Nhazi mkpụrụ edide" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.letter-spacing" +msgstr "Ndesa mkpụrụ edemede" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.line-height" +msgstr "Ogo akara" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-decoration" +msgstr "Nkwazi ederede" + +msgid "inspect.attributes.typography.text-decoration.none" +msgstr "Ncha ncha" + +msgid "inspect.attributes.typography.text-decoration.strikethrough" +msgstr "Kụọgafee" + +msgid "inspect.attributes.typography.text-decoration.underline" +msgstr "N'okpuru" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-transform" +msgstr "Mgbanwe ederede" + +msgid "inspect.attributes.typography.text-transform.none" +msgstr "None" + +msgid "inspect.attributes.typography.text-transform.titlecase" +msgstr "Mkpụrụ edemede isiokwu" + +msgid "inspect.attributes.typography.text-transform.uppercase" +msgstr "Mkpụrụ edemede nnukwu" + +msgid "inspect.empty.help" +msgstr "" +"Ị chọọ ị ma ihe ndị ọzọ maka nnyocha esereese, gaa n'ebe enyemaka ite " +"mkpịsị r" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code" +msgstr "Akara" + +msgid "inspect.tabs.code.selected.circle" +msgstr "Okirikiri" + +msgid "inspect.tabs.code.selected.component" +msgstr "Ndịna" + +msgid "inspect.tabs.code.selected.curve" +msgstr "Nrọgọ" + +msgid "inspect.tabs.code.selected.frame" +msgstr "Ogwe." + +msgid "inspect.tabs.code.selected.group" +msgstr "Otu" + +msgid "inspect.tabs.code.selected.image" +msgstr "Onyinyo" + +msgid "inspect.tabs.code.selected.mask" +msgstr "kpuchie" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code.selected.multiple" +msgstr "%s a họrọ" + +msgid "inspect.tabs.code.selected.path" +msgstr "Ụzọ" + +msgid "inspect.tabs.code.selected.rect" +msgstr "Rekụtagụlụ" + +msgid "inspect.tabs.code.selected.svg-raw" +msgstr "SVG" + +msgid "inspect.tabs.code.selected.text" +msgstr "Ederede" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.info" +msgstr "Ozi" + +#: src/app/main/ui/workspace/header.cljs +msgid "label.shortcuts" +msgstr "Ụzọ mkpirisi" + +msgid "labels.accept" +msgstr "Nabata" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "Nweta ọdịmara gasị" + +msgid "labels.active" +msgstr "Gara gara" + +msgid "labels.add-custom-font" +msgstr "Tinye mkpụrụ edide a haziri ahazi" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.admin" +msgstr "Ọchịkwa" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.all" +msgstr "Ha niile" + +msgid "labels.and" +msgstr "na" + +msgid "labels.back" +msgstr "Azụ" + +#: src/app/main/ui/static.cljs +msgid "labels.bad-gateway.main-message" +msgstr "Ajọ ụzọ mbanye" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.cancel" +msgstr "Kagbuo" + +msgid "labels.close" +msgstr "Megbuo" + +#: src/app/main/ui/dashboard/comments.cljs +msgid "labels.comments" +msgstr "Okwu gasị" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.community" +msgstr "Ogbe" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.confirm-password" +msgstr "Nabata akara mpịbanye" + +msgid "labels.continue" +msgstr "Ga n'ihu" + +msgid "labels.continue-with" +msgstr "Gaa n'ihu" + +msgid "labels.continue-with-penpot" +msgstr "I Nwere Ike ịganihu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.copy-invitation-link" +msgstr "Dọrọ njikọ" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "labels.create" +msgstr "Meputa" + +#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team" +msgstr "Mepee otu ọhụrụ" + +msgid "labels.custom-fonts" +msgstr "mkpụrụ edide a haziri" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete" +msgstr "Hichaa" + +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment" +msgstr "Hichaa okwu" + +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment-thread" +msgstr "Hichapụ eri" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.delete-invitation" +msgstr "Hichapụ oku" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete-multi-files" +msgstr "Hichapụ ederede %s" + +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.drafts" +msgstr "Ndesita" + +#: src/app/main/ui/comments.cljs +msgid "labels.edit" +msgstr "Dezie" + +msgid "labels.edit-file" +msgstr "Dezie ederede" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.editor" +msgstr "Odezi" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.expired-invitation" +msgstr "Mebiri" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-disabled" +msgstr "Nzaghachi merụrụ emeru" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-sent" +msgstr "Zigara nzaghachi" + +msgid "labels.font-family" +msgstr "Ezinụlọ mkpụrụ edide" + +msgid "labels.font-providers" +msgstr "Ndị na-enye mkpụrụ edide" + +msgid "labels.font-variants" +msgstr "Ụdịdị gasị" + +msgid "labels.fonts" +msgstr "Mkpụrụ edide gasị" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.github-repo" +msgstr "Ọ a Github" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.give-feedback" +msgstr "Nye nzaghachi" + +msgid "labels.go-back" +msgstr "Gaa azụ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.help-center" +msgstr "Ebe enyemaka" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.hide-resolved-comments" +msgstr "Zoo nkwupụta e kpebiri" + +msgid "labels.inactive" +msgstr "Arụghị ọrụ" + +msgid "labels.installed-fonts" +msgstr "Mkpụrụ edide gasị ewubere" + +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.desc-message" +msgstr "Ihe ọjọọ mere . Biko, rụgharịa ọrụ ma ọ bụ na nsogbu aka dị , kpọọ nkwado ." + +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.main-message" +msgstr "Nrụjọ ndịnime" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.invitations" +msgstr "Akwụkwọ ịkpọ ọkụ gasị" + +#: src/app/main/ui/settings/options.cljs +msgid "labels.language" +msgstr "Asụsụ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.libraries-and-templates" +msgstr "Ọba ederede na Ndebiri gasị" + +msgid "labels.log-or-sign" +msgstr "Banye ma ọ bụ debanye" + +#: src/app/main/ui/settings.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.logout" +msgstr "Pụọ" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.member" +msgstr "Onye otu" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.members" +msgstr "Ndị otu" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.new-password" +msgstr "Akara mpịbanye ọhụrụ" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs +msgid "labels.no-comments-available" +msgstr "E jidere unu niile! Ngosi nkwupụta ọhụrụ ga-apụta ebe a ." + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.no-invitations" +msgstr "E nweghị ọkụ na-echere" + +#: src/app/main/ui/dashboard/team.cljs +#, markdown +msgid "labels.no-invitations-hint" +msgstr "Pịa mpị**kpọọ ndị mmadụ ** ịkpọọ ndị mmadụ n'otu a." + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.desc-message" +msgstr "Ihu akwụkwọ a nwere ike ọ gaghị adị ma ọ bụ ị nweghị ikikere inweta ya ." + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.main-message" +msgstr "E wuu !" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.old-password" +msgstr "Akara mpịbanye ochie" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.only-yours" +msgstr "Sọọsọ nke gị" + +msgid "labels.or" +msgstr "ma ọ bụ" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.owner" +msgstr "Onye nwe" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.password" +msgstr "Akara mpịbanye" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.pending-invitation" +msgstr "Na-echere" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.profile" +msgstr "Nchịkọta" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.projects" +msgstr "Ọrụ gasị" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.release-notes" +msgstr "Wepụta ndetu" + +#: src/app/main/ui/workspace.cljs +msgid "labels.reload-file" +msgstr "Bugharịa ederede" + +#: src/app/main/ui/workspace/libraries.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.remove" +msgstr "Wepu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.remove-member" +msgstr "Wepụ onye otu" + +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.rename" +msgstr "Nyegharịa aha" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.rename-team" +msgstr "Nyegharịa otu" + +#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs +msgid "labels.retry" +msgstr "Nwagharịa" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.role" +msgstr "Ọrụ" + +msgid "labels.save" +msgstr "Dokwa" + +msgid "labels.search-font" +msgstr "Chọọ mkpụrụ edide" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.send" +msgstr "Ziga" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.sending" +msgstr "Na-eziga…" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.settings" +msgstr "Ntọala" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.shared-libraries" +msgstr "Ọba ederede" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-all-comments" +msgstr "Gosi nkwupụta niile" + +msgid "labels.show-comments-list" +msgstr "Gosi ndepụta nkwupụta gasị" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-your-comments" +msgstr "Gosi nanị nkwupụta gị gasị" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.status" +msgstr "Ọnọdụ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.tutorials" +msgstr "Nkuzi" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.unpublish-multi-files" +msgstr "%s ederede ebipụtaghị" + +#: src/app/main/ui/settings/profile.cljs +msgid "labels.update" +msgstr "Hazigharịa" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.update-team" +msgstr "Hazigharịa otu" + +msgid "labels.upload" +msgstr "Bugo" + +msgid "labels.upload-custom-fonts" +msgstr "Bugo ederede gasị ahaziri" + +msgid "labels.uploading" +msgstr "Na-ebugo…" + +msgid "labels.view-only" +msgstr "Sọọsọ nkiri" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.viewer" +msgstr "Ndị nkiri" + +msgid "labels.webhooks" +msgstr "Nko-ududọ" + +#: src/app/main/ui/comments.cljs +msgid "labels.write-new-comment" +msgstr "Dee nkwupụta ọhụrụ" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.you" +msgstr "(gị)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.your-account" +msgstr "Akara mbata gị" + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "media.loading" +msgstr "Na-ebupụta onyinyo …" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"E nweghị ihe dị n'ọba ederede gị. \"Ozugbo e tinyere dị ka ọba ederede " +"ekekoritara, ngwongwo ị mepere ga a dị maka iji ya rụọ ọrụ n'edemede gị ndị " +"ọzọ niile. Ọ kara gị obi na ị chọrọ ị bipụta ya?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.accept" +msgstr "Tinye ka ọba ederede Kekoritara" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.hint" +msgstr "" +".Ozugbo e tinyere dị ka ọba ederede ekekoritara, ngwongwo ị mepere ga a dị " +"maka iji ya rụọ ọrụ n'edemede gị ndị ọzọ niile." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.message" +msgstr "Tinye “%s” dị ka ọba ederede ekekoritara" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.big-nudge" +msgstr "nnukwu nkpatụ" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.submit" +msgstr "Gbanwee ozi nl" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.expiration-date.label" +msgstr "Ụbọchị mmebi" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "Aha" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "Create token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "Mepụta ọdịmara nweta" + +msgid "modals.create-webhook.submit-label" +msgstr "Mebe nko - ududo" + +msgid "modals.create-webhook.title" +msgstr "Mebe nko-ududo" + +msgid "modals.create-webhook.url.label" +msgstr "Isi ozi URL" + +msgid "modals.create-webhook.url.placeholder" +msgstr "https://ọmụmaaụ.com/ozi anabara" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "Hichapụ ọdịmara" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "Hichapụ ọdịmara" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.cancel" +msgstr "Kagbuo ma dobe ebe ntinye ihe m" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.confirm" +msgstr "Eee, hichapụ ebe ntinye ihe m" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.info" +msgstr "" +"Site na iwepu ebe ntinye ihe gị, arụmarụ gị gasị ugbu a naebe nchekwa " +"ga-efu ." + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.title" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ ebe ntinye ihe gị?" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.accept" +msgstr "Hichapụ mkparịtaụka" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.message" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ mkparịtaụka a?" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.title" +msgstr "Hichaa mkparịtaụka" + +msgid "modals.delete-component-annotation.message" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ nkọwa ?" + +msgid "modals.delete-component-annotation.title" +msgstr "Hichapụ nkọwa" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.accept" +msgstr "Hichapụ ederede" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.message" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ ederede ?" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.title" +msgstr "Na-ehichapụ ederede" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.title" +msgstr "Na-ehichapụ ederede %s" + +msgid "modals.delete-font.title" +msgstr "Na-ehichapụ mkpụrụ edide" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.body" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ ihu akwụkwọ a?" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.title" +msgstr "Hichapụ ihu akwụkwọ" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.accept" +msgstr "Hichapụ arụmarụ" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.message" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ arụmarụ ?" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.title" +msgstr "Hichapụ arụmarụ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.accept" +msgstr "Hichapụ otu" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.message" +msgstr "" +"Ọ kara gị obi na ị chọrọ ị hichapụ otu? ARỤMARỤ na ederede nille gasị " +"gbasara otú ga-ehichapụ kpam kpam" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.title" +msgstr "Na-ehichapụ otu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.accept" +msgstr "Hichapụ onye otu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.message" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ onye otu n'otu a?" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.title" +msgstr "Hichapụ onye otu" + +msgid "modals.delete-webhook.accept" +msgstr "Hichapụ nko-ududọ" + +msgid "modals.delete-webhook.message" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ nko-ududọ ?" + +msgid "modals.delete-webhook.title" +msgstr "Na-ehichapụ nko-ududo" + +msgid "modals.edit-webhook.submit-label" +msgstr "Dezie nko-ududo" + +msgid "modals.edit-webhook.title" +msgstr "Dezie nko-ududo" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-member-confirm.accept" +msgstr "Ziga akwụkwọ ozi mkpọta" + +msgid "modals.invite-member.emails" +msgstr "Ozi-n gasị, Rịkọm e kewara" + +msgid "modals.invite-member.repeated-invitation" +msgstr "Ụfọdụ ozi n sitere na ndị ugbu a A gaghị e ịga akwụkwọ ozi mkpọta ha" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-team-member.title" +msgstr "kpọta ndị otu n'otu a" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.hint" +msgstr "" +"Etu ị bụ sọọ otu onye otu , a ga e hichapụ otu a ya n'ọrụ na ederede ya " +"gasịits projects and files." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.message" +msgstr "Ọ kara gị obi na ị chọrọ ịhapụ otu %s ?" + +msgid "modals.leave-and-reassign.forbidden" +msgstr "" +"I nweghị ike ịhapụ otu ma ọ bụrụ na e nweghị onye otu ọzọ akwalitere ga na " +"onye nwe ya . Ị nwere ike chọọ ị hichapụ otu ." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.hint1" +msgstr "" +"Gị bụ onye nwee otu a, . Biko, họrọ onye otu ọzọ maka ịkwalite gana onye " +"nweeya tupu ị hapụ ." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.promote-and-leave" +msgstr "Kwalite ma hapụ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.select-member-to-promote" +msgstr "Họrọ onye otu maka ịkwalite" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.title" +msgstr "Tupu ị hapụ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.accept" +msgstr "Hapụ otu" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.message" +msgstr "Ọ kara gị obi na ịchọrọ ịhapụ otu ?" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.title" +msgstr "Nhapụ otu" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.nudge-title" +msgstr "ọnụ ọgụgụ nkpatụ" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.hint" +msgstr "" +"Ọ bụrụ na Inyefe onwunwe , ị ga-agbanwe ọrụ gị ka ọchikwa, ụfọdụ ikikere " +"n'isi ndị otu na-efu " + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.message" +msgstr "" +"G bụ onye nwe otu a ugbu a, Ọ doro gị anya na ị chọrọ ime%s Onye ọhụrụ nwe " +"otu a?" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.title" +msgstr "Onye nwe otu ọhụrụ" + +msgid "modals.publish-empty-library.accept" +msgstr "Biputa" + +msgid "modals.publish-empty-library.message" +msgstr "Your library is empty. Are you sure you want to publish it?" + +msgid "modals.publish-empty-library.title" +msgstr "Biputa ọba ederede efu" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.accept" +msgstr "Wepụ dịka ọba ederede ekekoritara" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.hint" +msgstr "" +"Ozugbo e wepụrụ dị ka ọba ederede ekekoritara, ọba ederede ederede a " +"ga-akwụsị dị n'ime ederede ndị ọzọ gasị e ji rụọ ọrụ" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.message" +msgstr "Wepu“%s” dịka ọba ederede ekekoritara" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.small-nudge" +msgstr "kpatụ obere" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.hint" +msgstr "" +"Ị na-achọ ịhazigharị ngwa gasị n'ọba ederede ekekoritara. Ihe nwere ike " +"imetuta ederede ndị ọzọ ji ya arụ ọrụ" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.message" +msgstr "Update components in a shared library" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.accept" +msgstr "Hazigharịa" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.cancel" +msgstr "Kagbuo" + +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "A new version is available, please refresh the page" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "notifications.profile-deletion-not-allowed" +msgstr "I nweghị ike ị hichapụ nchịkọta gị . Nyegharịa ya ndị otu gị tupu ị ganihu" + +#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs +msgid "notifications.profile-saved" +msgstr "E dọkwara nchịkọta nke ọma" + +#: src/app/main/ui/settings/change_email.cljs +msgid "notifications.validation-email-sent" +msgstr "Ozi nnyocha n zigara na%s. Mepe ozi n gị !" + +msgid "onboarding-v2.before-start.desc1" +msgstr "" +"I kwesịrị ịma na e nwere ọtụtụ ihe e ji arụ ọrụ dị inwere gị iji bido n'ite " +"mkpịsị , dị ka ntuziaka onye ọrụ na ọwa YouTube anyị l." + +msgid "onboarding-v2.before-start.desc2" +msgstr "" +"Ozi banyere etu esi eji ite mkpịsị arụ ọrụ uju. Site na ime atụtụ ga na " +"nhazi ma ọ bụ nkesa esereese ." + +msgid "onboarding-v2.before-start.desc2.title" +msgstr "Mkpanaka" + +msgid "onboarding-v2.before-start.desc3" +msgstr "Ị nwere ike ikiri amụmamụ anyị na amụmamụ nke ndị obodo anyị mere." + +msgid "onboarding-v2.before-start.desc3.title" +msgstr "Amụmamụ onyonyo" + +msgid "onboarding-v2.before-start.title" +msgstr "Tupu i bido" + +msgid "onboarding-v2.newsletter.desc" +msgstr "" +"Debanye aha n'akụkụ ozi ite mkpịsị iji nọrọ gam gam na ngwa ahịa aaga n'ihu " +"mwulite na akụkọ ụwa." + +msgid "onboarding-v2.newsletter.news" +msgstr "" +"Zitere m akụkọ banyere ite mkpịsị (ozi edemonye gasị, Nkụzi ihe onyonyo, " +"nkirigarị...)." + +msgid "onboarding-v2.newsletter.privacy1" +msgstr "Anyị na-eche banyere nzochi onwe, ebe a inwere ike ịgụ..... anyị " + +msgid "onboarding-v2.newsletter.privacy2" +msgstr "" +"Anyị ga e zitere ozi n bara uru sọọsọ . Ị nwere ike idepu aha oge ọ bụla " +"site na njikọ ndepu aha n'akwụkwọ ozi gasị anyị ọ bụla ." + +msgid "onboarding-v2.newsletter.updates" +msgstr "" +"Zitere m nhazigharị ngwa ahịa (a gwara ọhụrụ gasị , ihe ndị ewepụta gasịrị " +", ndo ị gasị..)." + +msgid "onboarding-v2.welcome.desc1" +msgstr "" +"Ite mkpịsị bụ nsina ghere oghe ma bụrụ nke Kaleidos nakwa ndị obodo rụrụ " +"Ebe ọtụtụ mmadụ nyewegoroa onwe anyị aka..Onye ọ bụla nwere arụkọrịtasite " +"na :" + +msgid "onboarding-v2.welcome.desc2" +msgstr "" +"Oghere ọha na ndị obodo niile na ndị otu ite mkpịsị kpọmkwem ịmụ, kesa ma " +"kọwaa maka ite mkpịsị , ọnọdụ ya ugbu a na ọdịnihu ya" + +msgid "onboarding-v2.welcome.desc3.title" +msgstr "Ntụziaka inye aka" + +msgid "onboarding-v2.welcome.title" +msgstr "Nabata ite mkpịsị !" + +msgid "onboarding.choice.team-up.create-team-desc" +msgstr "I nye ha otu gị aha , I nwere ike ị kpọta ndị mmadụ ka ha sonye." + +msgid "onboarding.choice.team-up.create-team-placeholder" +msgstr "Denye aha otu" + +msgid "onboarding.choice.team-up.invite-members" +msgstr "Kpọta ndị otu" + +msgid "onboarding.choice.team-up.invite-members-info" +msgstr "" +"Cheta ka itinye onye ọ bụla Ndị nzụlite, ndị nrụpụta, ndị njikwa... dị iche " +"iche adds up :)" + +msgid "onboarding.choice.team-up.roles" +msgstr "kpọta tinye ọrụ :" + +msgid "onboarding.newsletter.accept" +msgstr "Eee, debanye aha" + +msgid "onboarding.newsletter.acceptance-message" +msgstr "E zigala arịrịọ ndenye aha gị , anyị ga-ezi tara gị ozi - n iji nabata ya" + +msgid "onboarding.newsletter.title" +msgstr "Chọrọ inweta ozi ite mkpịsị ?" + +msgid "onboarding.team-modal.create-team" +msgstr "Mepụta otu" + +msgid "onboarding.team-modal.create-team-desc" +msgstr "" +"Otu ga-ekwe gị na ndị ọzọ ji ite mkpịsị arụ ọrụ ịrụkọta n'otu ederede na " +"arụmarụ gasị ." + +msgid "onboarding.team-modal.create-team-feature-1" +msgstr "Ederede na arụmarụ na enweghị njedebe" + +msgid "onboarding.team-modal.create-team-feature-2" +msgstr "Mbipụta ọtụtụ egwuregwu" + +msgid "onboarding.team-modal.create-team-feature-3" +msgstr "Njikwa ọrụ" + +msgid "onboarding.team-modal.create-team-feature-4" +msgstr "Ndị otu enweghị njedebe" + +msgid "onboarding.team-modal.create-team-feature-5" +msgstr "% narị efu!" + +msgid "onboarding.templates.subtitle" +msgstr "Ụfọdụ ndebiri nọ ebe a." + +msgid "onboarding.templates.title" +msgstr "Bido osise" + +#: src/app/main/ui/auth/recovery.cljs +msgid "profile.recovery.go-to-login" +msgstr "Gaa na mbanye" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "Kedu ngwa ọrụ nse ị ka mara eji arụ ọrụ ?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "Iri na otu ruo na iri atọ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "Abụọ ruo na iri" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "Iri atọ na otu ruo na iri ise" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "Ọtụtụ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Ngwa nrụkọrịta ọrụ Adobe" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Kanva" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "Kedụ ka Ị ga-esi kọwaa ọfụma ihe ndị ị hụrụ ịrụ ọrụ na..." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Onye nrụpụta" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "Chọpụta ihe ndị ọzọ gbasara ite mkpịsị" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Ihe onyonyo" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Onye malitere /VP" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Onye nwere onwe ya" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Weta akara site n'arụmarụ otu m " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... Nhazi ihu nse, uru ahụmụzọ, usoro imewe , etc." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "Mmakpo" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Hapụ Nzaghachi maka arụmarụ ndị otu m" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "Ka anyị bido!" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Onye njikwa ngwaahịa ma ọ bụ arụmarụ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Ịzụ ahịa" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "Karịrị iri ise" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-a-tool" +msgstr "E jibeghị m ngwa ọrụ nse rụọ ọrụ mbụ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Ọzọ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Onweghị" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Ọzọ (zipụta)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "A na m arụ ọrụ n'arụmarụ onwe" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Kedụ ka ị sị akwado iji ite mkpịsị arụ ọrụ ?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Gịnị bụ ọrụ gị ?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Họrọ nhọ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Eserese" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Ụfọdụ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Bido" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Bido ịrụ ọrụ m" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Nwata akwụkwọ ma ọ bụ onye nkụzi" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "Kedụ ka otu gị ha?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Nwale ite mkpịsị ịhụ ma ọ bụ ihe ndaba maka otu " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Gbalịa mee mbụ tupu ị jiri ite mkpịsị rụọ ọrụ n'ebe ọ dị" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "... waya etiti , ndị ọrụ njem na eruba , osisi ngagharị gasị , dgz." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Na-arụ ọrụ n'echiche ihe" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Nzaghachi gị ga-enyere anyị aka ịghọta ihe agwa na mmasị gị bụ Ka anyị ga " +"na-eme Ite mkpịsị ụdị ngwa ọrụ bara uru dị ụtọ ." + +msgid "shortcuts.bring-backward" +msgstr "Wega ebe azụ" + +msgid "shortcuts.duplicate" +msgstr "Mkpị" + +msgid "shortcuts.letter-spacing-inc" +msgstr "Leta mmụba oghere" + +msgid "shortcuts.paste" +msgstr "Nyado" + +msgid "shortcuts.text-align-left" +msgstr "Dozie akaekpe" + +msgid "viewer.breaking-change.message" +msgstr "Ndo" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.delete" +msgstr "Kachapụ" + +msgid "workspace.focus.focus-mode" +msgstr "Umezi nlekwasa anya" + +msgid "workspace.focus.focus-on" +msgstr "Gbanye nlekwasa anya" + +msgid "workspace.shape.menu.create-multiple-components" +msgstr "Mee ọtụtụ akọrọngwa ga" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.color-palette" +msgstr "Agba[ Palette (Na narị)" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.there-are-updates" +msgstr "E nwegasịrị nhazizigharị nime ọba ederede ga e kere eke" diff --git a/frontend/translations/lv.po b/frontend/translations/lv.po index 72c325638..4f6b9ab4f 100644 --- a/frontend/translations/lv.po +++ b/frontend/translations/lv.po @@ -1,16 +1,16 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-01-06 22:06+0000\n" +"PO-Revision-Date: 2024-04-19 08:03+0000\n" "Last-Translator: Edgars Andersons \n" -"Language-Team: Latvian \n" +"Language-Team: Latvian " +"\n" "Language: lv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= " -"19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" -"X-Generator: Weblate 5.4-dev\n" +"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 " +"<= 19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" +"X-Generator: Weblate 5.5-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -55,11 +55,11 @@ msgstr "Pilns vārds" #: src/app/main/ui/auth/register.cljs msgid "auth.login-here" -msgstr "Ienākt šeit" +msgstr "Pieteikties šeit" #: src/app/main/ui/auth/login.cljs msgid "auth.login-submit" -msgstr "Ienākt" +msgstr "Pieteikties" #: src/app/main/ui/auth/login.cljs msgid "auth.login-title" @@ -179,6 +179,13 @@ msgstr "" "Ar jauna konta izveidošanu tiek piekrists mūsu pakalpojuma noteikumiem un " "privātuma nosacījumiem." +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Ar jauna konta izveidošanu tiek piekrists mūsu [pakalpojuma " +"noteikumiem](%s) un [privātuma nosacījumiem](%s)." + #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "Mēs esam nosūtījuši apstiprinājuma e-pasta ziņojumu uz" @@ -194,8 +201,7 @@ msgid "common.share-link.all-users" msgstr "Visi Penpot lietotāji" msgid "common.share-link.confirm-deletion-link-description" -msgstr "" -"Vai tiešām noņemt šo saiti? Noņemot to, saite vairs nebūs pieejama nevienam" +msgstr "Vai tiešām noņemt šo saiti? Noņemot to, saite vairs nebūs pieejama nevienam" msgid "common.share-link.current-tag" msgstr "(pašreizējais)" @@ -261,8 +267,7 @@ msgstr "Apvienojieties!" #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.tutorial-hero.info" -msgstr "" -"Penpot pamatu apgūšana, kamēr tiek gūts prieks, ar šo praktisko apmācību." +msgstr "Penpot pamatu apgūšana, kamēr tiek gūts prieks, ar šo praktisko apmācību." #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.tutorial-hero.start" @@ -347,9 +352,9 @@ msgstr "Privātās piekļuves pilnvaras" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.personal.description" msgstr "" -"Privātās piekļuves pilnvaras darbojas kā alternatīva mūsu pieteikšanās/" -"paroles autentificēšanas sistēmai, un tās var izmantot, lai ļautu lietotnēm " -"piekļūt iekšējam Penpot API" +"Privātās piekļuves pilnvaras darbojas kā alternatīva mūsu " +"pieteikšanās/paroles autentificēšanas sistēmai, un tās var izmantot, lai " +"ļautu lietotnēm piekļūt iekšējam Penpot API" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.token-will-expire" @@ -403,8 +408,8 @@ msgstr "Divkāršot %s datnes" msgid "dashboard.empty-placeholder-drafts" msgstr "" "Šeit tiks parādītas bibliotēkām pievienotās datnes. Mēģini koplietot datnes " -"vai pievienot tās no mūsu [bibliotēkām un veidnēm](https://penpot.app/" -"libraries-templates.html)." +"vai pievienot tās no mūsu [bibliotēkām un " +"veidnēm](https://penpot.app/libraries-templates.html)." msgid "dashboard.export-binary-multi" msgstr "Lejupielādēt %s Penpot datnes (.penpot)" @@ -430,8 +435,8 @@ msgstr "Izgūt" #: src/app/main/ui/export.cljs msgid "dashboard.export-shapes.how-to" msgstr "" -"Izgūšanas iestatījumus elementiem var pievienot no noformējuma īpašībām (" -"labās sānjoslas apakšā)." +"Izgūšanas iestatījumus elementiem var pievienot no noformējuma īpašībām " +"(labās sānjoslas apakšā)." #: src/app/main/ui/export.cljs msgid "dashboard.export-shapes.how-to-link" @@ -449,8 +454,7 @@ msgid "dashboard.export-standard-multi" msgstr "Lejupielādēt %s standarta datnes (. svg +. json)" msgid "dashboard.export.detail" -msgstr "" -"* var ietvert sastāvdaļas, attēlus, krāsas un/vai burtu stilus un veidus." +msgstr "* var ietvert sastāvdaļas, attēlus, krāsas un/vai burtu stilus un veidus." msgid "dashboard.export.explain" msgstr "" @@ -471,8 +475,7 @@ msgstr "" "pievienoti līdzekļi. " msgid "dashboard.export.options.detach.title" -msgstr "" -"Attiekties pret koplietojamo bibliotēku līdzekļiem kā pret pamatobjektiem" +msgstr "Attiekties pret koplietojamo bibliotēku līdzekļiem kā pret pamatobjektiem" msgid "dashboard.export.options.merge.message" msgstr "" @@ -524,8 +527,8 @@ msgid "dashboard.fonts.warning-text" msgstr "" "Esam noteikuši iespējamu sarežģījumu ar fontiem, kas ir saistīta ar " "vertikālajiem rādītājiem dažādām operētājsistēmām. Lai to pārbaudītu, var " -"izmantot tādus fontu vertikālo rādītāju pakalpojumus kā [šis](https" -"://vertical-metrics.netlify.app/). Turklāt ir ieteicams izmantot " +"izmantot tādus fontu vertikālo rādītāju pakalpojumus kā " +"[šis](https://vertical-metrics.netlify.app/). Turklāt ir ieteicams izmantot " "[Transfonter](https://transfonter.org/), lai izveidotu tīmekļa fontus un " "novērstu kļūdas. " @@ -535,9 +538,18 @@ msgstr "Ievietot Penpot datnes" msgid "dashboard.import.analyze-error" msgstr "Ak vai! Šo datni nevarēja ievietot" +msgid "dashboard.import.analyze-error.components-v2" +msgstr "Datne ar v2 sastāvdaļām ir aktivizēta, bet šī komanda to vēl neatbalsta." + msgid "dashboard.import.import-error" msgstr "Datnes ievietošanas laikā radās sarežģījumi. Datne netika ievietota." +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "%s datņu tika veiksmīgi ievietotas." +msgstr[1] "%s datne tika veiksmīgi ievietota." +msgstr[2] "%s datnes tika veiksmīgi ievietotas." + msgid "dashboard.import.import-warning" msgstr "Dažās datnēs bija nederīgi objekti, kuri tika noņemti." @@ -894,13 +906,20 @@ msgstr "E-pasta adrese “%s” ir atzīmēta surogātpasts vai pastāvīgi saņ #: src/app/main/errors.cljs msgid "errors.feature-mismatch" msgstr "" -"Šķiet, ka tiek atvērta datne, kurā ir iespējota iespēja '%s', bet pašreizējā " -"Penpot versija to neatbalsta vai tā ir atspējota." +"Šķiet, ka tiek atvērta datne, kurā ir iespējota iespēja '%s', bet " +"pašreizējā Penpot versija to neatbalsta vai tā ir atspējota." #: src/app/main/errors.cljs msgid "errors.feature-not-supported" msgstr "Līdzeklis '%s' netiek atbalstīts." +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Izskatās, ka ir nesaderība starp iespējotajām iespējām un iespējām datnē, " +"kuru tiek mēģināts atvērt. Jāpiemēro '%s' migrācijas, pirms datne var tikt " +"atvērta." + #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -951,6 +970,9 @@ msgstr "Apstiprinājuma parolei ir jāsakrīt" msgid "errors.password-too-short" msgstr "Parolē ir jābūt vismaz 8 rakstzīmēm" +msgid "errors.paste-data-validation" +msgstr "Starpliktuvē ir nederīgi dati" + msgid "errors.profile-blocked" msgstr "Profils ir bloķēts" @@ -959,13 +981,17 @@ msgstr "Profils ir bloķēts" #: src/app/main/ui/dashboard/team.cljs msgid "errors.profile-is-muted" msgstr "" -"Profila epasta saņemšana ir apklusināta (ziņojumi par surogātpastu vai daudz " -"atlēcienu)." +"Profila epasta saņemšana ir apklusināta (ziņojumi par surogātpastu vai " +"daudz atlēcienu)." #: src/app/main/ui/auth/register.cljs msgid "errors.registration-disabled" msgstr "Reģistrācija pašlaik ir atspējota." +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Noteikta nesaderīga iespēja '%s'" + msgid "errors.team-leave.insufficient-members" msgstr "" "Komandā ir nepietiekams dalībnieku skaits, lai to pamestu. Iespējams, ka to " @@ -987,6 +1013,13 @@ msgstr "Atgadījās neparedzēta kļūda." msgid "errors.unexpected-token" msgstr "Nezināma tekstvienība" +msgid "errors.validation" +msgstr "Pārbaudes kļūda" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Datnei ir nesaderīgs versijas numurs" + msgid "errors.webhooks.connection" msgstr "Savienojuma kļūda, URL nav sasniedzams" @@ -1042,8 +1075,8 @@ msgstr "Temats" msgid "feedback.subtitle" msgstr "" "Lūgums aprakstīt e-pasta ziņojuma iemeslu, norādot, vai tā ir nepilnība, " -"ierosinājums vai šaubas. Kāds mūsu komandas dalībnieks atbildēs pēc iespējas " -"ātrāk." +"ierosinājums vai šaubas. Kāds mūsu komandas dalībnieks atbildēs pēc " +"iespējas ātrāk." #: src/app/main/ui/settings/feedback.cljs msgid "feedback.title" @@ -1221,6 +1254,9 @@ msgstr "Nav" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "Virsraksta stils" +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Atiestatīt" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Lielie burti" @@ -1314,8 +1350,8 @@ msgstr "Atpakaļ" #: src/app/main/ui/static.cljs msgid "labels.bad-gateway.desc-message" msgstr "" -"Izskatās, ka mazliet jāuzgaida un jāmēģina vēlreiz; mēs veicam nelielus mūsu " -"serveru uzturēšanas darbus." +"Izskatās, ka mazliet jāuzgaida un jāmēģina vēlreiz; mēs veicam nelielus " +"mūsu serveru uzturēšanas darbus." #: src/app/main/ui/static.cljs msgid "labels.bad-gateway.main-message" @@ -1628,6 +1664,9 @@ msgstr "Loma" msgid "labels.save" msgstr "Saglabāt" +msgid "labels.search" +msgstr "Meklēt" + msgid "labels.search-font" msgstr "Meklēt fontu" @@ -1652,6 +1691,9 @@ msgstr "Pakalpojums nav pieejams" msgid "labels.settings" msgstr "Iestatījumi" +msgid "labels.share" +msgstr "Kopīgot" + msgid "labels.share-prototype" msgstr "Kopīgot prototipu" @@ -1721,10 +1763,34 @@ msgstr "(Jūs)" msgid "labels.your-account" msgstr "Mans konts" +msgid "media.choose-image" +msgstr "Izvēlēties attēlu" + +msgid "media.gradient" +msgstr "Pāreja" + +msgid "media.image" +msgstr "Attēls" + +msgid "media.linear" +msgstr "Līnijveida" + #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Ielādē attēlu…" +msgid "media.radial" +msgstr "Radiāls" + +msgid "media.solid" +msgstr "Viengabalains" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Bibliotēka ir tukša. Tiklīdz tā būs pievienota kā koplietojama bibliotēka, " +"izveidotie līdzekļi būs pieejami izmantošanai pārējos failos. Vai tiešām " +"padarīt to pieejamu?" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -1838,8 +1904,7 @@ msgstr "Dzēst sarunu" #: src/app/main/ui/comments.cljs msgid "modals.delete-comment-thread.message" -msgstr "" -"Vai tiešām izdzēst šo sarunu? Visas šī pavediena piebildes tiks izdzēstas." +msgstr "Vai tiešām izdzēst šo sarunu? Visas šī pavediena piebildes tiks izdzēstas." #: src/app/main/ui/comments.cljs msgid "modals.delete-comment-thread.title" @@ -1884,8 +1949,7 @@ msgid "modals.delete-font-variant.title" msgstr "Fonta stila dzēšana" msgid "modals.delete-font.message" -msgstr "" -"Vai tiešām izdzēst šo fontu? Tas netiks ielādēts, ja tiek izmantots datnē." +msgstr "Vai tiešām izdzēst šo fontu? Tas netiks ielādēts, ja tiek izmantots datnē." msgid "modals.delete-font.title" msgstr "Fonta dzēšana" @@ -1974,6 +2038,19 @@ msgstr "Vai tiešām izdzēst šo dalībnieku no komandas?" msgid "modals.delete-team-member-confirm.title" msgstr "Dzēst komandas dalībnieku" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "" +"Līdzekļi, kas jau tiek izmantoti šajā datnē, paliks tajā (dizains netiks " +"salauzts)." +msgstr[1] "" +"Līdzeklis, kas jau tiek izmantots šajā datnē, paliks tajā (dizains netiks " +"salauzts)." +msgstr[2] "" +"Līdzekļi, kas jau tiek izmantoti šajā datnē, paliks tajā (dizains netiks " +"salauzts)." + msgid "modals.delete-webhook.accept" msgstr "Izdzēst tīmekļa aizķeri" @@ -2162,6 +2239,10 @@ msgstr "" msgid "modals.update-remote-component.message" msgstr "Atjaunināt sastāvdaļu koplietojamā bibliotēkā" +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "Ir pieejama jauna versija, lūgums atsvaidzināt lapu" + #: src/app/main/ui/dashboard/team.cljs msgid "notifications.invitation-email-sent" msgstr "Uzaicinājums veiksmīgi nosūtīts" @@ -2172,8 +2253,7 @@ msgstr "Uzaicinājuma saite nokopēta" #: src/app/main/ui/settings/delete_account.cljs msgid "notifications.profile-deletion-not-allowed" -msgstr "" -"Profilu nevar izdzēst. Pirms turpināšanas jāpiešķir savas komandas citiem." +msgstr "Profilu nevar izdzēst. Pirms turpināšanas jāpiešķir savas komandas citiem." #: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs msgid "notifications.profile-saved" @@ -2199,8 +2279,7 @@ msgid "onboarding-v2.before-start.desc2.title" msgstr "Lietotāja rokasgrāmata" msgid "onboarding-v2.before-start.desc3" -msgstr "" -"Ir iespējams apskatīt mūsu pamācības un mūsu kopienas izveidotās pamācības." +msgstr "Ir iespējams apskatīt mūsu pamācības un mūsu kopienas izveidotās pamācības." msgid "onboarding-v2.before-start.desc3.title" msgstr "Video pamācības" @@ -2255,6 +2334,21 @@ msgstr "Līdzdalības rokasgrāmata" msgid "onboarding-v2.welcome.title" msgstr "Laipni lūdzam Penpot!" +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Turpināt komandas izveidošanu" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Turpināt bez komandas" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Izveidot komandu un uzaicināt" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Izveidot komandu un nosūtīt uzaicinājumus" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Uzaicināt būs iespējams vēlāk" + msgid "onboarding.choice.team-up.create-team-desc" msgstr "" "Pēc komandas nosaukuma piešķiršanas varēs uzaicināt cilvēkus tai " @@ -2263,6 +2357,12 @@ msgstr "" msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "Jāievada komandas nosaukums" +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Izveidot komandu" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Izveidot komandu bez uzaicināšanas" + msgid "onboarding.choice.team-up.invite-members" msgstr "Uzaicināt dalībniekus" @@ -2274,6 +2374,12 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Uzaicināt ar lomu:" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Uzsākt bez komandas" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Komandu būs iespējams izveidot vēlāk." + msgid "onboarding.newsletter.accept" msgstr "Jā, abonēt" @@ -2356,6 +2462,14 @@ msgstr "Canva" msgid "questions.describe-your-experience-working-on" msgstr "Kā vislabāk raksturotu savu pieredzi strādājot pie..." +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Modelētājs" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Izstrādātājs" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.discover-more-about-penpot" msgstr "Atklāt vairāk par Penpot" @@ -2364,6 +2478,10 @@ msgstr "Atklāt vairāk par Penpot" msgid "questions.figma" msgstr "Figma" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Dibinātājs/viceprezidents" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.freelancer" msgstr "Esmu ārštātnieks(-ce)/Pašnodarbināts(-ā)" @@ -2388,6 +2506,14 @@ msgstr "Atstāt atsauksmes par manas grupas projektu" msgid "questions.lets-get-started" msgstr "Ķeramies pie darba!" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Produktu vai projektu vadītājs" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Tirgvedība" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.more-than-50" msgstr "Vairāk nekā 50" @@ -2416,6 +2542,10 @@ msgstr "Iepriekšējais" msgid "questions.questions-how-are-you-planning-to-use-penpot" msgstr "Kā ir iecerēts izmantot Penpot?" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Kāda ir ieņemamā loma?" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.select-option" msgstr "Atlasīt iespēju" @@ -2436,6 +2566,10 @@ msgstr "Sākt" msgid "questions.start-to-work-on-my-project" msgstr "Sākt strādāt pie sava projekta" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Students vai pasniedzējs" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.team-size" msgstr "Cik liela ir komanda?" @@ -2459,8 +2593,12 @@ msgstr "Darbs koncepcijas idejās" #: src/app/main/ui/onboarding/questions.cljs msgid "questions.your-feedback-will-help-us" msgstr "" -"Atsauksmes palīdzēs mums saprast, kādi ir lietotāju paradumi un izvēles, lai " -"mēs varētu turpināt padarīt Penpot par noderīgu un patīkamu rīku." +"Atsauksmes palīdzēs mums saprast, kādi ir lietotāju paradumi un izvēles, " +"lai mēs varētu turpināt padarīt Penpot par noderīgu un patīkamu rīku." + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Atdalīt" #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, @@ -2918,6 +3056,9 @@ msgstr "Rādīt/paslēpt mērjoslas" msgid "shortcuts.toggle-textpalette" msgstr "Pārslēgt teksta paleti" +msgid "shortcuts.toggle-theme" +msgstr "Mainīt izskatu" + msgid "shortcuts.toggle-visibility" msgstr "Pārslēgt redzamību" @@ -3024,8 +3165,7 @@ msgid "title.workspace" msgstr "%s - Penpot" msgid "viewer.breaking-change.description" -msgstr "" -"Šī kopīgojamā saite vairs nav derīga. Jāizveido vai jālūdz īpašniekam jauna." +msgstr "Šī kopīgojamā saite vairs nav derīga. Jāizveido vai jālūdz īpašniekam jauna." msgid "viewer.breaking-change.message" msgstr "Piedošanu!" @@ -3134,8 +3274,7 @@ msgstr "Izveidot kopu" #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.create-group-hint" -msgstr "" -"Vienumi tiks automātiski nosaukti kā “kopas nosaukums/vienuma nosaukums”" +msgstr "Vienumi tiks automātiski nosaukti kā “kopas nosaukums/vienuma nosaukums”" #: src/app/main/ui/workspace/sidebar/sitemap.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs, @@ -3148,6 +3287,9 @@ msgstr "Dzēst" msgid "workspace.assets.duplicate" msgstr "Divkāršot" +msgid "workspace.assets.duplicate-main" +msgstr "Divkāršot galveno" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.edit" @@ -3171,7 +3313,7 @@ msgid "workspace.assets.libraries" msgstr "Bibliotēkas" msgid "workspace.assets.local-library" -msgstr "lokālā bibliotēka" +msgstr "vietējā bibliotēka" #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.not-found" @@ -3251,6 +3393,45 @@ msgstr "Teksta pārveide" msgid "workspace.assets.ungroup" msgstr "Atapkopot" +msgid "workspace.context-menu.grid-cells.area" +msgstr "Izveidot laukumu" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Izveidot plātni" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Apvienot šūnas" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Pievienot 1 sleju pa labi" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Pievienot 1 sleju pa kreisi" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Izdzēst sleju" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Izdzēst slejas un apveidus" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Divkāršota sleja" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Pievienot 1 rindu zem" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Pievienot 1 rindu virs" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Izdzēst rindu" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Izdzēst rindu un apveidus" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Divkāršot rindu" + msgid "workspace.focus.focus-mode" msgstr "Fokusa režīms" @@ -3374,6 +3555,12 @@ msgstr "Rādīt mērjoslas" msgid "workspace.header.menu.show-textpalette" msgstr "Rādīt fontu paleti" +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Pārslēgties uz tumšo izskatu" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "Pārslēgties uz gaišo izskatu" + msgid "workspace.header.menu.undo" msgstr "Atsaukt" @@ -3425,6 +3612,21 @@ msgstr "Pilnekrāns" msgid "workspace.header.zoom-selected" msgstr "Tālummainīt uz atlasi" +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Labot režģi" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Iziet" + +msgid "workspace.layout_grid.editor.title" +msgstr "Režģa labošana" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Darīts" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Noteikt atrašanās vietu" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Pievienot" @@ -3495,6 +3697,10 @@ msgstr "BIBLIOTĒKA" msgid "workspace.libraries.library-updates" msgstr "BIBLIOTĒKAS JAUNINĀJUMI" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Ielādē…" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "Nav nevienas koplietojamās bibliotēkas, kas būtu jāatjaunina" @@ -3569,12 +3775,24 @@ msgstr "Sastāvdaļa" msgid "workspace.options.component.annotation" msgstr "Piezīme" +msgid "workspace.options.component.copy" +msgstr "Ievietot starpliktuvē" + msgid "workspace.options.component.create-annotation" msgstr "Izveidot piezīmi" msgid "workspace.options.component.edit-annotation" msgstr "Labot piezīmi" +msgid "workspace.options.component.main" +msgstr "Galvenais" + +msgid "workspace.options.component.swap" +msgstr "Mijmainīt sastāvdaļu" + +msgid "workspace.options.component.swap.empty" +msgstr "Šajā bibliotēkā vēl nav līdzekļu" + #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Ierobežojumi" @@ -3669,6 +3887,10 @@ msgstr "Aizpildīšana" msgid "workspace.options.flows.add-flow-start" msgstr "Pievienot plūsmas sākumu" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Plūsma" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "Plūsmas sākums" @@ -3683,7 +3905,7 @@ msgstr "Auto" #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.column" -msgstr "Kolonnas" +msgstr "Slejas" #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.grid-title" @@ -3694,7 +3916,7 @@ msgstr "Krāsa" #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.params.columns" -msgstr "Kolonnas" +msgstr "Slejas" #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.params.gutter" @@ -3772,6 +3994,9 @@ msgstr "Kopas aizpildījums" msgid "workspace.options.group-stroke" msgstr "Kopas vilkums" +msgid "workspace.options.guides.title" +msgstr "Vadotnes" + msgid "workspace.options.height" msgstr "Augstums" @@ -4111,11 +4336,11 @@ msgstr "Apakša" #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.direction.column" -msgstr "Kolona" +msgstr "Sleja" #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.direction.column-reverse" -msgstr "Apgrieztā kolonna" +msgstr "Apvērsta sleja" #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.direction.row" @@ -4241,8 +4466,7 @@ msgstr "Meklēt fontu" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.select-a-shape" -msgstr "" -"Jāatlasa apveids, plātne vai kopa, lai vilktu savienojumu uz citu plātni." +msgstr "Jāatlasa apveids, plātne vai kopa, lai vilktu savienojumu uz citu plātni." #: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs msgid "workspace.options.selection-color" @@ -4319,14 +4543,26 @@ msgstr "Vilkums" msgid "workspace.options.stroke-cap.circle-marker" msgstr "Apļa marķieris" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Aplis" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "Rombveida marķieris" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Dimants" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "Līnijas bulta" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Bulta" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "Nav" @@ -4343,10 +4579,18 @@ msgstr "Kvadrāts" msgid "workspace.options.stroke-cap.square-marker" msgstr "Kvadrāta marķieris" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Taisnstūris" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "Trīsstūra bulta" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Trijstūris" + msgid "workspace.options.stroke-color" msgstr "Vilkuma krāsa" @@ -4817,6 +5061,13 @@ msgstr "Teksts (%s)" msgid "workspace.toolbar.text-palette" msgstr "Burtu stili un veidi (%s)" +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**Apskatīšana** (tikai skatīt)" + +msgid "workspace.top-bar.read-only.done" +msgstr "Darīts" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Līdz šim nav notikušas nekādas vēsturiskās izmaiņas" @@ -4950,210 +5201,3 @@ msgstr "Atjaunināt" msgid "workspace.viewport.click-to-close-path" msgstr "Jānoklikšķina, lai aizvērtu ceļu" - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Noteikta nesaderīga iespēja '%s'" - -msgid "errors.paste-data-validation" -msgstr "Starpliktuvē ir nederīgi dati" - -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Turpināt komandas izveidošanu" - -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Uzsākt bez komandas" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Komandu būs iespējams izveidot vēlāk." - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Turpināt bez komandas" - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Izveidot komandu un nosūtīt uzaicinājumus" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Izveidot komandu un uzaicināt" - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Izveidot komandu" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Uzaicināt būs iespējams vēlāk" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "Izstrādātājs" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Iziet" - -msgid "media.image" -msgstr "Attēls" - -msgid "media.solid" -msgstr "Viengabalains" - -msgid "media.linear" -msgstr "Līnijveida" - -msgid "media.radial" -msgstr "Radiāls" - -msgid "media.gradient" -msgstr "Pāreja" - -msgid "media.choose-image" -msgstr "Izvēlēties attēlu" - -msgid "workspace.options.guides.title" -msgstr "Vadotnes" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Datnei ir nesaderīgs versijas numurs" - -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Izskatās, ka ir nesaderība starp iespējotajām iespējām un iespējām datnē, " -"kuru tiek mēģināts atvērt. Jāpiemēro '%s' migrācijas, pirms datne var tikt " -"atvērta." - -msgid "errors.validation" -msgstr "Pārbaudes kļūda" - -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Atiestatīt" - -msgid "labels.share" -msgstr "Kopīgot" - -msgid "labels.search" -msgstr "Meklēt" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Ar jauna konta izveidošanu tiek piekrists mūsu [pakalpojuma noteikumiem](%s) " -"un [privātuma nosacījumiem](%s)." - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Izveidot komandu bez uzaicināšanas" - -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Labot režģi" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Noteikt atrašanās vietu" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Darīts" - -msgid "workspace.options.component.swap" -msgstr "Mijmainīt sastāvdaļu" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Plūsma" - -msgid "workspace.top-bar.read-only.done" -msgstr "Darīts" - -msgid "workspace.options.component.swap.empty" -msgstr "Šajā bibliotēkā vēl nav līdzekļu" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Bulta" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Trijstūris" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Taisnstūris" - -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Apskatīšana** (tikai skatīt)" - -msgid "workspace.assets.duplicate-main" -msgstr "Divkāršot galveno" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "Modelētājs" - -msgid "dashboard.import.import-message" -msgid_plural "dashboard.import.import-message" -msgstr[0] "%s datņu tika veiksmīgi ievietotas." -msgstr[1] "%s datne tika veiksmīgi ievietota." -msgstr[2] "%s datnes tika veiksmīgi ievietotas." - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Bibliotēka ir tukša. Tiklīdz tā būs pievienota kā koplietojama bibliotēka, " -"izveidotie līdzekļi būs pieejami izmantošanai pārējos failos. Vai tiešām " -"padarīt to pieejamu?" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Atdalīt" - -msgid "workspace.options.component.copy" -msgstr "Ievietot starpliktuvē" - -msgid "workspace.options.component.main" -msgstr "Galvenais" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Aplis" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Dimants" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "" -"Līdzekļi, kas jau tiek izmantoti šajā datnē, paliks tajā (dizains netiks " -"salauzts)." -msgstr[1] "" -"Līdzeklis, kas jau tiek izmantots šajā datnē, paliks tajā (dizains netiks " -"salauzts)." -msgstr[2] "" -"Līdzekļi, kas jau tiek izmantoti šajā datnē, paliks tajā (dizains netiks " -"salauzts)." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Tirgvedība" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Dibinātājs/viceprezidents" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "Produktu vai projektu vadītājs" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "Kāda ir ieņemamā loma?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "Students vai pasniedzējs" - -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "Ir pieejama jauna versija, lūgums atsvaidzināt lapu" - -msgid "workspace.layout_grid.editor.title" -msgstr "Režģa labošana" diff --git a/frontend/translations/ms.po b/frontend/translations/ms.po index 110f93eca..087eb384d 100644 --- a/frontend/translations/ms.po +++ b/frontend/translations/ms.po @@ -1,16 +1,30 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-09 13:58+0000\n" +"PO-Revision-Date: 2024-02-10 15:02+0000\n" "Last-Translator: Revenant \n" -"Language-Team: Malay \n" +"Language-Team: Malay " +"\n" "Language: ms\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.4-dev\n" +#: src/app/main/ui/auth/register.cljs +msgid "auth.already-have-account" +msgstr "Sudah mempunyai akaun?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.check-your-email" +msgstr "" +"Semak e-mel anda dan klik pada pautan untuk mengesahkan dan mula " +"menggunakan Penpot." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.confirm-password" +msgstr "Mengesahkan kata laluan" + #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.create-demo-account" msgstr "Cipta akaun demo" @@ -69,6 +83,18 @@ msgstr "LDAP" msgid "auth.login-with-oidc-submit" msgstr "OpenID Connect" +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "Nama mesti mengandungi beberapa aksara selain ruang." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "Nama mesti mengandungi paling banyak 250 aksara." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.new-password" +msgstr "Taip kata laluan baharu" + #: src/app/main/ui/auth/recovery.cljs msgid "auth.notifications.invalid-token-error" msgstr "Token pemulihan adalah tidak sah." @@ -124,10 +150,18 @@ msgstr "Tukar kata laluan anda" msgid "auth.register" msgstr "Tiada akaun lagi?" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.register-submit" +msgstr "Cipta akaun" + #: src/app/main/ui/auth/register.cljs msgid "auth.register-subtitle" msgstr "Ia percuma dan Sumber Terbuka" +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-title" +msgstr "Cipta akaun" + #: src/app/main/ui/auth.cljs msgid "auth.sidebar-tagline" msgstr "Penyelesaian sumber terbuka untuk reka bentuk dan prototaip." @@ -135,6 +169,11 @@ msgstr "Penyelesaian sumber terbuka untuk reka bentuk dan prototaip." msgid "auth.terms-of-service" msgstr "Syarat perkhidmatan" +msgid "auth.terms-privacy-agreement" +msgstr "" +"Apabila membuat akaun baharu, anda bersetuju menerima syarat perkhidmatan " +"dan dasar privasi kami." + #: src/app/main/ui/auth/register.cljs #, markdown msgid "auth.terms-privacy-agreement-md" @@ -142,10 +181,9 @@ msgstr "" "Apabila membuat akaun baharu, anda bersetuju menerima [syarat " "perkhidmatan](%s) dan [dasar privasi](%s) kami." -msgid "auth.terms-privacy-agreement" -msgstr "" -"Apabila membuat akaun baharu, anda bersetuju menerima syarat perkhidmatan " -"dan dasar privasi kami." +#: src/app/main/ui/auth/register.cljs +msgid "auth.verification-email-sent" +msgstr "Kami telah menghantar e-mel pengesahan kepada" #: src/app/main/ui/onboarding/questions.cljs msgid "branding-illustrations-marketing-pieces" @@ -157,6 +195,11 @@ msgstr "Terbitkan" msgid "common.share-link.all-users" msgstr "Semua pengguna Penpot" +msgid "common.share-link.confirm-deletion-link-description" +msgstr "" +"Adakah anda pasti untuk mengalih keluar pautan ini? Jika anda melakukannya, " +"ia tidak lagi tersedia untuk sesiapa sahaja" + msgid "common.share-link.current-tag" msgstr "(semasa)" @@ -179,6 +222,9 @@ msgstr[0] "%s halaman dikongsi" msgid "common.share-link.permissions-can-comment" msgstr "Boleh komen" +msgid "common.share-link.permissions-can-inspect" +msgstr "Boleh memeriksa kod" + msgid "common.share-link.permissions-hint" msgstr "Sesiapa yang mempunyai pautan akan mendapat akses" @@ -220,6 +266,10 @@ msgstr "" "Pelajari asas-asas di Penpot sambil berseronok dengan tutorial guna tangan " "ini." +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.start" +msgstr "Mulakan tutorial" + #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.tutorial-hero.title" msgstr "Tutorial guna tangan" @@ -244,10 +294,22 @@ msgstr "Token disalin" msgid "dashboard.access-tokens.create" msgstr "Jana token baru" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "Token capaian berjaya dihasilkan." + #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.empty.add-one" msgstr "Tekan butang \"Jana token baharu\" untuk menjana token." +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "Anda tidak mempunyai token setakat ini." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "Nama diperlukan" + #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.expiration-180-days" msgstr "180 hari" @@ -284,6 +346,13 @@ msgstr "Tiada tarikh tamat tempoh" msgid "dashboard.access-tokens.personal" msgstr "Token capaian peribadi" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"Token capaian peribadi berfungsi seperti alternatif kepada sistem " +"pengesahan log masuk/kata laluan kami dan boleh digunakan untuk membenarkan " +"aplikasi mengakses API dalaman Penpot" + #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.token-will-expire" msgstr "Token akan luput pada %s" @@ -334,9 +403,9 @@ msgstr "Pendua %s fail" #, markdown msgid "dashboard.empty-placeholder-drafts" msgstr "" -"Fail yang ditambahkan pada Perpustakaan akan dipaparkan di sini. Cuba kongsi " -"fail anda atau tambahkan daripada [Perpustakaan & templat](https://penpot." -"app/libraries-templates.html) kami." +"Fail yang ditambahkan pada Perpustakaan akan dipaparkan di sini. Cuba " +"kongsi fail anda atau tambahkan daripada [Perpustakaan & " +"templat](https://penpot.app/libraries-templates.html) kami." msgid "dashboard.export-binary-multi" msgstr "Muat turun %s fail Penpot (.penpot)" @@ -344,75 +413,2356 @@ msgstr "Muat turun %s fail Penpot (.penpot)" msgid "dashboard.export-frames" msgstr "Eksport papan sebagai PDF" -#: src/app/main/ui/auth/register.cljs -msgid "auth.already-have-account" -msgstr "Sudah mempunyai akaun?" +#: src/app/main/ui/export.cljs +msgid "dashboard.export-frames.title" +msgstr "Eksport sebagai PDF" -#: src/app/main/ui/auth/register.cljs -msgid "auth.check-your-email" +msgid "dashboard.export-multi" +msgstr "Eksport fail Penpot %s" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-multiple.selected" +msgstr "%s daripada %s elemen dipilih" + +#: src/app/main/ui/workspace/header.cljs +msgid "dashboard.export-shapes" +msgstr "Eksport" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to" msgstr "" -"Semak e-mel anda dan klik pada pautan untuk mengesahkan dan mula menggunakan " -"Penpot." +"Anda boleh menambah tetapan eksport ke elemen daripada sifat reka bentuk " +"(di bahagian bawah bar sisi kanan)." -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-title" -msgstr "Cipta akaun" +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to-link" +msgstr "Maklumat cara untuk menetapkan eksport di Penpot." -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.confirm-password" -msgstr "Mengesahkan kata laluan" +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.no-elements" +msgstr "Tiada unsur dengan tetapan eksport." -#: src/app/main/ui/auth/register.cljs -msgid "auth.verification-email-sent" -msgstr "Kami telah menghantar e-mel pengesahan kepada" +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.title" +msgstr "Eksport Pemilihan" -msgid "common.share-link.confirm-deletion-link-description" +msgid "dashboard.export-standard-multi" +msgstr "Muat turun %s fail standard (.svg + .json)" + +msgid "dashboard.export.detail" +msgstr "* Mungkin termasuk komponen, grafik, warna dan/atau tipografi." + +msgid "dashboard.export.explain" msgstr "" -"Adakah anda pasti untuk mengalih keluar pautan ini? Jika anda melakukannya, " -"ia tidak lagi tersedia untuk sesiapa sahaja" +"Satu atau lebih fail yang anda ingin eksport menggunakan perpustakaan " +"kongsi. Apa yang anda mahu lakukan dengan aset mereka*?" -msgid "common.share-link.permissions-can-inspect" -msgstr "Boleh memeriksa kod" +msgid "dashboard.export.options.all.message" +msgstr "" +"fail dengan perpustakaan kongsi akan disertakan dalam eksport, mengekalkan " +"hubungannya." + +msgid "dashboard.export.options.all.title" +msgstr "Eksport perpustakaan kongsi" + +msgid "dashboard.export.options.detach.message" +msgstr "" +"Perpustakaan kongsi tidak akan disertakan dalam eksport dan tiada aset akan " +"ditambahkan ke perpustakaan. " + +msgid "dashboard.export.options.detach.title" +msgstr "Anggap aset perpustakaan kongsi sebagai objek asas" + +msgid "dashboard.export.options.merge.message" +msgstr "" +"Fail anda akan dieksport dengan semua aset luaran digabungkan ke dalam " +"pustaka fail." + +msgid "dashboard.export.options.merge.title" +msgstr "Sertakan aset perpustakaan kongsi dalam pustaka fail" + +msgid "dashboard.export.title" +msgstr "Eksport fail" + +msgid "dashboard.fonts.deleted-placeholder" +msgstr "Fon hilang" + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.dismiss-all" +msgstr "Tolak semua" + +msgid "dashboard.fonts.empty-placeholder" +msgstr "Fon tersuai yang anda muat naik akan dipaparkan di sini." + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.fonts-added" +msgid_plural "dashboard.fonts.fonts-added" +msgstr[0] "%s fon ditambah" + +#, markdown +msgid "dashboard.fonts.hero-text1" +msgstr "" +"Sebarang fon web yang anda muat naik di sini akan ditambahkan pada senarai " +"keluarga fon yang tersedia pada sifat teks fail pasukan ini. Fon dengan " +"nama keluarga fon yang sama akan dikumpulkan sebagai **keluarga fon " +"tunggal**. Anda boleh memuat naik fon dengan format berikut: **TTF, OTF dan " +"WOFF** (hanya satu sahaja diperlukan)." + +#, markdown +msgid "dashboard.fonts.hero-text2" +msgstr "" +"Anda hanya perlu memuat naik fon yang anda miliki atau mempunyai lesen " +"untuk digunakan dalam Penpot. Ketahui lebih lanjut dalam bahagian Hak " +"kandungan [Syarat Perkhidmatan Penpot](https://penpot.app/terms.html). Anda " +"juga mungkin ingin membaca tentang [pelesenan " +"fon](https://www.typography.com/faq)." + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.upload-all" +msgstr "Muat naik semua" + +#, markdown +msgid "dashboard.fonts.warning-text" +msgstr "" +"Kami telah mengesan kemungkinan masalah dalam fon anda yang berkaitan " +"dengan metrik menegak untuk sistem pengendalian yang berbeza. Untuk " +"menyemaknya, anda boleh menggunakan perkhidmatan metrik menegak fon seperti " +"[ini](https://vertical-metrics.netlify.app/). Selain itu, kami mengesyorkan " +"menggunakan [Transfonter](https://transfonter.org/) untuk menjana fon web " +"dan membetulkan ralat. " + +msgid "dashboard.import" +msgstr "Import fail Penpot" + +msgid "dashboard.import.analyze-error" +msgstr "Alamak! Kami tidak dapat mengimport fail ini" + +msgid "dashboard.import.analyze-error.components-v2" +msgstr "" +"Fail dengan komponen v2 diaktifkan tetapi pasukan ini belum menyokongnya " +"lagi." + +msgid "dashboard.import.import-error" +msgstr "Terdapat masalah mengimport fail. Fail tidak diimport." + +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "%s fail telah berjaya diimport." + +msgid "dashboard.import.import-warning" +msgstr "Sesetengah fail mengandungi objek tidak sah telah dialih keluar." + +msgid "dashboard.import.progress.process-colors" +msgstr "memproses warna" + +msgid "dashboard.import.progress.process-components" +msgstr "Memproses komponen" + +msgid "dashboard.import.progress.process-media" +msgstr "Memproses media" + +msgid "dashboard.import.progress.process-page" +msgstr "Memproses halaman: %s" + +msgid "dashboard.import.progress.process-typographies" +msgstr "Memproses tipografi" + +msgid "dashboard.import.progress.upload-data" +msgstr "Memuat naik data ke pelayan (%s/%s)" + +msgid "dashboard.import.progress.upload-media" +msgstr "Memuat naik fail: %s" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.invite-profile" +msgstr "Jemput orang ramai" + +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.leave-team" +msgstr "Tinggalkan pasukan" + +msgid "dashboard.libraries-and-templates" +msgstr "Perpustakaan & Templat" + +msgid "dashboard.libraries-and-templates.explore" +msgstr "Terokai lebih banyak daripada mereka dan ketahui cara untuk menyumbang" + +msgid "dashboard.libraries-and-templates.import-error" +msgstr "Terdapat masalah mengimport templat. Templat tidak diimport." + +#: src/app/main/ui/dashboard/libraries.cljs +msgid "dashboard.libraries-title" +msgstr "Perpustakaan" + +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.loading-files" +msgstr "memuatkan fail anda…" + +msgid "dashboard.loading-fonts" +msgstr "memuatkan fon anda…" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to" +msgstr "Berpindah ke" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-multi" +msgstr "Pindahkan fail %s ke" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-other-team" +msgstr "Pindah ke pasukan lain" + +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/files.cljs +msgid "dashboard.new-file" +msgstr "+ Fail Baharu" + +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-file-prefix" +msgstr "Fail Baharu" #: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.start" -msgstr "Mulakan tutorial" +msgid "dashboard.new-project" +msgstr "+ Projek baharu" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "Token capaian berjaya dihasilkan." +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-project-prefix" +msgstr "Projek Baharu" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.no-matches-for" +msgstr "Tiada padanan ditemui untuk \"%s\"" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.no-projects-placeholder" +msgstr "Projek yang disemat akan muncul di sini" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-changed-successfully" +msgstr "Alamat e-mel anda telah berjaya dikemas kini" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-verified-successfully" +msgstr "Alamat e-mel anda telah berjaya disahkan" + +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.notifications.password-saved" +msgstr "Kata laluan berjaya disimpan!" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.num-of-members" +msgstr "%s ahli" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.open-in-new-tab" +msgstr "Buka fail dalam tab baharu" + +msgid "dashboard.options" +msgstr "Pilihan" + +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.password-change" +msgstr "Tukar kata laluan" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.pin-unpin" +msgstr "Semat/Nyahsemat" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.projects-title" +msgstr "Projek" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.remove-account" +msgstr "Mahu mengalih keluar akaun anda?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.remove-shared" +msgstr "Alih keluar sebagai Pustaka Dikongsi" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.save-settings" +msgstr "Simpan tetapan" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.search-placeholder" +msgstr "Cari…" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.searching-for" +msgstr "Mencari \"%s\"…" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-language" +msgstr "Pilih Bahasa UI" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-theme" +msgstr "Pilih tema" + +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.show-all-files" +msgstr "Tunjukkan semua fail" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-delete-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "Fail anda telah berjaya dipadamkan" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-delete-project" +msgstr "Projek anda telah berjaya dipadamkan" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-duplicate-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "Fail anda telah berjaya dibuat pendua" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-duplicate-project" +msgstr "Projek anda telah berjaya dibuat pendua" + +#: src/app/main/ui/dashboard/grid.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-file" +msgstr "Fail anda berjaya dialihkan" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-files" +msgstr "Fail anda telah berjaya dialihkan" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-move-project" +msgstr "Projek anda berjaya dialihkan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-info" +msgstr "Maklumat pasukan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-members" +msgstr "Anggota kumpulan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-projects" +msgstr "Projek pasukan" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.theme-change" +msgstr "Tema UI" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.title-search" +msgstr "Hasil carian" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.type-something" +msgstr "Taip untuk hasil carian" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.unpublish-shared" +msgstr "Nyahterbit Perpustakaan" + +#: src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs +msgid "dashboard.update-settings" +msgstr "Kemas kini tetapan" + +msgid "dashboard.webhooks.active" +msgstr "Adalah aktif" + +msgid "dashboard.webhooks.active.explain" +msgstr "Apabila cangkuk ini dicetuskan, butiran peristiwa akan dihantar" + +msgid "dashboard.webhooks.content-type" +msgstr "Jenis kandungan" + +msgid "dashboard.webhooks.create" +msgstr "Cipta webhook" + +msgid "dashboard.webhooks.create.success" +msgstr "Webhook berjaya dihasilkan." + +msgid "dashboard.webhooks.description" msgstr "" -"Token capaian peribadi berfungsi seperti alternatif kepada sistem pengesahan " -"log masuk/kata laluan kami dan boleh digunakan untuk membenarkan aplikasi " -"mengakses API dalaman Penpot" +"Webhooks adalah cara mudah untuk membolehkan tapak web dan apl lain " +"dimaklumkan apabila acara tertentu berlaku di Penpot. Kami akan menghantar " +"permintaan POST ke setiap URL yang anda berikan." -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.no-access-tokens" -msgstr "Anda tidak mempunyai token setakat ini." +msgid "dashboard.webhooks.empty.add-one" +msgstr "Tekan butang \"Tambah webhook\" untuk menambahnya." -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "Nama diperlukan" +msgid "dashboard.webhooks.empty.no-webhooks" +msgstr "Tiada webhook dibuat setakat ini." -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "Nama mesti mengandungi beberapa aksara selain ruang." +msgid "dashboard.webhooks.update.success" +msgstr "Webhook berjaya dikemas kini." -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "Nama mesti mengandungi paling banyak 250 aksara." +#: src/app/main/ui/settings.cljs +msgid "dashboard.your-account-title" +msgstr "Akaun anda" -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.new-password" -msgstr "Taip kata laluan baharu" +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-email" +msgstr "E-mel" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.register-submit" -msgstr "Cipta akaun" +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-name" +msgstr "Nama anda" -#: src/app/main/ui/export.cljs -msgid "dashboard.export-frames.title" -msgstr "Eksport sebagai PDF" +#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.your-penpot" +msgstr "Penpot anda" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-ok" +msgstr "Ok" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-title" +msgstr "Perhatian" + +#: src/app/main/ui/confirm.cljs +msgid "ds.component-subtitle" +msgstr "Komponen untuk dikemas kini:" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-cancel" +msgstr "Batal" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-ok" +msgstr "Ok" + +#: src/app/main/ui/confirm.cljs, src/app/main/ui/confirm.cljs +msgid "ds.confirm-title" +msgstr "Adakah anda pasti?" + +#: src/app/main/ui/auth/login.cljs +msgid "errors.auth-provider-not-configured" +msgstr "Pembekal pengesahan tidak dikonfigurasikan." + +msgid "errors.auth.unable-to-login" +msgstr "Nampaknya anda belum disahkan atau sesi telah tamat tempoh." + +msgid "errors.bad-font" +msgstr "Fon %s tidak dapat dimuatkan" + +msgid "errors.bad-font-plural" +msgstr "Fon %s tidak dapat dimuatkan" + +msgid "errors.cannot-upload" +msgstr "Tidak boleh memuat naik fail media." + +#: src/app/main/data/workspace.cljs +msgid "errors.clipboard-not-implemented" +msgstr "Pelayar anda tidak dapat melakukan operasi ini" + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs +msgid "errors.email-already-exists" +msgstr "E-mel sudah digunakan" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.email-already-validated" +msgstr "E-mel sudah disahkan." + +msgid "errors.email-as-password" +msgstr "Anda tidak boleh menggunakan e-mel sebagai kata laluan" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.email-has-permanent-bounces" +msgstr "E-mel «%s» mempunyai banyak laporan lantunan kekal." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs +msgid "errors.email-invalid" +msgstr "Sila masukkan e-mel yang sah" + +#: src/app/main/ui/settings/change_email.cljs +msgid "errors.email-invalid-confirmation" +msgstr "E-mel pengesahan mesti sepadan" + +msgid "errors.email-spam-or-permanent-bounces" +msgstr "E-mel «%s» telah dilaporkan sebagai spam atau melantun secara kekal." + +#: src/app/main/errors.cljs +msgid "errors.feature-mismatch" +msgstr "" +"Nampaknya anda sedang membuka fail yang mendayakan ciri '%s' tetapi versi " +"penpot semasa tidak menyokongnya atau menyahdayakannya." + +#: src/app/main/errors.cljs +msgid "errors.feature-not-supported" +msgstr "Ciri '%s' tidak disokong." + +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Nampaknya terdapat ketidakpadanan antara ciri yang didayakan dan ciri fail " +"yang anda cuba buka. Migrasi untuk '%s' perlu digunakan sebelum fail boleh " +"dibuka." + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.generic" +msgstr "Sesuatu yang tidak kena telah berlaku." + +#: src/app/main/ui/components/color_input.cljs +msgid "errors.invalid-color" +msgstr "Warna tidak sah" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.invite-invalid" +msgstr "Jemputan tidak sah" + +msgid "errors.invite-invalid.info" +msgstr "Jemputan ini mungkin dibatalkan atau mungkin tamat tempoh." + +#: src/app/main/ui/auth/login.cljs +msgid "errors.ldap-disabled" +msgstr "Pengesahan LDAP dilumpuhkan." + +#: src/app/main/errors.cljs +msgid "errors.max-quote-reached" +msgstr "Anda telah mencapai petikan '%s'. Hubungi sokongan." + +#: src/app/main/data/workspace/persistence.cljs +msgid "errors.media-too-large" +msgstr "Imej terlalu besar untuk dimasukkan." + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "errors.media-type-mismatch" +msgstr "Nampaknya kandungan imej tidak sepadan dengan sambungan fail." + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "errors.media-type-not-allowed" +msgstr "Nampaknya ini bukan imej yang sah." + +#: src/app/main/ui/dashboard/team.cljs +msgid "errors.member-is-muted" +msgstr "" +"Profil yang anda jemput mempunyai e-mel yang diredamkan (laporan spam atau " +"lantunan tinggi)." + +#: src/app/main/ui/settings/password.cljs +msgid "errors.password-invalid-confirmation" +msgstr "Kata laluan pengesahan mesti sepadan" + +#: src/app/main/ui/settings/password.cljs +msgid "errors.password-too-short" +msgstr "Kata laluan hendaklah sekurang-kurangnya 8 aksara" + +msgid "errors.paste-data-validation" +msgstr "Data tidak sah dalam papan klip" + +msgid "errors.profile-blocked" +msgstr "Profil disekat" + +#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.profile-is-muted" +msgstr "" +"Profil anda mempunyai e-mel yang diredamkan (laporan spam atau lantunan " +"tinggi)." + +#: src/app/main/ui/auth/register.cljs +msgid "errors.registration-disabled" +msgstr "Pendaftaran dilumpuhkan pada masa ini." + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Ciri tidak serasi '%s' dikesan" + +msgid "errors.team-leave.insufficient-members" +msgstr "" +"Ahli tidak mencukupi untuk meninggalkan pasukan, anda mungkin mahu " +"memadamkannya." + +msgid "errors.team-leave.member-does-not-exists" +msgstr "Ahli yang anda cuba tetapkan tidak wujud." + +msgid "errors.team-leave.owner-cant-leave" +msgstr "" +"Pemilik tidak boleh meninggalkan pasukan, anda mesti menetapkan semula " +"peranan pemilik." + +#: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "errors.unexpected-error" +msgstr "Ralat yang tidak dijangka berlaku." + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.unexpected-token" +msgstr "Token tidak diketahui" + +msgid "errors.validation" +msgstr "Ralat Pengesahan" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Fail mempunyai nombor versi yang tidak serasi" + +msgid "errors.webhooks.connection" +msgstr "Ralat sambungan, URL tidak dapat dicapai" + +msgid "errors.webhooks.invalid-uri" +msgstr "URL tidak lulus pengesahan." + +msgid "errors.webhooks.last-delivery" +msgstr "Penghantaran terakhir tidak berjaya." + +msgid "errors.webhooks.ssl-validation" +msgstr "Ralat pada pengesahan SSL." + +msgid "errors.webhooks.timeout" +msgstr "Masa tamat" + +msgid "errors.webhooks.unexpected" +msgstr "Ralat yang tidak dijangka semasa mengesahkan" + +msgid "errors.webhooks.unexpected-status" +msgstr "Status tidak dijangka %s" + +#: src/app/main/ui/auth/login.cljs +msgid "errors.wrong-credentials" +msgstr "E-mel atau kata laluan tidak betul." + +#: src/app/main/ui/settings/password.cljs +msgid "errors.wrong-old-password" +msgstr "Kata laluan lama tidak betul" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.description" +msgstr "Penerangan" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-go-to" +msgstr "Pergi ke forum Penpot" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-subtitle1" +msgstr "" +"Kami berbesar hati anda berada disini. Jika anda memerlukan bantuan, sila " +"cari sebelum anda menyiarkan siaran baharu." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-title" +msgstr "Komuniti Penpot" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subject" +msgstr "Subjek" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subtitle" +msgstr "" +"Sila terangkan sebab e-mel anda, nyatakan sama ada isu, idea atau keraguan. " +"Seorang ahli pasukan kami akan menjawab secepat mungkin." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.title" +msgstr "E-mel" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-go-to" +msgstr "Pergi ke Twitter" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-subtitle1" +msgstr "Kami di sini untuk membantu dengan pertanyaan teknikal anda." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-title" +msgstr "Akaun sokongan Twitter" + +#: src/app/main/ui/settings/password.cljs +msgid "generic.error" +msgstr "Ralat telah berlaku" + +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur" +msgstr "Kabur" + +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur.value" +msgstr "Nilai" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hex" +msgstr "HEX" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hsla" +msgstr "HSLA" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.rgba" +msgstr "RGBA" + +#: src/app/main/ui/inspect/attributes/fill.cljs +msgid "inspect.attributes.fill" +msgstr "Isi" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.download" +msgstr "Muat turun sumber gambar" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.height" +msgstr "Tinggi" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.width" +msgstr "Lebar" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout" +msgstr "Susun atur" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.height" +msgstr "Tinggi" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.left" +msgstr "kiri" + +#: src/app/main/ui/inspect/attributes/layout.cljs, src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.radius" +msgstr "Jejari" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.rotation" +msgstr "Putaran" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.top" +msgstr "Atas" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.width" +msgstr "Lebar" + +#: src/app/main/ui/inspect/attributes/shadow.cljs +msgid "inspect.attributes.shadow" +msgstr "Bayang" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.size" +msgstr "Ukuran dan kedudukan" + +#: src/app/main/ui/inspect/attributes/stroke.cljs +#, fuzzy +msgid "inspect.attributes.stroke" +msgstr "Gurisan" + +#, permanent +msgid "inspect.attributes.stroke.alignment.center" +msgstr "Tengah" + +#, permanent +msgid "inspect.attributes.stroke.alignment.inner" +msgstr "Dalam" + +#, permanent +msgid "inspect.attributes.stroke.alignment.outer" +msgstr "Luar" + +msgid "inspect.attributes.stroke.style.dotted" +msgstr "Bertitik" + +msgid "inspect.attributes.stroke.style.mixed" +msgstr "bercampur" + +msgid "inspect.attributes.stroke.style.none" +msgstr "Tiada" + +msgid "inspect.attributes.stroke.style.solid" +msgstr "Padu" + +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke.width" +msgstr "Lebar" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography" +msgstr "Tipografi" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-family" +msgstr "Keluarga Fon" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-size" +msgstr "Saiz huruf" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-style" +msgstr "Gaya Huruf" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-weight" +msgstr "Berat Huruf" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.letter-spacing" +msgstr "Jarak Huruf" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.line-height" +msgstr "Tinggi Garis" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-decoration" +msgstr "Hiasan Teks" + +msgid "inspect.attributes.typography.text-decoration.none" +msgstr "Tiada" + +msgid "inspect.attributes.typography.text-decoration.strikethrough" +msgstr "Tembus" + +msgid "inspect.attributes.typography.text-decoration.underline" +msgstr "Garis bawah" + +#: src/app/main/ui/inspect/attributes/text.cljs +#, fuzzy +msgid "inspect.attributes.typography.text-transform" +msgstr "Transformasian Teks" + +msgid "inspect.attributes.typography.text-transform.lowercase" +msgstr "Huruf Kecil" + +msgid "inspect.attributes.typography.text-transform.none" +msgstr "Tiada" + +msgid "inspect.attributes.typography.text-transform.titlecase" +msgstr "Huruf Tajuk" + +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Nyahset" + +msgid "inspect.attributes.typography.text-transform.uppercase" +msgstr "Huruf Besar" + +msgid "inspect.empty.help" +msgstr "" +"Jika anda ingin mengetahui lebih lanjut tentang pemeriksaan reka bentuk, " +"lawati pusat bantuan Penpot" + +#, fuzzy +msgid "inspect.empty.more-info" +msgstr "Maklumat lanjut tentang inspect" + +msgid "inspect.empty.select" +msgstr "Pilih bentuk, papan atau kumpulan untuk memeriksa sifat dan kod mereka" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code" +msgstr "Kod" + +msgid "inspect.tabs.code.selected.circle" +msgstr "Bulatan" + +msgid "inspect.tabs.code.selected.component" +msgstr "Komponen" + +msgid "inspect.tabs.code.selected.curve" +msgstr "Lengkung" + +msgid "inspect.tabs.code.selected.frame" +msgstr "Papan" + +msgid "inspect.tabs.code.selected.group" +msgstr "Kumpulan" + +msgid "inspect.tabs.code.selected.image" +msgstr "Gambar" + +msgid "inspect.tabs.code.selected.mask" +msgstr "Maska" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code.selected.multiple" +msgstr "%s Dipilih" + +msgid "inspect.tabs.code.selected.path" +msgstr "Laluan" + +msgid "inspect.tabs.code.selected.rect" +msgstr "Segi empat tepat" + +msgid "inspect.tabs.code.selected.svg-raw" +msgstr "SVG" + +msgid "inspect.tabs.code.selected.text" +msgstr "Teks" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.info" +msgstr "Maklumat" + +#: src/app/main/ui/workspace/header.cljs +msgid "label.shortcuts" +msgstr "Pintasan" + +msgid "labels.accept" +msgstr "Terima" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "Token capaian" + +msgid "labels.active" +msgstr "Aktif" + +msgid "labels.add-custom-font" +msgstr "Tambah fon tersuai" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.admin" +msgstr "Pentadbir" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.all" +msgstr "Semua" + +msgid "labels.and" +msgstr "dan" + +msgid "labels.back" +msgstr "Kembali" + +#: src/app/main/ui/static.cljs +msgid "labels.bad-gateway.desc-message" +msgstr "" +"Nampaknya anda perlu menunggu sebentar dan mencuba semula; kami sedang " +"melakukan penyelenggaraan kecil pelayan kami." + +#: src/app/main/ui/static.cljs +msgid "labels.bad-gateway.main-message" +msgstr "Ralat pelayan (Bad Gateway)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.cancel" +msgstr "Batal" + +msgid "labels.close" +msgstr "Tutup" + +#: src/app/main/ui/dashboard/comments.cljs +msgid "labels.comments" +msgstr "Komen" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.community" +msgstr "Komuniti" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.confirm-password" +msgstr "Sahkan kata laluan" + +msgid "labels.continue" +msgstr "Teruskan" + +msgid "labels.continue-with" +msgstr "Teruskan dengan" + +msgid "labels.continue-with-penpot" +msgstr "Anda boleh meneruskan dengan akaun Penpot" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.copy-invitation-link" +msgstr "Salin pautan" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "labels.create" +msgstr "Cipta" + +#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team" +msgstr "Cipta pasukan baharu" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team.placeholder" +msgstr "Masukkan nama pasukan baharu" + +msgid "labels.custom-fonts" +msgstr "Fon tersuai" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.dashboard" +msgstr "Papan pemuka" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete" +msgstr "Padam" + +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment" +msgstr "Padam komen" + +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment-thread" +msgstr "Padam bebenang" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.delete-invitation" +msgstr "Padam jemputan" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete-multi-files" +msgstr "Padam fail %s" + +msgid "labels.discard" +msgstr "Buang" + +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.drafts" +msgstr "Draf" + +#: src/app/main/ui/comments.cljs +msgid "labels.edit" +msgstr "Sunting" + +msgid "labels.edit-file" +msgstr "Sunting fail" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.editor" +msgstr "Penyunting" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.expired-invitation" +msgstr "Tamat tempoh" + +msgid "labels.export" +msgstr "Eksport" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-disabled" +msgstr "Maklum balas dilumpuhkan" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-sent" +msgstr "Maklum balas dihantar" + +msgid "labels.font-family" +msgstr "Keluarga Fon" + +msgid "labels.font-providers" +msgstr "Pembekal fon" + +msgid "labels.font-variants" +msgstr "Gaya" + +msgid "labels.fonts" +msgstr "Fon" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.github-repo" +msgstr "Repositori Github" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.give-feedback" +msgstr "Beri maklum balas" + +msgid "labels.go-back" +msgstr "Pergi balik" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.help-center" +msgstr "Pusat Bantuan" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.hide-resolved-comments" +msgstr "Sembunyikan komen yang diselesaikan" + +msgid "labels.inactive" +msgstr "tidak aktif" + +msgid "labels.installed-fonts" +msgstr "Fon yang dipasang" + +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.desc-message" +msgstr "" +"Sesuatu yang buruk telah berlaku. Sila cuba semula operasi dan jika masalah " +"berterusan, hubungi sokongan." + +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.main-message" +msgstr "Ralat Dalaman" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.invitations" +msgstr "Jemputan" + +#: src/app/main/ui/settings/options.cljs +msgid "labels.language" +msgstr "Bahasa" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.libraries-and-templates" +msgstr "Perpustakaan & Templat" + +msgid "labels.log-or-sign" +msgstr "Log masuk atau daftar" + +#: src/app/main/ui/settings.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.logout" +msgstr "Log keluar" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.member" +msgstr "Ahli" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.members" +msgstr "Ahli" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.new-password" +msgstr "Kata laluan baharu" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs +msgid "labels.no-comments-available" +msgstr "" +"Anda telah melihat semua yang baru! Pemberitahuan ulasan baharu akan " +"dipaparkan di sini." + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.no-invitations" +msgstr "Tiada jemputan tertunda." + +#: src/app/main/ui/dashboard/team.cljs +#, markdown +msgid "labels.no-invitations-hint" +msgstr "Klik butang **Jemput orang** untuk menjemput orang ke pasukan ini." + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.desc-message" +msgstr "" +"Halaman ini mungkin tidak wujud atau anda tiada kebenaran untuk " +"mengaksesnya." + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.main-message" +msgstr "Alamak!" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.num-of-files" +msgid_plural "labels.num-of-files" +msgstr[0] "%s fail" + +msgid "labels.num-of-frames" +msgid_plural "labels.num-of-frames" +msgstr[0] "%s papan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.num-of-projects" +msgid_plural "labels.num-of-projects" +msgstr[0] "%s projek" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.old-password" +msgstr "Kata laluan lama" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.only-yours" +msgstr "Hanya milik anda" + +msgid "labels.or" +msgstr "atau" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.owner" +msgstr "Pemilik" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.password" +msgstr "Kata laluan" + +#: src/app/main/ui/dashboard/team.cljs +#, fuzzy +msgid "labels.pending-invitation" +msgstr "Belum selesai" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.profile" +msgstr "Profil" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.projects" +msgstr "Projek" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.release-notes" +msgstr "Nota keluaran" + +#: src/app/main/ui/workspace.cljs +msgid "labels.reload-file" +msgstr "Muat semula fail" + +#: src/app/main/ui/workspace/libraries.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.remove" +msgstr "Alih keluar" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.remove-member" +msgstr "Buang ahli" + +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.rename" +msgstr "Namakan semula" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.rename-team" +msgstr "Namakan semula pasukan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.resend-invitation" +msgstr "Hantar semula jemputan" + +#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs +msgid "labels.retry" +msgstr "Cuba semula" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.role" +msgstr "Peranan" + +msgid "labels.save" +msgstr "Simpan" + +msgid "labels.search" +msgstr "Cari" + +msgid "labels.search-font" +msgstr "Cari fon" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.send" +msgstr "Hantar" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.sending" +msgstr "Menghantar…" + +#: src/app/main/ui/static.cljs +msgid "labels.service-unavailable.desc-message" +msgstr "Kami sedang menjalankan penyelenggaraan berjadual pada sistem kami." + +#: src/app/main/ui/static.cljs +msgid "labels.service-unavailable.main-message" +msgstr "Perkhidmatan Tidak Tersedia" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.settings" +msgstr "Tetapan" + +msgid "labels.share" +msgstr "Kongsi" + +msgid "labels.share-prototype" +msgstr "Kongsi prototaip" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.shared-libraries" +msgstr "Perpustakaan" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-all-comments" +msgstr "Paparkan semua komen" + +msgid "labels.show-comments-list" +msgstr "Paparkan senarai komen" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-your-comments" +msgstr "Paparkan komen anda sahaja" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.status" +msgstr "Status" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.tutorials" +msgstr "Tutorial" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.unpublish-multi-files" +msgstr "Nyahterbitkan %s fail" + +#: src/app/main/ui/settings/profile.cljs +msgid "labels.update" +msgstr "Kemas kini" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.update-team" +msgstr "Kemas kini pasukan" + +msgid "labels.upload" +msgstr "Muat naik" + +msgid "labels.upload-custom-fonts" +msgstr "Muat naik fon tersuai" + +msgid "labels.uploading" +msgstr "Memuat naik…" + +msgid "labels.view-only" +msgstr "LIHAT SAHAJA" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.viewer" +msgstr "Penonton" + +msgid "labels.webhooks" +msgstr "Cangkuk Web (Webhook)" + +#: src/app/main/ui/comments.cljs +msgid "labels.write-new-comment" +msgstr "Tulis komen baharu" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.you" +msgstr "(anda)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.your-account" +msgstr "Akaun anda" + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "media.loading" +msgstr "Memuatkan gambar…" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Pustaka anda kosong. Setelah ditambahkan sebagai Pustaka Dikongsi, aset " +"yang anda buat akan tersedia untuk digunakan antara fail anda yang lain. " +"Adakah anda pasti mahu menerbitkannya?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.accept" +msgstr "Tambah sebagai Pustaka Kongsi" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.hint" +msgstr "" +"Setelah ditambahkan sebagai Pustaka Kongsi, aset pustaka fail ini akan " +"tersedia untuk digunakan antara fail anda yang lain." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.message" +msgstr "Tambah “%s” sebagai Pustaka Kongsi" + +#: src/app/main/ui/workspace/nudge.cljs +#, fuzzy +msgid "modals.big-nudge" +msgstr "Anjakan besar" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.confirm-email" +msgstr "Sahkan e-mel baharu" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.info" +msgstr "" +"Kami akan menghantar e-mel ke e-mel semasa anda “%s” untuk pengesahan " +"identiti." + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.new-email" +msgstr "E-mel baharu" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.submit" +msgstr "Tukar e-mel" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.title" +msgstr "Tukar e-mel anda" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.copy-token" +msgstr "Salin token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.expiration-date.label" +msgstr "Tarikh tamat tempoh" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "Nama" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.placeholder" +msgstr "Nama boleh membantu untuk mengetahui token itu untuk apa" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "Cipta token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "Jana token capaian" + +msgid "modals.create-webhook.submit-label" +msgstr "Cipta cangkuk web (webhook)" + +msgid "modals.create-webhook.title" +msgstr "Cipta cangkuk web (webhook)" + +msgid "modals.create-webhook.url.label" +msgstr "URL muatan" + +msgid "modals.create-webhook.url.placeholder" +msgstr "https://example.com/postreceive" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "Padam token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.message" +msgstr "Adakah anda pasti mahu memadamkan token ini?" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "Padam token" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.cancel" +msgstr "Batal dan kekalkan akaun saya" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.confirm" +msgstr "Ya, padam akaun saya" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.info" +msgstr "" +"Dengan mengalih keluar akaun anda, anda akan kehilangan semua projek dan " +"arkib semasa anda." + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.title" +msgstr "Adakah anda pasti mahu memadam akaun anda?" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.accept" +msgstr "Padam perbualan" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.message" +msgstr "" +"Adakah anda pasti mahu memadamkan perbualan ini? Semua komen dalam urutan " +"ini akan dipadamkan." + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.title" +msgstr "Padam perbualan" + +msgid "modals.delete-component-annotation.message" +msgstr "Adakah anda pasti ingin memadamkan anotasi ini?" + +msgid "modals.delete-component-annotation.title" +msgstr "Padam anotasi" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.accept" +msgstr "Padam fail" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.message" +msgstr "Adakah anda pasti mahu memadamkan fail ini?" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.title" +msgstr "Memadam fail" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.accept" +msgstr "Padam fail" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.message" +msgstr "Adakah anda pasti mahu memadamkan %s fail?" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.title" +msgstr "Memadamkan %s fail" + +msgid "modals.delete-font-variant.message" +msgstr "" +"Adakah anda pasti mahu memadamkan gaya fon ini? Ia tidak akan dimuatkan " +"jika digunakan dalam fail." + +msgid "modals.delete-font-variant.title" +msgstr "Memadam gaya fon" + +msgid "modals.delete-font.message" +msgstr "" +"Adakah anda pasti mahu memadamkan fon ini? Ia tidak akan dimuatkan jika " +"digunakan dalam fail." + +msgid "modals.delete-font.title" +msgstr "Memadam fon" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.body" +msgstr "Adakah anda pasti mahu memadamkan halaman ini?" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.title" +msgstr "Padam halaman" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.accept" +msgstr "Padam projek" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.message" +msgstr "Adakah anda pasti mahu memadamkan projek ini?" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.title" +msgstr "Padam projek" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.accept" +msgid_plural "modals.delete-shared-confirm.accept" +msgstr[0] "Padam fail" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "Ia tidak diaktifkan dalam mana-mana fail." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.scd-message" +msgid_plural "modals.delete-shared-confirm.activated.scd-message" +msgstr[0] "Pustaka ini diaktifkan di sini: " + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.message" +msgid_plural "modals.delete-shared-confirm.message" +msgstr[0] "Adakah anda pasti mahu memadamkan fail ini?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.title" +msgid_plural "modals.delete-shared-confirm.title" +msgstr[0] "Memadam fail" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.accept" +msgstr "Padam pasukan" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.message" +msgstr "" +"Adakah anda pasti mahu memadamkan pasukan ini? Semua projek dan fail yang " +"dikaitkan dengan pasukan akan dipadamkan secara kekal." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.title" +msgstr "Memadam pasukan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.accept" +msgstr "Padam ahli" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.message" +msgstr "Adakah anda pasti mahu memadamkan ahli ini daripada pasukan?" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.title" +msgstr "Padam ahli pasukan" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "" +"Aset yang telah digunakan dalam fail ini akan kekal di sana (tiada reka " +"bentuk akan rosak)." + +msgid "modals.delete-webhook.accept" +msgstr "Padam cangkuk web (webhook)" + +msgid "modals.delete-webhook.message" +msgstr "Adakah anda pasti mahu memadamkan cangkuk web (webhook) ini?" + +msgid "modals.delete-webhook.title" +msgstr "Memadam cangkuk web (webhook)" + +msgid "modals.edit-webhook.submit-label" +msgstr "Sunting cangkuk web (webhook)" + +msgid "modals.edit-webhook.title" +msgstr "Sunting cangkuk web (webhook)" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-member-confirm.accept" +msgstr "Hantar jemputan" + +msgid "modals.invite-member.emails" +msgstr "E-mel, dipisahkan dengan koma" + +msgid "modals.invite-member.repeated-invitation" +msgstr "" +"Sesetengah e-mel adalah daripada ahli pasukan semasa. Jemputan mereka tidak " +"akan dihantar." + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-team-member.title" +msgstr "Jemput ahli ke pasukan" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.hint" +msgstr "" +"Memandangkan anda satu-satunya ahli pasukan, pasukan ini akan dipadamkan " +"bersama-sama dengan projek dan failnya." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.message" +msgstr "Adakah anda pasti mahu meninggalkan pasukan %s?" + +msgid "modals.leave-and-reassign.forbidden" +msgstr "" +"Anda tidak boleh meninggalkan pasukan jika tiada ahli lain untuk dinaikkan " +"pangkat kepada pemilik. Anda mungkin mahu memadamkan pasukan." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.hint1" +msgstr "" +"Anda adalah pemilik pasukan ini. Sila pilih ahli lain untuk dinaikkan " +"pangkat kepada pemilik sebelum anda pergi." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.promote-and-leave" +msgstr "Naik pangkat dan tinggalkan" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.select-member-to-promote" +msgstr "Pilih ahli untuk dinaikkan pangkat" + +#: src/app/main/ui/dashboard/sidebar.cljs +#, fuzzy +msgid "modals.leave-and-reassign.title" +msgstr "Sebelum anda pergi" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.accept" +msgstr "Tinggalkan pasukan" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.message" +msgstr "Adakah anda pasti mahu meninggalkan pasukan ini?" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.title" +msgstr "Meninggalkan pasukan" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.nudge-title" +msgstr "Jumlah anjakan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.accept" +msgstr "Pindah hak milik" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.hint" +msgstr "" +"Jika anda memindahkan pemilikan, anda akan menukar peranan anda kepada " +"Pentadbir, kehilangan beberapa kebenaran ke atas pasukan ini. " + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.message" +msgstr "" +"Anda adalah pemilik semasa pasukan ini. Adakah anda pasti mahu menjadikan " +"%s pemilik baharu pasukan?" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.title" +msgstr "Pemilik pasukan baru" + +msgid "modals.publish-empty-library.accept" +msgstr "Terbitkan" + +msgid "modals.publish-empty-library.message" +msgstr "Pustaka anda kosong. Adakah anda pasti mahu menerbitkannya?" + +msgid "modals.publish-empty-library.title" +msgstr "Terbitkan perpustakaan kosong" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.accept" +msgstr "Alih keluar sebagai Pustaka Kongsi" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.hint" +msgstr "" +"Setelah dialih keluar sebagai Pustaka Kongsi, Pustaka Fail fail ini akan " +"berhenti tersedia untuk digunakan di antara fail anda yang lain." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.message" +msgstr "Alih keluar \"%s\" sebagai Pustaka Kongsi" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.small-nudge" +msgstr "Anjakan kecil" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.accept" +msgid_plural "modals.unpublish-shared-confirm.accept" +msgstr[0] "Nyahterbit" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.activated.no-files-message" +msgid_plural "modals.unpublish-shared-confirm.activated.no-files-message" +msgstr[0] "Ia tidak diaktifkan dalam mana-mana fail." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.activated.scd-message" +msgid_plural "modals.unpublish-shared-confirm.activated.scd-message" +msgstr[0] "Perpustakaan ini diaktifkan di sini:" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.message" +msgid_plural "modals.unpublish-shared-confirm.message" +msgstr[0] "Adakah anda pasti mahu menyahterbitkan perpustakaan ini?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.title" +msgid_plural "modals.unpublish-shared-confirm.title" +msgstr[0] "Nyahterbit pustaka" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.hint" +msgstr "" +"Anda akan mengemas kini komponen dalam pustaka kongsi. Ini mungkin " +"menjejaskan fail lain yang menggunakannya." + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.message" +msgstr "Kemas kini komponen dalam pustaka kongsi" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.accept" +msgstr "Kemas kini" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.cancel" +msgstr "Batal" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.hint" +msgstr "" +"Anda akan mengemas kini komponen dalam pustaka kongsi. Ini mungkin " +"menjejaskan fail lain yang menggunakannya." + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.message" +msgstr "Kemas kini komponen dalam pustaka kongsi" + +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "Versi baharu tersedia, sila muat semula halaman" + +#: src/app/main/ui/dashboard/team.cljs +msgid "notifications.invitation-email-sent" +msgstr "Jemputan berjaya dihantar" + +#: src/app/main/ui/dashboard/team.cljs +msgid "notifications.invitation-link-copied" +msgstr "Pautan jemputan disalin" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "notifications.profile-deletion-not-allowed" +msgstr "" +"Anda tidak boleh memadamkan profil anda. Tetapkan semula pasukan anda " +"sebelum meneruskan." + +#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs +msgid "notifications.profile-saved" +msgstr "Profil berjaya disimpan!" + +#: src/app/main/ui/settings/change_email.cljs +msgid "notifications.validation-email-sent" +msgstr "E-mel pengesahan dihantar kepada %s. Semak e-mel anda!" + +msgid "onboarding-v2.before-start.desc1" +msgstr "" +"Anda harus tahu bahawa terdapat banyak sumber yang tersedia untuk membantu " +"anda bermula dengan Penpot, seperti Panduan Pengguna dan saluran Youtube " +"kami." + +msgid "onboarding-v2.before-start.desc2" +msgstr "" +"Maklumat terperinci tentang cara menggunakan Penpot. Daripada prototaip " +"kepada menyusun atau berkongsi reka bentuk." + +msgid "onboarding-v2.before-start.desc2.title" +msgstr "Panduan pengguna" + +msgid "onboarding-v2.before-start.desc3" +msgstr "" +"Anda boleh menonton tutorial kami dan tutorial yang dibuat oleh komuniti " +"kami." + +msgid "onboarding-v2.before-start.desc3.title" +msgstr "Video tutorial" + +msgid "onboarding-v2.before-start.title" +msgstr "Sebelum anda mula" + +msgid "onboarding-v2.newsletter.desc" +msgstr "" +"Langgan surat berita Penpot untuk mengikuti perkembangan dan berita " +"pembangunan produk." + +msgid "onboarding-v2.newsletter.news" +msgstr "" +"Hantar kepada saya berita tentang Penpot (siaran blog, tutorial video, " +"penstriman...)." + +msgid "onboarding-v2.newsletter.privacy1" +msgstr "Kami mengambil berat tentang privasi, di sini anda boleh membaca. " + +msgid "onboarding-v2.newsletter.privacy2" +msgstr "" +"Kami hanya akan menghantar e-mel yang berkaitan kepada anda. Anda boleh " +"berhenti melanggan pada bila-bila masa melalui pautan nyahlanggan dalam " +"mana-mana surat berita kami." + +msgid "onboarding-v2.newsletter.updates" +msgstr "Hantar kepada saya kemas kini produk (ciri baharu, keluaran, pembetulan...)." + +msgid "onboarding-v2.welcome.desc1" +msgstr "" +"Penpot ialah Sumber Terbuka dan ia dibuat oleh Kaleidos serta komuniti, di " +"mana ramai orang sudah membantu antara satu sama lain. Semua orang boleh " +"bekerjasama dengan:" + +msgid "onboarding-v2.welcome.desc2" +msgstr "" +"Ruang awam untuk belajar, berkongsi dan membincangkan tentang Penpot, masa " +"kini dan masa depannya dengan seluruh Komuniti dan pasukan teras Penpot." + +msgid "onboarding-v2.welcome.desc2.title" +msgstr "Mengambil bahagian dalam Komuniti" + +msgid "onboarding-v2.welcome.desc3" +msgstr "" +"Di mana anda akan menemui cara untuk bekerjasama dengan terjemahan, " +"permintaan ciri, sumbangan teras, pemburuan pepijat…" + +msgid "onboarding-v2.welcome.desc3.title" +msgstr "Panduan memberi sumbangan" + +msgid "onboarding-v2.welcome.title" +msgstr "Selamat datang ke Penpot!" + +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Teruskan mencipta pasukan" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Teruskan tanpa pasukan" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Buat pasukan & jemput" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Buat pasukan dan hantar jemputan" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Anda boleh menjemput kemudian" + +msgid "onboarding.choice.team-up.create-team-desc" +msgstr "" +"Selepas menamakan pasukan anda, anda akan dapat menjemput orang untuk " +"menyertai." + +msgid "onboarding.choice.team-up.create-team-placeholder" +msgstr "Masukkan nama pasukan" + +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Cipta pasukan" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Buat pasukan tanpa menjemput" + +msgid "onboarding.choice.team-up.invite-members" +msgstr "Jemput ahli" + +msgid "onboarding.choice.team-up.invite-members-info" +msgstr "" +"Ingat untuk memasukkan semua orang. Pemaju, pereka bentuk, pengurus... " +"kepelbagaian bertambah :)" + +msgid "onboarding.choice.team-up.roles" +msgstr "Jemput dengan peranan:" + +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Mulakan tanpa pasukan" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Anda boleh membuat pasukan kemudian." + +msgid "onboarding.newsletter.accept" +msgstr "Ya, langgan" + +msgid "onboarding.newsletter.acceptance-message" +msgstr "" +"Permintaan langganan anda telah dihantar, kami akan menghantar e-mel kepada " +"anda untuk mengesahkannya." + +msgid "onboarding.newsletter.policy" +msgstr "Dasar Privasi." + +msgid "onboarding.newsletter.title" +msgstr "Ingin menerima berita Penpot?" + +msgid "onboarding.team-modal.create-team" +msgstr "Cipta pasukan" + +msgid "onboarding.team-modal.create-team-desc" +msgstr "" +"Pasukan membolehkan anda bekerjasama dengan pengguna Penpot lain yang " +"bekerja dalam fail dan projek yang sama." + +msgid "onboarding.team-modal.create-team-feature-1" +msgstr "Fail dan projek tanpa had" + +msgid "onboarding.team-modal.create-team-feature-2" +msgstr "Edisi berbilang pemain" + +msgid "onboarding.team-modal.create-team-feature-3" +msgstr "Pengurusan peranan" + +msgid "onboarding.team-modal.create-team-feature-4" +msgstr "Ahli tanpa had" + +msgid "onboarding.team-modal.create-team-feature-5" +msgstr "100% percuma!" + +msgid "onboarding.templates.subtitle" +msgstr "Berikut adalah beberapa templat." + +msgid "onboarding.templates.title" +msgstr "Mula mereka bentuk" + +msgid "onboarding.welcome.alt" +msgstr "Penpot" + +#: src/app/main/ui/auth/recovery.cljs +msgid "profile.recovery.go-to-login" +msgstr "Pergi ke log masuk" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "Alat reka bentuk yang manakah anda mempunyai lebih banyak pengalaman?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "Banyak" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canva" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "Bagaimanakah cara terbaik anda menerangkan pengalaman anda bekerja pada..." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Pereka bentuk" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Pembangun" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "Ketahui lebih lanjut tentang Penpot" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Pengasas/VP" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Saya seorang pekerja bebas (freelancer)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Dapatkan kod daripada projek pasukan saya " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... reka bentuk antara muka, aset visual, sistem reka bentuk, dsb." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "InVision" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Tinggalkan maklum balas untuk projek pasukan saya" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "Mari mulakan!" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Pengurus Produk atau Projek" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Pemasaran" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "Lebih daripada 50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-a-tool" +msgstr "Saya tidak pernah menggunakan alat reka bentuk sebelum ini" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Seterusnya" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Tiada" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Lain-lain (nyatakan)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "Saya sedang menjalankan projek peribadi" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "Sebelumnya" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Bagaimanakah anda merancang untuk menggunakan Penpot?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Apakah peranan anda?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Pilih pilihan" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Sketch" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Beberapa" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Mula" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Mula mengerjakan projek saya" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Pelajar atau guru" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "Berapakah saiz pasukan anda?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Uji Penpot untuk melihat sama ada ia sesuai untuk pasukan " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Cuba sebelum menggunakan Penpot pada pelayar peribadi" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "... rangka wayar, perjalanan & aliran pengguna, pepohon navigasi, dsb." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Bekerja dalam idea konsep" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Maklum balas anda akan membantu kami memahami tabiat dan keutamaan anda " +"supaya kami boleh terus menjadikan Penpot sebagai alat yang berguna dan " +"menyeronokkan." + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +#, fuzzy +msgid "settings.detach" +msgstr "Tanggalkan" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "settings.multiple" +msgstr "Bercampur" + +# SECTIONS +msgid "shortcut-section.basics" +msgstr "Asas" + +msgid "shortcut-section.dashboard" +msgstr "Papan pemuka" + +msgid "shortcut-section.viewer" +msgstr "Penonton" + +msgid "shortcut-section.workspace" +msgstr "Ruang kerja" + +# SUBSECTIONS +msgid "shortcut-subsection.alignment" +msgstr "Penjajaran" + +msgid "shortcut-subsection.edit" +msgstr "Sunting" + +msgid "shortcut-subsection.general-dashboard" +msgstr "Generik" + +msgid "shortcut-subsection.general-viewer" +msgstr "Generik" + +msgid "shortcut-subsection.main-menu" +msgstr "Menu utama" + +msgid "shortcut-subsection.modify-layers" +msgstr "Ubah suai lapisan" + +msgid "shortcut-subsection.navigation-dashboard" +msgstr "Navigasi" + +msgid "shortcut-subsection.navigation-viewer" +msgstr "Navigasi" + +msgid "shortcut-subsection.navigation-workspace" +msgstr "Navigasi" + +msgid "shortcut-subsection.panels" +msgstr "Panel" + +msgid "shortcut-subsection.path-editor" +msgstr "laluan" + +msgid "shortcut-subsection.shape" +msgstr "Bentuk" + +msgid "shortcut-subsection.text-editor" +msgstr "Teks" + +msgid "shortcut-subsection.tools" +msgstr "Alatan" + +msgid "shortcut-subsection.zoom-viewer" +msgstr "Zum" + +msgid "shortcut-subsection.zoom-workspace" +msgstr "Zum" + +msgid "shortcuts.add-comment" +msgstr "Komen" + +msgid "shortcuts.add-node" +msgstr "Tambah nota" + +msgid "shortcuts.align-bottom" +msgstr "Sejajarkan bahagian bawah" + +msgid "shortcuts.align-center" +msgstr "Jajarkan tengah" + +msgid "shortcuts.align-hcenter" +msgstr "Jajarkan tengah secara mendatar" + +msgid "shortcuts.align-justify" +msgstr "Mengimbangkan keselarasan" + +msgid "shortcuts.align-left" +msgstr "Jajar ke kiri" + +msgid "shortcuts.align-right" +msgstr "Sejajar ke kanan" + +msgid "shortcuts.align-top" +msgstr "Jajarkan atas" + +msgid "shortcuts.align-vcenter" +msgstr "Jajarkan tengah secara menegak" + +msgid "shortcuts.artboard-selection" +msgstr "Cipta papan daripada pemilihan" + +msgid "shortcuts.bold" +msgstr "Togol tebal" + +msgid "shortcuts.bool-difference" +msgstr "Perbezaan Boolean" + +msgid "shortcuts.bool-exclude" +msgstr "Pengecualian Boolean" + +msgid "shortcuts.bool-intersection" +msgstr "Persimpangan Boolean" + +msgid "shortcuts.bool-union" +msgstr "Kesatuan Boolean" + +msgid "shortcuts.bring-back" +msgstr "Hantar ke paling belakang" + +msgid "shortcuts.bring-backward" +msgstr "Hantar ke belakang" + +msgid "shortcuts.bring-forward" +msgstr "Bawa ke hadapan" + +msgid "shortcuts.bring-front" +msgstr "Bawa ke paling hadapan" + +msgid "shortcuts.clear-undo" +msgstr "Kosongkan buat asal" + +msgid "shortcuts.copy" +msgstr "Salin" + +msgid "shortcuts.create-component" +msgstr "Cipta komponen" + +msgid "shortcuts.create-new-project" +msgstr "Buat baharu" + +msgid "shortcuts.cut" +msgstr "Potong" + +msgid "shortcuts.decrease-zoom" +msgstr "Zum keluar" + +msgid "shortcuts.delete" +msgstr "Padam" + +msgid "shortcuts.delete-node" +msgstr "Padamkan nod" + +msgid "shortcuts.detach-component" +msgstr "Tanggalkan komponen" + +msgid "shortcuts.draw-curve" +msgstr "Lengkung" + +msgid "shortcuts.draw-ellipse" +msgstr "elips" + +msgid "shortcuts.draw-frame" +msgstr "Papan" + +msgid "shortcuts.draw-nodes" +msgstr "Lukis laluan" + +msgid "shortcuts.draw-path" +msgstr "Laluan" + +msgid "shortcuts.draw-rect" +msgstr "Segi empat tepat" + +msgid "shortcuts.draw-text" +msgstr "Teks" + +msgid "shortcuts.duplicate" +msgstr "Pendua" + +msgid "shortcuts.escape" +msgstr "Batal" + +msgid "shortcuts.export-shapes" +msgstr "Eksport bentuk" + +msgid "shortcuts.fit-all" +msgstr "Zum untuk muat semua" + +msgid "shortcuts.flip-horizontal" +msgstr "Terbalikkan secara mendatar" + +msgid "shortcuts.flip-vertical" +msgstr "Terbalikkan secara menegak" + +msgid "shortcuts.font-size-dec" +msgstr "Kurangkan saiz fon" + +msgid "shortcuts.font-size-inc" +msgstr "Tambah saiz fon" + +msgid "shortcuts.go-to-drafts" +msgstr "Pergi ke draf" + +msgid "shortcuts.go-to-libs" +msgstr "Pergi ke perpustakaan kongsi" + +msgid "shortcuts.go-to-search" +msgstr "Cari" + +msgid "shortcuts.group" +msgstr "Kumpulan" + +msgid "shortcuts.h-distribute" +msgstr "Edarkan secara mendatar" + +msgid "shortcuts.hide-ui" +msgstr "Tunjukkan / Sembunyikan UI" + +msgid "shortcuts.increase-zoom" +msgstr "Zum kedalam" + +msgid "shortcuts.insert-image" +msgstr "Masukkan gambar" + +msgid "shortcuts.italic" +msgstr "Togol condong" + +msgid "shortcuts.join-nodes" +msgstr "Sambung nod" + +msgid "shortcuts.letter-spacing-dec" +msgstr "Kurangkan jarak huruf" + +msgid "shortcuts.letter-spacing-inc" +msgstr "Penambahan jarak huruf" diff --git a/frontend/translations/nl.po b/frontend/translations/nl.po index 3e7a9bc04..c2676f780 100644 --- a/frontend/translations/nl.po +++ b/frontend/translations/nl.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-12-29 21:08+0000\n" +"PO-Revision-Date: 2024-02-12 19:02+0000\n" "Last-Translator: Stephan Paternotte \n" -"Language-Team: Dutch \n" +"Language-Team: Dutch " +"\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -118,8 +118,7 @@ msgstr "Wachtwoord succesvol gewijzigd" #: src/app/main/ui/auth/recovery_request.cljs msgid "auth.notifications.profile-not-verified" -msgstr "" -"Profiel is niet geverifieerd. Verifieer het profiel voordat je verder gaat." +msgstr "Profiel is niet geverifieerd. Verifieer het profiel voordat je verder gaat." #: src/app/main/ui/auth/recovery_request.cljs msgid "auth.notifications.recovery-token-sent" @@ -189,6 +188,13 @@ msgstr "" "Met het aanmaken van een nieuw account ga je akkoord met onze " "gebruiksvoorwaarden en ons privacybeleid." +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Met het aanmaken van een nieuw account ga je akkoord met onze " +"[servicevoorwaarden] (%s) en [privacybeleid] (%s)." + #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "We hebben een verificatie-e-mail verzonden naar" @@ -285,8 +291,7 @@ msgstr "Praktische introductie" #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.walkthrough-hero.info" -msgstr "" -"Maak een rondleiding door Penpot en leer de belangrijkste functies kennen." +msgstr "Maak een rondleiding door Penpot en leer de belangrijkste functies kennen." #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.walkthrough-hero.start" @@ -310,8 +315,7 @@ msgstr "Toegangsbewijs is succesvol aangemaakt." #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.empty.add-one" -msgstr "" -"Klik op de knop \"Nieuw toegangsbewijs aanmaken\" om er een aan te maken." +msgstr "Klik op de knop \"Nieuw toegangsbewijs aanmaken\" om er een aan te maken." #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.empty.no-access-tokens" @@ -360,9 +364,9 @@ msgstr "Persoonlijke toegangsbewijzen" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.personal.description" msgstr "" -"Persoonlijke toegangsbewijzen functioneren als alternatief voor ons login/" -"wachtwoord-authenticatiesysteem en kunnen worden gebruikt om een applicatie " -"toegang te geven tot de interne Penpot API" +"Persoonlijke toegangsbewijzen functioneren als alternatief voor ons " +"login/wachtwoord-authenticatiesysteem en kunnen worden gebruikt om een " +"applicatie toegang te geven tot de interne Penpot API" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.token-will-expire" @@ -523,9 +527,9 @@ msgid "dashboard.fonts.hero-text2" msgstr "" "Je mag alleen lettertypen uploaden waarvan je de eigenaar bent of waarvoor " "je een licentie hebt om te gebruiken in Penpot. Lees meer in de sectie " -"Inhoudsrechten van [Penpot's Servicevoorwaarden](https://penpot.app/terms." -"html). Misschien wil je ook meer lezen over [lettertypelicenties](https://" -"www.typography.com/faq)." +"Inhoudsrechten van [Penpot's " +"Servicevoorwaarden](https://penpot.app/terms.html). Misschien wil je ook " +"meer lezen over [lettertypelicenties](https://www.typography.com/faq)." #: src/app/main/ui/dashboard/fonts.cljs msgid "dashboard.fonts.upload-all" @@ -546,6 +550,11 @@ msgstr "Importeer Penpot-bestanden" msgid "dashboard.import.analyze-error" msgstr "Oeps! We konden dit bestand niet importeren" +msgid "dashboard.import.analyze-error.components-v2" +msgstr "" +"Bestand met componenten v2 geactiveerd, maar dit team ondersteunt dit nog " +"niet." + msgid "dashboard.import.import-error" msgstr "" "Er is een probleem opgetreden bij het importeren van het bestand. Het " @@ -788,8 +797,7 @@ msgid "dashboard.webhooks.active" msgstr "Is actief" msgid "dashboard.webhooks.active.explain" -msgstr "" -"Wanneer deze hook wordt getriggerd, worden gebeurtenisdetails afgeleverd" +msgstr "Wanneer deze hook wordt getriggerd, worden gebeurtenisdetails afgeleverd" msgid "dashboard.webhooks.content-type" msgstr "Contenttype" @@ -865,7 +873,8 @@ msgstr "Authenticatie-provider niet geconfigureerd." msgid "errors.auth.unable-to-login" msgstr "" -"Het lijkt erop dat je niet geauthentiseerd bent of dat de sessie is verlopen." +"Het lijkt erop dat je niet geauthentiseerd bent of dat de sessie is " +"verlopen." msgid "errors.bad-font" msgstr "Het lettertype %s kon niet geladen worden" @@ -922,6 +931,14 @@ msgstr "" msgid "errors.feature-not-supported" msgstr "Functie '%s' wordt niet ondersteund." +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Het lijkt erop dat er een discrepantie bestaat tussen de ingeschakelde " +"functies en de functies van het bestand dat je probeert te openen. Er " +"moeten migraties voor '%s' worden toegepast voordat het bestand kan worden " +"geopend." + #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -974,6 +991,9 @@ msgstr "Bevestigingswachtwoord moet overeenkomen" msgid "errors.password-too-short" msgstr "Wachtwoord moet minimaal 8 tekens lang zijn" +msgid "errors.paste-data-validation" +msgstr "Ongeldige gegevens op klembord" + msgid "errors.profile-blocked" msgstr "Het profiel is geblokkeerd" @@ -987,6 +1007,10 @@ msgstr "Je profiel heeft e-mails gedempt (spammeldingen of hoge bounces)." msgid "errors.registration-disabled" msgstr "De registratie is momenteel uitgeschakeld." +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Incompatibele functie '%s' gedetecteerd" + msgid "errors.team-leave.insufficient-members" msgstr "" "Onvoldoende leden om het team te verlaten, je kunt dit team maar beter " @@ -1010,6 +1034,13 @@ msgstr "Er is een onverwachte fout opgetreden." msgid "errors.unexpected-token" msgstr "Onbekend bewijsstuk" +msgid "errors.validation" +msgstr "Validatiefout" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Bestand heeft een incompatibel versienummer" + msgid "errors.webhooks.connection" msgstr "Verbindingsfout, URL niet bereikbaar" @@ -1243,6 +1274,9 @@ msgstr "Geen" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "Beginhoofdletters" +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Uitschakelen" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "HOOFDLETTERS" @@ -1256,7 +1290,8 @@ msgstr "Meer info over inspecteren" msgid "inspect.empty.select" msgstr "" -"Selecteer een vorm, bord of groep om hun eigenschappen en code te inspecteren" +"Selecteer een vorm, bord of groep om hun eigenschappen en code te " +"inspecteren" #: src/app/main/ui/inspect/right_sidebar.cljs msgid "inspect.tabs.code" @@ -1546,7 +1581,8 @@ msgstr "Geen openstaande uitnodigingen." #: src/app/main/ui/dashboard/team.cljs msgid "labels.no-invitations-hint" msgstr "" -"Klik op de knop **Mensen uitnodigen** om mensen uit te nodigen voor dit team." +"Klik op de knop **Mensen uitnodigen** om mensen uit te nodigen voor dit " +"team." #: src/app/main/ui/static.cljs msgid "labels.not-found.desc-message" @@ -1647,6 +1683,9 @@ msgstr "Rol" msgid "labels.save" msgstr "Opslaan" +msgid "labels.search" +msgstr "Zoeken" + msgid "labels.search-font" msgstr "Lettertype zoeken" @@ -1671,6 +1710,9 @@ msgstr "Service niet beschikbaar" msgid "labels.settings" msgstr "Instellingen" +msgid "labels.share" +msgstr "Delen" + msgid "labels.share-prototype" msgstr "Prototype delen" @@ -1740,10 +1782,34 @@ msgstr "(jij)" msgid "labels.your-account" msgstr "Jouw account" +msgid "media.choose-image" +msgstr "Afbeelding kiezen" + +msgid "media.gradient" +msgstr "Verloop" + +msgid "media.image" +msgstr "Afbeelding" + +msgid "media.linear" +msgstr "Lineair" + #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Afbeelding laden…" +msgid "media.radial" +msgstr "Radiaal" + +msgid "media.solid" +msgstr "Solide" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Je bibliotheek is leeg. Eenmaal toegevoegd als Gedeelde Bibliotheek, zijn " +"de assets die je aanmaakt beschikbaar voor gebruik in de rest van je " +"bestanden. Weet je zeker dat je dit wilt publiceren??" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -1754,7 +1820,8 @@ msgstr "Toevoegen als gedeelde bibliotheek" msgid "modals.add-shared-confirm.hint" msgstr "" "Eenmaal toegevoegd als gedeelde bibliotheek, zijn de assets van deze " -"bestandsbibliotheek beschikbaar voor gebruik tussen de rest van je bestanden." +"bestandsbibliotheek beschikbaar voor gebruik tussen de rest van je " +"bestanden." #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs @@ -2029,8 +2096,8 @@ msgstr "E-mailadressen, kommagescheiden" msgid "modals.invite-member.repeated-invitation" msgstr "" -"Sommige e-mailadressen zijn van bestaande teamleden. Zij krijgen geen nieuwe " -"uitnodigingen." +"Sommige e-mailadressen zijn van bestaande teamleden. Zij krijgen geen " +"nieuwe uitnodigingen." #: src/app/main/ui/dashboard/team.cljs msgid "modals.invite-team-member.title" @@ -2147,10 +2214,10 @@ msgstr[1] "Publicaties ongedaan maken" #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.message" msgid_plural "modals.unpublish-shared-confirm.message" -msgstr[0] "" -"Weet je zeker dat je de publicatie van deze bibliotheek ongedaan wilt maken?" +msgstr[0] "Weet je zeker dat je de publicatie van deze bibliotheek ongedaan wilt maken?" msgstr[1] "" -"Weet je zeker dat je de publicatie van deze bibliotheken ongedaan wilt maken?" +"Weet je zeker dat je de publicatie van deze bibliotheken ongedaan wilt " +"maken?" #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs @@ -2249,16 +2316,15 @@ msgstr "" "voortgang van de productontwikkeling en nieuws." msgid "onboarding-v2.newsletter.news" -msgstr "" -"Stuur mij nieuws over Penpot (blogposts, video-introducties, streamings…)." +msgstr "Stuur mij nieuws over Penpot (blogposts, video-introducties, streamings…)." msgid "onboarding-v2.newsletter.privacy1" msgstr "Wij geven om privacy, lees hier onze " msgid "onboarding-v2.newsletter.privacy2" msgstr "" -"We sturen je alleen relevante e-mails. Je kunt je op elk moment afmelden via " -"de afmeldlink in al onze nieuwsbrieven." +"We sturen je alleen relevante e-mails. Je kunt je op elk moment afmelden " +"via de afmeldlink in al onze nieuwsbrieven." msgid "onboarding-v2.newsletter.updates" msgstr "Stuur mij productnieuws (nieuwe functies, releases, correcties…)." @@ -2287,6 +2353,21 @@ msgstr "Bijdragen" msgid "onboarding-v2.welcome.title" msgstr "Welkom bij Penpot!" +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Doorgaan met team aanmaken" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Doorgaan zonder team" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Team aanmaken & uitnodigen" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Team aanmaken en uitnodigingen versturen" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Je kunt later uitnodigen" + msgid "onboarding.choice.team-up.create-team-desc" msgstr "" "Nadat je je team een naam hebt gegeven, kun je mensen uitnodigen om lid te " @@ -2295,6 +2376,12 @@ msgstr "" msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "Voer de naam van het team in" +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Team aanmaken" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Team aanmaken zonder uitnodigingen" + msgid "onboarding.choice.team-up.invite-members" msgstr "Leden uitnodigen" @@ -2306,6 +2393,12 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Uitnodigen met rol:" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Zonder team beginnen" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Je kunt later een team samenstellen." + msgid "onboarding.newsletter.accept" msgstr "Ja, abonneren" @@ -2524,6 +2617,10 @@ msgstr "" "Jouw feedback helpt ons te begrijpen wat je gewoonten en voorkeuren zijn, " "zodat we van Penpot een nuttig en plezierig hulpmiddel kunnen blijven maken." +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Ontkoppelen" + #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, @@ -2980,6 +3077,9 @@ msgstr "Linialen tonen/verbergen" msgid "shortcuts.toggle-textpalette" msgstr "Tekstpalet in/uitschakelen" +msgid "shortcuts.toggle-theme" +msgstr "Thema veranderen" + msgid "shortcuts.toggle-visibility" msgstr "Tonen/verbergen" @@ -3315,6 +3415,45 @@ msgstr "Tekst transformeren" msgid "workspace.assets.ungroup" msgstr "Groep opheffen" +msgid "workspace.context-menu.grid-cells.area" +msgstr "Gebied aanmaken" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Bord aanmaken" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Cellen samenvoegen" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Rechts 1 kolom toevoegen" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Links 1 kolom toevoegen" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Kolom verwijderen" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Kolom en vormen verwijderen" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Kolom dupliceren" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Onder 1 rij toevoegen" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Boven 1 rij toevoegen" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Rij verwijderen" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Rij en vormen verwijderen" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Rij dupliceren" + msgid "workspace.focus.focus-mode" msgstr "Focusmodus" @@ -3438,6 +3577,12 @@ msgstr "Linialen tonen" msgid "workspace.header.menu.show-textpalette" msgstr "Lettertype-palet tonen" +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Donker thema inschakelen" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "Licht thema inschakelen" + msgid "workspace.header.menu.undo" msgstr "Ongedaan maken" @@ -3489,9 +3634,21 @@ msgstr "Volledig scherm" msgid "workspace.header.zoom-selected" msgstr "Naar selectie zoomen" +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Raster bewerken" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Sluiten" + msgid "workspace.layout_grid.editor.title" msgstr "Raster bewerken" +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Klaar" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Lokaliseren" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Toevoegen" @@ -3562,6 +3719,10 @@ msgstr "BIBLIOTHEEK" msgid "workspace.libraries.library-updates" msgstr "BIBLIOTHEEK-UPDATES" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Laden…" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "Er zijn geen gedeelde bibliotheken die moeten worden bijgewerkt" @@ -3636,12 +3797,24 @@ msgstr "Component" msgid "workspace.options.component.annotation" msgstr "Aantekening" +msgid "workspace.options.component.copy" +msgstr "Kopiëren" + msgid "workspace.options.component.create-annotation" msgstr "Aantekening maken" msgid "workspace.options.component.edit-annotation" msgstr "Aantekening bewerken" +msgid "workspace.options.component.main" +msgstr "Hoofd" + +msgid "workspace.options.component.swap" +msgstr "Component uitwisselen" + +msgid "workspace.options.component.swap.empty" +msgstr "Er zijn nog geen assets in deze bibliotheek" + #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Beperkingen" @@ -3735,6 +3908,10 @@ msgstr "Vullen" msgid "workspace.options.flows.add-flow-start" msgstr "Stroomdiagram-startpunt toevoegen" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Stroomdiagram" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "Stroomdiagram-startpunt" @@ -3838,6 +4015,9 @@ msgstr "Groep vullen" msgid "workspace.options.group-stroke" msgstr "Groep-streek" +msgid "workspace.options.guides.title" +msgstr "Hulplijnen" + msgid "workspace.options.height" msgstr "Hoogte" @@ -4386,14 +4566,26 @@ msgstr "Streek" msgid "workspace.options.stroke-cap.circle-marker" msgstr "Cirkelmarkering" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Cirkel" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "Ruitmarkering" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Ruit" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "Lijn-pijl" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Pijl" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "Geen" @@ -4410,10 +4602,18 @@ msgstr "Vierkant" msgid "workspace.options.stroke-cap.square-marker" msgstr "Vierkantmarkering" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Rechthoek" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "Driehoek-pijl" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Driehoek" + msgid "workspace.options.stroke-color" msgstr "Streekkleur" @@ -4543,8 +4743,7 @@ msgstr "HOOFDLETTERS" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.use-play-button" -msgstr "" -"Gebruik de afspeelknop in de koptekst om de prototypeweergave uit te voeren." +msgstr "Gebruik de afspeelknop in de koptekst om de prototypeweergave uit te voeren." msgid "workspace.options.width" msgstr "Breedte" @@ -4885,6 +5084,13 @@ msgstr "Tekst (%s)" msgid "workspace.toolbar.text-palette" msgstr "Typografie (%s)" +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "** Inspectiemodus ** (alleen bekijken)" + +msgid "workspace.top-bar.read-only.done" +msgstr "Klaar" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Er zijn tot nu toe geen wijzigingen in de geschiedenis" @@ -5018,153 +5224,3 @@ msgstr "Bijwerken" msgid "workspace.viewport.click-to-close-path" msgstr "Klik om het pad te sluiten" - -msgid "workspace.options.component.copy" -msgstr "Kopiëren" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Rechthoek" - -msgid "workspace.options.component.main" -msgstr "Hoofd" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Ruit" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Ontkoppelen" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Driehoek" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Pijl" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Je bibliotheek is leeg. Eenmaal toegevoegd als Gedeelde Bibliotheek, zijn de " -"assets die je aanmaakt beschikbaar voor gebruik in de rest van je bestanden. " -"Weet je zeker dat je dit wilt publiceren??" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Cirkel" - -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Doorgaan met team aanmaken" - -msgid "workspace.options.guides.title" -msgstr "Hulplijnen" - -msgid "media.choose-image" -msgstr "Afbeelding kiezen" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Met het aanmaken van een nieuw account ga je akkoord met onze " -"[servicevoorwaarden] (%s) en [privacybeleid] (%s)." - -msgid "workspace.options.component.swap.empty" -msgstr "Er zijn nog geen assets in deze bibliotheek" - -msgid "media.solid" -msgstr "Solide" - -msgid "workspace.top-bar.read-only.done" -msgstr "Klaar" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Team aanmaken & uitnodigen" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Klaar" - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Doorgaan zonder team" - -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Uitschakelen" - -msgid "errors.validation" -msgstr "Validatiefout" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Sluiten" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Bestand heeft een incompatibel versienummer" - -msgid "workspace.options.component.swap" -msgstr "Component uitwisselen" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Team aanmaken zonder uitnodigingen" - -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Het lijkt erop dat er een discrepantie bestaat tussen de ingeschakelde " -"functies en de functies van het bestand dat je probeert te openen. Er moeten " -"migraties voor '%s' worden toegepast voordat het bestand kan worden geopend." - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Team aanmaken" - -msgid "media.linear" -msgstr "Lineair" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Stroomdiagram" - -msgid "labels.search" -msgstr "Zoeken" - -msgid "media.image" -msgstr "Afbeelding" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Je kunt later een team samenstellen." - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Team aanmaken en uitnodigingen versturen" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Lokaliseren" - -msgid "media.gradient" -msgstr "Verloop" - -msgid "labels.share" -msgstr "Delen" - -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Raster bewerken" - -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Zonder team beginnen" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Je kunt later uitnodigen" - -msgid "media.radial" -msgstr "Radiaal" - -msgid "errors.paste-data-validation" -msgstr "Ongeldige gegevens op klembord" - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Incompatibele functie '%s' gedetecteerd" - -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "** Inspectiemodus ** (alleen bekijken)" diff --git a/frontend/translations/pt_PT.po b/frontend/translations/pt_PT.po index 3bd8735be..da48c8ece 100644 --- a/frontend/translations/pt_PT.po +++ b/frontend/translations/pt_PT.po @@ -1,15 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-12-29 21:08+0000\n" +"PO-Revision-Date: 2024-04-20 23:07+0000\n" "Last-Translator: TheScientistPT \n" -"Language-Team: Portuguese (Portugal) \n" +"Language-Team: Portuguese (Portugal) " +"\n" "Language: pt_PT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -176,6 +176,13 @@ msgstr "" "Ao criar uma nova conta, concordas com os nossos termos de serviço e " "política de privacidade." +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Ao criar uma nova conta, concordas com os nossos [termos de serviço](%s) e " +"[política de privacidade](%s)." + #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "Enviámos um email de verificação para" @@ -343,9 +350,9 @@ msgstr "Tokens de acesso pessoais" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.personal.description" msgstr "" -"Os tokens de acesso pessoais funcionam como uma alternativa ao nosso sistema " -"de autenticação de login/palavra-passe e podem ser usados para permitir que " -"uma aplicação tenha acesso à API interna do Penpot" +"Os tokens de acesso pessoais funcionam como uma alternativa ao nosso " +"sistema de autenticação de login/palavra-passe e podem ser usados para " +"permitir que uma aplicação tenha acesso à API interna do Penpot" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.token-will-expire" @@ -398,9 +405,9 @@ msgstr "Duplicar %s ficheiros" #: src/app/main/ui/dashboard/grid.cljs msgid "dashboard.empty-placeholder-drafts" msgstr "" -"Oh não! Ainda não tens ficheiros! Se quiseres experimentar podes começar " -"com os nossos templates em [Libraries & " -"templates](https://penpot.app/libraries-templates.html)." +"Os ficheiros adicionados às Bibliotecas irão aparecer aqui. Experimenta " +"adicionar os teus ficheiros ou experimenta algumas das nossas [Bibliotecas " +"e templates](https://penpot.app/libraries-templates.html)." msgid "dashboard.export-binary-multi" msgstr "Descarrega %s ficheiros Penpot (.penpot)" @@ -529,9 +536,19 @@ msgstr "Importar ficheiros Penpot" msgid "dashboard.import.analyze-error" msgstr "Oops! Não conseguimos importar este ficheiro" +msgid "dashboard.import.analyze-error.components-v2" +msgstr "" +"Ficheiro exportado com componentes v2 mas a equipa atual ainda não os " +"suporta." + msgid "dashboard.import.import-error" msgstr "Ocorreu um problema na importação do ficheiro. O ficheiro não foi importado." +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "1 ficheiro foi importado com sucesso." +msgstr[1] "%s ficheiros foram importados com sucesso." + msgid "dashboard.import.import-warning" msgstr "Alguns ficheiros continham objetos inválidos que foram removidos." @@ -693,10 +710,22 @@ msgstr "Selecionar tema" msgid "dashboard.show-all-files" msgstr "Mostrar todos os ficheiros" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-delete-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "O teu ficheiro foi apagado com sucesso" +msgstr[1] "Os teus ficheiros foram apagados com sucesso" + #: src/app/main/ui/dashboard/project_menu.cljs msgid "dashboard.success-delete-project" msgstr "O teu projeto foi eliminado com sucesso" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-duplicate-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "O teu ficheiro foi duplicado com sucesso" +msgstr[1] "Os teus ficheiros foram duplicados com sucesso" + #: src/app/main/ui/dashboard/project_menu.cljs msgid "dashboard.success-duplicate-project" msgstr "O teu projeto foi duplicado com sucesso" @@ -882,6 +911,13 @@ msgstr "" msgid "errors.feature-not-supported" msgstr "A funcionalidade '%s' não é suportada." +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Parece que existem discrepâncias entre as funcionalidades ativadas e as " +"funcionalidades do ficheiro que estás a tentar abrir. Será necessário " +"aplicar migrações para '%s' antes de poder abrir o ficheiro." + #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -932,6 +968,9 @@ msgstr "A palavra-passe de confirmação tem de corresponder" msgid "errors.password-too-short" msgstr "A palavra-passe deverá conter no mínimo 8 caracteres" +msgid "errors.paste-data-validation" +msgstr "Dados inválidos na área de transferência" + msgid "errors.profile-blocked" msgstr "O perfil está bloqueado" @@ -947,6 +986,10 @@ msgstr "" msgid "errors.registration-disabled" msgstr "A criação de contas está atualmente desativada." +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Funcionalidade incompatível '%s' detetada" + msgid "errors.team-leave.insufficient-members" msgstr "Membros insuficientes para deixar a equipa, provavelmente queres eliminá-la." @@ -968,6 +1011,13 @@ msgstr "Ocorreu um erro inesperado." msgid "errors.unexpected-token" msgstr "Token desconhecido" +msgid "errors.validation" +msgstr "Erro de validação" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "O ficheiro tem um número de versão incompatível" + msgid "errors.webhooks.connection" msgstr "Erro de conexão, não foi possível alcançar o URL" @@ -1202,6 +1252,9 @@ msgstr "Nenhum" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "Capitalização de Título" +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Sem atribuição" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Maiúsculas" @@ -1606,6 +1659,9 @@ msgstr "Cargo" msgid "labels.save" msgstr "Salvar" +msgid "labels.search" +msgstr "Pesquisar" + msgid "labels.search-font" msgstr "Pesquisar font" @@ -1630,6 +1686,9 @@ msgstr "Serviço Indisponível" msgid "labels.settings" msgstr "Definições" +msgid "labels.share" +msgstr "Partilhar" + msgid "labels.share-prototype" msgstr "Partilhar protótipo" @@ -1699,10 +1758,35 @@ msgstr "(tu)" msgid "labels.your-account" msgstr "A tua conta" +msgid "media.choose-image" +msgstr "Escolher imagem" + +msgid "media.gradient" +msgstr "Gradiente" + +msgid "media.image" +msgstr "Imagem" + +msgid "media.linear" +msgstr "Linear" + #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "A carregar imagem…" +msgid "media.radial" +msgstr "Radial" + +msgid "media.solid" +msgstr "Sólido" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"A tua biblioteca está vazia. Assim que ela seja adicionada como uma " +"biblioteca partilhada, os recursos que criares nela estarão disponíveis " +"para serem usados nos teus outros ficheiros. Tens a certeza que queres " +"publicá-la?" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -2090,6 +2174,12 @@ msgstr "Remover \"%s\" como Biblioteca Partilhada" msgid "modals.small-nudge" msgstr "Pequeno deslocamento" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.accept" +msgid_plural "modals.unpublish-shared-confirm.accept" +msgstr[0] "Cancelar publicação" +msgstr[1] "Cancelar publicações" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.message" @@ -2234,12 +2324,33 @@ msgstr "Guia de Contribuição" msgid "onboarding-v2.welcome.title" msgstr "Bem-vindo ao Penpot!" +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Continuar criação de equipa" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Continuar sem equipa" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Criar equipa e convidar" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Criar equipa e enviar convites" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Poderás enviar convites mais tarde" + msgid "onboarding.choice.team-up.create-team-desc" msgstr "Depois de nomeares a tua equipa, poderás convidar pessoas para entrar." msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "Escreve o nome da equipa" +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Criar equipa" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Criar equipa sem convidar" + msgid "onboarding.choice.team-up.invite-members" msgstr "Convida membros" @@ -2251,6 +2362,12 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Convidar com a função:" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Começar sem equipa" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Poderás criar uma equipa mais tarde." + msgid "onboarding.newsletter.accept" msgstr "Sim, subscreve" @@ -2468,6 +2585,10 @@ msgstr "" "preferências para que possamos continuar a tornar o Penpot numa ferramenta " "fácil e divertida de usar." +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Desacoplar" + #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, @@ -2924,6 +3045,9 @@ msgstr "Mostrar/ocultar regras" msgid "shortcuts.toggle-textpalette" msgstr "Alternar paleta de texto" +msgid "shortcuts.toggle-theme" +msgstr "Mudar tema" + msgid "shortcuts.toggle-visibility" msgstr "Mostrar / Ocultar" @@ -3261,6 +3385,45 @@ msgstr "Transformar Texto" msgid "workspace.assets.ungroup" msgstr "Desagrupar" +msgid "workspace.context-menu.grid-cells.area" +msgstr "Criar área" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Criar prancheta" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Unir células" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Adicionar 1 coluna à direita" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Adicionar 1 coluna à esquerda" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Eliminar coluna" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Apagar coluna e conteúdos" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Duplicar coluna" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Adicionar 1 fila abaixo" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Adicionar 1 fila acima" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Apagar fila" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Apagar fila e conteúdos" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Duplicar fila" + msgid "workspace.focus.focus-mode" msgstr "Modo de foco" @@ -3384,6 +3547,12 @@ msgstr "Mostrar regras" msgid "workspace.header.menu.show-textpalette" msgstr "Mostrar paleta de texto" +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Alterar para tema escuro" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "Mudar para tema claro" + msgid "workspace.header.menu.undo" msgstr "Desfazer" @@ -3435,9 +3604,21 @@ msgstr "Tela cheia" msgid "workspace.header.zoom-selected" msgstr "Aumentar para seleção" +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Editar grelha" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Sair" + msgid "workspace.layout_grid.editor.title" msgstr "A editar grelha" +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Feito" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Localizar" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Adicionar" @@ -3508,6 +3689,10 @@ msgstr "BIBLIOTECA" msgid "workspace.libraries.library-updates" msgstr "ATUALIZAÇÕES DE BIBLIOTECAS" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "A carregar…" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "Não há bibliotecas partilhadas que precisem de atualização" @@ -3582,12 +3767,24 @@ msgstr "Componente" msgid "workspace.options.component.annotation" msgstr "Nota" +msgid "workspace.options.component.copy" +msgstr "Cópia" + msgid "workspace.options.component.create-annotation" msgstr "Criar uma nota" msgid "workspace.options.component.edit-annotation" msgstr "Editar uma nota" +msgid "workspace.options.component.main" +msgstr "Principal" + +msgid "workspace.options.component.swap" +msgstr "Trocar de componente" + +msgid "workspace.options.component.swap.empty" +msgstr "Ainda não existem recursos nesta biblioteca" + #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Restrições" @@ -3681,6 +3878,10 @@ msgstr "Preenchimento" msgid "workspace.options.flows.add-flow-start" msgstr "Adicionar início de fluxo" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Fluxo" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "Início de fluxo" @@ -3784,6 +3985,9 @@ msgstr "Preenchimento de grupo" msgid "workspace.options.group-stroke" msgstr "Traço de grupo" +msgid "workspace.options.guides.title" +msgstr "Guias" + msgid "workspace.options.height" msgstr "Altura" @@ -4332,14 +4536,26 @@ msgstr "Traço" msgid "workspace.options.stroke-cap.circle-marker" msgstr "Marcador circular" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Círculo" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "Marcador em diamante" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Diamante" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "Seta de linha" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Seta" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "Nenhum" @@ -4356,10 +4572,18 @@ msgstr "Quadrado" msgid "workspace.options.stroke-cap.square-marker" msgstr "Marcador quadrado" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Retângulo" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "Seta triangular" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Triângulo" + msgid "workspace.options.stroke-color" msgstr "Cor do traço" @@ -4832,6 +5056,13 @@ msgstr "Texto (%s)" msgid "workspace.toolbar.text-palette" msgstr "Tipografias (%s)" +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**Modo de inspeção** (Somente leitura)" + +msgid "workspace.top-bar.read-only.done" +msgstr "Feito" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Não há histórico de mudanças até agora" @@ -5014,176 +5245,3 @@ msgstr "Clica para fechar o caminho" #~ msgid "workspace.options.layout.direction.left" #~ msgstr "Linha" - -msgid "workspace.options.component.copy" -msgstr "Cópia" - -msgid "dashboard.import.import-message" -msgid_plural "dashboard.import.import-message" -msgstr[0] "1 ficheiro foi importado com sucesso." -msgstr[1] "%s ficheiros foram importados com sucesso." - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.accept" -msgid_plural "modals.unpublish-shared-confirm.accept" -msgstr[0] "Cancelar publicação" -msgstr[1] "Cancelar publicações" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Retângulo" - -msgid "workspace.options.component.main" -msgstr "Principal" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Diamante" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Desacoplar" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Triângulo" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Seta" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"A tua biblioteca está vazia. Assim que ela seja adicionada como uma " -"biblioteca partilhada, os recursos que criares nela estarão disponíveis para " -"serem usados nos teus outros ficheiros. Tens a certeza que queres publicá-la?" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Círculo" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-delete-file" -msgid_plural "dashboard.success-delete-file" -msgstr[0] "O teu ficheiro foi apagado com sucesso" -msgstr[1] "Os teus ficheiros foram apagados com sucesso" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-duplicate-file" -msgid_plural "dashboard.success-delete-file" -msgstr[0] "O teu ficheiro foi duplicado com sucesso" -msgstr[1] "Os teus ficheiros foram duplicados com sucesso" - -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Continuar criação de equipa" - -msgid "workspace.options.guides.title" -msgstr "Guias" - -msgid "media.choose-image" -msgstr "Escolher imagem" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Ao criar uma nova conta, concordas com os nossos [termos de serviço](%s) e [" -"política de privacidade](%s)." - -msgid "workspace.options.component.swap.empty" -msgstr "Ainda não existem recursos nesta biblioteca" - -msgid "media.solid" -msgstr "Sólido" - -msgid "workspace.top-bar.read-only.done" -msgstr "Feito" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Criar equipa e convidar" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Feito" - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Continuar sem equipa" - -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Sem atribuição" - -msgid "errors.validation" -msgstr "Erro de validação" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Sair" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "O ficheiro tem um número de versão incompatível" - -msgid "workspace.options.component.swap" -msgstr "Trocar de componente" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Criar equipa sem convidar" - -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Parece que existem discrepâncias entre as funcionalidades ativadas e as " -"funcionalidades do ficheiro que estás a tentar abrir. Será necessário " -"aplicar migrações para '%s' antes de poder abrir o ficheiro." - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Criar equipa" - -msgid "media.linear" -msgstr "Linear" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Fluxo" - -msgid "labels.search" -msgstr "Pesquisar" - -msgid "media.image" -msgstr "Imagem" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Poderás criar uma equipa mais tarde." - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Criar equipa e enviar convites" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Localizar" - -msgid "media.gradient" -msgstr "Gradiente" - -msgid "labels.share" -msgstr "Partilhar" - -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Editar grelha" - -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Começar sem equipa" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Poderás enviar convites mais tarde" - -msgid "media.radial" -msgstr "Radial" - -msgid "errors.paste-data-validation" -msgstr "Dados inválidos na área de transferência" - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Funcionalidade incompatível '%s' detetada" - -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Modo de inspeção** (Somente leitura)" diff --git a/frontend/translations/ro.po b/frontend/translations/ro.po index 232fc9a6c..ee3aa0aa9 100644 --- a/frontend/translations/ro.po +++ b/frontend/translations/ro.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2023-10-10 10:01+0000\n" "Last-Translator: AlexTECPlayz \n" -"Language-Team: Romanian \n" +"Language-Team: Romanian " +"\n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -539,6 +539,12 @@ msgstr "Hopa! Nu am putut importa acest fișier" msgid "dashboard.import.import-error" msgstr "A apărut o problemă la importul fișierului. Fișierul nu a fost importat." +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "1 fișier a fost importat cu succes." +msgstr[1] "% fișiere au fost importate cu succes." +msgstr[2] "% de fișiere au fost importate cu succes." + msgid "dashboard.import.import-warning" msgstr "Unele fișiere conțineau obiecte nevalide care au fost eliminate." @@ -1731,6 +1737,12 @@ msgstr "Contul tău" msgid "media.loading" msgstr "Încarcă imaginea…" +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Biblioteca dumneavoastră este goală. Odată adăugate ca bibliotecă " +"partajată, obiectele pe care le creați vor fi disponibile pentru a fi " +"utilizate în celelalte fișiere. Sunteți sigur că doriți să o publicați?" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -2508,6 +2520,10 @@ msgstr "" "preferințele dvs. pentru a putea continua să facem Penpot o unealtă " "folositoare și plăcută." +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Detașați" + #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, @@ -3621,12 +3637,18 @@ msgstr "Componentă" msgid "workspace.options.component.annotation" msgstr "Notă" +msgid "workspace.options.component.copy" +msgstr "Copiați" + msgid "workspace.options.component.create-annotation" msgstr "Creați o notă" msgid "workspace.options.component.edit-annotation" msgstr "Editați o notă" +msgid "workspace.options.component.main" +msgstr "Principal" + #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Constrângeri" @@ -4370,14 +4392,26 @@ msgstr "Contur" msgid "workspace.options.stroke-cap.circle-marker" msgstr "Marcator cerc" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Cerc" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "Marcator diamant" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Diamant" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "Săgeată linie" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Săgeată" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "Nimic" @@ -4394,10 +4428,18 @@ msgstr "Pătrat" msgid "workspace.options.stroke-cap.square-marker" msgstr "Marcator pătrat" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Dreptunghi" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "Săgeată triunghi" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Triunghi" + msgid "workspace.options.stroke-color" msgstr "Culoare contur" @@ -5001,45 +5043,3 @@ msgstr "Actualizează" msgid "workspace.viewport.click-to-close-path" msgstr "Click pentru a închide calea" - -msgid "dashboard.import.import-message" -msgid_plural "dashboard.import.import-message" -msgstr[0] "1 fișier a fost importat cu succes." -msgstr[1] "% fișiere au fost importate cu succes." -msgstr[2] "% de fișiere au fost importate cu succes." - -msgid "workspace.options.component.copy" -msgstr "Copiați" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Dreptunghi" - -msgid "workspace.options.component.main" -msgstr "Principal" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Diamant" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Detașați" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Triunghi" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Săgeată" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Biblioteca dumneavoastră este goală. Odată adăugate ca bibliotecă partajată, " -"obiectele pe care le creați vor fi disponibile pentru a fi utilizate în " -"celelalte fișiere. Sunteți sigur că doriți să o publicați?" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Cerc" diff --git a/frontend/translations/ru.po b/frontend/translations/ru.po index 5a68e36df..f76e5ff25 100644 --- a/frontend/translations/ru.po +++ b/frontend/translations/ru.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-01-23 15:01+0000\n" "Last-Translator: Stas Haas \n" -"Language-Team: Russian \n" +"Language-Team: Russian " +"\n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -262,6 +262,26 @@ msgstr "Начать тур" msgid "dasboard.walkthrough-hero.title" msgstr "Руководство по интерфейсу" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "180 дней" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "30 дней" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "60 дней" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "90 дней" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "Никогда" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "dashboard.add-shared" @@ -2544,6 +2564,9 @@ msgstr "Заливка для группы" msgid "workspace.options.group-stroke" msgstr "Обводка для группы" +msgid "workspace.options.guides.title" +msgstr "Направляющие" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interactions" msgstr "Интерактив" @@ -3009,26 +3032,3 @@ msgstr "Обновить" msgid "workspace.viewport.click-to-close-path" msgstr "Нажмите для замыкания контура" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-90-days" -msgstr "90 дней" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-never" -msgstr "Никогда" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "180 дней" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "30 дней" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-60-days" -msgstr "60 дней" - -msgid "workspace.options.guides.title" -msgstr "Направляющие" diff --git a/frontend/translations/tr.po b/frontend/translations/tr.po index f1ef022f9..647a720bf 100644 --- a/frontend/translations/tr.po +++ b/frontend/translations/tr.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-01-28 11:01+0000\n" +"PO-Revision-Date: 2024-02-10 15:02+0000\n" "Last-Translator: Oğuz Ersen \n" -"Language-Team: Turkish \n" +"Language-Team: Turkish " +"\n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -84,6 +84,14 @@ msgstr "LDAP" msgid "auth.login-with-oidc-submit" msgstr "OpenID" +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "İsim boşluk dışında bir karakter içermelidir." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "İsim en fazla 250 karakter içermelidir." + #: src/app/main/ui/auth/recovery.cljs msgid "auth.new-password" msgstr "Yeni bir parola gir" @@ -116,6 +124,10 @@ msgstr "Parola" msgid "auth.password-length-hint" msgstr "En az 8 karakter" +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "Parola boşluk dışında bir karakter içermelidir." + msgid "auth.privacy-policy" msgstr "Gizlilik politikası" @@ -164,10 +176,21 @@ msgstr "" "Bir hesap oluştururken, koşullarımızı ve gizlilik politikamızı kabul etmiş " "sayılırsınız." +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Bir hesap oluştururken, [koşullarımızı](%s) ve [gizlilik politikamızı](%s) " +"kabul etmiş sayılırsınız." + #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "Onay e-postanı şu adrese gönderdik" +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...marka çalışması, çizimler, pazarlama materyalleri, vb." + msgid "common.publish" msgstr "Yayınla" @@ -266,6 +289,81 @@ msgstr "Gezintiyi başlat" msgid "dasboard.walkthrough-hero.title" msgstr "Arayüz İncelemesi" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.copied-success" +msgstr "Belirteç kopyalandı" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "Yeni belirteç oluştur" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "Erişim belirteci başarıyla oluşturuldu." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "Bir belirteç oluşturmak için \"Yeni belirteç oluştur\" düğmesine basın." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "Şu ana kadar hiç belirteciniz yok." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "İsim gereklidir" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "180 gün" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "30 gün" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "60 gün" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "90 gün" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "Asla" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "%s tarihinde sona erdi" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "%s tarihinde sona eriyor" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.no-expiration" +msgstr "Süresiz" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "Kişisel erişim belirteçleri" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"Kişisel erişim belirteçleri, oturum açma/parola kimlik doğrulama " +"sistemimize alternatif olarak işlev görür ve bir uygulamanın dahili Penpot " +"API'sine erişmesine izin vermek için kullanılabilir" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "Belirtecin süresi %s tarihinde sona erecek" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "Belirtecin sona erme tarihi yok" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "dashboard.add-shared" @@ -409,10 +507,10 @@ msgstr[1] "%s yazı tipi eklendi" msgid "dashboard.fonts.hero-text1" msgstr "" "Buraya yüklediğiniz herhangi bir web yazı tipi, bu takımın dosyalarının " -"metin özelliklerinde bulunan yazı tipi ailesi listesine eklenecek. Aynı yazı " -"tipi ailesi adına sahip yazı tipleri, **tek yazı tipi ailesi** olarak " -"gruplandırılacak. Yazı tiplerini şu biçimlerde yükleyebilirsiniz: **TTF, OTF " -"ve WOFF** (yalnızca bir tane gerekli olacak)." +"metin özelliklerinde bulunan yazı tipi ailesi listesine eklenecek. Aynı " +"yazı tipi ailesi adına sahip yazı tipleri, **tek yazı tipi ailesi** olarak " +"gruplandırılacak. Yazı tiplerini şu biçimlerde yükleyebilirsiniz: **TTF, " +"OTF ve WOFF** (yalnızca bir tane gerekli olacak)." msgid "dashboard.fonts.hero-text2" msgstr "" @@ -427,15 +525,35 @@ msgstr "" msgid "dashboard.fonts.upload-all" msgstr "Tümünü karşıya yükle" +#, markdown +msgid "dashboard.fonts.warning-text" +msgstr "" +"İşletim sistemlerinin farklı dikey metriklerine ilişkin olarak yazı " +"tiplerinizde olası bir sorun tespit ettik. Bu durumu kontrol etmek için " +"[bunun gibi](https://vertical-metrics.netlify.app/) yazı tipi dikey metrik " +"hizmetlerini kullanabilirsiniz. Ayrıca web yazı tipleri oluşturmak ve " +"hataları düzeltmek için [Transfonter](https://transfonter.org/) " +"kullanmanızı öneririz. " + msgid "dashboard.import" msgstr "Penpot dosyalarını içe aktar" msgid "dashboard.import.analyze-error" msgstr "Oops! Bu dosyayı içeri aktaramadık" +msgid "dashboard.import.analyze-error.components-v2" +msgstr "" +"Bileşenler v2 ile dosya etkinleştirildi ancak bu takım henüz bunu " +"desteklemiyor." + msgid "dashboard.import.import-error" msgstr "Dosya içeri aktarılırken bir sorun oluştu. Dosya içeri aktarılmadı." +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "1 dosya başarıyla içeri aktarıldı." +msgstr[1] "%s dosya başarıyla içeri aktarıldı." + msgid "dashboard.import.import-warning" msgstr "Bazı dosyalar kaldırılmış geçersiz nesneler içeriyordu." @@ -595,10 +713,22 @@ msgstr "Tema seç" msgid "dashboard.show-all-files" msgstr "Tüm dosyaları göster" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-delete-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "Dosyanız başarıyla silindi" +msgstr[1] "Dosyalarınız başarıyla silindi" + #: src/app/main/ui/dashboard/project_menu.cljs msgid "dashboard.success-delete-project" msgstr "Projeniz başarıyla silindi" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-duplicate-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "Dosyanız başarıyla kopyalandı" +msgstr[1] "Dosyalarınız başarıyla kopyalandı" + #: src/app/main/ui/dashboard/project_menu.cljs msgid "dashboard.success-duplicate-project" msgstr "Projenin kopyası başarıyla oluşturuldu" @@ -738,6 +868,9 @@ msgstr "%s yazı tipi yüklenemedi" msgid "errors.bad-font-plural" msgstr "%s yazı tipleri yüklenemedi" +msgid "errors.cannot-upload" +msgstr "Medya dosyası yüklenemedi." + #: src/app/main/data/workspace.cljs msgid "errors.clipboard-not-implemented" msgstr "Tarayıcın bu işlemi gerçekleştiremiyor" @@ -783,6 +916,13 @@ msgstr "" msgid "errors.feature-not-supported" msgstr "'%s' özelliği desteklenmiyor." +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Etkinleştirilen özellikler ile açmaya çalıştığınız dosyanın özellikleri " +"arasında bir uyumsuzluk var gibi görünüyor. Dosyanın açılabilmesi için önce " +"'%s' için geçişlerin uygulanması gerekiyor." + #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -833,6 +973,9 @@ msgstr "Parolalar eşleşmedi" msgid "errors.password-too-short" msgstr "Parola en az 8 karakterden oluşmalı" +msgid "errors.paste-data-validation" +msgstr "Panoda geçersiz veri" + msgid "errors.profile-blocked" msgstr "Profil engellendi" @@ -848,6 +991,10 @@ msgstr "" msgid "errors.registration-disabled" msgstr "Kayıt olma şu anda devre dışı." +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Uyumsuz '%s' özelliği algılandı" + msgid "errors.team-leave.insufficient-members" msgstr "Takımdan ayrılmak için yeterli üye yok, onu silmek isteyebilirsiniz." @@ -867,6 +1014,13 @@ msgstr "Beklenmedik bir hata oluştu." msgid "errors.unexpected-token" msgstr "Bilinmeyen jeton" +msgid "errors.validation" +msgstr "Doğrulama Hatası" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Dosyanın uyumsuz bir sürüm numarası var" + msgid "errors.webhooks.connection" msgstr "Bağlantı hatası, URL'ye erişilemiyor" @@ -1062,6 +1216,10 @@ msgstr "Yazı Tipi Boyutu" msgid "inspect.attributes.typography.font-style" msgstr "Yazı Tipi Biçimi" +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-weight" +msgstr "Yazı Tipi Kalınlığı" + #: src/app/main/ui/inspect/attributes/text.cljs msgid "inspect.attributes.typography.letter-spacing" msgstr "Harf Aralığı" @@ -1096,6 +1254,9 @@ msgstr "Hiçbiri" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "İlk Harfleri Büyük" +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Ayarlanmadı" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Büyük Harf" @@ -1164,6 +1325,10 @@ msgstr "Kısayollar" msgid "labels.accept" msgstr "Kabul et" +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "Erişim belirteçleri" + msgid "labels.active" msgstr "Etkin" @@ -1267,6 +1432,9 @@ msgstr "Daveti sil" msgid "labels.delete-multi-files" msgstr "%s dosyayı sil" +msgid "labels.discard" +msgstr "At" + #: src/app/main/ui/dashboard/projects.cljs, #: src/app/main/ui/dashboard/sidebar.cljs, #: src/app/main/ui/dashboard/files.cljs, @@ -1496,6 +1664,9 @@ msgstr "Rol" msgid "labels.save" msgstr "Kaydet" +msgid "labels.search" +msgstr "Ara" + msgid "labels.search-font" msgstr "Yazı tipi ara" @@ -1520,6 +1691,9 @@ msgstr "Hizmet Kullanılamıyor" msgid "labels.settings" msgstr "Ayarlar" +msgid "labels.share" +msgstr "Paylaş" + #: src/app/main/ui/viewer/header.cljs, src/app/main/ui/viewer/header.cljs msgid "labels.share-prototype" msgstr "Prototipi paylaş" @@ -1590,10 +1764,34 @@ msgstr "(siz)" msgid "labels.your-account" msgstr "Hesabınız" +msgid "media.choose-image" +msgstr "Görsel seç" + +msgid "media.gradient" +msgstr "Değişim" + +msgid "media.image" +msgstr "Görsel" + +msgid "media.linear" +msgstr "Doğrusal" + #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Görsel yükleniyor…" +msgid "media.radial" +msgstr "Işınsal" + +msgid "media.solid" +msgstr "Katı" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Kütüphaneniz boş. Paylaşılan Kütüphane olarak eklendiğinde, oluşturduğunuz " +"varlıklar diğer dosyalarınız arasında kullanılabilir olacak. Yayınlamak " +"istediğinizden emin misiniz?" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -1637,6 +1835,30 @@ msgstr "E-postayı değiştir" msgid "modals.change-email.title" msgstr "E-postanızı değiştirin" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.copy-token" +msgstr "Belirteci kopyala" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.expiration-date.label" +msgstr "Sona erme tarihi" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "İsim" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.placeholder" +msgstr "Adı, belirtecin ne için olduğunu bilmenize yardımcı olabilir" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "Belirteç oluştur" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "Erişim belirteci oluştur" + msgid "modals.create-webhook.submit-label" msgstr "Web kancası oluştur" @@ -1649,6 +1871,18 @@ msgstr "Yük URL'si" msgid "modals.create-webhook.url.placeholder" msgstr "https://example.com/postreceive" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "Belirteci sil" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.message" +msgstr "Bu belirteci silmek istediğinizden emin misiniz?" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "Belirteci sil" + #: src/app/main/ui/settings/delete_account.cljs msgid "modals.delete-account.cancel" msgstr "İptal et ve hesabımı koru" @@ -1679,6 +1913,12 @@ msgstr "" msgid "modals.delete-comment-thread.title" msgstr "Konuşmayı sil" +msgid "modals.delete-component-annotation.message" +msgstr "Bu açıklamayı silmek istediğinize emin misiniz?" + +msgid "modals.delete-component-annotation.title" +msgstr "Açıklamayı sil" + #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-file-confirm.accept" msgstr "Dosyayı sil" @@ -1746,6 +1986,18 @@ msgid_plural "modals.delete-shared-confirm.accept" msgstr[0] "Dosyayı sil" msgstr[1] "Dosyaları sil" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "Hiçbir dosyada etkinleştirilmedi." +msgstr[1] "Hiçbir dosyada etkinleştirilmediler." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.scd-message" +msgid_plural "modals.delete-shared-confirm.activated.scd-message" +msgstr[0] "Bu kütüphane burada etkinleştirildi: " +msgstr[1] "Bu kütüphaneler burada etkinleştirildiler: " + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-shared-confirm.message" @@ -1786,6 +2038,16 @@ msgstr "Bu üyeyi takımdan silmek istediğinden emin misin?" msgid "modals.delete-team-member-confirm.title" msgstr "Takım üyesini sil" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "" +"Bu dosyada daha önce kullanılmış olan varlıklar orada kalmaya devam edecek " +"(hiçbir tasarım bozulmayacak)." +msgstr[1] "" +"Bu dosyalarda daha önce kullanılmış olan varlıklar orada kalmaya devam " +"edecek (hiçbir tasarım bozulmayacak)." + msgid "modals.delete-webhook.accept" msgstr "Web kancasını sil" @@ -1808,6 +2070,11 @@ msgstr "Davet gönder" msgid "modals.invite-member.emails" msgstr "E-posta adresleri, virgülle ayrılmış" +msgid "modals.invite-member.repeated-invitation" +msgstr "" +"Bazı e-posta adresleri mevcut takım üyelerine aittir. Davetleri " +"gönderilmeyecektir." + #: src/app/main/ui/dashboard/team.cljs msgid "modals.invite-team-member.title" msgstr "Üyeleri takıma davet et" @@ -1881,7 +2148,16 @@ msgstr "" msgid "modals.promote-owner-confirm.title" msgstr "Yeni takım sahibi" -#: src/app/main/ui/workspace/header.cljs, +msgid "modals.publish-empty-library.accept" +msgstr "Yayınla" + +msgid "modals.publish-empty-library.message" +msgstr "Kütüphaneniz boş. Yine de yayınlamak istediğinizden emin misiniz?" + +msgid "modals.publish-empty-library.title" +msgstr "Boş kütüphaneyi yayınla" + +#: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.remove-shared-confirm.accept" msgstr "Paylaşılan Kütüphane olarak kaldır" @@ -1902,6 +2178,12 @@ msgstr "“%s” Paylaşılan Kütüphanesini Kaldır" msgid "modals.small-nudge" msgstr "Küçük dürtme" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.accept" +msgid_plural "modals.unpublish-shared-confirm.accept" +msgstr[0] "Yayından kaldır" +msgstr[1] "Yayından kaldır" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.message" @@ -1950,6 +2232,10 @@ msgstr "" msgid "modals.update-remote-component.message" msgstr "Paylaşılmış bir kütüphanede bir bileşen güncelle" +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "Yeni bir sürüm mevcut, lütfen sayfayı yenileyin" + #: src/app/main/ui/dashboard/team.cljs msgid "notifications.invitation-email-sent" msgstr "Davet başarıyla iletildi" @@ -2039,12 +2325,33 @@ msgstr "Katkıda bulunma kılavuzu" msgid "onboarding-v2.welcome.title" msgstr "Penpot'a hoş geldiniz!" +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Takım oluşturmaya devam edin" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Takım olmadan devam edin" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Takım oluşturun ve davet edin" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Takım oluşturun ve davet gönderin" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Daha sonra davet edebileceksiniz" + msgid "onboarding.choice.team-up.create-team-desc" msgstr "Takımınızı adlandırdıktan sonra, insanları katılmaya davet edebileceksiniz." msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "Takımın adını girin" +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Takım oluşturun" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Davet etmeden takım oluşturun" + msgid "onboarding.choice.team-up.invite-members" msgstr "Üyeleri davet edin" @@ -2056,6 +2363,12 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Rol ile davet et:" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Takım olmadan başlayın" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Daha sonra bir takım oluşturabileceksiniz." + msgid "onboarding.newsletter.accept" msgstr "Evet, abone ol" @@ -2104,6 +2417,179 @@ msgstr "Penpot" msgid "profile.recovery.go-to-login" msgstr "Oturum açmaya git" +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "Hangi tasarım aracını daha iyi kullanıyorsunuz?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "Çok fazla" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canva" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "... üzerinde çalışma deneyiminizi en iyi nasıl tarif edersiniz?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Tasarımcı" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Geliştirici" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "Penpot'u daha fazla keşfedin" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Kurucu/Başkan Yardımcısı" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Serbest çalışıyorum" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Takım projemin kodunu al " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... kullanıcı arayüzü tasarımı, görsel öğeler, tasarım sistemleri, vb." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "InVision" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Takımımın projesi için geri bildirim bırakın" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "Haydi başlayalım!" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Ürün veya Proje yöneticisi" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Pazarlama" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "50'den fazla" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Sonraki" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Hiçbiri" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Diğer (lütfen belirtiniz)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "Kendi projem üzerinde çalışıyorum" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "Önceki" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Penpot'u nasıl kullanmayı planlıyorsunuz?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Göreviniz nedir?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Bir seçenek belirleyin" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Sketch" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Biraz" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Başla" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Projem üzerinde çalışmaya başla" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Öğrenci veya öğretmen" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "Takımınızın büyüklüğü nedir?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Penpot'un takımınız için uygun olup olmadığını görmek için test edin " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Penpot'u fiziksel bir sunucuda kullanmadan önce deneyin" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "" +"... taslak çizimler, kullanıcı deneyimi yol haritası ve akışları, gezinme " +"menüsü, vb." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Konsept fikirler üzerinde çalışmak" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Geri bildiriminiz, Penpot'u kullanışlı ve eğlenceli bir araç haline " +"getirmeye devam edebilmemiz için alışkanlıklarınızı ve tercihlerinizi " +"anlamamıza yardımcı olacaktır." + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Çıkar" + #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, @@ -2163,6 +2649,9 @@ msgstr "Yollar" msgid "shortcut-subsection.shape" msgstr "Şekiller" +msgid "shortcut-subsection.text-editor" +msgstr "Metinler" + msgid "shortcut-subsection.tools" msgstr "Araçlar" @@ -2181,9 +2670,15 @@ msgstr "Düğüm ekle" msgid "shortcuts.align-bottom" msgstr "Alta hizala" +msgid "shortcuts.align-center" +msgstr "Ortala" + msgid "shortcuts.align-hcenter" msgstr "Ortayı yatay olarak hizala" +msgid "shortcuts.align-justify" +msgstr "İki yana yasla" + msgid "shortcuts.align-left" msgstr "Sola hizala" @@ -2199,6 +2694,9 @@ msgstr "Ortayı dikey olarak hizala" msgid "shortcuts.artboard-selection" msgstr "Seçimden çalışma yüzeyi oluştur" +msgid "shortcuts.bold" +msgstr "Kalın yazı aç/kapat" + msgid "shortcuts.bool-difference" msgstr "Boole farkı" @@ -2289,6 +2787,12 @@ msgstr "Yatay olarak çevir" msgid "shortcuts.flip-vertical" msgstr "Dikey olarak çevir" +msgid "shortcuts.font-size-dec" +msgstr "Yazı boyutunu azalt" + +msgid "shortcuts.font-size-inc" +msgstr "Yazı boyutunu artır" + msgid "shortcuts.go-to-drafts" msgstr "Taslaklara git" @@ -2313,9 +2817,27 @@ msgstr "Yakınlaştır" msgid "shortcuts.insert-image" msgstr "Görsel ekle" +msgid "shortcuts.italic" +msgstr "İtalik yazı aç/kapat" + msgid "shortcuts.join-nodes" msgstr "Düğümlere katıl" +msgid "shortcuts.letter-spacing-dec" +msgstr "Harf aralığını azalt" + +msgid "shortcuts.letter-spacing-inc" +msgstr "Harf aralığını artır" + +msgid "shortcuts.line-height-dec" +msgstr "Satır yüksekliğini azalt" + +msgid "shortcuts.line-height-inc" +msgstr "Satır yüksekliğini artır" + +msgid "shortcuts.line-through" +msgstr "Üstü çizili yazı aç/kapat" + msgid "shortcuts.make-corner" msgstr "Köşe yap" @@ -2436,6 +2958,15 @@ msgstr "Kısayolları ara" msgid "shortcuts.select-all" msgstr "Tümünü seç" +msgid "shortcuts.select-next" +msgstr "Sonraki katmanı seç" + +msgid "shortcuts.select-parent-layer" +msgstr "Ana katmanı seç" + +msgid "shortcuts.select-prev" +msgstr "Önceki katmanı seç" + msgid "shortcuts.separate-nodes" msgstr "Düğümleri ayır" @@ -2460,6 +2991,18 @@ msgstr "Ölçüme başla" msgid "shortcuts.stop-measure" msgstr "Ölçümü durdur" +msgid "shortcuts.text-align-center" +msgstr "Ortaya hizala" + +msgid "shortcuts.text-align-justify" +msgstr "İki yana yasla" + +msgid "shortcuts.text-align-left" +msgstr "Sola hizala" + +msgid "shortcuts.text-align-right" +msgstr "Sağa hizala" + msgid "shortcuts.thumbnail-set" msgstr "Küçük resimleri ayarla" @@ -2503,9 +3046,18 @@ msgstr "Cetvelleri göster/gizle" msgid "shortcuts.toggle-textpalette" msgstr "Metin paletini değiştir" +msgid "shortcuts.toggle-theme" +msgstr "Temayı değiştir" + +msgid "shortcuts.toggle-visibility" +msgstr "Göster / Gizle" + msgid "shortcuts.toggle-zoom-style" msgstr "Yakınlaştırma şeklini değiştir" +msgid "shortcuts.underline" +msgstr "Alt çizgiyi aç/kapat" + msgid "shortcuts.undo" msgstr "Geri al" @@ -2518,9 +3070,19 @@ msgstr "Maskelemeyi kaldır" msgid "shortcuts.v-distribute" msgstr "Dikey olarak dağıt" +msgid "shortcuts.zoom-lense-decrease" +msgstr "Görüntüyü küçült" + +msgid "shortcuts.zoom-lense-increase" +msgstr "Görüntüyü büyült" + msgid "shortcuts.zoom-selected" msgstr "Seçilene yakınlaştır" +#: src/app/main/ui/dashboard/team.cljs +msgid "team.webhooks.max-length" +msgstr "Webhook adı en fazla 2048 karakter içermelidir." + #: src/app/main/ui/dashboard/files.cljs msgid "title.dashboard.files" msgstr "%s - Penpot" @@ -2549,6 +3111,10 @@ msgstr "Paylaşılmış Kütüphaneler - %s - Penpot" msgid "title.default" msgstr "Penpot - Takımlar için Özgür Tasarım" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "Profil - Erişim belirteçleri" + #: src/app/main/ui/settings/feedback.cljs msgid "title.settings.feedback" msgstr "Geri bildirimde bulun - Penpot" @@ -2713,6 +3279,9 @@ msgstr "Sil" msgid "workspace.assets.duplicate" msgstr "Çoğalt" +msgid "workspace.assets.duplicate-main" +msgstr "Ana bileşeni çoğalt" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.edit" @@ -2742,6 +3311,9 @@ msgstr "yerel kütüphane" msgid "workspace.assets.not-found" msgstr "Varlık bulunmadı" +msgid "workspace.assets.open-library" +msgstr "Kütüphane dosyasını aç" + #: src/app/main/ui/workspace/sidebar/sitemap.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs @@ -2762,6 +3334,10 @@ msgid_plural "workspace.assets.selected-count" msgstr[0] "%s öge seçildi" msgstr[1] "%s öge seçildi" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "Paylaşılan kütüphane" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" @@ -2808,6 +3384,45 @@ msgstr "Metin Dönüşümü" msgid "workspace.assets.ungroup" msgstr "Grubu dağıt" +msgid "workspace.context-menu.grid-cells.area" +msgstr "Alan oluştur" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Çalışma yüzeyi oluştur" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Hücreleri birleştir" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Sağa 1 sütun ekle" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Sola 1 sütun ekle" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Sütunu sil" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Sütun ve şekilleri sil" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Yinelenen sütun" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Aşağıya 1 satır ekle" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Yukarıya 1 satır ekle" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Satırı sil" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Satır ve şekilleri sil" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Yinelenen satır" + msgid "workspace.focus.focus-mode" msgstr "Odaklanma modu" @@ -2834,6 +3449,9 @@ msgstr "Dairesel degrade" msgid "workspace.header.menu.disable-dynamic-alignment" msgstr "Dinamik hizalamayı devre dışı bırak" +msgid "workspace.header.menu.disable-scale-content" +msgstr "Orantılı ölçeklendirmeyi devre dışı bırak" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-scale-text" msgstr "Metin ölçeklendirmeyi devre dışı bırak" @@ -2849,6 +3467,9 @@ msgstr "Piksele tutturmayı devre dışı bırak" msgid "workspace.header.menu.enable-dynamic-alignment" msgstr "Dinamik hizalamayı etkinleştir" +msgid "workspace.header.menu.enable-scale-content" +msgstr "Orantılı ölçeklendirmeyi etkinleştir" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-scale-text" msgstr "Metin ölçeklendirmeyi etkinleştir" @@ -2899,6 +3520,9 @@ msgstr "Tercihler" msgid "workspace.header.menu.option.view" msgstr "Görünüm" +msgid "workspace.header.menu.redo" +msgstr "Tekrarla" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.select-all" msgstr "Tümünü seç" @@ -2922,6 +3546,15 @@ msgstr "Cetvelleri göster" msgid "workspace.header.menu.show-textpalette" msgstr "Yazı tipi paletini göster" +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Koyu temaya geç" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "Açık temaya geç" + +msgid "workspace.header.menu.undo" +msgstr "Geri al" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.reset-zoom" msgstr "Sıfırla" @@ -2946,6 +3579,10 @@ msgstr "Kaydedilmemiş değişiklikler" msgid "workspace.header.viewer" msgstr "Görünüm modu (%s)" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "Yakınlaştırma" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.zoom-fill" msgstr "Doldur - Doldurmak için ölçeklendir" @@ -2966,6 +3603,21 @@ msgstr "Tam ekran" msgid "workspace.header.zoom-selected" msgstr "Seçilene yakınlaştır" +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Izgarayı düzenle" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Çıkış" + +msgid "workspace.layout_grid.editor.title" +msgstr "Düzenleme ızgarası" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Bitti" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Bul" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Ekle" @@ -2974,6 +3626,14 @@ msgstr "Ekle" msgid "workspace.libraries.colors" msgstr "%s renk" +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "Kütüphanenizde henüz renk stili yok" + +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "Kütüphanenizde henüz tipografi stili yok" + #: src/app/main/ui/workspace/colorpicker/libraries.cljs, #: src/app/main/ui/workspace/colorpalette.cljs msgid "workspace.libraries.colors.file-library" @@ -3024,6 +3684,14 @@ msgstr "KÜTÜPHANELER" msgid "workspace.libraries.library" msgstr "KÜTÜPHANE" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library-updates" +msgstr "KÜTÜPHANE GÜNCELLEMELERİ" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Yükleniyor…" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "Güncelleme gerektiren Paylaşılmış Kütüphane bulunmuyor" @@ -3060,6 +3728,10 @@ msgstr "%s tipografi" msgid "workspace.libraries.update" msgstr "Güncelle" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "tüm değişiklikleri gör" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.updates" msgstr "GÜNCELLEMELER" @@ -3091,6 +3763,27 @@ msgstr "İçeriği kırp" msgid "workspace.options.component" msgstr "Bileşen" +msgid "workspace.options.component.annotation" +msgstr "Açıklama" + +msgid "workspace.options.component.copy" +msgstr "Kopyala" + +msgid "workspace.options.component.create-annotation" +msgstr "Bir açıklama oluştur" + +msgid "workspace.options.component.edit-annotation" +msgstr "Bir açıklamayı düzenle" + +msgid "workspace.options.component.main" +msgstr "Ana bileşen" + +msgid "workspace.options.component.swap" +msgstr "Bileşeni değiştir" + +msgid "workspace.options.component.swap.empty" +msgstr "Bu kütüphanede henüz varlık yok" + #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Kısıtlamalar" @@ -3145,6 +3838,12 @@ msgstr "Dışa aktar" msgid "workspace.options.export-multiple" msgstr "Seçimi dışa aktar" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export-object" +msgid_plural "workspace.options.export-object" +msgstr[0] "1 ögeyi dışa aktar" +msgstr[1] "%s ögeyi dışa aktar" + #: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs msgid "workspace.options.export.suffix" msgstr "Son ek" @@ -3177,6 +3876,10 @@ msgstr "Doldur" msgid "workspace.options.flows.add-flow-start" msgstr "Akış başlangıcı ekle" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Akış" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "Akış başlangıcı" @@ -3280,6 +3983,9 @@ msgstr "Grubu doldur" msgid "workspace.options.group-stroke" msgstr "Grubu çiz" +msgid "workspace.options.guides.title" +msgstr "Kılavuzlar" + msgid "workspace.options.height" msgstr "Yükseklik" @@ -3828,14 +4534,26 @@ msgstr "Çerçeve" msgid "workspace.options.stroke-cap.circle-marker" msgstr "Daire işaretleyici" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Daire" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "Elmas işaretleyici" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Elmas" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "Çizgi oku" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Ok" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "Hiçbiri" @@ -3852,10 +4570,18 @@ msgstr "Kare" msgid "workspace.options.stroke-cap.square-marker" msgstr "Kare işaretleyici" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Dikdörtgen" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "Üçgen ok" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Üçgen" + msgid "workspace.options.stroke-color" msgstr "Çerçeve rengi" @@ -4030,6 +4756,9 @@ msgstr "Düğümleri tuttur (%s)" msgid "workspace.shape.menu.add-flex" msgstr "Esnek düzen ekle" +msgid "workspace.shape.menu.add-grid" +msgstr "Izgara düzeni ekle" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.back" msgstr "En arkaya gönder" @@ -4042,6 +4771,9 @@ msgstr "Arkaya gönder" msgid "workspace.shape.menu.copy" msgstr "Kopyala" +msgid "workspace.shape.menu.create-annotation" +msgstr "Açıklama oluştur" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.create-artboard-from-selection" msgstr "Çalışma yüzeyi için seçim" @@ -4050,6 +4782,9 @@ msgstr "Çalışma yüzeyi için seçim" msgid "workspace.shape.menu.create-component" msgstr "Bileşen oluştur" +msgid "workspace.shape.menu.create-multiple-components" +msgstr "Çoklu bileşen oluştur" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.cut" msgstr "Kes" @@ -4317,6 +5052,13 @@ msgstr "Metin (%s)" msgid "workspace.toolbar.text-palette" msgstr "Tipografiler (%s)" +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**İnceleme modu** (Yalnızca görüntüle)" + +msgid "workspace.top-bar.read-only.done" +msgstr "Bitti" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Şu ana kadar değişim geçmişi yok" @@ -4436,6 +5178,10 @@ msgstr "Geçmiş" msgid "workspace.updates.dismiss" msgstr "Yoksay" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "Daha fazla bilgi" + #: src/app/main/data/workspace/libraries.cljs msgid "workspace.updates.there-are-updates" msgstr "Paylaşılan kütüphaneler için güncellemeler var" @@ -4504,692 +5250,3 @@ msgstr "Yolu kapatmak için tıklayın" #~ msgid "workspace.options.layout-item.title.min-w" #~ msgstr "Asgari genişlik" - -msgid "shortcuts.bold" -msgstr "Kalın yazı aç/kapat" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "Penpot'u fiziksel bir sunucuda kullanmadan önce deneyin" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "Konsept fikirler üzerinde çalışmak" - -#: src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.empty-palette" -msgstr "Kütüphanenizde henüz renk stili yok" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "30 gün" - -msgid "workspace.options.component.copy" -msgstr "Kopyala" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"Geri bildiriminiz, Penpot'u kullanışlı ve eğlenceli bir araç haline " -"getirmeye devam edebilmemiz için alışkanlıklarınızı ve tercihlerinizi " -"anlamamıza yardımcı olacaktır." - -msgid "modals.invite-member.repeated-invitation" -msgstr "" -"Bazı e-posta adresleri mevcut takım üyelerine aittir. Davetleri " -"gönderilmeyecektir." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "Geliştirici" - -msgid "shortcuts.align-justify" -msgstr "İki yana yasla" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "Ürün veya Proje yöneticisi" - -msgid "workspace.options.component.create-annotation" -msgstr "Bir açıklama oluştur" - -#, markdown -msgid "dashboard.fonts.warning-text" -msgstr "" -"İşletim sistemlerinin farklı dikey metriklerine ilişkin olarak yazı " -"tiplerinizde olası bir sorun tespit ettik. Bu durumu kontrol etmek için [" -"bunun gibi](https://vertical-metrics.netlify.app/) yazı tipi dikey metrik " -"hizmetlerini kullanabilirsiniz. Ayrıca web yazı tipleri oluşturmak ve " -"hataları düzeltmek için [Transfonter](https://transfonter.org/) kullanmanızı " -"öneririz. " - -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "Yeni bir sürüm mevcut, lütfen sayfayı yenileyin" - -msgid "modals.delete-component-annotation.message" -msgstr "Bu açıklamayı silmek istediğinize emin misiniz?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Pazarlama" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "180 gün" - -msgid "workspace.options.component.edit-annotation" -msgstr "Bir açıklamayı düzenle" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "Takım projemin kodunu al " - -msgid "workspace.shape.menu.create-multiple-components" -msgstr "Çoklu bileşen oluştur" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "Kendi projem üzerinde çalışıyorum" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Dikdörtgen" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "İsim gereklidir" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.scd-message" -msgid_plural "modals.delete-shared-confirm.activated.scd-message" -msgstr[0] "Bu kütüphane burada etkinleştirildi: " -msgstr[1] "Bu kütüphaneler burada etkinleştirildiler: " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "Serbest çalışıyorum" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.copied-success" -msgstr "Belirteç kopyalandı" - -msgid "modals.publish-empty-library.title" -msgstr "Boş kütüphaneyi yayınla" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Figma" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "tüm değişiklikleri gör" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "...marka çalışması, çizimler, pazarlama materyalleri, vb." - -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "Kütüphanenizde henüz tipografi stili yok" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-90-days" -msgstr "90 gün" - -msgid "shortcuts.zoom-lense-increase" -msgstr "Görüntüyü büyült" - -msgid "workspace.shape.menu.add-grid" -msgstr "Izgara düzeni ekle" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "" -"Bu dosyada daha önce kullanılmış olan varlıklar orada kalmaya devam edecek (" -"hiçbir tasarım bozulmayacak)." -msgstr[1] "" -"Bu dosyalarda daha önce kullanılmış olan varlıklar orada kalmaya devam " -"edecek (hiçbir tasarım bozulmayacak)." - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom" -msgstr "Yakınlaştırma" - -msgid "workspace.options.component.annotation" -msgstr "Açıklama" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.some" -msgstr "Biraz" - -msgid "shortcuts.text-align-justify" -msgstr "İki yana yasla" - -msgid "workspace.layout_grid.editor.title" -msgstr "Düzenleme ızgarası" - -#: src/app/main/ui/dashboard/team.cljs -msgid "team.webhooks.max-length" -msgstr "Webhook adı en fazla 2048 karakter içermelidir." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "%s tarihinde sona erdi" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.expiration-date.label" -msgstr "Sona erme tarihi" - -msgid "workspace.header.menu.undo" -msgstr "Geri al" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "50'den fazla" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-weight" -msgstr "Yazı Tipi Kalınlığı" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-not-empty" -msgstr "Parola boşluk dışında bir karakter içermelidir." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "Sonraki" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "Takımınızın büyüklüğü nedir?" - -msgid "shortcuts.toggle-visibility" -msgstr "Göster / Gizle" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "" -"... taslak çizimler, kullanıcı deneyimi yol haritası ve akışları, gezinme " -"menüsü, vb." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-60-days" -msgstr "60 gün" - -msgid "workspace.header.menu.disable-scale-content" -msgstr "Orantılı ölçeklendirmeyi devre dışı bırak" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "Çok fazla" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "Başla" - -msgid "shortcuts.align-center" -msgstr "Ortala" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Elmas" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "Penpot'u nasıl kullanmayı planlıyorsunuz?" - -msgid "workspace.header.menu.redo" -msgstr "Tekrarla" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "... üzerinde çalışma deneyiminizi en iyi nasıl tarif edersiniz?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "Bir seçenek belirleyin" - -msgid "shortcuts.text-align-left" -msgstr "Sola hizala" - -msgid "shortcuts.font-size-dec" -msgstr "Yazı boyutunu azalt" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "Tasarımcı" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "Hiçbiri" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "Haydi başlayalım!" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Adobe XD" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Çıkar" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Sketch" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library-updates" -msgstr "KÜTÜPHANE GÜNCELLEMELERİ" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Üçgen" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.label" -msgstr "İsim" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.no-files-message" -msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "Hiçbir dosyada etkinleştirilmedi." -msgstr[1] "Hiçbir dosyada etkinleştirilmediler." - -msgid "modals.publish-empty-library.message" -msgstr "Kütüphaneniz boş. Yine de yayınlamak istediğinizden emin misiniz?" - -msgid "workspace.assets.open-library" -msgstr "Kütüphane dosyasını aç" - -msgid "modals.delete-component-annotation.title" -msgstr "Açıklamayı sil" - -msgid "shortcuts.select-parent-layer" -msgstr "Ana katmanı seç" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "Paylaşılan kütüphane" - -msgid "shortcuts.select-next" -msgstr "Sonraki katmanı seç" - -msgid "workspace.header.menu.enable-scale-content" -msgstr "Orantılı ölçeklendirmeyi etkinleştir" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "Daha fazla bilgi" - -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "İsim boşluk dışında bir karakter içermelidir." - -msgid "shortcuts.line-height-inc" -msgstr "Satır yüksekliğini artır" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "Diğer (lütfen belirtiniz)" - -msgid "labels.discard" -msgstr "At" - -msgid "shortcuts.font-size-inc" -msgstr "Yazı boyutunu artır" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "Penpot'un takımınız için uygun olup olmadığını görmek için test edin " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "Öğrenci veya öğretmen" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "Takımımın projesi için geri bildirim bırakın" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "31-50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "InVision" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Canva" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "Penpot'u daha fazla keşfedin" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expires-on" -msgstr "%s tarihinde sona eriyor" - -msgid "shortcuts.italic" -msgstr "İtalik yazı aç/kapat" - -msgid "shortcuts.letter-spacing-dec" -msgstr "Harf aralığını azalt" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "Önceki" - -msgid "workspace.shape.menu.create-annotation" -msgstr "Açıklama oluştur" - -msgid "shortcuts.letter-spacing-inc" -msgstr "Harf aralığını artır" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "Projem üzerinde çalışmaya başla" - -msgid "shortcuts.text-align-center" -msgstr "Ortaya hizala" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Ok" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "Hangi tasarım aracını daha iyi kullanıyorsunuz?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "Göreviniz nedir?" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Kütüphaneniz boş. Paylaşılan Kütüphane olarak eklendiğinde, oluşturduğunuz " -"varlıklar diğer dosyalarınız arasında kullanılabilir olacak. Yayınlamak " -"istediğinizden emin misiniz?" - -msgid "shortcuts.text-align-right" -msgstr "Sağa hizala" - -msgid "shortcuts.underline" -msgstr "Alt çizgiyi aç/kapat" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-never" -msgstr "Asla" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Kurucu/Başkan Yardımcısı" - -msgid "modals.publish-empty-library.accept" -msgstr "Yayınla" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.no-expiration" -msgstr "Süresiz" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "İsim en fazla 250 karakter içermelidir." - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Daire" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "11-30" - -msgid "shortcut-subsection.text-editor" -msgstr "Metinler" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "... kullanıcı arayüzü tasarımı, görsel öğeler, tasarım sistemleri, vb." - -msgid "shortcuts.zoom-lense-decrease" -msgstr "Görüntüyü küçült" - -msgid "shortcuts.line-height-dec" -msgstr "Satır yüksekliğini azalt" - -msgid "shortcuts.select-prev" -msgstr "Önceki katmanı seç" - -msgid "shortcuts.line-through" -msgstr "Üstü çizili yazı aç/kapat" - -msgid "errors.cannot-upload" -msgstr "Medya dosyası yüklenemedi." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.message" -msgstr "Bu belirteci silmek istediğinizden emin misiniz?" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.access-tokens" -msgstr "Erişim belirteçleri" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-not-expire" -msgstr "Belirtecin sona erme tarihi yok" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "Yeni belirteç oluştur" - -msgid "workspace.options.component.main" -msgstr "Ana bileşen" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-expire" -msgstr "Belirtecin süresi %s tarihinde sona erecek" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.accept" -msgstr "Belirteci sil" - -msgid "workspace.assets.duplicate-main" -msgstr "Ana bileşeni çoğalt" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.submit-label" -msgstr "Belirteç oluştur" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.placeholder" -msgstr "Adı, belirtecin ne için olduğunu bilmenize yardımcı olabilir" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.no-access-tokens" -msgstr "Şu ana kadar hiç belirteciniz yok." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"Kişisel erişim belirteçleri, oturum açma/parola kimlik doğrulama sistemimize " -"alternatif olarak işlev görür ve bir uygulamanın dahili Penpot API'sine " -"erişmesine izin vermek için kullanılabilir" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "Kişisel erişim belirteçleri" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "Bir belirteç oluşturmak için \"Yeni belirteç oluştur\" düğmesine basın." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.title" -msgstr "Belirteci sil" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "Erişim belirteci başarıyla oluşturuldu." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.title" -msgstr "Erişim belirteci oluştur" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.copy-token" -msgstr "Belirteci kopyala" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "title.settings.access-tokens" -msgstr "Profil - Erişim belirteçleri" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Bir hesap oluştururken, [koşullarımızı](%s) ve [gizlilik politikamızı](%s) " -"kabul etmiş sayılırsınız." - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-delete-file" -msgid_plural "dashboard.success-delete-file" -msgstr[0] "Dosyanız başarıyla silindi" -msgstr[1] "Dosyalarınız başarıyla silindi" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Dosyanın uyumsuz bir sürüm numarası var" - -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Etkinleştirilen özellikler ile açmaya çalıştığınız dosyanın özellikleri " -"arasında bir uyumsuzluk var gibi görünüyor. Dosyanın açılabilmesi için önce " -"'%s' için geçişlerin uygulanması gerekiyor." - -msgid "errors.validation" -msgstr "Doğrulama Hatası" - -msgid "errors.paste-data-validation" -msgstr "Panoda geçersiz veri" - -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Ayarlanmadı" - -msgid "labels.share" -msgstr "Paylaş" - -msgid "labels.search" -msgstr "Ara" - -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Takım olmadan başlayın" - -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Takım oluşturmaya devam edin" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Daha sonra bir takım oluşturabileceksiniz." - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Takım olmadan devam edin" - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Takım oluşturun ve davet gönderin" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Davet etmeden takım oluşturun" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Takım oluşturun ve davet edin" - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Takım oluşturun" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Daha sonra davet edebileceksiniz" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Bul" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Bitti" - -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Izgarayı düzenle" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Çıkış" - -msgid "workspace.options.component.swap" -msgstr "Bileşeni değiştir" - -msgid "workspace.options.component.swap.empty" -msgstr "Bu kütüphanede henüz varlık yok" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Akış" - -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**İnceleme modu** (Yalnızca görüntüle)" - -msgid "workspace.top-bar.read-only.done" -msgstr "Bitti" - -msgid "media.image" -msgstr "Görsel" - -msgid "media.solid" -msgstr "Katı" - -msgid "media.linear" -msgstr "Doğrusal" - -msgid "media.radial" -msgstr "Işınsal" - -msgid "media.gradient" -msgstr "Değişim" - -msgid "media.choose-image" -msgstr "Görsel seç" - -msgid "workspace.options.guides.title" -msgstr "Kılavuzlar" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.accept" -msgid_plural "modals.unpublish-shared-confirm.accept" -msgstr[0] "Yayından kaldır" -msgstr[1] "Yayından kaldır" - -msgid "dashboard.import.import-message" -msgid_plural "dashboard.import.import-message" -msgstr[0] "1 dosya başarıyla içeri aktarıldı." -msgstr[1] "%s dosya başarıyla içeri aktarıldı." - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-duplicate-file" -msgid_plural "dashboard.success-delete-file" -msgstr[0] "Dosyanız başarıyla kopyalandı" -msgstr[1] "Dosyalarınız başarıyla kopyalandı" - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Uyumsuz '%s' özelliği algılandı" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "workspace.options.export-object" -msgid_plural "workspace.options.export-object" -msgstr[0] "1 ögeyi dışa aktar" -msgstr[1] "%s ögeyi dışa aktar" diff --git a/frontend/translations/yo.po b/frontend/translations/yo.po new file mode 100644 index 000000000..6a9b82b11 --- /dev/null +++ b/frontend/translations/yo.po @@ -0,0 +1,4646 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2024-02-14 08:02+0000\n" +"Last-Translator: Alejandro Alonso \n" +"Language-Team: Yoruba " +"\n" +"Language: yo\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.4-dev\n" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.check-your-email" +msgstr "" +"yẹ ímeèlì rẹ wò kí o tẹ ọ̀nà-àsopọ̀ láti mọ̀ dájú àti láti bẹ̀rẹ̀ sí lo " +"pẹ́ńpọtì." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.confirm-password" +msgstr "jẹ́rìísí ọ̀rọ̀-ìgbaniwọlé" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-account" +msgstr "ṣẹ̀dá ìfihàn àkáùntí" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-profile" +msgstr "kàn fẹ́ gbìyànjú ú rẹ̀?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.demo-warning" +msgstr "" +"\"\"This is a DEMO service, DO NOT USE for real work, the projects will be " +"parẹ́ lóòrèkóòrè." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.email" +msgstr "ímeèlì" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.forgot-password" +msgstr "gbàgbé ọ̀rọ̀-ìgbaniwọlé ?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.fullname" +msgstr "orúkọ lẹ́kùnn-ún-rẹ́rẹ́" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.login-here" +msgstr "wọlé síbí" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-submit" +msgstr "wọlé" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-title" +msgstr "ó dára láti rí ẹ lẹ́ẹ̀kan sí i!" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-github-submit" +msgstr "ibùdó gítì" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-gitlab-submit" +msgstr "láàbù gítì" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-google-submit" +msgstr "ṣàwárí" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-ldap-submit" +msgstr "LDAP" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-oidc-submit" +msgstr "ṣílẹ̀kuǹ ìdánimọ̀" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "orúkọ kò gbọdọ̀ ju àádọ́jọ́ lẹ́tà lọ." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.new-password" +msgstr "tẹ ọ̀rọ̀ ìgbaniwọlé tuntun" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.invalid-token-error" +msgstr "àmì àtúnwárí ti díbàjẹ́." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.password-changed-successfully" +msgstr "ọ̀rọ̀-ìgbaniwọlé ti yí padà dáadáa" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.profile-not-verified" +msgstr "" +"a tí ì ṣe ìwádìí bí o ṣe jẹ́, jọ̀wọ́ ṣe ìwádìí bí o ṣe jẹ́ kí o tó tẹ̀ " +"síwájú." + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.recovery-token-sent" +msgstr "a ti fi ọ̀rọ̀-ìgbaniwọle aṣàtúnwárí ránṣẹ sínu àpótí rẹ." + +#: src/app/main/ui/auth/verify_token.cljs +msgid "auth.notifications.team-invitation-accepted" +msgstr "o ti wọ inú ẹgbẹ́ bó ṣeyẹ" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.password" +msgstr "ọ̀rọ̀- ìgbaniwọlé" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-length-hint" +msgstr "kò gbọdọ̀ ju ohun kíkọ mẹ́jọ lọ" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "ọ̀rọ̀-ìgbaniwọlé gbọ́dọ̀ ní nǹkan kíkọ láìsí àlàfo." + +msgid "auth.privacy-policy" +msgstr "ìpamọ ètò ìmúló" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-submit" +msgstr "ṣàtuńwárí ọ̀rọ̀-ìgbaniwọlé" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-subtitle" +msgstr "a má a fi àwọn ìtọ́nisọ́nà ránsẹ́ sínú ímeèlì rẹ" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-title" +msgstr "gbàgbé ọ̀rọ̀-ìgbaniwọle ?" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.recovery-submit" +msgstr "yí ọ̀rọ̀-ìgbaniwọlé rẹ padà" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.register" +msgstr "kò tí ì sí àkáùntì?" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.register-submit" +msgstr "ṣẹ̀dá àkáùntì" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-subtitle" +msgstr "ọ̀fẹ́ ni,orísun rẹ̀ ṣí lẹ" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-title" +msgstr "ṣẹ̀dá àkáùntì" + +#: src/app/main/ui/auth.cljs +msgid "auth.sidebar-tagline" +msgstr "ṣíṣí orísun yíyà àti àwòrán ni yóò fi lojútùú ." + +msgid "auth.terms-of-service" +msgstr "òfin ibiṣẹ́" + +msgid "auth.terms-privacy-agreement" +msgstr "" +"\"nígbà, tí o bá ń ṣẹ̀dá àkáùntí tuntun ,o gbọ́dọ̀ gba àwọn òfin ibiṣẹ́ " +"àti àṣírí rẹ́`." + +#: src/app/main/ui/auth/register.cljs +msgid "auth.verification-email-sent" +msgstr "a ti fi ìjẹ́rìísí ránsẹ́ sínú ímeèlì rẹ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr ".. ìyàsọ́tọ, àpèjúwe,títajà nǹkan, abbl." + +msgid "common.publish" +msgstr "ìgbéjáde" + +msgid "common.share-link.all-users" +msgstr "gbogbo àwọn tó ń lo pẹ́ńpọtì" + +msgid "common.share-link.current-tag" +msgstr "(lọ́wọ́lọ́wọ́)" + +msgid "common.share-link.destroy-link" +msgstr "pa ọ̀nà-àsopọ̀ run" + +msgid "common.share-link.get-link" +msgstr "gba ọ̀nà-àsopọ́" + +msgid "common.share-link.link-copied-success" +msgstr "so àdàkọ pọ̀ bó ṣeyẹ" + +msgid "common.share-link.manage-ops" +msgstr "ṣàkóṣo ìgbaniláàye" + +msgid "common.share-link.permissions-can-comment" +msgstr "o lè sọ̀rọ̀" + +msgid "common.share-link.permissions-can-inspect" +msgstr "ṣe àyẹ̀wò kóòdù" + +msgid "common.share-link.permissions-hint" +msgstr "ẹnikẹ́ni tí ó bá ní ọ̀nà-àsopọ á ní àǹfààní àtiwọle" + +msgid "common.share-link.permissions-pages" +msgstr "pín ojú ìwé" + +msgid "common.share-link.placeholder" +msgstr "ọ̀nà-àsopọ̀ ojú ìwé tí a pín á hàn ní bí yìí" + +msgid "common.share-link.team-members" +msgstr "ọmọ ẹgbẹ́ nìkan ni" + +msgid "common.share-link.title" +msgstr "pín àwọn àpẹrẹ" + +msgid "common.share-link.view-all" +msgstr "yan gbogbo rẹ̀" + +msgid "common.unpublish" +msgstr "ohun tí a kò tí ì kọ jáde" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.management" +msgstr "ìṣàkóṣo ọmọ ẹgbẹ" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.title" +msgstr "kẹ́gbẹ́ ṣera wọn lọ́kan" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.info" +msgstr "" +"\"kọ́ nípa kókó bi pẹ́ńpọtì nígbàtí ò ń dára rẹ láraya nípa fífi àwon " +"ọwọ́ rẹ ṣe “ “ìdánilẹ́kọ̀ọ́ ." + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.start" +msgstr "bẹ̀rẹ̀ ìdánilẹ́kọ̀ọ́" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.title" +msgstr "gbọ́wọ́ lórí idánilẹ́kọ̀ọ́" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.info" +msgstr "rìn kàákiri pẹ́ńpọti kí o lè mọ kókó àwẹn ẹ̀yà ara rẹ̀." + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.start" +msgstr "bẹ̀rẹ̀ ìrìn kiri" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.title" +msgstr "wò ó bí o ṣe ń rìn kiri" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "ṣe ìpilẹ̀sẹ̀ àmì tókìnnì" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "ṣe àyẹ̀wò àmì tókìnnì tí o ṣẹ̀dá bó ṣeyẹ." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "tẹ bọ́tìnnì \" ṣe ìpilẹ̀sẹ̀ àmì tókìnnì tuntun\" láti ṣe ìpilẹ̀sẹ̀ òmíràn." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "o kò tí ì ní àmì tókínnì títí di ìsinsìn yìí." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "a nílò orúkọ" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "ọgọ́saǹ-ań ọjọ́" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "ọgbọ̀n ọjọ́" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "ọgọ́ta ọjọ́" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "àádọ́ruǹ-ún ọjọ́" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "rárá" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "ó parí ní %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "ó parí %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.no-expiration" +msgstr "kò sì ọjọ́ ìparí" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "àmì tokìnnì ìwọlé ti ara ẹni" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"Iṣẹ́ àmì tókìnì ìwọlé ti ara ẹni dàbì ọ̀nà kejí tí a le gbà wọlé/ ọ̀rọ̀- " +"agbaniwọle a lè lo ìfàsẹ sí ètò láti gbaye fún ohun èlò à tì wọlé " +"pẹ́ńpọtì ti abẹ́nú api" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "àmì tòkìn yóò parí ní %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "kò sí ọjọ́ ìparí fún àmì tókìn" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.add-shared" +msgstr "ṣe àpàpọ̀ bí i yàrá ìkàwe tí a pín" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.change-email" +msgstr "pàrọ̀ ímeèlí" + +#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs +msgid "dashboard.copy-suffix" +msgstr "(dàákọ)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.create-new-team" +msgstr "ṣẹ̀dá ẹgbẹ́ tuntun" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.default-team-name" +msgstr "pẹ́ńpọtì rẹ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.delete-team" +msgstr "pa ẹgbẹ́ rẹ́" + +msgid "dashboard.download-binary-file" +msgstr "sọ fáìlí pẹ́ńpọtì kalẹ̀ (.penpot)" + +msgid "dashboard.download-standard-file" +msgstr "sọ fáìlì ìpéwọ̀n kalẹ̀ (.svg + .json)" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate" +msgstr "ṣe ẹ̀dà" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate-multi" +msgstr "ṣe ẹ̀dà %s fáìlì" + +#: src/app/main/ui/dashboard/grid.cljs +#, markdown +msgid "dashboard.empty-placeholder-drafts" +msgstr "" +"\"\" fáìlí tí a dàpọ̀ mọ yàrá ìkàwé á hàn níbí yìí. gbìyànjú láti má a " +"pín àwon fáìlì rẹ̀ tàbí ṣàfikún láti ibi [yàrá ìkàwé wa àti àwòṣe " +"](https://penpot.app/libraries-templates.html)." + +msgid "dashboard.export-binary-multi" +msgstr "sọ àwọn fáìlì pẹ́ẹ́pọtì kalẹ́ %s (.pẹ́ńpọtì)" + +msgid "dashboard.export-frames" +msgstr "fi bọọdù ráńṣẹ bí i PDF" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-frames.title" +msgstr "fi ráńṣẹ́ bí i PDF" + +msgid "dashboard.export-multi" +msgstr "fi pẹ́ńpọtì ráńṣẹ́%s files" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-multiple.selected" +msgstr "% ti %s ẹ́límẹ́ǹti tí a yàn" + +#: src/app/main/ui/workspace/header.cljs +msgid "dashboard.export-shapes" +msgstr "fi ráńṣẹ" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to" +msgstr "" +"o lé ṣe àfikún ti ètò ìfiráńṣẹ si ẹ́límẹ́ǹtì láti bi àmì ohun ìní ( níbi " +"ìsàlẹ̀ báà lẹ́gbẹ̀ẹ́ ọ̀tun )." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to-link" +msgstr "àlàyé bí a ti ṣètò ìfiráńṣẹ sí pẹ́ńpọtì ." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.no-elements" +msgstr "kòsí àwọn ẹ́límẹ́ǹtì pẹ̀lú ètò ìfirańńṣẹ." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.title" +msgstr "àṣàyàn ìfiránṣẹ́" + +msgid "dashboard.export-standard-multi" +msgstr "danlóòdù %s àwọn ojúlówó fáìli (.svg + .json)" + +msgid "dashboard.export.detail" +msgstr "* ó le ní àwọn ẹ̀yà ara, àwòrán àti àwon àwọ̀ àti / tàbí àtẹ̀jáde." + +msgid "dashboard.export.options.all.message" +msgstr "" +"àwọn fáìli tí ó wà nínú yàrá ìkàwé pípín á dàpọ̀ mọ́ ti ìfiráńṣẹ́, fún " +"síṣetọ́jútheir linkage ìsopọ̀ wọn." + +msgid "dashboard.export.options.all.title" +msgstr "ṣe ìfiráńṣẹ́ yàrá ìkàwé pípín" + +msgid "dashboard.export.options.detach.message" +msgstr "" +"Shared libraries will not be included in the export and no assets will be " +"yàrá ìkàwé pípín kò ní sí nínú ti ìfiráńṣẹ́ àti pé kò ni ohun ìní kan tí " +"a ó fi kún yàrá ìkàwé. " + +msgid "dashboard.export.options.detach.title" +msgstr "ṣe ìtọ́jú ohun ìní iyàrá ìkàwé pípín bí i nǹkan tó jẹ́ kókó" + +msgid "dashboard.export.options.merge.message" +msgstr "" +"á fi fáìlì rẹ ráńṣẹ́ pẹ̀lú gbogbo àwọn ohun ìní tó wà láyìíka ni a ó papọ̀ " +"sínú fáìlì yàrá ìkàwé." + +msgid "dashboard.export.options.merge.title" +msgstr "da ohun ìní yàrá ìkàwé pípín pọ̀ mọ́ fáìlì yàrá ìkàwé" + +msgid "dashboard.export.title" +msgstr "fi àwọn fáìlì ráńṣẹ" + +msgid "dashboard.fonts.deleted-placeholder" +msgstr "fọ́ǹtì tó sọnù" + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.dismiss-all" +msgstr "yọ gbogbo wọn kúrò" + +msgid "dashboard.fonts.empty-placeholder" +msgstr "àwọn fọ́ǹtì tí o ọpulóòdù yó hàn níbí." + +#, markdown +msgid "dashboard.fonts.hero-text1" +msgstr "" +"èyíkéyìí wẹ́bù fọ́ǹtì tí o bá ti ọpulóòdù níbí ni á di àkópọ̀ mọ́ ẹbí " +"fọ́ǹtì àwọn ọ̀rọ̀ ohun ìní tí o wà nínú àwọn fáìlì ẹgbẹ́. Fọ́ǹtì " +"pẹ̀lú u orúkọ ẹbi fọ́ǹtì kanna la ó dàpọ̀ mọ́ ẹgbẹ́ bí i**ẹbí fọ́ǹtì kan " +"soso**. O lè ọpulóòdù fọ́ǹtì pẹ̀lú àwọn ìlànà wọ̀nyí: **TTF, OTF and " +"WOFF** (ẹyọ kan péré la ó nílò)." + +#, markdown +msgid "dashboard.fonts.hero-text2" +msgstr "" +"àwọn fọ́ǹtì tí ó bá jẹ́ tì ẹ nìkan ni o lè ọpulóòdù tàbí èyí tí o ní ìwé " +"àṣẹ láti lò ní pẹ́ńpọtì. Wá a sí i nínú kọ́ńtẹ́tì abala apá ọ̀tún àwọn " +"òfin pẹ́ńpọtìiṣẹ́](https://pẹ́ńpọtì.apù/àwọn òfin.html). o sì le fẹ́ kà " +"nípa[ ìwé àṣẹ- pẹ́ńpọtì](https://www.taipogíráfì.com/faq)." + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.upload-all" +msgstr "ọpulóòdù gbogbo rẹ̀" + +#, markdown +msgid "dashboard.fonts.warning-text" +msgstr "" +"a ti ṣàwárí àwọn ohun tí ó le fa wàhálà nínú àwọn fọ́ǹtì ìlànà olóòro " +"oríṣiríṣi àwọn ètò tó wà fún ìṣesí ọ̀nà ẹ̀rọ. láti ṣe àyẹ̀wò rẹ̀ o lè " +"lofont vertical metrics services like ìlànà fọ́ǹtì olóòró fún àwọn iṣẹ́ " +"ọ̀nà ẹ̀rọ bí i [èyí èkínní](https://mẹ́tíríkì ìlànà olóòró.netlify .app/). " +"Ní àfikún, a rẹkọmẹ́ǹdì lílo[tíráńsìfọtà(https://tíráńsìfọtà.org/) láti " +"pilẹ̀ṣẹ̀ àwọn wẹ́bù fọ́ǹtì láti túnṣeàsìṣe. " + +msgid "dashboard.import" +msgstr "gbé àwọn fáìlì pẹ́ńpọtì wọlé" + +msgid "dashboard.import.analyze-error" +msgstr "ooho! a kò lè gbé fáìlì yìí wọlé" + +msgid "dashboard.import.import-error" +msgstr "wàhálà wà láti gbé kan wà láti gbé fáìlì wọlé . fáìlì kò wọlé." + +msgid "dashboard.import.import-warning" +msgstr "àwọn fáìlì tí ó ní nǹkan tí kò fẹsẹ múlẹ̀ ti di yíyọ kúro." + +msgid "dashboard.import.progress.process-colors" +msgstr "síṣe ètò àwọ̀" + +msgid "dashboard.import.progress.process-components" +msgstr "síṣe ètò àwọn irin iṣẹ́" + +msgid "dashboard.import.progress.process-media" +msgstr "síṣe ètò àwọn ohun ìgbéròyìn jáde" + +msgid "dashboard.import.progress.process-page" +msgstr "síṣe ètò ojú ìwe : %s" + +msgid "dashboard.import.progress.process-typographies" +msgstr "síṣe ètò àkọsílẹ̀ ojú ìwé" + +msgid "dashboard.import.progress.upload-data" +msgstr "ọpulóòdù dátà sínú sáfà (%s/%s)" + +msgid "dashboard.import.progress.upload-media" +msgstr "ọpulóòdù fáìlì: %s" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.invite-profile" +msgstr "pe àwọn ènìyàn" + +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.leave-team" +msgstr "fẹgbẹ́ sílẹ̀" + +msgid "dashboard.libraries-and-templates" +msgstr "yàrá ìkàwé àti àwọn àwòṣe" + +msgid "dashboard.libraries-and-templates.explore" +msgstr "ṣe ìwákiri ọ̀pọ̀ wọn kí o sì mọ bí ó ṣe sojúṣe tiẹ" + +msgid "dashboard.libraries-and-templates.import-error" +msgstr "wàhálà wà fún gbígbé tẹ́ńpílétì wọlé. tẹ́ńpílétì kò wọlé." + +#: src/app/main/ui/dashboard/libraries.cljs +msgid "dashboard.libraries-title" +msgstr "yàrá ìkàwé" + +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.loading-files" +msgstr "ṣe ìkójọpọ̀ àwọn fáìlí rẹ …" + +msgid "dashboard.loading-fonts" +msgstr "ṣèkójọpọ̀ àwọ fọ́ǹtì rẹ …" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to" +msgstr "gbé lọ" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-multi" +msgstr "gbé %s àwọn fáìlì lọ" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-other-team" +msgstr "gbé lọ sí ẹgbẹ́ mìíràn" + +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/files.cljs +msgid "dashboard.new-file" +msgstr "+ fáìlì tuntun" + +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-file-prefix" +msgstr "fáìlì tuntun" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.new-project" +msgstr "+ iṣẹ́ àgbéṣe tuntun" + +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-project-prefix" +msgstr "iṣẹ́ àgbéṣe tuntun" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.no-matches-for" +msgstr "kò sí èyí tó báramu fún un“%s“" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.no-projects-placeholder" +msgstr "àwon iṣẹ́ àgbéṣe tí a kànpọ á hàn níbí" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-changed-successfully" +msgstr "a ti mú ímeèlì rẹ dójú ìwọn dáadáa" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-verified-successfully" +msgstr "a ti ṣe ìwádìí ímeèlì rẹ dáadáa" + +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.notifications.password-saved" +msgstr "a ti fi ọ̀rọ̀ ìgbaniwọlé rẹ pamọ́ dáadáa!" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.num-of-members" +msgstr "%s àwọn ọmọ ẹgbẹ́" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.open-in-new-tab" +msgstr "ṣí fáìlì sínú tábù tuntun" + +msgid "dashboard.options" +msgstr "àwọn àṣàyàn" + +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.password-change" +msgstr "yí ọ̀rọ̀ ìgbaniwọlé padà" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.pin-unpin" +msgstr "pínì/yọ pínì kúrò" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.projects-title" +msgstr "àwọn iṣẹ́ àgbéṣe" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.remove-account" +msgstr "o fẹ́ yọ àkáǹtì rẹ kúro?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.remove-shared" +msgstr "yọ ọ́ kúrò gẹ́gẹ́ bí yàrá kàwé pípín" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.save-settings" +msgstr "fi àwọn eto pamọ́" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.search-placeholder" +msgstr "ṣàwárí…" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.searching-for" +msgstr "ṣàwárí fún “%s“…" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-language" +msgstr "yan èdè ui" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-theme" +msgstr "yan àkọlé" + +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.show-all-files" +msgstr "fi gbogbo àwn fáìlì hàn" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-delete-project" +msgstr "iṣẹ́ àgbéṣe rẹ ti parẹ́ dáadáa" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-duplicate-project" +msgstr "a ti ṣe ẹ̀dà iṣẹ́ àgbéṣe rẹ dáadáa" + +#: src/app/main/ui/dashboard/grid.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-file" +msgstr "a ti gbé fáìlì rẹ kúro dáadáa" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-files" +msgstr "a ti gbé àwọn fáìlì rẹ kúrò dáadáa" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-move-project" +msgstr "a ti gbé iṣẹ́ àgbéṣe rẹ kúrò dáadáa" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-info" +msgstr "àlàyé ẹgbẹ́" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-members" +msgstr "àwọn ọmọ ẹgbẹ́" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-projects" +msgstr "iṣẹ́ àgbéṣe ọmọ ẹgbẹ́" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.theme-change" +msgstr "àkọlé ui" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.title-search" +msgstr "ṣàwárí àwọn èsì" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.type-something" +msgstr "tẹ̀ láti rí àwọn èsì" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.unpublish-shared" +msgstr "yàrá ìkàwé tí a kòtí ì gbé jáde" + +#: src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs +msgid "dashboard.update-settings" +msgstr "mú àwọn ètò dójú ìwọ̀n" + +msgid "dashboard.webhooks.active" +msgstr "ti ń siṣẹ́" + +msgid "dashboard.webhooks.active.explain" +msgstr "When this hook is triggered event details will be delivered" + +msgid "dashboard.webhooks.content-type" +msgstr "ẹ̀yà kọ́ńtẹ́ǹtì" + +msgid "dashboard.webhooks.create" +msgstr "ṣẹ̀dá ìkọ́-wẹ́bù" + +msgid "dashboard.webhooks.create.success" +msgstr "a ti ṣẹ̀dá ìkọ́-wẹ́bù dáadáa ." + +msgid "dashboard.webhooks.description" +msgstr "" +"àwọn ìkọ́-wẹ́bù jẹ́ ọ̀nà tó rọrùn láti fi ààyè sílẹ̀ fún àwọn ààyè " +"ayélujára mìíràn àti awọn ápù ṣe filọ́ tí àwọn ìṣẹ̀lẹ̀ kan bá ní " +"pẹ́ńpọtì’’ a ó fi ìbéèrè ráńṣẹ́ sí ọ̀kọ̀kan wọn tí urls tó o pèsè." + +msgid "dashboard.webhooks.empty.add-one" +msgstr "tẹ bọ́tínnì \"fikún ìkọ́- wẹ́bù\" láti fì kan sí i." + +msgid "dashboard.webhooks.empty.no-webhooks" +msgstr "kò sí ìkọ́-wẹ́bù tí a ṣẹ̀da´dì sisìnyí." + +#: src/app/main/ui/settings.cljs +msgid "dashboard.your-account-title" +msgstr "àkáǹtì rẹ" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-email" +msgstr "ímeèlì" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-name" +msgstr "ímeèlì rẹ" + +#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.your-penpot" +msgstr "pẹ́ńpọtì rẹ" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-ok" +msgstr "ó dára" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-title" +msgstr "àkíyèsí" + +#: src/app/main/ui/confirm.cljs +msgid "ds.component-subtitle" +msgstr "ní láti ṣe ìmúdójú ìwọ̀n àwọn irin iṣẹ́:" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-cancel" +msgstr "fagilé e" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-ok" +msgstr "ó dára" + +#: src/app/main/ui/auth/login.cljs +msgid "errors.auth-provider-not-configured" +msgstr "a kò tí ì fàṣẹ si àtúntò olùpèṣè." + +msgid "errors.auth.unable-to-login" +msgstr "ó dàbí pé o kò tí ì fàṣẹ sí i tàbí àkókò ti kọjá ." + +msgid "errors.bad-font" +msgstr "fọ́ǹtì %s kò ṣe kójọpọ̀" + +msgid "errors.bad-font-plural" +msgstr "àwọn fọ́ǹtì %s kò ṣe kójọpọ̀" + +msgid "errors.cannot-upload" +msgstr "kò le ọpulóòdù fáìlì ìgbéròyìn-jáde." + +#: src/app/main/data/workspace.cljs +msgid "errors.clipboard-not-implemented" +msgstr "a ṣàwákiri rẹ kò le ṣe iṣẹ́ yìí" + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs +msgid "errors.email-already-exists" +msgstr "ímeèlì yìí ti jẹ́ lílò tẹ́lẹ" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.email-already-validated" +msgstr "a ti fọwọ́ sí ímeèlì rẹ tẹ́lẹ̀." + +msgid "errors.email-as-password" +msgstr "o kò le lo ímeèlì rẹ gẹ́gẹ́ bí ọ̀rọ̀ ìgbaniwọlé" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.email-has-permanent-bounces" +msgstr "Ímeèlì «%s» ti ní ìjábọ̀ ọ̀pọ̀ọlọpọ̀ ìta-bọn-ọ̀n ti pẹ́." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs +msgid "errors.email-invalid" +msgstr "Tẹ àti wọlé pẹ̀lú ímeèlì tó wúlo jọ̀wọ́" + +#: src/app/main/ui/settings/change_email.cljs +msgid "errors.email-invalid-confirmation" +msgstr "Ímeèlì tí a ti mọ̀dájú gbọ́dọ̀ báramu" + +msgid "errors.email-spam-or-permanent-bounces" +msgstr "Ímeèlì ti «%s» ń jábọ̀ gẹ́gẹ́ bí i awúrúju tàbí ìta-bọ̀n-ọnọǹ tipẹ́." + +#: src/app/main/errors.cljs +msgid "errors.feature-not-supported" +msgstr "Àwọn ẹ̀yà ara ẹ̀rọ '%s' kò ní àtìlẹ́yìn." + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.generic" +msgstr "Àsìṣe kan ti ṣẹlẹ̀." + +#: src/app/main/ui/components/color_input.cljs +msgid "errors.invalid-color" +msgstr "àwọ̀ tó ti díbàjẹ́" + +msgid "errors.invite-invalid.info" +msgstr "Èyí tí a pè le parẹ́ tàbí ki àkókò lekọjá ." + +#: src/app/main/ui/auth/login.cljs +msgid "errors.ldap-disabled" +msgstr "Ìfàṣẹsí LDAP kò ṣe é ṣe ." + +#: src/app/main/errors.cljs +msgid "errors.max-quote-reached" +msgstr "O ti débi '%s' ìfàmìsí. Késí i pẹ̀lú àtìlẹ́yìn ." + +#: src/app/main/data/workspace/persistence.cljs +msgid "errors.media-too-large" +msgstr "Àwòrán tóbi púpọ ju ohun tí a le fisí lọ." + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "errors.media-type-not-allowed" +msgstr "Ó dàbí pé èyí kì í ṣe àwòrán tó fẹsẹ́ múlẹ̀." + +#: src/app/main/ui/dashboard/team.cljs +msgid "errors.member-is-muted" +msgstr "" +"Pírófáìlì ímeèlì tí ò ǹ pè ti dákẹ (ti jábọ̀ àwúrúju tàbí ìtabọ̀n-ọ̀n tó " +"ga)." + +#: src/app/main/ui/settings/password.cljs +msgid "errors.password-invalid-confirmation" +msgstr "Ijẹ́rìísí ọ̀rọ̀ ìgbaniwọlé rẹ gbọ́dọ̀ báramu" + +#: src/app/main/ui/settings/password.cljs +msgid "errors.password-too-short" +msgstr "Ọ̀rọ̀ ìgbaniwọlé kò gbọdọ̀ dín ní lẹ́tà mẹ́jọ" + +msgid "errors.profile-blocked" +msgstr "Ti dínà mọ́ pírófáìlì" + +#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.profile-is-muted" +msgstr "Ímeèlì pírófáìlì rẹ ti ní ìdákẹ́ (ìjábọ̀ àwúrúju tàbí ìtabọ̀n-ọ̀n tó ga)." + +#: src/app/main/ui/auth/register.cljs +msgid "errors.registration-disabled" +msgstr "Ìforúkọ-sílẹ̀ kò ṣe é ṣe lọ́wọ́lọ́wọ́." + +msgid "errors.team-leave.insufficient-members" +msgstr "kí àwọn ọmọ ẹgbẹ́ tí kò péye fi ẹgbẹ́ sílẹ̀, àbí bóyá o fẹ́ paárẹ́ ni ." + +msgid "errors.team-leave.member-does-not-exists" +msgstr "Kòsí ọmọ ẹgbẹ́ tí o fẹ́ yàn ." + +msgid "errors.team-leave.owner-cant-leave" +msgstr "Oní nǹkan kò le fi ẹgbẹ́ sílẹ̀ , o gbọ́dọ̀ tún ṣe àtúnyàn iṣẹ́ oní nǹkan." + +#: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "errors.unexpected-error" +msgstr "Àsìṣe tí a kòrò tẹ́lẹ̀ ti ṣẹlẹ." + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.unexpected-token" +msgstr "Tókìnnì àìmọ̀" + +msgid "errors.webhooks.connection" +msgstr "Àsìṣe nínú ètò ìsopọ̀, kò lè dé ibi URL" + +msgid "errors.webhooks.invalid-uri" +msgstr "URL kò páásì ìfọwọ́sí." + +msgid "errors.webhooks.last-delivery" +msgstr "Èyí tí a fijíṣẹ́ kẹ́yìn kò dára." + +msgid "errors.webhooks.ssl-validation" +msgstr "Àsìṣe nínú ìfẹwọ́sí SSL ." + +msgid "errors.webhooks.timeout" +msgstr "Àkókò ti lọ" + +msgid "errors.webhooks.unexpected" +msgstr "Unexpected error on validating àsìṣe àìròtẹ́lẹ̀ lórí ìfọwọ́sí" + +msgid "errors.webhooks.unexpected-status" +msgstr "Ipò àìròtẹ́lẹ̀ %s" + +#: src/app/main/ui/auth/login.cljs +msgid "errors.wrong-credentials" +msgstr "Ímeèlì tàbí ọ̀rọ̀ ìgbaniwọlé kò tọ̀nà." + +#: src/app/main/ui/settings/password.cljs +msgid "errors.wrong-old-password" +msgstr "Ọ̀rọ̀ ìgbaniwọlé ti àtijọ́ kò tọ̀nà" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.description" +msgstr "Àpèjúwe" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-go-to" +msgstr "Lọ ibi àpérò pẹ́ńpọtì" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-subtitle1" +msgstr "" +"Inú wa dùn láti rí ẹ níbí. Tí o bá nílò ìrànlọ́wọ, please search before " +"you jọ̀wọ́ ṣàwárí kí o tó firáńṣẹ́." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-title" +msgstr "Agbègbè pẹ́ńpọtì" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subject" +msgstr "Kókó-ọ̀rọ̀" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subtitle" +msgstr "" +"Jọ̀wọ́ ṣàpèjúwe ìdí tó wà fún ímeèlì rẹ, ṣàfihàn tì àríyànjiyàn bá wà, le " +"jẹ́ èrò tàbí síṣe iyèméjì. Ìkan lára àwọn ọmọ ẹgbẹ́ wa yóò dáhùn láìpẹ́ " +"láìjìnnà." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.title" +msgstr "Ímeèlì" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-go-to" +msgstr "Lọ sí Tíwítà" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-subtitle1" +msgstr "A wà níbí láti ṣe ìrànlọ́wọ́ fún àwọn ìbéèrè tó bá wà lórí iṣẹ́ ọnà." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-title" +msgstr "Àkáùnti àtìlẹ́yìn fún Tíwítà" + +#: src/app/main/ui/settings/password.cljs +msgid "generic.error" +msgstr "Àsìṣe kan ti ṣẹlẹ̀" + +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur" +msgstr "ìkùku ti wà" + +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur.value" +msgstr "bó se péye" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hex" +msgstr "dínà mọ́" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hsla" +msgstr "Ti dínà mọ" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.rgba" +msgstr "RGBA" + +#: src/app/main/ui/inspect/attributes/fill.cljs +msgid "inspect.attributes.fill" +msgstr "Fílì" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.download" +msgstr "Danlóòdù orísun àwòrán" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.height" +msgstr "Gíga" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.width" +msgstr "Fífẹ" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout" +msgstr "Layout" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.height" +msgstr "Gíga" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.left" +msgstr "Òsì" + +#: src/app/main/ui/inspect/attributes/layout.cljs, src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.radius" +msgstr "Rédíọ́sì" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.rotation" +msgstr "Yíyí" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.top" +msgstr "Òkè" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.width" +msgstr "Fífẹ̀" + +#: src/app/main/ui/inspect/attributes/shadow.cljs +msgid "inspect.attributes.shadow" +msgstr "Ibòòji" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.size" +msgstr "Ìwọ̀n àti ipò" + +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke" +msgstr "Stroke Sítírókì" + +#, permanent +msgid "inspect.attributes.stroke.alignment.center" +msgstr "Ààrin" + +#, permanent +msgid "inspect.attributes.stroke.alignment.inner" +msgstr "Nínú" + +#, permanent +msgid "inspect.attributes.stroke.alignment.outer" +msgstr "Ìtá" + +msgid "inspect.attributes.stroke.style.dotted" +msgstr "ti sàmì" + +msgid "inspect.attributes.stroke.style.mixed" +msgstr "Àdàlú" + +msgid "inspect.attributes.stroke.style.none" +msgstr "Kò sí" + +msgid "inspect.attributes.stroke.style.solid" +msgstr "Lágbára" + +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke.width" +msgstr "Fífẹ̀" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography" +msgstr "Taipogíráfì" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-family" +msgstr "Ẹbí Fọ́ǹtì" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-size" +msgstr "Ìwọ̀n Fọ́ǹtì" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-style" +msgstr "Àrà Fọ́ǹtì" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-weight" +msgstr "Ìwúwo Fọ́ǹtì" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.letter-spacing" +msgstr "Ìfàyè sí ààrin Lẹ́tà" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.line-height" +msgstr "Gíga Ìlà" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-decoration" +msgstr "Síṣe ọ̀rọ̀ lọ́ṣọ̀ọ́" + +msgid "inspect.attributes.typography.text-decoration.none" +msgstr "Kò sí" + +msgid "inspect.attributes.typography.text-decoration.strikethrough" +msgstr "Strikethrough" + +msgid "inspect.attributes.typography.text-decoration.underline" +msgstr "Fàlà sí" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-transform" +msgstr "ọ̀rọ̀ ti yí padà" + +msgid "inspect.attributes.typography.text-transform.lowercase" +msgstr "Lẹ́tà Kékeré" + +msgid "inspect.attributes.typography.text-transform.none" +msgstr "Kò sí" + +msgid "inspect.attributes.typography.text-transform.titlecase" +msgstr "Àkọlé Lẹ́tà" + +msgid "inspect.attributes.typography.text-transform.uppercase" +msgstr "Lẹ́tà ńlá" + +msgid "inspect.empty.help" +msgstr "" +"Tí o bá fẹ́ mọ̀ nípa àpẹẹrẹ alárà bẹ ààrin gbùngbùn àwọn pẹ́ńpọtì wò fún " +"ìràlọ́wọ́" + +msgid "inspect.empty.more-info" +msgstr "Àfikún àlàyé fún ìbẹ̀wò" + +msgid "inspect.empty.select" +msgstr "Yan ìrísí, bọ́ọ̀dù tàbí ẹgbẹ́ láti lọ ṣe ìbẹ̀wò ohun ìní wọn àti kóòdù" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code" +msgstr "Kóòdù" + +msgid "inspect.tabs.code.selected.circle" +msgstr "Àyíká" + +msgid "inspect.tabs.code.selected.component" +msgstr "Ẹ̀yà" + +msgid "inspect.tabs.code.selected.curve" +msgstr "Igun" + +msgid "inspect.tabs.code.selected.frame" +msgstr "Bọ́ọ̀dù" + +msgid "inspect.tabs.code.selected.group" +msgstr "Ẹgbẹ́" + +msgid "inspect.tabs.code.selected.image" +msgstr "Àwòrán" + +msgid "inspect.tabs.code.selected.mask" +msgstr "Ìbòjú" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code.selected.multiple" +msgstr "%s Ti yàn" + +msgid "inspect.tabs.code.selected.path" +msgstr "Ipa-ọ̀nà" + +msgid "inspect.tabs.code.selected.rect" +msgstr "Rectangle" + +msgid "inspect.tabs.code.selected.svg-raw" +msgstr "SVG" + +msgid "inspect.tabs.code.selected.text" +msgstr "Ọ̀rọ̀" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.info" +msgstr "Àlàyé" + +#: src/app/main/ui/workspace/header.cljs +msgid "label.shortcuts" +msgstr "Ọ̀nà àbùjá" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "Ṣàyẹ̀wò tókín-nì" + +msgid "labels.active" +msgstr "Ń siṣẹ́" + +msgid "labels.add-custom-font" +msgstr "Ṣàfikún àṣà Fọ́ǹtì" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.admin" +msgstr "Alábòjútó" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.all" +msgstr "Gbogbo ẹ̀" + +msgid "labels.and" +msgstr "àti" + +msgid "labels.back" +msgstr "Padá" + +#: src/app/main/ui/static.cljs +msgid "labels.bad-gateway.desc-message" +msgstr "" +"Ó dàbí ẹnipé o ní láti dúró díẹ̀ kí o tún gbìyàjú ; à ń siṣẹ́ díẹ̀ síṣe " +"ìtọ́jú sáfà wa." + +#: src/app/main/ui/static.cljs +msgid "labels.bad-gateway.main-message" +msgstr "Ọ̀nà-àbáwọle búburú" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.cancel" +msgstr "Párẹ́" + +msgid "labels.close" +msgstr "Tì í" + +#: src/app/main/ui/dashboard/comments.cljs +msgid "labels.comments" +msgstr "dásí i" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.community" +msgstr "Agbègbè" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.confirm-password" +msgstr "Jẹ́rìísí" + +msgid "labels.continue" +msgstr "Tẹ̀ síwájú" + +msgid "labels.continue-with" +msgstr "Tẹ̀ síwájú pẹ̀lú" + +msgid "labels.continue-with-penpot" +msgstr "O lè tẹ̀ síwájú pẹ̀lú àkáúnti pẹ́ńpọtì" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.copy-invitation-link" +msgstr "ṣà dàkọ ọ̀nà àsopọ̀" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "labels.create" +msgstr "Ṣẹ̀dá" + +#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team" +msgstr "Ṣẹ̀dá ẹgbẹ́ tuntun" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team.placeholder" +msgstr "Fi orúkọ ẹgbẹ́ tuntun wọlé" + +msgid "labels.custom-fonts" +msgstr "Kọ́sítọ́mù àwọn fọ́ǹtì" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.dashboard" +msgstr "Dáṣìbọọ̀dù" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete" +msgstr "Paárẹ́" + +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment" +msgstr "Pa kọ́mẹ́ǹtì rẹ́" + +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment-thread" +msgstr "Pa gbogbo kọ́mẹ́ǹtì rẹ́" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.delete-invitation" +msgstr "Pa ìfìwépè rẹ́" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete-multi-files" +msgstr "Pa gbogbo %s fáìlì rẹ́" + +msgid "labels.discard" +msgstr "Yọ́ kúrò" + +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.drafts" +msgstr "Kọ ọ́ sílẹ̀" + +#: src/app/main/ui/comments.cljs +msgid "labels.edit" +msgstr "sàtúnkà" + +msgid "labels.edit-file" +msgstr "sàtúnkà fáìlì" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.editor" +msgstr "Olóòtú" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.expired-invitation" +msgstr "Kọjá àkókò" + +msgid "labels.export" +msgstr "Fi ránṣẹ́" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-disabled" +msgstr "Èsì kò siṣẹ́" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-sent" +msgstr "Èsì ti lọ" + +msgid "labels.font-family" +msgstr "Ẹbí fọ́ǹtì" + +msgid "labels.font-providers" +msgstr "Àwọn Olùpèṣè fọ́ǹtì" + +msgid "labels.font-variants" +msgstr "Àrà" + +msgid "labels.fonts" +msgstr "Fọ̀ǹtì" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.github-repo" +msgstr "Báǹkì gítì-ọbù" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.give-feedback" +msgstr "Fèsì padà" + +msgid "labels.go-back" +msgstr "Padà sẹ́yìn" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.help-center" +msgstr "Ibi ìranilọ́wọ́" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.hide-resolved-comments" +msgstr "Fi àwọn ọ̀rọ̀ tí a ti yanjú pamọ́" + +msgid "labels.inactive" +msgstr "kò ja fáfá" + +msgid "labels.installed-fonts" +msgstr "Fi àwọn fọ́ǹtì sí orí ẹ̀rọ" + +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.desc-message" +msgstr "" +"Nǹkan bíburú ti ṣẹlè. Jọ̀wọ́ ṣe àtúnṣe iṣẹ́ náà àti pé tí wàhálà bá sì " +"tẹ̀ síwájú, ké sí olùbásọ̀rọ̀." + +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.main-message" +msgstr "Àsìṣe ti abẹ́nú" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.invitations" +msgstr "Ìfiwépè" + +#: src/app/main/ui/settings/options.cljs +msgid "labels.language" +msgstr "Èdè" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.libraries-and-templates" +msgstr "Àwọn yàrá ìkàwé & Tẹ́ńpílétì" + +msgid "labels.log-or-sign" +msgstr "ṣí kí o wọle tàbí kí o ṣàmì wọlé" + +#: src/app/main/ui/settings.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.logout" +msgstr "Padé kí ojáde" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.member" +msgstr "Ẹgbẹ" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.members" +msgstr "Àwọn ọmọ Ẹgbẹ́" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.new-password" +msgstr "Ọ̀rọ̀ Ìgbaniwọlé tuntun" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs +msgid "labels.no-comments-available" +msgstr "A ti gbé gbogbo yín dè! Àwọn ọ̀rọ̀ ìfitónilétí tuntun yí ó hàn níbí." + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.no-invitations" +msgstr "kò si àwọn ìfìwépè kankan nílẹ̀." + +#: src/app/main/ui/dashboard/team.cljs +#, markdown +msgid "labels.no-invitations-hint" +msgstr "Tẹ̀ ẹ́ **Pe àwọn ènìyàn** tẹ bọ́tìnnì láti pe àwọn ènìyàn sínú ẹgbẹ́." + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.desc-message" +msgstr "Ojú ìwé yìí le má sìí tàbí ò kò ni ìgbaniláàyè láti wọlé sí bẹ̀ ." + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.main-message" +msgstr "Óóho!" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.old-password" +msgstr "Ọ̀rọ̀ ìgbaniwọlé àtijọ́" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.only-yours" +msgstr "Tìrẹ nìkan" + +msgid "labels.or" +msgstr "tàbí" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.owner" +msgstr "Oníǹkan" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.password" +msgstr "Ọ̀rọ̀ ìgbaniwọlé" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.pending-invitation" +msgstr "Ńńdúró" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.profile" +msgstr "Pírófáìlì" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.projects" +msgstr "Àwọn iṣẹ́ àgbéṣe" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.release-notes" +msgstr "Fi àkọsílẹ̀ rẹ sílẹ̀" + +#: src/app/main/ui/workspace.cljs +msgid "labels.reload-file" +msgstr "Tún gbé fáìlì sí i" + +#: src/app/main/ui/workspace/libraries.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.remove" +msgstr "Yọ ọ́ kúrò" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.remove-member" +msgstr "Yọ ọmọ ẹgbẹ́ kúrò" + +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.rename" +msgstr "Fún un lórúkọ mìíràn" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.rename-team" +msgstr "Fún ẹgbẹ́ lórúkọ mìíràn" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.resend-invitation" +msgstr "Tún fì ìwé ìpè ránńṣẹ́" + +#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs +msgid "labels.retry" +msgstr "Tún gbìyànjú" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.role" +msgstr "Ojúṣe" + +msgid "labels.save" +msgstr "Fi pamọ́" + +msgid "labels.search-font" +msgstr "Ṣàwárí fọ́ǹtì" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.send" +msgstr "Fi ránńṣẹ́" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.sending" +msgstr "Fífi-ránńṣẹ…" + +#: src/app/main/ui/static.cljs +msgid "labels.service-unavailable.desc-message" +msgstr "A wà níbi ètò ìpèsè ìtọ́jú àwọn sísítẹ́mù wa." + +#: src/app/main/ui/static.cljs +msgid "labels.service-unavailable.main-message" +msgstr "Sáfísì kòsí" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.settings" +msgstr "Àwọn ètò" + +msgid "labels.share-prototype" +msgstr "Pín àwọn ohun tí a ti kọ tẹ́lẹ̀" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.shared-libraries" +msgstr "Yàrá ìkáwe" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-all-comments" +msgstr "Fi gbogbo kọ́mẹ́ǹtì hàn" + +msgid "labels.show-comments-list" +msgstr "Fi àkójọ àwọn kọ́mẹ́ǹtì hàn" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-your-comments" +msgstr "Fi àwọn kọ́mẹ́ǹtì tìrẹ nìkan hàn" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.status" +msgstr "Ipò" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.tutorials" +msgstr "Ìbáṣepọ̀" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.unpublish-multi-files" +msgstr "%s àwọn fáìlì tí a kò tí kọ jáde" + +#: src/app/main/ui/settings/profile.cljs +msgid "labels.update" +msgstr "mú dójú ìwọ̀n" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.update-team" +msgstr "Mẹ́gbẹ́ dójú ìwọ̀n" + +msgid "labels.upload" +msgstr "Ọpulóòdù" + +msgid "labels.upload-custom-fonts" +msgstr "Ọpulóòdù kọ́sítẹ́mù fọ́ǹtì" + +msgid "labels.uploading" +msgstr "Ń ọpulóòdù…" + +msgid "labels.view-only" +msgstr "Wò ó nìkan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.viewer" +msgstr "Olùwo" + +msgid "labels.webhooks" +msgstr "àwọn ìwé ìkọ́ wẹ́bù" + +#: src/app/main/ui/comments.cljs +msgid "labels.write-new-comment" +msgstr "Write new comment Kọ kọ́mẹ́ǹtì tuntun" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.you" +msgstr "(ìwọ)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.your-account" +msgstr "Àkáùntì rẹ" + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "media.loading" +msgstr "Ìkójọpọ̀ àwòrán…" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Yàrá ìkàwé rẹ ti dófìfo. Lọ́gán tí o bá ti ṣàfikún gẹ́gẹ́ bí yàrá ìkàwé " +"pípín, dúkìá tí o ṣẹ̀dá á wà fún lílò àwọn fáìlì rẹ tó kù. Are you sure " +"you tí o fẹ́ kọ jáde?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.accept" +msgstr "Ṣàfikún gẹ́gẹ́ bí yàrá ìkàwé pípín" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.hint" +msgstr "" +"Lẹ́ẹ̀kan-nà tí o bá ti ṣàfikún gẹ́gẹ́ bí yàrá ìkàwé pípín, àwọn dúkìá inú " +"fáìlì yàrá á di wíwà fún lílò àwọn fáìlì rẹ tó kù." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.message" +msgstr "Ṣàfikún “%s” gẹ́gẹ́ bí yàrá ìkàwé pípí" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.big-nudge" +msgstr "Big nudge Nọ́ọ̀jì ńlá" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.confirm-email" +msgstr "Ṣàyẹ̀wò ímeèlì tuntun" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.info" +msgstr "" +"A fi ímeèlì kan ránń ṣẹ́ sí inú ímeèlì tí ò ń lò lọ́wọ́lọ́wọ́“%s” láti ṣe " +"àyẹ̀wò ìdánimọ̀ rẹ." + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.new-email" +msgstr "Ímeèlì tuntun" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.submit" +msgstr "Pàrọ̀ ímeèlìl" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.title" +msgstr "Pàrọ̀ ímeèlì rẹ" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.copy-token" +msgstr "Ṣẹ̀dà tókìn" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.expiration-date.label" +msgstr "Ọjọ́ ìparí" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "Orúkọ" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.placeholder" +msgstr "Orúkọ yí ó ràn wá lọ́wọ́ láti mọ ohun tí tókìn wà fún" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "Ṣẹ̀dà tókìn" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "Pilẹ̀ṣẹ̀ wí wọlé tókìń" + +msgid "modals.create-webhook.submit-label" +msgstr "Ṣẹ̀dá ìkọ́- wẹ́bù" + +msgid "modals.create-webhook.title" +msgstr "Ṣẹ̀dá ìkọ́-wẹ́bù" + +msgid "modals.create-webhook.url.label" +msgstr "Péloòdù URL" + +msgid "modals.create-webhook.url.placeholder" +msgstr "https://àpẹrẹ.com/postreceive ìgbà àtẹ̀yinwá" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "Pa tókìn rẹ́" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa tókìn yi rẹ́?" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "Pa tókìn rẹ́" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.cancel" +msgstr "Fagilé e kí o sì fi àkáùntì mi pamọ́" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.confirm" +msgstr "Bẹ́ẹ̀ni, pa àkáùntì mi rẹ́" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.info" +msgstr "" +"Nípa yíyọ àkáùntì rẹ kúrò o ’ pàdánù gbogbo àwọn iṣẹ́ àgbéṣe rẹ àti àwọn tí " +"ó wà lápamọ́." + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.title" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa àkáùntì rẹ rẹ́ ?" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.accept" +msgstr "Pa ìtàkurọ̀sọ rẹ́" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.message" +msgstr "" +"Ṣé ódá ọ lójú pé o fẹ́ pa ìtàkurọ̀sọ yìí rẹ́? All comments in this Gbogbo " +"àsọyé tó wà níbí tó tẹ̀lé ra wọn ni á di píparẹ́." + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.title" +msgstr "Pa ìtàkurọ̀sọ rẹ" + +msgid "modals.delete-component-annotation.message" +msgstr "Ṣe ó dá ọ lójú pé o fẹ́ pa àkọsílẹ̀ yìí rẹ́?" + +msgid "modals.delete-component-annotation.title" +msgstr "Pa àkọsílẹ̀ rẹ́" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.accept" +msgstr "Pa fáìlì rẹ́" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa fáìlì yìí rẹ́?" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.title" +msgstr "Pa fáìlì rẹ́" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.accept" +msgstr "Pa àwọn fáìlì rẹ́" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa %s àwọn fáìlì rẹ́ ?" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.title" +msgstr "Pa fáìlì rẹ́ %s" + +msgid "modals.delete-font-variant.message" +msgstr "" +"Ṣé ó dá ọ lójú pé o fẹ́ pa fọ́ǹtì alárà yìí rẹ́ ? Kò ní gbé e tí a bá lò " +"ó nínú fáìlì." + +msgid "modals.delete-font.message" +msgstr "" +"Ṣé ó dá ọ lójú pé o fẹ́ pa fẹ́ǹtì yí rẹ́? Kò ní le gbé e tí a bá lò ó nínú " +"Fáìlì." + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.body" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa ojú ìwé yìí rẹ́?" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.title" +msgstr "Pa ojú ìwé rẹ́" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.accept" +msgstr "Pa iṣẹ́ àgbéṣe rẹ́" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa iṣẹ́ àgbéṣe yìí rẹ́?" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.title" +msgstr "Pa iṣẹ́ àgbéṣe rẹ́" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.accept" +msgstr "Pa ẹgbẹ́ rẹ́" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.message" +msgstr "" +"Ṣé ó dá ọ lójú pé o fẹ́ pa ẹgbẹ́ yìí rẹ́? Ggogbo iṣẹ́ àgbéṣe àti fáìlì tí ó " +"bá ní nǹkan ṣe pẹ̀lú ẹgbẹ́ ni a ó parẹ́ pátápátá." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.title" +msgstr "Yọ ẹgbẹ́ kúrò" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.accept" +msgstr "Yọ ọmọ ẹgbẹ́ kúrò" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ yọ ọmọ ẹgbẹ́ yìí kúrò nínú ẹgbẹ́?" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.title" +msgstr "Yọ ọmọ ẹgbẹ́ kúrò" + +msgid "modals.delete-webhook.accept" +msgstr "Pa ìkọ́-wẹ́bù rẹ́" + +msgid "modals.delete-webhook.message" +msgstr "Ṣe ó dá ọ lójú pé o fẹ́ pa ìkọ́-wẹ́bù yìí rẹ́?" + +msgid "modals.delete-webhook.title" +msgstr "Pa ìkọ́- wẹ́bù rẹ́" + +msgid "modals.edit-webhook.submit-label" +msgstr "Ṣe àtúnṣe ìkọ́- wẹ́bù" + +msgid "modals.edit-webhook.title" +msgstr "Ṣe àtúnṣe ìkọ́-wẹ́bù" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-member-confirm.accept" +msgstr "Fi ìfìwépè ránńṣẹ́" + +msgid "modals.invite-member.emails" +msgstr "Ímeèlì, kí kọmá yà á sọ́tọ̀" + +msgid "modals.invite-member.repeated-invitation" +msgstr "" +"Díẹ̀ nínú àwọn ímeèlì wá láti ọ̀dọ̀ àwọn tó jẹ́ ọmọ ẹgbẹ́ ní ìsinsìnyí. Ìwé " +"ìfipé wọn a kò nífi ránńṣẹ́." + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-team-member.title" +msgstr "Pe àwọn ọmọ ẹgbẹ́ sínú ẹgbẹ́" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.hint" +msgstr "" +"Gẹ́gẹ́ bí o ṣe jẹ́ ìwọ nìkan ni ọmọ ẹgbẹ́ nínú ẹgbẹ́ yìí, a ó yọ ẹgbẹ́ " +"kúrò pẹ̀lú iṣẹ́ àgbéṣe rẹ̀ àti àwọn fáìlì." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ kúrò nínú %s ẹgbẹ́?" + +msgid "modals.leave-and-reassign.forbidden" +msgstr "" +"O kò lè kúrò nínú ẹgbẹ́ tí kò bá sí ọmọ ẹgbẹ́ mìíràn tó ní ìgbéga sí oní " +"ǹǹkan. O lè fẹ́ pa ẹgbẹ́ rẹ́." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.hint1" +msgstr "" +"Ìwọ ni ẹni tí ó ni ẹgbẹ́ yìí. Please select another member to promote to " +"Jọ̀wọ́ yan ọmọ ẹgbẹ́ mìíràn tí yíò ní ìgbéga ẹni tí ó ni nǹkan kí o tó " +"kúrò." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.promote-and-leave" +msgstr "Ṣe ìgbéga kí o kúrò" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.select-member-to-promote" +msgstr "Yan ọmọ ẹgbẹ́ kan tí o ó gbéga" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.title" +msgstr "Kí o tó kúrò" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.accept" +msgstr "Fi ẹgbẹ́ sílẹ̀" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ fi ẹgbẹ́ yìí sílẹ̀?" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.title" +msgstr "Ń fi ẹgbẹ́ sílẹ̀" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.nudge-title" +msgstr "Fi kún iye tó jẹ́" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.accept" +msgstr "Gbé ẹni tó ni nǹkan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.hint" +msgstr "" +"Tí o bá gbé ẹni tí ó ni nǹkan, o ó yìí ojúṣe rẹ pada sí Alábòjútó, losing " +" àwọn ìgbà láàyè díẹ̀ á wà fún ẹgbẹ́ yìí. " + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.message" +msgstr "" +"Ìwọ ni ẹni tí ó ni ẹgbẹ́ yìí lọ́wọ́lọ́wọ́. Are you sure you want to make Ṣé " +"ó dá ọ lójú pé o fẹ́ jẹ́ %s oní nǹkan tuntun fún ẹgbẹ́?" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.title" +msgstr "Ẹni tó ni ẹgbẹ́ tuntun" + +msgid "modals.publish-empty-library.accept" +msgstr "Kọ ọ́ jáde" + +msgid "modals.publish-empty-library.message" +msgstr "Yàrá ìkàwé rẹ ṣófìfo. Ṣé ó dá ọ lójú pé o fẹ́ kọ ọ́ jáde?" + +msgid "modals.publish-empty-library.title" +msgstr "Gbé yàrá ìkàwé tó ṣófìfo jáde" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.accept" +msgstr "Yọ ọ́ kúrò gẹ́gẹ́ bí i yàrá ìkàwé pípín" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.hint" +msgstr "" +"Lọ́gán tí o bá ti yọ ọ́ kúrò gẹ́gẹ́ bí i Fáìlì yàrá ìkàwé pípín , Fáìlì " +"yàrà ìkàwé ti fáìlì yìí á dúró tí á wà fún lílò àwọn fáìlì rẹ tó kù." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.message" +msgstr "Yọ ọ́ kúrò“%s” gẹ́gẹ́ bí yàrá ìkàwé pípín" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.small-nudge" +msgstr "Fọwọ́ làn-ań díẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.hint" +msgstr "" +"O ṣetán láti mú àwọn ẹ̀yà irin iṣẹ́ dé ojú ìwọ̀n ní yàrá ìkàwé pípín. Èyí " +"le fa wàhálà fún àwọn fáìlì mìíràn tí ó ń lò ó." + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.message" +msgstr "Mú àwọn ẹ̀yà irin iṣẹ́ dójú ìwọ̀n nínú iyàram ìkàwé pípín" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.accept" +msgstr "Mú dójú ìwọ̀n" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.cancel" +msgstr "Fagilé e" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.hint" +msgstr "" +"O ṣetán látí mú àwọn ẹ̀yà irin iṣẹ́ yàrá ìkàwé dójú ìwọ̀n . This may affect " +"Èyí lè fa wàhálà fún àwọn fáìlì míràn tí ó ń lò ó." + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.message" +msgstr "Mú ẹ̀yà iyàrá ìkàwé pípín kan dójú ìwọ̀n" + +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "Ẹ̀yà tuntun ti wà, jọ̀wọ́ tún sọ ọ́ jí" + +#: src/app/main/ui/dashboard/team.cljs +msgid "notifications.invitation-email-sent" +msgstr "Ìfipè tí a fi ránńṣẹ́ ti lọ dáadáa" + +#: src/app/main/ui/dashboard/team.cljs +msgid "notifications.invitation-link-copied" +msgstr "ti ṣe àdàkọ ìfipè ọ̀nà ìtọ́ka sí" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "notifications.profile-deletion-not-allowed" +msgstr "O kò le è yọ pírófáìlì rẹ kúro. Ṣe àtún yàn àwọn ẹgbẹ́ kí o tó tẹ̀ síwájú." + +#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs +msgid "notifications.profile-saved" +msgstr "A ti fi pírófáìlì pamọ́ dáadáa!" + +#: src/app/main/ui/settings/change_email.cljs +msgid "notifications.validation-email-sent" +msgstr "Verification email sent to %s. Check your email!" + +msgid "onboarding-v2.before-start.desc1" +msgstr "" +"O ní láti mọ̀ pé oríṣiríṣi ohu ohun èlò ló wà láti ràn ọ́ lọ́wọ́ láti rí " +"gbà bẹ̀rẹ̀ pẹ̀lú Pẹ́ńpọtì, gẹ́gẹ́ bí ohun èlò ìtọ́nisọ́nà àti yútuùbù wa " +"fún ìlànà ìbáni sọ̀rọ̀." + +msgid "onboarding-v2.before-start.desc2" +msgstr "" +"Ẹ̀kún-uń rẹ́rẹ́ àlàyé nípa bí a ó ṣe lo pẹ́ńpọtì . Láti bi àfọwọ́kọ lọ sí " +"síṣe ètò tàbí pípiń àwọn àrà orísi ." + +msgid "onboarding-v2.before-start.desc2.title" +msgstr "Ìtọ́ni sọ́nà Onílò" + +msgid "onboarding-v2.before-start.desc3" +msgstr "O lè wo ìbáṣepọ̀ wa àti ìbáṣepọ̀ ti èyí tí agbègbè wa ṣe." + +msgid "onboarding-v2.before-start.desc3.title" +msgstr "Fídíò àwọn ìbáṣepọ̀" + +msgid "onboarding-v2.before-start.title" +msgstr "Kí o tó bẹ̀rẹ̀" + +msgid "onboarding-v2.newsletter.desc" +msgstr "" +"Ṣe alábàápín ìwé ìròyìn ti pẹ́ńpọtì kí o lè mọ ohun tí ó ń lọ ọjà " +"development progress and new Ìdàgbàsókè, Ìlọsíwájú,àti àwọn ìròyìn ." + +msgid "onboarding-v2.newsletter.news" +msgstr "" +"Fí ìròyìn ránńṣẹ́ sí mi nípa Pẹ́ńpọtì (àwọn bulọ́ọ̀gì,àwọn fídiò " +"ìbáṣepọ̀, àwọn sísàn wọlé...)." + +msgid "onboarding-v2.newsletter.privacy1" +msgstr "Ìfi pamọ́ jẹ wá lógún, ní bí o le kà nípa wa " + +msgid "onboarding-v2.newsletter.privacy2" +msgstr "" +"Àwọn ímeèlì tó ṣe kókó nìknn la ó fi ránńṣẹ́ sí ọ. o lè yọwọ́ kúrò ní " +"ìgbàkììgbàní ìlànà ti ìyọwọ́ kúrò nínú èyíkéyìí ìwé ìròyìn wa." + +msgid "onboarding-v2.newsletter.updates" +msgstr "" +"Fi ìmú dójú ìwọ̀n ọjà ránńṣẹ́ sí mi (àwọn ẹ̀yà yuntun, tú sílẹ̀, ṣà " +"túnṣe...)." + +msgid "onboarding-v2.welcome.desc1" +msgstr "" +"Pẹ́ńpọtì ni orísun ìṣílẹ̀kùn àti pe Kálẹidòsìló ṣe é àti àwọn agbègbè, Ní " +"bi ọ̀pọ̀lọpọ̀ àwọn ènìyàn ti ran ara wọn lọ́wọ́ tẹ́lẹ̀ . Gbgbo wọn ló lè " +"ṣe àjùmọ̀ṣenípa:" + +msgid "onboarding-v2.welcome.desc2" +msgstr "" +"Ìkẹ́kọ̀ọ́ ìta gbangba, pín-in kí ẹ sì jí ròrò nípa Pẹ́ńpọtì, ibi tó wà " +"lọ́wọ́lọ́wọ́ ọ̀jọ́ iwájú pẹ̀lú gbogbo agbègbè àti ìmójútó ẹgbẹ́ pẹ́ńpọtì . " +" ." + +msgid "onboarding-v2.welcome.desc3" +msgstr "" +"Ibi tí a ó ti ri bí a ó ti ṣe àjùmọ̀ṣepọ̀ pẹ̀lú àwọn ìtumọ̀, àwọn ìbéèrè " +"ẹ̀yà ara ẹ̀rọ, ìmójútó síṣe ojúṣe, ìṣọdẹ kòkòrò…" + +msgid "onboarding-v2.welcome.desc3.title" +msgstr "Sísojúṣe ìtọ́sẹ́nà" + +msgid "onboarding-v2.welcome.title" +msgstr "Káàbọ̀ sí pẹ́ńpọtì!" + +msgid "onboarding.choice.team-up.create-team-desc" +msgstr "" +"Lẹ́yìn tí o bá ti fún ẹgbẹ́ rẹ lórúkọ, Ó le pe àwọn ènìyàn láti darapọ̀ mọ́ " +"ẹgbẹ́." + +msgid "onboarding.choice.team-up.create-team-placeholder" +msgstr "Tẹ orúkọ ẹgbẹ́" + +msgid "onboarding.choice.team-up.invite-members" +msgstr "Fìwépè ọmọ àwọn ẹgbẹ́" + +msgid "onboarding.choice.team-up.invite-members-info" +msgstr "" +"Rántí láti fi gbogbo wọn sí i. Àwọn Olùdásílẹ̀, àwọn aṣàpẹẹrẹ, alákóso... " +"onírúúrú dà wọ́n pọ̀ :)" + +msgid "onboarding.choice.team-up.roles" +msgstr "Pè wọ́n pẹ̀lú ojúṣe wọn:" + +msgid "onboarding.newsletter.accept" +msgstr "Bẹ́ẹ̀ni, ṣe alábàpín" + +msgid "onboarding.newsletter.acceptance-message" +msgstr "" +"A ti fi ìbéèrè fún síṣe alá-bápín rẹ ránńṣẹ́, a ó fi ímeèlì ránńṣẹ́ sí ọ " +"látijẹ́rìí sí." + +msgid "onboarding.newsletter.policy" +msgstr "Ètò ìmúlò tí a fi pamọ́." + +msgid "onboarding.newsletter.title" +msgstr "Fẹ́ gba àwọn ìròyìn pẹ́ńpọti?" + +msgid "onboarding.team-modal.create-team" +msgstr "Ṣẹ̀dá ẹgbẹ́ kan" + +msgid "onboarding.team-modal.create-team-desc" +msgstr "" +"A team allows you to collaborate with other Penpot users working in the " +"Ẹgbẹ́ kan yí ó gbà ọ́ láyè láti lè siṣẹ́pọ̀ pẹ̀lú àwọn onílò pẹ́ńpọti tí ó " +"siṣẹ́ nínú àwọn fáìlì àti àwọn iṣẹ́ àgbéṣe kan náà ." + +msgid "onboarding.team-modal.create-team-feature-1" +msgstr "Àwọn fáìlì àti àwọn iṣẹ́ àgbéṣe tí kò lópin" + +msgid "onboarding.team-modal.create-team-feature-2" +msgstr "Multiplayer edition" + +msgid "onboarding.team-modal.create-team-feature-3" +msgstr "àwọn ipa ìṣàkóṣo" + +msgid "onboarding.team-modal.create-team-feature-4" +msgstr "Àwọn ọmọ ẹgbẹ́ tí kò lópin" + +msgid "onboarding.team-modal.create-team-feature-5" +msgstr "100% Ọ̀fẹ́!" + +msgid "onboarding.templates.subtitle" +msgstr "Àwọn àwòṣe díẹ̀ nìyí níbí." + +msgid "onboarding.templates.title" +msgstr "Bẹ̀rẹ̀ sí ṣe ẹ̀yà alárà" + +msgid "onboarding.welcome.alt" +msgstr "Pẹ́ńpọtì" + +#: src/app/main/ui/auth/recovery.cljs +msgid "profile.recovery.go-to-login" +msgstr "Lọ láti wọlé" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "Èwo ni ohun èlò irin iṣẹ́ tí o ní ìmọ̀ kíkún nínú pẹ̀lú rẹ̀?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "Mọ́kànlá-Ọgbọ̀n" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "Méjì – mẹ́wàá" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "Mọ́kànlélọ́gbọ̀n-Àádọ́ta" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "O ´ pọ̀jù" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Àdòbí XD" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Káńfà" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "" +"Báwo ni ó ti le ṣe àpèjúwe bó ṣe dára tó lórí ìrírí rẹ lórí iṣẹ́ tí o ń ṣe " +"lọ́wọ́..." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Olùyà nǹkan" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Olùdásílẹ̀" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "Ṣàwárí sí i nípa pẹ́ńpọtì" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Fígímà" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Olùdásílẹ̀/VP" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Oníṣẹ́ ni mí" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Gba kóòdù láti inú iṣẹ́ àgbéṣe mi " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... wíwò ètò ọnà , ìrírí àwọn ohun ìní, àwọn ètò ọnà, abbl." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "Ìkógun wọ̀lú" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Fi èsì sílẹ̀ fún iṣẹ́ àgbéṣe ẹgbẹ́ mi" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "Ẹjẹ́ 'ká bẹ̀rẹ̀ !" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Ohun títà tàbí iṣẹ́ àgbéṣe Olùṣàkóso" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Títajà" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "Ju àádọ́ta lọ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-a-tool" +msgstr "N kò tí lo irin iṣẹ́ eto ọnà tẹ́lẹ̀ rí" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Èyí tó kàn" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Kòsí" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Òmíìràn(ní pàtó)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "Mò ń siṣẹ́ àgbéṣẹ ti ara mi ni" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "Tàtẹ̀yìn wá" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Báwo lo ṣe ń gbèrò lórí bí o ṣe lo pẹ́ńpọtì?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Ṣe àṣàyàn" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Yàwòrán" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Díẹ̀" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Bẹ̀rẹ̀" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Bẹ̀rẹ̀ láti lórí iṣẹ́ àgbéṣe mi" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Akẹ́kọ̀ọ́ tàbí olùkọ̀ọ́" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "kín ni ìwọ̀n ẹgbẹ́ rẹ ?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Ṣàyẹ̀wọ̀ pẹ́ńpọtì láti rí pé ó bẹ́gbẹ́ mu " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Gbìyànjú láti mọ̀ kí o tó bẹ̀rẹ̀ sí lo pẹ́ńpọtì ní àyíká" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "... wáyà-fèrèsé, ìrìàjò àwọn onílò & sísàn, àwọn igi ìyíkiri, abbl." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Iṣẹ́ lórí èròǹgbà àti àwọn èrò" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Èsì rẹ yó ràn wá lọ́wọ́ láti jẹ́ kó yé wa lórí kín ni ìhùwàsí rẹ àti àwọn " +"ohun tí o fẹ́ràn jù èyí yó jẹ́ kí á má ṣàmúlò pẹ́ńpọtì gẹ́gẹ́ bí èyí tí ó " +"wúlò àti ohun èlò fun ìgbáládùn." + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Yọ kúrò" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "settings.multiple" +msgstr "Dàárú" + +# SECTIONS +msgid "shortcut-section.basics" +msgstr "Ipìlẹ̀" + +msgid "shortcut-section.viewer" +msgstr "Ólùwò" + +msgid "shortcut-section.workspace" +msgstr "Àaye ìṣẹ́" + +# SUBSECTIONS +msgid "shortcut-subsection.alignment" +msgstr "Titete" + +msgid "shortcut-subsection.edit" +msgstr "Sàtunkọ" + +msgid "shortcut-subsection.general-viewer" +msgstr "àbùdá" + +msgid "shortcut-subsection.main-menu" +msgstr "Akojọ ólórì aṣyn" + +msgid "shortcut-subsection.modify-layers" +msgstr "Yípàdá fẹ́lẹ́fẹ́lẹ́" + +msgid "shortcut-subsection.navigation-dashboard" +msgstr "Lìlọ́ kìrì" + +msgid "shortcut-subsection.navigation-viewer" +msgstr "Lìlọ́ kìrì" + +msgid "shortcut-subsection.navigation-workspace" +msgstr "Lìlọ́ kìrì" + +msgid "shortcut-subsection.panels" +msgstr "Àwọ̀n pánẹ̀lí" + +msgid "shortcut-subsection.path-editor" +msgstr "Àwọ́n ọna" + +msgid "shortcut-subsection.shape" +msgstr "Àwọ́n apẹ́rẹ́" + +msgid "shortcut-subsection.text-editor" +msgstr "Àwọ́n ọ́rọ̀" + +msgid "shortcut-subsection.tools" +msgstr "Àwọ́n irínṣẹ̀" + +msgid "shortcut-subsection.zoom-viewer" +msgstr "Sun-un" + +msgid "shortcut-subsection.zoom-workspace" +msgstr "Sun-un" + +msgid "shortcuts.add-comment" +msgstr "Ọ́rọ̀íwòye" + +msgid "shortcuts.add-node" +msgstr "Fí ípàdé kùn" + +msgid "shortcuts.align-bottom" +msgstr "Sópọ sí ísàle" + +msgid "shortcuts.align-center" +msgstr "Parapọ àárin" + +msgid "shortcuts.align-hcenter" +msgstr "Páràpọ àárin naa" + +msgid "shortcuts.align-justify" +msgstr "Ṣe dèédé si ìdálárè" + +msgid "shortcuts.align-left" +msgstr "Sosi ósì" + +msgid "shortcuts.align-right" +msgstr "Sosi ọtún" + +msgid "shortcuts.align-top" +msgstr "Sopo si òké" + +msgid "shortcuts.align-vcenter" +msgstr "Tẹle àárin ni inàró" + +msgid "shortcuts.artboard-selection" +msgstr "Ṣẹ̀dá ọ̀kọ̀ lati yìyán" + +msgid "shortcuts.bold" +msgstr "Yipàdà to han" + +msgid "shortcuts.bool-difference" +msgstr "Iyàtò Boolean" + +msgid "shortcuts.bool-exclude" +msgstr "Boolean tà yọ̀kúro" + +msgid "shortcuts.bool-intersection" +msgstr "ikòritá Boolean" + +msgid "shortcuts.bool-union" +msgstr "Asépọ̀ Boolean" + +msgid "shortcuts.bring-back" +msgstr "Fírànṣẹ́ si ẹ́hin" + +msgid "shortcuts.bring-backward" +msgstr "Ran pàdà sí ehin" + +msgid "shortcuts.bring-forward" +msgstr "Mù siwájù" + +msgid "shortcuts.bring-front" +msgstr "Mù si wájù" + +msgid "shortcuts.clear-undo" +msgstr "Pa yipàdá rẹ" + +msgid "shortcuts.copy" +msgstr "Dàákọ" + +msgid "shortcuts.create-component" +msgstr "Ṣẹ̀dá pàátì" + +msgid "shortcuts.create-new-project" +msgstr "Ṣẹ̀dá títún" + +msgid "shortcuts.cut" +msgstr "Ge" + +msgid "shortcuts.decrease-zoom" +msgstr "Sun-un jàdé" + +msgid "shortcuts.delete" +msgstr "Pàrẹ" + +msgid "shortcuts.delete-node" +msgstr "Pa ipàdé" + +msgid "shortcuts.detach-component" +msgstr "Yà paati" + +msgid "shortcuts.draw-curve" +msgstr "Yìyí" + +msgid "shortcuts.draw-ellipse" +msgstr "Ẹ́lipsì" + +msgid "shortcuts.draw-nodes" +msgstr "Fà ọnà" + +msgid "shortcuts.draw-path" +msgstr "Ọnà" + +msgid "shortcuts.draw-rect" +msgstr "Ònìgún mèrìn" + +msgid "shortcuts.draw-text" +msgstr "Ọ́rọ̀" + +msgid "shortcuts.duplicate" +msgstr "Ṣe pidánpidán" + +msgid "shortcuts.escape" +msgstr "Fàgílèè" + +msgid "shortcuts.export-shapes" +msgstr "Ókèéré apẹ̀rẹ̀" + +msgid "shortcuts.fit-all" +msgstr "Sun-un látì ba gbògbò rẹ̀ mú" + +msgid "shortcuts.flip-horizontal" +msgstr "Yipadà ní pẹ̀tẹ̀lẹ̀" + +msgid "shortcuts.flip-vertical" +msgstr "Yipadà ní ínàró" + +msgid "shortcuts.font-size-dec" +msgstr "Dìn íwọ̀n fonti kù" + +msgid "shortcuts.font-size-inc" +msgstr "Alekun iwọn fonti" + +msgid "shortcuts.go-to-drafts" +msgstr "Lọ sí iyáwòran" + +msgid "shortcuts.go-to-libs" +msgstr "Lọ si awọn ílé-Ikàwé tí a pín" + +msgid "shortcuts.go-to-search" +msgstr "Wàá" + +msgid "shortcuts.group" +msgstr "Ẹgbẹ" + +msgid "shortcuts.h-distribute" +msgstr "Pinpín kàákírì pètèlè" + +msgid "shortcuts.hide-ui" +msgstr "Ífìhan / Tọju UI" + +msgid "shortcuts.increase-zoom" +msgstr "Sùn-un sínú" + +msgid "shortcuts.insert-image" +msgstr "Fí àwóran sii" + +msgid "shortcuts.italic" +msgstr "Yipàdà ítalikì" + +msgid "shortcuts.join-nodes" +msgstr "Dàràpọ̀ awọn ipàdé" + +msgid "shortcuts.letter-spacing-dec" +msgstr "Din aayé lẹ́tà kù" + +msgid "shortcuts.letter-spacing-inc" +msgstr "Alekun aayé lẹ́tà" + +msgid "shortcuts.line-height-dec" +msgstr "Dinkù gígà ílà" + +msgid "shortcuts.line-height-inc" +msgstr "Ílà ton gá sókè" + +msgid "shortcuts.line-through" +msgstr "Íyìpàdà ílà to yọ̀rí" + +msgid "shortcuts.make-corner" +msgstr "Ṣè ígùn" + +msgid "shortcuts.make-curve" +msgstr "Ṣe ìsépọ" + +msgid "shortcuts.mask" +msgstr "Ibòjú" + +msgid "shortcuts.merge-nodes" +msgstr "Dàpọ̀ awọ́n apa" + +msgid "shortcuts.move" +msgstr "Gbé" + +msgid "shortcuts.move-fast-down" +msgstr "Sàré lọ́ sí isàlẹ̀" + +msgid "shortcuts.move-fast-left" +msgstr "Gbé sí osi kiákiá" + +msgid "shortcuts.move-fast-right" +msgstr "Gbé si ọ̀tún kiákiá" + +msgid "shortcuts.move-fast-up" +msgstr "Gbé si òké kiákiá" + +msgid "shortcuts.move-nodes" +msgstr "Gbé ipàdé" + +msgid "shortcuts.move-unit-down" +msgstr "Gbé sílè" + +msgid "shortcuts.move-unit-left" +msgstr "Gbé osi" + +msgid "shortcuts.move-unit-right" +msgstr "Gbé sọtùn" + +msgid "shortcuts.move-unit-up" +msgstr "Gbé sóke" + +msgid "shortcuts.next-frame" +msgstr "Ọ̀kọ̀ tókan" + +msgid "shortcuts.not-found" +msgstr "Kò sí awọ́n ọ̀nà abùjá ti à rii" + +msgid "shortcuts.opacity-0" +msgstr "Fí akomo sí ipò 100%" + +msgid "shortcuts.opacity-1" +msgstr "Fi akomo si ipo 10%" + +msgid "shortcuts.opacity-2" +msgstr "Fi akomo si ipo 20%" + +msgid "shortcuts.opacity-3" +msgstr "Fi akomo si ipo 30%" + +msgid "shortcuts.opacity-4" +msgstr "Fi akomo si ipo 40%" + +msgid "shortcuts.opacity-5" +msgstr "Fi akomo si ipo 50%" + +msgid "shortcuts.opacity-6" +msgstr "Fi akomo si ipo 60%" + +msgid "shortcuts.opacity-7" +msgstr "Fi akomo si ipo 70%" + +msgid "shortcuts.opacity-8" +msgstr "Fi akomo si ipo 80%" + +msgid "shortcuts.opacity-9" +msgstr "Fi akomo si ipo 90%" + +msgid "shortcuts.open-color-picker" +msgstr "Ólùṣà àwọ̀" + +msgid "shortcuts.open-dashboard" +msgstr "Lọ si dasibodu" + +msgid "shortcuts.open-inspect" +msgstr "Lọ si apaa ayewo olùwò" + +msgid "shortcuts.open-viewer" +msgstr "Lọ si apaa ibaraẹnisọrọ olùwò" + +msgid "shortcuts.or" +msgstr " tabi " + +msgid "shortcuts.paste" +msgstr "Lẹẹmọ" + +msgid "shortcuts.prev-frame" +msgstr "Ọkọ ti tẹlẹ" + +msgid "shortcuts.redo" +msgstr "Tunṣe" + +msgid "shortcuts.reset-zoom" +msgstr "tun sun" + +msgid "shortcuts.search-placeholder" +msgstr "Wa awọn ọna abuja" + +msgid "shortcuts.select-all" +msgstr "Ṣa gbogbo re" + +msgid "shortcuts.select-parent-layer" +msgstr "Yan Obii pẹlẹbẹ" + +msgid "shortcuts.show-shortcuts" +msgstr "Ifihan / Itọju ọna abùjá" + +msgid "shortcuts.snap-nodes" +msgstr "Yaa si awon apa" + +msgid "shortcuts.snap-pixel-grid" +msgstr "Yaa si pikseli ilana" + +msgid "shortcuts.start-measure" +msgstr "Bẹ̀rẹ̀ wíwọ̀n" + +msgid "shortcuts.stop-measure" +msgstr "da wíwọ̀n duro" + +msgid "shortcuts.text-align-center" +msgstr "Parapọ saarin" + +msgid "shortcuts.text-align-justify" +msgstr "Sedede lárè" + +msgid "shortcuts.text-align-left" +msgstr "mo si osi" + +msgid "shortcuts.text-align-right" +msgstr "Mo sotun" + +msgid "shortcuts.thumbnail-set" +msgstr "Se étò awòn áwòran fun fidio" + +msgid "shortcuts.toggle-alignment" +msgstr "Iyipada titete ìmúdàgba" + +msgid "shortcuts.toggle-assets" +msgstr "Yi dukia pada" + +msgid "shortcuts.toggle-colorpalette" +msgstr "Yi paleti awọ pada" + +msgid "shortcuts.toggle-focus-mode" +msgstr "Yi ipo idojukọ pada" + +msgid "shortcuts.toggle-fullscreen" +msgstr "Yi kuro ni fulscrin" + +msgid "shortcuts.toggle-grid" +msgstr "Fihan / Tọju ilana" + +msgid "shortcuts.toggle-layers" +msgstr "Yi awon pelebe yii pada" + +msgid "shortcuts.toggle-lock" +msgstr "Tiipa / Siilẹ" + +msgid "shortcuts.toggle-lock-size" +msgstr "títìipa lápàkàn" + +msgid "shortcuts.toggle-rules" +msgstr "Fifihan / Titọju ólórì" + +msgid "shortcuts.toggle-scale-text" +msgstr "Yipada asekale ọrọ" + +msgid "shortcuts.toggle-snap-guide" +msgstr "Pín si awọ́n ítọ̀nisọ́nà" + +msgid "shortcuts.toggle-textpalette" +msgstr "Yíípàda ọrọ paleti" + +msgid "shortcuts.toggle-visibility" +msgstr "Fihan / Toju re" + +msgid "shortcuts.toggle-zoom-style" +msgstr "Yiipada asa sun-un" + +msgid "shortcuts.underline" +msgstr "Yii abẹlẹ" + +msgid "shortcuts.undo" +msgstr "Yi pada" + +msgid "shortcuts.ungroup" +msgstr "Tu ẹgbẹ" + +msgid "shortcuts.unmask" +msgstr "Aiboju" + +msgid "shortcuts.v-distribute" +msgstr "Pin ni inaro" + +msgid "shortcuts.zoom-lense-decrease" +msgstr "Dín lẹnsì sisun kù" + +msgid "shortcuts.zoom-lense-increase" +msgstr "Lílọ̀soké lẹnsi sisun" + +msgid "shortcuts.zoom-selected" +msgstr "Yiyan pelu sun-un" + +#: src/app/main/ui/dashboard/team.cljs +msgid "team.webhooks.max-length" +msgstr "Orúkọ̀ webhook kò gbọ́dọ̀ kọjà awọ́n óhun kíkọ́ 2048." + +#: src/app/main/ui/dashboard/files.cljs +msgid "title.dashboard.files" +msgstr "%s - Penpot" + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "title.dashboard.font-providers" +msgstr "Pipese oniru fọnti - %s - Penpot" + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "title.dashboard.fonts" +msgstr "Fọnti - %s - Penpot" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "title.dashboard.projects" +msgstr "Awọn ísè agbèsè - %s - Penpot" + +#: src/app/main/ui/dashboard/search.cljs +msgid "title.dashboard.search" +msgstr "Wà - %s - Penpot" + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/auth.cljs +msgid "title.default" +msgstr "Penpot – Se onìrú òmínìra fun awọ̀n ẹ̀gbẹ̀" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "Profaili – Aami wiwọle" + +#: src/app/main/ui/settings/feedback.cljs +msgid "title.settings.feedback" +msgstr "Fi esi- Penpot" + +#: src/app/main/ui/settings/options.cljs +msgid "title.settings.options" +msgstr "Awon eto - Penpot" + +#: src/app/main/ui/settings/password.cljs +msgid "title.settings.password" +msgstr "Ọrọigbaníwólé - Penpot" + +#: src/app/main/ui/settings/profile.cljs +msgid "title.settings.profile" +msgstr "Profaili - Penpot" + +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-invitations" +msgstr "Ifíwẹ́pe - %s - Penpot" + +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-members" +msgstr "Ọ́́mọ̀ ẹgbẹ - %s - Penpot" + +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-settings" +msgstr "Awọn eto - %s - Penpot" + +msgid "title.team-webhooks" +msgstr "Webhooks - %s - Penpot" + +#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs +msgid "title.viewer" +msgstr "%s –Ipo wíwò - Penpot" + +#: src/app/main/ui/workspace.cljs +msgid "title.workspace" +msgstr "%s - Penpot" + +#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs +msgid "viewer.empty-state" +msgstr "No boards found on the page." + +#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs +msgid "viewer.frame-not-found" +msgstr "A kò ri ọ̀kọ̀." + +msgid "viewer.header.comments-section" +msgstr "Ọrọìwòye (%s)" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.dont-show-interactions" +msgstr "Maa fi ìbaráẹ̀nìsepọ han" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.fullscreen" +msgstr "Fé ká gḅọgbọ síkírínì" + +msgid "viewer.header.inspect-section" +msgstr "Ayéwò (%s)" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.interactions" +msgstr "Ibaraenisépọ̀" + +msgid "viewer.header.interactions-section" +msgstr "Awọ̀n Ibaraenisépọ̀ (%s)" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.share.copy-link" +msgstr "Da línkì kọ̀" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.show-interactions" +msgstr "Ifihan Ibaraenisépọ̀" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.sitemap" +msgstr "Áwòran átọ̀kà ílẹ̀" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hcenter" +msgstr "Paŕàpọ̀ sí petelè aarin (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hdistribute" +msgstr "Pin aayè ni pètélè (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hleft" +msgstr "Páràpọ̀ sí òsì (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hright" +msgstr "Páràpọ̀ sí ọtun (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vbottom" +msgstr "Páràpọ̀ sí isàlẹ̀ (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vcenter" +msgstr "Páràpọ̀ sí inàro aarin (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vdistribute" +msgstr "Pin aayè inàró (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vtop" +msgstr "Párápọ̀ sóké (%s)" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.assets" +msgstr "Awọ̀n dukia" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.box-filter-all" +msgstr "Gbọ̀gbọ̀ awọ̀n dukia" + +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.colors" +msgstr "Áwò" + +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.components" +msgstr "Awọ̀n eroja" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.create-group" +msgstr "Ṣẹ̀dá ẹ̀gbẹ̀ kan" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.create-group-hint" +msgstr "páarẹ̀" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.duplicate" +msgstr "ẹẹdà" + +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.edit" +msgstr "Ṣatunkọ" + +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.graphics" +msgstr "Awọn Awòran" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.group" +msgstr "Ẹgbẹ" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.group-name" +msgstr "Orúkọ̀ ẹgbẹ" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.libraries" +msgstr "Ílè-iwè" + +msgid "workspace.assets.local-library" +msgstr "Ílè-iwè agbegbe" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.not-found" +msgstr "Ko si ohun-ini ti a rii" + +msgid "workspace.assets.open-library" +msgstr "Ṣii faili ìlé-ikáwè" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.rename" +msgstr "Lo oruko imiran" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.rename-group" +msgstr "Lo oruko imiran fun ẹgbẹ" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.search" +msgstr "Wa dukia" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "Iĺẹ̀ iwekika ti a pln" + +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.typography" +msgstr "Iwe itẹwe" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.font-id" +msgstr "Fonti" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.font-size" +msgstr "Iwon" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.font-variant-id" +msgstr "Iyatọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.letter-spacing" +msgstr "Aaye leta" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.line-height" +msgstr "Giga ila" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/inspect/attributes/text.cljs, src/app/main/ui/inspect/attributes/text.cljs +msgid "workspace.assets.typography.sample" +msgstr "Ag" + +msgid "workspace.assets.typography.text-styles" +msgstr "Oniru ọrọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.text-transform" +msgstr "Iyipádà ọrọ" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.ungroup" +msgstr "Títù ẹ̀gbẹ́" + +msgid "workspace.focus.focus-mode" +msgstr "Ipo Idojukọ" + +msgid "workspace.focus.focus-off" +msgstr "Pa Ídòjúkọ" + +msgid "workspace.focus.focus-on" +msgstr "Tan Ídòjúkọ" + +msgid "workspace.focus.selection" +msgstr "Yiyan" + +#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs +msgid "workspace.gradients.linear" +msgstr "Itesiwaju gerege" + +#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs +msgid "workspace.gradients.radial" +msgstr "Itesiwaju Radial" + +msgid "workspace.header.menu.disable-scale-content" +msgstr "Pa asèkalẹ̀ iwọnbà" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-scale-text" +msgstr "Pa ọrọ iwọnba" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-grid" +msgstr "Pa yipada si ilana" + +msgid "workspace.header.menu.disable-snap-pixel-grid" +msgstr "Pa yipada si piseli" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-dynamic-alignment" +msgstr "Tan imudagba to Sedede" + +msgid "workspace.header.menu.enable-scale-content" +msgstr "Tan asèkalẹ̀ iwọnbà" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-scale-text" +msgstr "Tan iwọnbà ọrọ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-grid" +msgstr "Yipada si ilana" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-guides" +msgstr "Yipada si itọ̀nìsọna" + +msgid "workspace.header.menu.enable-snap-pixel-grid" +msgstr "Tan Yipada si piseli" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-grid" +msgstr "Tọ̀jú ilana" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-palette" +msgstr "Tọ̀jú awọ palẹti" + +msgid "workspace.header.menu.hide-pixel-grid" +msgstr "Tọ̀jú pisẹli ilana" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-rules" +msgstr "Tọ̀jú awọn ólòrí" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-textpalette" +msgstr "Tọ̀jú awọn fọnti paleti" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.edit" +msgstr "Satunkọ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.file" +msgstr "Faili" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.help-info" +msgstr "Iranlọwọ ati alaye" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.preferences" +msgstr "Awọn àyánfẹ̀" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.view" +msgstr "Wiwo" + +msgid "workspace.header.menu.redo" +msgstr "Tun ṣe" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.select-all" +msgstr "Sa gbogbo rẹ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-grid" +msgstr "ifihan akoj" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-palette" +msgstr "Fi awo paleti han" + +msgid "workspace.header.menu.show-pixel-grid" +msgstr "Fi piseli ilana han" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-rules" +msgstr "Ifihan awọ̀n ólórí" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-textpalette" +msgstr "Ifihan fonti paleti" + +msgid "workspace.header.menu.undo" +msgstr "Yi pada" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.reset-zoom" +msgstr "Tunto" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.save-error" +msgstr "àsisè lórì fíf́ipamọ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.saved" +msgstr "Ti a fipamọ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.saving" +msgstr "Fifipámọ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.unsaved" +msgstr "Awọn ayípàdà ti kó ni fipamọ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.viewer" +msgstr "Ipo wiwo(%s)" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "sun-un" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fill" +msgstr "Kun - óṣùwọn to kun" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fit" +msgstr "Báràmù - óṣùwọn to Báràmù" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fit-all" +msgstr "Suun kí o bá gbógbó rẹ̀ dọ́gbà" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-full-screen" +msgstr "Áseàfihan to kún" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-selected" +msgstr "Ṣuum lati yan" + +msgid "workspace.layout_grid.editor.title" +msgstr "Ilànà àyípàdà" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.add" +msgstr "Afikùn" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.colors" +msgstr "%s awọn awọ" + +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "Kòyi si oniruiru awọ ni ilé-ikàwé re" + +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "Ko si oniruiru iwé itẹ̀wé ni ilé ikàwé rẹ̀" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.hsv" +msgstr "HSV" + +#: src/app/main/ui/workspace/colorpicker/libraries.cljs, src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.recent-colors" +msgstr "Awọn àwò tálò láipẹ̀" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgb-complementary" +msgstr "RGB Ibáramù" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgba" +msgstr "RGBA" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.save-color" +msgstr "Fi awọn oniru awọ pamọ" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.components" +msgstr "%s Ẹya ara ẹrọ" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.file-library" +msgstr "Faili ilé ikàwé" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.graphics" +msgstr "%s ayaworan" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.libraries" +msgstr "Awọn Ílè íkawè" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library" +msgstr "Ílè íkawè" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library-updates" +msgstr "Ílè íkawè ímùdojúiwọn" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.no-libraries-need-sync" +msgstr "Kò si Ilé kàwé ti a pin si ímùdojúiwọn" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.shared-libraries" +msgstr "Awọn ilé kàwé tí a pìn" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.libraries.text.multiple-typography" +msgstr "Óríṣí awọn íwè itẹ̀wé" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.libraries.text.multiple-typography-tooltip" +msgstr "Tú gbógbó lińkí awọn íwè itẹ̀wé" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.typography" +msgstr "%s awọn íwè itẹ̀wé" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.update" +msgstr "ímùdojúiwọn" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "wò gbògbò awọn ayípàdà" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.updates" +msgstr "Awọn ímùdojúiwọn" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.add-interaction" +msgstr "Tẹ amí + làtí fi íbàràénisépọ̀ kun" + +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "workspace.options.blur-options.title" +msgstr "Baìbaì" + +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "workspace.options.blur-options.title.group" +msgstr "Ẹ̀gdẹ́ Baìbaì" + +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "workspace.options.blur-options.title.multiple" +msgstr "Asayan Baìbaì" + +#: src/app/main/ui/workspace/sidebar/options/page.cljs +msgid "workspace.options.canvas-background" +msgstr "Kánfásì abẹ́le" + +msgid "workspace.options.clip-content" +msgstr "Ábẹrẹ́ ákoonù" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs +msgid "workspace.options.component" +msgstr "Apakan" + +msgid "workspace.options.component.copy" +msgstr "Ádàakọ" + +msgid "workspace.options.component.edit-annotation" +msgstr "Ṣatunkọ àkọ̀silẹ̀" + +msgid "workspace.options.component.main" +msgstr "Ólòrí" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints" +msgstr "Awọn ihámọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.bottom" +msgstr "Ídì" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.center" +msgstr "Aarin" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.left" +msgstr "Òsi" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.leftright" +msgstr "Osi ati otun" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.right" +msgstr "Ọ̀tún" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.scale" +msgstr "Íwọ́n" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.top" +msgstr "Ókè" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.topbottom" +msgstr "Ókè ati Ídí" + +#: src/app/main/ui/workspace/sidebar/options.cljs +msgid "workspace.options.design" +msgstr "Ónirú" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export" +msgstr "Sí ilẹ́ òkèeré" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs +msgid "workspace.options.export.suffix" +msgstr "afikun ọrọ niipárí" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-complete" +msgstr "Gbígbè okeere ti pari" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object" +msgstr "Gbígbè okeere …" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object-error" +msgstr "Gbígbè okeere kuna" + +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.fill" +msgstr "Kún" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.add-flow-start" +msgstr "Safikun ibẹrè ṣiṣan" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-start" +msgstr "ibẹrè ṣiṣan" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-starts" +msgstr "íbẹrè awọn ṣiṣan" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.auto" +msgstr "Aifọ́wọyi" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.grid-title" +msgstr "Ilánà" + +msgid "workspace.options.grid.params.color" +msgstr "Awọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.columns" +msgstr "Awọn ọwọn" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.gutter" +msgstr "Gota" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.height" +msgstr "Òkè" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.margin" +msgstr "Àlà" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.rows" +msgstr "Àwọn orí ìlà ìbú" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.set-default" +msgstr "Fi sípò abínibí" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.size" +msgstr "Ìwọ̀n" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type" +msgstr "Irú" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.bottom" +msgstr "ìsàlẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.center" +msgstr "Àárín" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.left" +msgstr "Òsì" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.right" +msgstr "Ọ̀tún" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.stretch" +msgstr "Nà" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.top" +msgstr "Òkè" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.use-default" +msgstr "Lo ipò abínibí" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.width" +msgstr "Ìgbòrò" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.row" +msgstr "Àwọn orị ìlà ìbú" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.square" +msgstr "Alápoméjì" + +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.group-fill" +msgstr "Ẹ̀kún ẹgbẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.group-stroke" +msgstr "Ẹgba ẹgbẹ́" + +msgid "workspace.options.height" +msgstr "Gíga" + +msgid "workspace.options.inspect" +msgstr "Ṣàyẹ̀wò" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-action" +msgstr "Ìgbésẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-after-delay" +msgstr "Lẹ́yìn ìdádúro" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation" +msgstr "Àwòrán abẹ̀mí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-dissolve" +msgstr "Túká" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-none" +msgstr "Kòsí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-push" +msgstr "Tì" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-slide" +msgstr "Aṣàfihàn" + +msgid "workspace.options.interaction-auto" +msgstr "Ọkọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-background" +msgstr "Fi àyíká ìtẹ̀lẹ̀ ìlànà síi" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-outside" +msgstr "Páadé tí o bá n tẹ ìta" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay" +msgstr "Pa ìlànà ìtẹ̀lẹ̀ dé" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay-dest" +msgstr "Pa ìlànà ìtẹ̀lẹ̀ dé: %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-delay" +msgstr "Ìdádúró" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-destination" +msgstr "Èbúté" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-duration" +msgstr "Ịgbà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing" +msgstr "Rírokùn" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease" +msgstr "Ìrọ̀rùn" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in" +msgstr "Rọra wọlé" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in-out" +msgstr "Rọra wọlé jáde" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-out" +msgstr "Rọra jáde" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-linear" +msgstr "Ilà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-in" +msgstr "Inú" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-enter" +msgstr "Atọ́ka ìwọnú" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-leave" +msgstr "Atọ́ka kíkúrò" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-ms" +msgstr "ms" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to" +msgstr "Lílọ kiri sí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to-dest" +msgstr "Lílo kiri sí: %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-none" +msgstr "(Akò ṣètò)" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-offset-effect" +msgstr "Ipa àìṣedédé" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-on-click" +msgstr "Tẹ orí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay" +msgstr "Ṣíìtẹ̀lé ìlànà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay-dest" +msgstr "Ṣí ìtẹ̀lé ìlànà: %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-url" +msgstr "Ṣí URL" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-out" +msgstr "Jáde" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-center" +msgstr "Àáriń ìsàlẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-left" +msgstr "Ìsàlẹ̀ òsì" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-right" +msgstr "Ìsàḷ̀ẹ̀ ọ̀tún" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-center" +msgstr "Àárín" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-manual" +msgstr "Aláfọwóṣe" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-center" +msgstr "Àárín òkè" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-left" +msgstr "Òkè òsì" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-right" +msgstr "Òkè ọ̀tún" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-position" +msgstr "Ipò" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-preserve-scroll" +msgstr "Ṣe ìtọ́jú ipò àyílọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-prev-screen" +msgstr "Aṣàfihàn àtẹ̀yìnwá" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-relative-to" +msgstr "Ìbátan sí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-self" +msgstr "Tìkara" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay" +msgstr "Àyípadà ìtẹ̀lé ìlànà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay-dest" +msgstr "Àyípadà ìtẹ̀lé ìlànà: %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-trigger" +msgstr "Okùnfà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-url" +msgstr "URL" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-hovering" +msgstr "Nígbàtí óhún rábàbà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-pressing" +msgstr "Nígbàtị óhún tẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interactions" +msgstr "Àwọn ìbáraẹniṣepọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color" +msgstr "Àwọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color-burn" +msgstr "Ṣẹ̀dà àwọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color-dodge" +msgstr "Òpó àwọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.darken" +msgstr "Ṣókuǹkùn" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.difference" +msgstr "Ìyàtọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.exclusion" +msgstr "Ìyàsọ́tọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.hard-light" +msgstr "Iná líle" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.hue" +msgstr "Ọdà" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.lighten" +msgstr "Fẹ́ẹ́rẹ́fẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.luminosity" +msgstr "Ìmọ́lẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.multiply" +msgstr "Ìsọdipúpọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.normal" +msgstr "Déédé" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.overlay" +msgstr "Ìtẹ̀lẹ́ ìlànà" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.saturation" +msgstr "Ẹ̀kúnrẹ́rẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.screen" +msgstr "Aṣàfihàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.soft-light" +msgstr "Ìmọ́lẹ̀ rokoṣo" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title" +msgstr "Ìpele" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title.group" +msgstr "Ẹgbẹ́ ìpele" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title.multiple" +msgstr "Egbẹ́ ààyò" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.advanced-ops" +msgstr "Ànàálè ìtẹ̀síwájú" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-max-h" +msgstr "Ibi tó ga jùlọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-max-w" +msgstr "Ìgbòrò tó ga jù" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-min-h" +msgstr "Gíga to kéré jù lọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-min-w" +msgstr "Ìgbòrò tó kéré jù lọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-max-h" +msgstr "Gíga tó pọ̀jù" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-max-w" +msgstr "Ìgbòrò tí pòjù" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-min-h" +msgstr "Gíga tó kéré jùlọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-min-w" +msgstr "Gbígbòrò tó kéré jù lọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.bottom" +msgstr "Ìdí" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column" +msgstr "Ìlà òòró" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column-reverse" +msgstr "Ìlà òòró yíyípadà" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row" +msgstr "Ilà ìbú" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row-reverse" +msgstr "Ilà ìbú yíyípadà" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.gap" +msgstr "Àlàfo" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.left" +msgstr "Òsì" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin" +msgstr "Etí ìwé" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin-all" +msgstr "Gbogbo àwọn àwòrán" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin-simple" +msgstr "Etí ìwé ẹyọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.packed" +msgstr "tí wọn dì" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding" +msgstr "Ìtẹ̀wọ́nú" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-all" +msgstr "Gbogbo ẹ̀gbẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-simple" +msgstr "Ìtẹ̀wọ́nú pọ́nbélé" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.right" +msgstr "Ọ̀tún" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-around" +msgstr "Àyè àyíká" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-between" +msgstr "Àyè àárín" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.top" +msgstr "Òkè" + +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.more-colors" +msgstr "Àwọn àwọ̀ púpọ̀ sí i" + +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.more-lib-colors" +msgstr "Àwọn yàrá àwọ̀ púpọ̀ sí I" + +msgid "workspace.options.opacity" +msgstr "Àìríran" + +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.position" +msgstr "Ipò" + +#: src/app/main/ui/workspace/sidebar/options.cljs +msgid "workspace.options.prototype" +msgstr "Ìtẹ̀lé ìlànà" + +msgid "workspace.options.radius" +msgstr "Ìdáméjì òbìrìkìtiì" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-bottom-left" +msgstr "Apá òsì ìsàlẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-bottom-right" +msgstr "Apá ọ̀tún ìsàle" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-top-left" +msgstr "Òkè òsì" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-top-right" +msgstr "Òkè ọ̀tún" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius.all-corners" +msgstr "Àwọn gbogbo igun" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius.single-corners" +msgstr "Àwọn igun olómìnira" + +msgid "workspace.options.recent-fonts" +msgstr "Àìpẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.retry" +msgstr "Tún gbìyànjú" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.rotation" +msgstr "Yíyípo" + +msgid "workspace.options.search-font" +msgstr "Àdàkọ ìwádìí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.select-a-shape" +msgstr "" +"Yan ìrísi ,pátákó tàbí ẹgbẹ́ láti fa ìsopọ̀ mọ́ pátákó " +"òmíràn." + +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.selection-color" +msgstr "Àwọn àwọ̀ tí a ti yàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.selection-fill" +msgstr "Ìmúṣẹ tí a yàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.selection-stroke" +msgstr "Ipò ìlù tí a yàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.blur" +msgstr "Rẹ́súrẹ́sú" + +msgid "workspace.options.shadow-options.color" +msgstr "Àwọ̀ òjíjí" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.drop-shadow" +msgstr "Da òjìjí" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.inner-shadow" +msgstr "Òjìjí inú" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsetx" +msgstr "X" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsety" +msgstr "Y" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.spread" +msgstr "Tànkálẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title" +msgstr "Òjìjí" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title.group" +msgstr "Àwùjọ òjìjí" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title.multiple" +msgstr "Òjìjí tí a yàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.show-fill-on-export" +msgstr "Fihàn nínụ àgbéjáde" + +msgid "workspace.options.show-in-viewer" +msgstr "Fihàn nínú ipò wíwò" + +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.size" +msgstr "Ìwọ̀n" + +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs +msgid "workspace.options.size-presets" +msgstr "Àwọn àtòjọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke" +msgstr "Ipò ìlà" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker" +msgstr "Àmì yíyíká" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Yíyíká" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker" +msgstr "Àmì dáyámọ́ǹdì" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Dáyámọ́ǹdì" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow" +msgstr "Ọfà ìlà" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Ofà" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.none" +msgstr "Kòsí" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.round" +msgstr "Yíká" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square" +msgstr "Alápoméjì" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker" +msgstr "Àmì alápoméjì" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Onígun mẹ́rin" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow" +msgstr "Ofà onígun mẹ́ta" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Onígun mẹ́ta" + +msgid "workspace.options.stroke-color" +msgstr "Àwọ ìlà" + +msgid "workspace.options.stroke-width" +msgstr "Ìgbòrò ìlà" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.center" +msgstr "Àárín" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.dashed" +msgstr "Tó ní ìlà-ìlà" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.dotted" +msgstr "àmì tó tó tó" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.inner" +msgstr "Nínú" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.mixed" +msgstr "Tí a ti dàpọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.outer" +msgstr "Ìta" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.solid" +msgstr "Ṣinsin" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-bottom" +msgstr "Mú dọ́gba abẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-middle" +msgstr "Mú dọgba àárín" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-top" +msgstr "Mú dọ́gba òkè" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.direction-ltr" +msgstr "LTR" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.direction-rtl" +msgstr "RTL" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-auto-height" +msgstr "Gíga aládàáṣiṣẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-auto-width" +msgstr "Gbígbòòrò aládáàṣiṣé" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-fixed" +msgstr "Tí kò yíyadà" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.letter-spacing" +msgstr "Àlàfo lẹ́tà" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.line-height" +msgstr "Gíga ìlà" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.lowercase" +msgstr "Lẹ́tà kékeré" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.none" +msgstr "Kòsí" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.strikethrough" +msgstr "Ìfọwọ́bàyíká (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-center" +msgstr "Mú dọ́gba àárín (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-justify" +msgstr "Ìdálàre (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-left" +msgstr "Mú dọ́gba òsì (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-right" +msgstr "Mú dọ́gba ọ̀tún (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title" +msgstr "Àyọkà" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title-group" +msgstr "Àwùjọ àyọkà" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title-selection" +msgstr "Àṣàyàn ọ̀rọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.titlecase" +msgstr "ipò ọ̀rọ̀ àkórí" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.underline" +msgstr "Fífàlà (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.uppercase" +msgstr "Lẹ́tà ńlá" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.use-play-button" +msgstr "" +"Lo bọ́tìnì ìṣe tó wà lóori àkọsórí náà láti ṣakóso ìwò " +"àkàwé." + +msgid "workspace.options.width" +msgstr "Ìgbòrò" + +msgid "workspace.options.x" +msgstr "Ipò X" + +msgid "workspace.options.y" +msgstr "Ipò Y" + +msgid "workspace.path.actions.add-node" +msgstr "Fi ìpàdé kún (%s)" + +msgid "workspace.path.actions.delete-node" +msgstr "Pa ìpàdé ré (%s)" + +msgid "workspace.path.actions.draw-nodes" +msgstr "Fa ìpàdé (%s)" + +msgid "workspace.path.actions.join-nodes" +msgstr "Da ìpàdé pọ̀ (%s)" + +msgid "workspace.path.actions.make-corner" +msgstr "Sí igun (%s)" + +msgid "workspace.path.actions.make-curve" +msgstr "Sí ẹkọ̀rọ̀ (%s)" + +msgid "workspace.path.actions.merge-nodes" +msgstr "Da ìpàdé pò (%s)" + +msgid "workspace.path.actions.move-nodes" +msgstr "Gbé ìpàde (%s)" + +msgid "workspace.path.actions.separate-nodes" +msgstr "Ya ̣ìpàdé sọ́tọ̀ (%s)" + +msgid "workspace.path.actions.snap-nodes" +msgstr "Ìmọ̀lára ìpàdé (%s)" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.add-flex" +msgstr "Fi àrọ ètò ìrísí kun" + +msgid "workspace.shape.menu.add-grid" +msgstr "Fi gírídì ètò ìrísị kun" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.back" +msgstr "dáa padà séyiǹ" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.backward" +msgstr "dá padà sọ́wọ èyiǹ" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.copy" +msgstr "Ṣẹ̀dà" + +msgid "workspace.shape.menu.create-annotation" +msgstr "Ṣèda àlàyé" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.create-artboard-from-selection" +msgstr "Yíyàn sí pátákó" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.create-component" +msgstr "Ṣẹ́dá àkóónú" + +msgid "workspace.shape.menu.create-multiple-components" +msgstr "Ṣẹ̀dá ọ̀pọ̀lọpọ̀ àkóónú" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.cut" +msgstr "Gé" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete" +msgstr "Parẹ́" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete-flow-start" +msgstr "Pa ìbẹ̀ẹ̀rè ìsàn rẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.detach-instance" +msgstr "ṣẹ́ àpẹ̣ẹre yọ nípò" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.detach-instances-in-bulk" +msgstr "Ṣẹ́ àwọn àpẹẹrẹ yọ nípò" + +msgid "workspace.shape.menu.difference" +msgstr "Ìyàtọ̀" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.duplicate" +msgstr "Sẹ ẹ̀dà" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.edit" +msgstr "Sàtúnṣe" + +msgid "workspace.shape.menu.exclude" +msgstr "Ṣà yọ sílè" + +msgid "workspace.shape.menu.flatten" +msgstr "Tẹ́ pẹrẹsẹ" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flip-horizontal" +msgstr "Ìyí padà oníbùú" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flip-vertical" +msgstr "Ìyí padà olóòró" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flow-start" +msgstr "Ìbẹ̀rè ìṣàn" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.forward" +msgstr "Mú wá sọ́wọ́ iwájú" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.front" +msgstr "Mú wá sí wájú" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.go-main" +msgstr "Lọ sí olórí fáìlì àkóónú" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.group" +msgstr "Àwùjọ" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.hide" +msgstr "Tọ́jú" + +msgid "workspace.shape.menu.hide-ui" +msgstr "Fihàn/ Tọ́jú UI" + +msgid "workspace.shape.menu.intersection" +msgstr "Ìkòríta" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.lock" +msgstr "Tì" + +#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.mask" +msgstr "Ìbòjú" + +#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.paste" +msgstr "lẹ̀mọ́" + +msgid "workspace.shape.menu.path" +msgstr "Ipa ọ̀nà" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-flex" +msgstr "Yọ àrọ ètò ìrísí kúrò" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.reset-overrides" +msgstr "Ṣe àtúnṣe ìdojúkọ" + +msgid "workspace.shape.menu.restore-main" +msgstr "Dạ àkóónú pàtàkì sí pò" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.select-layer" +msgstr "Yan ìpele" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show" +msgstr "Ṣà fihàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-in-assets" +msgstr "Ṣafihàn nínú atọ́ka àwọn ìgbìmọ̀ ìní" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-main" +msgstr "Ṣà fihàn àkóónú pàtàkì" + +msgid "workspace.shape.menu.thumbnail-remove" +msgstr "Yọ àwòrán aláṣojú kúrò" + +msgid "workspace.shape.menu.thumbnail-set" +msgstr "Fi sípò àwòrań aláṣojú" + +msgid "workspace.shape.menu.transform-to-path" +msgstr "Yípadà sí pópó ọ̀nà" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.ungroup" +msgstr "Ṣe àìkójọ" + +msgid "workspace.shape.menu.union" +msgstr "Ìbáṣepò" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.unlock" +msgstr "Ṣíí" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.unmask" +msgstr "Sí ìbòjú" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.update-components-in-bulk" +msgstr "Mímú àwọn ọ̀rọ̀ àkóónú pàtàkì dójú ìwọ̀n" + +msgid "workspace.sidebar.collapse" +msgstr "Wó òpó ègbẹ́" + +msgid "workspace.sidebar.expand" +msgstr "Fẹ òpó ẹ̀gbẹ́" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.sidebar.history" +msgstr "Ìtàn (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.sidebar.layers" +msgstr "Àwọn ìpele" + +msgid "workspace.sidebar.layers.components" +msgstr "Àwọn àkóónú" + +msgid "workspace.sidebar.layers.frames" +msgstr "Àwọn pátákó" + +msgid "workspace.sidebar.layers.groups" +msgstr "Àkójọ" + +msgid "workspace.sidebar.layers.images" +msgstr "Àwọn àwòrán" + +msgid "workspace.sidebar.layers.masks" +msgstr "Àwọn ìbòjú" + +msgid "workspace.sidebar.layers.search" +msgstr "Àwọn ìpele wíwá" + +msgid "workspace.sidebar.layers.shapes" +msgstr "Àwọn ìrísí" + +msgid "workspace.sidebar.layers.texts" +msgstr "Àwọn àyọkà" + +#: src/app/main/ui/workspace/sidebar/options/menus/svg_attrs.cljs, src/app/main/ui/inspect/attributes/svg.cljs +msgid "workspace.sidebar.options.svg-attrs.title" +msgstr "Gbígbé àwọn ànímọ́ SVG wọlé wá" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "workspace.sidebar.sitemap" +msgstr "Àwọn abala" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.sitemap" +msgstr "Máàpù ojú ìlà" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.assets" +msgstr "Àwọn ohun ìní" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.color-palette" +msgstr "Pálètì àwọ̀ (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.comments" +msgstr "Àwọn ìdáásí (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.curve" +msgstr "Ìṣépo (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.ellipse" +msgstr "Àlàfo (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.frame" +msgstr "Pátákó (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.image" +msgstr "Àwòrán(%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.move" +msgstr "Gbé (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.path" +msgstr "Pópó ọ̀nà (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.rect" +msgstr "Onígun mẹ́rin (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.shortcuts" +msgstr "Àwón ọ̀nà àbùjá (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text" +msgstr "Àyọkà (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text-palette" +msgstr "Àwọn ohun ìtẹ̀wé (%s)" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.empty" +msgstr "Di ìgbà yìí kò sí àyípadà nínú ìtàn" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.delete" +msgstr "Paarẹ́%s" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.modify" +msgstr "Àtuńṣe %s" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.move" +msgstr "Àwọn ohun tí a ti gbé lọ" + +msgid "workspace.undo.entry.multiple.circle" +msgstr "Awọn àyíká" + +msgid "workspace.undo.entry.multiple.color" +msgstr "Àwọn ohun àmúṣọrọ̀ àwọ̀" + +msgid "workspace.undo.entry.multiple.component" +msgstr "Àkóónú" + +msgid "workspace.undo.entry.multiple.curve" +msgstr "Àwọn ẹkọ̀rọ̀" + +msgid "workspace.undo.entry.multiple.frame" +msgstr "Pátákó" + +msgid "workspace.undo.entry.multiple.group" +msgstr "Àwọn àkójọ" + +msgid "workspace.undo.entry.multiple.media" +msgstr "Àwọn ohun ìyì àwòrán" + +msgid "workspace.undo.entry.multiple.multiple" +msgstr "Àwọn ǹǹkan" + +msgid "workspace.undo.entry.multiple.page" +msgstr "Àwọn ojú awé" + +msgid "workspace.undo.entry.multiple.path" +msgstr "Àwọn ẹ̀bá ọ̀nà" + +msgid "workspace.undo.entry.multiple.rect" +msgstr "Àwọn onígun mẹ́rin" + +msgid "workspace.undo.entry.multiple.shape" +msgstr "Ìrísí" + +msgid "workspace.undo.entry.multiple.text" +msgstr "Àwọn àyọkà" + +msgid "workspace.undo.entry.multiple.typography" +msgstr "Àwọn ohun ìyì ìwé títẹ̀" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.new" +msgstr "Titun %s" + +msgid "workspace.undo.entry.single.circle" +msgstr "Àyíká" + +msgid "workspace.undo.entry.single.color" +msgstr "Ohun àmúṣọrọ̀ àwọ̀" + +msgid "workspace.undo.entry.single.component" +msgstr "Àkóónú" + +msgid "workspace.undo.entry.single.curve" +msgstr "Ẹkọ̀rọ̀" + +msgid "workspace.undo.entry.single.frame" +msgstr "Pátákó" + +msgid "workspace.undo.entry.single.group" +msgstr "Àkójọ" + +msgid "workspace.undo.entry.single.image" +msgstr "Àwòrán" + +msgid "workspace.undo.entry.single.media" +msgstr "Ohun àmúṣọrọ̀ èyà àwòrán" + +msgid "workspace.undo.entry.single.multiple" +msgstr "Ohun" + +msgid "workspace.undo.entry.single.page" +msgstr "Ojú awẹ́" + +msgid "workspace.undo.entry.single.path" +msgstr "Pópó ònà" + +msgid "workspace.undo.entry.single.rect" +msgstr "Onígun mẹ́rin" + +msgid "workspace.undo.entry.single.shape" +msgstr "Ìrísí" + +msgid "workspace.undo.entry.single.text" +msgstr "Àyọkà" + +msgid "workspace.undo.entry.single.typography" +msgstr "Ohun ìyì ìwé títẹ̀" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.unknown" +msgstr "Iṣẹ́ parí %s" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.title" +msgstr "Ìtàn" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.dismiss" +msgstr "Ta nù" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "Àlàyé síi" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.there-are-updates" +msgstr "Àwọn imúdójúìwọ̀n wà nínú àwọn yàrá ìkàwẹ tí a pín" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.update" +msgstr "Ìmúdójúìwọ̀n" + +msgid "workspace.viewport.click-to-close-path" +msgstr "Tẹ̀ láti pa pópó ọ̀nà dé" diff --git a/frontend/translations/zh_CN.po b/frontend/translations/zh_CN.po index c7f736a1f..247639c11 100644 --- a/frontend/translations/zh_CN.po +++ b/frontend/translations/zh_CN.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-01-12 23:06+0000\n" "Last-Translator: Geek Squirrel \n" -"Language-Team: Chinese (Simplified) \n" +"Language-Team: Chinese (Simplified) " +"\n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -80,6 +80,14 @@ msgstr "LDAP登录" msgid "auth.login-with-oidc-submit" msgstr "OpenID登录" +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "姓名必须包含一些空格以外的字符。" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "姓名最多包含250个字符。" + #: src/app/main/ui/auth/recovery.cljs msgid "auth.new-password" msgstr "输入新的密码" @@ -112,6 +120,10 @@ msgstr "密码" msgid "auth.password-length-hint" msgstr "至少8位字符" +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "密码必须包含一些空格以外的字符。" + msgid "auth.privacy-policy" msgstr "隐私政策" @@ -158,10 +170,19 @@ msgstr "服务协议" msgid "auth.terms-privacy-agreement" msgstr "创建账号意味着您认可我们的服务条例和隐私政策。" +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "创建新账号,即代表你同意我们的[服务条例](%s)和[隐私政策](%s)。" + #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "我们已经发送了一封验证邮件到" +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "品牌设计、插图、营销物料等。" + msgid "common.publish" msgstr "发布" @@ -254,6 +275,78 @@ msgstr "开始浏览" msgid "dasboard.walkthrough-hero.title" msgstr "界面浏览" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.copied-success" +msgstr "已复制令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "生成新令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "成功创建访问令牌。" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "点击“生成新令牌”按钮来生成一个。" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "你目前还没有令牌。" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "名称是必填项" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "180天" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "30天" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "60天" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "90天" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "从不" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "已经于%s到期" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "将于%s到期" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.no-expiration" +msgstr "无到期时限" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "个人访问令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "个人访问令牌可被理解为密码认证的代替选项,常用于允许(第三方)应用访问Penpot内部API" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "令牌将于%s到期" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "令牌无到期时限" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "dashboard.add-shared" @@ -726,6 +819,9 @@ msgstr "无法加载%s字体" msgid "errors.bad-font-plural" msgstr "无法加载%s等字体" +msgid "errors.cannot-upload" +msgstr "无法上传该媒体文件。" + #: src/app/main/data/workspace.cljs msgid "errors.clipboard-not-implemented" msgstr "你的浏览器不支持该操作" @@ -763,13 +859,16 @@ msgstr "此邮箱[%s]已被标记为垃圾邮件或已被永久拉黑。" #: src/app/main/errors.cljs msgid "errors.feature-mismatch" -msgstr "看起来你正在打开一个启用了'%s'功能的文件,但当前penpot版本并不支持该功能或已" -"将其禁用。" +msgstr "看起来你正在打开一个启用了'%s'功能的文件,但当前penpot版本并不支持该功能或已将其禁用。" #: src/app/main/errors.cljs msgid "errors.feature-not-supported" msgstr "不支持功能“%s”。" +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "看起来当前启用的功能,与正在打开的文件所依赖的功能不匹配。在打开文件前,需要应用对“%s”修改。" + #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -818,6 +917,9 @@ msgstr "确认密码必须保持一致" msgid "errors.password-too-short" msgstr "密码最少需要8位字符" +msgid "errors.paste-data-validation" +msgstr "剪切板中为无效数据" + msgid "errors.profile-blocked" msgstr "个人资料已被屏蔽" @@ -831,6 +933,10 @@ msgstr "你设置了邮件免打扰(报告垃圾邮件或者多次退信)。 msgid "errors.registration-disabled" msgstr "当前禁止注册。" +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "检测到不兼容功能“%s”" + msgid "errors.team-leave.insufficient-members" msgstr "离开团队后成员不足,您可能要将其删除。" @@ -850,6 +956,13 @@ msgstr "发生了意料之外的错误。" msgid "errors.unexpected-token" msgstr "未知的令牌" +msgid "errors.validation" +msgstr "验证错误" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "文件具有不兼容的版本号" + msgid "errors.webhooks.connection" msgstr "连接错误,无法访问 URL" @@ -1079,6 +1192,9 @@ msgstr "无" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "首字母大写" +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "取消设置" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "大写" @@ -1143,6 +1259,10 @@ msgstr "快捷方式" msgid "labels.accept" msgstr "接受" +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "访问令牌" + msgid "labels.active" msgstr "激活" @@ -1244,6 +1364,9 @@ msgstr "删除邀请" msgid "labels.delete-multi-files" msgstr "删除%s个文件" +msgid "labels.discard" +msgstr "丢弃" + #: src/app/main/ui/dashboard/projects.cljs, #: src/app/main/ui/dashboard/sidebar.cljs, #: src/app/main/ui/dashboard/files.cljs, @@ -1469,6 +1592,9 @@ msgstr "角色" msgid "labels.save" msgstr "保存" +msgid "labels.search" +msgstr "搜索" + msgid "labels.search-font" msgstr "搜索字体" @@ -1493,6 +1619,9 @@ msgstr "服务不可用" msgid "labels.settings" msgstr "设置" +msgid "labels.share" +msgstr "分享" + msgid "labels.share-prototype" msgstr "分享原型" @@ -1562,10 +1691,31 @@ msgstr "(你)" msgid "labels.your-account" msgstr "你的账户" +msgid "media.choose-image" +msgstr "选择图片" + +msgid "media.gradient" +msgstr "渐变" + +msgid "media.image" +msgstr "图片" + +msgid "media.linear" +msgstr "线性" + #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "正在加载图片…" +msgid "media.radial" +msgstr "径向" + +msgid "media.solid" +msgstr "纯色" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "你的库是空白的。一旦添加为共享库,此文档库中的素材就可被用于你的其他文档中。你确定要发布它吗?" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -1605,6 +1755,30 @@ msgstr "修改电子邮件" msgid "modals.change-email.title" msgstr "修改你的电子邮件" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.copy-token" +msgstr "复制令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.expiration-date.label" +msgstr "到期时间" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "名称" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.placeholder" +msgstr "名称可以帮你记住令牌的用途" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "创建令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "生成访问令牌" + msgid "modals.create-webhook.submit-label" msgstr "创建webhook" @@ -1617,6 +1791,18 @@ msgstr "有效负载网址" msgid "modals.create-webhook.url.placeholder" msgstr "https://example.com/postreceive" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "删除令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.message" +msgstr "你确定想要删除这个令牌吗?" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "删除令牌" + #: src/app/main/ui/settings/delete_account.cljs msgid "modals.delete-account.cancel" msgstr "取消操作并保留我的账号" @@ -1645,6 +1831,12 @@ msgstr "你确定想要删除这个对话?该讨论串里的所有评论都会 msgid "modals.delete-comment-thread.title" msgstr "删除对话" +msgid "modals.delete-component-annotation.message" +msgstr "你确定想要删除这个注释?" + +msgid "modals.delete-component-annotation.title" +msgstr "删除注释" + #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-file-confirm.accept" msgstr "删除文档" @@ -1708,6 +1900,18 @@ msgid_plural "modals.delete-shared-confirm.accept" msgstr[0] "删除文件" msgstr[1] "批量删除文件" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "" +msgstr[1] "" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.scd-message" +msgid_plural "modals.delete-shared-confirm.activated.scd-message" +msgstr[0] "该库被以下文档使用: " +msgstr[1] "这些库被以下文档使用: " + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-shared-confirm.message" @@ -1834,6 +2038,15 @@ msgstr "您是此团队的所有者,你确定想要将所有者转让给该成 msgid "modals.promote-owner-confirm.title" msgstr "新增团队所有者" +msgid "modals.publish-empty-library.accept" +msgstr "发布" + +msgid "modals.publish-empty-library.message" +msgstr "你的库是空白的。你确定想要发布它?" + +msgid "modals.publish-empty-library.title" +msgstr "发布空白库" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.remove-shared-confirm.accept" @@ -1904,6 +2117,10 @@ msgstr "你即将更新共享库中的一个组件。这可能会对使用该组 msgid "modals.update-remote-component.message" msgstr "更新共享库中的一个组件" +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "有新版本可用,请刷新页面" + #: src/app/main/ui/dashboard/team.cljs msgid "notifications.invitation-email-sent" msgstr "成功发送邀请" @@ -1975,12 +2192,33 @@ msgstr "贡献指南" msgid "onboarding-v2.welcome.title" msgstr "欢迎来到Penpot!" +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "继续创建团队" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "以个人身份继续" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "创建团队 & 邀请" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "创建团队并发送邀请" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "你可以稍后再邀请成员" + msgid "onboarding.choice.team-up.create-team-desc" msgstr "命名团队后,您将能够邀请他人加入。" msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "输入团队名称" +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "创建团队" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "创建团队但暂不邀请" + msgid "onboarding.choice.team-up.invite-members" msgstr "邀请成员" @@ -1990,6 +2228,12 @@ msgstr "记得将开发人员、设计师、经理……等各类人员都加进 msgid "onboarding.choice.team-up.roles" msgstr "邀请角色:" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "以个人身份开始" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "你可以稍后再创建团队。" + msgid "onboarding.newsletter.accept" msgstr "是的,订阅" @@ -2036,18 +2280,170 @@ msgstr "Penpot" msgid "profile.recovery.go-to-login" msgstr "去登录" -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "settings.multiple" -msgstr "混合" +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "你最熟悉哪个设计工具?" -# SECTIONS -msgid "shortcut-section.basics" -msgstr "基础" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "非常多" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canva" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "设计师" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "开发者" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "深入了解Penpot的精彩之处" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "创始人/副总裁" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "我是一名自由职业者" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "从我的团队项目获得邀请码 " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "...界面设计,视觉素材,设计系统等。" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "InVision" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "给我的团队项目做反馈" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "让我们开始吧!" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "产品经理/项目经理" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "市场营销" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "50以上" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "下一项" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "无" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "其他(请注明)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "我在做个人项目" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "前一项" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "你计划用Penpot做什么?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "你是哪种身份?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Sketch" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "开始" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "开始着手我的项目" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "学生/教师" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "你的团队有多少人?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "试用Penpot,来看它是否适合团队 " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "在本地部署Penpot前进行试用" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "...线框图,用户轨迹和用户流程,导航树等。" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "从事概念构想的工作" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "你的反馈将帮助我们更好地理解你的习惯和偏好,以便我们不断改进Penpot,使其成为一个有用且好用的工具。" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "settings.multiple" +msgstr "混合" + +# SECTIONS +msgid "shortcut-section.basics" +msgstr "基础" msgid "shortcut-section.dashboard" msgstr "仪表盘" @@ -2407,6 +2803,9 @@ msgstr "选择所有" msgid "shortcuts.select-next" msgstr "选择下一个图层" +msgid "shortcuts.select-parent-layer" +msgstr "选择上级图层" + msgid "shortcuts.select-prev" msgstr "选择上一个图层" @@ -2434,6 +2833,18 @@ msgstr "启用测量" msgid "shortcuts.stop-measure" msgstr "停止测量" +msgid "shortcuts.text-align-center" +msgstr "水平居中" + +msgid "shortcuts.text-align-justify" +msgstr "两端对齐" + +msgid "shortcuts.text-align-left" +msgstr "靠左对齐" + +msgid "shortcuts.text-align-right" +msgstr "靠右对齐" + msgid "shortcuts.thumbnail-set" msgstr "设置缩略图" @@ -2507,6 +2918,10 @@ msgstr "变焦镜头放大" msgid "shortcuts.zoom-selected" msgstr "缩放到选定对象" +#: src/app/main/ui/dashboard/team.cljs +msgid "team.webhooks.max-length" +msgstr "Webhook的名称最多包含2048个字符。" + #: src/app/main/ui/dashboard/files.cljs msgid "title.dashboard.files" msgstr "%s - Penpot" @@ -2535,6 +2950,10 @@ msgstr "共享库 - %s - Penpot" msgid "title.default" msgstr "Penpot - 面向团队,设计自由" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "个人资料 — 访问令牌" + #: src/app/main/ui/settings/feedback.cljs msgid "title.settings.feedback" msgstr "提交反馈 - Penpot" @@ -2729,6 +3148,9 @@ msgstr "本地库" msgid "workspace.assets.not-found" msgstr "未找到素材" +msgid "workspace.assets.open-library" +msgstr "打开库文档" + #: src/app/main/ui/workspace/sidebar/sitemap.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs @@ -2749,6 +3171,10 @@ msgid_plural "workspace.assets.selected-count" msgstr[0] "已选中%s个物件" msgstr[1] "已选中%s个物件" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "共享库" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" @@ -2945,6 +3371,10 @@ msgstr "未保存的修改" msgid "workspace.header.viewer" msgstr "预览模式(%s)" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "缩放" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.zoom-fill" msgstr "填充 - 填充比例" @@ -2965,6 +3395,21 @@ msgstr "全屏" msgid "workspace.header.zoom-selected" msgstr "缩放到选定的位置" +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "编辑网格" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "退出" + +msgid "workspace.layout_grid.editor.title" +msgstr "编辑网格" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "完成" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "定位" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "添加" @@ -2973,6 +3418,14 @@ msgstr "添加" msgid "workspace.libraries.colors" msgstr "%s种颜色" +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "你的库中还没有颜色风格" + +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "你的库中还没有排版风格" + #: src/app/main/ui/workspace/colorpicker/libraries.cljs, #: src/app/main/ui/workspace/colorpalette.cljs msgid "workspace.libraries.colors.file-library" @@ -3059,6 +3512,10 @@ msgstr "%s个排版" msgid "workspace.libraries.update" msgstr "更新" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "查看所有修改" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.updates" msgstr "更新" @@ -3090,6 +3547,21 @@ msgstr "剪辑内容" msgid "workspace.options.component" msgstr "组件" +msgid "workspace.options.component.annotation" +msgstr "注释" + +msgid "workspace.options.component.copy" +msgstr "复制" + +msgid "workspace.options.component.create-annotation" +msgstr "创建注释" + +msgid "workspace.options.component.edit-annotation" +msgstr "编辑注释" + +msgid "workspace.options.component.swap.empty" +msgstr "你的库中还没有素材" + #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "限制条件" @@ -3183,6 +3655,10 @@ msgstr "填充" msgid "workspace.options.flows.add-flow-start" msgstr "增加流程起点" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "流程" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "流程起点" @@ -3832,14 +4308,26 @@ msgstr "边框" msgid "workspace.options.stroke-cap.circle-marker" msgstr "圆形标记" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "圆形" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "钻石标记" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "钻石" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "箭头" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "箭头" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "无边框" @@ -3856,11 +4344,19 @@ msgstr "方头" msgid "workspace.options.stroke-cap.square-marker" msgstr "方形标记" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "矩形" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "三角箭头" -msgid "workspace.options.stroke-color" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "三角形" + +msgid "workspace.options.stroke-color" msgstr "线条颜色" msgid "workspace.options.stroke-width" @@ -4034,6 +4530,9 @@ msgstr "对接节点 (%s)" msgid "workspace.shape.menu.add-flex" msgstr "添加弹性布局" +msgid "workspace.shape.menu.add-grid" +msgstr "添加网格布局" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.back" msgstr "移至底层" @@ -4046,6 +4545,9 @@ msgstr "向下移动一层" msgid "workspace.shape.menu.copy" msgstr "复制" +msgid "workspace.shape.menu.create-annotation" +msgstr "创建注释" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.create-artboard-from-selection" msgstr "转为画板" @@ -4054,6 +4556,9 @@ msgstr "转为画板" msgid "workspace.shape.menu.create-component" msgstr "创建组件" +msgid "workspace.shape.menu.create-multiple-components" +msgstr "创建多个组件" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.cut" msgstr "剪切" @@ -4321,6 +4826,13 @@ msgstr "文本(%s)" msgid "workspace.toolbar.text-palette" msgstr "排字式样 (%s)" +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**检查模式**(不可编辑)" + +msgid "workspace.top-bar.read-only.done" +msgstr "完成" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "目前没有历史修改" @@ -4440,6 +4952,10 @@ msgstr "历史" msgid "workspace.updates.dismiss" msgstr "忽略" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "更多信息" + #: src/app/main/data/workspace/libraries.cljs msgid "workspace.updates.there-are-updates" msgstr "共享库有更新" @@ -4450,524 +4966,3 @@ msgstr "更新" msgid "workspace.viewport.click-to-close-path" msgstr "单击以闭合路径" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "定位" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "完成" - -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "编辑网格" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "退出" - -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "你的库中还没有排版风格" - -msgid "workspace.options.component.swap.empty" -msgstr "你的库中还没有素材" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "流程" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "钻石" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "箭头" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "矩形" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "三角形" - -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**检查模式**(不可编辑)" - -msgid "workspace.top-bar.read-only.done" -msgstr "完成" - -msgid "media.solid" -msgstr "纯色" - -msgid "media.linear" -msgstr "线性" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.no-access-tokens" -msgstr "你目前还没有令牌。" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "名称是必填项" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "180天" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "30天" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-60-days" -msgstr "60天" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-90-days" -msgstr "90天" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-never" -msgstr "从不" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "已经于%s到期" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "个人访问令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-expire" -msgstr "令牌将于%s到期" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expires-on" -msgstr "将于%s到期" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.no-expiration" -msgstr "无到期时限" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "文件具有不兼容的版本号" - -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "看起来当前启用的功能,与正在打开的文件所依赖的功能不匹配。在打开文件前,需要" -"应用对“%s”修改。" - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "检测到不兼容功能“%s”" - -msgid "errors.validation" -msgstr "验证错误" - -msgid "errors.paste-data-validation" -msgstr "剪切板中为无效数据" - -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "取消设置" - -msgid "labels.share" -msgstr "分享" - -msgid "labels.search" -msgstr "搜索" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "你的库是空白的。一旦添加为共享库,此文档库中的素材就可被用于你的其他文档中。" -"你确定要发布它吗?" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.copy-token" -msgstr "复制令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.expiration-date.label" -msgstr "到期时间" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.label" -msgstr "名称" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.placeholder" -msgstr "名称可以帮你记住令牌的用途" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.submit-label" -msgstr "创建令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.title" -msgstr "生成访问令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.title" -msgstr "删除令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.message" -msgstr "你确定想要删除这个令牌吗?" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.scd-message" -msgid_plural "modals.delete-shared-confirm.activated.scd-message" -msgstr[0] "该库被以下文档使用: " -msgstr[1] "这些库被以下文档使用: " - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.no-files-message" -msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "" -msgstr[1] "" - -msgid "modals.publish-empty-library.accept" -msgstr "发布" - -msgid "modals.publish-empty-library.message" -msgstr "你的库是空白的。你确定想要发布它?" - -msgid "modals.publish-empty-library.title" -msgstr "发布空白库" - -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "有新版本可用,请刷新页面" - -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "继续创建团队" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "你可以稍后再创建团队。" - -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "以个人身份开始" - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "以个人身份继续" - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "创建团队并发送邀请" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "创建团队但暂不邀请" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "创建团队 & 邀请" - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "创建团队" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "你可以稍后再邀请成员" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "...界面设计,视觉素材,设计系统等。" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "无" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "其他(请注明)" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "我在做个人项目" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "前一项" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "你计划用Penpot做什么?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Sketch" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "开始着手我的项目" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "学生/教师" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "开始" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "试用Penpot,来看它是否适合团队 " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "在本地部署Penpot前进行试用" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "从事概念构想的工作" - -#: src/app/main/ui/dashboard/team.cljs -msgid "team.webhooks.max-length" -msgstr "Webhook的名称最多包含2048个字符。" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "title.settings.access-tokens" -msgstr "个人资料 — 访问令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-not-expire" -msgstr "令牌无到期时限" - -msgid "workspace.shape.menu.add-grid" -msgstr "添加网格布局" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "给我的团队项目做反馈" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "品牌设计、插图、营销物料等。" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "非常多" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "...线框图,用户轨迹和用户流程,导航树等。" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "你最熟悉哪个设计工具?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "InVision" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "31-50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "50以上" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "我是一名自由职业者" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.copied-success" -msgstr "已复制令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "生成新令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "点击“生成新令牌”按钮来生成一个。" - -msgid "labels.discard" -msgstr "丢弃" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "创始人/副总裁" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Figma" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "从我的团队项目获得邀请码 " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "让我们开始吧!" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "市场营销" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "下一项" - -msgid "shortcuts.text-align-center" -msgstr "水平居中" - -msgid "shortcuts.text-align-left" -msgstr "靠左对齐" - -msgid "shortcuts.text-align-justify" -msgstr "两端对齐" - -msgid "workspace.options.component.annotation" -msgstr "注释" - -msgid "workspace.options.component.copy" -msgstr "复制" - -msgid "workspace.options.component.create-annotation" -msgstr "创建注释" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "圆形" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "更多信息" - -msgid "modals.delete-component-annotation.message" -msgstr "你确定想要删除这个注释?" - -msgid "workspace.shape.menu.create-annotation" -msgstr "创建注释" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Adobe XD" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Canva" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.accept" -msgstr "删除令牌" - -msgid "modals.delete-component-annotation.title" -msgstr "删除注释" - -#: src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.empty-palette" -msgstr "你的库中还没有颜色风格" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "11-30" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "设计师" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "开发者" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "深入了解Penpot的精彩之处" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "产品经理/项目经理" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "你是哪种身份?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "你的团队有多少人?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "你的反馈将帮助我们更好地理解你的习惯和偏好,以便我们不断改进Penpot,使其成为" -"一个有用且好用的工具。" - -msgid "shortcuts.select-parent-layer" -msgstr "选择上级图层" - -msgid "shortcuts.text-align-right" -msgstr "靠右对齐" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "查看所有修改" - -msgid "workspace.assets.open-library" -msgstr "打开库文档" - -msgid "workspace.options.component.edit-annotation" -msgstr "编辑注释" - -msgid "workspace.shape.menu.create-multiple-components" -msgstr "创建多个组件" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "共享库" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom" -msgstr "缩放" - -msgid "workspace.layout_grid.editor.title" -msgstr "编辑网格" - -msgid "media.radial" -msgstr "径向" - -msgid "media.gradient" -msgstr "渐变" - -msgid "media.choose-image" -msgstr "选择图片" - -msgid "media.image" -msgstr "图片" - -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "姓名必须包含一些空格以外的字符。" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "姓名最多包含250个字符。" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-not-empty" -msgstr "密码必须包含一些空格以外的字符。" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "创建新账号,即代表你同意我们的[服务条例](%s)和[隐私政策](%s)。" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "成功创建访问令牌。" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "个人访问令牌可被理解为密码认证的代替选项,常用于允许(第三方)应用访问Penpot" -"内部API" - -msgid "errors.cannot-upload" -msgstr "无法上传该媒体文件。" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.access-tokens" -msgstr "访问令牌" -- Gitee From 0cc92eccfa22df26cb3b6b578bf28ebfcfab8de7 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Wed, 24 Apr 2024 14:50:17 +0200 Subject: [PATCH 0346/1266] Revert ":sparkles: Update translations" This reverts commit 268a26b6a435054e5ec28870f781d516c176e2a7. --- frontend/translations/af.po | 549 +-- frontend/translations/ar.po | 2239 +++++----- frontend/translations/cs.po | 1171 +++-- frontend/translations/de.po | 876 ++-- frontend/translations/en.po | 411 +- frontend/translations/es.po | 389 +- frontend/translations/es_419.po | 343 +- frontend/translations/fr.po | 1285 +++--- frontend/translations/ha.po | 7097 ++++++++++++++++--------------- frontend/translations/he.po | 462 +- frontend/translations/hr.po | 1 + frontend/translations/id.po | 249 +- frontend/translations/ig.po | 2098 --------- frontend/translations/lv.po | 566 ++- frontend/translations/ms.po | 2476 +---------- frontend/translations/nl.po | 420 +- frontend/translations/pt_PT.po | 424 +- frontend/translations/ro.po | 88 +- frontend/translations/ru.po | 50 +- frontend/translations/tr.po | 1449 +++---- frontend/translations/yo.po | 4646 -------------------- frontend/translations/zh_CN.po | 1061 ++--- 22 files changed, 9320 insertions(+), 19030 deletions(-) delete mode 100644 frontend/translations/ig.po delete mode 100644 frontend/translations/yo.po diff --git a/frontend/translations/af.po b/frontend/translations/af.po index 14d5e8519..f037855e1 100644 --- a/frontend/translations/af.po +++ b/frontend/translations/af.po @@ -2,78 +2,147 @@ msgid "" msgstr "" "PO-Revision-Date: 2023-10-13 18:01+0000\n" "Last-Translator: Hugo Vermaak \n" -"Language-Team: Afrikaans " -"\n" +"Language-Team: Afrikaans \n" "Language: af\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" +"Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.1-dev\n" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "30 dae" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.add-shared" +msgstr "Voeg by as Gedeelde Biblioteek" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "Die token het nie 'n verval datum nie" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-gitlab-submit" +msgstr "GitLab" + +msgid "common.share-link.placeholder" +msgstr "Deelbare skakel sal hier verskyn" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-title" +msgstr "Wagwoord vergeet?" + +msgid "common.share-link.current-tag" +msgstr "(huidige)" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.invalid-token-error" +msgstr "Die hersteltoken is ongeldig." + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-title" +msgstr "Wonderlik om jou weer te sien!" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "Genereer nuwe token" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "auth.notifications.team-invitation-accepted" +msgstr "Het suksesvol by die span aangesluit" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.title" +msgstr "Span saam!" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "180 dae" + +msgid "dashboard.export-frames" +msgstr "Voer borde as PDF uit" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-profile" +msgstr "Wil jy dit net probeer?" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-submit" +msgstr "Herstel Wagwoord" + +#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs +msgid "dashboard.copy-suffix" +msgstr "(kopieer)" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "Die naam word vereis" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.create-new-team" +msgstr "Skep 'n nuwe span" + +msgid "common.share-link.destroy-link" +msgstr "Vernietig skakel" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.copied-success" +msgstr "Token gekopieer" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.info" +msgstr "Gaan stap deur Penpot en leer sy hoofkenmerke ken." + #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" msgstr "Reeds 'n rekening?" +msgid "common.share-link.view-all" +msgstr "Kies Alles" + #: src/app/main/ui/auth/register.cljs msgid "auth.check-your-email" msgstr "" "Gaan jou e-pos na en klik op die skakel om te verifieer en Penpot te begin " "gebruik." -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.confirm-password" -msgstr "Bevestig wagwoord" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-account" -msgstr "Skep demo rekening" +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...handelsmerk, illustrasies, bemarkingsstukke, ens." -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-profile" -msgstr "Wil jy dit net probeer?" +msgid "auth.terms-of-service" +msgstr "Diensbepalings" #: src/app/main/ui/auth/register.cljs msgid "auth.demo-warning" msgstr "" -"Dit is 'n DEMO-diens, MOENIE vir werklike werk gebruik nie, die projekte " -"sal periodiek uitgevee word." +"Dit is 'n DEMO-diens, MOENIE vir werklike werk gebruik nie, die projekte sal " +"periodiek uitgevee word." -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.email" -msgstr "E-pos" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.forgot-password" -msgstr "Wagwoord vergeet?" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.fullname" -msgstr "Volle naam" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "90 dae" #: src/app/main/ui/auth/register.cljs -msgid "auth.login-here" -msgstr "Meld hier aan" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-submit" -msgstr "Meld aan" +msgid "auth.register-title" +msgstr "Skep 'n rekening" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Wonderlik om jou weer te sien!" +#: src/app/main/ui/export.cljs +msgid "dashboard.export-frames.title" +msgstr "Voer as PDF uit" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-github-submit" -msgstr "GitHub" +#: src/app/main/ui/auth.cljs +msgid "auth.sidebar-tagline" +msgstr "Die oopbron-oplossing vir ontwerp en prototipering." -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-gitlab-submit" -msgstr "GitLab" +msgid "common.share-link.get-link" +msgstr "Kry skakel" #: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-google-submit" -msgstr "Google" +msgid "auth.register" +msgstr "Nog nie 'n rekening nie?" #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-ldap-submit" @@ -83,93 +152,79 @@ msgstr "LDAP" msgid "auth.login-with-oidc-submit" msgstr "OpenID" -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "Die naam moet 'n ander karakter as spasie bevat." +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "Het verval op %s" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "Die naam moet hoogstens 250 karakters bevat." +msgid "dashboard.export-multi" +msgstr "Voer %s Penpot lêers uit" -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.new-password" -msgstr "Tik 'n nuwe wagwoord in" +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "Wagwoord moet 'n ander karakter as spasie bevat." -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.invalid-token-error" -msgstr "Die hersteltoken is ongeldig." +msgid "common.unpublish" +msgstr "Depubliseer" -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.password-changed-successfully" -msgstr "Wagwoord suksesvol verander" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "60 dae" -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.profile-not-verified" +msgid "common.share-link.confirm-deletion-link-description" msgstr "" -"Profiel is nie geverifieer nie, verifieer asseblief profiel voordat jy " -"voortgaan." - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.recovery-token-sent" -msgstr "Wagwoordherwinningskakel na jou inkassie gestuur." - -#: src/app/main/ui/auth/verify_token.cljs -msgid "auth.notifications.team-invitation-accepted" -msgstr "Het suksesvol by die span aangesluit" +"Is jy seker jy wil hierdie skakel verwyder? As jy dit doen, is dit nie meer " +"vir enigiemand beskikbaar nie" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.password" -msgstr "Wagwoord" +msgid "dashboard.download-binary-file" +msgstr "Laai Penpot-lêer (.penpot) af" -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-length-hint" -msgstr "Ten minste 8 karakters" +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.confirm-password" +msgstr "Bevestig wagwoord" #: src/app/main/ui/auth/register.cljs -msgid "auth.password-not-empty" -msgstr "Wagwoord moet 'n ander karakter as spasie bevat." - -msgid "auth.privacy-policy" -msgstr "Privaatheidsbeleid" +msgid "auth.fullname" +msgstr "Volle naam" -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-submit" -msgstr "Herstel Wagwoord" +msgid "common.share-link.permissions-hint" +msgstr "Enigiemand met skakel sal toegang hê" -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-subtitle" -msgstr "Ons sal vir jou 'n e-pos stuur met instruksies" +msgid "common.share-link.permissions-can-comment" +msgstr "Kan kommentaar lewer" -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-title" -msgstr "Wagwoord vergeet?" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "Die token sal verval op %s" -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.recovery-submit" -msgstr "Verander jou wagwoord" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.management" +msgstr "Spanbestuur" -#: src/app/main/ui/auth/login.cljs -msgid "auth.register" -msgstr "Nog nie 'n rekening nie?" +msgid "dashboard.download-standard-file" +msgstr "Laai standaardlêer af (.svg + .json)" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.register-submit" -msgstr "Skep 'n rekening" +msgid "common.share-link.page-shared" +msgid_plural "common.share-link.page-shared" +msgstr[0] "bladsy gedeel" +msgstr[1] "%s bladsye gedeel" #: src/app/main/ui/auth/register.cljs msgid "auth.register-subtitle" msgstr "Dit is gratis, dit is oopbron" -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-title" -msgstr "Skep 'n rekening" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-submit" +msgstr "Meld aan" -#: src/app/main/ui/auth.cljs -msgid "auth.sidebar-tagline" -msgstr "Die oopbron-oplossing vir ontwerp en prototipering." +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.default-team-name" +msgstr "Jou Penpot" -msgid "auth.terms-of-service" -msgstr "Diensbepalings" +msgid "common.share-link.permissions-can-inspect" +msgstr "Kan kode inspekteer" + +msgid "common.share-link.team-members" +msgstr "Slegs spanlede" #: src/app/main/ui/auth/register.cljs msgid "auth.terms-privacy-agreement" @@ -177,83 +232,82 @@ msgstr "" "Wanneer jy 'n nuwe rekening skep, stem jy in tot ons diensbepalings en " "privaatheidsbeleid." +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.new-password" +msgstr "Tik 'n nuwe wagwoord in" + +msgid "common.share-link.title" +msgstr "Deel prototipes" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate" +msgstr "Dupliseer" + #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "Ons het 'n verifikasie-e-pos aan gestuur" -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "...handelsmerk, illustrasies, bemarkingsstukke, ens." - -msgid "common.publish" -msgstr "Publiseer" - -msgid "common.share-link.all-users" -msgstr "Alle Penpot-gebruikers" - -msgid "common.share-link.confirm-deletion-link-description" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.profile-not-verified" msgstr "" -"Is jy seker jy wil hierdie skakel verwyder? As jy dit doen, is dit nie meer " -"vir enigiemand beskikbaar nie" +"Profiel is nie geverifieer nie, verifieer asseblief profiel voordat jy " +"voortgaan." -msgid "common.share-link.current-tag" -msgstr "(huidige)" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-subtitle" +msgstr "Ons sal vir jou 'n e-pos stuur met instruksies" -msgid "common.share-link.destroy-link" -msgstr "Vernietig skakel" +#: src/app/main/ui/auth/login.cljs +msgid "auth.forgot-password" +msgstr "Wagwoord vergeet?" -msgid "common.share-link.get-link" -msgstr "Kry skakel" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.recovery-token-sent" +msgstr "Wagwoordherwinningskakel na jou inkassie gestuur." -msgid "common.share-link.link-copied-success" -msgstr "Skakel suksesvol gekopieer" +msgid "common.publish" +msgstr "Publiseer" -msgid "common.share-link.manage-ops" -msgstr "Bestuur toestemmings" +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.recovery-submit" +msgstr "Verander jou wagwoord" -msgid "common.share-link.page-shared" -msgid_plural "common.share-link.page-shared" -msgstr[0] "bladsy gedeel" -msgstr[1] "%s bladsye gedeel" +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.change-email" +msgstr "Verander e-pos" -msgid "common.share-link.permissions-can-comment" -msgstr "Kan kommentaar lewer" +msgid "auth.privacy-policy" +msgstr "Privaatheidsbeleid" -msgid "common.share-link.permissions-can-inspect" -msgstr "Kan kode inspekteer" +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.password-changed-successfully" +msgstr "Wagwoord suksesvol verander" -msgid "common.share-link.permissions-hint" -msgstr "Enigiemand met skakel sal toegang hê" +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "Die naam moet 'n ander karakter as spasie bevat." msgid "common.share-link.permissions-pages" msgstr "Bladsye gedeel" -msgid "common.share-link.placeholder" -msgstr "Deelbare skakel sal hier verskyn" - -msgid "common.share-link.team-members" -msgstr "Slegs spanlede" - -msgid "common.share-link.title" -msgstr "Deel prototipes" - -msgid "common.share-link.view-all" -msgstr "Kies Alles" - -msgid "common.unpublish" -msgstr "Depubliseer" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-account" +msgstr "Skep demo rekening" #: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.management" -msgstr "Spanbestuur" +msgid "dasboard.walkthrough-hero.title" +msgstr "Koppelvlak Deurloop" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.text" -msgstr "Penpot is bedoel vir spanne. Nooi lede om saam te werk aan projekte en lêers" +msgid "common.share-link.manage-ops" +msgstr "Bestuur toestemmings" #: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.title" -msgstr "Span saam!" +msgid "dasboard.tutorial-hero.start" +msgstr "Begin die tutoriaal" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-length-hint" +msgstr "Ten minste 8 karakters" #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.tutorial-hero.info" @@ -261,152 +315,99 @@ msgstr "" "Leer die basiese beginsels by Penpot terwyl jy pret het met hierdie " "praktiese tutoriaal." -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.start" -msgstr "Begin die tutoriaal" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.info" -msgstr "Gaan stap deur Penpot en leer sy hoofkenmerke ken." +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "Jy het tot dusver geen tokens nie." -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.start" -msgstr "Begin die toer" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"Persoonlike toegangtokens funksioneer soos 'n alternatief vir ons aanmeld-/" +"wagwoord-verifikasiestelsel en kan gebruik word om 'n toepassing toe te laat " +"om toegang tot die interne Penpot API te verkry" #: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.title" -msgstr "Koppelvlak Deurloop" +msgid "dasboard.team-hero.text" +msgstr "" +"Penpot is bedoel vir spanne. Nooi lede om saam te werk aan projekte en lêers" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.copied-success" -msgstr "Token gekopieer" +msgid "common.share-link.all-users" +msgstr "Alle Penpot-gebruikers" #: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "Genereer nuwe token" +msgid "dashboard.access-tokens.personal" +msgstr "Persoonlike toegangstokens" #: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "Toegangstoken is suksesvol geskep." +msgid "dashboard.access-tokens.expires-on" +msgstr "Verval op %s" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.empty.add-one" msgstr "Druk die knoppie \"Genereer nuwe token\" om een te genereer." -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.no-access-tokens" -msgstr "Jy het tot dusver geen tokens nie." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "Die naam word vereis" +#: src/app/main/ui/dashboard/grid.cljs +#, markdown +msgid "dashboard.empty-placeholder-drafts" +msgstr "" +"Lêers wat by biblioteke gevoeg is, sal hier verskyn. Probeer om jou lêers te " +"deel of voeg by vanaf ons [Biblioteke en sjablone](https://penpot.app/" +"libraries-templates.html)." -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "180 dae" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-github-submit" +msgstr "GitHub" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "30 dae" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-google-submit" +msgstr "Google" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-60-days" -msgstr "60 dae" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.delete-team" +msgstr "Verwyder span" #: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-90-days" -msgstr "90 dae" +msgid "dashboard.access-tokens.create.success" +msgstr "Toegangstoken is suksesvol geskep." #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.expiration-never" msgstr "Nooit" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "Het verval op %s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expires-on" -msgstr "Verval op %s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.no-expiration" -msgstr "Geen verval datum nie" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.password" +msgstr "Wagwoord" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "Persoonlike toegangstokens" +msgid "common.share-link.link-copied-success" +msgstr "Skakel suksesvol gekopieer" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"Persoonlike toegangtokens funksioneer soos 'n alternatief vir ons " -"aanmeld-/wagwoord-verifikasiestelsel en kan gebruik word om 'n toepassing " -"toe te laat om toegang tot die interne Penpot API te verkry" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.email" +msgstr "E-pos" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-expire" -msgstr "Die token sal verval op %s" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.register-submit" +msgstr "Skep 'n rekening" #: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-not-expire" -msgstr "Die token het nie 'n verval datum nie" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.add-shared" -msgstr "Voeg by as Gedeelde Biblioteek" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.change-email" -msgstr "Verander e-pos" - -#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs -msgid "dashboard.copy-suffix" -msgstr "(kopieer)" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.create-new-team" -msgstr "Skep 'n nuwe span" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.default-team-name" -msgstr "Jou Penpot" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.delete-team" -msgstr "Verwyder span" +msgid "dashboard.access-tokens.no-expiration" +msgstr "Geen verval datum nie" -msgid "dashboard.download-binary-file" -msgstr "Laai Penpot-lêer (.penpot) af" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "Die naam moet hoogstens 250 karakters bevat." -msgid "dashboard.download-standard-file" -msgstr "Laai standaardlêer af (.svg + .json)" +msgid "dashboard.export-binary-multi" +msgstr "Laai %s Penpot lêers (.penpot) af" -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.duplicate" -msgstr "Dupliseer" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.start" +msgstr "Begin die toer" #: src/app/main/ui/dashboard/file_menu.cljs msgid "dashboard.duplicate-multi" msgstr "Dupliseer %s lêers" -#: src/app/main/ui/dashboard/grid.cljs -#, markdown -msgid "dashboard.empty-placeholder-drafts" -msgstr "" -"Lêers wat by biblioteke gevoeg is, sal hier verskyn. Probeer om jou lêers " -"te deel of voeg by vanaf ons [Biblioteke en " -"sjablone](https://penpot.app/libraries-templates.html)." - -msgid "dashboard.export-binary-multi" -msgstr "Laai %s Penpot lêers (.penpot) af" - -msgid "dashboard.export-frames" -msgstr "Voer borde as PDF uit" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-frames.title" -msgstr "Voer as PDF uit" - -msgid "dashboard.export-multi" -msgstr "Voer %s Penpot lêers uit" +#: src/app/main/ui/auth/register.cljs +msgid "auth.login-here" +msgstr "Meld hier aan" diff --git a/frontend/translations/ar.po b/frontend/translations/ar.po index 400b28221..9bc152ac5 100644 --- a/frontend/translations/ar.po +++ b/frontend/translations/ar.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-01-02 16:16+0000\n" "Last-Translator: Alejandro Alonso \n" -"Language-Team: Arabic " -"\n" +"Language-Team: Arabic \n" "Language: ar\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -157,7 +157,8 @@ msgstr "شروط الخدمة" #: src/app/main/ui/auth/register.cljs msgid "auth.terms-privacy-agreement" -msgstr "عند إنشاء حساب جديد ، فإنك توافق على شروط الخدمة وسياسة الخصوصية الخاصة بنا." +msgstr "" +"عند إنشاء حساب جديد ، فإنك توافق على شروط الخدمة وسياسة الخصوصية الخاصة بنا." #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" @@ -2257,58 +2258,6 @@ msgstr "أداة انتقاء اللون" msgid "shortcuts.open-dashboard" msgstr "إذهب إلى لوحة المعلومات" -msgid "shortcuts.toggle-layers" -msgstr "تبديل الطبقات" - -msgid "shortcuts.toggle-layout-flex" -msgstr "أضف\\أزل ثني التخطيط" - -msgid "shortcuts.toggle-lock" -msgstr "قفل\\فتح" - -msgid "shortcuts.toggle-lock-size" -msgstr "قفل النسب" - -msgid "shortcuts.toggle-rules" -msgstr "إظهار\\إخفاء المسطرة" - -msgid "shortcuts.toggle-textpalette" -msgstr "تبديل لوحة النص" - -msgid "shortcuts.toggle-visibility" -msgstr "أظهر\\أخف" - -msgid "shortcuts.toggle-zoom-style" -msgstr "تبديل أسلوب التكبير" - -msgid "shortcuts.underline" -msgstr "الخط التحتي" - -msgid "shortcuts.undo" -msgstr "الغاء" - -msgid "shortcuts.ungroup" -msgstr "فك التجميع" - -msgid "shortcuts.unmask" -msgstr "كشف القناع" - -msgid "shortcuts.v-distribute" -msgstr "النشر عموديا" - -msgid "shortcuts.zoom-lense-decrease" -msgstr "تنقيص عدسة التكبير" - -msgid "shortcuts.zoom-lense-increase" -msgstr "زيادة عدسة التكبير" - -msgid "shortcuts.zoom-selected" -msgstr "كبر المحدد" - -#: src/app/main/ui/dashboard/team.cljs -msgid "team.webhooks.max-length" -msgstr "يجب الا يزيد اسم الويبهوك على 2048 حرفا" - #: src/app/main/ui/dashboard/files.cljs msgid "title.dashboard.files" msgstr "%s - Penpotعنوان ملفات لوحة القيادة" @@ -2337,10 +2286,6 @@ msgstr "المكاتب المقسمة - %s - Penpot" msgid "title.default" msgstr "Penpot - صمم حرية الفرق" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "title.settings.access-tokens" -msgstr "رموز الوصول للحساب" - #: src/app/main/ui/settings/feedback.cljs msgid "title.settings.feedback" msgstr "جواب الرد - Penpot" @@ -2357,10 +2302,6 @@ msgstr "كلمة المرور - Penpot" msgid "title.settings.profile" msgstr "واجهة الحساب - Penpot" -#: src/app/main/ui/dashboard/team.cljs -msgid "title.team-invitations" -msgstr "الدعوات - %s - Penpot" - #: src/app/main/ui/dashboard/team.cljs msgid "title.team-members" msgstr "أعضاء الفريق - %s - Penpot" @@ -2369,9 +2310,6 @@ msgstr "أعضاء الفريق - %s - Penpot" msgid "title.team-settings" msgstr "إعدادات - %s - Penpot" -msgid "title.team-webhooks" -msgstr "خطافات الويب - %s - Penpot" - #: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs msgid "title.viewer" msgstr "%s -أسلوب العرض - Penpot" @@ -2380,15 +2318,6 @@ msgstr "%s -أسلوب العرض - Penpot" msgid "title.workspace" msgstr "%s -مساحة العمل Penpot" -msgid "viewer.breaking-change.description" -msgstr "" -"وصف كسر التغييرThis shareable link is no longer valid. Create a new one or " -"ask the owner for a new one.هذا الرابط القابل للمشاركة لم يعد صالحا.صمم " -"جديدا أو اسأل مالكه للجديد" - -msgid "viewer.breaking-change.message" -msgstr "آسف" - #: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs msgid "viewer.empty-state" msgstr "No boards found on the page." @@ -2397,9 +2326,6 @@ msgstr "No boards found on the page." msgid "viewer.frame-not-found" msgstr "لم يعثر على البورد ." -msgid "viewer.header.comments-section" -msgstr "التعليقات (%s)" - #: src/app/main/ui/viewer/header.cljs msgid "viewer.header.dont-show-interactions" msgstr "لا تطهر التفاعلات" @@ -2408,16 +2334,10 @@ msgstr "لا تطهر التفاعلات" msgid "viewer.header.fullscreen" msgstr "تكبير الشاشة" -msgid "viewer.header.inspect-section" -msgstr "التفحص (%s)" - #: src/app/main/ui/viewer/header.cljs msgid "viewer.header.interactions" msgstr "التفاعلات" -msgid "viewer.header.interactions-section" -msgstr "التفاعلات (%s)" - #: src/app/main/ui/viewer/header.cljs msgid "viewer.header.share.copy-link" msgstr "نسخ الرابط" @@ -2434,9 +2354,6 @@ msgstr "أطهر التفاعلات بالنقر" msgid "viewer.header.sitemap" msgstr "خريطة الموقع" -msgid "webhooks.last-delivery.success" -msgstr "محاذاة المركز الأفقي" - #: src/app/main/ui/workspace/sidebar/align.cljs msgid "workspace.align.hcenter" msgstr "محاذاة المركز الأفقي (%s)" @@ -2506,9 +2423,6 @@ msgstr "امسح" msgid "workspace.assets.duplicate" msgstr "انسخ" -msgid "workspace.assets.duplicate-main" -msgstr "انسخ الأصل" - #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.edit" @@ -2531,16 +2445,10 @@ msgstr "اسم المجموعة" msgid "workspace.assets.libraries" msgstr "المكتبات" -msgid "workspace.assets.local-library" -msgstr "المكتبة المحلية" - #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.not-found" msgstr "الأصل غير موجود" -msgid "workspace.assets.open-library" -msgstr "افتح ملف المكتب" - #: src/app/main/ui/workspace/sidebar/sitemap.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs @@ -2565,10 +2473,6 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "مكتبة مشتركة" - #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" @@ -2604,9 +2508,6 @@ msgstr "طول الخط" msgid "workspace.assets.typography.sample" msgstr "أسلوب خط النص" -msgid "workspace.assets.typography.text-styles" -msgstr "أسلوب خط النص" - #: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs msgid "workspace.assets.typography.text-transform" msgstr "تحويل النص" @@ -2615,18 +2516,6 @@ msgstr "تحويل النص" msgid "workspace.assets.ungroup" msgstr "فك التجميع" -msgid "workspace.focus.focus-mode" -msgstr "وضع التركيز" - -msgid "workspace.focus.focus-off" -msgstr "تعطيل التركيز" - -msgid "workspace.focus.focus-on" -msgstr "تشغيل التركيز" - -msgid "workspace.focus.selection" -msgstr "تحديد" - #: src/app/main/data/workspace/libraries.cljs, #: src/app/main/ui/components/color_bullet.cljs msgid "workspace.gradients.linear" @@ -2641,110 +2530,38 @@ msgstr "الانحدار الشعاعي" msgid "workspace.header.menu.disable-dynamic-alignment" msgstr "إبطال المحاذاة الدينماكية" -msgid "workspace.header.menu.disable-scale-content" -msgstr "Disable proportional scale" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-scale-text" msgstr "إبطال المقياس النسبي" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-guides" -msgstr "إبطال الفرقعة للخ\\وط الإرشادية" - -msgid "workspace.header.menu.disable-snap-pixel-grid" -msgstr "إبطال الفرقعة للبكسل" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-dynamic-alignment" msgstr "تككين المحاذاة الدينماكية" -msgid "workspace.header.menu.enable-scale-content" -msgstr "تمكين المقياس النسبي" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-scale-text" msgstr "تمكين نص المقياس" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-guides" -msgstr "الفرقعة للخطوط الإرشادية" - -msgid "workspace.header.menu.enable-snap-pixel-grid" -msgstr "تمكين الفرقعة للبكسل" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-artboard-names" -msgstr "إخفاء أسماء البورد" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "إخفاء لون اللوحة" -msgid "workspace.header.menu.hide-pixel-grid" -msgstr "إخفاء تشبيك اللوحة" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-rules" msgstr "إخفاء المسطرات" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-textpalette" -msgstr "إخفاء لوحة أسلوب خط" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.edit" -msgstr "التحرير" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.file" -msgstr "الملف" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.help-info" -msgstr "المساعدة و المعلومة" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.preferences" -msgstr "التفضيلات" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.view" -msgstr "المنظر" - -msgid "workspace.header.menu.redo" -msgstr "إعادة" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.select-all" msgstr "حدد الجميع" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-artboard-names" -msgstr "أظهر أسماء البورد" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "أظهر لون اللوحة" -msgid "workspace.header.menu.show-pixel-grid" -msgstr "Show pixel grid" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-rules" msgstr "أظهر المسطرات" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-textpalette" -msgstr "أظهر لوخة أسلوب الخط" - -msgid "workspace.header.menu.undo" -msgstr "الإلغاء" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.reset-zoom" -msgstr "إعادة ضبط" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.save-error" msgstr "خطأ في حفظ الملف" @@ -2765,33 +2582,6 @@ msgstr "تغييرات غير محفوظة" msgid "workspace.header.viewer" msgstr "وضع العرض (%s)" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom" -msgstr "تكبير" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fill" -msgstr "مقياس الملأ" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fit" -msgstr "تقليص المقياس للتناسب" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fit-all" -msgstr "التكبير لتناسب الجميع" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-full-screen" -msgstr "تكبير الشاشة" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-selected" -msgstr "تكبير" - -msgid "workspace.layout_grid.editor.title" -msgstr "تحرير التشبيك" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "الإضافة" @@ -2800,36 +2590,16 @@ msgstr "الإضافة" msgid "workspace.libraries.colors" msgstr "%s الألوان" -#: src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.empty-palette" -msgstr "لا يوجد أنماط اللون في مكتبتك" - -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "لا يوجد أنماط الكتابة في مكتبتك" - #: src/app/main/ui/workspace/colorpicker/libraries.cljs, #: src/app/main/ui/workspace/colorpalette.cljs msgid "workspace.libraries.colors.file-library" msgstr "مكتبة الملفات" -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.hsv" -msgstr "HSV" - #: src/app/main/ui/workspace/colorpicker/libraries.cljs, #: src/app/main/ui/workspace/colorpalette.cljs msgid "workspace.libraries.colors.recent-colors" msgstr "الألوان المؤخرة" -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgb-complementary" -msgstr "RGB مكملات" - -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgba" -msgstr "RGBA" - #: src/app/main/ui/workspace/colorpicker.cljs msgid "workspace.libraries.colors.save-color" msgstr "حفظ أسلوب اللون" @@ -2858,10 +2628,6 @@ msgstr "المكتبات" msgid "workspace.libraries.library" msgstr "المكتبة" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library-updates" -msgstr "تحديث المكتبة" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "لا يوجد مكتبات مشتركة تحتاج إلى تحديث" @@ -2898,18 +2664,10 @@ msgstr "%s الكتابات" msgid "workspace.libraries.update" msgstr "التحديث" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "رؤية جميع التغييرات" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.updates" msgstr "التحديثات" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.add-interaction" -msgstr "انقر على زر +لإضافة التفاعلات" - #: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs msgid "workspace.options.blur-options.title" msgstr "الطمس" @@ -2926,31 +2684,13 @@ msgstr "تطميس المحدد" msgid "workspace.options.canvas-background" msgstr "خلفية اللوحة القماشية" -msgid "workspace.options.clip-content" -msgstr "محتوى المقطع" - #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs msgid "workspace.options.component" msgstr "العنصر" -msgid "workspace.options.component.annotation" -msgstr "حاشية" - -msgid "workspace.options.component.copy" -msgstr "النسخ" - -msgid "workspace.options.component.create-annotation" -msgstr "إنشاء حاشية" - -msgid "workspace.options.component.edit-annotation" -msgstr "تحرير حاشية" - -msgid "workspace.options.component.main" -msgstr "أصل" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints" -msgstr "قيود" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints" +msgstr "قيود" #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints.bottom" @@ -2997,47 +2737,19 @@ msgstr "تصميم" msgid "workspace.options.export" msgstr "تصدير" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "workspace.options.export-multiple" -msgstr "تحديد المصدر" - #: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs msgid "workspace.options.export.suffix" msgstr "لاحقة" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-complete" -msgstr "تم التصدير" - #: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, #: src/app/main/ui/inspect/exports.cljs msgid "workspace.options.exporting-object" msgstr "جاري التصدير…" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-object-error" -msgstr "Export failed" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-object-slow" -msgstr "التصدير بطيء بشكل غير متوقع" - #: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs msgid "workspace.options.fill" msgstr "الملأ" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.add-flow-start" -msgstr "إضافة المخطط" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow-start" -msgstr "إضافة المخطط" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow-starts" -msgstr "جاري التخطيط" - #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.auto" msgstr "تلقائي" @@ -3046,13 +2758,6 @@ msgstr "تلقائي" msgid "workspace.options.grid.column" msgstr "أعمدة" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.grid-title" -msgstr "تشبيك" - -msgid "workspace.options.grid.params.color" -msgstr "لون" - #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.params.columns" msgstr "أعمدة" @@ -3129,1181 +2834,1477 @@ msgstr "مربع" msgid "workspace.options.group-fill" msgstr "ملأ المجموعة" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.group-stroke" -msgstr "ضرب المجموعة" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color" +msgstr "اللون" -msgid "workspace.options.height" -msgstr "طول" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color-burn" +msgstr "احتراق اللون" -msgid "workspace.options.inspect" -msgstr "Inspectفحص" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color-dodge" +msgstr "انقاص كثافة اللون" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-action" -msgstr "فعل" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.darken" +msgstr "أغمق" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-after-delay" -msgstr "بعد التأخير" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.difference" +msgstr "الفارق" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation" -msgstr "الرسومات المتحركة" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.there-are-updates" +msgstr "يوجد تحديثات في المكتبة المشتركة" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-dissolve" -msgstr "تذوب" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.update" +msgstr "تحديث" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-none" -msgstr "لا شيء" +msgid "workspace.viewport.click-to-close-path" +msgstr "انقر لتغلق المسار" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-push" -msgstr "دفع" +msgid "workspace.options.interaction-out" +msgstr "خارج" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-slide" -msgstr "انزلاق" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.move" +msgstr "تحريك (%s)" -msgid "workspace.options.interaction-auto" -msgstr "تلقائي" +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "لا يوجد أنماط اللون في مكتبتك" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-background" -msgstr "إضافة تراكب الخلفية" +msgid "workspace.options.component.copy" +msgstr "النسخ" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-outside" -msgstr "عطل إذا نقر في الخارج" +msgid "workspace.options.interactions" +msgstr "التفاعلات" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay" -msgstr "إغلاق التراكب" +msgid "workspace.undo.entry.multiple.circle" +msgstr "دوائر" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay-dest" -msgstr "إغلاق التراكب: %s" +msgid "workspace.options.interaction-action" +msgstr "فعل" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-delay" -msgstr "تأخير" +msgid "workspace.options.interaction-pos-bottom-center" +msgstr "المركز السفلي" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-destination" -msgstr "وجهة" +msgid "workspace.shape.menu.transform-to-path" +msgstr "تحويل الى المسار" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-duration" -msgstr "مدة" +msgid "workspace.options.interaction-animation-push" +msgstr "دفع" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing" -msgstr "تخفيف" +msgid "workspace.options.inspect" +msgstr "Inspectفحص" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease" -msgstr "خفف" +msgid "workspace.options.interaction-pos-top-center" +msgstr "المركز العلوي" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in" -msgstr "خفف داخل" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.multiply" +msgstr "تضاعف" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in-out" -msgstr "خفف داخل و خارج" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.letter-spacing" +msgstr "تباعد الحروف" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-out" -msgstr "خفف خارج" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.direction-rtl" +msgstr "RTL" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-linear" -msgstr "خطي" +msgid "workspace.options.component.create-annotation" +msgstr "إنشاء حاشية" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-in" -msgstr "داخل" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-auto-width" +msgstr "العرض التلقائي" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-enter" -msgstr "إدخال الفأرة" +msgid "workspace.options.shadow-options.color" +msgstr "لون الظل" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-leave" -msgstr "إخراج الفأرة" +msgid "viewer.header.inspect-section" +msgstr "التفحص (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-ms" -msgstr "القوائم" +msgid "workspace.shape.menu.flatten" +msgstr "تسطيح" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to" -msgstr "الإنتقال الى" +msgid "workspace.header.menu.hide-pixel-grid" +msgstr "إخفاء تشبيك اللوحة" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to-dest" -msgstr "انتقال الى: %s" +msgid "workspace.undo.entry.multiple.page" +msgstr "صفحات" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-none" -msgstr "(غير مهيء)" +msgid "shortcuts.ungroup" +msgstr "فك التجميع" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-offset-effect" -msgstr "تأثير الإزاحة" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.empty" +msgstr "لا يوجد تغييرات في التاريخ الى الآن" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-on-click" -msgstr "بعد النقر" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin-simple" +msgstr "هامش بسيط" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay" -msgstr "فتح التراكب" +msgid "workspace.undo.entry.multiple.rect" +msgstr "مستطيلات" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay-dest" -msgstr "فتح التراكب: %s" +msgid "shortcuts.zoom-selected" +msgstr "كبر المحدد" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-url" -msgstr "رابط مفتوح" +msgid "workspace.options.grid.params.color" +msgstr "لون" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-out" -msgstr "خارج" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.group" +msgstr "مجموعة" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-center" -msgstr "المركز السفلي" +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs +msgid "workspace.options.size-presets" +msgstr "الإعدادات المسبقة للحجم" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-left" -msgstr "اأسفل اليسار" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin" +msgstr "هامش" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-right" -msgstr "أسفل اليمين" +msgid "workspace.options.opacity" +msgstr "العتامة" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-center" -msgstr "مركز" +msgid "workspace.options.component.edit-annotation" +msgstr "تحرير حاشية" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-manual" -msgstr "يدوي" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.file" +msgstr "الملف" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-center" -msgstr "المركز العلوي" +msgid "workspace.undo.entry.multiple.media" +msgstr "الأصول الرسومية" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-left" -msgstr "أعلى اليسار" +msgid "workspace.options.show-in-viewer" +msgstr "أظهر في وضع العرض" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-right" -msgstr "أعلى اليمين" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.lowercase" +msgstr "أحرف صغيرة" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-position" -msgstr "موضع" +msgid "workspace.undo.entry.multiple.group" +msgstr "مجموعات" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-preserve-scroll" -msgstr "حفظ موضع التمرير" +msgid "workspace.shape.menu.create-multiple-components" +msgstr "إنشاء عناصر جديدة" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-prev-screen" -msgstr "الشاشة السابقة" +msgid "webhooks.last-delivery.success" +msgstr "محاذاة المركز الأفقي" + +msgid "workspace.options.stroke-width" +msgstr "عرض الضرب" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-relative-to" -msgstr "بالنسبة الى" +msgid "workspace.options.interaction-easing-ease-out" +msgstr "خفف خارج" + +msgid "workspace.options.x" +msgstr "X محور" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-self" msgstr "الذات" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay" -msgstr "تبديل التراكب" +msgid "workspace.shape.menu.path" +msgstr "طريق" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay-dest" -msgstr "تبديل التراكب: %s" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsety" +msgstr "Y" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-trigger" -msgstr "مشغل" +msgid "workspace.focus.focus-mode" +msgstr "وضع التركيز" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-url" -msgstr "الرابط المفتوح" +msgid "workspace.options.interaction-ms" +msgstr "القوائم" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-hovering" -msgstr "حين التحوم" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.right" +msgstr "يمين" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-pressing" -msgstr "حين الضغط" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.ellipse" +msgstr "الشكل البيضاوي (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interactions" -msgstr "التفاعلات" +msgid "workspace.sidebar.layers.groups" +msgstr "مجموعات" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.color" -msgstr "اللون" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "مستطيل" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.color-burn" -msgstr "احتراق اللون" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-left" +msgstr "أعلى اليسار" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.color-dodge" -msgstr "انقاص كثافة اللون" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.color-palette" +msgstr "لوحة اللون (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.darken" -msgstr "أغمق" +msgid "workspace.undo.entry.multiple.frame" +msgstr "لوحة" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.difference" -msgstr "الفارق" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-min-h" +msgstr "الحد الأدنى للطول" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.exclusion" -msgstr "الإستبعاد" +msgid "workspace.path.actions.add-node" +msgstr "أضف العقدة (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.hard-light" -msgstr "ضوء الثابت" +msgid "workspace.options.component.main" +msgstr "أصل" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.hue" -msgstr "مسحة" +msgid "workspace.undo.entry.single.frame" +msgstr "لوحة" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.lighten" -msgstr "تفتيح" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-starts" +msgstr "جاري التخطيط" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.luminosity" -msgstr "لمعان" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-position" +msgstr "موضع" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.multiply" -msgstr "تضاعف" +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.more-colors" +msgstr "المزيد من الألوان" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.normal" -msgstr "عادي" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-bottom" +msgstr "محاذاة الأسفل" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.overlay" -msgstr "تراكب" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.new" +msgstr "جديد %s" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.saturation" -msgstr "التشبع" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.create-artboard-from-selection" +msgstr "تحديد محتوى اللوحة" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.screen" -msgstr "شاشة" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-top-right" +msgstr "أعلى اليمين" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.soft-light" -msgstr "ضوء خافت" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-in" +msgstr "داخل" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title" -msgstr "طبقة" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay" +msgstr "تبديل التراكب" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title.group" -msgstr "طبقات المجموعة" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow" +msgstr "سهم المثلث" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title.multiple" -msgstr "الطبقات المحددة" +msgid "workspace.undo.entry.multiple.curve" +msgstr "منحنيات" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.advanced-ops" -msgstr "خيارات متقدمة" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-guides" +msgstr "إبطال الفرقعة للخ\\وط الإرشادية" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-max-h" -msgstr "أقصى ارتفاع" +msgid "workspace.path.actions.snap-nodes" +msgstr "كسر العقد (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-max-w" -msgstr "أقصى عرض" +msgid "workspace.undo.entry.multiple.multiple" +msgstr "أشياء" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-min-h" -msgstr "الحد الأدنو للارتفاع" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-slide" +msgstr "انزلاق" #: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs msgid "workspace.options.layout-item.layout-item-min-w" msgstr "الحد الأدنى للعرض" #: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-max-h" -msgstr "أقصى ارتفاع" +msgid "workspace.options.layout-item.layout-item-min-h" +msgstr "الحد الأدنو للارتفاع" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-max-w" -msgstr "أقصى عرض" +msgid "workspace.sidebar.layers.masks" +msgstr "قناعات" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-min-h" -msgstr "الحد الأدنى للطول" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.screen" +msgstr "شاشة" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-min-w" -msgstr "الحد الأدنى للعرض" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "رؤية جميع التغييرات" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.bottom" -msgstr "أسفل" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.inner-shadow" +msgstr "التظليل الداخلي" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column" -msgstr "عمود" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.frame" +msgstr "لوحة (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column-reverse" -msgstr "العموج العكسي" +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "لا يوجد أنماط الكتابة في مكتبتك" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row" -msgstr "الصف" +#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.paste" +msgstr "معجون" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row-reverse" -msgstr "الصف العكسي" +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.selection-fill" +msgstr "اختر نوع الملأ" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.gap" -msgstr "فجوة" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-middle" +msgstr "محاذاة الوسط" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.left" -msgstr "شمال" +msgid "viewer.breaking-change.description" +msgstr "" +"وصف كسر التغييرThis shareable link is no longer valid. Create a new one or " +"ask the owner for a new one.هذا الرابط القابل للمشاركة لم يعد صالحا.صمم " +"جديدا أو اسأل مالكه للجديد" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin" -msgstr "هامش" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-background" +msgstr "إضافة تراكب الخلفية" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin-all" -msgstr "جميع النواحي" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.unknown" +msgstr "انتهت العملية %s" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin-simple" -msgstr "هامش بسيط" +msgid "shortcuts.zoom-lense-increase" +msgstr "زيادة عدسة التكبير" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.packed" -msgstr "معباة" +msgid "workspace.shape.menu.add-grid" +msgstr "إضافة تخطيط التشبيك" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding" -msgstr "حشوة" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-complete" +msgstr "تم التصدير" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding-all" -msgstr "جميع النواحي" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-delay" +msgstr "تأخير" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding-simple" -msgstr "حشوة بسيطة" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.luminosity" +msgstr "لمعان" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.right" -msgstr "يمين" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flip-vertical" +msgstr "التوجيه الرئسي" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.space-around" -msgstr "التباعد حول" +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.position" +msgstr "الموضع" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square" +msgstr "مربع" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-justify" +msgstr "تعديل (%s)" #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.space-between" msgstr "التباعد بين" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.top" -msgstr "أعلى" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.uppercase" +msgstr "الأحرف الكبيرة" -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.more-colors" -msgstr "المزيد من الألوان" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "تكبير" -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.more-lib-colors" -msgstr "المزيد من ألوان المكتبة" +msgid "workspace.options.component.annotation" +msgstr "حاشية" -msgid "workspace.options.opacity" -msgstr "العتامة" +msgid "shortcuts.toggle-layers" +msgstr "تبديل الطبقات" -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.position" -msgstr "الموضع" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-preserve-scroll" +msgstr "حفظ موضع التمرير" -#: src/app/main/ui/workspace/sidebar/options.cljs -msgid "workspace.options.prototype" -msgstr "النموذج المبدئي" +msgid "workspace.undo.entry.single.typography" +msgstr "أصل الكتابة" -msgid "workspace.options.radius" -msgstr "نصف القطر" +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.selection-color" +msgstr "الألوان المختارة" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-bottom-left" -msgstr "أسفل اليسار" +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.more-lib-colors" +msgstr "المزيد من ألوان المكتبة" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-bottom-right" -msgstr "أسفل اليمين" +msgid "workspace.header.menu.disable-snap-pixel-grid" +msgstr "إبطال الفرقعة للبكسل" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-top-left" -msgstr "أعلى الشمال" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in" +msgstr "خفف داخل" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-top-right" -msgstr "أعلى اليمين" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.solid" +msgstr "صلب" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius.all-corners" -msgstr "كل الزوايا" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.delete" +msgstr "محذوف %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.top" +msgstr "أعلى" #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.radius.single-corners" msgstr "زوايا مستقلة" -msgid "workspace.options.recent-fonts" -msgstr "مؤخر" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.retry" -msgstr "أعد المحاولة" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.dotted" +msgstr "منقط" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.rotation" -msgstr "دوران" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-artboard-names" +msgstr "إخفاء أسماء البورد" -msgid "workspace.options.search-font" -msgstr "البخث عن نوع الخط" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.backward" +msgstr "أرسل الى الخلف" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.select-a-shape" msgstr "اختر الشكل أو اللوحة لجر الإتصال الى لوحة أو شكل آخر" -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.selection-color" -msgstr "الألوان المختارة" - -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.selection-fill" -msgstr "اختر نوع الملأ" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.selection-stroke" -msgstr "ضرب الإختيار" +msgid "workspace.options.stroke" +msgstr "ضرب" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.blur" -msgstr "تطميس" +msgid "workspace.layout_grid.editor.title" +msgstr "تحرير التشبيك" -msgid "workspace.options.shadow-options.color" -msgstr "لون الظل" +msgid "workspace.undo.entry.single.page" +msgstr "صفحة" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.drop-shadow" -msgstr "إسقاط الظل" +#: src/app/main/ui/dashboard/team.cljs +msgid "team.webhooks.max-length" +msgstr "يجب الا يزيد اسم الويبهوك على 2048 حرفا" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.inner-shadow" -msgstr "التظليل الداخلي" +msgid "workspace.sidebar.layers.images" +msgstr "صور" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.offsetx" -msgstr "X" +msgid "workspace.header.menu.show-pixel-grid" +msgstr "Show pixel grid" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.offsety" -msgstr "Y" +msgid "workspace.header.menu.undo" +msgstr "الإلغاء" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.spread" -msgstr "الانتشار" +msgid "workspace.undo.entry.single.color" +msgstr "أصل اللون" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title" -msgstr "الظل" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.line-height" +msgstr "ارتفاع الخط" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title.group" -msgstr "ظل المجموعة" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.ungroup" +msgstr "فك التجميع" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title.multiple" -msgstr "ظلال الإختيار" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-auto-height" +msgstr "الإرتفاع التلقائي" -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.show-fill-on-export" -msgstr "أظهر في المصدر" +msgid "workspace.focus.focus-on" +msgstr "تشغيل التركيز" -msgid "workspace.options.show-in-viewer" -msgstr "أظهر في وضع العرض" +msgid "viewer.header.comments-section" +msgstr "التعليقات (%s)" -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.size" -msgstr "مقاس" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.unlock" +msgstr "الغاء القفل" -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs -msgid "workspace.options.size-presets" -msgstr "الإعدادات المسبقة للحجم" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-bottom-right" +msgstr "أسفل اليمين" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke" -msgstr "ضرب" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay" +msgstr "فتح التراكب" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker" -msgstr "معلم الدائرة" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-dissolve" +msgstr "تذوب" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "الدائرة" +msgid "workspace.undo.entry.single.rect" +msgstr "مستطيل" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker" -msgstr "معلم الماس" +msgid "shortcuts.toggle-visibility" +msgstr "أظهر\\أخف" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "الماس" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-full-screen" +msgstr "تكبير الشاشة" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow" -msgstr "سهم الخط" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.cut" +msgstr "قطع" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "سهم" +msgid "workspace.header.menu.disable-scale-content" +msgstr "Disable proportional scale" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.none" -msgstr "لا شيء" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object-slow" +msgstr "التصدير بطيء بشكل غير متوقع" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.round" -msgstr "دائري" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.lock" +msgstr "إغلاق" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square" -msgstr "مربع" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.modify" +msgstr "معدل %s" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker" -msgstr "معلم المربع" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin-all" +msgstr "جميع النواحي" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "مستطيل" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.strikethrough" +msgstr "الإضراب من خلال(%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow" -msgstr "سهم المثلث" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.reset-overrides" +msgstr "إعادة ضبط التجاوزات" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "المثلث" +msgid "workspace.undo.entry.multiple.typography" +msgstr "أصول الكتابة" -msgid "workspace.options.stroke-color" -msgstr "لون الضرب" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-center" +msgstr "محاذاة المركز (%s)" -msgid "workspace.options.stroke-width" -msgstr "عرض الضرب" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text-palette" +msgstr "الكتابات (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.center" -msgstr "مركز" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.titlecase" +msgstr "Title case" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.dashed" -msgstr "متقطع" +msgid "workspace.sidebar.layers.frames" +msgstr "لوحات" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.dotted" -msgstr "منقط" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fit" +msgstr "تقليص المقياس للتناسب" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object-error" +msgstr "Export failed" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.hsv" +msgstr "HSV" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete-flow-start" +msgstr "حذف المخطط" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-left" +msgstr "اأسفل اليسار" #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.inner" -msgstr "داخل" +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "الماس" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-offset-effect" +msgstr "تأثير الإزاحة" #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke.mixed" msgstr "مختلط" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.outer" -msgstr "خارج" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.solid" -msgstr "صلب" +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgba" +msgstr "RGBA" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-bottom" -msgstr "محاذاة الأسفل" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row" +msgstr "الصف" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-middle" -msgstr "محاذاة الوسط" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to" +msgstr "الإنتقال الى" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-top" -msgstr "محاذاة أعلى" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.inner" +msgstr "داخل" #: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.direction-ltr" -msgstr "LTR" +msgid "workspace.options.text-options.underline" +msgstr "تسطير (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.direction-rtl" -msgstr "RTL" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay-dest" +msgstr "إغلاق التراكب: %s" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-auto-height" -msgstr "الإرتفاع التلقائي" +msgid "workspace.header.menu.redo" +msgstr "إعادة" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-auto-width" -msgstr "العرض التلقائي" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.detach-instance" +msgstr "فصل المثال" #: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-fixed" -msgstr "مثبت" +msgid "workspace.options.text-options.text-align-right" +msgstr "محاذاة اليمين (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.letter-spacing" -msgstr "تباعد الحروف" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-textpalette" +msgstr "أظهر لوخة أسلوب الخط" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.line-height" -msgstr "ارتفاع الخط" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flip-horizontal" +msgstr "Flip horizontal" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.lowercase" -msgstr "أحرف صغيرة" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.hard-light" +msgstr "ضوء الثابت" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.none" -msgstr "لا شيء" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-max-w" +msgstr "أقصى عرض" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.strikethrough" -msgstr "الإضراب من خلال(%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column-reverse" +msgstr "العموج العكسي" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-center" -msgstr "محاذاة المركز (%s)" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.front" +msgstr "النقل الى الأمام" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-justify" -msgstr "تعديل (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-center" +msgstr "مركز" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-left" -msgstr "محاذاة (%s)" +msgid "workspace.undo.entry.single.multiple" +msgstr "عنصر" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-right" -msgstr "محاذاة اليمين (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.add-interaction" +msgstr "انقر على زر +لإضافة التفاعلات" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title" -msgstr "نص" +msgid "workspace.shape.menu.difference" +msgstr "الفارق" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title-group" -msgstr "نص للمجموعة" +msgid "workspace.assets.duplicate-main" +msgstr "انسخ الأصل" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title-selection" -msgstr "نص الإختيار" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.titlecase" -msgstr "Title case" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.underline" -msgstr "تسطير (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.uppercase" -msgstr "الأحرف الكبيرة" +msgid "workspace.undo.entry.multiple.path" +msgstr "مسارات" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.use-play-button" -msgstr "استعمل زر التشغيل أعلاه لتشغيل منظر النموذج المبدئي." +msgid "workspace.options.interaction-pos-bottom-right" +msgstr "أسفل اليمين" -msgid "workspace.options.width" -msgstr "عرض" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-main" +msgstr "أظهر المكون الرئيسي" -msgid "workspace.options.x" -msgstr "X محور" +msgid "shortcuts.v-distribute" +msgstr "النشر عموديا" -msgid "workspace.options.y" -msgstr "Y محور" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.grid-title" +msgstr "تشبيك" -msgid "workspace.path.actions.add-node" -msgstr "أضف العقدة (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsetx" +msgstr "X" -msgid "workspace.path.actions.delete-node" -msgstr "احذف العقدة (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.none" +msgstr "لا شيء" -msgid "workspace.path.actions.draw-nodes" -msgstr "جر العقدة (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.exclusion" +msgstr "الإستبعاد" -msgid "workspace.path.actions.join-nodes" -msgstr "صل العقد (%s)" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.title" +msgstr "تاريخ" -msgid "workspace.path.actions.make-corner" -msgstr "الى الزاوية (%s)" +msgid "workspace.options.recent-fonts" +msgstr "مؤخر" -msgid "workspace.path.actions.make-curve" -msgstr "الى المنحنى (%s)" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-textpalette" +msgstr "إخفاء لوحة أسلوب خط" -msgid "workspace.path.actions.merge-nodes" -msgstr "دمج العقد (%s)" +msgid "workspace.undo.entry.single.component" +msgstr "component" -msgid "workspace.path.actions.move-nodes" -msgstr "نقل العقد (%s)" +msgid "workspace.assets.local-library" +msgstr "المكتبة المحلية" -msgid "workspace.path.actions.separate-nodes" -msgstr "فصل العقد (%s)" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.unmask" +msgstr "كشف القناع" -msgid "workspace.path.actions.snap-nodes" -msgstr "كسر العقد (%s)" +msgid "shortcuts.toggle-textpalette" +msgstr "تبديل لوحة النص" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.add-flex" -msgstr "إضافة تخطيط الثني" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-top" +msgstr "محاذاة أعلى" -msgid "workspace.shape.menu.add-grid" -msgstr "إضافة تخطيط التشبيك" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-pressing" +msgstr "حين الضغط" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.back" -msgstr "أرسل الى الخلف" +msgid "workspace.sidebar.collapse" +msgstr "انهيار الشريط الجانبي" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.backward" -msgstr "أرسل الى الخلف" +msgid "workspace.options.height" +msgstr "طول" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.copy" -msgstr "انسخ" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.update-main" +msgstr "تحديث العنصر الرئيسي" -msgid "workspace.shape.menu.create-annotation" -msgstr "إنشاء تعليق توضيحي" +msgid "shortcuts.toggle-rules" +msgstr "إظهار\\إخفاء المسطرة" #: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.create-artboard-from-selection" -msgstr "تحديد محتوى اللوحة" +msgid "workspace.shape.menu.flow-start" +msgstr "بداية المخطط" #: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.create-component" -msgstr "إنشاء نعصر" +msgid "workspace.shape.menu.remove-flex" +msgstr "إزالة تخطيط المنحنى" -msgid "workspace.shape.menu.create-multiple-components" -msgstr "إنشاء عناصر جديدة" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-start" +msgstr "إضافة المخطط" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.cut" -msgstr "قطع" +msgid "workspace.sidebar.layers.components" +msgstr "العناصر" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.delete" -msgstr "حذف" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease" +msgstr "خفف" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.delete-flow-start" -msgstr "حذف المخطط" +#: src/app/main/ui/workspace/sidebar/options/menus/svg_attrs.cljs, src/app/main/ui/inspect/attributes/svg.cljs +msgid "workspace.sidebar.options.svg-attrs.title" +msgstr "السمات المستوردةSVG" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.detach-instance" -msgstr "فصل المثال" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.comments" +msgstr "تعليقات (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.detach-instances-in-bulk" -msgstr "فصل الامثلة" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-none" +msgstr "لا شيء" -msgid "workspace.shape.menu.difference" -msgstr "الفارق" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.lighten" +msgstr "تفتيح" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.duplicate" -msgstr "ينسخ" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export-multiple" +msgstr "تحديد المصدر" #: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.edit" -msgstr "تحرير" - -msgid "workspace.shape.menu.exclude" -msgstr "استبعاد" +msgid "workspace.shape.menu.hide" +msgstr "إخفاء" -msgid "workspace.shape.menu.flatten" -msgstr "تسطيح" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.retry" +msgstr "أعد المحاولة" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flip-horizontal" -msgstr "Flip horizontal" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-relative-to" +msgstr "بالنسبة الى" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flip-vertical" -msgstr "التوجيه الرئسي" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.update-components-in-bulk" +msgstr "تحديث العناصر الرئيسية" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flow-start" -msgstr "بداية المخطط" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.sidebar.history" +msgstr "التاريخ (%s)" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.forward" -msgstr "النقل الى الأمام" +msgid "workspace.options.clip-content" +msgstr "محتوى المقطع" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.front" -msgstr "النقل الى الأمام" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.path" +msgstr "مسار (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.go-main" -msgstr "انتقل الى ملف العنصر الأصلي" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius.all-corners" +msgstr "كل الزوايا" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.group" -msgstr "مجموعة" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-right" +msgstr "أعلى اليمين" #: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.hide" -msgstr "إخفاء" +msgid "workspace.shape.menu.select-layer" +msgstr "اختيار الطبقة" -msgid "workspace.shape.menu.hide-ui" -msgstr "أظهر أو إخف UI" +msgid "workspace.undo.entry.single.image" +msgstr "صورة" msgid "workspace.shape.menu.intersection" msgstr "التفاعلات" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.lock" -msgstr "إغلاق" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-trigger" +msgstr "مشغل" -#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.mask" -msgstr "قناع" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.shortcuts" +msgstr "الإختصار (%s)" -#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.paste" -msgstr "معجون" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding" +msgstr "حشوة" -msgid "workspace.shape.menu.path" -msgstr "طريق" +msgid "title.team-webhooks" +msgstr "خطافات الويب - %s - Penpot" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.remove-flex" -msgstr "إزالة تخطيط المنحنى" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library-updates" +msgstr "تحديث المكتبة" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.reset-overrides" -msgstr "إعادة ضبط التجاوزات" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.none" +msgstr "لا شيء" -msgid "workspace.shape.menu.restore-main" -msgstr "استعادة العنصر الرئيسي" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-none" +msgstr "(غير مهيء)" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.select-layer" -msgstr "اختيار الطبقة" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing" +msgstr "تخفيف" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show" -msgstr "العرض" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "المثلث" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show-in-assets" -msgstr "العرض في لوحة الاصول" +msgid "workspace.path.actions.draw-nodes" +msgstr "جر العقدة (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show-main" -msgstr "أظهر المكون الرئيسي" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row-reverse" +msgstr "الصف العكسي" -msgid "workspace.shape.menu.thumbnail-remove" -msgstr "أطهر الصورة المصغرة" +msgid "workspace.undo.entry.single.media" +msgstr "أصل الرسومات" -msgid "workspace.shape.menu.thumbnail-set" -msgstr "تعيين كصورة مصغرة" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.packed" +msgstr "معباة" -msgid "workspace.shape.menu.transform-to-path" -msgstr "تحويل الى المسار" +msgid "workspace.header.menu.enable-snap-pixel-grid" +msgstr "تمكين الفرقعة للبكسل" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-enter" +msgstr "إدخال الفأرة" + +msgid "workspace.undo.entry.single.circle" +msgstr "دائرة" + +msgid "viewer.header.interactions-section" +msgstr "التفاعلات (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title.group" +msgstr "ظل المجموعة" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title.group" +msgstr "طبقات المجموعة" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.reset-zoom" +msgstr "إعادة ضبط" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.assets" +msgstr "أصول" + +msgid "workspace.assets.open-library" +msgstr "افتح ملف المكتب" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title-selection" +msgstr "نص الإختيار" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "مكتبة مشتركة" + +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.size" +msgstr "مقاس" + +msgid "workspace.undo.entry.multiple.component" +msgstr "عناصر" + +msgid "workspace.focus.selection" +msgstr "تحديد" + +msgid "workspace.path.actions.merge-nodes" +msgstr "دمج العقد (%s)" #: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.ungroup" -msgstr "فك التجميع" +msgid "workspace.shape.menu.create-component" +msgstr "إنشاء نعصر" + +msgid "workspace.undo.entry.multiple.color" +msgstr "أصول اللون" + +msgid "workspace.header.menu.enable-scale-content" +msgstr "تمكين المقياس النسبي" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.group-stroke" +msgstr "ضرب المجموعة" msgid "workspace.shape.menu.union" msgstr "اتحاد" +msgid "workspace.shape.menu.thumbnail-set" +msgstr "تعيين كصورة مصغرة" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fill" +msgstr "مقياس الملأ" + +msgid "workspace.sidebar.layers.texts" +msgstr "نصوص" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-left" +msgstr "محاذاة (%s)" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.dismiss" +msgstr "رفض" + #: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.unlock" -msgstr "الغاء القفل" +msgid "workspace.shape.menu.duplicate" +msgstr "ينسخ" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "مزيد من المعلومات" #: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.unmask" -msgstr "كشف القناع" +msgid "workspace.shape.menu.forward" +msgstr "النقل الى الأمام" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.update-components-in-bulk" -msgstr "تحديث العناصر الرئيسية" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-hovering" +msgstr "حين التحوم" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.update-main" -msgstr "تحديث العنصر الرئيسي" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show" +msgstr "العرض" -msgid "workspace.sidebar.collapse" -msgstr "انهيار الشريط الجانبي" +msgid "workspace.shape.menu.hide-ui" +msgstr "أظهر أو إخف UI" -msgid "workspace.sidebar.expand" -msgstr "توسيع الشريط الجانبي" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.center" +msgstr "مركز" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.sidebar.history" -msgstr "التاريخ (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-manual" +msgstr "يدوي" #: src/app/main/ui/workspace/left_toolbar.cljs msgid "workspace.sidebar.layers" msgstr "الطبقات" -msgid "workspace.sidebar.layers.components" -msgstr "العناصر" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-leave" +msgstr "إخراج الفأرة" -msgid "workspace.sidebar.layers.frames" -msgstr "لوحات" +msgid "workspace.assets.typography.text-styles" +msgstr "أسلوب خط النص" -msgid "workspace.sidebar.layers.groups" -msgstr "مجموعات" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker" +msgstr "معلم الدائرة" -msgid "workspace.sidebar.layers.images" -msgstr "صور" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-min-w" +msgstr "الحد الأدنى للعرض" -msgid "workspace.sidebar.layers.masks" -msgstr "قناعات" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.gap" +msgstr "فجوة" -msgid "workspace.sidebar.layers.shapes" -msgstr "بسومات" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker" +msgstr "معلم المربع" -msgid "workspace.sidebar.layers.texts" -msgstr "نصوص" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column" +msgstr "عمود" -#: src/app/main/ui/workspace/sidebar/options/menus/svg_attrs.cljs, src/app/main/ui/inspect/attributes/svg.cljs -msgid "workspace.sidebar.options.svg-attrs.title" -msgstr "السمات المستوردةSVG" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation" +msgstr "الرسومات المتحركة" -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "workspace.sidebar.sitemap" -msgstr "صفحات" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.drop-shadow" +msgstr "إسقاط الظل" + +msgid "workspace.undo.entry.single.curve" +msgstr "منحنى" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.overlay" +msgstr "تراكب" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in-out" +msgstr "خفف داخل و خارج" #: src/app/main/ui/workspace/header.cljs -msgid "workspace.sitemap" -msgstr "خريطة الموقع" +msgid "workspace.header.menu.enable-snap-guides" +msgstr "الفرقعة للخطوط الإرشادية" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.assets" -msgstr "أصول" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-linear" +msgstr "خطي" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.color-palette" -msgstr "لوحة اللون (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-on-click" +msgstr "بعد النقر" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.comments" -msgstr "تعليقات (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to-dest" +msgstr "انتقال الى: %s" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.curve" -msgstr "منحنى (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.spread" +msgstr "الانتشار" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.ellipse" -msgstr "الشكل البيضاوي (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.bottom" +msgstr "أسفل" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.frame" -msgstr "لوحة (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-duration" +msgstr "مدة" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.image" -msgstr "صورة (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.advanced-ops" +msgstr "خيارات متقدمة" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.move" -msgstr "تحريك (%s)" +msgid "shortcuts.toggle-zoom-style" +msgstr "تبديل أسلوب التكبير" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.path" -msgstr "مسار (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-outside" +msgstr "عطل إذا نقر في الخارج" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.blur" +msgstr "تطميس" + +msgid "workspace.path.actions.separate-nodes" +msgstr "فصل العقد (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.selection-stroke" +msgstr "ضرب الإختيار" + +#: src/app/main/ui/workspace/sidebar/options.cljs +msgid "workspace.options.prototype" +msgstr "النموذج المبدئي" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.use-play-button" +msgstr "استعمل زر التشغيل أعلاه لتشغيل منظر النموذج المبدئي." + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.hue" +msgstr "مسحة" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-artboard-names" +msgstr "أظهر أسماء البورد" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.dashed" +msgstr "متقطع" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.left" +msgstr "شمال" + +msgid "workspace.shape.menu.thumbnail-remove" +msgstr "أطهر الصورة المصغرة" + +msgid "shortcuts.toggle-layout-flex" +msgstr "أضف\\أزل ثني التخطيط" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-around" +msgstr "التباعد حول" + +msgid "workspace.options.width" +msgstr "عرض" #: src/app/main/ui/workspace/left_toolbar.cljs msgid "workspace.toolbar.rect" msgstr "مستطيل (%s)" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.shortcuts" -msgstr "الإختصار (%s)" +msgid "workspace.undo.entry.single.group" +msgstr "مجموعة" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-max-w" +msgstr "أقصى عرض" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.sitemap" +msgstr "خريطة الموقع" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-bottom-left" +msgstr "أسفل اليسار" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay" +msgstr "إغلاق التراكب" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker" +msgstr "معلم الماس" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.soft-light" +msgstr "ضوء خافت" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-simple" +msgstr "حشوة بسيطة" + +msgid "workspace.shape.menu.create-annotation" +msgstr "إنشاء تعليق توضيحي" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-selected" +msgstr "تكبير" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay-dest" +msgstr "فتح التراكب: %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-url" +msgstr "رابط مفتوح" + +msgid "workspace.path.actions.delete-node" +msgstr "احذف العقدة (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-destination" +msgstr "وجهة" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.go-main" +msgstr "انتقل الى ملف العنصر الأصلي" + +msgid "shortcuts.undo" +msgstr "الغاء" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "سهم" + +msgid "workspace.path.actions.make-curve" +msgstr "الى المنحنى (%s)" + +msgid "workspace.options.search-font" +msgstr "البخث عن نوع الخط" + +msgid "workspace.path.actions.move-nodes" +msgstr "نقل العقد (%s)" + +msgid "workspace.path.actions.join-nodes" +msgstr "صل العقد (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-url" +msgstr "الرابط المفتوح" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.move" +msgstr "المكونات المعدلة" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title.multiple" +msgstr "الطبقات المحددة" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.direction-ltr" +msgstr "LTR" + +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-invitations" +msgstr "الدعوات - %s - Penpot" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete" +msgstr "حذف" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-in-assets" +msgstr "العرض في لوحة الاصول" + +msgid "workspace.undo.entry.multiple.shape" +msgstr "أشكال" + +msgid "workspace.options.interaction-auto" +msgstr "تلقائي" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title.multiple" +msgstr "ظلال الإختيار" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-prev-screen" +msgstr "الشاشة السابقة" #: src/app/main/ui/workspace/left_toolbar.cljs msgid "workspace.toolbar.text" msgstr "نص (%s)" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.copy" +msgstr "انسخ" + #: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.text-palette" -msgstr "الكتابات (%s)" +msgid "workspace.toolbar.curve" +msgstr "منحنى (%s)" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.empty" -msgstr "لا يوجد تغييرات في التاريخ الى الآن" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-all" +msgstr "جميع النواحي" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.delete" -msgstr "محذوف %s" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title" +msgstr "نص" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.modify" -msgstr "معدل %s" +msgid "shortcuts.underline" +msgstr "الخط التحتي" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.move" -msgstr "المكونات المعدلة" +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgb-complementary" +msgstr "RGB مكملات" -msgid "workspace.undo.entry.multiple.circle" -msgstr "دوائر" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.edit" +msgstr "التحرير" -msgid "workspace.undo.entry.multiple.color" -msgstr "أصول اللون" +msgid "shortcuts.unmask" +msgstr "كشف القناع" -msgid "workspace.undo.entry.multiple.component" -msgstr "عناصر" +msgid "workspace.options.y" +msgstr "Y محور" -msgid "workspace.undo.entry.multiple.curve" -msgstr "منحنيات" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.round" +msgstr "دائري" -msgid "workspace.undo.entry.multiple.frame" -msgstr "لوحة" +msgid "shortcuts.toggle-lock" +msgstr "قفل\\فتح" -msgid "workspace.undo.entry.multiple.group" -msgstr "مجموعات" +msgid "viewer.breaking-change.message" +msgstr "آسف" -msgid "workspace.undo.entry.multiple.media" -msgstr "الأصول الرسومية" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title" +msgstr "طبقة" -msgid "workspace.undo.entry.multiple.multiple" -msgstr "أشياء" +msgid "workspace.undo.entry.multiple.text" +msgstr "نصوص" -msgid "workspace.undo.entry.multiple.page" -msgstr "صفحات" +msgid "workspace.sidebar.layers.shapes" +msgstr "بسومات" -msgid "workspace.undo.entry.multiple.path" -msgstr "مسارات" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.add-flow-start" +msgstr "إضافة المخطط" -msgid "workspace.undo.entry.multiple.rect" -msgstr "مستطيلات" +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.show-fill-on-export" +msgstr "أظهر في المصدر" -msgid "workspace.undo.entry.multiple.shape" -msgstr "أشكال" +msgid "shortcuts.toggle-lock-size" +msgstr "قفل النسب" -msgid "workspace.undo.entry.multiple.text" -msgstr "نصوص" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-max-h" +msgstr "أقصى ارتفاع" -msgid "workspace.undo.entry.multiple.typography" -msgstr "أصول الكتابة" +msgid "workspace.shape.menu.restore-main" +msgstr "استعادة العنصر الرئيسي" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.new" -msgstr "جديد %s" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.saturation" +msgstr "التشبع" -msgid "workspace.undo.entry.single.circle" -msgstr "دائرة" +msgid "workspace.sidebar.expand" +msgstr "توسيع الشريط الجانبي" -msgid "workspace.undo.entry.single.color" -msgstr "أصل اللون" +#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.mask" +msgstr "قناع" -msgid "workspace.undo.entry.single.component" -msgstr "component" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay-dest" +msgstr "تبديل التراكب: %s" -msgid "workspace.undo.entry.single.curve" -msgstr "منحنى" +msgid "workspace.path.actions.make-corner" +msgstr "الى الزاوية (%s)" -msgid "workspace.undo.entry.single.frame" -msgstr "لوحة" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "الدائرة" -msgid "workspace.undo.entry.single.group" -msgstr "مجموعة" +msgid "workspace.options.stroke-color" +msgstr "لون الضرب" -msgid "workspace.undo.entry.single.image" -msgstr "صورة" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.outer" +msgstr "خارج" -msgid "workspace.undo.entry.single.media" -msgstr "أصل الرسومات" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-top-left" +msgstr "أعلى الشمال" -msgid "workspace.undo.entry.single.multiple" -msgstr "عنصر" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.normal" +msgstr "عادي" -msgid "workspace.undo.entry.single.page" -msgstr "صفحة" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.preferences" +msgstr "التفضيلات" -msgid "workspace.undo.entry.single.path" -msgstr "مسار" +msgid "workspace.shape.menu.exclude" +msgstr "استبعاد" -msgid "workspace.undo.entry.single.rect" -msgstr "مستطيل" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.rotation" +msgstr "دوران" + +msgid "shortcuts.zoom-lense-decrease" +msgstr "تنقيص عدسة التكبير" msgid "workspace.undo.entry.single.shape" msgstr "شكل" -msgid "workspace.undo.entry.single.text" -msgstr "نص" +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "workspace.sidebar.sitemap" +msgstr "صفحات" -msgid "workspace.undo.entry.single.typography" -msgstr "أصل الكتابة" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.view" +msgstr "المنظر" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.unknown" -msgstr "انتهت العملية %s" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.detach-instances-in-bulk" +msgstr "فصل الامثلة" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.title" -msgstr "تاريخ" +msgid "workspace.focus.focus-off" +msgstr "تعطيل التركيز" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.dismiss" -msgstr "رفض" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "رموز الوصول للحساب" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "مزيد من المعلومات" +msgid "workspace.options.radius" +msgstr "نصف القطر" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.there-are-updates" -msgstr "يوجد تحديثات في المكتبة المشتركة" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.back" +msgstr "أرسل الى الخلف" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.update" -msgstr "تحديث" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow" +msgstr "سهم الخط" -msgid "workspace.viewport.click-to-close-path" -msgstr "انقر لتغلق المسار" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.edit" +msgstr "تحرير" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fit-all" +msgstr "التكبير لتناسب الجميع" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-after-delay" +msgstr "بعد التأخير" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-max-h" +msgstr "أقصى ارتفاع" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title" +msgstr "الظل" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.help-info" +msgstr "المساعدة و المعلومة" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title-group" +msgstr "نص للمجموعة" + +msgid "workspace.undo.entry.single.text" +msgstr "نص" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-fixed" +msgstr "مثبت" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.image" +msgstr "صورة (%s)" + +msgid "workspace.undo.entry.single.path" +msgstr "مسار" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.add-flex" +msgstr "إضافة تخطيط الثني" diff --git a/frontend/translations/cs.po b/frontend/translations/cs.po index d0b667449..b2f2225f4 100644 --- a/frontend/translations/cs.po +++ b/frontend/translations/cs.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-01-23 15:02+0000\n" "Last-Translator: \"Amerey.eu\" \n" -"Language-Team: Czech " -"\n" +"Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -84,14 +84,6 @@ msgstr "LDAP" msgid "auth.login-with-oidc-submit" msgstr "OpenID" -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "Název musí obsahovat jiný znak než mezeru." - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "Název musí obsahovat maximálně 250 znaků." - #: src/app/main/ui/auth/recovery.cljs msgid "auth.new-password" msgstr "Zadejte nové heslo" @@ -124,10 +116,6 @@ msgstr "Heslo" msgid "auth.password-length-hint" msgstr "Minimálně 8 znaků" -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-not-empty" -msgstr "Heslo musí obsahovat jiný znak než mezeru." - msgid "auth.privacy-policy" msgstr "Zásady ochrany osobních údajů" @@ -176,21 +164,10 @@ msgstr "" "Vytvořením nového účtu souhlasíte s všeobecnými podmínkami poskytování " "služeb a zásadami ochrany osobních údajů." -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Při vytváření nového účtu souhlasíte s našimi [smluvními podmínkami](%s) a " -"[zásadami ochrany soukromí](%s)." - #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "Ověřovací e-mail jsme odeslali na adresu" -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "...branding, ilustrace, marketing atd." - msgid "common.publish" msgstr "Zveřejnit" @@ -288,83 +265,6 @@ msgstr "Začít prohlídku" msgid "dasboard.walkthrough-hero.title" msgstr "Průvodce rozhraním" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.copied-success" -msgstr "Zkopírovaný token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "Generovat nový token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "Přístupový token byl úspěšně vytvořen." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "" -"Pro vygenerování nového tokenu stiskněte tlačítko \"Vygenerovat nový " -"token\"." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.no-access-tokens" -msgstr "Zatím nemáte žádné tokeny." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "Jméno je povinné" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "180 dní" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "30 dní" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-60-days" -msgstr "60 dní" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-90-days" -msgstr "90 dní" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-never" -msgstr "Nikdy" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "Platnost vypršela %s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expires-on" -msgstr "Platnost vyprší %s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.no-expiration" -msgstr "Žádné datum vypršení platnosti" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "Osobní přístupové tokeny" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"Osobní přístupové tokeny fungují jako alternativa k našemu systému " -"ověřování přihlašovacích údajů/hesel a lze je použít k tomu, aby aplikaci " -"umožnily přístup k internímu rozhraní Penpot API" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-expire" -msgstr "Platnost tokenu vyprší %s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-not-expire" -msgstr "Token nemá žádné datum vypršení platnosti" - #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "dashboard.add-shared" @@ -856,9 +756,6 @@ msgstr "Písmo %s se nepodařilo načíst" msgid "errors.bad-font-plural" msgstr "Písma %s se nepodařilo načíst" -msgid "errors.cannot-upload" -msgstr "Nelze nahrát soubor médií." - #: src/app/main/data/workspace.cljs msgid "errors.clipboard-not-implemented" msgstr "Váš prohlížeč tuto operaci nedokáže provést" @@ -897,20 +794,13 @@ msgstr "E-mail «%s» byl nahlášen jako spam nebo byl trvale nedostupný." #: src/app/main/errors.cljs msgid "errors.feature-mismatch" msgstr "" -"Vypadá to, že otevíráte soubor, který má povolenou funkci '%s', ale " -"aktuální verze penpotu ji nepodporuje nebo je deaktivovaná." +"Vypadá to, že otevíráte soubor, který má povolenou funkci '%s', ale aktuální " +"verze penpotu ji nepodporuje nebo je deaktivovaná." #: src/app/main/errors.cljs msgid "errors.feature-not-supported" msgstr "Funkce '%s' není podporována." -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Zdá se, že existuje nesoulad mezi povolenými funkcemi a funkcemi souboru, " -"který se pokoušíte otevřít. Před otevřením souboru je třeba provést migraci " -"pro '%s'." - #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -961,9 +851,6 @@ msgstr "Potvrzovací heslo se musí shodovat" msgid "errors.password-too-short" msgstr "Heslo by mělo mít nejméně 8 znaků" -msgid "errors.paste-data-validation" -msgstr "Neplatná data ve schránce" - msgid "errors.profile-blocked" msgstr "Profil je zablokován" @@ -977,10 +864,6 @@ msgstr "Váš profil má ztlumené e-maily (zprávy o spamu nebo vysoká nedoru msgid "errors.registration-disabled" msgstr "Registrace je momentálně zakázána." -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Zjištěna nekompatibilní funkce '%s'" - msgid "errors.team-leave.insufficient-members" msgstr "" "Nedostatečný počet členů pro opuštění týmu, pravděpodobně jste chtěli tým " @@ -1002,13 +885,6 @@ msgstr "Došlo k neočekávané chybě." msgid "errors.unexpected-token" msgstr "Neznámý token" -msgid "errors.validation" -msgstr "Chyba ověření" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Soubor má nekompatibilní číslo verze" - msgid "errors.webhooks.connection" msgstr "Chyba připojení, adresa URL není dostupná" @@ -1242,9 +1118,6 @@ msgstr "Žádná" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "První písmena velká" -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Nenastaveno" - msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Velká písmena" @@ -1313,10 +1186,6 @@ msgstr "Zkratky" msgid "labels.accept" msgstr "Přijmout" -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.access-tokens" -msgstr "Přístupové tokeny" - msgid "labels.active" msgstr "Aktivní" @@ -1420,9 +1289,6 @@ msgstr "Smazat pozvánku" msgid "labels.delete-multi-files" msgstr "Smazat soubory %s" -msgid "labels.discard" -msgstr "Zahodit" - #: src/app/main/ui/dashboard/projects.cljs, #: src/app/main/ui/dashboard/sidebar.cljs, #: src/app/main/ui/dashboard/files.cljs, @@ -1654,9 +1520,6 @@ msgstr "Role" msgid "labels.save" msgstr "Uložit" -msgid "labels.search" -msgstr "Hledat" - msgid "labels.search-font" msgstr "Hledat písmo" @@ -1681,9 +1544,6 @@ msgstr "Služba je nedostupná" msgid "labels.settings" msgstr "Nastavení" -msgid "labels.share" -msgstr "Sdílet" - msgid "labels.share-prototype" msgstr "Sdílet prototyp" @@ -1753,34 +1613,10 @@ msgstr "(vy)" msgid "labels.your-account" msgstr "Váš účet" -msgid "media.choose-image" -msgstr "Vyberte obrázek" - -msgid "media.gradient" -msgstr "Přechod" - -msgid "media.image" -msgstr "Obrázek" - -msgid "media.linear" -msgstr "Lineární" - #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Načítání obrázku…" -msgid "media.radial" -msgstr "Radiální" - -msgid "media.solid" -msgstr "Plná" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Vaše knihovna je prázdná. Po přidání jako sdílená knihovna budou položky, " -"které vytvoříte, k dispozici pro použití se zbytkem vašich souborů. Opravdu " -"ji chcete publikovat?" - #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -1824,30 +1660,6 @@ msgstr "Změnit e-mail" msgid "modals.change-email.title" msgstr "Změňte svůj e-mail" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.copy-token" -msgstr "Kopírovat token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.expiration-date.label" -msgstr "Datum vypršení platnosti" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.label" -msgstr "Jméno" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.placeholder" -msgstr "Název může pomoci zjistit, k čemu token slouží" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.submit-label" -msgstr "Vytvořit token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.title" -msgstr "Vygenerujte přístupový token" - msgid "modals.create-webhook.submit-label" msgstr "Vytvořit webhook" @@ -1860,18 +1672,6 @@ msgstr "Adresa URL datové části" msgid "modals.create-webhook.url.placeholder" msgstr "https://example.com/postreceive" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.accept" -msgstr "Smazat token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.message" -msgstr "Opravdu chcete tento token smazat?" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.title" -msgstr "Smazat token" - #: src/app/main/ui/settings/delete_account.cljs msgid "modals.delete-account.cancel" msgstr "Zrušit a ponechat si můj účet" @@ -1902,12 +1702,6 @@ msgstr "" msgid "modals.delete-comment-thread.title" msgstr "Smazat konverzaci" -msgid "modals.delete-component-annotation.message" -msgstr "Opravdu chcete smazat tuto anotaci?" - -msgid "modals.delete-component-annotation.title" -msgstr "Smazat anotaci" - #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-file-confirm.accept" msgstr "Smazat soubor" @@ -1974,20 +1768,6 @@ msgstr[0] "Smazat soubor" msgstr[1] "Smazat soubory" msgstr[2] "Smazat soubory" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.no-files-message" -msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "Není aktivován v žádném souboru." -msgstr[1] "Nejsou aktivovány v žádném souboru." -msgstr[2] "Nejsou aktivovány v žádném souboru." - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.scd-message" -msgid_plural "modals.delete-shared-confirm.activated.scd-message" -msgstr[0] "Tato knihovna je aktivována zde: " -msgstr[1] "Tyto knihovny jsou aktivovány zde: " -msgstr[2] "Tyto knihovny jsou aktivovány zde: " - #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-shared-confirm.message" @@ -2030,19 +1810,6 @@ msgstr "Opravdu chcete tohoto člena smazat z týmu?" msgid "modals.delete-team-member-confirm.title" msgstr "Smazat člena týmu" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "" -"Aktiva, která již byla v tomto souboru použita, tam zůstanou (nebude " -"porušen žádný návrh)." -msgstr[1] "" -"Aktiva, která již byla v těchto souborech použita, tam zůstanou (nebude " -"porušen žádný návrh)." -msgstr[2] "" -"Aktiva, která již byla v těchto souborech použita, tam zůstanou (nebude " -"porušen žádný návrh)." - msgid "modals.delete-webhook.accept" msgstr "Smazat webhook" @@ -2143,15 +1910,6 @@ msgstr "" msgid "modals.promote-owner-confirm.title" msgstr "Nový majitel týmu" -msgid "modals.publish-empty-library.accept" -msgstr "Publikovat" - -msgid "modals.publish-empty-library.message" -msgstr "Vaše knihovna je prázdná. Opravdu to chcete publikovat?" - -msgid "modals.publish-empty-library.title" -msgstr "Publikovat prázdnou knihovnu" - #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.remove-shared-confirm.accept" @@ -2228,10 +1986,6 @@ msgstr "" msgid "modals.update-remote-component.message" msgstr "Aktualizovat komponentu ve sdílené knihovně" -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "K dispozici je nová verze, obnovte prosím stránku" - #: src/app/main/ui/dashboard/team.cljs msgid "notifications.invitation-email-sent" msgstr "Pozvánka byla úspěšně odeslána" @@ -2317,33 +2071,12 @@ msgstr "Průvodce přispíváním" msgid "onboarding-v2.welcome.title" msgstr "Vítejte v Penpot!" -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Pokračujte ve vytváření týmu" - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Pokračovat bez týmu" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Vytvořte tým a pozvěte" - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Vytvořte tým a odešlete pozvánky" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Budete moci pozvat později" - msgid "onboarding.choice.team-up.create-team-desc" msgstr "Po pojmenování svého týmu budete moci pozvat lidi, aby se přidali." msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "Zadejte název týmu" -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Vytvořte tým" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Vytvořte tým bez pozvánek" - msgid "onboarding.choice.team-up.invite-members" msgstr "Pozvat členy" @@ -2355,12 +2088,6 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Pozvat s rolí:" -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Začněte bez týmu" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Později budete moci vytvořit tým." - msgid "onboarding.newsletter.accept" msgstr "Ano, přihlásit se k odběru" @@ -2409,176 +2136,6 @@ msgstr "Penpot" msgid "profile.recovery.go-to-login" msgstr "Přejít na přihlášení" -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "S jakým designovým nástrojem máte více zkušeností?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "11-30" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "31-50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "Hodně" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Adobe XD" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Canva" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "Jak byste nejlépe popsali své zkušenosti s prací na..." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "Designer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "Vývojář" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "Zjistěte více o Penpot" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Figma" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Zakladatel / viceprezident" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "Jsem freelancer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "Získejte kód z mého týmového projektu " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "... design rozhraní, vizuální aktiva, návrhové systémy atd." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "InVision" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "Zanechte zpětnou vazbu pro můj týmový projekt" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "Pusťme se do toho!" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "Produktový nebo projektový manažer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Marketing" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "Více než 50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "Další" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "Žádný" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "Jiné (upřesněte)" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "Pracuji na osobním projektu" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "Předchozí" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "Jak plánujete používat Penpot?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "Jaká je vaše role?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "Vyberte možnost" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Sketch" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.some" -msgstr "Nějaké" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "Start" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "Začněte pracovat na mém projektu" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "Student nebo učitel" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "Jaká je velikost vašeho týmu?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "Vyzkoušejte Penpot, abyste zjistili, zda je vhodný pro tým " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "Před použitím Penpot on-premise si to vyzkoušejte" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "... drátové modely, cesty a toky uživatelů, navigační stromy atd." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "Práce v konceptech" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"Vaše zpětná vazba nám pomůže porozumět vašim zvykům a preferencím, abychom " -"mohli i nadále dělat Penpot užitečným nástrojem." - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Odpojit" - #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, @@ -2950,9 +2507,6 @@ msgstr "Vybrat vše" msgid "shortcuts.select-next" msgstr "Vybrat další vrstvu" -msgid "shortcuts.select-parent-layer" -msgstr "Vybrat nadřazenou vrstvu" - msgid "shortcuts.select-prev" msgstr "Vybrat předchozí vrstvu" @@ -2980,18 +2534,6 @@ msgstr "Začít měření" msgid "shortcuts.stop-measure" msgstr "Zastavit měření" -msgid "shortcuts.text-align-center" -msgstr "Zarovnat na střed" - -msgid "shortcuts.text-align-justify" -msgstr "Zarovnat do bloku" - -msgid "shortcuts.text-align-left" -msgstr "Zarovnat vlevo" - -msgid "shortcuts.text-align-right" -msgstr "Zarovnat vpravo" - msgid "shortcuts.thumbnail-set" msgstr "Nastavit náhledy" @@ -3065,10 +2607,6 @@ msgstr "Zvětšení zoomu" msgid "shortcuts.zoom-selected" msgstr "Přiblížit na vybrané" -#: src/app/main/ui/dashboard/team.cljs -msgid "team.webhooks.max-length" -msgstr "Název webhooku musí obsahovat maximálně 2048 znaků." - #: src/app/main/ui/dashboard/files.cljs msgid "title.dashboard.files" msgstr "%s - Penpot" @@ -3097,10 +2635,6 @@ msgstr "Sdílené knihovny - %s - Penpot" msgid "title.default" msgstr "Penpot – Svoboda designu pro týmy" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "title.settings.access-tokens" -msgstr "Profil – Přístupové tokeny" - #: src/app/main/ui/settings/feedback.cljs msgid "title.settings.feedback" msgstr "Poskytněte zpětnou vazbu – Penpot" @@ -3297,9 +2831,6 @@ msgstr "místní knihovna" msgid "workspace.assets.not-found" msgstr "Nebyly nalezeny žádné podklady" -msgid "workspace.assets.open-library" -msgstr "Otevřete soubor knihovny" - #: src/app/main/ui/workspace/sidebar/sitemap.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs @@ -3321,10 +2852,6 @@ msgstr[0] "%s položka vybrána" msgstr[1] "Počet vybraných položek: %s" msgstr[2] "Počet vybraných položek: %s" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "Sdílená knihovna" - #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" @@ -3521,10 +3048,6 @@ msgstr "Neuložené změny" msgid "workspace.header.viewer" msgstr "Režim zobrazení (%s)" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom" -msgstr "Přiblížení" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.zoom-fill" msgstr "Výplň – přizpůsobit, aby vyplnil" @@ -3545,21 +3068,6 @@ msgstr "Celá obrazovka" msgid "workspace.header.zoom-selected" msgstr "Přiblížit na vybrané" -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Upravit mřížku" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Odejít" - -msgid "workspace.layout_grid.editor.title" -msgstr "Úprava mřížky" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Hotovo" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Lokalizovat" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Přidat" @@ -3568,14 +3076,6 @@ msgstr "Přidat" msgid "workspace.libraries.colors" msgstr "barvy %s" -#: src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.empty-palette" -msgstr "Ve vaší knihovně zatím nejsou žádné barevné styly" - -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "Ve vaší knihovně zatím nejsou žádné typografické styly" - #: src/app/main/ui/workspace/colorpicker/libraries.cljs, #: src/app/main/ui/workspace/colorpalette.cljs msgid "workspace.libraries.colors.file-library" @@ -3626,10 +3126,6 @@ msgstr "KNIHOVNY" msgid "workspace.libraries.library" msgstr "KNIHOVNA" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library-updates" -msgstr "AKTUALIZACE KNIHOVNY" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "Neexistují žádné sdílené knihovny, které by potřebovaly aktualizaci" @@ -3666,10 +3162,6 @@ msgstr "%s typografie" msgid "workspace.libraries.update" msgstr "Aktualizace" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "zobrazit všechny změny" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.updates" msgstr "AKTUALIZACE" @@ -3701,34 +3193,13 @@ msgstr "Oříznout obsah" msgid "workspace.options.component" msgstr "Komponent" -msgid "workspace.options.component.annotation" -msgstr "Anotace" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints" +msgstr "Omezení" -msgid "workspace.options.component.copy" -msgstr "Kopírovat" - -msgid "workspace.options.component.create-annotation" -msgstr "Vytvořte anotaci" - -msgid "workspace.options.component.edit-annotation" -msgstr "Upravit anotaci" - -msgid "workspace.options.component.main" -msgstr "Hlavní" - -msgid "workspace.options.component.swap" -msgstr "Vyměnit komponent" - -msgid "workspace.options.component.swap.empty" -msgstr "V této knihovně zatím nejsou žádné položky" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints" -msgstr "Omezení" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.bottom" -msgstr "Dole" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.bottom" +msgstr "Dole" #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints.center" @@ -3816,10 +3287,6 @@ msgstr "Výplň" msgid "workspace.options.flows.add-flow-start" msgstr "Přidat počáteční bod" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Flow" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "Začátek" @@ -3923,9 +3390,6 @@ msgstr "Výplň skupiny" msgid "workspace.options.group-stroke" msgstr "Ohraničení skupiny" -msgid "workspace.options.guides.title" -msgstr "Vodítka" - msgid "workspace.options.height" msgstr "Výška" @@ -4472,26 +3936,14 @@ msgstr "Tah" msgid "workspace.options.stroke-cap.circle-marker" msgstr "Zakončení - kruh" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Kruh" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "Zakončení - diamant" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Diamant" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "Zakončení - šipka" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Šipka" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "Žádné" @@ -4508,18 +3960,10 @@ msgstr "Čtvercové" msgid "workspace.options.stroke-cap.square-marker" msgstr "Zakončení - čtverec" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Obdélník" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "Zakončení - trojúhelník" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Trojúhelník" - msgid "workspace.options.stroke-color" msgstr "Barva tahu" @@ -4694,9 +4138,6 @@ msgstr "Přichytit uzly (%s)" msgid "workspace.shape.menu.add-flex" msgstr "Přidat flexibilní rozložení" -msgid "workspace.shape.menu.add-grid" -msgstr "Přidat rozvržení mřížky" - #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.back" msgstr "Poslat na konec" @@ -4709,9 +4150,6 @@ msgstr "Poslat dozadu" msgid "workspace.shape.menu.copy" msgstr "Kopírovat" -msgid "workspace.shape.menu.create-annotation" -msgstr "Vytvořit anotaci" - #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.create-artboard-from-selection" msgstr "Výběr na tabuli" @@ -4720,9 +4158,6 @@ msgstr "Výběr na tabuli" msgid "workspace.shape.menu.create-component" msgstr "Vytvořit komponent" -msgid "workspace.shape.menu.create-multiple-components" -msgstr "Vytvořte více komponent" - #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.cut" msgstr "Vyjmout" @@ -4990,13 +4425,6 @@ msgstr "Text (%s)" msgid "workspace.toolbar.text-palette" msgstr "Typografie (%s)" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Režim kontroly** (Pouze zobrazení)" - -msgid "workspace.top-bar.read-only.done" -msgstr "Hotovo" - #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Zatím nedošlo k žádným změnám v historii" @@ -5116,10 +4544,6 @@ msgstr "Historie" msgid "workspace.updates.dismiss" msgstr "Zrušit" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "Více informací" - #: src/app/main/data/workspace/libraries.cljs msgid "workspace.updates.there-are-updates" msgstr "Ve sdílených knihovnách jsou aktualizace" @@ -5130,3 +4554,578 @@ msgstr "Aktualizace" msgid "workspace.viewport.click-to-close-path" msgstr "Kliknutím zavřete cestu" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "Nikdy" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "Platnost vypršela %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.no-expiration" +msgstr "Žádné datum vypršení platnosti" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Soubor má nekompatibilní číslo verze" + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Zjištěna nekompatibilní funkce '%s'" + +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Nenastaveno" + +msgid "labels.discard" +msgstr "Zahodit" + +msgid "labels.share" +msgstr "Sdílet" + +msgid "labels.search" +msgstr "Hledat" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "Vytvořit token" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.scd-message" +msgid_plural "modals.delete-shared-confirm.activated.scd-message" +msgstr[0] "Tato knihovna je aktivována zde: " +msgstr[1] "Tyto knihovny jsou aktivovány zde: " +msgstr[2] "Tyto knihovny jsou aktivovány zde: " + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Vytvořte tým a odešlete pozvánky" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Vytvořte tým bez pozvánek" + +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Vytvořte tým" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Budete moci pozvat později" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" + +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Pokračujte ve vytváření týmu" + +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Začněte bez týmu" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Později budete moci vytvořit tým." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canva" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Odpojit" + +#: src/app/main/ui/dashboard/team.cljs +msgid "team.webhooks.max-length" +msgstr "Název webhooku musí obsahovat maximálně 2048 znaků." + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "Přiblížení" + +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Upravit mřížku" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Odejít" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library-updates" +msgstr "AKTUALIZACE KNIHOVNY" + +msgid "workspace.options.component.swap" +msgstr "Vyměnit komponent" + +msgid "workspace.options.component.swap.empty" +msgstr "V této knihovně zatím nejsou žádné položky" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Flow" + +msgid "workspace.top-bar.read-only.done" +msgstr "Hotovo" + +msgid "media.image" +msgstr "Obrázek" + +msgid "media.solid" +msgstr "Plná" + +msgid "media.linear" +msgstr "Lineární" + +msgid "media.radial" +msgstr "Radiální" + +msgid "media.gradient" +msgstr "Přechod" + +msgid "media.choose-image" +msgstr "Vyberte obrázek" + +msgid "workspace.options.guides.title" +msgstr "Vodítka" + +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Při vytváření nového účtu souhlasíte s našimi [smluvními podmínkami](%s) a [" +"zásadami ochrany soukromí](%s)." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.copied-success" +msgstr "Zkopírovaný token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"Osobní přístupové tokeny fungují jako alternativa k našemu systému ověřování " +"přihlašovacích údajů/hesel a lze je použít k tomu, aby aplikaci umožnily " +"přístup k internímu rozhraní Penpot API" + +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Zdá se, že existuje nesoulad mezi povolenými funkcemi a funkcemi souboru, " +"který se pokoušíte otevřít. Před otevřením souboru je třeba provést migraci " +"pro '%s'." + +msgid "errors.validation" +msgstr "Chyba ověření" + +msgid "errors.paste-data-validation" +msgstr "Neplatná data ve schránce" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Pokračovat bez týmu" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Vytvořte tým a pozvěte" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Vývojář" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "InVision" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Zanechte zpětnou vazbu pro můj týmový projekt" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Další" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Jiné (upřesněte)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "Pracuji na osobním projektu" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "Předchozí" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Jak plánujete používat Penpot?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Jaká je vaše role?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Vyberte možnost" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "Jaká je velikost vašeho týmu?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Vyzkoušejte Penpot, abyste zjistili, zda je vhodný pro tým " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Vaše zpětná vazba nám pomůže porozumět vašim zvykům a preferencím, abychom " +"mohli i nadále dělat Penpot užitečným nástrojem." + +msgid "shortcuts.text-align-center" +msgstr "Zarovnat na střed" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Lokalizovat" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Hotovo" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "zobrazit všechny změny" + +msgid "workspace.options.component.annotation" +msgstr "Anotace" + +msgid "workspace.shape.menu.create-multiple-components" +msgstr "Vytvořte více komponent" + +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**Režim kontroly** (Pouze zobrazení)" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Vaše knihovna je prázdná. Po přidání jako sdílená knihovna budou položky, " +"které vytvoříte, k dispozici pro použití se zbytkem vašich souborů. Opravdu " +"ji chcete publikovat?" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.copy-token" +msgstr "Kopírovat token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "Jméno" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.placeholder" +msgstr "Název může pomoci zjistit, k čemu token slouží" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.message" +msgstr "Opravdu chcete tento token smazat?" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "Smazat token" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "" +"Aktiva, která již byla v tomto souboru použita, tam zůstanou (nebude porušen " +"žádný návrh)." +msgstr[1] "" +"Aktiva, která již byla v těchto souborech použita, tam zůstanou (nebude " +"porušen žádný návrh)." +msgstr[2] "" +"Aktiva, která již byla v těchto souborech použita, tam zůstanou (nebude " +"porušen žádný návrh)." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "Název musí obsahovat maximálně 250 znaků." + +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "Název musí obsahovat jiný znak než mezeru." + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "Heslo musí obsahovat jiný znak než mezeru." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "Zatím nemáte žádné tokeny." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "Přístupový token byl úspěšně vytvořen." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "Platnost vyprší %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "60 dní" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "30 dní" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "180 dní" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "90 dní" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "Jméno je povinné" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "Platnost tokenu vyprší %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "Token nemá žádné datum vypršení platnosti" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "Přístupové tokeny" + +msgid "workspace.options.component.edit-annotation" +msgstr "Upravit anotaci" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Začněte pracovat na mém projektu" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Žádný" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "... drátové modely, cesty a toky uživatelů, navigační stromy atd." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "Není aktivován v žádném souboru." +msgstr[1] "Nejsou aktivovány v žádném souboru." +msgstr[2] "Nejsou aktivovány v žádném souboru." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "Generovat nový token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "" +"Pro vygenerování nového tokenu stiskněte tlačítko \"Vygenerovat nový token\"." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "Osobní přístupové tokeny" + +msgid "errors.cannot-upload" +msgstr "Nelze nahrát soubor médií." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.expiration-date.label" +msgstr "Datum vypršení platnosti" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "Smazat token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "Vygenerujte přístupový token" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Designer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Zakladatel / viceprezident" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "Pusťme se do toho!" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Jsem freelancer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Produktový nebo projektový manažer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Marketing" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "Více než 50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Sketch" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Start" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Před použitím Penpot on-premise si to vyzkoušejte" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Práce v konceptech" + +msgid "shortcuts.select-parent-layer" +msgstr "Vybrat nadřazenou vrstvu" + +msgid "workspace.options.component.copy" +msgstr "Kopírovat" + +msgid "workspace.options.component.main" +msgstr "Hlavní" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Kruh" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Diamant" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Šipka" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Obdélník" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Trojúhelník" + +msgid "workspace.shape.menu.add-grid" +msgstr "Přidat rozvržení mřížky" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "Více informací" + +msgid "modals.delete-component-annotation.message" +msgstr "Opravdu chcete smazat tuto anotaci?" + +msgid "modals.delete-component-annotation.title" +msgstr "Smazat anotaci" + +msgid "modals.publish-empty-library.title" +msgstr "Publikovat prázdnou knihovnu" + +msgid "modals.publish-empty-library.accept" +msgstr "Publikovat" + +msgid "modals.publish-empty-library.message" +msgstr "Vaše knihovna je prázdná. Opravdu to chcete publikovat?" + +msgid "shortcuts.text-align-justify" +msgstr "Zarovnat do bloku" + +msgid "shortcuts.text-align-left" +msgstr "Zarovnat vlevo" + +msgid "shortcuts.text-align-right" +msgstr "Zarovnat vpravo" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "Profil – Přístupové tokeny" + +msgid "workspace.assets.open-library" +msgstr "Otevřete soubor knihovny" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "Sdílená knihovna" + +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "Ve vaší knihovně zatím nejsou žádné barevné styly" + +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "Ve vaší knihovně zatím nejsou žádné typografické styly" + +msgid "workspace.options.component.create-annotation" +msgstr "Vytvořte anotaci" + +msgid "workspace.shape.menu.create-annotation" +msgstr "Vytvořit anotaci" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "Jak byste nejlépe popsali své zkušenosti s prací na..." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "Zjistěte více o Penpot" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Získejte kód z mého týmového projektu " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...branding, ilustrace, marketing atd." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "Hodně" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... design rozhraní, vizuální aktiva, návrhové systémy atd." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Nějaké" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "S jakým designovým nástrojem máte více zkušeností?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Student nebo učitel" + +msgid "workspace.layout_grid.editor.title" +msgstr "Úprava mřížky" + +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "K dispozici je nová verze, obnovte prosím stránku" diff --git a/frontend/translations/de.po b/frontend/translations/de.po index 84195a044..fe563da32 100644 --- a/frontend/translations/de.po +++ b/frontend/translations/de.po @@ -1,15 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-03-22 16:01+0000\n" +"PO-Revision-Date: 2024-01-23 15:01+0000\n" "Last-Translator: Stas Haas \n" -"Language-Team: German " -"\n" +"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.4-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -178,21 +178,10 @@ msgstr "" "Wenn Sie ein neues Konto erstellen, stimmen Sie unseren Nutzungsbedingungen " "und Datenschutzrichtlinien zu." -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Wenn Sie ein neues Konto erstellen, stimmen Sie unseren " -"[Nutzungsbedingungen](%s) und [Datenschutzrichtlinien](%s) zu." - #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "Wir haben eine Bestätigungs-E-Mail gesendet an" -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "...Branding, Illustrationen, Marketingmaterialien, usw." - msgid "common.publish" msgstr "Veröffentlichen" @@ -547,11 +536,6 @@ msgstr "Dateien importieren" msgid "dashboard.import.analyze-error" msgstr "Huch! Wir konnten diese Datei nicht importieren" -msgid "dashboard.import.analyze-error.components-v2" -msgstr "" -"Datei mit Komponenten v2 aktiviert, aber dieses Team unterstützt es noch " -"nicht." - msgid "dashboard.import.import-error" msgstr "" "Beim Importieren der Datei ist ein Fehler aufgetreten. Die Datei wurde " @@ -927,13 +911,6 @@ msgstr "" msgid "errors.feature-not-supported" msgstr "Die Funktion '%s' wird nicht unterstützt." -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Es scheint eine Nichtübereinstimmung zwischen den aktivierten Funktionen " -"und den Funktionen der Datei zu geben. Die Migrationen für '%s' müssen " -"durchgeführt werden, bevor die Datei geöffnet werden kann." - #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -986,9 +963,6 @@ msgstr "Bestätigungspasswort muss übereinstimmen" msgid "errors.password-too-short" msgstr "Das Passwort sollte mindestens 8 Zeichen lang sein" -msgid "errors.paste-data-validation" -msgstr "Ungültige Daten in der Zwischenablage" - msgid "errors.profile-blocked" msgstr "Das Profil ist gesperrt" @@ -1004,10 +978,6 @@ msgstr "" msgid "errors.registration-disabled" msgstr "Die Registrierung ist derzeit deaktiviert." -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Inkompatible Funktion '%s' erkannt" - msgid "errors.team-leave.insufficient-members" msgstr "" "Nicht genügend Mitglieder, um das Team zu verlassen, wahrscheinlich wollen " @@ -1031,13 +1001,6 @@ msgstr "Ein unerwarteter Fehler ist aufgetreten." msgid "errors.unexpected-token" msgstr "Unbekannter Token" -msgid "errors.validation" -msgstr "Validierungsfehler" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Die Datei hat eine inkompatible Versionsnummer" - msgid "errors.webhooks.connection" msgstr "Verbindungsfehler, URL ist nicht erreichbar" @@ -1272,9 +1235,6 @@ msgstr "Keine" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "Kapitälchen" -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Nicht gesetzt" - msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Großbuchstaben" @@ -1686,9 +1646,6 @@ msgstr "Rolle" msgid "labels.save" msgstr "Speichern" -msgid "labels.search" -msgstr "Suchen" - msgid "labels.search-font" msgstr "Schriftart suchen" @@ -1713,9 +1670,6 @@ msgstr "Service nicht verfügbar" msgid "labels.settings" msgstr "Einstellungen" -msgid "labels.share" -msgstr "Teilen" - #: src/app/main/ui/viewer/header.cljs, src/app/main/ui/viewer/header.cljs msgid "labels.share-prototype" msgstr "Prototyp teilen" @@ -1786,34 +1740,10 @@ msgstr "(Sie)" msgid "labels.your-account" msgstr "Ihr Konto" -msgid "media.choose-image" -msgstr "Bild auswählen" - -msgid "media.gradient" -msgstr "Verlauf" - -msgid "media.image" -msgstr "Bild" - -msgid "media.linear" -msgstr "Linear" - #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Bild laden…" -msgid "media.radial" -msgstr "Radial" - -msgid "media.solid" -msgstr "Einfarbig" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Ihre Bibliothek ist leer. Sobald es als Geteilte Bibliothek hinzugefügt " -"wurde, können die von Ihnen erstellten Assets in den übrigen Dateien " -"verwendet werden. Sind Sie sicher, dass Sie es veröffentlichen möchten?" - #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -2010,12 +1940,6 @@ msgid_plural "modals.delete-shared-confirm.accept" msgstr[0] "Datei löschen" msgstr[1] "Dateien löschen" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.no-files-message" -msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "Es ist in keiner Datei aktiviert." -msgstr[1] "Sie sind in keiner Datei aktiviert." - #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-shared-confirm.activated.scd-message" msgid_plural "modals.delete-shared-confirm.activated.scd-message" @@ -2062,16 +1986,6 @@ msgstr "Sind Sie sicher, dass Sie dieses Mitglied aus dem Team löschen möchten msgid "modals.delete-team-member-confirm.title" msgstr "Teammitglied löschen" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "" -"Assets, die bereits in dieser Datei verwendet wurden, bleiben dort erhalten " -"(das Design bleibt erhalten)." -msgstr[1] "" -"Assets, die bereits in diesen Dateien verwendet wurden, bleiben dort " -"erhalten (das Design bleibt erhalten)." - msgid "modals.delete-webhook.accept" msgstr "Webhook löschen" @@ -2344,7 +2258,7 @@ msgstr "" "Gegenwart und Zukunft mit der gesamten Community und dem Penpot-Kernteam." msgid "onboarding-v2.welcome.desc2.title" -msgstr "Mitwirkung in der Community" +msgstr "In der Community mitmachen" msgid "onboarding-v2.welcome.desc3" msgstr "" @@ -2357,33 +2271,12 @@ msgstr "Leitfaden für Mitwirkende" msgid "onboarding-v2.welcome.title" msgstr "Willkommen bei Penpot!" -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Mit der Erstellung eines Teams fortsetzen" - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Ohne Team fortsetzen" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Team erstellen & einladen" - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Team erstellen und Einladungen versenden" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Sie können später einladen" - msgid "onboarding.choice.team-up.create-team-desc" msgstr "Nach der Bennenung Ihres Teams, können Sie andere Personen einladen." msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "Geben Sie den Namen des Teams ein" -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Team erstellen" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Team ohne Einladungen erstellen" - msgid "onboarding.choice.team-up.invite-members" msgstr "Mitglieder einladen" @@ -2395,12 +2288,6 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Einladen mit der Rolle:" -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Ohne Team starten" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Sie können später ein Team erstellen." - msgid "onboarding.newsletter.accept" msgstr "Ja, abonnieren" @@ -2452,264 +2339,97 @@ msgid "profile.recovery.go-to-login" msgstr "Zur Anmeldung" #: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "Mit welchem Design-Tool haben Sie mehr Erfahrung?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "11-30" +msgid "questions.lets-get-started" +msgstr "Los geht's!" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "settings.multiple" +msgstr "Mehrere" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "31-50" +# SECTIONS +msgid "shortcut-section.basics" +msgstr "Grundlagen" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "Viel" +msgid "shortcut-section.dashboard" +msgstr "Dashboard" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Adobe XD" +msgid "shortcut-section.viewer" +msgstr "Ansicht" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Canva" +msgid "shortcut-section.workspace" +msgstr "Arbeitsbereich" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "Wie würden Sie Ihre Erfahrungen bei der Arbeit an … am besten beschreiben?" +# SUBSECTIONS +msgid "shortcut-subsection.alignment" +msgstr "Ausrichtung" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "Designer" +msgid "shortcut-subsection.edit" +msgstr "Bearbeiten" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "Developer" +msgid "shortcut-subsection.general-dashboard" +msgstr "Allgemein" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "Mehr über Penpot erfahren" +msgid "shortcut-subsection.general-viewer" +msgstr "Allgemein" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Figma" +msgid "shortcut-subsection.main-menu" +msgstr "Hauptmenü" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Gründer/VP" +msgid "shortcut-subsection.modify-layers" +msgstr "Ändern von Ebenen" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "Ich bin ein Freelancer" +msgid "shortcut-subsection.navigation-dashboard" +msgstr "Navigation" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "Code aus meinem Teamprojekt erhalten " +msgid "shortcut-subsection.navigation-viewer" +msgstr "Navigation" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "... Interface-Design, visuelle Assets, Designsysteme usw." +msgid "shortcut-subsection.navigation-workspace" +msgstr "Navigation" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "InVision" +msgid "shortcut-subsection.panels" +msgstr "Paneele" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "Feedback für mein Team-Projekt hinterlassen" +msgid "shortcut-subsection.path-editor" +msgstr "Pfade" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "Los geht's!" +msgid "shortcut-subsection.shape" +msgstr "Formen" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "Produkt- oder Projektmanager" +msgid "shortcut-subsection.text-editor" +msgstr "Texte" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Marketing" +msgid "shortcut-subsection.tools" +msgstr "Werkzeuge" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "Mehr als 50" +msgid "shortcut-subsection.zoom-viewer" +msgstr "Zoom" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "Weiter" +msgid "shortcut-subsection.zoom-workspace" +msgstr "Zoom" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "Keine" +msgid "shortcuts.add-comment" +msgstr "Kommentare" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "Sonstiges (bitte angeben)" +msgid "shortcuts.add-node" +msgstr "Punkt hinzufügen" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "Ich arbeite an einem persönlichen Projekt" +msgid "shortcuts.align-bottom" +msgstr "Unten ausrichten" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "Zurück" +msgid "shortcuts.align-center" +msgstr "Zentrieren" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "Wie wollen Sie Penpot nutzen?" +msgid "shortcuts.align-hcenter" +msgstr "Horizontal zentrieren" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "Was ist Ihre Rolle?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "Wählen Sie eine Option" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Sketch" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.some" -msgstr "Einige" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "Start" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "Mit der Arbeit an meinem Projekt beginnen" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "Schüler oder Lehrer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "Wie groß ist Ihr Team?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "Testen Sie Penpot, um zu sehen, ob es für das Team geeignet ist " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "Testen Sie Penpot, bevor Sie es auf einem eigenen Server verwenden" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "... Wireframes, User Journeys & Flows, Navigationsbäume usw." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "Arbeiten an Konzeptideen" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"Ihr Feedback wird uns helfen, Ihre Gewohnheiten und Vorlieben zu verstehen, " -"damit wir Penpot weiterhin zu einem nützlichen und angenehmen Werkzeug " -"machen können." - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Trennen" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "settings.multiple" -msgstr "Mehrere" - -# SECTIONS -msgid "shortcut-section.basics" -msgstr "Grundlagen" - -msgid "shortcut-section.dashboard" -msgstr "Dashboard" - -msgid "shortcut-section.viewer" -msgstr "Ansicht" - -msgid "shortcut-section.workspace" -msgstr "Arbeitsbereich" - -# SUBSECTIONS -msgid "shortcut-subsection.alignment" -msgstr "Ausrichtung" - -msgid "shortcut-subsection.edit" -msgstr "Bearbeiten" - -msgid "shortcut-subsection.general-dashboard" -msgstr "Allgemein" - -msgid "shortcut-subsection.general-viewer" -msgstr "Allgemein" - -msgid "shortcut-subsection.main-menu" -msgstr "Hauptmenü" - -msgid "shortcut-subsection.modify-layers" -msgstr "Ändern von Ebenen" - -msgid "shortcut-subsection.navigation-dashboard" -msgstr "Navigation" - -msgid "shortcut-subsection.navigation-viewer" -msgstr "Navigation" - -msgid "shortcut-subsection.navigation-workspace" -msgstr "Navigation" - -msgid "shortcut-subsection.panels" -msgstr "Paneele" - -msgid "shortcut-subsection.path-editor" -msgstr "Pfade" - -msgid "shortcut-subsection.shape" -msgstr "Formen" - -msgid "shortcut-subsection.text-editor" -msgstr "Texte" - -msgid "shortcut-subsection.tools" -msgstr "Werkzeuge" - -msgid "shortcut-subsection.zoom-viewer" -msgstr "Zoom" - -msgid "shortcut-subsection.zoom-workspace" -msgstr "Zoom" - -msgid "shortcuts.add-comment" -msgstr "Kommentare" - -msgid "shortcuts.add-node" -msgstr "Punkt hinzufügen" - -msgid "shortcuts.align-bottom" -msgstr "Unten ausrichten" - -msgid "shortcuts.align-center" -msgstr "Zentrieren" - -msgid "shortcuts.align-hcenter" -msgstr "Horizontal zentrieren" - -msgid "shortcuts.align-justify" -msgstr "Blocksatz" +msgid "shortcuts.align-justify" +msgstr "Blocksatz" msgid "shortcuts.align-left" msgstr "Linksbündig ausrichten" @@ -3078,9 +2798,6 @@ msgstr "Lineale ein-/ausblenden" msgid "shortcuts.toggle-textpalette" msgstr "Textpalette ein-/ausblenden" -msgid "shortcuts.toggle-theme" -msgstr "Theme ändern" - msgid "shortcuts.toggle-visibility" msgstr "Elemente ein-/ausblenden" @@ -3368,10 +3085,6 @@ msgid_plural "workspace.assets.selected-count" msgstr[0] "%s Element ausgewählt" msgstr[1] "%s Elemente ausgewählt" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "Geteilte Bibliothek" - #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" @@ -3418,45 +3131,6 @@ msgstr "Texttransformation" msgid "workspace.assets.ungroup" msgstr "Gruppierung aufheben" -msgid "workspace.context-menu.grid-cells.area" -msgstr "Bereich erstellen" - -msgid "workspace.context-menu.grid-cells.create-board" -msgstr "Board erstellen" - -msgid "workspace.context-menu.grid-cells.merge" -msgstr "Zellen zusammenführen" - -msgid "workspace.context-menu.grid-track.column.add-after" -msgstr "1 Spalte rechts einfügen" - -msgid "workspace.context-menu.grid-track.column.add-before" -msgstr "1 Spalte links einfügen" - -msgid "workspace.context-menu.grid-track.column.delete" -msgstr "Spalte löschen" - -msgid "workspace.context-menu.grid-track.column.delete-shapes" -msgstr "Spalte und Formen löschen" - -msgid "workspace.context-menu.grid-track.column.duplicate" -msgstr "Spalte duplizieren" - -msgid "workspace.context-menu.grid-track.row.add-after" -msgstr "1 Zeile unterhalb einfügen" - -msgid "workspace.context-menu.grid-track.row.add-before" -msgstr "1 Zeile oberhalb einfügen" - -msgid "workspace.context-menu.grid-track.row.delete" -msgstr "Zeile löschen" - -msgid "workspace.context-menu.grid-track.row.delete-shapes" -msgstr "Zeile und Formen löschen" - -msgid "workspace.context-menu.grid-track.row.duplicate" -msgstr "Zeile duplizieren" - msgid "workspace.focus.focus-mode" msgstr "Fokus-Modus" @@ -3580,12 +3254,6 @@ msgstr "Lineale einblenden" msgid "workspace.header.menu.show-textpalette" msgstr "Schriftartenpalette anzeigen" -msgid "workspace.header.menu.toggle-dark-theme" -msgstr "Zum dunklen Theme wechseln" - -msgid "workspace.header.menu.toggle-light-theme" -msgstr "Zum hellen Theme wechseln" - msgid "workspace.header.menu.undo" msgstr "Rückgängig" @@ -3637,21 +3305,6 @@ msgstr "Vollbild" msgid "workspace.header.zoom-selected" msgstr "Zur Auswahl zoomen" -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Grid bearbeiten" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Beenden" - -msgid "workspace.layout_grid.editor.title" -msgstr "Raster bearbeiten" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Fertig" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Lokalisieren" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Hinzufügen" @@ -3722,10 +3375,6 @@ msgstr "BIBLIOTHEK" msgid "workspace.libraries.library-updates" msgstr "AKTUALISIERUNGEN DER BIBLIOTHEK" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.loading" -msgstr "Laden…" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "" @@ -3802,24 +3451,12 @@ msgstr "Komponente" msgid "workspace.options.component.annotation" msgstr "Anmerkung" -msgid "workspace.options.component.copy" -msgstr "Kopie" - msgid "workspace.options.component.create-annotation" msgstr "Eine Anmerkung erstellen" msgid "workspace.options.component.edit-annotation" msgstr "Eine Anmerkung bearbeiten" -msgid "workspace.options.component.main" -msgstr "Hauptkomponente" - -msgid "workspace.options.component.swap" -msgstr "Komponente austauschen" - -msgid "workspace.options.component.swap.empty" -msgstr "Es gibt noch keine Assets in dieser Bibliothek" - #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Beschränkungen" @@ -3913,10 +3550,6 @@ msgstr "Fläche" msgid "workspace.options.flows.add-flow-start" msgstr "Flow-Startpunkt hinzufügen" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Flow" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "Flow-Startpunkt" @@ -4020,9 +3653,6 @@ msgstr "Gruppe füllen" msgid "workspace.options.group-stroke" msgstr "Gruppe einrahmen" -msgid "workspace.options.guides.title" -msgstr "Hilfslinien" - msgid "workspace.options.height" msgstr "Höhe" @@ -4571,26 +4201,14 @@ msgstr "Rahmen" msgid "workspace.options.stroke-cap.circle-marker" msgstr "Punkt" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Kreis" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "Diamant-Marker" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Diamant" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "Pfeil" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Pfeil" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "Keine" @@ -4607,18 +4225,10 @@ msgstr "Rechteckig" msgid "workspace.options.stroke-cap.square-marker" msgstr "Quadrat" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Rechteck" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "Dreieckiger Pfeil" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Dreieck" - msgid "workspace.options.stroke-color" msgstr "Konturfarbe" @@ -5091,13 +4701,6 @@ msgstr "Text (%s)" msgid "workspace.toolbar.text-palette" msgstr "Typografien (%s)" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Inspektionsmodus** (nur Ansicht)" - -msgid "workspace.top-bar.read-only.done" -msgstr "Fertig" - #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Es gibt bisher keine Änderungen im Verlauf" @@ -5231,3 +4834,344 @@ msgstr "Aktualisieren" msgid "workspace.viewport.click-to-close-path" msgstr "Klicken Sie, um den Pfad zu schließen" + +msgid "workspace.options.component.copy" +msgstr "Kopieren" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Developer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Produkt- oder Projektmanager" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Marketing" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "Ich arbeite an einem persönlichen Projekt" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Rechteck" + +msgid "workspace.options.component.main" +msgstr "Main" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Ich bin ein Freelancer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...Branding, Illustrationen, Marketingmaterialien, usw." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Einige" + +msgid "workspace.layout_grid.editor.title" +msgstr "Raster bearbeiten" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "Mehr als 50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Weiter" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "Wie groß ist Ihr Team?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "... Wireframes, User Journeys & Flows, Navigationsbäume usw." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "Viel" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Start" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Diamant" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Wie wollen Sie Penpot nutzen?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Wählen Sie eine Option" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Designer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Keine" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Trennen" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Sketch" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Dreieck" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "Es ist in keiner Datei aktiviert." +msgstr[1] "Sie sind in keiner Datei aktiviert." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Sonstiges (bitte angeben)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Testen Sie Penpot, um zu sehen, ob es für das Team geeignet ist " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Schüler oder Lehrer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Feedback für mein Team-Projekt hinterlassen" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "InVision" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canva" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "Mehr über Penpot erfahren" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "Zurück" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Mit der Arbeit an meinem Projekt beginnen" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Pfeil" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "Mit welchem Design-Tool haben Sie mehr Erfahrung?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Was ist Ihre Rolle?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Gründer/VP" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Kreis" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... Interface-Design, visuelle Assets, Designsysteme usw." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Arbeiten an Konzeptideen" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Ihr Feedback wird uns helfen, Ihre Gewohnheiten und Vorlieben zu verstehen, " +"damit wir Penpot weiterhin zu einem nützlichen und angenehmen Werkzeug " +"machen können." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "" +"Wie würden Sie Ihre Erfahrungen bei der Arbeit an … am besten beschreiben?" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "Geteilte Bibliothek" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Testen Sie Penpot, bevor Sie es auf einem eigenen Server verwenden" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Code aus meinem Teamprojekt erhalten " + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "" +"Assets, die bereits in dieser Datei verwendet wurden, bleiben dort erhalten (" +"das Design bleibt erhalten)." +msgstr[1] "" +"Assets, die bereits in diesen Dateien verwendet wurden, bleiben dort " +"erhalten (das Design bleibt erhalten)." + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Ihre Bibliothek ist leer. Sobald es als Geteilte Bibliothek hinzugefügt " +"wurde, können die von Ihnen erstellten Assets in den übrigen Dateien " +"verwendet werden. Sind Sie sicher, dass Sie es veröffentlichen möchten?" + +msgid "media.radial" +msgstr "Radial" + +msgid "workspace.top-bar.read-only.done" +msgstr "Fertig" + +msgid "media.image" +msgstr "Bild" + +msgid "media.linear" +msgstr "Linear" + +msgid "media.gradient" +msgstr "Verlauf" + +msgid "media.solid" +msgstr "Einfarbig" + +msgid "media.choose-image" +msgstr "Bild auswählen" + +msgid "workspace.options.guides.title" +msgstr "Hilfslinien" + +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**Inspektionsmodus** (nur Ansicht)" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Die Datei hat eine inkompatible Versionsnummer" + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Inkompatible Funktion '%s' erkannt" + +msgid "errors.validation" +msgstr "Validierungsfehler" + +msgid "errors.paste-data-validation" +msgstr "Ungültige Daten in der Zwischenablage" + +msgid "labels.search" +msgstr "Suchen" + +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Ohne Team starten" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Sie können später ein Team erstellen." + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Ohne Team fortsetzen" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Team erstellen und Einladungen versenden" + +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Mit der Erstellung eines Teams fortsetzen" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Team ohne Einladungen erstellen" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Team erstellen & einladen" + +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Team erstellen" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Sie können später einladen" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Fertig" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Beenden" + +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Grid bearbeiten" + +msgid "workspace.options.component.swap" +msgstr "Komponente austauschen" + +msgid "workspace.options.component.swap.empty" +msgstr "Es gibt noch keine Assets in dieser Bibliothek" + +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Wenn Sie ein neues Konto erstellen, stimmen Sie unseren " +"[Nutzungsbedingungen](%s) und [Datenschutzrichtlinien](%s) zu." + +msgid "labels.share" +msgstr "Teilen" + +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Nicht gesetzt" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Lokalisieren" + +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Es scheint eine Nichtübereinstimmung zwischen den aktivierten Funktionen und " +"den Funktionen der Datei zu geben. Die Migrationen für '%s' müssen " +"durchgeführt werden, bevor die Datei geöffnet werden kann." + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Flow" diff --git a/frontend/translations/en.po b/frontend/translations/en.po index 1dffa2c85..747704c55 100644 --- a/frontend/translations/en.po +++ b/frontend/translations/en.po @@ -49,10 +49,6 @@ msgstr "Forgot password?" msgid "auth.fullname" msgstr "Full Name" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-account-title" -msgstr "Log into my account" - #: src/app/main/ui/auth/register.cljs msgid "auth.login-here" msgstr "Login here" @@ -61,6 +57,10 @@ msgstr "Login here" msgid "auth.login-submit" msgstr "Login" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "Log into my account" + #: src/app/main/ui/auth/login.cljs msgid "auth.login-tagline" msgstr "Penpot is the free open-source design tool for Design and Code collaboration" @@ -171,17 +171,15 @@ msgstr "The open-source solution for design and prototyping." msgid "auth.terms-of-service" msgstr "Terms of service" -msgid "auth.terms-privacy-agreement" -msgstr "" -"When creating a new account, you agree to ourf terms of service and privacy " -"policy." - #: src/app/main/ui/auth/register.cljs #, markdown msgid "auth.terms-privacy-agreement-md" msgstr "" -"When creating a new account, you agree to our [terms of service](%s) and " -"[privacy policy](%s)." +"When creating a new account, you agree to our [terms of service](%s) and [privacy policy](%s)." + +msgid "auth.terms-privacy-agreement" +msgstr "" +"When creating a new account, you agree to ourf terms of service and privacy policy." #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" @@ -840,10 +838,6 @@ msgstr "Ok" msgid "ds.confirm-title" msgstr "Are you sure?" -#: src/app/main/data/users.cljs -msgid "errors.auth-provider-not-allowed" -msgstr "Auth provider not allowed for this profile" - #: src/app/main/ui/auth/login.cljs msgid "errors.auth-provider-not-configured" msgstr "Authentication provider not configured." @@ -875,10 +869,6 @@ msgstr "Email already validated." msgid "errors.email-as-password" msgstr "You can't use your email as password" -#: src/app/main/data/users.cljs -msgid "errors.email-domain-not-allowed" -msgstr "Domain not allowed" - #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.email-has-permanent-bounces" msgstr "The email «%s» has many permanent bounce reports." @@ -897,19 +887,28 @@ msgstr "The email «%s» has been reported as spam or permanently bounce." #: src/app/main/errors.cljs msgid "errors.feature-mismatch" msgstr "" -"Looks like you are opening a file that has the feature '%s' enabled but the " -"current penpot version does not supports it or has it disabled." +"Looks like you are opening a file that has the feature '%s' enabled but " +"the current penpot version does not supports it or has it disabled." #: src/app/main/errors.cljs -msgid "errors.feature-not-supported" -msgstr "Feature '%s' is not supported." +msgid "errors.version-not-supported" +msgstr "" +"File has an incompatible version number" #: src/app/main/errors.cljs msgid "errors.file-feature-mismatch" msgstr "" "It seems that there is a mismatch between the enabled features and the " -"features of the file you are trying to open. Migrations for '%s' need to be " -"applied before the file can be opened." +"features of the file you are trying to open. Migrations for '%s' need " +"to be applied before the file can be opened." + +#: src/app/main/errors.cljs +msgid "errors.feature-not-supported" +msgstr "Feature '%s' is not supported." + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Detected incompatible feature '%s'" #: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -958,9 +957,6 @@ msgstr "Confirmation password must match" msgid "errors.password-too-short" msgstr "Password should at least be 8 characters" -msgid "errors.paste-data-validation" -msgstr "Invalid data in clipboard" - msgid "errors.profile-blocked" msgstr "The profile is blocked" @@ -972,9 +968,13 @@ msgstr "Your profile has emails muted (spam reports or high bounces)." msgid "errors.registration-disabled" msgstr "The registration is currently disabled." -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Detected incompatible feature '%s'" +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "Auth provider not allowed for this profile" + +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "Domain not allowed" msgid "errors.team-leave.insufficient-members" msgstr "Insufficient members to leave team, you probably want to delete it." @@ -993,13 +993,6 @@ msgstr "An unexpected error occurred." msgid "errors.unexpected-token" msgstr "Unknown token" -msgid "errors.validation" -msgstr "Validation Error" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "File has an incompatible version number" - msgid "errors.webhooks.connection" msgstr "Connection error, URL not reacheable" @@ -1029,6 +1022,13 @@ msgstr "Email or password is incorrect." msgid "errors.wrong-old-password" msgstr "Old password is incorrect" +msgid "errors.validation" +msgstr "Validation Error" + +msgid "errors.paste-data-validation" +msgstr "Invalid data in clipboard" + + #: src/app/main/ui/settings/feedback.cljs msgid "feedback.description" msgstr "Description" @@ -1232,12 +1232,12 @@ msgstr "Lower Case" msgid "inspect.attributes.typography.text-transform.none" msgstr "None" -msgid "inspect.attributes.typography.text-transform.titlecase" -msgstr "Title Case" - msgid "inspect.attributes.typography.text-transform.unset" msgstr "Unset" +msgid "inspect.attributes.typography.text-transform.titlecase" +msgstr "Title Case" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Upper Case" @@ -1626,9 +1626,6 @@ msgstr "Role" msgid "labels.save" msgstr "Save" -msgid "labels.search" -msgstr "Search" - msgid "labels.search-font" msgstr "Search font" @@ -1652,12 +1649,12 @@ msgstr "Service Unavailable" msgid "labels.settings" msgstr "Settings" -msgid "labels.share" -msgstr "Share" - msgid "labels.share-prototype" msgstr "Share prototype" +msgid "labels.share" +msgstr "Share" + #: src/app/main/ui/dashboard/sidebar.cljs msgid "labels.shared-libraries" msgstr "Libraries" @@ -1724,34 +1721,13 @@ msgstr "(you)" msgid "labels.your-account" msgstr "Your account" -msgid "media.choose-image" -msgstr "Choose image" - -msgid "media.gradient" -msgstr "Gradient" - -msgid "media.image" -msgstr "Image" - -msgid "media.image.short" -msgstr "img" - -msgid "media.keep-aspect-ratio" -msgstr "Keep aspect ratio" - -msgid "media.linear" -msgstr "Linear" +msgid "labels.search" +msgstr "Search" #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Loading image…" -msgid "media.radial" -msgstr "Radial" - -msgid "media.solid" -msgstr "Solid" - msgid "modals.add-shared-confirm-empty.hint" msgstr "" "Your library is empty. Once added as Shared Library, the assets you create " @@ -2082,21 +2058,6 @@ msgstr "Are you sure you want to leave this team?" msgid "modals.leave-confirm.title" msgstr "Leaving team" -msgid "modals.move-shared-confirm.accept" -msgid_plural "modals.move-shared-confirm.accept" -msgstr[0] "Move" -msgstr[1] "Move" - -msgid "modals.move-shared-confirm.message" -msgid_plural "modals.move-shared-confirm.message" -msgstr[0] "Are you sure you want to move this library?" -msgstr[1] "Are you sure you want to move these libraries?" - -msgid "modals.move-shared-confirm.title" -msgid_plural "modals.move-shared-confirm.title" -msgstr[0] "Move library" -msgstr[1] "Move libraries" - #: src/app/main/ui/workspace/nudge.cljs msgid "modals.nudge-title" msgstr "Nudge amount" @@ -2154,18 +2115,33 @@ msgid_plural "modals.unpublish-shared-confirm.accept" msgstr[0] "Unpublish" msgstr[1] "Unpublish" +msgid "modals.move-shared-confirm.accept" +msgid_plural "modals.move-shared-confirm.accept" +msgstr[0] "Move" +msgstr[1] "Move" + #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.message" msgid_plural "modals.unpublish-shared-confirm.message" msgstr[0] "Are you sure you want to unpublish this library?" msgstr[1] "Are you sure you want to unpublish these libraries?" +msgid "modals.move-shared-confirm.message" +msgid_plural "modals.move-shared-confirm.message" +msgstr[0] "Are you sure you want to move this library?" +msgstr[1] "Are you sure you want to move these libraries?" + #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.title" msgid_plural "modals.unpublish-shared-confirm.title" msgstr[0] "Unpublish library" msgstr[1] "Unpublish libraries" +msgid "modals.move-shared-confirm.title" +msgid_plural "modals.move-shared-confirm.title" +msgstr[0] "Move library" +msgstr[1] "Move libraries" + #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs msgid "modals.update-remote-component-in-bulk.hint" msgstr "" @@ -2284,32 +2260,38 @@ msgstr "Contributing guide" msgid "onboarding-v2.welcome.title" msgstr "Welcome to Penpot!" +msgid "onboarding.choice.team-up.create-team-desc" +msgstr "After naming your team, you will be able to invite people to join." + +msgid "onboarding.choice.team-up.create-team-placeholder" +msgstr "Enter the name of the team" + msgid "onboarding.choice.team-up.continue-creating-team" msgstr "Continue creating team" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Start without a team" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "You will be able to create a team later." + msgid "onboarding.choice.team-up.continue-without-a-team" msgstr "Continue without team" -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Create team & invite" - msgid "onboarding.choice.team-up.create-team-and-send-invites" msgstr "Create team and send invites" -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "You'll be able to invite later" - -msgid "onboarding.choice.team-up.create-team-desc" -msgstr "After naming your team, you will be able to invite people to join." +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Create team without inviting" -msgid "onboarding.choice.team-up.create-team-placeholder" -msgstr "Enter the name of the team" +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Create team & invite" msgid "onboarding.choice.team-up.create-team-without-invite" msgstr "Create team" -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Create team without inviting" +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "You'll be able to invite later" msgid "onboarding.choice.team-up.invite-members" msgstr "Invite members" @@ -2322,12 +2304,6 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Invite with the role:" -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Start without a team" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "You will be able to create a team later." - msgid "onboarding.newsletter.accept" msgstr "Yes, subscribe" @@ -2345,6 +2321,9 @@ msgstr "Want to receive Penpot news?" msgid "onboarding.team-modal.create-team" msgstr "Create a team" +msgid "onboarding.team-modal.team-definition" +msgstr "What's a team?" + msgid "onboarding.team-modal.create-team-desc" msgstr "" "A team allows you to collaborate with other Penpot users working in the " @@ -2365,9 +2344,6 @@ msgstr "Unlimited members" msgid "onboarding.team-modal.create-team-feature-5" msgstr "100% free!" -msgid "onboarding.team-modal.team-definition" -msgstr "What's a team?" - msgid "onboarding.templates.subtitle" msgstr "Here are some templates." @@ -2916,9 +2892,6 @@ msgstr "Redo" msgid "shortcuts.reset-zoom" msgstr "Reset zoom" -msgid "shortcuts.scale" -msgstr "Scale" - msgid "shortcuts.search-placeholder" msgstr "Search shortcuts" @@ -3004,9 +2977,6 @@ msgstr "Toggle layers" msgid "shortcuts.toggle-layout-flex" msgstr "Add / Remove flex layout" -msgid "shortcuts.toggle-layout-grid" -msgstr "Add/remove grid layout" - msgid "shortcuts.toggle-lock" msgstr "Lock / Unlock" @@ -3016,6 +2986,9 @@ msgstr "Lock proportions" msgid "shortcuts.toggle-rulers" msgstr "Show / Hide rulers" +msgid "shortcuts.scale" +msgstr "Scale" + msgid "shortcuts.toggle-snap-guides" msgstr "Snap to guides" @@ -3058,6 +3031,9 @@ msgstr "Zoom lense increase" msgid "shortcuts.zoom-selected" msgstr "Zoom to selected" +msgid "shortcuts.toggle-layout-grid" +msgstr "Add/remove grid layout" + #: src/app/main/ui/dashboard/team.cljs msgid "team.webhooks.max-length" msgstr "The webhook name must contain at most 2048 characters." @@ -3260,10 +3236,6 @@ msgstr "Duplicate main" msgid "workspace.assets.edit" msgstr "Edit" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.filter" -msgstr "Filter" - #: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.graphics" msgstr "Graphics" @@ -3302,6 +3274,14 @@ msgstr "Rename group" msgid "workspace.assets.search" msgstr "Search assets" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.filter" +msgstr "Filter" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "Sort" + #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.selected-count" msgid_plural "workspace.assets.selected-count" @@ -3312,16 +3292,6 @@ msgstr[1] "%s items selected" msgid "workspace.assets.shared-library" msgstr "Shared library" -#: src/app/main/ui/workspace/sidebar/assets/common.cljs -msgid "workspace.assets.sidebar.components" -msgid_plural "workspace.assets.sidebar.components" -msgstr[0] "1 component" -msgstr[1] "%s components" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.sort" -msgstr "Sort" - #: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" msgstr "Typographies" @@ -3365,45 +3335,6 @@ msgstr "Text Transform" msgid "workspace.assets.ungroup" msgstr "Ungroup" -msgid "workspace.context-menu.grid-cells.area" -msgstr "Create area" - -msgid "workspace.context-menu.grid-cells.create-board" -msgstr "Create board" - -msgid "workspace.context-menu.grid-cells.merge" -msgstr "Merge cells" - -msgid "workspace.context-menu.grid-track.column.add-after" -msgstr "Add 1 column to the right" - -msgid "workspace.context-menu.grid-track.column.add-before" -msgstr "Add 1 column to the left" - -msgid "workspace.context-menu.grid-track.column.delete" -msgstr "Delete column" - -msgid "workspace.context-menu.grid-track.column.delete-shapes" -msgstr "Delete column and shapes" - -msgid "workspace.context-menu.grid-track.column.duplicate" -msgstr "Duplicate column" - -msgid "workspace.context-menu.grid-track.row.add-after" -msgstr "Add 1 row below" - -msgid "workspace.context-menu.grid-track.row.add-before" -msgstr "Add 1 row above" - -msgid "workspace.context-menu.grid-track.row.delete" -msgstr "Delete row" - -msgid "workspace.context-menu.grid-track.row.delete-shapes" -msgstr "Delete row and shapes" - -msgid "workspace.context-menu.grid-track.row.duplicate" -msgstr "Duplicate row" - msgid "workspace.focus.focus-mode" msgstr "Focus mode" @@ -3439,13 +3370,13 @@ msgstr "Disable scale text" msgid "workspace.header.menu.disable-snap-guides" msgstr "Disable snap to guides" -msgid "workspace.header.menu.disable-snap-pixel-grid" -msgstr "Disable snap to pixel" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-snap-ruler-guides" msgstr "Disable snap to ruler guides" +msgid "workspace.header.menu.disable-snap-pixel-grid" +msgstr "Disable snap to pixel" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-dynamic-alignment" msgstr "Enable dynamic alignment" @@ -3461,13 +3392,13 @@ msgstr "Enable scale text" msgid "workspace.header.menu.enable-snap-guides" msgstr "Snap to guides" -msgid "workspace.header.menu.enable-snap-pixel-grid" -msgstr "Enable snap to pixel" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-ruler-guides" msgstr "Snap to ruler guides" +msgid "workspace.header.menu.enable-snap-pixel-grid" +msgstr "Enable snap to pixel" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-artboard-names" msgstr "Hide board names" @@ -3541,14 +3472,14 @@ msgstr "Show rulers" msgid "workspace.header.menu.show-textpalette" msgstr "Show fonts palette" -msgid "workspace.header.menu.toggle-dark-theme" -msgstr "Switch to dark theme" +msgid "workspace.header.menu.undo" +msgstr "Undo" msgid "workspace.header.menu.toggle-light-theme" msgstr "Switch to light theme" -msgid "workspace.header.menu.undo" -msgstr "Undo" +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Switch to dark theme" #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.reset-zoom" @@ -3598,27 +3529,27 @@ msgstr "Full screen" msgid "workspace.header.zoom-selected" msgstr "Zoom to selected" -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Edit grid" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Exit" - -msgid "workspace.layout_grid.editor.padding.expand" -msgstr "Show 4 sided padding options" - msgid "workspace.layout_grid.editor.title" msgstr "Editing grid" -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Done" - msgid "workspace.layout_grid.editor.top-bar.locate" msgstr "Locate" msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" msgstr "Locate grid layout" +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Done" + +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Edit grid" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Exit" + +msgid "workspace.layout_grid.editor.padding.expand" +msgstr "Show 4 sided padding options" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Add" @@ -3687,10 +3618,6 @@ msgstr "LIBRARY" msgid "workspace.libraries.library-updates" msgstr "LIBRARY UPDATES" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.loading" -msgstr "Loading…" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "There are no Shared Libraries that need update" @@ -3715,6 +3642,14 @@ msgstr "SHARED LIBRARIES" msgid "workspace.libraries.shared-library-btn" msgstr "Connect library" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.unlink-library-btn" +msgstr "Disconnect library" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Loading…" + #: src/app/main/ui/workspace/sidebar/options/menus/text.cljs msgid "workspace.libraries.text.multiple-typography" msgstr "Multiple typographies" @@ -3727,10 +3662,6 @@ msgstr "Unlink all typographies" msgid "workspace.libraries.typography" msgstr "%s typographies" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.unlink-library-btn" -msgstr "Disconnect library" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.update" msgstr "Update" @@ -3791,6 +3722,12 @@ msgstr "Swap component" msgid "workspace.options.component.swap.empty" msgstr "There are no assets in this library yet" +#: src/app/main/ui/workspace/sidebar/assets/common.cljs +msgid "workspace.assets.sidebar.components" +msgid_plural "workspace.assets.sidebar.components" +msgstr[0] "1 component" +msgstr[1] "%s components" + #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Constraints" @@ -3984,9 +3921,6 @@ msgstr "Group fill" msgid "workspace.options.group-stroke" msgstr "Group stroke" -msgid "workspace.options.guides.title" -msgstr "Guides" - msgid "workspace.options.height" msgstr "Height" @@ -5035,13 +4969,6 @@ msgstr "Text (%s)" msgid "workspace.toolbar.text-palette" msgstr "Typographies (%s)" -msgid "workspace.top-bar.read-only.done" -msgstr "Done" - -#, markdown -msgid "workspace.top-bar.view-only" -msgstr "**Inspecting code** (View Only)" - #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "There are no history changes so far" @@ -5175,3 +5102,77 @@ msgstr "Update" msgid "workspace.viewport.click-to-close-path" msgstr "Click to close the path" + +#, markdown +msgid "workspace.top-bar.view-only" +msgstr "**Inspecting code** (View Only)" + +msgid "workspace.top-bar.read-only.done" +msgstr "Done" + +msgid "media.image" +msgstr "Image" + +msgid "media.image.short" +msgstr "img" + +msgid "media.solid" +msgstr "Solid" + +msgid "media.linear" +msgstr "Linear" + +msgid "media.radial" +msgstr "Radial" + +msgid "media.gradient" +msgstr "Gradient" + +msgid "media.choose-image" +msgstr "Choose image" + +msgid "media.keep-aspect-ratio" +msgstr "Keep aspect ratio" + +msgid "workspace.options.guides.title" +msgstr "Guides" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Duplicate column" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Add 1 column to the left" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Add 1 column to the right" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Delete column" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Delete column and shapes" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Duplicate row" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Add 1 row above" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Add 1 row below" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Delete row" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Delete row and shapes" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Merge cells" + +msgid "workspace.context-menu.grid-cells.area" +msgstr "Create area" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Create board" + diff --git a/frontend/translations/es.po b/frontend/translations/es.po index ff0bc53de..9c52e4a47 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-01-25 12:01+0000\n" "Last-Translator: Yessenia Villarte Vaca \n" -"Language-Team: Spanish " -"\n" +"Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -52,10 +52,6 @@ msgstr "¿Olvidaste tu contraseña?" msgid "auth.fullname" msgstr "Nombre completo" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-account-title" -msgstr "Entrar en mi cuenta" - #: src/app/main/ui/auth/register.cljs msgid "auth.login-here" msgstr "Inicia sesión aquí" @@ -64,11 +60,13 @@ msgstr "Inicia sesión aquí" msgid "auth.login-submit" msgstr "Entrar" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "Entrar en mi cuenta" + #: src/app/main/ui/auth/login.cljs msgid "auth.login-tagline" -msgstr "" -"Penpot es la herramienta de diseño libre y open-source para la colaboración " -"entre Diseño y Código" +msgstr "Penpot es la herramienta de diseño libre y open-source para la colaboración entre Diseño y Código" #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" @@ -178,17 +176,15 @@ msgstr "La solución de código abierto para diseñar y prototipar." msgid "auth.terms-of-service" msgstr "Términos de servicio" -msgid "auth.terms-privacy-agreement" -msgstr "" -"Al crear una nueva cuenta, aceptas nuestros [términos de servicio](%s) y " -"[política de privacidad](%s)." - #: src/app/main/ui/auth/register.cljs #, markdown msgid "auth.terms-privacy-agreement-md" msgstr "" -"Al crear una nueva cuenta, aceptas nuestros [términos de servicio](%s) y " -"[política de privacidad](%s)." +"Al crear una nueva cuenta, aceptas nuestros [términos de servicio](%s) y [política de privacidad](%s)." + +msgid "auth.terms-privacy-agreement" +msgstr "" +"Al crear una nueva cuenta, aceptas nuestros [términos de servicio](%s) y [política de privacidad](%s)." #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" @@ -551,9 +547,7 @@ msgid "dashboard.import.analyze-error" msgstr "¡Vaya! No hemos podido importar el fichero" msgid "dashboard.import.analyze-error.components-v2" -msgstr "" -"Fichero exportado con componentes-v2 pero el equipo actual no lo soporta " -"aún." +msgstr "Fichero exportado con componentes-v2 pero el equipo actual no lo soporta aún." msgid "dashboard.import.import-error" msgstr "Hubo un problema importando el fichero. No ha podido ser importado." @@ -863,10 +857,6 @@ msgstr "Ok" msgid "ds.confirm-title" msgstr "¿Está Seguro?" -#: src/app/main/data/users.cljs -msgid "errors.auth-provider-not-allowed" -msgstr "El proveedor de autenticación no permitido para este perfil de usuario" - #: src/app/main/ui/auth/login.cljs msgid "errors.auth-provider-not-configured" msgstr "Proveedor de autenticación no configurado." @@ -899,10 +889,6 @@ msgstr "Este correo ya está validado." msgid "errors.email-as-password" msgstr "No puedes usar tu correo electrónico como contraseña" -#: src/app/main/data/users.cljs -msgid "errors.email-domain-not-allowed" -msgstr "Dominio no permitido" - #: src/app/main/ui/auth/register.cljs, #: src/app/main/ui/auth/recovery_request.cljs, #: src/app/main/ui/settings/change_email.cljs, @@ -927,10 +913,6 @@ msgstr "" "Parece que está abriendo un archivo que tiene la función '%s' habilitada, " "pero la versión actual de penpot no la admite o la tiene deshabilitada." -#: src/app/main/errors.cljs -msgid "errors.feature-not-supported" -msgstr "Caracteristica no soportada: '%s'." - #: src/app/main/errors.cljs msgid "errors.file-feature-mismatch" msgstr "" @@ -938,6 +920,10 @@ msgstr "" "del fichero que se esta intentando abrir. Falta aplicar migraciones para " "'%s' antes de poder abrir el fichero." +#: src/app/main/errors.cljs +msgid "errors.feature-not-supported" +msgstr "Caracteristica no soportada: '%s'." + #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -1005,6 +991,14 @@ msgstr "" msgid "errors.registration-disabled" msgstr "El registro está actualmente desactivado." +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "El proveedor de autenticación no permitido para este perfil de usuario" + +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "Dominio no permitido" + msgid "errors.team-leave.insufficient-members" msgstr "" "No hay miembros suficientes para salir del equipo, probablemente quieras " @@ -1259,12 +1253,12 @@ msgstr "Minúsculas" msgid "inspect.attributes.typography.text-transform.none" msgstr "Ninguna" -msgid "inspect.attributes.typography.text-transform.titlecase" -msgstr "Primera en mayúscula" - msgid "inspect.attributes.typography.text-transform.unset" msgstr "Sin asignar" +msgid "inspect.attributes.typography.text-transform.titlecase" +msgstr "Primera en mayúscula" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Mayúsculas" @@ -1665,9 +1659,6 @@ msgstr "Rol" msgid "labels.save" msgstr "Guardar" -msgid "labels.search" -msgstr "Buscar" - msgid "labels.search-font" msgstr "Buscar fuente" @@ -1692,13 +1683,13 @@ msgstr "El servicio no está disponible" msgid "labels.settings" msgstr "Configuración" -msgid "labels.share" -msgstr "Compartir" - #: src/app/main/ui/viewer/header.cljs, src/app/main/ui/viewer/header.cljs msgid "labels.share-prototype" msgstr "Compartir prototipo" +msgid "labels.share" +msgstr "Compartir" + #: src/app/main/ui/dashboard/sidebar.cljs msgid "labels.shared-libraries" msgstr "Bibliotecas" @@ -1765,34 +1756,13 @@ msgstr "(tú)" msgid "labels.your-account" msgstr "Tu cuenta" -msgid "media.choose-image" -msgstr "Elegir imagen" - -msgid "media.gradient" -msgstr "Gradiente" - -msgid "media.image" -msgstr "Imagen" - -msgid "media.image.short" -msgstr "img" - -msgid "media.keep-aspect-ratio" -msgstr "Mantener la proporción" - -msgid "media.linear" -msgstr "Linear" +msgid "labels.search" +msgstr "Buscar" #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Cargando imagen…" -msgid "media.radial" -msgstr "Radial" - -msgid "media.solid" -msgstr "Sólido" - #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -2120,21 +2090,6 @@ msgstr "¿Seguro que quieres abandonar este equipo?" msgid "modals.leave-confirm.title" msgstr "Abandonando el equipo" -msgid "modals.move-shared-confirm.accept" -msgid_plural "modals.move-shared-confirm.accept" -msgstr[0] "Mover" -msgstr[1] "Mover" - -msgid "modals.move-shared-confirm.message" -msgid_plural "modals.move-shared-confirm.message" -msgstr[0] "¿Seguro que quieres mover esta biblioteca?" -msgstr[1] "¿Seguro que quieres mover estas bibliotecas?" - -msgid "modals.move-shared-confirm.title" -msgid_plural "modals.move-shared-confirm.title" -msgstr[0] "Mover biblioteca" -msgstr[1] "Mover bibliotecas" - #: src/app/main/ui/workspace/nudge.cljs msgid "modals.nudge-title" msgstr "Desplazamiento" @@ -2195,18 +2150,33 @@ msgid_plural "modals.unpublish-shared-confirm.accept" msgstr[0] "Despublicar" msgstr[1] "Despublicar" +msgid "modals.move-shared-confirm.accept" +msgid_plural "modals.move-shared-confirm.accept" +msgstr[0] "Mover" +msgstr[1] "Mover" + #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.message" msgid_plural "modals.unpublish-shared-confirm.message" msgstr[0] "¿Seguro que quieres despublicar esta biblioteca?" msgstr[1] "¿Seguro que quieres despublicar estas bibliotecas?" +msgid "modals.move-shared-confirm.message" +msgid_plural "modals.move-shared-confirm.message" +msgstr[0] "¿Seguro que quieres mover esta biblioteca?" +msgstr[1] "¿Seguro que quieres mover estas bibliotecas?" + #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.title" msgid_plural "modals.unpublish-shared-confirm.title" msgstr[0] "Despublicar biblioteca" msgstr[1] "Despublicar bibliotecas" +msgid "modals.move-shared-confirm.title" +msgid_plural "modals.move-shared-confirm.title" +msgstr[0] "Mover biblioteca" +msgstr[1] "Mover bibliotecas" + #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, #: src/app/main/ui/workspace/context_menu.cljs msgid "modals.update-remote-component-in-bulk.hint" @@ -2331,32 +2301,38 @@ msgstr "Guía de contribución" msgid "onboarding-v2.welcome.title" msgstr "¡Te damos la bienvenida a Penpot!" +msgid "onboarding.choice.team-up.create-team-desc" +msgstr "Tras nombrar tu equipo podrás invitar a personas para que se unan." + +msgid "onboarding.choice.team-up.create-team-placeholder" +msgstr "Introduce el nombre del equipo" + msgid "onboarding.choice.team-up.continue-creating-team" msgstr "Continuar creando equipo" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Comenzar sin equipo" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Podrás crear un equipo después." + msgid "onboarding.choice.team-up.continue-without-a-team" msgstr "Seguir sin equipo" -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Crear equipo e invitar" - msgid "onboarding.choice.team-up.create-team-and-send-invites" msgstr "Crear equipo y enviar invitaciones" -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Podrás enviar invitaciones después" - -msgid "onboarding.choice.team-up.create-team-desc" -msgstr "Tras nombrar tu equipo podrás invitar a personas para que se unan." +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Crear equipo sin invitar" -msgid "onboarding.choice.team-up.create-team-placeholder" -msgstr "Introduce el nombre del equipo" +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Crear equipo e invitar" msgid "onboarding.choice.team-up.create-team-without-invite" msgstr "Crear equipo" -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Crear equipo sin invitar" +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Podrás enviar invitaciones después" msgid "onboarding.choice.team-up.invite-members" msgstr "Invitar integrantes" @@ -2369,12 +2345,6 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Invitar con el rol:" -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Comenzar sin equipo" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Podrás crear un equipo después." - msgid "onboarding.newsletter.accept" msgstr "Si, suscribirme" @@ -2392,6 +2362,9 @@ msgstr "¿Quieres recibir noticias sobre Penpot?" msgid "onboarding.team-modal.create-team" msgstr "Crea un equipo" +msgid "onboarding.team-modal.team-definition" +msgstr "¿Qué es un equipo?" + msgid "onboarding.team-modal.create-team-desc" msgstr "" "Un equipo permite colaborar en Penpot trabajando en los mismos archivos y " @@ -2412,9 +2385,6 @@ msgstr "Sin límite de integrantes" msgid "onboarding.team-modal.create-team-feature-5" msgstr "¡100% gratis!" -msgid "onboarding.team-modal.team-definition" -msgstr "¿Qué es un equipo?" - msgid "onboarding.templates.subtitle" msgstr "Aquí tienes algunas plantillas." @@ -2968,9 +2938,6 @@ msgstr "Rehacer" msgid "shortcuts.reset-zoom" msgstr "Reiniciar zoom" -msgid "shortcuts.scale" -msgstr "Escalado" - msgid "shortcuts.search-placeholder" msgstr "Buscar atajos" @@ -3056,9 +3023,6 @@ msgstr "Mostrar/ocultar capas" msgid "shortcuts.toggle-layout-flex" msgstr "Añadir/eliminar flex layout" -msgid "shortcuts.toggle-layout-grid" -msgstr "Añadir/eliminar grid layout" - msgid "shortcuts.toggle-lock" msgstr "Bloquear/Desbloquear" @@ -3068,6 +3032,9 @@ msgstr "Bloquear/Desbloquear proporciones" msgid "shortcuts.toggle-rulers" msgstr "Mostrar/ocultar reglas" +msgid "shortcuts.scale" +msgstr "Escalado" + msgid "shortcuts.toggle-snap-guides" msgstr "Alinear a las guías" @@ -3110,6 +3077,9 @@ msgstr "Incrementar zoom a objetivo" msgid "shortcuts.zoom-selected" msgstr "Zoom a selección" +msgid "shortcuts.toggle-layout-grid" +msgstr "Añadir/eliminar grid layout" + #: src/app/main/ui/dashboard/team.cljs msgid "team.webhooks.max-length" msgstr "El nombre del webhook debe contener como máximo 2048 caracteres." @@ -3320,10 +3290,6 @@ msgstr "Duplicar principal" msgid "workspace.assets.edit" msgstr "Editar" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.filter" -msgstr "Filtrar" - #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.graphics" @@ -3365,6 +3331,14 @@ msgstr "Renombrar grupo" msgid "workspace.assets.search" msgstr "Buscar recursos" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.filter" +msgstr "Filtrar" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "Ordenar" + #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.selected-count" msgid_plural "workspace.assets.selected-count" @@ -3375,16 +3349,6 @@ msgstr[1] "%s elementos seleccionados" msgid "workspace.assets.shared-library" msgstr "Biblioteca compartida" -#: src/app/main/ui/workspace/sidebar/assets/common.cljs -msgid "workspace.assets.sidebar.components" -msgid_plural "workspace.assets.sidebar.components" -msgstr[0] "1 componente" -msgstr[1] "%s componentes" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.sort" -msgstr "Ordenar" - #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" @@ -3431,45 +3395,6 @@ msgstr "Transformar texto" msgid "workspace.assets.ungroup" msgstr "Desagrupar" -msgid "workspace.context-menu.grid-cells.area" -msgstr "Crear area" - -msgid "workspace.context-menu.grid-cells.create-board" -msgstr "Crear tablero" - -msgid "workspace.context-menu.grid-cells.merge" -msgstr "Fusionar celdas" - -msgid "workspace.context-menu.grid-track.column.add-after" -msgstr "Añadir 1 columna a la derecha" - -msgid "workspace.context-menu.grid-track.column.add-before" -msgstr "Añadir 1 columna a la izquierda" - -msgid "workspace.context-menu.grid-track.column.delete" -msgstr "Borrar columna" - -msgid "workspace.context-menu.grid-track.column.delete-shapes" -msgstr "Borrar columna con el contenido" - -msgid "workspace.context-menu.grid-track.column.duplicate" -msgstr "Duplicar columna" - -msgid "workspace.context-menu.grid-track.row.add-after" -msgstr "Añadir 1 fila debajo" - -msgid "workspace.context-menu.grid-track.row.add-before" -msgstr "Añadir 1 fila encima" - -msgid "workspace.context-menu.grid-track.row.delete" -msgstr "Borrar fila" - -msgid "workspace.context-menu.grid-track.row.delete-shapes" -msgstr "Borrar fila con el contenido" - -msgid "workspace.context-menu.grid-track.row.duplicate" -msgstr "Duplicar fila" - msgid "workspace.focus.focus-mode" msgstr "Modo foco" @@ -3507,13 +3432,13 @@ msgstr "Desactivar escalar texto" msgid "workspace.header.menu.disable-snap-guides" msgstr "Desactivar alinear a las guias" -msgid "workspace.header.menu.disable-snap-pixel-grid" -msgstr "Desactivar ajuste al pixel" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-snap-ruler-guides" msgstr "Desactivar alinear a las guias de reglas" +msgid "workspace.header.menu.disable-snap-pixel-grid" +msgstr "Desactivar ajuste al pixel" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-dynamic-alignment" msgstr "Activar alineamiento dinámico" @@ -3529,13 +3454,13 @@ msgstr "Activar escalar texto" msgid "workspace.header.menu.enable-snap-guides" msgstr "Alinear a las guias" -msgid "workspace.header.menu.enable-snap-pixel-grid" -msgstr "Activar ajuste al pixel" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-ruler-guides" msgstr "Alinear a las guias de reglas" +msgid "workspace.header.menu.enable-snap-pixel-grid" +msgstr "Activar ajuste al pixel" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-artboard-names" msgstr "Ocultar nombres de tableros" @@ -3609,14 +3534,14 @@ msgstr "Mostrar reglas" msgid "workspace.header.menu.show-textpalette" msgstr "Mostrar paleta de textos" -msgid "workspace.header.menu.toggle-dark-theme" -msgstr "Cambiar a tema oscuro" +msgid "workspace.header.menu.undo" +msgstr "Deshacer" msgid "workspace.header.menu.toggle-light-theme" msgstr "Cambiar a tema claro" -msgid "workspace.header.menu.undo" -msgstr "Deshacer" +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Cambiar a tema oscuro" #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.reset-zoom" @@ -3666,27 +3591,27 @@ msgstr "Pantalla completa" msgid "workspace.header.zoom-selected" msgstr "Zoom a selección" -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Editar rejilla" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Salir" - -msgid "workspace.layout_grid.editor.padding.expand" -msgstr "Mostrar el padding a 4 lados" - msgid "workspace.layout_grid.editor.title" msgstr "Editando rejilla" -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Hecho" - msgid "workspace.layout_grid.editor.top-bar.locate" msgstr "Mostrar" msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" msgstr "Mostrar grid layout" +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Hecho" + +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Editar rejilla" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Salir" + +msgid "workspace.layout_grid.editor.padding.expand" +msgstr "Mostrar el padding a 4 lados" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Añadir" @@ -3781,6 +3706,10 @@ msgstr "BIBLIOTECAS COMPARTIDAS" msgid "workspace.libraries.shared-library-btn" msgstr "Conectar biblioteca" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.unlink-library-btn" +msgstr "Desconectar biblioteca" + #: src/app/main/ui/workspace/sidebar/options/menus/text.cljs msgid "workspace.libraries.text.multiple-typography" msgstr "Varias tipografías" @@ -3793,9 +3722,11 @@ msgstr "Desvincular todas las tipografías" msgid "workspace.libraries.typography" msgstr "%s tipografías" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.unlink-library-btn" -msgstr "Desconectar biblioteca" +#: src/app/main/ui/workspace/sidebar/assets/common.cljs +msgid "workspace.assets.sidebar.components" +msgid_plural "workspace.assets.sidebar.components" +msgstr[0] "1 componente" +msgstr[1] "%s componentes" #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.update" @@ -3946,14 +3877,14 @@ msgstr "Relleno" msgid "workspace.options.flows.add-flow-start" msgstr "Añadir inicio de flujo" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Flujo" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "Inicio de flujo" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Flujo" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-starts" msgstr "Inicios de flujo" @@ -4053,9 +3984,6 @@ msgstr "Relleno de grupo" msgid "workspace.options.group-stroke" msgstr "Borde de grupo" -msgid "workspace.options.guides.title" -msgstr "Guías" - msgid "workspace.options.height" msgstr "Altura" @@ -5126,13 +5054,6 @@ msgstr "Texto (%s)" msgid "workspace.toolbar.text-palette" msgstr "Tipografías (%s)" -msgid "workspace.top-bar.read-only.done" -msgstr "Hecho" - -#, markdown -msgid "workspace.top-bar.view-only" -msgstr "**Inspeccionando código** (View only)" - #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Todavía no hay cambios en el histórico" @@ -5266,3 +5187,77 @@ msgstr "Actualizar" msgid "workspace.viewport.click-to-close-path" msgstr "Pulsar para cerrar la ruta" + +#, markdown +msgid "workspace.top-bar.view-only" +msgstr "**Inspeccionando código** (View only)" + +msgid "workspace.top-bar.read-only.done" +msgstr "Hecho" + +msgid "media.image" +msgstr "Imagen" + +msgid "media.image.short" +msgstr "img" + +msgid "media.solid" +msgstr "Sólido" + +msgid "media.linear" +msgstr "Linear" + +msgid "media.radial" +msgstr "Radial" + +msgid "media.gradient" +msgstr "Gradiente" + +msgid "media.choose-image" +msgstr "Elegir imagen" + +msgid "media.keep-aspect-ratio" +msgstr "Mantener la proporción" + +msgid "workspace.options.guides.title" +msgstr "Guías" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Duplicar columna" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Añadir 1 columna a la izquierda" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Añadir 1 columna a la derecha" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Borrar columna" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Borrar columna con el contenido" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Duplicar fila" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Añadir 1 fila encima" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Añadir 1 fila debajo" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Borrar fila" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Borrar fila con el contenido" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Fusionar celdas" + +msgid "workspace.context-menu.grid-cells.area" +msgstr "Crear area" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Crear tablero" + diff --git a/frontend/translations/es_419.po b/frontend/translations/es_419.po index bc62bb5a1..725523935 100644 --- a/frontend/translations/es_419.po +++ b/frontend/translations/es_419.po @@ -2,25 +2,15 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-02-02 13:01+0000\n" "Last-Translator: Yessenia Villarte Vaca \n" -"Language-Team: Spanish (Latin America) " -"\n" +"Language-Team: Spanish (Latin America) \n" "Language: es_419\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" +"Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.4-dev\n" -#: src/app/main/ui/auth/register.cljs -msgid "auth.already-have-account" -msgstr "¿Ya tienes una cuenta?" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.check-your-email" -msgstr "" -"Revise su correo electrónico y haga clic en el enlace para verificar y " -"comenzar a usar Penpot." - #: src/app/main/ui/auth/recovery.cljs msgid "auth.confirm-password" msgstr "Confirmar Contraseña" @@ -33,12 +23,6 @@ msgstr "Crear cuenta demo" msgid "auth.create-demo-profile" msgstr "¿Solo quieres probarlo?" -#: src/app/main/ui/auth/register.cljs -msgid "auth.demo-warning" -msgstr "" -"Este es un servicio DEMO, NO LO UTILICE para trabajos reales, los proyectos " -"se borrarán periódicamente." - #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs msgid "auth.email" msgstr "Correo electrónico" @@ -47,10 +31,6 @@ msgstr "Correo electrónico" msgid "auth.forgot-password" msgstr "¿Has olvidado tu contraseña?" -#: src/app/main/ui/auth/register.cljs -msgid "auth.fullname" -msgstr "Nombre completo" - #: src/app/main/ui/auth/register.cljs msgid "auth.login-here" msgstr "Inicie sesión aquí" @@ -59,10 +39,6 @@ msgstr "Inicie sesión aquí" msgid "auth.login-submit" msgstr "Iniciar sesión" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "¡Qué bueno verte de nuevo!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -71,10 +47,6 @@ msgstr "GitHub" msgid "auth.login-with-gitlab-submit" msgstr "GitLab" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-google-submit" -msgstr "Google" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-ldap-submit" msgstr "LDAP" @@ -83,14 +55,6 @@ msgstr "LDAP" msgid "auth.login-with-oidc-submit" msgstr "Open ID" -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "El nombre debe contener algún carácter distinto al del espacio." - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "El nombre debe contener como máximo 250 caracteres." - #: src/app/main/ui/auth/recovery.cljs msgid "auth.new-password" msgstr "Escribe una nueva contraseña" @@ -107,16 +71,6 @@ msgstr "Contraseña cambiada correctamente" msgid "auth.notifications.profile-not-verified" msgstr "El perfil no está verificado, verifique el perfil antes de continuar." -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.recovery-token-sent" -msgstr "" -"El enlace de recuperación de contraseña ha sido enviado a su bandeja de " -"entrada de su correo electrónico." - -#: src/app/main/ui/auth/verify_token.cljs -msgid "auth.notifications.team-invitation-accepted" -msgstr "Se unió al equipo con éxito" - #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.password" msgstr "Contraseña" @@ -136,10 +90,6 @@ msgstr "Política de privacidad" msgid "auth.recovery-request-submit" msgstr "Recuperar contraseña" -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-subtitle" -msgstr "Le enviaremos un correo electrónico con instrucciones" - #: src/app/main/ui/auth/recovery_request.cljs msgid "auth.recovery-request-title" msgstr "¿Has olvidado tu contraseña?" @@ -156,33 +106,15 @@ msgstr "¿No tienes cuenta aún?" msgid "auth.register-submit" msgstr "Crea una cuenta" -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-subtitle" -msgstr "Es gratis, es de código abierto" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-title" -msgstr "Crea una cuenta" - #: src/app/main/ui/auth.cljs msgid "auth.sidebar-tagline" msgstr "La solución de código abierto para diseño y creación de prototipos." -msgid "auth.terms-of-service" -msgstr "Términos de servicio" - msgid "auth.terms-privacy-agreement" msgstr "" "Al crear una nueva cuenta, acepta nuestros términos de servicio y política " "de privacidad." -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Al crear una nueva cuenta, acepta nuestros [terms of service](%s) y nuestra " -"[privacy policy](%s)." - #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "Hemos enviado un correo electrónico de verificación" @@ -197,11 +129,6 @@ msgstr "Publicar" msgid "common.share-link.all-users" msgstr "Todos los usuarios de Penpot" -msgid "common.share-link.confirm-deletion-link-description" -msgstr "" -"¿Estás seguro de que deseas eliminar este enlace? Si lo haces ya no estará " -"disponible para nadie" - msgid "common.share-link.current-tag" msgstr "(actual)" @@ -211,12 +138,6 @@ msgstr "Borrar enlace" msgid "common.share-link.get-link" msgstr "Conseguir enlace" -msgid "common.share-link.link-copied-success" -msgstr "Enlace copiado exitosamente" - -msgid "common.share-link.manage-ops" -msgstr "Administrar permisos" - msgid "common.share-link.page-shared" msgid_plural "common.share-link.page-shared" msgstr[0] "1 página compartida" @@ -234,53 +155,17 @@ msgstr "Cualquier persona con enlace tendrá acceso" msgid "common.share-link.permissions-pages" msgstr "Páginas compartidas" -msgid "common.share-link.placeholder" -msgstr "El enlace para compartir aparecerá aquí" - -msgid "common.share-link.team-members" -msgstr "Solo miembros del equipo" - -msgid "common.share-link.title" -msgstr "Compartir prototipos" - msgid "common.share-link.view-all" msgstr "Seleccionar todo" -msgid "common.unpublish" -msgstr "Despublicar" - #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.team-hero.management" msgstr "Gestión de equipos" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.text" -msgstr "" -"Penpot está destinado a equipos. Invite a miembros a trabajar juntos en " -"proyectos y archivos" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.title" -msgstr "¡En equipo!" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.info" -msgstr "" -"Aprenda los conceptos básicos en Penpot mientras se divierte con este " -"tutorial práctico." - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.start" -msgstr "Iniciar el tutorial" - #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.tutorial-hero.title" msgstr "Tutorial práctico" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.info" -msgstr "Date un paseo por Penpot y conoce sus principales características." - #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.walkthrough-hero.start" msgstr "Iniciar el recorrido" @@ -293,26 +178,14 @@ msgstr "Tutorial de la interfaz" msgid "dashboard.access-tokens.copied-success" msgstr "Token copiado" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "Generar nuevo token" - #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.create.success" msgstr "Token de acceso creado correctamente." -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "Presione el botón \"Generar nuevo token\" para generar uno." - #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.empty.no-access-tokens" msgstr "No tienes tokens hasta el momento." -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "El nombre es requerido" - #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.expiration-180-days" msgstr "180 días" @@ -333,10 +206,6 @@ msgstr "90 días" msgid "dashboard.access-tokens.expiration-never" msgstr "Nunca" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "Expirado el %s" - #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.expires-on" msgstr "Vence el %s" @@ -345,17 +214,6 @@ msgstr "Vence el %s" msgid "dashboard.access-tokens.no-expiration" msgstr "Sin fecha de vencimiento" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "Tokens de acceso personal" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"Los tokens de acceso personal funcionan como una alternativa a nuestro " -"sistema de autenticación de inicio de sesión/contraseña y pueden usarse " -"para permitir que una aplicación acceda a la API interna de Penpot" - #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.token-will-expire" msgstr "El token caducará el %s" @@ -372,14 +230,6 @@ msgstr "Agregar como biblioteca compartida" msgid "dashboard.change-email" msgstr "Cambiar el correo electrónico" -#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs -msgid "dashboard.copy-suffix" -msgstr "(copiar)" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.create-new-team" -msgstr "Crear nuevo equipo" - #: src/app/main/ui/dashboard/sidebar.cljs msgid "dashboard.default-team-name" msgstr "Tu Penpot" @@ -413,6 +263,164 @@ msgstr "" msgid "dashboard.export-binary-multi" msgstr "Descargar %s archivos Penpot (.penpot)" +#: src/app/main/ui/auth/register.cljs +msgid "auth.already-have-account" +msgstr "¿Ya tienes una cuenta?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.check-your-email" +msgstr "" +"Revise su correo electrónico y haga clic en el enlace para verificar y " +"comenzar a usar Penpot." + +#: src/app/main/ui/auth/register.cljs +msgid "auth.demo-warning" +msgstr "" +"Este es un servicio DEMO, NO LO UTILICE para trabajos reales, los proyectos " +"se borrarán periódicamente." + +#: src/app/main/ui/auth/register.cljs +msgid "auth.fullname" +msgstr "Nombre completo" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-title" +msgstr "¡Qué bueno verte de nuevo!" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-google-submit" +msgstr "Google" + +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "El nombre debe contener algún carácter distinto al del espacio." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "El nombre debe contener como máximo 250 caracteres." + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.recovery-token-sent" +msgstr "" +"El enlace de recuperación de contraseña ha sido enviado a su bandeja de " +"entrada de su correo electrónico." + +#: src/app/main/ui/auth/verify_token.cljs +msgid "auth.notifications.team-invitation-accepted" +msgstr "Se unió al equipo con éxito" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-subtitle" +msgstr "Le enviaremos un correo electrónico con instrucciones" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-subtitle" +msgstr "Es gratis, es de código abierto" + +msgid "auth.terms-of-service" +msgstr "Términos de servicio" + +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Al crear una nueva cuenta, acepta nuestros [terms of service](%s) y nuestra [" +"privacy policy](%s)." + +msgid "common.share-link.confirm-deletion-link-description" +msgstr "" +"¿Estás seguro de que deseas eliminar este enlace? Si lo haces ya no estará " +"disponible para nadie" + +msgid "common.share-link.link-copied-success" +msgstr "Enlace copiado exitosamente" + +msgid "common.share-link.manage-ops" +msgstr "Administrar permisos" + +msgid "common.share-link.placeholder" +msgstr "El enlace para compartir aparecerá aquí" + +msgid "common.share-link.team-members" +msgstr "Solo miembros del equipo" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-title" +msgstr "Crea una cuenta" + +msgid "common.share-link.title" +msgstr "Compartir prototipos" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.text" +msgstr "" +"Penpot está destinado a equipos. Invite a miembros a trabajar juntos en " +"proyectos y archivos" + +msgid "common.unpublish" +msgstr "Despublicar" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.title" +msgstr "¡En equipo!" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.info" +msgstr "" +"Aprenda los conceptos básicos en Penpot mientras se divierte con este " +"tutorial práctico." + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.start" +msgstr "Iniciar el tutorial" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.info" +msgstr "Date un paseo por Penpot y conoce sus principales características." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "Presione el botón \"Generar nuevo token\" para generar uno." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "Generar nuevo token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "El nombre es requerido" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "Expirado el %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "Tokens de acceso personal" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"Los tokens de acceso personal funcionan como una alternativa a nuestro " +"sistema de autenticación de inicio de sesión/contraseña y pueden usarse para " +"permitir que una aplicación acceda a la API interna de Penpot" + +#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs +msgid "dashboard.copy-suffix" +msgstr "(copiar)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.create-new-team" +msgstr "Crear nuevo equipo" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to-link" +msgstr "Información sobre cómo configurar las exportaciones en Penpot." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.no-elements" +msgstr "No hay elementos con configuración de exportación." + msgid "dashboard.export-frames" msgstr "Exportar tableros como PDF" @@ -437,28 +445,20 @@ msgstr "" "Puede agregar configuraciones de exportación a elementos desde las " "propiedades de diseño (en la parte inferior de la barra lateral derecha)." -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to-link" -msgstr "Información sobre cómo configurar las exportaciones en Penpot." - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.no-elements" -msgstr "No hay elementos con configuración de exportación." +msgid "dashboard.export-standard-multi" +msgstr "Descargar %s archivos estándar (.svg + .json)" #: src/app/main/ui/export.cljs msgid "dashboard.export-shapes.title" msgstr "Selección de exportación" -msgid "dashboard.export-standard-multi" -msgstr "Descargar %s archivos estándar (.svg + .json)" - msgid "dashboard.export.detail" msgstr "* Puede incluir componentes, gráficos, colores y/o tipografías." msgid "dashboard.export.explain" msgstr "" -"Uno o más archivos que desea exportar utilizan bibliotecas compartidas. " -"¿Qué quiere hacer con sus activos*?" +"Uno o más archivos que desea exportar utilizan bibliotecas compartidas. ¿Qué " +"quiere hacer con sus activos*?" msgid "dashboard.export.options.all.message" msgstr "" @@ -504,12 +504,6 @@ msgstr "dejar el equipo" msgid "dashboard.libraries-and-templates" msgstr "Bibliotecas y plantillas" -msgid "dashboard.libraries-and-templates.explore" -msgstr "Explore más de ellos y sepa cómo contribuir" - -msgid "dashboard.libraries-and-templates.import-error" -msgstr "Hubo un problema al importar la plantilla. La plantilla no fue importada." - #: src/app/main/ui/dashboard/libraries.cljs msgid "dashboard.libraries-title" msgstr "Bibliotecas" @@ -518,6 +512,13 @@ msgstr "Bibliotecas" msgid "dashboard.loading-files" msgstr "cargando tus archivos…" +msgid "dashboard.libraries-and-templates.explore" +msgstr "Explore más de ellos y sepa cómo contribuir" + +msgid "dashboard.libraries-and-templates.import-error" +msgstr "" +"Hubo un problema al importar la plantilla. La plantilla no fue importada." + msgid "dashboard.loading-fonts" msgstr "cargando tus fuentes…" diff --git a/frontend/translations/fr.po b/frontend/translations/fr.po index b978a7da3..87d06e573 100644 --- a/frontend/translations/fr.po +++ b/frontend/translations/fr.po @@ -1,15 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-24 15:02+0000\n" -"Last-Translator: Louis Chance \n" -"Language-Team: French " -"\n" +"PO-Revision-Date: 2023-11-16 18:03+0000\n" +"Last-Translator: Swapnil C \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.2\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -180,10 +180,6 @@ msgstr "" msgid "auth.verification-email-sent" msgstr "Nous avons envoyé un e-mail de vérification à" -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "...image de marque, illustrations, supports marketing, etc." - msgid "common.publish" msgstr "Publier" @@ -912,13 +908,6 @@ msgstr "" msgid "errors.feature-not-supported" msgstr "La fonctionnalité '%s' n'est pas prise en charge." -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Il semble y avoir une incompatibilité entre les fonctionnalités actives et " -"celles du fichier que tentez d'ouvrir. Vous devez activer les migrations " -"pour '%s' avant de pouvoir ouvrir le fichier." - #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -988,10 +977,6 @@ msgstr "" msgid "errors.registration-disabled" msgstr "L’enregistrement est actuellement désactivé." -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Fonctionnalité incompatible détectée '%s'" - msgid "errors.team-leave.insufficient-members" msgstr "" "Il n'y a pas assez de membres pour quitter l'équipe, vous voulez " @@ -1015,10 +1000,6 @@ msgstr "Une erreur inattendue s’est produite." msgid "errors.unexpected-token" msgstr "Jeton inconnu" -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Le numéro de version du fichier est incompatible" - msgid "errors.webhooks.connection" msgstr "Erreur de connexion, URL inaccessible" @@ -1758,12 +1739,6 @@ msgstr "Votre compte" msgid "media.loading" msgstr "Chargement de l’image…" -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Votre bibliothèque est vide. Une fois ajoutées comme Bibliothèque Partagée, " -"les ressources que vous créez seront utilisables dans vos autres fichiers. " -"Voulez-vous vraiment les publier ?" - #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -2196,10 +2171,6 @@ msgstr "" msgid "modals.update-remote-component.message" msgstr "Actualiser le composant d’une bibliothèque" -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "Une nouvelle version est disponible, merci de rafraîchir la page" - #: src/app/main/ui/dashboard/team.cljs msgid "notifications.invitation-email-sent" msgstr "E‑mail d'invitation envoyé avec succès" @@ -2296,7 +2267,7 @@ msgid "onboarding-v2.welcome.desc3.title" msgstr "Guide du contributeur" msgid "onboarding-v2.welcome.title" -msgstr "Bienvenue sur Penpot !" +msgstr "Bienvenu sur Penpot !" msgid "onboarding.choice.team-up.create-team-desc" msgstr "" @@ -2365,178 +2336,6 @@ msgstr "Penpot" msgid "profile.recovery.go-to-login" msgstr "Aller à la page de connexion" -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "Quel est l'outil de design avec lequel vous avez plus d'expérience?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "11-30" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "31-50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "Beaucoup" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Adobe XD" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Canevas" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "Comment décririez-vous votre expérience de travail sur..." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "Designer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "Développeur" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "En découvrir plus à propos de Penpot" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Figma" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Fondateur/Direction" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "Je suis freelance" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "Obtenir le code du projet de mon équipe " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "... design d'interface, éléments visuels, systèmes de conception, etc." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "InVision" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "Laisser un commentaire sur mon projet d'équipe" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "C'est parti !" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "Gestionnaire de produit ou de projet" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Marketing" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "Plus que 50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "Suivant" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "Aucune" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "Autres (préciser)" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "Je travaille sur un projet personnel" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "Précédent" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "Comment comptez-vous utiliser Penpot ?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "Quel est votre rôle ?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "Sélectionnez une option" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Sketch" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.some" -msgstr "Un peu" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "Commencer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "Commencer à travailler sur mon projet" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "Étudiant ou enseignant" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "Quelle est la taille de votre équipe ?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "Tester Penpot pour voir si ça convient à mon équipe " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "Essayer Penpot avant de l'utiliser en local" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "" -"... wireframes, parcours et flux utilisateurs, arborescence de navigation, " -"etc." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "Travailler sur des idées de concept" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"Vos retours nous aideront à comprendre vos habitudes et préférences afin " -"que nous puissions continuer à améliorer Penpot." - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Détacher" - #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, @@ -3014,12 +2813,6 @@ msgstr "Démasquer" msgid "shortcuts.v-distribute" msgstr "Distribuer verticalement" -msgid "shortcuts.zoom-lense-decrease" -msgstr "Diminuer le zoom" - -msgid "shortcuts.zoom-lense-increase" -msgstr "Augmenter le zoom" - msgid "shortcuts.zoom-selected" msgstr "Zoomer sur la sélection" @@ -3055,10 +2848,6 @@ msgstr "Bibliothèques Partagées - %s - Penpot" msgid "title.default" msgstr "Penpot - Liberté de conception pour les équipes" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "title.settings.access-tokens" -msgstr "Profil - Jetons d'accès" - #: src/app/main/ui/settings/feedback.cljs msgid "title.settings.feedback" msgstr "Donnez votre avis - Penpot" @@ -3087,9 +2876,6 @@ msgstr "Membres - %s - Penpot" msgid "title.team-settings" msgstr "Configuration - %s - Penpot" -msgid "title.team-webhooks" -msgstr "Webhooks - %s - Penpot" - #: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs msgid "title.viewer" msgstr "%s - Mode spectateur - Penpot" @@ -3125,9 +2911,6 @@ msgstr "Ne pas afficher les interactions" msgid "viewer.header.fullscreen" msgstr "Plein écran" -msgid "viewer.header.inspect-section" -msgstr "Inspecter (%s)" - #: src/app/main/ui/viewer/header.cljs msgid "viewer.header.interactions" msgstr "Interactions" @@ -3151,9 +2934,6 @@ msgstr "Afficher les interactions au clic" msgid "viewer.header.sitemap" msgstr "Plan du site" -msgid "webhooks.last-delivery.success" -msgstr "Le dernier envoi a réussi." - #: src/app/main/ui/workspace/sidebar/align.cljs msgid "workspace.align.hcenter" msgstr "Aligner horizontalement au centre (%s)" @@ -3225,9 +3005,6 @@ msgstr "Supprimer" msgid "workspace.assets.duplicate" msgstr "Dupliquer" -msgid "workspace.assets.duplicate-main" -msgstr "Dupliquer le principal" - #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.edit" @@ -3257,9 +3034,6 @@ msgstr "Bibliothèque locale" msgid "workspace.assets.not-found" msgstr "Aucune ressource trouvée" -msgid "workspace.assets.open-library" -msgstr "Ouvrir le fichier de la bibliothèque" - #: src/app/main/ui/workspace/sidebar/sitemap.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs @@ -3280,10 +3054,6 @@ msgid_plural "workspace.assets.selected-count" msgstr[0] "%s élément sélectionné" msgstr[1] "%s éléments sélectionnés" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "Bibliothèque partagée" - #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" @@ -3319,9 +3089,6 @@ msgstr "Interlignage" msgid "workspace.assets.typography.sample" msgstr "Ag" -msgid "workspace.assets.typography.text-styles" -msgstr "Styles de texte" - #: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs msgid "workspace.assets.typography.text-transform" msgstr "Transformer le texte" @@ -3356,9 +3123,6 @@ msgstr "Dégradé radial" msgid "workspace.header.menu.disable-dynamic-alignment" msgstr "Désactiver l’alignement dynamique" -msgid "workspace.header.menu.disable-scale-content" -msgstr "Désactiver l'échelle proportionnelle" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-scale-text" msgstr "Désactiver la mise à l'échelle du texte" @@ -3374,9 +3138,6 @@ msgstr "Désactiver l’accrochage au pixel" msgid "workspace.header.menu.enable-dynamic-alignment" msgstr "Activer l’alignement dynamique" -msgid "workspace.header.menu.enable-scale-content" -msgstr "Activer l'échelle proportionnelle" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-scale-text" msgstr "Activer le redimensionnement du texte" @@ -3427,9 +3188,6 @@ msgstr "Préférences" msgid "workspace.header.menu.option.view" msgstr "Vue" -msgid "workspace.header.menu.redo" -msgstr "Répéter" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.select-all" msgstr "Tout sélectionner" @@ -3453,9 +3211,6 @@ msgstr "Montrer les règles" msgid "workspace.header.menu.show-textpalette" msgstr "Afficher la palette des polices" -msgid "workspace.header.menu.undo" -msgstr "Annuler" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.reset-zoom" msgstr "Réinitialiser" @@ -3480,10 +3235,6 @@ msgstr "Modifications non sauvegardées" msgid "workspace.header.viewer" msgstr "Mode spectateur (%s)" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom" -msgstr "Zoom" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.zoom-fill" msgstr "Remplir l’écran" @@ -3504,9 +3255,6 @@ msgstr "Plein écran" msgid "workspace.header.zoom-selected" msgstr "Zoomer sur la sélection" -msgid "workspace.layout_grid.editor.title" -msgstr "Édition de la grille" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Ajouter" @@ -3515,32 +3263,16 @@ msgstr "Ajouter" msgid "workspace.libraries.colors" msgstr "%s couleurs" -#: src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.empty-palette" -msgstr "Il n'y a pas encore de styles de couleur dans votre bibliothèque" - -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "Il n'y a pas encore de styles typographiques dans votre bibliothèque" - #: src/app/main/ui/workspace/colorpicker/libraries.cljs, #: src/app/main/ui/workspace/colorpalette.cljs msgid "workspace.libraries.colors.file-library" msgstr "Bibliothèque du fichier" -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.hsv" -msgstr "HSV" - #: src/app/main/ui/workspace/colorpicker/libraries.cljs, #: src/app/main/ui/workspace/colorpalette.cljs msgid "workspace.libraries.colors.recent-colors" msgstr "Couleurs récentes" -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgb-complementary" -msgstr "Complémentaire en RVB" - #: src/app/main/ui/workspace/colorpicker.cljs msgid "workspace.libraries.colors.rgba" msgstr "RVBA" @@ -3573,10 +3305,6 @@ msgstr "BIBLIOTHÈQUES" msgid "workspace.libraries.library" msgstr "BIBLIOTHÈQUE" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library-updates" -msgstr "MISES À JOUR DE LA BIBLIOTHÈQUE" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "Aucune Bibliothèque Partagée n’a besoin d’être mise à jour" @@ -3613,10 +3341,6 @@ msgstr "%s typographies" msgid "workspace.libraries.update" msgstr "Actualiser" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "Voir tous les changements" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.updates" msgstr "MISES À JOUR" @@ -3641,28 +3365,10 @@ msgstr "Flou de sélection" msgid "workspace.options.canvas-background" msgstr "Couleur de fond du canvas" -msgid "workspace.options.clip-content" -msgstr "Tronquer le contenu" - #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs msgid "workspace.options.component" msgstr "Composant" -msgid "workspace.options.component.annotation" -msgstr "Note" - -msgid "workspace.options.component.copy" -msgstr "Copier" - -msgid "workspace.options.component.create-annotation" -msgstr "Créer une note" - -msgid "workspace.options.component.edit-annotation" -msgstr "Éditer une note" - -msgid "workspace.options.component.main" -msgstr "Principal" - #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Contraintes" @@ -3716,12 +3422,6 @@ msgstr "Export" msgid "workspace.options.export-multiple" msgstr "Exporter la sélection" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "workspace.options.export-object" -msgid_plural "workspace.options.export-object" -msgstr[0] "Exporter 1 élément" -msgstr[1] "Exporter %s éléments" - #: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs msgid "workspace.options.export.suffix" msgstr "Suffixe" @@ -3755,10 +3455,6 @@ msgstr "Indiquer le début du flux" msgid "workspace.options.flows.flow-start" msgstr "Début du flux" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow-starts" -msgstr "Départs des flux" - #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.auto" msgstr "Automatique" @@ -3857,136 +3553,26 @@ msgstr "Contour de groupe" msgid "workspace.options.height" msgstr "Hauteur" -msgid "workspace.options.inspect" -msgstr "Inspecter" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-action" msgstr "Action" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-after-delay" -msgstr "Après un délai" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation" -msgstr "Animation" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-dissolve" -msgstr "Dissolution" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-animation-none" msgstr "Aucune" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-push" -msgstr "Pousser" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-slide" -msgstr "Glissement" - -msgid "workspace.options.interaction-auto" -msgstr "automatique" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-background" -msgstr "Ajouter une superposition d'arrière-plan" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-close-outside" msgstr "Fermer en cliquant a l'extérieur" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay" -msgstr "Fermer la superposition" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay-dest" -msgstr "Fermer la superposition : %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-delay" -msgstr "Délai" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-destination" -msgstr "Destination" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-duration" msgstr "Durée" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing" -msgstr "Easing" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease" -msgstr "Ease" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in" -msgstr "Ease in" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in-out" -msgstr "Ease in out" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-out" -msgstr "Ease out" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-linear" -msgstr "Linéaire" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-in" -msgstr "Dans" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-enter" -msgstr "Entrée de la souris" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-leave" -msgstr "Sortie de la souris" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-ms" -msgstr "ms" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to" -msgstr "Naviguer vers" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to-dest" -msgstr "Naviguer vers : %s" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-none" msgstr "(non définie)" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-offset-effect" -msgstr "Effet de décalage" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-on-click" -msgstr "Au clic" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay" -msgstr "Ouvrir la superposition" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay-dest" -msgstr "Ouvrir la superposition : %s" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-open-url" msgstr "Ouvrir l'URL" @@ -3995,10 +3581,6 @@ msgstr "Ouvrir l'URL" msgid "workspace.options.interaction-out" msgstr "Sortie" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-center" -msgstr "Centré en bas" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-pos-bottom-left" msgstr "En bas à gauche" @@ -4011,10 +3593,6 @@ msgstr "En bas à droite" msgid "workspace.options.interaction-pos-center" msgstr "Au centre" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-manual" -msgstr "Manuel" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-pos-top-center" msgstr "Centrer en haut" @@ -4027,10 +3605,6 @@ msgstr "En haut à gauche" msgid "workspace.options.interaction-pos-top-right" msgstr "En haut à droite" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-position" -msgstr "Position" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-preserve-scroll" msgstr "Conserver la position du défilement" @@ -4039,22 +3613,6 @@ msgstr "Conserver la position du défilement" msgid "workspace.options.interaction-prev-screen" msgstr "Écran précédent" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-relative-to" -msgstr "Relatif à" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-self" -msgstr "soi" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay" -msgstr "Activer/désactiver la superposition" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay-dest" -msgstr "Activer/désactiver la superposition : %s" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-trigger" msgstr "Déclencheur" @@ -4063,18 +3621,6 @@ msgstr "Déclencheur" msgid "workspace.options.interaction-url" msgstr "URL" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-hovering" -msgstr "En survolant" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-pressing" -msgstr "En appuyant" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interactions" -msgstr "Interactions" - #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs msgid "workspace.options.layer-options.blend-mode.color" msgstr "Couleur" @@ -4191,26 +3737,6 @@ msgstr "Largeur minimale" msgid "workspace.options.layout.bottom" msgstr "En bas" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column" -msgstr "Colonne" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column-reverse" -msgstr "Colonne inversée" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row" -msgstr "Ligne" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row-reverse" -msgstr "Ligne inversée" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.gap" -msgstr "Gap" - #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.left" msgstr "A gauche" @@ -4227,34 +3753,14 @@ msgstr "Tous les côtés" msgid "workspace.options.layout.margin-simple" msgstr "Une marge simple" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.packed" -msgstr "compacté" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding" -msgstr "Marge intérieure" - #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.padding-all" msgstr "Tous les côtés" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding-simple" -msgstr "Marge intérieure simple" - #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.right" msgstr "À droite" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.space-around" -msgstr "espace autour" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.space-between" -msgstr "espace entre" - #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.top" msgstr "En haut" @@ -4263,13 +3769,6 @@ msgstr "En haut" msgid "workspace.options.more-colors" msgstr "Plus de couleurs" -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.more-lib-colors" -msgstr "Plus de couleurs de la bibliothèque" - -msgid "workspace.options.opacity" -msgstr "Opacité" - #: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.position" @@ -4306,9 +3805,6 @@ msgstr "Tous les coins" msgid "workspace.options.radius.single-corners" msgstr "Coins individuels" -msgid "workspace.options.recent-fonts" -msgstr "Récentes" - #: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs msgid "workspace.options.retry" msgstr "Réessayer" @@ -4317,9 +3813,6 @@ msgstr "Réessayer" msgid "workspace.options.rotation" msgstr "Rotation" -msgid "workspace.options.search-font" -msgstr "Rechercher une police" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.select-a-shape" msgstr "" @@ -4377,13 +3870,6 @@ msgstr "Ombre de groupe" msgid "workspace.options.shadow-options.title.multiple" msgstr "Ombres de la sélection" -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.show-fill-on-export" -msgstr "Afficher à l'export" - -msgid "workspace.options.show-in-viewer" -msgstr "Montrer en mode spectateur" - #: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.size" @@ -4398,66 +3884,12 @@ msgid "workspace.options.stroke" msgstr "Bordure" #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker" -msgstr "Marqueur cercle" +msgid "workspace.options.stroke-cap.none" +msgstr "Aucune" #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Cercle" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker" -msgstr "Marqueur diamant" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Diamant" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow" -msgstr "Flèche de ligne" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Flèche" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.none" -msgstr "Aucune" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.round" -msgstr "Rond" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square" -msgstr "Carré" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker" -msgstr "Marqueur carré" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Rectangle" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow" -msgstr "Flèche triangle" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Triangle" - -msgid "workspace.options.stroke-color" -msgstr "Couleur du tracé" - -msgid "workspace.options.stroke-width" -msgstr "Largeur du tracé" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.center" -msgstr "Centre" +msgid "workspace.options.stroke.center" +msgstr "Centre" #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke.dashed" @@ -4621,13 +4053,6 @@ msgstr "Dissocier les nœuds (%s)" msgid "workspace.path.actions.snap-nodes" msgstr "Aligner les nœuds (%s)" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.add-flex" -msgstr "Ajouter flex layout" - -msgid "workspace.shape.menu.add-grid" -msgstr "Ajouter grid layout" - #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.back" msgstr "Envoyer au fond" @@ -4640,9 +4065,6 @@ msgstr "Éloigner" msgid "workspace.shape.menu.copy" msgstr "Copier" -msgid "workspace.shape.menu.create-annotation" -msgstr "Créer une note" - #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.create-artboard-from-selection" msgstr "Créer un plan de travail depuis la sélection" @@ -4651,9 +4073,6 @@ msgstr "Créer un plan de travail depuis la sélection" msgid "workspace.shape.menu.create-component" msgstr "Créer un composant" -msgid "workspace.shape.menu.create-multiple-components" -msgstr "Créer plusieurs composants" - #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.cut" msgstr "Couper" @@ -4662,10 +4081,6 @@ msgstr "Couper" msgid "workspace.shape.menu.delete" msgstr "Supprimer" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.delete-flow-start" -msgstr "Supprimer le départ du flux" - #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, #: src/app/main/ui/workspace/context_menu.cljs, #: src/app/main/ui/workspace/context_menu.cljs @@ -4701,10 +4116,6 @@ msgstr "Retourner horizontalement" msgid "workspace.shape.menu.flip-vertical" msgstr "Retourner verticalement" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flow-start" -msgstr "Départ du flux" - #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.forward" msgstr "Avancer" @@ -4729,9 +4140,6 @@ msgstr "Masquer" msgid "workspace.shape.menu.hide-ui" msgstr "Montrer/Masquer l'interface" -msgid "workspace.shape.menu.intersection" -msgstr "Intersection" - #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.lock" msgstr "Bloquer" @@ -4749,42 +4157,21 @@ msgstr "Coller" msgid "workspace.shape.menu.path" msgstr "Chemin" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.remove-flex" -msgstr "Retirer flex layout" - #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, #: src/app/main/ui/workspace/context_menu.cljs, #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.reset-overrides" msgstr "Annuler les modifications" -msgid "workspace.shape.menu.restore-main" -msgstr "Rétablir le composant principal" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.select-layer" -msgstr "Sélectionner le calque" - #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.show" msgstr "Montrer" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show-in-assets" -msgstr "Afficher dans le panneau des ressources" - #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.show-main" msgstr "Afficher le composant principal" -msgid "workspace.shape.menu.thumbnail-remove" -msgstr "Retirer la miniature" - -msgid "workspace.shape.menu.thumbnail-set" -msgstr "Définir comme miniature" - msgid "workspace.shape.menu.transform-to-path" msgstr "Transformer en chemin" @@ -4803,22 +4190,12 @@ msgstr "Débloquer" msgid "workspace.shape.menu.unmask" msgstr "Supprimer le masque" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.update-components-in-bulk" -msgstr "Mettre à jour les composants" - #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, #: src/app/main/ui/workspace/context_menu.cljs, #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.update-main" msgstr "Actualiser le composant principal" -msgid "workspace.sidebar.collapse" -msgstr "Réduire la barre latérale" - -msgid "workspace.sidebar.expand" -msgstr "Ouvrir la barre latérale" - #: src/app/main/ui/workspace/left_toolbar.cljs msgid "workspace.sidebar.history" msgstr "Historique (%s)" @@ -4827,12 +4204,6 @@ msgstr "Historique (%s)" msgid "workspace.sidebar.layers" msgstr "Calques" -msgid "workspace.sidebar.layers.components" -msgstr "Composants" - -msgid "workspace.sidebar.layers.frames" -msgstr "Plans de travail" - msgid "workspace.sidebar.layers.groups" msgstr "Groupes" @@ -4842,9 +4213,6 @@ msgstr "Images" msgid "workspace.sidebar.layers.masks" msgstr "Les masques" -msgid "workspace.sidebar.layers.search" -msgstr "Rechercher des calques" - msgid "workspace.sidebar.layers.shapes" msgstr "Formes" @@ -4912,10 +4280,6 @@ msgstr "Raccourcis (%s)" msgid "workspace.toolbar.text" msgstr "Texte (%s)" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.text-palette" -msgstr "Polices (%s)" - #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Il n’y a aucun changement dans l’historique pour l’instant" @@ -5035,10 +4399,6 @@ msgstr "Historique" msgid "workspace.updates.dismiss" msgstr "Ignorer" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "Plus d'information" - #: src/app/main/data/workspace/libraries.cljs msgid "workspace.updates.there-are-updates" msgstr "Il y a des mises à jour dans les Bibliothèques Partagées" @@ -5049,3 +4409,628 @@ msgstr "Actualiser" msgid "workspace.viewport.click-to-close-path" msgstr "Cliquez pour fermer le chemin" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Développeur" + +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "Une nouvelle version est disponible, merci de rafraîchir la page" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "Beaucoup" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "Comment décririez-vous votre expérience de travail sur..." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canevas" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "En découvrir plus à propos de Penpot" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "Quel est l'outil de design avec lequel vous avez plus d'expérience?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "Je travaille sur un projet personnel" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "Quelle est la taille de votre équipe ?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Comment comptez-vous utiliser Penpot ?" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "Bibliothèque partagée" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Autres (préciser)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Étudiant ou enseignant" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Essayer Penpot avant de l'utiliser en local" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Travailler sur des idées de concept" + +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "Il n'y a pas encore de styles de couleur dans votre bibliothèque" + +msgid "workspace.options.component.copy" +msgstr "Copier" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interactions" +msgstr "Interactions" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-center" +msgstr "Centré en bas" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Vos retours nous aideront à comprendre vos habitudes et préférences afin que " +"nous puissions continuer à améliorer Penpot." + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-push" +msgstr "Pousser" + +msgid "workspace.options.inspect" +msgstr "Inspecter" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Gestionnaire de produit ou de projet" + +msgid "workspace.options.component.create-annotation" +msgstr "Créer une note" + +msgid "viewer.header.inspect-section" +msgstr "Inspecter (%s)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Marketing" + +msgid "workspace.options.opacity" +msgstr "Opacité" + +msgid "workspace.options.component.edit-annotation" +msgstr "Éditer une note" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Obtenir le code du projet de mon équipe " + +msgid "workspace.options.show-in-viewer" +msgstr "Montrer en mode spectateur" + +msgid "workspace.shape.menu.create-multiple-components" +msgstr "Créer plusieurs composants" + +msgid "webhooks.last-delivery.success" +msgstr "Le dernier envoi a réussi." + +msgid "workspace.options.stroke-width" +msgstr "Largeur du tracé" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-out" +msgstr "Ease out" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-self" +msgstr "soi" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-ms" +msgstr "ms" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Rectangle" + +msgid "workspace.options.component.main" +msgstr "Principal" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-starts" +msgstr "Départs des flux" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-position" +msgstr "Position" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Je suis freelance" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-in" +msgstr "Dans" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay" +msgstr "Activer/désactiver la superposition" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow" +msgstr "Flèche triangle" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-slide" +msgstr "Glissement" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "Voir tous les changements" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...image de marque, illustrations, supports marketing, etc." + +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "Il n'y a pas encore de styles typographiques dans votre bibliothèque" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-background" +msgstr "Ajouter une superposition d'arrière-plan" + +msgid "workspace.sidebar.layers.search" +msgstr "Rechercher des calques" + +msgid "shortcuts.zoom-lense-increase" +msgstr "Augmenter le zoom" + +msgid "workspace.shape.menu.add-grid" +msgstr "Ajouter grid layout" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-delay" +msgstr "Délai" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square" +msgstr "Carré" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-between" +msgstr "espace entre" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "Zoom" + +msgid "workspace.options.component.annotation" +msgstr "Note" + +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.more-lib-colors" +msgstr "Plus de couleurs de la bibliothèque" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in" +msgstr "Ease in" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Un peu" + +msgid "workspace.layout_grid.editor.title" +msgstr "Édition de la grille" + +msgid "workspace.header.menu.undo" +msgstr "Annuler" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "Plus que 50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Suivant" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay" +msgstr "Ouvrir la superposition" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-dissolve" +msgstr "Dissolution" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "" +"... wireframes, parcours et flux utilisateurs, arborescence de navigation, " +"etc." + +msgid "workspace.header.menu.disable-scale-content" +msgstr "Désactiver l'échelle proportionnelle" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Commencer" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text-palette" +msgstr "Polices (%s)" + +msgid "workspace.sidebar.layers.frames" +msgstr "Plans de travail" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.hsv" +msgstr "HSV" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete-flow-start" +msgstr "Supprimer le départ du flux" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Diamant" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-offset-effect" +msgstr "Effet de décalage" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row" +msgstr "Ligne" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to" +msgstr "Naviguer vers" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay-dest" +msgstr "Fermer la superposition : %s" + +msgid "workspace.header.menu.redo" +msgstr "Répéter" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column-reverse" +msgstr "Colonne inversée" + +msgid "workspace.assets.duplicate-main" +msgstr "Dupliquer le principal" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Sélectionnez une option" + +msgid "workspace.options.recent-fonts" +msgstr "Récentes" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-pressing" +msgstr "En appuyant" + +msgid "workspace.sidebar.collapse" +msgstr "Réduire la barre latérale" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Designer" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flow-start" +msgstr "Départ du flux" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Aucune" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "C'est parti !" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-flex" +msgstr "Retirer flex layout" + +msgid "workspace.sidebar.layers.components" +msgstr "Composants" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease" +msgstr "Ease" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Détacher" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Sketch" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-relative-to" +msgstr "Relatif à" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.update-components-in-bulk" +msgstr "Mettre à jour les composants" + +msgid "workspace.options.clip-content" +msgstr "Tronquer le contenu" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.select-layer" +msgstr "Sélectionner le calque" + +msgid "workspace.shape.menu.intersection" +msgstr "Intersection" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding" +msgstr "Marge intérieure" + +msgid "title.team-webhooks" +msgstr "Webhooks - %s - Penpot" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library-updates" +msgstr "MISES À JOUR DE LA BIBLIOTHÈQUE" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing" +msgstr "Easing" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Triangle" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row-reverse" +msgstr "Ligne inversée" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export-object" +msgid_plural "workspace.options.export-object" +msgstr[0] "Exporter 1 élément" +msgstr[1] "Exporter %s éléments" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.packed" +msgstr "compacté" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-enter" +msgstr "Entrée de la souris" + +msgid "workspace.assets.open-library" +msgstr "Ouvrir le fichier de la bibliothèque" + +msgid "workspace.header.menu.enable-scale-content" +msgstr "Activer l'échelle proportionnelle" + +msgid "workspace.shape.menu.thumbnail-set" +msgstr "Définir comme miniature" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "Plus d'information" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-hovering" +msgstr "En survolant" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-manual" +msgstr "Manuel" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-leave" +msgstr "Sortie de la souris" + +msgid "workspace.assets.typography.text-styles" +msgstr "Styles de texte" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker" +msgstr "Marqueur cercle" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.gap" +msgstr "Gap" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker" +msgstr "Marqueur carré" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column" +msgstr "Colonne" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation" +msgstr "Animation" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Tester Penpot pour voir si ça convient à mon équipe " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Laisser un commentaire sur mon projet d'équipe" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in-out" +msgstr "Ease in out" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-linear" +msgstr "Linéaire" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-on-click" +msgstr "Au clic" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to-dest" +msgstr "Naviguer vers : %s" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "InVision" + +msgid "workspace.shape.menu.thumbnail-remove" +msgstr "Retirer la miniature" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-around" +msgstr "espace autour" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "Précédent" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay" +msgstr "Fermer la superposition" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker" +msgstr "Marqueur diamant" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-simple" +msgstr "Marge intérieure simple" + +msgid "workspace.shape.menu.create-annotation" +msgstr "Créer une note" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay-dest" +msgstr "Ouvrir la superposition : %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-destination" +msgstr "Destination" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Commencer à travailler sur mon projet" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Flèche" + +msgid "workspace.options.search-font" +msgstr "Rechercher une police" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Quel est votre rôle ?" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-in-assets" +msgstr "Afficher dans le panneau des ressources" + +msgid "workspace.options.interaction-auto" +msgstr "automatique" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Votre bibliothèque est vide. Une fois ajoutées comme Bibliothèque Partagée, " +"les ressources que vous créez seront utilisables dans vos autres fichiers. " +"Voulez-vous vraiment les publier ?" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgb-complementary" +msgstr "Complémentaire en RVB" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.round" +msgstr "Rond" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Fondateur/Direction" + +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.show-fill-on-export" +msgstr "Afficher à l'export" + +msgid "workspace.shape.menu.restore-main" +msgstr "Rétablir le composant principal" + +msgid "workspace.sidebar.expand" +msgstr "Ouvrir la barre latérale" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay-dest" +msgstr "Activer/désactiver la superposition : %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Cercle" + +msgid "workspace.options.stroke-color" +msgstr "Couleur du tracé" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... design d'interface, éléments visuels, systèmes de conception, etc." + +msgid "shortcuts.zoom-lense-decrease" +msgstr "Diminuer le zoom" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "Profil - Jetons d'accès" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow" +msgstr "Flèche de ligne" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-after-delay" +msgstr "Après un délai" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.add-flex" +msgstr "Ajouter flex layout" diff --git a/frontend/translations/ha.po b/frontend/translations/ha.po index f276a92b7..27661a3aa 100644 --- a/frontend/translations/ha.po +++ b/frontend/translations/ha.po @@ -2,4880 +2,4883 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-01-02 16:16+0000\n" "Last-Translator: Alejandro Alonso \n" -"Language-Team: Hausa " -"\n" +"Language-Team: Hausa \n" "Language: ha\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" +"Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.4-dev\n" -#: src/app/main/ui/auth/register.cljs -msgid "auth.already-have-account" -msgstr "ka na da taska?" +msgid "shortcut-subsection.navigation-dashboard" +msgstr "shawagi" -#: src/app/main/ui/auth/register.cljs -msgid "auth.check-your-email" -msgstr "" -"bincika taskarka ta imel,ka danna alamar mahaxa domin tabbatarwa,sannan ka " -"fara amfani da fenfot." +msgid "shortcuts.insert-image" +msgstr "sa hoto" -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.confirm-password" -msgstr "tabbatar da kalmar buxewa" +msgid "shortcuts.bold" +msgstr "fito da shi barobaro" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-account" -msgstr "qirqiri taskar gwaji" +msgid "shortcuts.open-viewer" +msgstr "tafi sashin da masu kallo suke hulda" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-profile" -msgstr "ka na son gwadawa ne kawai?" +msgid "onboarding-v2.before-start.title" +msgstr "kafin ka fara" -#: src/app/main/ui/auth/register.cljs -msgid "auth.demo-warning" -msgstr "" -"wannan aikin gwaji ne kawai,kar ka yi amfani da shi a aikin gaske,lokaci " -"zuwa lokaci za ya ringa vacewa ne." +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-out" +msgstr "fita" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.email" -msgstr "imel" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.create-group-hint" +msgstr "" +"abubuwanka za a samu su suna nan take kamar \"sunan kungiya/ sunan abubuwan\"" -#: src/app/main/ui/auth/login.cljs -msgid "auth.forgot-password" -msgstr "ka manta lambar tsaro?" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.use-default" +msgstr "yi amfani da tsoho" -#: src/app/main/ui/auth/register.cljs -msgid "auth.fullname" -msgstr "cikakken suna" +#, permanent +msgid "inspect.attributes.stroke.alignment.outer" +msgstr "daga waje" -#: src/app/main/ui/auth/register.cljs -msgid "auth.login-here" -msgstr "shiga nan" +#: src/app/main/ui/comments.cljs +msgid "labels.edit" +msgstr "gyara" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-submit" -msgstr "shiga ciki" +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.height" +msgstr "tsawo" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "na ji daxin sake haxuwa da kai!" +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography" +msgstr "tsara rubutu" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-github-submit" -msgstr "matattarar manazarta" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "jaraba kafin ka yi aiki da fenfot" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-gitlab-submit" -msgstr "wurin nazari" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.title" +msgstr "cire memban tawaga" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-google-submit" -msgstr "Gugul" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.move" +msgstr "motsa (%s)" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-ldap-submit" -msgstr "LDAP" +msgid "shortcuts.make-curve" +msgstr "kirkiri lankwasa" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-oidc-submit" -msgstr "shaidar buxewa" +msgid "shortcuts.snap-nodes" +msgstr "yanke kauri" -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "dole suna ya qumshi waxansu alamimon rubutu, sannan tazara." +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "yin aikin kan tunani mai kyau" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "suna dole ya qunshi alamomin rubutu 250." +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "Babu salon kaloli a ma'ajiya yanzu" -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.new-password" -msgstr "sanya sabuwar lambar tsaro" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.title" +msgid_plural "modals.delete-shared-confirm.title" +msgstr[0] "goge kundi" +msgstr[1] "goge kundaye" -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.invalid-token-error" -msgstr "lambar tsaron da ka sanya ba daidai ba ce." +msgid "dashboard.fonts.empty-placeholder" +msgstr "fonts da ka xora nan za ya bayyana." -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.password-changed-successfully" -msgstr "ka canza lambar tsaro" +# SUBSECTIONS +msgid "shortcut-subsection.alignment" +msgstr "kwaskwarima" -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.profile-not-verified" -msgstr "ba a tantance bayananka ba,sai an tantance a ci gaba." +msgid "errors.webhooks.unexpected" +msgstr "matsalar da ba zata ba lokacin farfaxowa" -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.recovery-token-sent" -msgstr "an aika maka da saqon matakan da za a bi domin dawo da lambar tsaronka." +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "kwanaki 30" -#: src/app/main/ui/auth/verify_token.cljs -msgid "auth.notifications.team-invitation-accepted" -msgstr "ka zama dan tawaga" +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "settings.multiple" +msgstr "gauraya" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.password" -msgstr "lambar tsaro" +#: src/app/main/ui/dashboard/team.cljs +msgid "errors.member-is-muted" +msgstr "bayanan da ka nema imel din su ya suma (bayanan matsaloli)." -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-length-hint" -msgstr "aqalla a sami alamoni 8" +msgid "workspace.options.component.copy" +msgstr "Kwafa" -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-not-empty" -msgstr "dole lambar tsaro ta qunshi wasu alamomi, sannan tazara." +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.column" +msgstr "shafi" -msgid "auth.privacy-policy" -msgstr "matakan kaxaita" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.add-shared" +msgstr "tura tamkar fenfot" -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-submit" -msgstr "gano lambar tsaro" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interactions" +msgstr "yayin hulda" -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-subtitle" -msgstr "za mu aika maka da saqon qa'idoji ta imel" +#: src/app/main/ui/auth/login.cljs +msgid "errors.auth-provider-not-configured" +msgstr "manhajar tantancewar ba ta tsaru ba." -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-title" -msgstr "an manta lambar tsaro?" +msgid "workspace.undo.entry.multiple.circle" +msgstr "da'ira" -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.recovery-submit" -msgstr "canza lambar tsaro" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.message" +msgstr "ka tabbata kana son goge wannan alamar?" -#: src/app/main/ui/auth/login.cljs -msgid "auth.register" -msgstr "ba ka da kunxi har yanzu?" +#: src/app/main/ui/static.cljs +msgid "labels.bad-gateway.desc-message" +msgstr "" +"ka jinkirta kaxan sannan ka qara gwadawa; mu na aiki daidai domin tattala " +"aikinmu." -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.register-submit" -msgstr "qirqiri kundi" +#: src/app/main/ui/inspect/attributes/fill.cljs +msgid "inspect.attributes.fill" +msgstr "cika" -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-subtitle" -msgstr "kyauta ne,an buxe hanyar samu" +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "media.loading" +msgstr "xora hoto …" -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-title" -msgstr "qirqiri sabon kundi" +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "lambobi masu xauke da bayani" -#: src/app/main/ui/auth.cljs -msgid "auth.sidebar-tagline" -msgstr "samun hanyar magance matsalar zane-zane." +msgid "shortcuts.open-color-picker" +msgstr "abin daukan kala" -msgid "auth.terms-of-service" -msgstr "dokokin aiki" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-action" +msgstr "aiki" -msgid "auth.terms-privacy-agreement" -msgstr "" -"lokacin qirqirar kundi, sai ka amincewa da yanayi aikin da " -"qa'idojinmuqa'idoji." +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "lambar tsaron ba ta da lokacin daina aiki" -#: src/app/main/ui/auth/register.cljs -msgid "auth.verification-email-sent" -msgstr "mun aika maka da saqon tantancewa ta imel" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object" +msgstr "Ana fitarwa" -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "...branding, illustrations, marketing pieces, etc." +#: src/app/main/ui/workspace/header.cljs +msgid "label.shortcuts" +msgstr "yanke" -msgid "common.publish" -msgstr "wallafawa" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.colors" +msgstr "%s kala" -msgid "common.share-link.all-users" -msgstr "duk fenfot" +msgid "shortcuts.delete" +msgstr "goge" -msgid "common.share-link.confirm-deletion-link-description" -msgstr "ka tabbata ka na son rufe wannan hanyar? idan ka rufe ba mai iya sake bi" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-center" +msgstr "kasa tsakiya" -msgid "common.share-link.current-tag" -msgstr "(yanzu)" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.in-this-file" +msgstr "Ma'adana a wanna fiyal" -msgid "common.share-link.destroy-link" -msgstr "tarwatsa hanya" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-gitlab-submit" +msgstr "wurin nazari" -msgid "common.share-link.get-link" -msgstr "samun hanya" +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-info" +msgstr "bayanin tawaga" -msgid "common.share-link.link-copied-success" -msgstr "an samo kwafi" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.top" +msgstr "sama" -msgid "common.share-link.manage-ops" -msgstr "amincewar shugaba" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"bayaninka za ya sanya mu fahimci kwarewarka da xabi'unka ta haka ne za mu " +"mayar maka da fenfot kayan aikin da ka ke jin daxin aiki da shi." -msgid "common.share-link.page-shared" -msgid_plural "common.share-link.page-shared" -msgstr[0] "tura shafi 1" -msgstr[1] "%s an tura shafi" +msgid "shortcuts.move-unit-down" +msgstr "Matsa da sashin kasa" -msgid "common.share-link.permissions-can-comment" -msgstr "sharhi" +msgid "common.share-link.placeholder" +msgstr "hanya mai kyau za ta bayyana a nan" -msgid "common.share-link.permissions-can-inspect" -msgstr "iya bincka lamba" +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "an shigar kundi 1." +msgstr[1] "%s kundaye sun shiga." -msgid "common.share-link.permissions-hint" -msgstr "duk wanda ya mallaki mataki,za ya iya shiga" +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hleft" +msgstr "Daidaita hagu (%s)" -msgid "common.share-link.permissions-pages" -msgstr "tura shafuka" +msgid "labels.accept" +msgstr "karva" -msgid "common.share-link.placeholder" -msgstr "hanya mai kyau za ta bayyana a nan" +msgid "workspace.shape.menu.transform-to-path" +msgstr "sauya zuwa hanya" -msgid "common.share-link.team-members" -msgstr "memba kaxai" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-title" +msgstr "an manta lambar tsaro?" -msgid "common.share-link.title" -msgstr "fenfot" +msgid "shortcut-subsection.edit" +msgstr "Tace" -msgid "common.share-link.view-all" -msgstr "zavi duka" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.auto" +msgstr "da kanshi" -msgid "common.unpublish" -msgstr "maras wallafa" +msgid "shortcuts.draw-rect" +msgstr "Ractangula" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.management" -msgstr "shuwagabannin tawaga" +msgid "onboarding.choice.team-up.invite-members-info" +msgstr "" +"ka tuna da kowa. masu qirqira, masu tsarawa, shuwagabanniS... daban-daban ya " +"qara :)" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.text" -msgstr "fenfot ta menbobin tawaga ce. kirawo kowa domin yin aiki tarekundaye" +msgid "modals.invite-member.repeated-invitation" +msgstr "" +"waxansu imel daga membobin qungiyar na yanzu. ba za a aikawa da gayyatarsu " +"ba ." -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.title" -msgstr "haxin guiwa!" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-push" +msgstr "Tura" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.info" -msgstr "ka san dokokin fenfot lokacin da ka ke tare da masoya koyarwa." +#: src/app/main/ui/settings/delete_account.cljs +msgid "notifications.profile-deletion-not-allowed" +msgstr "ba za ka iya goge kundin ba. ka jira umarnin tawaga ka fin ka ci gaba." -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.start" -msgstr "fara jagoranci" +msgid "workspace.options.inspect" +msgstr "Duba" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.title" -msgstr "jagoranci" +msgid "inspect.attributes.typography.text-decoration.strikethrough" +msgstr "zana layi tsakiyar rubutu" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.info" -msgstr "bincika manhaja domin sanin manyan sassanta." +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-center" +msgstr "sama tsakiya" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.start" -msgstr "fara koyarwa" +msgid "shortcuts.move-nodes" +msgstr "matsa a hade" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.title" -msgstr "ma'aunin karvuwar aiki" +#: src/app/main/ui/settings.cljs +msgid "dashboard.your-account-title" +msgstr "gidanka" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.copied-success" -msgstr "kwafar lambar tsaro" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.search-placeholder" +msgstr "nema …" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "samo sabuwar lambar tsaro" +msgid "shortcuts.redo" +msgstr "gyara" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "ka sami lambar tsaron da aka yi." +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.multiply" +msgstr "sau" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "" -"danna maddanin qasa\"danna qasa\n" -"emo sabuwar lambar tsaro\" samar da wani." +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.left" +msgstr "Hagu" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.no-access-tokens" -msgstr "ba ka da wasu lambobin tsaro yanzu." +msgid "dashboard.webhooks.active" +msgstr "ya na amfani" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "ana buqatar suna" +msgid "common.share-link.current-tag" +msgstr "(yanzu)" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "kwanaki 180" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs +msgid "errors.email-invalid" +msgstr "sanya imel mai amfani" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "kwanaki 30" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.stretch" +msgstr "mikewa" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-60-days" -msgstr "kwanaki 60" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.letter-spacing" +msgstr "tazarar harafi" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-90-days" -msgstr "kwanaki 90" +msgid "shortcuts.bring-backward" +msgstr "komawa baya" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-never" -msgstr "bai yiwuwa" +msgid "shortcuts.show-shortcuts" +msgstr "nuna / boye yanken" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "gama aiki kan %s" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.new-project" +msgstr "+ sabon aiki" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expires-on" -msgstr "gama aiki kan %s" +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.invalid-token-error" +msgstr "lambar tsaron da ka sanya ba daidai ba ce." -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.no-expiration" -msgstr "ba lokacin daina amfani" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "ma su qirqira" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "mallakar lambobin shiga na sirri" +msgid "labels.show-comments-list" +msgstr "jerin ire-iren yabo" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"lambarka ta shiga na a matsayin zabin hanyar shiga/lambar tsaronmuza a iya " -"amfani tsarin tantancewa,domin shiga manhajar cikin fenfot API" +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.dont-show-interactions" +msgstr "Karka/ki nuna hulda" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-expire" -msgstr "lambar tsaron za ta gama aiki %s" +msgid "dashboard.export.options.detach.message" +msgstr "" +"manhajar tura kundi ba ta shiga cikin fitarwa, wani amfaniqarawa a taska. " -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-not-expire" -msgstr "lambar tsaron ba ta da lokacin daina aiki" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-title" +msgstr "na ji daxin sake haxuwa da kai!" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.add-shared" -msgstr "tura tamkar fenfot" +msgid "shortcut-subsection.shape" +msgstr "Siffa" -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.change-email" -msgstr "canza imel" +#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs +msgid "title.viewer" +msgstr "%s - duba kumburi - Mazubin biruka" -#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs -msgid "dashboard.copy-suffix" -msgstr "(kwafi)" +msgid "dashboard.export.options.merge.title" +msgstr "tura taska ya qunshi bayanan da ke cikin kundin taskoki" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.create-new-team" -msgstr "yi sabuwar tawaga" +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-members" +msgstr "Yan kungiya - %s - Mazubin biruka" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.default-team-name" -msgstr "manhajar fenfot" +msgid "shortcuts.align-justify" +msgstr "Tabbataccan tsari" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.delete-team" -msgstr "goge tawaga" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.direction-rtl" +msgstr "RTL" -msgid "dashboard.download-binary-file" -msgstr "sauke manhajar fenfot(.manhajar fenfot)" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "shugaban aiki" -msgid "dashboard.download-standard-file" -msgstr "sauke cikakken kundi(.svg + .json)" +msgid "workspace.options.component.create-annotation" +msgstr "Kirkiri sharhin rubuta" -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.duplicate" -msgstr "kwafi" +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.rotation" +msgstr "jujjuyawa" #: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.duplicate-multi" -msgstr "kwafi %s kundaye" - -#: src/app/main/ui/dashboard/grid.cljs -#, markdown -msgid "dashboard.empty-placeholder-drafts" -msgstr "" -"nan za a sami kundayen da aka sanya a taska. gwada sanya na ka kundin \"a " -"taskirarmumaginar kundi](https://manhajar fenfot/taskokin maginar " -"kundaye.html)." - -msgid "dashboard.export-binary-multi" -msgstr "sauke %s kundayen manhajar fenfot(.penpot)" +msgid "dashboard.move-to-other-team" +msgstr "tura ma sauran tawaga" -msgid "dashboard.export-frames" -msgstr "Allon fitarwa na PDF" +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.num-of-members" +msgstr "%s memba" -#: src/app/main/ui/export.cljs -msgid "dashboard.export-frames.title" -msgstr "Fitarwa a PDF" +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.admin" +msgstr "shugaba" -msgid "dashboard.export-multi" -msgstr "fitar da fenfot %s kundaye" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-auto-width" +msgstr "sarrafaffen fadi" -#: src/app/main/ui/export.cljs -msgid "dashboard.export-multiple.selected" -msgstr "%s of %s tubullan da aka zava" +msgid "errors.team-leave.member-does-not-exists" +msgstr "mamban da ka ke son sanyawa ba ya a ciki." -#: src/app/main/ui/workspace/header.cljs -msgid "dashboard.export-shapes" -msgstr "Fitarwa" +msgid "workspace.options.shadow-options.color" +msgstr "inuwar kala" -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to" +#, markdown +msgid "dashboard.fonts.warning-text" msgstr "" -"za ka iya daidaita kayan zanenka ta hanyar (amfani da madannin qasa sashen " -"dama)." - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to-link" -msgstr "bayanin yadda ake fitarwa daga fenfot" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.no-elements" -msgstr "ba wasu abubuwan da ake daidaitawa wajen tsara fitarwa." - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.title" -msgstr "Fitar da zavi" +"matsalolin lasisi daga sama zuwa qasa magwajin da ke aiki iri-iri. domin " +"bincikawa za ka iya amfani da aikin ma'aunin sama da qasa [shi ne " +"haka](https://ma'aunin sama da qasa.matattarar bayanai.app/). bugu da qari, " +"mun aminta da amfani da [taransifota](https://taransifota.org/) domin samo " +"webfonts da adana kurakurai. " -msgid "dashboard.export-standard-multi" -msgstr "Sauke %s cikakken kundi (.svg + .json)" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "samo sabuwar lambar tsaro" -msgid "dashboard.export.detail" -msgstr "*akwai sassan,hotuna,launuka,da/kozane-zane." +#: src/app/main/ui/dashboard/team.cljs +msgid "notifications.invitation-email-sent" +msgstr "an aika da saqon" -msgid "dashboard.export.explain" -msgstr "za ka iya fitar da kundi daya ko fiye ta hanyar tura taska. \"me \"*?" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.select-member-to-promote" +msgstr "zavi memba domin havakawa" -msgid "dashboard.export.options.all.message" -msgstr "manhajar tura kundi ta kunshi fitarwa, tattali mahaxarsu." +msgid "shortcuts.draw-text" +msgstr "rubutaccan sako" -msgid "dashboard.export.options.all.title" -msgstr "fitar da manhajar tura kundi" +msgid "viewer.header.inspect-section" +msgstr "Duba (%s)" -msgid "dashboard.export.options.detach.message" -msgstr "manhajar tura kundi ba ta shiga cikin fitarwa, wani amfaniqarawa a taska. " +msgid "workspace.shape.menu.flatten" +msgstr "mikad da abu" -msgid "dashboard.export.options.detach.title" -msgstr "lura da bayanan da ke cikin manhajar tura kundi" +msgid "shortcuts.delete-node" +msgstr "fita da ga cikin net wok" -msgid "dashboard.export.options.merge.message" -msgstr "" -"za ka iya fitar da kundi tare da haxe muhimman abubuwa, na waje a " -"kunditaskira." +msgid "onboarding-v2.before-start.desc3" +msgstr "za ka iya kallon koyarwarmu da mutanenmu ke yi." -msgid "dashboard.export.options.merge.title" -msgstr "tura taska ya qunshi bayanan da ke cikin kundin taskoki" +msgid "workspace.header.menu.hide-pixel-grid" +msgstr "boye pixel akwati" -msgid "dashboard.export.title" -msgstr "fitar da kundayr" +#: src/app/main/ui/auth/verify_token.cljs +msgid "auth.notifications.team-invitation-accepted" +msgstr "ka zama dan tawaga" -msgid "dashboard.fonts.deleted-placeholder" -msgstr "rashin font" +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-sent" +msgstr "aika bayani" -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.dismiss-all" -msgstr "goge duka" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.title" +msgstr "haxin guiwa!" -msgid "dashboard.fonts.empty-placeholder" -msgstr "fonts da ka xora nan za ya bayyana." +msgid "workspace.undo.entry.multiple.page" +msgstr "shafi" -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.fonts-added" -msgid_plural "dashboard.fonts.fonts-added" -msgstr[0] "an qara font 1" -msgstr[1] "%s an qara fonts da yawa" +msgid "shortcuts.ungroup" +msgstr "Fita daka rukuni" -#, markdown -msgid "dashboard.fonts.hero-text1" -msgstr "" -"duk wani adireshi da ka xora a nan dangin font ne a wannan tawagar za a " -"sami kundayen da ke xauke da kayan rubutu. Da fontfont iri daya ne ake " -"kasawa**gwaurayen font**. Za ka iya xora font ta waxannan hanyoyin: **TTF, " -"OTF and WOFF** (xaya kawai ake buqata)." +#: src/app/main/ui/static.cljs +msgid "labels.bad-gateway.main-message" +msgstr "akwai matsala" -#, markdown -msgid "dashboard.fonts.hero-text2" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.hint" msgstr "" -"za ka iya xora fonts dinka ne domin ka sami dammar amfani da fenfot. gano " -"akwai qarin abubuwan das u ka dace da dokokin " -"fpntaiki](https://fenfot.app/dokoki.html). Za ka so bayani game " -"da[ffonts](https://www.rubutu.com/faq)." +"idan ba ka cire taskar shirye-shirye ba, kundin taskar na wannan kundin zai " +"tsaya kasancewar za ka iya amfani da shi a cikin kundayenka." -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.upload-all" -msgstr "xora duka" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.empty" +msgstr "babu labaran da su ka canja a yanzu" -#, markdown -msgid "dashboard.fonts.warning-text" -msgstr "" -"matsalolin lasisi daga sama zuwa qasa magwajin da ke aiki iri-iri. domin " -"bincikawa za ka iya amfani da aikin ma'aunin sama da qasa [shi ne " -"haka](https://ma'aunin sama da qasa.matattarar bayanai.app/). bugu da qari, " -"mun aminta da amfani da [taransifota](https://taransifota.org/) domin samo " -"webfonts da adana kurakurai. " +msgid "dashboard.libraries-and-templates" +msgstr "taska da shaidar kamfanoni" -msgid "dashboard.import" -msgstr "shigo da kundin fenfot" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin-simple" +msgstr "Samfarin gefe" -msgid "dashboard.import.analyze-error" -msgstr "kash! mun gaza shigo da kundinka" +msgid "workspace.undo.entry.multiple.rect" +msgstr "rectangles" -msgid "dashboard.import.import-error" -msgstr "akwi matsala a kundin. ba a shio da kundin ba." +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "akwai sabon yayi, fatan za a sabunta fage" -msgid "dashboard.import.import-message" -msgid_plural "dashboard.import.import-message" -msgstr[0] "an shigar kundi 1." -msgstr[1] "%s kundaye sun shiga." +msgid "shortcuts.go-to-drafts" +msgstr "ta fi rumbu" -msgid "dashboard.import.import-warning" -msgstr "wasu kundayen na dauke da abubuwan da ba su da amfani." +msgid "onboarding.welcome.alt" +msgstr "fenfot" -msgid "dashboard.import.progress.process-colors" -msgstr "aikin rini" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.bottom" +msgstr "Kasa" -msgid "dashboard.import.progress.process-components" -msgstr "aikin sassa" +msgid "shortcuts.zoom-selected" +msgstr "Zuko wanda aka zaba" -msgid "dashboard.import.progress.process-media" -msgstr "kammala aiki" +msgid "modals.delete-component-annotation.message" +msgstr "ka tabbata kana son goge wannan bayanin?" -msgid "dashboard.import.progress.process-page" -msgstr "fejin kasuwar duniya: %s" +msgid "inspect.attributes.stroke.style.none" +msgstr "babu" -msgid "dashboard.import.progress.process-typographies" -msgstr "kula da rubutu" +msgid "errors.auth.unable-to-login" +msgstr "lokacin ya qare ko ba a tantance ka ba." -msgid "dashboard.import.progress.upload-data" -msgstr "xora bayani akan sabis (%s/%s)" +msgid "workspace.options.grid.params.color" +msgstr "Kala" -msgid "dashboard.import.progress.upload-media" -msgstr "xora kundaye: %s" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.top" +msgstr "sama" -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.invite-profile" -msgstr "neman mutane" +msgid "shortcuts.add-node" +msgstr "kara Girma" -#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.leave-team" -msgstr "fita tawaga" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.group" +msgstr "rukuni" -msgid "dashboard.libraries-and-templates" -msgstr "taska da shaidar kamfanoni" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.accept" +msgid_plural "modals.delete-shared-confirm.accept" +msgstr[0] "goge kundi" +msgstr[1] "goge kundaye" -msgid "dashboard.libraries-and-templates.explore" -msgstr "bincika su da kyau kasan ta yadda za ka bayar da gudunmawa" +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke" +msgstr "yankewa" -msgid "dashboard.libraries-and-templates.import-error" -msgstr "akwai matsala wurin shigo da fejin talla. fejin tallar ba ya xauko." +msgid "onboarding.team-modal.create-team-feature-5" +msgstr "100% kyauta!" -#: src/app/main/ui/dashboard/libraries.cljs -msgid "dashboard.libraries-title" -msgstr "taskoki" +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs +msgid "workspace.options.size-presets" +msgstr "yanayin girman yanayin" -#: src/app/main/ui/dashboard/grid.cljs -msgid "dashboard.loading-files" -msgstr "aikin dora kundaye …" +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.sitemap" +msgstr "taswirar wuri" -msgid "dashboard.loading-fonts" -msgstr "xora abin adonka …" +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs +msgid "labels.no-comments-available" +msgstr "an dakatar da kai duka! Alamar sabon sharhi za ta fito nan." -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to" -msgstr "tura a" +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-disabled" +msgstr "kasa samun bayani" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to-multi" -msgstr "tura %s kundaye a" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.accept" +msgid_plural "modals.unpublish-shared-confirm.accept" +msgstr[0] "maras wallafa" +msgstr[1] "maras wallafa" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to-other-team" -msgstr "tura ma sauran tawaga" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "kasuwanci" -#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/files.cljs -msgid "dashboard.new-file" -msgstr "+ sabon kundi" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.update" +msgstr "Sabuntawa" -#: src/app/main/data/dashboard.cljs -msgid "dashboard.new-file-prefix" -msgstr "sabon kundi" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin" +msgstr "gefe" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dashboard.new-project" -msgstr "+ sabon aiki" +msgid "shortcuts.align-hcenter" +msgstr "tsarin tsakiya ko ina" -#: src/app/main/data/dashboard.cljs -msgid "dashboard.new-project-prefix" -msgstr "sabon aiki" +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-all-comments" +msgstr "fito da yabo" -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.no-matches-for" -msgstr "ba wanda ya yi daidai da “%s“" +#: src/app/main/ui/settings.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.logout" +msgstr "fita" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.no-projects-placeholder" -msgstr "nan za a ga bayanin aiki" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "kwanaki 180" -#: src/app/main/ui/auth/verify_token.cljs -msgid "dashboard.notifications.email-changed-successfully" -msgstr "ka zamanantar da adireshinka na imel" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color-burn" +msgstr "kala konanniya" -#: src/app/main/ui/auth/verify_token.cljs -msgid "dashboard.notifications.email-verified-successfully" -msgstr "an tantance adireshinka na imel" +msgid "workspace.options.opacity" +msgstr "dishi dishi" -#: src/app/main/ui/settings/password.cljs -msgid "dashboard.notifications.password-saved" -msgstr "an tsare maka shaidar tsaro!" +msgid "shortcuts.prev-frame" +msgstr "allon da ya gabata" -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.num-of-members" -msgstr "%s memba" +msgid "workspace.options.component.edit-annotation" +msgstr "Tace sharhin rubutu" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.open-in-new-tab" -msgstr "buxe kundi a sabon wurin buxewa" +msgid "dashboard.import.progress.upload-data" +msgstr "xora bayani akan sabis (%s/%s)" -msgid "dashboard.options" -msgstr "zavi" +msgid "shortcuts.draw-curve" +msgstr "Ratse" -#: src/app/main/ui/settings/password.cljs -msgid "dashboard.password-change" -msgstr "sauya lambar tsaro" +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.all" +msgstr "duk" -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.pin-unpin" -msgstr "rufewa/buxewa" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.file" +msgstr "fayil" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dashboard.projects-title" -msgstr "aiki" +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hsla" +msgstr "HSLA" -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.remove-account" -msgstr "ka na son cire taskarka?" +#: src/app/main/ui/auth/register.cljs +msgid "errors.registration-disabled" +msgstr "rigitar ba ta yi ba." -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.remove-shared" -msgstr "cire matattarar kundate" +msgid "workspace.undo.entry.multiple.media" +msgstr "kadarar zane" -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.save-settings" -msgstr "wurin ajiyar saiti" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "sami lambar kowane aiki " -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.search-placeholder" -msgstr "nema …" +msgid "workspace.options.show-in-viewer" +msgstr "fito da kaurin sosai" -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.searching-for" -msgstr "neman “%s“…" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.lowercase" +msgstr "yanayin kasa" -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.select-ui-language" -msgstr "zavavven harshen UI" +#: src/app/main/ui/settings/password.cljs +msgid "errors.password-invalid-confirmation" +msgstr "tabbata labar tsaro ta yi daidai" -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.select-ui-theme" -msgstr "zaven batu" +msgid "workspace.undo.entry.multiple.group" +msgstr "rukunis" -#: src/app/main/ui/dashboard/grid.cljs -msgid "dashboard.show-all-files" -msgstr "duk kundaye" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.updates" +msgstr "sabuntawa" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-delete-file" -msgid_plural "dashboard.success-delete-file" -msgstr[0] "an goge kundinka" -msgstr[1] "an goge kundayenka" +msgid "dashboard.export-frames" +msgstr "Allon fitarwa na PDF" -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.success-delete-project" -msgstr "ka goge aikinka" +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.title" +msgstr "goge shafi" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-duplicate-file" -msgid_plural "dashboard.success-delete-file" -msgstr[0] "an kwafi kundinka" -msgstr[1] "an kwafi kundayenka" +#: src/app/main/ui/static.cljs +msgid "labels.service-unavailable.main-message" +msgstr "ba sabis" -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.success-duplicate-project" -msgstr "an kwafi aikinka" +msgid "shortcuts.opacity-2" +msgstr "Saita dishi dishi zuwa kashi 20" -#: src/app/main/ui/dashboard/grid.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-move-file" -msgstr "an tura aikinka" +msgid "workspace.shape.menu.create-multiple-components" +msgstr "kirkiri abubuwa da yawa" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-move-files" -msgstr "an tura kundayenka" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.rename-group" +msgstr "sake sunan kungiyar" -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.success-move-project" -msgstr "an tura aikinka" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-profile" +msgstr "ka na son gwadawa ne kawai?" -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-info" -msgstr "bayanin tawaga" +msgid "webhooks.last-delivery.success" +msgstr "Sakon karshe ya isa." -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-members" -msgstr "mambobin tawaga" +msgid "shortcuts.bool-intersection" +msgstr "ma'aunin abubuwa daban daban" -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-projects" -msgstr "aiyukan tawaga" +msgid "workspace.options.stroke-width" +msgstr "gigciye fadin" -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.theme-change" -msgstr "batun UI" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-out" +msgstr "sauki waje" -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.title-search" -msgstr "neman sakamako" +#: src/app/main/ui/static.cljs +msgid "labels.not-found.desc-message" +msgstr "babu wannan fagen, ko ba ka da izinin shiga." -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.type-something" -msgstr "rubuta neman sakamako" +msgid "workspace.options.x" +msgstr "X layi" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.unpublish-shared" -msgstr "wallafa taska" +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.members" +msgstr "mambobi" -#: src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs -msgid "dashboard.update-settings" -msgstr "zamanartarwa wurin gyara" +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-verified-successfully" +msgstr "an tantance adireshinka na imel" -msgid "dashboard.webhooks.active" -msgstr "ya na amfani" +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.show-interactions" +msgstr "Nuna hulda" -msgid "dashboard.webhooks.active.explain" -msgstr "idan an sami sauyi a nan ake kawo shi" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.hint" +msgstr "" +"idan ka canza wurin mallaka, ba za ka iya sauya matsayin shugaba ba, gazawar " +"wasu dokokin wannan tawaagar. " -msgid "dashboard.webhooks.content-type" -msgstr "irin ra'ayi" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-self" +msgstr "kai/ni" -msgid "dashboard.webhooks.create" -msgstr "yin webhook" +msgid "errors.webhooks.invalid-uri" +msgstr "URL bai gyaru ba." -msgid "dashboard.webhooks.create.success" -msgstr "an gina Webhook." +msgid "modals.create-webhook.url.placeholder" +msgstr "https://misali.com/postreceive" -msgid "dashboard.webhooks.description" -msgstr "" -"Webhooks hanyar sanar da manhajoji da addireshi intanet idan wani ya faru a " -"Penpot. za a tura maka da saqon talla URLs ka samar da." +msgid "shortcuts.draw-nodes" +msgstr "samar da hanya" -msgid "dashboard.webhooks.empty.add-one" -msgstr "danna qasa \"sanya webhook\" qara xaya." +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.you" +msgstr "(kai)" -msgid "dashboard.webhooks.empty.no-webhooks" -msgstr "ba a gina wani webhooks ba." +msgid "dashboard.options" +msgstr "zavi" -msgid "dashboard.webhooks.update.success" -msgstr "sabunta Webhook." +msgid "workspace.shape.menu.path" +msgstr "hanya" -#: src/app/main/ui/settings.cljs -msgid "dashboard.your-account-title" -msgstr "gidanka" +msgid "onboarding.templates.title" +msgstr "fara tsarawa" -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.your-email" -msgstr "imel" +msgid "labels.go-back" +msgstr "koma baya" -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.your-name" -msgstr "sunanka" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.message" +msgid_plural "modals.unpublish-shared-confirm.message" +msgstr[0] "ka tabbata ka na son rufe taskar nan?" +msgstr[1] "ka tabbata ka na son rufe taskokin nan?" -#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.your-penpot" -msgstr "fenfot na ka" +#: src/app/main/ui/settings/password.cljs +msgid "errors.wrong-old-password" +msgstr "tsohuwar lambar tsaro ba daidai ba ce" -#: src/app/main/ui/alert.cljs -msgid "ds.alert-ok" -msgstr "haka" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.unpublish-shared" +msgstr "wallafa taska" -#: src/app/main/ui/alert.cljs -msgid "ds.alert-title" -msgstr "natsu" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "ina aikin kaina" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsety" +msgstr "Y" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.size" +msgstr "wurin daxa girma" + +#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs +msgid "viewer.frame-not-found" +msgstr "Ba'a sami allon ba." + +msgid "workspace.focus.focus-mode" +msgstr "tsarin maida hankali" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-submit" +msgstr "gano lambar tsaro" + +msgid "shortcuts.cut" +msgstr "cire" #: src/app/main/ui/confirm.cljs msgid "ds.component-subtitle" msgstr "zamanantar da sassa:" -#: src/app/main/ui/confirm.cljs -msgid "ds.confirm-cancel" +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete" msgstr "goge" -#: src/app/main/ui/confirm.cljs -msgid "ds.confirm-ok" -msgstr "haka" - -#: src/app/main/ui/confirm.cljs, src/app/main/ui/confirm.cljs -msgid "ds.confirm-title" -msgstr "ka tabbata?" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs +msgid "workspace.options.component" +msgstr "Bangarori" -#: src/app/main/ui/auth/login.cljs -msgid "errors.auth-provider-not-configured" -msgstr "manhajar tantancewar ba ta tsaru ba." +#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs +msgid "dashboard.copy-suffix" +msgstr "(kwafi)" -msgid "errors.auth.unable-to-login" -msgstr "lokacin ya qare ko ba a tantance ka ba." +msgid "labels.export" +msgstr "fitarwa" -msgid "errors.bad-font" -msgstr "ba za a iya xora fonts %s ba" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-ms" +msgstr "ms" -msgid "errors.bad-font-plural" -msgstr "ba za a iya xora fonts %s ba" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.right" +msgstr "dama" -msgid "errors.cannot-upload" -msgstr "kasa xora xan aiken kundi." +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.cancel" +msgstr "soke" -#: src/app/main/data/workspace.cljs -msgid "errors.clipboard-not-implemented" -msgstr "manhajar binciken nan ba ta iya yin wannan aikin" +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.save-color" +msgstr "Adana salon kala" -#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs -msgid "errors.email-already-exists" -msgstr "an yi amfani da imel" +msgid "shortcuts.opacity-8" +msgstr "seta dishi dishin zuwa kashi 8o" -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.email-already-validated" -msgstr "an farfaxo da imel." +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.ellipse" +msgstr "siffar kwai (%s)" -msgid "errors.email-as-password" -msgstr "ba za ka iya amfani da imel ba a matsayin lambar tsaro ba" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.search" +msgstr "nemo kadarar" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.email-has-permanent-bounces" -msgstr "imel «%s» na da bayanan matsaloli na dindindin." +msgid "shortcuts.or" +msgstr " ko " -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs -msgid "errors.email-invalid" -msgstr "sanya imel mai amfani" +msgid "shortcuts.opacity-5" +msgstr "Saita dishi dishi zuwa kashi 50" -#: src/app/main/ui/settings/change_email.cljs -msgid "errors.email-invalid-confirmation" -msgstr "tabbata imel xinka ya yi daidai" +msgid "onboarding-v2.newsletter.desc" +msgstr "" +"domin jin daxin fenfot , sai ka biya kuxi domin labarai da ci gaban da ake " +"samu." -msgid "errors.email-spam-or-permanent-bounces" -msgstr "saqonni marasa amfani na imel «%s»." +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.nudge-title" +msgstr "adadin jan hankali" -#: src/app/main/errors.cljs -msgid "errors.feature-mismatch" -msgstr "" -"tamkar ka buxe wani kundi da ke da muhimmanci '%s' bayar da dama qarin da " -"ka yi ma fenfot xinka bai karbu ba ko ba zai yi aiki ba." +msgid "workspace.sidebar.layers.groups" +msgstr "rukuni" -#: src/app/main/errors.cljs -msgid "errors.feature-not-supported" -msgstr "sassa '%s' ba za su yi aiki ba." +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Rectangle" -#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.generic" -msgstr "wata matsala ta faru." +#: src/app/main/ui/settings/password.cljs +msgid "labels.new-password" +msgstr "sabuwar lambar tsaro" -#: src/app/main/ui/components/color_input.cljs -msgid "errors.invalid-color" -msgstr "launin bai yi ba" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "ana buqatar suna" -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.invite-invalid" -msgstr "gaiyar ba ta yi ba" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-left" +msgstr "sama hagu" -msgid "errors.invite-invalid.info" -msgstr "za a iya soke gayyata ko ta ki aiki." +msgid "shortcut-section.dashboard" +msgstr "allon kallo" -#: src/app/main/ui/auth/login.cljs -msgid "errors.ldap-disabled" -msgstr "LDAP ya gaza tantancewa." +msgid "dashboard.webhooks.active.explain" +msgstr "idan an sami sauyi a nan ake kawo shi" -#: src/app/main/errors.cljs -msgid "errors.max-quote-reached" -msgstr "kammala adadin '%s' madogara. gyara." +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.create-new-team" +msgstr "yi sabuwar tawaga" -#: src/app/main/data/workspace/persistence.cljs -msgid "errors.media-too-large" -msgstr "hoton da za ka sanya ya yi girma." +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.color-palette" +msgstr "farantin kala (%s)" -#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs -msgid "errors.media-type-mismatch" -msgstr "hoton da aka sanya bai yi daidai da kundin da ake son faxaxawa ba." +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.scd-message" +msgid_plural "modals.delete-shared-confirm.activated.scd-message" +msgstr[0] "za a iya buxe wannan taskirar a nan: " +msgstr[1] "za a iya buxe taskirorin nan a nan: " -#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs -msgid "errors.media-type-not-allowed" -msgstr "wannan hoton ba ya aiki." +msgid "shortcuts.move-fast-left" +msgstr "Matsa hagu da sauri" -#: src/app/main/ui/dashboard/team.cljs -msgid "errors.member-is-muted" -msgstr "bayanan da ka nema imel din su ya suma (bayanan matsaloli)." +msgid "workspace.undo.entry.multiple.frame" +msgstr "allo" -#: src/app/main/ui/settings/password.cljs -msgid "errors.password-invalid-confirmation" -msgstr "tabbata labar tsaro ta yi daidai" - -#: src/app/main/ui/settings/password.cljs -msgid "errors.password-too-short" -msgstr "lambar tsaro dole ta kai yawan alamu 8" +#: src/app/main/ui/settings/profile.cljs +msgid "labels.update" +msgstr "sabunta" -msgid "errors.profile-blocked" -msgstr "bayanan a rufe suke" +msgid "labels.num-of-frames" +msgid_plural "labels.num-of-frames" +msgstr[0] "allo 1" +msgstr[1] "alluna %s" -#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.profile-is-muted" -msgstr "bayananka su na da imel maras motsi (baiyana matsaloli)." +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-min-h" +msgstr "tsaho mafi kankanta" -#: src/app/main/ui/auth/register.cljs -msgid "errors.registration-disabled" -msgstr "rigitar ba ta yi ba." +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.message" +msgstr "qara “%s” xakin ajiya" -msgid "errors.team-leave.insufficient-members" -msgstr "ba sauran masu fita daga tawaga, ba bu tabbacin gogewa." +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.loading-files" +msgstr "aikin dora kundaye …" -msgid "errors.team-leave.member-does-not-exists" -msgstr "mamban da ka ke son sanyawa ba ya a ciki." +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.hint" +msgstr "" +"ka kusa sabunta taskar ajiyar shir-shirye. zai iya shafar sauran kundayen da " +"ke amfani da ita." -msgid "errors.team-leave.owner-cant-leave" -msgstr "mai abu ba ya barin tawaga, dole adubi matsayin mai abu." +msgid "workspace.path.actions.add-node" +msgstr "kara kauri (%s)" -#: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "errors.unexpected-error" -msgstr "afkuwar kuskuren da ba a zata ba." +msgid "workspace.options.component.main" +msgstr "Ainahin" -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.unexpected-token" -msgstr "tukuicin da ba a san da shi ba" +#: src/app/main/ui/workspace/sidebar/options.cljs +msgid "workspace.options.design" +msgstr "zane" -msgid "errors.webhooks.connection" -msgstr "hadin bai yi ba, ba a iya samun URL" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.projects-title" +msgstr "aiki" -msgid "errors.webhooks.invalid-uri" -msgstr "URL bai gyaru ba." +msgid "workspace.undo.entry.single.frame" +msgstr "allo" -msgid "errors.webhooks.last-delivery" -msgstr "saqon qarshe bai je ba." +msgid "shortcuts.flip-vertical" +msgstr "kifa ta tsaye" -msgid "errors.webhooks.ssl-validation" -msgstr "kuskure kan farfaxo da SSL." +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-starts" +msgstr "gudun farko" -msgid "errors.webhooks.timeout" -msgstr "dakatarwa" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-position" +msgstr "Mataki" -msgid "errors.webhooks.unexpected" -msgstr "matsalar da ba zata ba lokacin farfaxowa" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-dynamic-alignment" +msgstr "bada damar daidaitawa mai canjawa" -msgid "errors.webhooks.unexpected-status" -msgstr "matsayin da ba zato %s" +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.more-colors" +msgstr "kaloli masu yawa" -#: src/app/main/ui/auth/login.cljs -msgid "errors.wrong-credentials" -msgstr "kuskuren imel ko lambar tsaro." +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.accept" +msgstr "goge kundi" -#: src/app/main/ui/settings/password.cljs -msgid "errors.wrong-old-password" -msgstr "tsohuwar lambar tsaro ba daidai ba ce" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "ni mai zaman kansa ne" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.description" -msgstr "bayani" +msgid "shortcuts.paste" +msgstr "manna" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-go-to" -msgstr "je ka taskar fenfot" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-bottom" +msgstr "jerin kasa" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-subtitle1" -msgstr "" -"mun yi farin ciki da samunka a nan. idan ka na da buqatar taimako sai ka " -"tuntuvi na gaba da kai matsayi." +msgid "labels.fonts" +msgstr "Font" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-title" -msgstr "dangin fenfot" +msgid "shortcuts.not-found" +msgstr "babu gajeriyar hanya" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.subject" -msgstr "shugabanci" +msgid "common.share-link.destroy-link" +msgstr "tarwatsa hanya" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.subtitle" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.hint" msgstr "" -"bayyana dalilin imel dinka, faiyace idan akwai matsala, an shawarwari ko " -"hasashe. tawaga ko mamba za a kula da kai." +"ka tabbata memban tawaga kaxai, za ya iya goge tawaga tare da aikinta da " +"kundaye." -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.title" -msgstr "imel" +#: src/app/main/ui/settings/password.cljs +msgid "labels.old-password" +msgstr "tsohuwar lambar tsaro" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.twitter-go-to" -msgstr "je ka tiwita" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.new" +msgstr "sabo %s" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.twitter-subtitle1" -msgstr "tambayoyin da ke buqatar amsa." +msgid "onboarding-v2.welcome.desc3.title" +msgstr "gudunmawar jagora" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.twitter-title" -msgstr "wurin karvar qorafin tiwita" +msgid "shortcuts.toggle-assets" +msgstr "Danna kadara" -#: src/app/main/ui/settings/password.cljs -msgid "generic.error" -msgstr "afkuwar matsala" +msgid "onboarding-v2.newsletter.updates" +msgstr "" +"aiko man da sabbin abubuwan da aka yi (sabbib fasali, fitowa, gyara...)." -#: src/app/main/ui/inspect/attributes/blur.cljs -msgid "inspect.attributes.blur" -msgstr "xige-xige" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.create-artboard-from-selection" +msgstr "zababban allo" -#: src/app/main/ui/inspect/attributes/blur.cljs -msgid "inspect.attributes.blur.value" -msgstr "muhimmanci" +msgid "onboarding.newsletter.title" +msgstr "ka buqatar labaran fenfot?" -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.hex" -msgstr "HEX" +msgid "errors.team-leave.insufficient-members" +msgstr "ba sauran masu fita daga tawaga, ba bu tabbacin gogewa." -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.hsla" -msgstr "HSLA" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.copied-success" +msgstr "kwafar lambar tsaro" -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.rgba" -msgstr "RGBA" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.fix-when-scrolling" +msgstr "gyara nemowa" -#: src/app/main/ui/inspect/attributes/fill.cljs -msgid "inspect.attributes.fill" -msgstr "cika" +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.description" +msgstr "bayani" -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.download" -msgstr "sauke hanyar hoto" +msgid "labels.installed-fonts" +msgstr "sanya fenfot" -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.height" -msgstr "tsawo" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-top-right" +msgstr "saman dama" -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.width" -msgstr "faxi" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-in" +msgstr "ciki" -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout" -msgstr "shiri" +msgid "modals.publish-empty-library.title" +msgstr "wallafa taska maras komai" -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.height" -msgstr "tsawo" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay" +msgstr "Juya mai murfi" -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.left" -msgstr "hagu" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.info" +msgstr "bincika manhaja domin sanin manyan sassanta." -#: src/app/main/ui/inspect/attributes/layout.cljs, src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.radius" -msgstr "tsakiya" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.rotation" -msgstr "jujjuyawa" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow" +msgstr "Triangle mashi" -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.top" -msgstr "sama" +msgid "modals.leave-and-reassign.forbidden" +msgstr "" +"ba za ku iya bari ba idan ba wani memba da zai ingata wa mai shi. ku na iya " +"goge tawaga." -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.width" -msgstr "fadi" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-scale-text" +msgstr "kashe sikelin rubutu" -#: src/app/main/ui/inspect/attributes/shadow.cljs -msgid "inspect.attributes.shadow" -msgstr "inuwa" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.rows" +msgstr "jere" -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.size" -msgstr "wurin daxa girma" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.tutorials" +msgstr "koyarwa" -#: src/app/main/ui/inspect/attributes/stroke.cljs -msgid "inspect.attributes.stroke" -msgstr "yankewa" +msgid "workspace.undo.entry.multiple.curve" +msgstr "kwana" -#, permanent -msgid "inspect.attributes.stroke.alignment.center" -msgstr "tsakiya" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-guides" +msgstr "kashe tsinkewa zuwa mai jagora" -#, permanent -msgid "inspect.attributes.stroke.alignment.inner" -msgstr "daga ciki" +#: src/app/main/ui/auth/register.cljs +msgid "auth.already-have-account" +msgstr "ka na da taska?" -#, permanent -msgid "inspect.attributes.stroke.alignment.outer" -msgstr "daga waje" +msgid "dashboard.import.progress.process-typographies" +msgstr "kula da rubutu" -msgid "inspect.attributes.stroke.style.dotted" -msgstr "xige-xige" +msgid "shortcuts.opacity-1" +msgstr "saita dishi dishi zuwa kashi 10" -msgid "inspect.attributes.stroke.style.mixed" -msgstr "gauraya" +msgid "workspace.path.actions.snap-nodes" +msgstr "tsinke kauri (%s)" -msgid "inspect.attributes.stroke.style.none" -msgstr "babu" +msgid "shortcuts.bring-front" +msgstr "kawo zuwa gaba" -msgid "inspect.attributes.stroke.style.solid" -msgstr "tauri" +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.typography" +msgstr "rubutun rubutu" -#: src/app/main/ui/inspect/attributes/stroke.cljs -msgid "inspect.attributes.stroke.width" -msgstr "fadi" +msgid "common.share-link.view-all" +msgstr "zavi duka" -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography" -msgstr "tsara rubutu" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.give-feedback" +msgstr "bada bayani" -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-family" -msgstr "gidan salo" +msgid "shortcuts.bool-exclude" +msgstr "kebentaccan ma'auni" -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-size" -msgstr "girman salo" +msgid "workspace.undo.entry.multiple.multiple" +msgstr "abu" -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-style" -msgstr "tsarin salo" +msgid "dashboard.export-standard-multi" +msgstr "Sauke %s cikakken kundi (.svg + .json)" -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-weight" -msgstr "kaurin salon" +#: src/app/main/data/workspace/persistence.cljs +msgid "errors.media-too-large" +msgstr "hoton da za ka sanya ya yi girma." -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.letter-spacing" -msgstr "tazarar harafi" +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.invitations" +msgstr "gayyata" -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.line-height" -msgstr "tsawon layi" +msgid "shortcut-subsection.navigation-viewer" +msgstr "shawagi" -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.text-decoration" -msgstr "kwalliyar rubutu" +#: src/app/main/ui/auth/register.cljs +msgid "auth.check-your-email" +msgstr "" +"bincika taskarka ta imel,ka danna alamar mahaxa domin tabbatarwa,sannan ka " +"fara amfani da fenfot." -msgid "inspect.attributes.typography.text-decoration.none" -msgstr "babu" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-slide" +msgstr "Ja" -msgid "inspect.attributes.typography.text-decoration.strikethrough" -msgstr "zana layi tsakiyar rubutu" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-min-w" +msgstr "fadi mafi kankanta" -msgid "inspect.attributes.typography.text-decoration.underline" -msgstr "jan layi" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-min-h" +msgstr "tsawo mafi kankanta" -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.text-transform" -msgstr "masarrafin rubu,manya ko qanana" +msgid "workspace.sidebar.layers.masks" +msgstr "takunkumi" -msgid "inspect.attributes.typography.text-transform.lowercase" -msgstr "qananan baqaqe" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.screen" +msgstr "allo" -msgid "inspect.attributes.typography.text-transform.none" -msgstr "babu" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "Aga duka canjin" -msgid "inspect.attributes.typography.text-transform.titlecase" -msgstr "yadda ake rubuta batu" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.inner-shadow" +msgstr "Inuwar ciki" -msgid "inspect.attributes.typography.text-transform.uppercase" -msgstr "manyan baqaqe" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.frame" +msgstr "allo (%s)" -msgid "inspect.empty.help" -msgstr "domin neman qarin bayani game da fenfot a tuntubi sashen agaji" +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...branding, illustrations, marketing pieces, etc." -msgid "inspect.empty.more-info" -msgstr "qarin bayani a fagen lura" +msgid "onboarding.team-modal.create-team-feature-4" +msgstr "Unlimited members" -msgid "inspect.empty.select" -msgstr "zabar zubi, hukumar masu sa ido akan bangarorinsu da lambobinsu" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs +msgid "workspace.options.export.suffix" +msgstr "Kari na bayan baki" -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.code" -msgstr "lamba" +msgid "errors.webhooks.connection" +msgstr "hadin bai yi ba, ba a iya samun URL" -msgid "inspect.tabs.code.selected.circle" -msgstr "da'ira" +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.confirm-email" +msgstr "tantance sabon imel" -msgid "inspect.tabs.code.selected.component" -msgstr "bangare" +msgid "auth.terms-of-service" +msgstr "dokokin aiki" -msgid "inspect.tabs.code.selected.curve" -msgstr "lankwasa" +msgid "dashboard.export.options.all.message" +msgstr "manhajar tura kundi ta kunshi fitarwa, tattali mahaxarsu." -msgid "inspect.tabs.code.selected.frame" -msgstr "hukuma" +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.group-fill" +msgstr "Cika rukuni" -msgid "inspect.tabs.code.selected.group" -msgstr "qungiya" +msgid "shortcuts.stop-measure" +msgstr "dena aunawa" -msgid "inspect.tabs.code.selected.image" -msgstr "hoto" +#: src/app/main/ui/comments.cljs +msgid "labels.write-new-comment" +msgstr "rubuta s abon yabo" -msgid "inspect.tabs.code.selected.mask" -msgstr "marfi" +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-subtitle1" +msgstr "" +"mun yi farin ciki da samunka a nan. idan ka na da buqatar taimako sai ka " +"tuntuvi na gaba da kai matsayi." -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.code.selected.multiple" -msgstr "%s zavavve" +msgid "dashboard.libraries-and-templates.explore" +msgstr "bincika su da kyau kasan ta yadda za ka bayar da gudunmawa" -msgid "inspect.tabs.code.selected.path" -msgstr "hanya" +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "Babu rubutun rubutu a ma'ajiya yanzu" -msgid "inspect.tabs.code.selected.rect" -msgstr "rektangul" +#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.paste" +msgstr "manna" -msgid "inspect.tabs.code.selected.svg-raw" -msgstr "SVG" +msgid "labels.edit-file" +msgstr "gyara kundi" -msgid "inspect.tabs.code.selected.text" -msgstr "rubutu" +msgid "onboarding.templates.subtitle" +msgstr "ga wasu hotunan talla nan." -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.info" -msgstr "bayani" +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.selection-fill" +msgstr "cika zabi" + +msgid "inspect.tabs.code.selected.curve" +msgstr "lankwasa" #: src/app/main/ui/workspace/header.cljs -msgid "label.shortcuts" -msgstr "yanke" +msgid "workspace.header.unsaved" +msgstr "Canja canjan da ba'a adana ba" -msgid "labels.accept" -msgstr "karva" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-middle" +msgstr "jerin tsakiya" -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.access-tokens" -msgstr "lambobi masu xauke da bayani" +msgid "viewer.breaking-change.description" +msgstr "" +"Wannan mahadar da aka raba yanxu batada ingaci. Ka/ki kirkiri wata ko ka/ki " +"tamayi maishi a baka/ki sabuwa." -msgid "labels.active" -msgstr "mai amfani" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color-dodge" +msgstr "kala gudajjiya" -msgid "labels.add-custom-font" -msgstr "inganta font" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.saving" +msgstr "Adanawa" -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.admin" -msgstr "shugaba" +msgid "shortcuts.next-frame" +msgstr "wani tsari" -#: src/app/main/ui/workspace/comments.cljs -msgid "labels.all" -msgstr "duk" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library" +msgstr "ma'adana" -msgid "labels.and" -msgstr "da" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-background" +msgstr "kara mai rufin bayan" -msgid "labels.back" -msgstr "baya" +msgid "workspace.sidebar.layers.search" +msgstr "nemo shimfida" -#: src/app/main/ui/static.cljs -msgid "labels.bad-gateway.desc-message" +msgid "inspect.attributes.stroke.style.solid" +msgstr "tauri" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.demo-warning" msgstr "" -"ka jinkirta kaxan sannan ka qara gwadawa; mu na aiki daidai domin tattala " -"aikinmu." +"wannan aikin gwaji ne kawai,kar ka yi amfani da shi a aikin gaske,lokaci " +"zuwa lokaci za ya ringa vacewa ne." -#: src/app/main/ui/static.cljs -msgid "labels.bad-gateway.main-message" -msgstr "akwai matsala" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "kwanaki 90" + +#: src/app/main/ui/dashboard/search.cljs +msgid "title.dashboard.search" +msgstr "nema - %s - Mazubin biruka" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.unknown" +msgstr "yanayi fiye da %s" #: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.cancel" -msgstr "sokewa" +msgid "modals.delete-team-confirm.accept" +msgstr "goge tawaga" -msgid "labels.close" -msgstr "rufewa" +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.height" +msgstr "tsawo" -#: src/app/main/ui/dashboard/comments.cljs -msgid "labels.comments" -msgstr "yabo" +msgid "shortcuts.zoom-lense-increase" +msgstr "Zuko karuwar ido" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.community" -msgstr "matattara" +msgid "workspace.shape.menu.add-grid" +msgstr "kara akwatin tsari" -#: src/app/main/ui/settings/password.cljs -msgid "labels.confirm-password" -msgstr "tabbatar da lambar tsaro" +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.interactions" +msgstr "Hulda" -msgid "labels.continue" -msgstr "ci gaba" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/inspect/attributes/text.cljs, src/app/main/ui/inspect/attributes/text.cljs +msgid "workspace.assets.typography.sample" +msgstr "Ag" -msgid "labels.continue-with" -msgstr "ci gaba da" +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.dismiss-all" +msgstr "goge duka" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "" +"duk aikin da aka yi a wannan kundin, nan za a same shi (ba zanen da za a " +"iya tsinkawa)." +msgstr[1] "" +"duk aikin da aka yi a waxancan kundayen, can za a same su (ba zane da za iya " +"tsinkawa)." + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-complete" +msgstr "An gama fitarwa" msgid "labels.continue-with-penpot" msgstr "za ka iya ci gaba a idanka na fenfot" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.copy-invitation-link" -msgstr "kwafar hanya" +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-size" +msgstr "girman salo" + +msgid "shortcuts.hide-ui" +msgstr "fito / boye UI" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-title" +msgstr "qirqiri sabon kundi" + +#: src/app/main/ui/dashboard/libraries.cljs +msgid "dashboard.libraries-title" +msgstr "taskoki" + +msgid "inspect.tabs.code.selected.rect" +msgstr "rektangul" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-frames.title" +msgstr "Fitarwa a PDF" #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "labels.create" msgstr "yi" -#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs -msgid "labels.create-team" -msgstr "yi sabuwar tawaga" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-delay" +msgstr "jinkiri" -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.create-team.placeholder" -msgstr "shigar da sabon sunan tawaga" +#: src/app/main/ui/export.cljs +msgid "dashboard.export-multiple.selected" +msgstr "%s of %s tubullan da aka zava" -msgid "labels.custom-fonts" -msgstr "kwalliya da fenfot" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.accept" +msgstr "barin tawaga" -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.dashboard" -msgstr "dashbod" +#: src/app/main/ui/components/color_input.cljs +msgid "errors.invalid-color" +msgstr "launin bai yi ba" -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.delete" -msgstr "goge" +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.small-nudge" +msgstr "qaramin jan hankali" -#: src/app/main/ui/comments.cljs -msgid "labels.delete-comment" -msgstr "goge yabo" +msgid "shortcuts.duplicate" +msgstr "maimaita" -#: src/app/main/ui/comments.cljs -msgid "labels.delete-comment-thread" -msgstr "goge rubutu" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.saved" +msgstr "An adana" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.delete-invitation" -msgstr "goge gayyata" +msgid "shortcuts.create-new-project" +msgstr "samar da sabo abu" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.delete-multi-files" -msgstr "goge %s kundaye" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.luminosity" +msgstr "warewa" -msgid "labels.discard" -msgstr "vatar" +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.share.copy-link" +msgstr "Kwafi mahada" -#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.drafts" -msgstr "adana" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color" +msgstr "kala" -#: src/app/main/ui/comments.cljs -msgid "labels.edit" -msgstr "gyara" +msgid "onboarding.team-modal.create-team-feature-1" +msgstr "aiyuka da kundaye da yawa" -msgid "labels.edit-file" -msgstr "gyara kundi" +#: src/app/main/ui/workspace/sidebar/shortcuts.cljs +msgid "shortcuts.title" +msgstr "allon harufa yanke" -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.editor" -msgstr "maigyara" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flip-vertical" +msgstr "kifa ta kwance" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.expired-invitation" -msgstr "daina aiki" +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.position" +msgstr "matsayi" -msgid "labels.export" -msgstr "fitarwa" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square" +msgstr "murabba'i" -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.feedback-disabled" -msgstr "kasa samun bayani" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-justify" +msgstr "tabbatarwa (%s)" -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.feedback-sent" -msgstr "aika bayani" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-between" +msgstr "sarari tsakani" -msgid "labels.font-family" -msgstr "ire-iren font" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.open-in-new-tab" +msgstr "buxe kundi a sabon wurin buxewa" -msgid "labels.font-providers" -msgstr "ma su fenfot" +#: src/app/main/ui/auth.cljs +msgid "auth.sidebar-tagline" +msgstr "samun hanyar magance matsalar zane-zane." -msgid "labels.font-variants" -msgstr "salo" +#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team" +msgstr "yi sabuwar tawaga" -msgid "labels.fonts" -msgstr "Font" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.uppercase" +msgstr "yanayin sama" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.github-repo" -msgstr "taskar rubuce-rubuce" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.assets" +msgstr "kadara" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.give-feedback" -msgstr "bada bayani" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "Zuko" -msgid "labels.go-back" -msgstr "koma baya" +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.edit" +msgstr "tace" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.help-center" -msgstr "sashen taimako" +msgid "dashboard.import.import-error" +msgstr "akwi matsala a kundin. ba a shio da kundin ba." -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.hide-resolved-comments" -msgstr "voye saqon da aka buxa" +msgid "onboarding-v2.newsletter.privacy1" +msgstr "mu na kula da sirri, a nan za ka karanta na mu " -msgid "labels.inactive" -msgstr "maras amfani" +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-move-project" +msgstr "an tura aikinka" -msgid "labels.installed-fonts" -msgstr "sanya fenfot" +msgid "workspace.options.component.annotation" +msgstr "Yin sharhin rubutu" -#: src/app/main/ui/static.cljs -msgid "labels.internal-error.desc-message" -msgstr "" -"an sami matsala. sake gwadawa idan matsalar ba ta kauce ba, tuntubi sashen " -"taimako." +msgid "shortcuts.toggle-layers" +msgstr "Danna shimfida" -#: src/app/main/ui/static.cljs -msgid "labels.internal-error.main-message" -msgstr "kuskuren ciki" +msgid "labels.uploading" +msgstr "ana dorawa…" -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.invitations" -msgstr "gayyata" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-preserve-scroll" +msgstr "adana komawa sama da kasa" -#: src/app/main/ui/settings/options.cljs -msgid "labels.language" -msgstr "harshe" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.accept" +msgstr "goge memba" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.libraries-and-templates" -msgstr "taskoki & allunan talla" +msgid "workspace.undo.entry.single.typography" +msgstr "rubutun rubuta kadara" -msgid "labels.log-or-sign" -msgstr "yi ko shiga" +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.selection-color" +msgstr "zababbabbin kaloli" -#: src/app/main/ui/settings.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.logout" -msgstr "fita" +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.more-lib-colors" +msgstr "Ma'ajiyar kaloli masu yawa" + +msgid "inspect.tabs.code.selected.image" +msgstr "hoto" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.create-group" +msgstr "kirkiri rukuni" + +msgid "modals.delete-webhook.accept" +msgstr "goge webhook" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-member-confirm.accept" +msgstr "aika saqon" #: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs msgid "labels.member" msgstr "mamba" -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.members" -msgstr "mambobi" +msgid "onboarding.newsletter.policy" +msgstr "dokoki." -#: src/app/main/ui/settings/password.cljs -msgid "labels.new-password" -msgstr "sabuwar lambar tsaro" +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs +msgid "errors.email-already-exists" +msgstr "an yi amfani da imel" -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs -msgid "labels.no-comments-available" -msgstr "an dakatar da kai duka! Alamar sabon sharhi za ta fito nan." +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "errors.media-type-not-allowed" +msgstr "wannan hoton ba ya aiki." -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.no-invitations" -msgstr "ba saqon da ba a buxa ba." +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-transform" +msgstr "masarrafin rubu,manya ko qanana" -#: src/app/main/ui/dashboard/team.cljs -#, markdown -msgid "labels.no-invitations-hint" -msgstr "danna **gayyato mutane** wurin da ake nemo mutane a wannan tawaga." +msgid "dashboard.webhooks.create" +msgstr "yin webhook" -#: src/app/main/ui/static.cljs -msgid "labels.not-found.desc-message" -msgstr "babu wannan fagen, ko ba ka da izinin shiga." +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.bottom" +msgstr "Kasa" -#: src/app/main/ui/static.cljs -msgid "labels.not-found.main-message" -msgstr "alama!" +msgid "common.share-link.get-link" +msgstr "samun hanya" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.num-of-files" -msgid_plural "labels.num-of-files" -msgstr[0] "kundi 1" -msgstr[1] "kundaye %s" +msgid "shortcuts.open-comments" +msgstr "tafi inda 'yan kallo za su bayyana ra'ayi" -msgid "labels.num-of-frames" -msgid_plural "labels.num-of-frames" -msgstr[0] "allo 1" -msgstr[1] "alluna %s" +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subtitle" +msgstr "" +"bayyana dalilin imel dinka, faiyace idan akwai matsala, an shawarwari ko " +"hasashe. tawaga ko mamba za a kula da kai." -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.num-of-projects" -msgid_plural "labels.num-of-projects" -msgstr[0] "aiki" -msgstr[1] "aiyuka %s" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.title" +msgstr "gogewa %s kundaye" -#: src/app/main/ui/settings/password.cljs -msgid "labels.old-password" -msgstr "tsohuwar lambar tsaro" +msgid "workspace.header.menu.disable-snap-pixel-grid" +msgstr "kashe tsinkewa zuwa pixel" -#: src/app/main/ui/workspace/comments.cljs -msgid "labels.only-yours" -msgstr "naka kawai" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in" +msgstr "sauki ciki" -msgid "labels.or" -msgstr "ko" +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-family" +msgstr "gidan salo" -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.owner" -msgstr "mai" +#: src/app/main/ui/auth/login.cljs +msgid "auth.register" +msgstr "ba ka da kunxi har yanzu?" #: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs msgid "labels.password" msgstr "lambar tsaro" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.pending-invitation" -msgstr "tukuna" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.profile" -msgstr "kundi" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.projects" -msgstr "aiyuka" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.release-notes" -msgstr "bayar da bayani" - -#: src/app/main/ui/workspace.cljs -msgid "labels.reload-file" -msgstr "qara dora kundi" - #: src/app/main/ui/workspace/libraries.cljs, src/app/main/ui/dashboard/team.cljs msgid "labels.remove" msgstr "cire" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.remove-member" -msgstr "cire mamba" - -#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.rename" -msgstr "sake suna" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.solid" +msgstr "mai tauri" -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.rename-team" -msgstr "sake suna tawaga" +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.generic" +msgstr "wata matsala ta faru." -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.resend-invitation" -msgstr "sake aika saqon gayyata" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "wasu" -#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs -msgid "labels.retry" -msgstr "sake gwadawa" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.there-are-updates" +msgstr "a kwai na zamani a rababban ma'ajiya" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.role" -msgstr "matsayi" +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.leave-team" +msgstr "fita tawaga" -msgid "labels.save" -msgstr "ajiye" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.delete" +msgstr "gogagge %s" -msgid "labels.search-font" -msgstr "neman font" +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.line-height" +msgstr "tsawon layi" -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.send" -msgstr "aika" +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code" +msgstr "lamba" -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.sending" -msgstr "aikawa…" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.top" +msgstr "sama" -#: src/app/main/ui/static.cljs -msgid "labels.service-unavailable.desc-message" -msgstr "mu na cikin kula a tsarinka." +msgid "shortcuts.bring-back" +msgstr "tura zuwa baya" -#: src/app/main/ui/static.cljs -msgid "labels.service-unavailable.main-message" -msgstr "ba sabis" +msgid "shortcuts.text-align-justify" +msgstr "jera da inganci" -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.settings" -msgstr "gyara" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius.single-corners" +msgstr "kwanar da take cin gashin kanta" -msgid "labels.share-prototype" -msgstr "tura manhajar rubutu" +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.unexpected-token" +msgstr "tukuicin da ba a san da shi ba" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.shared-libraries" -msgstr "taskoki" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.dotted" +msgstr "digo digo" -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.show-all-comments" -msgstr "fito da yabo" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-artboard-names" +msgstr "Boye allom suna" -msgid "labels.show-comments-list" -msgstr "jerin ire-iren yabo" +msgid "dashboard.export.options.merge.message" +msgstr "" +"za ka iya fitar da kundi tare da haxe muhimman abubuwa, na waje a " +"kunditaskira." -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.show-your-comments" -msgstr "bayyana na ka ra’ayin" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.backward" +msgstr "tura zuwa baya" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.status" -msgstr "daraja" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-ldap-submit" +msgstr "LDAP" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.tutorials" -msgstr "koyarwa" +msgid "onboarding-v2.newsletter.privacy2" +msgstr "" +"za mu aika maka da imel mai amfani. za ka iya biya a kowane lokaci za ka iya " +"ta kowace hanyar biyanmu." -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.unpublish-multi-files" -msgstr "kundayen da ba a wallafa ba %s" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.copy-invitation-link" +msgstr "kwafar hanya" -#: src/app/main/ui/settings/profile.cljs -msgid "labels.update" -msgstr "sabunta" +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.rename" +msgstr "sake suna" -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.update-team" -msgstr "sabunta tawaga" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.select-a-shape" +msgstr "zabi surar allo, ko rukuni ta hadu da daya allon." -msgid "labels.upload" -msgstr "xorawa" +msgid "onboarding.newsletter.accept" +msgstr "haka, za a biya" -msgid "labels.upload-custom-fonts" -msgstr "Upload custom fonts" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke" +msgstr "gigciye" -msgid "labels.uploading" -msgstr "ana dorawa…" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.leftright" +msgstr "hagu & dama" -msgid "labels.view-only" -msgstr "gani kaxai" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-rules" +msgstr "Nuna ma'auni" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.viewer" -msgstr "ma su kallo" +msgid "shortcuts.toggle-focus-mode" +msgstr "Danna yanayin maida hankali" -msgid "labels.webhooks" -msgstr "Webhooks" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export" +msgstr "fitarwa" -#: src/app/main/ui/comments.cljs -msgid "labels.write-new-comment" -msgstr "rubuta s abon yabo" +msgid "workspace.layout_grid.editor.title" +msgstr "tace akwati" -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.you" -msgstr "(kai)" +msgid "workspace.undo.entry.single.page" +msgstr "shafi" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.your-account" -msgstr "fagenka" +msgid "dashboard.export.explain" +msgstr "za ka iya fitar da kundi daya ko fiye ta hanyar tura taska. \"me \"*?" -#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs -msgid "media.loading" -msgstr "xora hoto …" +msgid "shortcuts.open-interactions" +msgstr "tafi sashin da masu kallo suke hulda" -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"xakin ba komai. wurin ajiyar tawaga, turken da ka yi za ya yi aiki a sauran " -"kundaye. ka tabbata kai ne ka ke son wallafa shi?" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.message" +msgstr "ka tabbata kana son goge %s kundaye?" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.accept" -msgstr "qara yin wurin ajiyar tawaga" +#: src/app/main/ui/dashboard/team.cljs +msgid "team.webhooks.max-length" +msgstr "Sunan shafin yanar gizon zai kunshi a mafi yawa haruffa 2048." -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.hint" -msgstr "" -"idan ka aje a wurin ajiyar tawaga, turken kundin xakin ajiyar za ya kasance " -"za a iya amfani da shi a sauran kundaye." +msgid "shortcuts.show-pixel-grid" +msgstr "nuna / boye akwatin pixel" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.message" -msgstr "qara “%s” xakin ajiya" +msgid "modals.delete-font.title" +msgstr "goge font" -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.big-nudge" -msgstr "jan hankali" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-oidc-submit" +msgstr "shaidar buxewa" -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.confirm-email" -msgstr "tantance sabon imel" +msgid "inspect.attributes.typography.text-decoration.underline" +msgstr "jan layi" -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.info" -msgstr "" -"za mu aika maka da imel ta wannan imel xin “%s” domin tantance " -"shaidarka." +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "gama aiki kan %s" -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.new-email" -msgstr "sabon imel" +#, markdown +msgid "dashboard.fonts.hero-text2" +msgstr "" +"za ka iya xora fonts dinka ne domin ka sami dammar amfani da fenfot. gano " +"akwai qarin abubuwan das u ka dace da dokokin fpntaiki](https://fenfot.app/" +"dokoki.html). Za ka so bayani game da[ffonts](https://www.rubutu.com/faq)." -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.submit" -msgstr "sake imel" +msgid "workspace.sidebar.layers.images" +msgstr "hoto" -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.title" -msgstr "sake imel xinka" +msgid "dashboard.webhooks.content-type" +msgstr "irin ra'ayi" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.copy-token" -msgstr "kwafar kyauta" +msgid "workspace.header.menu.show-pixel-grid" +msgstr "Nuna akwatin pixel" #: src/app/main/ui/settings/access-tokens.cljs msgid "modals.create-access-token.expiration-date.label" msgstr "lokacin daina aiki" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.label" -msgstr "suna" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.placeholder" -msgstr "sunan zai iya taimakawa wajen sanin menene alama" +msgid "shortcuts.h-distribute" +msgstr "raba ta tsaye" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.submit-label" -msgstr "yi sabuwar alama" +msgid "workspace.header.menu.undo" +msgstr "Cire" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.title" -msgstr "samar da alamar shiga" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "fiye da 50" -msgid "modals.create-webhook.submit-label" -msgstr "qirqirar webhook" +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.show-interactions-on-click" +msgstr "Nuna hulda da an danna" -msgid "modals.create-webhook.title" -msgstr "qirqirar webhook" +#: src/app/main/ui/workspace/colorpicker/libraries.cljs, src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.file-library" +msgstr "F" -msgid "modals.create-webhook.url.label" -msgstr "farashin URL" +msgid "dashboard.export-multi" +msgstr "fitar da fenfot %s kundaye" -msgid "modals.create-webhook.url.placeholder" -msgstr "https://misali.com/postreceive" +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.email-already-validated" +msgstr "an farfaxo da imel." -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.accept" -msgstr "goge alama" +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-weight" +msgstr "kaurin salon" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.message" -msgstr "ka tabbata kana son goge wannan alamar?" +msgid "shortcuts.artboard-selection" +msgstr "kirkiri allo daga zabi" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.title" -msgstr "goge alama" +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.show-all-files" +msgstr "duk kundaye" -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.cancel" -msgstr "ajiye asusu da soke shi" +msgid "errors.team-leave.owner-cant-leave" +msgstr "mai abu ba ya barin tawaga, dole adubi matsayin mai abu." -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.confirm" -msgstr "haka, goge asusu" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.left" +msgstr "Hagu" -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.info" -msgstr "idan ka cire asusunka za ka iya rasa aikin da ka kammala." +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-language" +msgstr "zavavven harshen UI" -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.title" -msgstr "ka tabbata ka na son goge asusunka?" +msgid "workspace.undo.entry.single.color" +msgstr "kalar kadara" -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.accept" -msgstr "goge fira" +#: src/app/main/data/workspace.cljs +msgid "errors.clipboard-not-implemented" +msgstr "manhajar binciken nan ba ta iya yin wannan aikin" -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.message" -msgstr "ka tabbata ka na son goge fira? duk sharhi a nan za a goge matsaloli." +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "dole lambar tsaro ta qunshi wasu alamomi, sannan tazara." -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.title" -msgstr "goge tattaunawa" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.line-height" +msgstr "tsahon layi" -msgid "modals.delete-component-annotation.message" -msgstr "ka tabbata kana son goge wannan bayanin?" +#: src/app/main/ui/confirm.cljs, src/app/main/ui/confirm.cljs +msgid "ds.confirm-title" +msgstr "ka tabbata?" -msgid "modals.delete-component-annotation.title" -msgstr "goge bayani" +msgid "labels.search-font" +msgstr "neman font" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.accept" -msgstr "goge kundi" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.ungroup" +msgstr "raba rukunin" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.message" -msgstr "ka tabbata kana son goge wannan kundin?" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "na gaba" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.title" -msgstr "goge kundi" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-auto-height" +msgstr "sarrafaffan tsaho" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-multi-confirm.accept" -msgstr "goge kundaye" +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.profile" +msgstr "kundi" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-multi-confirm.message" -msgstr "ka tabbata kana son goge %s kundaye?" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "bayyana yawan tawagarka?" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-multi-confirm.title" -msgstr "gogewa %s kundaye" +msgid "workspace.focus.focus-on" +msgstr "maida hankali" -msgid "modals.delete-font-variant.message" -msgstr "" -"ka tabbata kana son goge wannan salon font din? ba zai xoru ba idan an yi " -"amfani da shi a kundi." +msgid "inspect.tabs.code.selected.frame" +msgstr "hukuma" -msgid "modals.delete-font-variant.title" -msgstr "goge salon font" +msgid "viewer.header.comments-section" +msgstr "Bayyana ra'ayi(%s)" -msgid "modals.delete-font.message" -msgstr "" -"ka tabbata kana son goge wannan font xin ? ba zai yi aiki ba idan an yi " -"amfani da shi a kundi." +msgid "labels.webhooks" +msgstr "Webhooks" -msgid "modals.delete-font.title" -msgstr "goge font" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.unlock" +msgstr "bude" -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "modals.delete-page.body" -msgstr "ka tabbata kana son goge wannan shafin?" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-bottom-right" +msgstr "kasan dama" -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "modals.delete-page.title" -msgstr "goge shafi" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay" +msgstr "bude mai rufi" -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.accept" -msgstr "goge aiki" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-dissolve" +msgstr "narkewa" -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.message" -msgstr "ka tabbata kana son goge wannan aikin?" +msgid "onboarding-v2.newsletter.news" +msgstr "aiko man da bayanin fenfot (rubutun blog, bidiyon koyarwa, kallo...)." -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.title" -msgstr "goge aikin" +msgid "common.unpublish" +msgstr "maras wallafa" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.accept" -msgid_plural "modals.delete-shared-confirm.accept" -msgstr[0] "goge kundi" -msgstr[1] "goge kundaye" +msgid "workspace.undo.entry.single.rect" +msgstr "rectangle" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.no-files-message" -msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "ba zai yi aiki a kowane kundi ba." -msgstr[1] "ba za su yi aiki a kowane kundi ba." +msgid "shortcuts.toggle-visibility" +msgstr "Nuna/boye" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.scd-message" -msgid_plural "modals.delete-shared-confirm.activated.scd-message" -msgstr[0] "za a iya buxe wannan taskirar a nan: " -msgstr[1] "za a iya buxe taskirorin nan a nan: " +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.settings" +msgstr "gyara" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.message" -msgid_plural "modals.delete-shared-confirm.message" -msgstr[0] "ka tabbata kana son goge wannan kundin?" -msgstr[1] "ka tabbata kana son goge waxannan kundayen?" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-full-screen" +msgstr "Cika allon" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.title" -msgid_plural "modals.delete-shared-confirm.title" -msgstr[0] "goge kundi" -msgstr[1] "goge kundaye" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.cut" +msgstr "cire" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.accept" -msgstr "goge tawaga" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "... jagora, yawan amfani da shiga, leqe-leqe, dss." -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.message" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "kwanaki 60" + +msgid "shortcut-section.viewer" +msgstr "Dankallo" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.unpublish-multi-files" +msgstr "kundayen da ba a wallafa ba %s" + +msgid "common.share-link.confirm-deletion-link-description" msgstr "" -"ka tabbata kana son goge wannan tawagar? Duk aiyukanka na kundayen da suka " -"danganci tawagar za su yi gogewar dindindin." +"ka tabbata ka na son rufe wannan hanyar? idan ka rufe ba mai iya sake bi" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.title" -msgstr "gogewar tawaga" +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.accept" +msgstr "goge aiki" -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.accept" -msgstr "goge memba" +#: src/app/main/ui/settings/password.cljs +msgid "generic.error" +msgstr "afkuwar matsala" -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.message" -msgstr "ka tabbata kana son cire wannan memban a wannan tawaar?" +msgid "workspace.header.menu.disable-scale-content" +msgstr "kashe sikelin rabo" -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.title" -msgstr "cire memban tawaga" +msgid "dashboard.export.options.detach.title" +msgstr "lura da bayanan da ke cikin manhajar tura kundi" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "" -"duk aikin da aka yi a wannan kundin, nan za a same shi (ba zanen da za a " -"iya tsinkawa)." -msgstr[1] "" -"duk aikin da aka yi a waxancan kundayen, can za a same su (ba zane da za " -"iya tsinkawa)." +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object-slow" +msgstr "Fitarwa ba tsammani ta sami tsaiko" -msgid "modals.delete-webhook.accept" -msgstr "goge webhook" +#: src/app/main/ui/workspace/header.cljs +msgid "dashboard.export-shapes" +msgstr "Fitarwa" -msgid "modals.delete-webhook.message" -msgstr "ka tabbata ka na son goge webhook?" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.lock" +msgstr "kulle" -msgid "modals.delete-webhook.title" -msgstr "gogewa webhook" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.help-center" +msgstr "sashen taimako" -msgid "modals.edit-webhook.submit-label" -msgstr "gyara webhook" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.modify" +msgstr "gyaggyarawa %s" -msgid "modals.edit-webhook.title" -msgstr "gyara webhook" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "da yawa" -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.invite-member-confirm.accept" -msgstr "aika saqon" +msgid "dashboard.download-binary-file" +msgstr "sauke manhajar fenfot(.manhajar fenfot)" -msgid "modals.invite-member.emails" -msgstr "imel, rabawar waqafi" +msgid "dashboard.fonts.deleted-placeholder" +msgstr "rashin font" -msgid "modals.invite-member.repeated-invitation" -msgstr "" -"waxansu imel daga membobin qungiyar na yanzu. ba za a aikawa da gayyatarsu " -"ba ." +msgid "shortcuts.opacity-6" +msgstr "Saita dishi dishi zuwa kashi 60" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hex" +msgstr "HEX" #: src/app/main/ui/dashboard/team.cljs -msgid "modals.invite-team-member.title" -msgstr "gayyato membobi zuwa ga tawaga" +msgid "labels.expired-invitation" +msgstr "daina aiki" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-close-confirm.hint" +msgid "onboarding.team-modal.create-team-desc" msgstr "" -"ka tabbata memban tawaga kaxai, za ya iya goge tawaga tare da aikinta da " -"kundaye." +"tawaga na ba ka damar haduwa da masu amfani da fenfot domin yi aiki daya " +"akan kundaye." -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-close-confirm.message" -msgstr "ka tabbata ka na son fita daga %s tawaga?" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.email-has-permanent-bounces" +msgstr "imel «%s» na da bayanan matsaloli na dindindin." -msgid "modals.leave-and-reassign.forbidden" -msgstr "" -"ba za ku iya bari ba idan ba wani memba da zai ingata wa mai shi. ku na iya " -"goge tawaga." +msgid "errors.webhooks.unexpected-status" +msgstr "matsayin da ba zato %s" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.hint1" -msgstr "" -"kai ne mai wannan tawagar. zabi wani memba da za ya iya inganta wa mai shi " -"kafin ka fita." - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.promote-and-leave" -msgstr "inganta sannan ka bari" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.typography" +msgstr "%s Rubutun rubutu" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.select-member-to-promote" -msgstr "zavi memba domin havakawa" +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-email" +msgstr "imel" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.title" -msgstr "kafin ka fita" +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.title" +msgstr "goge tattaunawa" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-confirm.accept" -msgstr "barin tawaga" +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.big-nudge" +msgstr "jan hankali" #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.leave-confirm.message" msgstr "ka tabbata ka na son barin wannan tawagar?" +msgid "dashboard.webhooks.empty.no-webhooks" +msgstr "ba a gina wani webhooks ba." + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-team-member.title" +msgstr "gayyato membobi zuwa ga tawaga" + +msgid "shortcut-section.workspace" +msgstr "fagen aiki" + #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.leave-confirm.title" msgstr "barin tawaga" -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.nudge-title" -msgstr "adadin jan hankali" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "fara" #: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.accept" -msgstr "canza wurin mallaka" +msgid "labels.resend-invitation" +msgstr "sake aika saqon gayyata" -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.hint" -msgstr "" -"idan ka canza wurin mallaka, ba za ka iya sauya matsayin shugaba ba, " -"gazawar wasu dokokin wannan tawaagar. " +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.difference" +msgstr "banbanci" -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.message" -msgstr "kai ke da wannan tawagar yanzu. ka tabbata kana son yin %s sabon mai tawaga?" +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.hide-resolved-comments" +msgstr "voye saqon da aka buxa" -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.title" -msgstr "mallakar tawaga" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin-all" +msgstr "gefen duka" -msgid "modals.publish-empty-library.accept" -msgstr "wallafa" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.github-repo" +msgstr "taskar rubuce-rubuce" -msgid "modals.publish-empty-library.message" -msgstr "ba komai a taskarka. ka na son wallafa ta?" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.strikethrough" +msgstr "gigciye ta cikinsa (%s)" -msgid "modals.publish-empty-library.title" -msgstr "wallafa taska maras komai" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.darken" +msgstr "kara masa duhu" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.accept" -msgstr "cire taskar shiye-shirye" +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.confirm-password" +msgstr "tabbatar da kalmar buxewa" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.hint" -msgstr "" -"idan ba ka cire taskar shirye-shirye ba, kundin taskar na wannan kundin zai " -"tsaya kasancewar za ka iya amfani da shi a cikin kundayenka." +msgid "shortcuts.open-workspace" +msgstr "tafi fagen aiki" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.message" -msgstr "cire “%s” a taskar shirye-shirye" +msgid "labels.and" +msgstr "da" -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.small-nudge" -msgstr "qaramin jan hankali" +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.top" +msgstr "sama" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.accept" -msgid_plural "modals.unpublish-shared-confirm.accept" -msgstr[0] "maras wallafa" -msgstr[1] "maras wallafa" +msgid "shortcut-subsection.main-menu" +msgstr "Babbar kumshiya" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.message" -msgid_plural "modals.unpublish-shared-confirm.message" -msgstr[0] "ka tabbata ka na son rufe taskar nan?" -msgstr[1] "ka tabbata ka na son rufe taskokin nan?" +#: src/app/main/ui/auth/register.cljs +msgid "auth.fullname" +msgstr "cikakken suna" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.reset-overrides" +msgstr "sake saita sokewa" + +msgid "common.share-link.permissions-hint" +msgstr "duk wanda ya mallaki mataki,za ya iya shiga" #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.title" -msgid_plural "modals.unpublish-shared-confirm.title" -msgstr[0] "rufe taska" -msgstr[1] "rufe taskoki" +msgid "modals.remove-shared-confirm.accept" +msgstr "cire taskar shiye-shirye" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component-in-bulk.hint" -msgstr "" -"ka kusa sabunta taskar ajiyar shir-shirye. zai iya shafar sauran kundayen " -"da ke amfani da ita." +msgid "workspace.undo.entry.multiple.typography" +msgstr "rubutun rubuta kadara" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.accept" -msgstr "sabunta" +msgid "shortcuts.align-center" +msgstr "tsarin tsakiya" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.cancel" -msgstr "soke" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-center" +msgstr "jerin tsakiya (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.hint" +msgid "dashboard.webhooks.description" msgstr "" -"ka kusa sabunta sashe a babbar taska. wannan za ya iya aiki a sauran " -"kundayen da ke amfani da ita." +"Webhooks hanyar sanar da manhajoji da addireshi intanet idan wani ya faru a " +"Penpot. za a tura maka da saqon talla URLs ka samar da." -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.message" -msgstr "sabunta sashe a babbar taska" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text-palette" +msgstr "rubutub rubutu (%s)" -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "akwai sabon yayi, fatan za a sabunta fage" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.titlecase" +msgstr "yanayin lakani" -#: src/app/main/ui/dashboard/team.cljs -msgid "notifications.invitation-email-sent" -msgstr "an aika da saqon" +msgid "workspace.sidebar.layers.frames" +msgstr "allo" -#: src/app/main/ui/dashboard/team.cljs -msgid "notifications.invitation-link-copied" -msgstr "kwafar hanyar gayya" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fit" +msgstr "dace - ja sikeli ya dace da shi" -#: src/app/main/ui/settings/delete_account.cljs -msgid "notifications.profile-deletion-not-allowed" -msgstr "ba za ka iya goge kundin ba. ka jira umarnin tawaga ka fin ka ci gaba." +#: src/app/main/ui/dashboard/files.cljs +msgid "title.dashboard.files" +msgstr "%s - Tukunyar aje biro" -#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs -msgid "notifications.profile-saved" -msgstr "an ajiye bayanai!" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object-error" +msgstr "An gaza fitarwa" -#: src/app/main/ui/settings/change_email.cljs -msgid "notifications.validation-email-sent" -msgstr "an aika da imel din tantancewa %s. bincika imel xinka!" +#: src/app/main/ui/alert.cljs +msgid "ds.alert-ok" +msgstr "haka" -msgid "onboarding-v2.before-start.desc1" -msgstr "" -"ya kamata kasan akwai kayayyaki da yawa da za su iya taimaka maka ka sami " -"damar fara aiki da fenfot, kamar jagoran mai amfani tasharmu ta youtub." +msgid "shortcuts.escape" +msgstr "kubuta" -msgid "onboarding-v2.before-start.desc2" -msgstr "" -"cikakken bayanin yadda za a yi amfani da fenfot. daga rubutu zuwa tsara ko " -"rarraba iri." +msgid "shortcuts.copy" +msgstr "kwafi" -msgid "onboarding-v2.before-start.desc2.title" -msgstr "xanjagora" +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.hsv" +msgstr "HSV" -msgid "onboarding-v2.before-start.desc3" -msgstr "za ka iya kallon koyarwarmu da mutanenmu ke yi." +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete-flow-start" +msgstr "goge kwararar farko" -msgid "onboarding-v2.before-start.desc3.title" -msgstr "koyarwa ta hoto mai motsi" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-left" +msgstr "kasa hagu" -msgid "onboarding-v2.before-start.title" -msgstr "kafin ka fara" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "mai daraja" -msgid "onboarding-v2.newsletter.desc" +msgid "dashboard.export.detail" +msgstr "*akwai sassan,hotuna,launuka,da/kozane-zane." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.hint" msgstr "" -"domin jin daxin fenfot , sai ka biya kuxi domin labarai da ci gaban da ake " -"samu." +"idan ka aje a wurin ajiyar tawaga, turken kundin xakin ajiyar za ya kasance " +"za a iya amfani da shi a sauran kundaye." -msgid "onboarding-v2.newsletter.news" -msgstr "aiko man da bayanin fenfot (rubutun blog, bidiyon koyarwa, kallo...)." +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-offset-effect" +msgstr "cire tasiri" -msgid "onboarding-v2.newsletter.privacy1" -msgstr "mu na kula da sirri, a nan za ka karanta na mu " +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to" +msgstr "tura a" -msgid "onboarding-v2.newsletter.privacy2" -msgstr "" -"za mu aika maka da imel mai amfani. za ka iya biya a kowane lokaci za ka " -"iya ta kowace hanyar biyanmu." +msgid "modals.create-webhook.title" +msgstr "qirqirar webhook" -msgid "onboarding-v2.newsletter.updates" -msgstr "aiko man da sabbin abubuwan da aka yi (sabbib fasali, fitowa, gyara...)." +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.rgba" +msgstr "RGBA" -msgid "onboarding-v2.welcome.desc1" -msgstr "" -"fenfot ne ke yin kelaidos kamar yadda mutane ke yi, mutane na taimakon " -"junansu. kowa za ya iya hada hannu da:" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.mixed" +msgstr "gauraya" -msgid "onboarding-v2.welcome.desc2" -msgstr "" -"wurin da kowa zai iya koyo, fahimtar ta juna a kan fenfot, kasancewarta " -"manyan tawagar fenfot da sauran mutane." +msgid "shortcuts.detach-component" +msgstr "rarraba abubuwan da su ke a ware" -msgid "onboarding-v2.welcome.desc2.title" -msgstr "hulxa da kai cikin mutane" +msgid "shortcuts.reset-zoom" +msgstr "zake zukowa" msgid "onboarding-v2.welcome.desc3" msgstr "" "wurin da za ka san yadda za ka hada-hannu da fassara, neman fasali, manyan " "gudunmawa, magance matsala…" -msgid "onboarding-v2.welcome.desc3.title" -msgstr "gudunmawar jagora" +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hright" +msgstr "Daidaita dama (%s)" -msgid "onboarding-v2.welcome.title" -msgstr "barka da zuwa fenfot!" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.status" +msgstr "daraja" -msgid "onboarding.choice.team-up.create-team-desc" -msgstr "bayan ka yi wa tawagarka suna, za ka iya gaiyato mutane ku hadu." +msgid "common.share-link.permissions-can-comment" +msgstr "sharhi" -msgid "onboarding.choice.team-up.create-team-placeholder" -msgstr "sanya sunan tawaga" +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgba" +msgstr "RGBA" -msgid "onboarding.choice.team-up.invite-members" -msgstr "gayyato mambobi" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row" +msgstr "jerawa" -msgid "onboarding.choice.team-up.invite-members-info" -msgstr "" -"ka tuna da kowa. masu qirqira, masu tsarawa, shuwagabanniS... daban-daban " -"ya qara :)" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to" +msgstr "kewayawa zuwa" -msgid "onboarding.choice.team-up.roles" -msgstr "gayyata tare da bayar da matsayi:" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "ya kake tunanin aiki da fenfot?" -msgid "onboarding.newsletter.accept" -msgstr "haka, za a biya" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.inner" +msgstr "ciki" -msgid "onboarding.newsletter.acceptance-message" +msgid "onboarding-v2.before-start.desc1" msgstr "" -"an aika maka da saqon buqatar biya, za mu aika maka da saqon imel tabbatar " -"da shi." +"ya kamata kasan akwai kayayyaki da yawa da za su iya taimaka maka ka sami " +"damar fara aiki da fenfot, kamar jagoran mai amfani tasharmu ta youtub." -msgid "onboarding.newsletter.policy" -msgstr "dokoki." +msgid "shortcut-subsection.general-viewer" +msgstr "gamayya" -msgid "onboarding.newsletter.title" -msgstr "ka buqatar labaran fenfot?" +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-members" +msgstr "mambobin tawaga" -msgid "onboarding.team-modal.create-team" -msgstr "yin tawaga" +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-file-prefix" +msgstr "sabon kundi" -msgid "onboarding.team-modal.create-team-desc" -msgstr "" -"tawaga na ba ka damar haduwa da masu amfani da fenfot domin yi aiki daya " -"akan kundaye." +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "lambar tsaron za ta gama aiki %s" -msgid "onboarding.team-modal.create-team-feature-1" -msgstr "aiyuka da kundaye da yawa" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.underline" +msgstr "ja layi (%s)" -msgid "onboarding.team-modal.create-team-feature-2" -msgstr "ma su yin shiri dayawa lokaci xaya" +msgid "onboarding.choice.team-up.create-team-desc" +msgstr "bayan ka yi wa tawagarka suna, za ka iya gaiyato mutane ku hadu." -msgid "onboarding.team-modal.create-team-feature-3" -msgstr "aiyukan shugaba" +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to" +msgstr "" +"za ka iya daidaita kayan zanenka ta hanyar (amfani da madannin qasa sashen " +"dama)." -msgid "onboarding.team-modal.create-team-feature-4" -msgstr "Unlimited members" +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.accept" +msgstr "goge fira" -msgid "onboarding.team-modal.create-team-feature-5" -msgstr "100% kyauta!" +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-duplicate-project" +msgstr "an kwafi aikinka" -msgid "onboarding.templates.subtitle" -msgstr "ga wasu hotunan talla nan." +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.cancel" +msgstr "sokewa" -msgid "onboarding.templates.title" -msgstr "fara tsarawa" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay-dest" +msgstr "kulle mai rufi %s" -msgid "onboarding.welcome.alt" -msgstr "fenfot" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "goge alama" -#: src/app/main/ui/auth/recovery.cljs -msgid "profile.recovery.go-to-login" -msgstr "je ka hanyar shiga" +#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.your-penpot" +msgstr "fenfot na ka" -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "wane kayan zane ka fi iya aiki da shi?" +msgid "shortcuts.bring-forward" +msgstr "tura gaba" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "11-30" +msgid "workspace.header.menu.redo" +msgstr "sake" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.detach-instance" +msgstr "raba yanayin abin" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "31-50" +msgid "shortcuts.opacity-9" +msgstr "Seta dish dishi zuwa 90" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "da yawa" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-right" +msgstr "jera dama (%s)" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Adobe XD" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-textpalette" +msgstr "Nuna launukan tsarin rubutu" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Canva" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flip-horizontal" +msgstr "kifa ta tsaye" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "ta ya za ka bayyana kwarewarka akai..." +msgid "labels.continue" +msgstr "ci gaba" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "ma su tsarawa" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.hard-light" +msgstr "Haske mai muya" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "ma su qirqira" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-max-w" +msgstr "fadi mafi yawa" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "qara samun bayanin fenfot" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.management" +msgstr "shuwagabannin tawaga" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Figma" +msgid "inspect.tabs.code.selected.component" +msgstr "bangare" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "mawallafi/VP" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column-reverse" +msgstr "sake shafi" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "ni mai zaman kansa ne" +msgid "dashboard.download-standard-file" +msgstr "sauke cikakken kundi(.svg + .json)" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "sami lambar kowane aiki " +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.desc-message" +msgstr "" +"an sami matsala. sake gwadawa idan matsalar ba ta kauce ba, tuntubi sashen " +"taimako." -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "... zane-zane, kayan kallo, tsarin qira, etc." +msgid "labels.font-variants" +msgstr "salo" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "teburin aiki" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.title" +msgstr "kafin ka fita" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "barin aikin tawaga" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.front" +msgstr "kawo zuwa gaba" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "za mu fara!" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-center" +msgstr "tsakiya" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "shugaban aiki" +#: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "errors.unexpected-error" +msgstr "afkuwar kuskuren da ba a zata ba." -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "kasuwanci" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.no-shared-libraries-available" +msgstr "Babu rababbun ma'adanai wanda aka samu" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "fiye da 50" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.square" +msgstr "murabba'i" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "na gaba" +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.fullscreen" +msgstr "Cika fuskar" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "babu" +msgid "workspace.undo.entry.single.multiple" +msgstr "wani abu" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "idan akwai qari (bayyana)" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.role" +msgstr "matsayi" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "ina aikin kaina" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.add-interaction" +msgstr "Danna wannan madannin + domin saka hulda." -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "can baya" +msgid "workspace.shape.menu.difference" +msgstr "bambanci" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "ya kake tunanin aiki da fenfot?" +msgid "workspace.assets.duplicate-main" +msgstr "maimaita ainihin" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "mi ne ne matsayinka?" +msgid "shortcuts.fit-all" +msgstr "fitar da abubuwan da zai dace da ko wane abu" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "dauki wanda kake so" +msgid "workspace.undo.entry.multiple.path" +msgstr "hanya" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "zana" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-right" +msgstr "kasa dama" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.some" -msgstr "wasu" +#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.duplicate" +msgstr "maimaita" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "fara" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-main" +msgstr "nuna ainihin wurin" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "fara aiki na" +msgid "onboarding-v2.before-start.desc2.title" +msgstr "xanjagora" #: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "malami ko dalibi" +msgid "questions.describe-your-experience-working-on" +msgstr "ta ya za ka bayyana kwarewarka akai..." -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "bayyana yawan tawagarka?" +msgid "shortcut-subsection.zoom-viewer" +msgstr "Zukowa" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "jaraba fenfot ka ga ko ta yi daidai da tawaga " +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.remove-shared" +msgstr "cire matattarar kundate" #: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "jaraba kafin ka yi aiki da fenfot" +msgid "questions.select-option" +msgstr "dauki wanda kake so" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "... jagora, yawan amfani da shiga, leqe-leqe, dss." +msgid "shortcuts.v-distribute" +msgstr "Rarraba ta tsaye" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "yin aikin kan tunani mai kyau" +msgid "common.share-link.page-shared" +msgid_plural "common.share-link.page-shared" +msgstr[0] "tura shafi 1" +msgstr[1] "%s an tura shafi" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"bayaninka za ya sanya mu fahimci kwarewarka da xabi'unka ta haka ne za mu " -"mayar maka da fenfot kayan aikin da ka ke jin daxin aiki da shi." +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.grid-title" +msgstr "Akwati" -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "cire" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsetx" +msgstr "X" -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "settings.multiple" -msgstr "gauraya" +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-go-to" +msgstr "je ka tiwita" -# SECTIONS -msgid "shortcut-section.basics" -msgstr "shikashikai" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.none" +msgstr "ba komai" -msgid "shortcut-section.dashboard" -msgstr "allon kallo" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.exclusion" +msgstr "warewa" -msgid "shortcut-section.viewer" -msgstr "Dankallo" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.title" +msgstr "labari" -msgid "shortcut-section.workspace" -msgstr "fagen aiki" +msgid "workspace.options.recent-fonts" +msgstr "da dimi dimi" -# SUBSECTIONS -msgid "shortcut-subsection.alignment" -msgstr "kwaskwarima" +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.new-email" +msgstr "sabon imel" -msgid "shortcut-subsection.edit" -msgstr "Tace" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.search-shared-libraries" +msgstr "Duba rabbaun ma'adanai" -msgid "shortcut-subsection.general-dashboard" -msgstr "gamayya" +msgid "shortcuts.text-align-left" +msgstr "jera hagu" -msgid "shortcut-subsection.general-viewer" -msgstr "gamayya" +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-subtitle" +msgstr "kyauta ne,an buxe hanyar samu" -msgid "shortcut-subsection.main-menu" -msgstr "Babbar kumshiya" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-textpalette" +msgstr "boye launukan yanayin tsarin rubutu" -msgid "shortcut-subsection.modify-layers" -msgstr "gyara shimfida" +msgid "labels.view-only" +msgstr "gani kaxai" -msgid "shortcut-subsection.navigation-dashboard" -msgstr "shawagi" +msgid "workspace.undo.entry.single.component" +msgstr "bangarori" -msgid "shortcut-subsection.navigation-viewer" -msgstr "shawagi" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.row" +msgstr "layuka" -msgid "shortcut-subsection.navigation-workspace" -msgstr "shawagi" +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.upload-all" +msgstr "xora duka" -msgid "shortcut-subsection.panels" -msgstr "allon sarrarfav naura" +msgid "inspect.attributes.typography.text-transform.none" +msgstr "babu" -msgid "shortcut-subsection.path-editor" -msgstr "Hanya" +msgid "workspace.assets.local-library" +msgstr "dakin karatun gida" -msgid "shortcut-subsection.shape" -msgstr "Siffa" +msgid "shortcuts.move-fast-right" +msgstr "matsa dama da sauri" -msgid "shortcut-subsection.text-editor" -msgstr "Rubutu" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.unmask" +msgstr "bude takunkumi" -msgid "shortcut-subsection.tools" -msgstr "Kayan aiki" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-submit" +msgstr "shiga ciki" -msgid "shortcut-subsection.zoom-viewer" -msgstr "Zukowa" +msgid "shortcuts.toggle-textpalette" +msgstr "Juya zuwa launukan rubutu" -msgid "shortcut-subsection.zoom-workspace" -msgstr "Zukowa" +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.update-team" +msgstr "sabunta tawaga" -msgid "shortcuts.add-comment" -msgstr "Bayyana Ra'ayi" +#: src/app/main/ui/workspace/sidebar/options/page.cljs +msgid "workspace.options.canvas-background" +msgstr "bayan zane" -msgid "shortcuts.add-node" -msgstr "kara Girma" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-top" +msgstr "jerin sama" -msgid "shortcuts.align-bottom" -msgstr "tsarin kasa" +msgid "shortcuts.font-size-dec" +msgstr "rage girman rubutu" -msgid "shortcuts.align-center" -msgstr "tsarin tsakiya" +msgid "dashboard.webhooks.empty.add-one" +msgstr "danna qasa \"sanya webhook\" qara xaya." -msgid "shortcuts.align-hcenter" -msgstr "tsarin tsakiya ko ina" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.default-team-name" +msgstr "manhajar fenfot" -msgid "shortcuts.align-justify" -msgstr "Tabbataccan tsari" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-pressing" +msgstr "yayin dannawa" -msgid "shortcuts.align-left" -msgstr "tsarin hagu" +msgid "shortcuts.open-dashboard" +msgstr "tafi gaban allon" -msgid "shortcuts.align-right" -msgstr "tsarin dama" +#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.profile-is-muted" +msgstr "bayananka su na da imel maras motsi (baiyana matsaloli)." -msgid "shortcuts.align-top" -msgstr "tsarin sama" +msgid "shortcuts.start-measure" +msgstr "fara aunawa" -msgid "shortcuts.align-vcenter" -msgstr "tsarin tsakiya a tsaye" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.center" +msgstr "Tsakiya" -msgid "shortcuts.artboard-selection" -msgstr "kirkiri allo daga zabi" - -msgid "shortcuts.bold" -msgstr "fito da shi barobaro" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "yi sabuwar alama" -msgid "shortcuts.bool-difference" -msgstr "ma'auni mabanbanci" +msgid "workspace.sidebar.collapse" +msgstr "ruguza a'ajiyar bayani" -msgid "shortcuts.bool-exclude" -msgstr "kebentaccan ma'auni" +msgid "common.share-link.permissions-can-inspect" +msgstr "iya bincka lamba" -msgid "shortcuts.bool-intersection" -msgstr "ma'aunin abubuwa daban daban" +msgid "workspace.options.height" +msgstr "Tsawo" -msgid "shortcuts.bool-union" -msgstr "ma'auni hadaka" +msgid "shortcuts.draw-ellipse" +msgstr "siffar kwai" -msgid "shortcuts.bring-back" -msgstr "tura zuwa baya" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "ma su tsarawa" -msgid "shortcuts.bring-backward" -msgstr "komawa baya" +#, markdown +msgid "dashboard.fonts.hero-text1" +msgstr "" +"duk wani adireshi da ka xora a nan dangin font ne a wannan tawagar za a sami " +"kundayen da ke xauke da kayan rubutu. Da fontfont iri daya ne ake kasawa**" +"gwaurayen font**. Za ka iya xora font ta waxannan hanyoyin: **TTF, OTF and " +"WOFF** (xaya kawai ake buqata)." -msgid "shortcuts.bring-forward" -msgstr "tura gaba" +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.drafts" +msgstr "adana" -msgid "shortcuts.bring-front" -msgstr "kawo zuwa gaba" +#: src/app/main/ui/dashboard/projects.cljs +msgid "title.dashboard.projects" +msgstr "tsare tsare - %s - Mazubin biruka" -msgid "shortcuts.clear-undo" -msgstr "goge sake" +#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs +msgid "labels.retry" +msgstr "sake gwadawa" -msgid "shortcuts.copy" -msgstr "kwafi" +msgid "modals.delete-webhook.title" +msgstr "gogewa webhook" -msgid "shortcuts.create-component" -msgstr "samar da abubuwa iri- iri" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.update-main" +msgstr "sabunta ainihin wurin" -msgid "shortcuts.create-new-project" -msgstr "samar da sabo abu" +msgid "shortcuts.toggle-rules" +msgstr "Nuna / boye magwaji" -msgid "shortcuts.cut" -msgstr "cire" +msgid "shortcuts.draw-path" +msgstr "Hanya" -msgid "shortcuts.decrease-zoom" -msgstr "fito da shi waje" +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code.selected.multiple" +msgstr "%s zavavve" -msgid "shortcuts.delete" -msgstr "goge" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flow-start" +msgstr "fara malala" -msgid "shortcuts.delete-node" -msgstr "fita da ga cikin net wok" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "babu" -msgid "shortcuts.detach-component" -msgstr "rarraba abubuwan da su ke a ware" +msgid "inspect.attributes.typography.text-transform.titlecase" +msgstr "yadda ake rubuta batu" -msgid "shortcuts.draw-curve" -msgstr "Ratse" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "za mu fara!" -msgid "shortcuts.draw-ellipse" -msgstr "siffar kwai" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-flex" +msgstr "cire sassaukan tsari" -msgid "shortcuts.draw-frame" -msgstr "Allo" +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.body" +msgstr "ka tabbata kana son goge wannan shafin?" -msgid "shortcuts.draw-nodes" -msgstr "samar da hanya" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-start" +msgstr "Gudun farko" -msgid "shortcuts.draw-path" -msgstr "Hanya" +msgid "shortcuts.move" +msgstr "matsa" -msgid "shortcuts.draw-rect" -msgstr "Ractangula" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.message" +msgstr "ka tabbata kana son goge wannan kundin?" -msgid "shortcuts.draw-text" -msgstr "rubutaccan sako" +msgid "shortcuts.opacity-3" +msgstr "Seta dashi dashi zuwa kashi 50" -msgid "shortcuts.duplicate" -msgstr "maimaita" +msgid "common.share-link.team-members" +msgstr "memba kaxai" -msgid "shortcuts.escape" -msgstr "kubuta" +msgid "workspace.sidebar.layers.components" +msgstr "bangare" -msgid "shortcuts.export-shapes" -msgstr "samar da sabbabbin abubuwa" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease" +msgstr "sauki" -msgid "shortcuts.fit-all" -msgstr "fitar da abubuwan da zai dace da ko wane abu" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.placeholder" +msgstr "sunan zai iya taimakawa wajen sanin menene alama" -msgid "shortcuts.flip-horizontal" -msgstr "kifa shi dai dai" +#: src/app/main/ui/settings/password.cljs +msgid "labels.confirm-password" +msgstr "tabbatar da lambar tsaro" -msgid "shortcuts.flip-vertical" -msgstr "kifa ta tsaye" +#: src/app/main/ui/workspace/sidebar/options/menus/svg_attrs.cljs, src/app/main/ui/inspect/attributes/svg.cljs +msgid "workspace.sidebar.options.svg-attrs.title" +msgstr "shigo da shi SVG halaye" -msgid "shortcuts.font-size-dec" -msgstr "rage girman rubutu" +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to-link" +msgstr "bayanin yadda ake fitarwa daga fenfot" -msgid "shortcuts.font-size-inc" -msgstr "kara gaban yanayi" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.comments" +msgstr "ra'ayi (%s)" -msgid "shortcuts.go-to-drafts" -msgstr "ta fi rumbu" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-none" +msgstr "Babu" -msgid "shortcuts.go-to-libs" -msgstr "ta fi zuwa rabbabben ma'ajiya" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.columns" +msgstr "shafi" -msgid "shortcuts.go-to-search" -msgstr "gajeran sako" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.accept" +msgstr "canza wurin mallaka" -msgid "shortcuts.group" -msgstr "rukuni" +msgid "workspace.viewport.click-to-close-path" +msgstr "latsa kusa da hanya" -msgid "shortcuts.h-distribute" -msgstr "raba ta tsaye" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" -msgid "shortcuts.hide-ui" -msgstr "fito / boye UI" +msgid "labels.close" +msgstr "rufewa" -msgid "shortcuts.increase-zoom" -msgstr "zuko ciki" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.lighten" +msgstr "kara masa haske" -msgid "shortcuts.insert-image" -msgstr "sa hoto" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export-multiple" +msgstr "Fitar da zababbun" -msgid "shortcuts.italic" -msgstr "juya zuwa kwantaccen rubuyu" +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "cire" -msgid "shortcuts.join-nodes" -msgstr "hada abubuwan" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.hide" +msgstr "boye" -msgid "shortcuts.letter-spacing-dec" -msgstr "rage filin harafin" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "zana" -msgid "shortcuts.letter-spacing-inc" -msgstr "kara filin harafin" +#: src/app/main/ui/settings/change_email.cljs +msgid "errors.email-invalid-confirmation" +msgstr "tabbata imel xinka ya yi daidai" -msgid "shortcuts.line-height-dec" -msgstr "rage tsawon layi" +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.title" +msgstr "Fitar da zavi" -msgid "shortcuts.line-height-inc" -msgstr "kara tsawon layi" +msgid "onboarding-v2.welcome.desc2.title" +msgstr "hulxa da kai cikin mutane" -msgid "shortcuts.line-through" -msgstr "danna layin duk" +msgid "dashboard.import.progress.process-page" +msgstr "fejin kasuwar duniya: %s" -msgid "shortcuts.make-corner" -msgstr "kirkiri kwana" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.set-default" +msgstr "saita a tsoho" -msgid "shortcuts.make-curve" -msgstr "kirkiri lankwasa" +#: src/app/main/errors.cljs +msgid "errors.feature-mismatch" +msgstr "" +"tamkar ka buxe wani kundi da ke da muhimmanci '%s' bayar da dama qarin da ka " +"yi ma fenfot xinka bai karbu ba ko ba zai yi aiki ba." -msgid "shortcuts.mask" -msgstr "takunkumi" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.retry" +msgstr "sake" -msgid "shortcuts.merge-nodes" -msgstr "hada da kauri" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-palette" +msgstr "nuna launukan kala" -msgid "shortcuts.move" -msgstr "matsa" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-relative-to" +msgstr "alaka zuwa" -msgid "shortcuts.move-fast-down" -msgstr "Matsa kasa da sauri" +msgid "errors.webhooks.ssl-validation" +msgstr "kuskure kan farfaxo da SSL." -msgid "shortcuts.move-fast-left" -msgstr "Matsa hagu da sauri" - -msgid "shortcuts.move-fast-right" -msgstr "matsa dama da sauri" +msgid "shortcuts.create-component" +msgstr "samar da abubuwa iri- iri" -msgid "shortcuts.move-fast-up" -msgstr "Matsa sama da sauri" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.update-components-in-bulk" +msgstr "sabunta ainihin wurin" -msgid "shortcuts.move-nodes" -msgstr "matsa a hade" +msgid "auth.terms-privacy-agreement" +msgstr "" +"lokacin qirqirar kundi, sai ka amincewa da yanayi aikin da " +"qa'idojinmuqa'idoji." -msgid "shortcuts.move-unit-down" -msgstr "Matsa da sashin kasa" +msgid "modals.delete-font-variant.title" +msgstr "goge salon font" -msgid "shortcuts.move-unit-left" -msgstr "Matsa da sashin hagu" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.sidebar.history" +msgstr "labari (%s)" -msgid "shortcuts.move-unit-right" -msgstr "Matsa da sashin dama" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.no-libraries-need-sync" +msgstr "Babu rabben ma'adanai da suke bukatar sabuntawa" -msgid "shortcuts.move-unit-up" -msgstr "Matsa da sashin samu" +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "workspace.options.blur-options.title" +msgstr "Dishi dishi" -msgid "shortcuts.next-frame" -msgstr "wani tsari" +msgid "dashboard.export.options.all.title" +msgstr "fitar da manhajar tura kundi" -msgid "shortcuts.not-found" -msgstr "babu gajeriyar hanya" +msgid "workspace.options.clip-content" +msgstr "Matse abun ciki" -msgid "shortcuts.opacity-0" -msgstr "Saita dishi dishi zuwa kashi 100" +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.editor" +msgstr "maigyara" -msgid "shortcuts.opacity-1" -msgstr "saita dishi dishi zuwa kashi 10" +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.new-password" +msgstr "sanya sabuwar lambar tsaro" -msgid "shortcuts.opacity-2" -msgstr "Saita dishi dishi zuwa kashi 20" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.path" +msgstr "hanya (%s)" -msgid "shortcuts.opacity-3" -msgstr "Seta dashi dashi zuwa kashi 50" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius.all-corners" +msgstr "duka kwanar" -msgid "shortcuts.opacity-4" -msgstr "Saita dishi dishi zuwa kashi 40" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-right" +msgstr "sama dama" -msgid "shortcuts.opacity-5" -msgstr "Saita dishi dishi zuwa kashi 50" +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.sending" +msgstr "aikawa…" -msgid "shortcuts.opacity-6" -msgstr "Saita dishi dishi zuwa kashi 60" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.select-layer" +msgstr "zabi shimfida" -msgid "shortcuts.opacity-7" -msgstr "Saita dishi dishi zuwa kashi 70" +msgid "workspace.undo.entry.single.image" +msgstr "hoto" -msgid "shortcuts.opacity-8" -msgstr "seta dishi dishin zuwa kashi 8o" +msgid "workspace.shape.menu.intersection" +msgstr "mahada" -msgid "shortcuts.opacity-9" -msgstr "Seta dish dishi zuwa 90" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-trigger" +msgstr "Jawo" -msgid "shortcuts.open-color-picker" -msgstr "abin daukan kala" +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/files.cljs +msgid "dashboard.new-file" +msgstr "+ sabon kundi" -msgid "shortcuts.open-comments" -msgstr "tafi inda 'yan kallo za su bayyana ra'ayi" +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/auth.cljs +msgid "title.default" +msgstr "Mazubin biruka - Tsara yanci ga tawaga" -msgid "shortcuts.open-dashboard" -msgstr "tafi gaban allon" +#: src/app/main/ui/alert.cljs +msgid "ds.alert-title" +msgstr "natsu" -msgid "shortcuts.open-inspect" -msgstr "tafi sashin da 'yan kallo za su duba" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.shortcuts" +msgstr "yanke (%s)" -msgid "shortcuts.open-interactions" -msgstr "tafi sashin da masu kallo suke hulda" +#: src/app/main/ui/inspect/attributes/shadow.cljs +msgid "inspect.attributes.shadow" +msgstr "inuwa" -msgid "shortcuts.open-viewer" -msgstr "tafi sashin da masu kallo suke hulda" +msgid "common.share-link.title" +msgstr "fenfot" -msgid "shortcuts.open-workspace" -msgstr "tafi fagen aiki" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding" +msgstr "filla filla" -msgid "shortcuts.or" -msgstr " ko " +msgid "shortcuts.toggle-history" +msgstr "Danna tarihi" -msgid "shortcuts.paste" -msgstr "manna" +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-theme" +msgstr "zaven batu" -msgid "shortcuts.prev-frame" -msgstr "allon da ya gabata" +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate" +msgstr "kwafi" -msgid "shortcuts.redo" -msgstr "gyara" +msgid "title.team-webhooks" +msgstr "gidan yanar gizo - %s - Mazubin biruka" -msgid "shortcuts.reset-zoom" -msgstr "zake zukowa" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library-updates" +msgstr "sabunta ma'adana" -msgid "shortcuts.search-placeholder" -msgstr "takaitaccen sako yanken" +#: src/app/main/ui/dashboard/team.cljs +#, markdown +msgid "labels.no-invitations-hint" +msgstr "danna **gayyato mutane** wurin da ake nemo mutane a wannan tawaga." -msgid "shortcuts.select-all" -msgstr "zabi duka" +msgid "inspect.tabs.code.selected.mask" +msgstr "marfi" -msgid "shortcuts.select-next" -msgstr "zabi wani shafi" +msgid "modals.edit-webhook.submit-label" +msgstr "gyara webhook" -msgid "shortcuts.select-parent-layer" -msgstr "zabi ainihin shafi" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.none" +msgstr "babu" -msgid "shortcuts.select-prev" -msgstr "zabi shafin da ya gabata" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-rules" +msgstr "boye ma'auni" -msgid "shortcuts.separate-nodes" -msgstr "raba kauri" +msgid "dashboard.webhooks.create.success" +msgstr "an gina Webhook." -msgid "shortcuts.show-pixel-grid" -msgstr "nuna / boye akwatin pixel" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.go-to-edit" +msgstr "tafi zuwa salon dakin karatu don a tace" -msgid "shortcuts.show-shortcuts" -msgstr "nuna / boye yanken" +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.confirm" +msgstr "haka, goge asusu" -msgid "shortcuts.snap-nodes" -msgstr "yanke kauri" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.no-matches-for" +msgstr "Babu daidaituwa da aka samu na “%s“" -msgid "shortcuts.snap-pixel-grid" -msgstr "yanke zuwa ga akwatin pixel" +msgid "shortcuts.move-unit-right" +msgstr "Matsa da sashin dama" -msgid "shortcuts.start-editing" -msgstr "fara gyarawa" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.projects" +msgstr "aiyuka" -msgid "shortcuts.start-measure" -msgstr "fara aunawa" +#: src/app/main/ui/auth/register.cljs +msgid "auth.verification-email-sent" +msgstr "mun aika maka da saqon tantancewa ta imel" -msgid "shortcuts.stop-measure" -msgstr "dena aunawa" +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-name" +msgstr "sunanka" -msgid "shortcuts.text-align-center" -msgstr "jera tsakiya" +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout" +msgstr "shiri" -msgid "shortcuts.text-align-justify" -msgstr "jera da inganci" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-none" +msgstr "(ba'a saita ba )" -msgid "shortcuts.text-align-left" -msgstr "jera hagu" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing" +msgstr "saukakawa" -msgid "shortcuts.text-align-right" -msgstr "jera dama" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Triangle" -msgid "shortcuts.thumbnail-set" -msgstr "saita babban yatsa" +msgid "workspace.path.actions.draw-nodes" +msgstr "zane da kauri (%s)" -#: src/app/main/ui/workspace/sidebar/shortcuts.cljs -msgid "shortcuts.title" -msgstr "allon harufa yanke" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-scale-text" +msgstr "bada damar sikelin rubutu" -msgid "shortcuts.toggle-alignment" -msgstr "Danna a jere" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row-reverse" +msgstr "jera sauyin fasali" -msgid "shortcuts.toggle-assets" -msgstr "Danna kadara" +msgid "errors.email-spam-or-permanent-bounces" +msgstr "saqonni marasa amfani na imel «%s»." -msgid "shortcuts.toggle-colorpalette" -msgstr "Danna launukan kala" +msgid "labels.add-custom-font" +msgstr "inganta font" -msgid "shortcuts.toggle-focus-mode" -msgstr "Danna yanayin maida hankali" +#: src/app/main/ui/dashboard/libraries.cljs +msgid "title.dashboard.shared-libraries" +msgstr "Rababban dakin karatu- %s - Mazubin biruka" -msgid "shortcuts.toggle-fullscreen" -msgstr "Danna fuskar ta cika duka" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export-object" +msgid_plural "workspace.options.export-object" +msgstr[0] "Fitarwa 1 Sashi" +msgstr[1] "Fitarwa %s sashi-sashi" -msgid "shortcuts.toggle-history" -msgstr "Danna tarihi" +msgid "errors.bad-font" +msgstr "ba za a iya xora fonts %s ba" -msgid "shortcuts.toggle-layers" -msgstr "Danna shimfida" +msgid "shortcuts.align-bottom" +msgstr "tsarin kasa" -msgid "shortcuts.toggle-layout-flex" -msgstr "Tara/fitar da lankwasashhiyar shimfida" +msgid "shortcuts.align-top" +msgstr "tsarin sama" -msgid "shortcuts.toggle-lock" -msgstr "Rufe/bude" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.message" +msgstr "sabunta sashe a babbar taska" -msgid "shortcuts.toggle-lock-size" -msgstr "Rufe rabo" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.profile-not-verified" +msgstr "ba a tantance bayananka ba,sai an tantance a ci gaba." -msgid "shortcuts.toggle-rules" -msgstr "Nuna / boye magwaji" +#: src/app/main/ui/inspect/attributes/layout.cljs, src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.radius" +msgstr "tsakiya" -msgid "shortcuts.toggle-textpalette" -msgstr "Juya zuwa launukan rubutu" +msgid "workspace.undo.entry.single.media" +msgstr "kadarar zanen hotuna" -msgid "shortcuts.toggle-visibility" -msgstr "Nuna/boye" +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-title" +msgstr "wurin karvar qorafin tiwita" -msgid "shortcuts.toggle-zoom-style" -msgstr "Danna salon zukowa" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.packed" +msgstr "cushe" -msgid "shortcuts.underline" -msgstr "Danna ta layi a kasa" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "suna" -msgid "shortcuts.undo" -msgstr "Cire" +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-style" +msgstr "tsarin salo" -msgid "shortcuts.ungroup" -msgstr "Fita daka rukuni" +msgid "dashboard.import.analyze-error" +msgstr "kash! mun gaza shigo da kundinka" -msgid "shortcuts.unmask" -msgstr "Cire takunkumi" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-subtitle" +msgstr "za mu aika maka da saqon qa'idoji ta imel" -msgid "shortcuts.v-distribute" -msgstr "Rarraba ta tsaye" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "ba zai yi aiki a kowane kundi ba." +msgstr[1] "ba za su yi aiki a kowane kundi ba." -msgid "shortcuts.zoom-lense-decrease" -msgstr "Zuko raguwar ido" +#: src/app/main/ui/settings/password.cljs +msgid "title.settings.password" +msgstr "Nambobin sirri - Mazubin biruka" -msgid "shortcuts.zoom-lense-increase" -msgstr "Zuko karuwar ido" +msgid "workspace.header.menu.enable-snap-pixel-grid" +msgstr "Bda damar tsinkewa zuwa akwatin pixel" -msgid "shortcuts.zoom-selected" -msgstr "Zuko wanda aka zaba" +msgid "shortcuts.add-comment" +msgstr "Bayyana Ra'ayi" -#: src/app/main/ui/dashboard/team.cljs -msgid "team.webhooks.max-length" -msgstr "Sunan shafin yanar gizon zai kunshi a mafi yawa haruffa 2048." +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-enter" +msgstr "linzamin kwamfuter ya shiga" -#: src/app/main/ui/dashboard/files.cljs -msgid "title.dashboard.files" -msgstr "%s - Tukunyar aje biro" +msgid "workspace.undo.entry.single.circle" +msgstr "da'ira" -#: src/app/main/ui/dashboard/fonts.cljs -msgid "title.dashboard.font-providers" -msgstr "samar da jerin harufa - %s - Mazubin biruka" +msgid "labels.back" +msgstr "baya" -#: src/app/main/ui/dashboard/fonts.cljs -msgid "title.dashboard.fonts" -msgstr "jerin harufa - %s - Mazubin biruka" +msgid "viewer.header.interactions-section" +msgstr "Hulda (%s)" -#: src/app/main/ui/dashboard/projects.cljs -msgid "title.dashboard.projects" -msgstr "tsare tsare - %s - Mazubin biruka" +#: src/app/main/ui/auth/login.cljs +msgid "auth.forgot-password" +msgstr "ka manta lambar tsaro?" -#: src/app/main/ui/dashboard/search.cljs -msgid "title.dashboard.search" -msgstr "nema - %s - Mazubin biruka" +msgid "shortcut-subsection.tools" +msgstr "Kayan aiki" -#: src/app/main/ui/dashboard/libraries.cljs -msgid "title.dashboard.shared-libraries" -msgstr "Rababban dakin karatu- %s - Mazubin biruka" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.recovery-token-sent" +msgstr "an aika maka da saqon matakan da za a bi domin dawo da lambar tsaronka." -#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/auth.cljs -msgid "title.default" -msgstr "Mazubin biruka - Tsara yanci ga tawaga" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title.group" +msgstr "rukunin inuwa" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "title.settings.access-tokens" -msgstr "karin bayani - Shiga alama" +msgid "modals.publish-empty-library.message" +msgstr "ba komai a taskarka. ka na son wallafa ta?" -#: src/app/main/ui/settings/feedback.cljs -msgid "title.settings.feedback" -msgstr "bada martani - Mazubin biruka" +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.only-yours" +msgstr "naka kawai" -#: src/app/main/ui/settings/options.cljs -msgid "title.settings.options" -msgstr "Saiti - Mazubin biruka" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title.group" +msgstr "rukunin shafi" -#: src/app/main/ui/settings/password.cljs -msgid "title.settings.password" -msgstr "Nambobin sirri - Mazubin biruka" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.reset-zoom" +msgstr "Kara saitawa" -#: src/app/main/ui/settings/profile.cljs -msgid "title.settings.profile" -msgstr "Karin bayani - Mazubin biruka" +msgid "shortcuts.opacity-7" +msgstr "Saita dishi dishi zuwa kashi 70" -#: src/app/main/ui/dashboard/team.cljs -msgid "title.team-invitations" -msgstr "Gayyata - %s - Mazubin biruka" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.assets" +msgstr "kadara" -#: src/app/main/ui/dashboard/team.cljs -msgid "title.team-members" -msgstr "Yan kungiya - %s - Mazubin biruka" +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.width" +msgstr "faxi" -#: src/app/main/ui/dashboard/team.cljs -msgid "title.team-settings" -msgstr "Saiti - %s - Mazubin biruka" +msgid "shortcuts.snap-pixel-grid" +msgstr "yanke zuwa ga akwatin pixel" -msgid "title.team-webhooks" -msgstr "gidan yanar gizo - %s - Mazubin biruka" +#: src/app/main/ui/auth/login.cljs +msgid "errors.ldap-disabled" +msgstr "LDAP ya gaza tantancewa." -#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs -msgid "title.viewer" -msgstr "%s - duba kumburi - Mazubin biruka" +msgid "workspace.assets.open-library" +msgstr "bude fiyal din dakin karatu" -#: src/app/main/ui/workspace.cljs -msgid "title.workspace" -msgstr "%s - Mazubin biruka" +#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs +msgid "workspace.gradients.linear" +msgstr "a layi mikakke" -msgid "viewer.breaking-change.description" -msgstr "" -"Wannan mahadar da aka raba yanxu batada ingaci. Ka/ki kirkiri wata ko ka/ki " -"tamayi maishi a baka/ki sabuwa." +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title-selection" +msgstr "zababbun rubutu" -msgid "viewer.breaking-change.message" -msgstr "Sannu!" +msgid "modals.delete-component-annotation.title" +msgstr "goge bayani" -#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs -msgid "viewer.empty-state" -msgstr "Babu allon da aka samu a wannan fejin." +msgid "shortcuts.select-parent-layer" +msgstr "zabi ainihin shafi" -#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs -msgid "viewer.frame-not-found" -msgstr "Ba'a sami allon ba." +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.promote-and-leave" +msgstr "inganta sannan ka bari" -msgid "viewer.header.comments-section" -msgstr "Bayyana ra'ayi(%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.libraries.text.multiple-typography" +msgstr "Rubutun rubutu dayawa" -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.dont-show-interactions" -msgstr "Karka/ki nuna hulda" +msgid "dashboard.import.progress.upload-media" +msgstr "xora kundaye: %s" -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.fullscreen" -msgstr "Cika fuskar" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.accept" +msgstr "goge kundaye" -msgid "viewer.header.inspect-section" -msgstr "Duba (%s)" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "rababben dakin karatu" -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.interactions" -msgstr "Hulda" +msgid "labels.share-prototype" +msgstr "tura manhajar rubutu" -msgid "viewer.header.interactions-section" -msgstr "Hulda (%s)" +msgid "shortcuts.export-shapes" +msgstr "samar da sabbabbin abubuwa" -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.share.copy-link" -msgstr "Kwafi mahada" +#: src/app/main/ui/dashboard/team.cljs +msgid "notifications.invitation-link-copied" +msgstr "kwafar hanyar gayya" -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.show-interactions" -msgstr "Nuna hulda" +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.notifications.password-saved" +msgstr "an tsare maka shaidar tsaro!" -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.show-interactions-on-click" -msgstr "Nuna hulda da an danna" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.group-name" +msgstr "sunan kungiya" -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.sitemap" -msgstr "taswirar wuri" +msgid "shortcuts.search-placeholder" +msgstr "takaitaccen sako yanken" -msgid "webhooks.last-delivery.success" -msgstr "Sakon karshe ya isa." +msgid "inspect.tabs.code.selected.svg-raw" +msgstr "SVG" -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.hcenter" -msgstr "Daidaita tsakiya a kwance (%s)" +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.size" +msgstr "girma" -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.hdistribute" -msgstr "rarraba filin kwance (%s)" +msgid "workspace.undo.entry.multiple.component" +msgstr "bangare" -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.hleft" -msgstr "Daidaita hagu (%s)" +msgid "workspace.focus.selection" +msgstr "zaba" -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.hright" -msgstr "Daidaita dama (%s)" +msgid "workspace.path.actions.merge-nodes" +msgstr "hade kauri (%s)" -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.vbottom" -msgstr "Daidaita kasa (%s)" +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.info" +msgstr "" +"za mu aika maka da imel ta wannan imel xin “%s” domin tantance shaidarka." -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.vcenter" -msgstr "Daidaita a kwance tsakiya (%s)" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.remove-member" +msgstr "cire mamba" -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.vdistribute" -msgstr "rarraba filin tsaye (%s)" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.create-component" +msgstr "kirkiri abubuwa" -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.vtop" -msgstr "Daidaita sama(%s)" +msgid "common.publish" +msgstr "wallafawa" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.assets" -msgstr "kadara" +msgid "shortcuts.select-next" +msgstr "zabi wani shafi" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.box-filter-all" -msgstr "duka kadara" +msgid "workspace.undo.entry.multiple.color" +msgstr "kadarar kala" -#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.colors" -msgstr "kala" +#: src/app/main/ui/settings/options.cljs +msgid "title.settings.options" +msgstr "Saiti - Mazubin biruka" -#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.components" -msgstr "Bangarori" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.no-invitations" +msgstr "ba saqon da ba a buxa ba." -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.create-group" -msgstr "kirkiri rukuni" +msgid "workspace.header.menu.enable-scale-content" +msgstr "bada damar sikelin rabo" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.create-group-hint" -msgstr "abubuwanka za a samu su suna nan take kamar \"sunan kungiya/ sunan abubuwan\"" +msgid "modals.delete-font-variant.message" +msgstr "" +"ka tabbata kana son goge wannan salon font din? ba zai xoru ba idan an yi " +"amfani da shi a kundi." -#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.delete" -msgstr "goge" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.group-stroke" +msgstr "Ja layi a rukuni" -#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.duplicate" -msgstr "maimaita" +msgid "workspace.shape.menu.union" +msgstr "hadakan" -msgid "workspace.assets.duplicate-main" -msgstr "maimaita ainihin" +msgid "workspace.shape.menu.thumbnail-set" +msgstr "kara kamar girman babban yatsa" -#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.edit" -msgstr "tace" +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.recovery-submit" +msgstr "canza lambar tsaro" -#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.graphics" -msgstr "zane zane" +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-cancel" +msgstr "goge" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.group" -msgstr "rukuni" +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.download" +msgstr "sauke hanyar hoto" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.group-name" -msgstr "sunan kungiya" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fill" +msgstr "cike - cika sikeli" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.libraries" -msgstr "dakunan karatu" +msgid "errors.bad-font-plural" +msgstr "ba za a iya xora fonts %s ba" -msgid "workspace.assets.local-library" -msgstr "dakin karatun gida" +msgid "inspect.empty.help" +msgstr "domin neman qarin bayani game da fenfot a tuntubi sashen agaji" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.not-found" -msgstr "ba'a samu kadara ba" +msgid "workspace.sidebar.layers.texts" +msgstr "rubutu" -msgid "workspace.assets.open-library" -msgstr "bude fiyal din dakin karatu" +#: src/app/main/ui/settings/profile.cljs +msgid "title.settings.profile" +msgstr "Karin bayani - Mazubin biruka" #: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.rename" -msgstr "sake suna" +msgid "workspace.assets.delete" +msgstr "goge" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.rename-group" -msgstr "sake sunan kungiyar" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-left" +msgstr "jera hagu (%s)" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.search" -msgstr "nemo kadarar" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.your-account" +msgstr "fagenka" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.selected-count" -msgid_plural "workspace.assets.selected-count" -msgstr[0] "%s" -msgstr[1] "%s zababbun abubuwan" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.dismiss" +msgstr "watsar" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "rababben dakin karatu" +#: src/app/main/ui/settings/feedback.cljs +msgid "title.settings.feedback" +msgstr "bada martani - Mazubin biruka" -#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.typography" -msgstr "rubutun rubutu" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.duplicate" +msgstr "maimaita" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.font-id" -msgstr "tsarin haruffa" +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.change-email" +msgstr "canza imel" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.font-size" -msgstr "girma" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.title" +msgstr "gogewar tawaga" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.font-variant-id" -msgstr "bambanci" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "bayanai masu yawa" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.go-to-edit" -msgstr "tafi zuwa salon dakin karatu don a tace" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.forward" +msgstr "kawo ta gaba" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.letter-spacing" -msgstr "fili a tsakanin haruffa" +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.title" +msgstr "imel" #: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.line-height" -msgstr "tsawon layi" +msgid "workspace.assets.typography.font-size" +msgstr "girma" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/inspect/attributes/text.cljs, src/app/main/ui/inspect/attributes/text.cljs -msgid "workspace.assets.typography.sample" -msgstr "Ag" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.message" +msgstr "" +"kai ke da wannan tawagar yanzu. ka tabbata kana son yin %s sabon mai tawaga?" -msgid "workspace.assets.typography.text-styles" -msgstr "salon rubutu" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-palette" +msgstr "farantin launuka" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.text-transform" -msgstr "canja rubutu" +msgid "shortcuts.group" +msgstr "rukuni" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.ungroup" -msgstr "kashe daga kungiya" +msgid "auth.privacy-policy" +msgstr "matakan kaxaita" -msgid "workspace.focus.focus-mode" -msgstr "tsarin maida hankali" +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.password-changed-successfully" +msgstr "ka canza lambar tsaro" -msgid "workspace.focus.focus-off" -msgstr "karka maida hankali" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-hovering" +msgstr "yayin shawagi" -msgid "workspace.focus.focus-on" -msgstr "maida hankali" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show" +msgstr "nuna" -msgid "workspace.focus.selection" -msgstr "zaba" +msgid "workspace.shape.menu.hide-ui" +msgstr "nuna / boye UI" -#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs -msgid "workspace.gradients.linear" -msgstr "a layi mikakke" +msgid "shortcuts.move-fast-up" +msgstr "Matsa sama da sauri" -#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs -msgid "workspace.gradients.radial" -msgstr "a da'ira" +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-project-prefix" +msgstr "sabon aiki" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-dynamic-alignment" -msgstr "kashe daidaitawa mai canjawa" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.center" +msgstr "tsakiya" -msgid "workspace.header.menu.disable-scale-content" -msgstr "kashe sikelin rabo" +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-settings" +msgstr "Saiti - %s - Mazubin biruka" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-scale-text" -msgstr "kashe sikelin rubutu" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-manual" +msgstr "Yi da kanka" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-guides" -msgstr "kashe tsinkewa zuwa mai jagora" +msgid "labels.save" +msgstr "ajiye" -msgid "workspace.header.menu.disable-snap-pixel-grid" -msgstr "kashe tsinkewa zuwa pixel" +msgid "dashboard.import.progress.process-media" +msgstr "kammala aiki" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-dynamic-alignment" -msgstr "bada damar daidaitawa mai canjawa" +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-ok" +msgstr "haka" -msgid "workspace.header.menu.enable-scale-content" -msgstr "bada damar sikelin rabo" +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "dole suna ya qumshi waxansu alamimon rubutu, sannan tazara." -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-scale-text" -msgstr "bada damar sikelin rubutu" +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.message" +msgstr "ka tabbata kana son goge wannan aikin?" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-guides" -msgstr "Tsinke zuwa mai jagora" +msgid "shortcuts.line-height-inc" +msgstr "kara tsawon layi" -msgid "workspace.header.menu.enable-snap-pixel-grid" -msgstr "Bda damar tsinkewa zuwa akwatin pixel" +msgid "onboarding-v2.before-start.desc2" +msgstr "" +"cikakken bayanin yadda za a yi amfani da fenfot. daga rubutu zuwa tsara ko " +"rarraba iri." -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-artboard-names" -msgstr "Boye allom suna" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.sidebar.layers" +msgstr "shafi" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-palette" -msgstr "farantin launuka" +msgid "shortcuts.select-all" +msgstr "zabi duka" -msgid "workspace.header.menu.hide-pixel-grid" -msgstr "boye pixel akwati" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.graphics" +msgstr "%s zane zane" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-rules" -msgstr "boye ma'auni" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-leave" +msgstr "linzamin kwamfutar ya fita" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-textpalette" -msgstr "boye launukan yanayin tsarin rubutu" +msgid "labels.log-or-sign" +msgstr "yi ko shiga" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.edit" -msgstr "Tace" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "idan akwai qari (bayyana)" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.file" -msgstr "fayil" +msgid "workspace.assets.typography.text-styles" +msgstr "salon rubutu" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.help-info" -msgstr "taimako & bayani" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker" +msgstr "da'irar kasuwa" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.preferences" -msgstr "fifiko" +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.searching-for" +msgstr "neman “%s“…" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.view" -msgstr "gani" +msgid "inspect.attributes.typography.text-decoration.none" +msgstr "babu" -msgid "workspace.header.menu.redo" -msgstr "sake" +msgid "labels.discard" +msgstr "vatar" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.select-all" -msgstr "zabi duka" +msgid "shortcuts.font-size-inc" +msgstr "kara gaban yanayi" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-artboard-names" -msgstr "Nuna sunayen allo" +msgid "common.share-link.permissions-pages" +msgstr "tura shafuka" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-palette" -msgstr "nuna launukan kala" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-min-w" +msgstr "fadi mafi kankanta" -msgid "workspace.header.menu.show-pixel-grid" -msgstr "Nuna akwatin pixel" +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hcenter" +msgstr "Daidaita tsakiya a kwance (%s)" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-rules" -msgstr "Nuna ma'auni" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.gap" +msgstr "Gibi" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-textpalette" -msgstr "Nuna launukan tsarin rubutu" +msgid "inspect.tabs.code.selected.group" +msgstr "qungiya" -msgid "workspace.header.menu.undo" -msgstr "Cire" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker" +msgstr "murabba'in kasuwa" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.reset-zoom" -msgstr "Kara saitawa" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column" +msgstr "shafi" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.save-error" -msgstr "an samu kuskure wajen adanawa" +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment-thread" +msgstr "goge rubutu" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.saved" -msgstr "An adana" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation" +msgstr "hotuna masu motsi" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.saving" -msgstr "Adanawa" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.drop-shadow" +msgstr "ajiye inuwa" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.unsaved" -msgstr "Canja canjan da ba'a adana ba" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "jaraba fenfot ka ga ko ta yi daidai da tawaga " -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.viewer" -msgstr "yanayin kallo (%s)" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "malami ko dalibi" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom" -msgstr "Zuko" +msgid "workspace.undo.entry.single.curve" +msgstr "lankwasa" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fill" -msgstr "cike - cika sikeli" +#: src/app/main/ui/static.cljs +msgid "labels.not-found.main-message" +msgstr "alama!" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fit" -msgstr "dace - ja sikeli ya dace da shi" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.overlay" +msgstr "mai rufi" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fit-all" -msgstr "zuko yayi daidai da ko'ina" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-full-screen" -msgstr "Cika allon" +msgid "onboarding.team-modal.create-team" +msgstr "yin tawaga" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-selected" -msgstr "zuko zababbe" +msgid "dashboard.import.progress.process-colors" +msgstr "aikin rini" -msgid "workspace.layout_grid.editor.title" -msgstr "tace akwati" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-account" +msgstr "qirqiri taskar gwaji" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.add" -msgstr "tarawa" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.title" +msgstr "ma'aunin karvuwar aiki" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.colors" -msgstr "%s kala" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.margin" +msgstr "gefe" -#: src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.empty-palette" -msgstr "Babu salon kaloli a ma'ajiya yanzu" +msgid "onboarding-v2.welcome.title" +msgstr "barka da zuwa fenfot!" -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "Babu rubutun rubutu a ma'ajiya yanzu" +#, permanent +msgid "inspect.attributes.stroke.alignment.center" +msgstr "tsakiya" -#: src/app/main/ui/workspace/colorpicker/libraries.cljs, src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.file-library" -msgstr "F" +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-changed-successfully" +msgstr "ka zamanantar da adireshinka na imel" -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.hsv" -msgstr "HSV" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "barin aikin tawaga" -#: src/app/main/ui/workspace/colorpicker/libraries.cljs, src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.recent-colors" -msgstr "kalar yanzu" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.accept" +msgstr "qara yin wurin ajiyar tawaga" -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgb-complementary" -msgstr "Jituwar RGB" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in-out" +msgstr "sauki ciki waje" -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgba" -msgstr "RGBA" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-guides" +msgstr "Tsinke zuwa mai jagora" -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.save-color" -msgstr "Adana salon kala" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-linear" +msgstr "mikakke" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.components" -msgstr "%s bangarori" +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur.value" +msgstr "muhimmanci" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.file-library" -msgstr "Ma'adanar fiyal" +msgid "common.share-link.manage-ops" +msgstr "amincewar shugaba" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.graphics" -msgstr "%s zane zane" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.start" +msgstr "fara jagoranci" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.in-this-file" -msgstr "Ma'adana a wanna fiyal" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-on-click" +msgstr "da an danna" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.libraries" -msgstr "ma'adanai" +msgid "onboarding.choice.team-up.invite-members" +msgstr "gayyato mambobi" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library" -msgstr "ma'adana" +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hdistribute" +msgstr "rarraba filin kwance (%s)" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library-updates" -msgstr "sabunta ma'adana" +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-length-hint" +msgstr "aqalla a sami alamoni 8" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.no-libraries-need-sync" -msgstr "Babu rabben ma'adanai da suke bukatar sabuntawa" +msgid "modals.delete-webhook.message" +msgstr "ka tabbata ka na son goge webhook?" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.no-matches-for" -msgstr "Babu daidaituwa da aka samu na “%s“" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.title" +msgstr "goge kundi" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.no-shared-libraries-available" -msgstr "Babu rababbun ma'adanai wanda aka samu" +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.title" +msgstr "goge aikin" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.search-shared-libraries" -msgstr "Duba rabbaun ma'adanai" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to-dest" +msgstr "kewayawa zywa: %s" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.shared-libraries" -msgstr "Rabban ma'adanai" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.selected-count" +msgid_plural "workspace.assets.selected-count" +msgstr[0] "%s" +msgstr[1] "%s zababbun abubuwan" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.libraries.text.multiple-typography" -msgstr "Rubutun rubutu dayawa" +msgid "dashboard.libraries-and-templates.import-error" +msgstr "akwai matsala wurin shigo da fejin talla. fejin tallar ba ya xauko." -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.libraries.text.multiple-typography-tooltip" -msgstr "Cire mahadar duka rabutun rubutu" +# SECTIONS +msgid "shortcut-section.basics" +msgstr "shikashikai" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.typography" -msgstr "%s Rubutun rubutu" +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-go-to" +msgstr "je ka taskar fenfot" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.update" -msgstr "Sabuntawa" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.libraries-and-templates" +msgstr "taskoki & allunan talla" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "Aga duka canjin" +#: src/app/main/ui/auth/login.cljs +msgid "errors.wrong-credentials" +msgstr "kuskuren imel ko lambar tsaro." -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.updates" -msgstr "sabuntawa" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.spread" +msgstr "bazu" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.add-interaction" -msgstr "Danna wannan madannin + domin saka hulda." +msgid "shortcuts.open-inspect" +msgstr "tafi sashin da 'yan kallo za su duba" -#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "workspace.options.blur-options.title" -msgstr "Dishi dishi" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.info" +msgstr "ka san dokokin fenfot lokacin da ka ke tare da masoya koyarwa." -#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "workspace.options.blur-options.title.group" -msgstr "rukuni" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" -#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "workspace.options.blur-options.title.multiple" -msgstr "zabin dishi dishi" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.bottom" +msgstr "kasa" -#: src/app/main/ui/workspace/sidebar/options/page.cljs -msgid "workspace.options.canvas-background" -msgstr "bayan zane" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-duration" +msgstr "tsahon lokaci" -msgid "workspace.options.clip-content" -msgstr "Matse abun ciki" +msgid "shortcuts.go-to-libs" +msgstr "ta fi zuwa rabbabben ma'ajiya" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs -msgid "workspace.options.component" -msgstr "Bangarori" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.advanced-ops" +msgstr "zabi na ci gaba" -msgid "workspace.options.component.annotation" -msgstr "Yin sharhin rubutu" +#: src/app/main/ui/settings/change_email.cljs +msgid "notifications.validation-email-sent" +msgstr "an aika da imel din tantancewa %s. bincika imel xinka!" -msgid "workspace.options.component.copy" -msgstr "Kwafa" +msgid "shortcuts.toggle-zoom-style" +msgstr "Danna salon zukowa" -msgid "workspace.options.component.create-annotation" -msgstr "Kirkiri sharhin rubuta" +msgid "shortcut-subsection.zoom-workspace" +msgstr "Zukowa" -msgid "workspace.options.component.edit-annotation" -msgstr "Tace sharhin rubutu" +msgid "shortcuts.increase-zoom" +msgstr "zuko ciki" -msgid "workspace.options.component.main" -msgstr "Ainahin" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-outside" +msgstr "rufe yayin matsewa ta waje" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints" -msgstr "Takura" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.blur" +msgstr "dishi dishi" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.bottom" -msgstr "Kasa" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "ba ka da wasu lambobin tsaro yanzu." -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.center" -msgstr "Tsakiya" +msgid "workspace.path.actions.separate-nodes" +msgstr "raba kauri (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.fix-when-scrolling" -msgstr "gyara nemowa" +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.title-search" +msgstr "neman sakamako" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.left" -msgstr "Hagu" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "teburin aiki" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.leftright" -msgstr "hagu & dama" +#: src/app/main/ui/workspace.cljs +msgid "labels.reload-file" +msgstr "qara dora kundi" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.right" -msgstr "dama" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.font-id" +msgstr "tsarin haruffa" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.scale" -msgstr "maauni" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.selection-stroke" +msgstr "gigciye zabi" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.top" -msgstr "sama" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"lambarka ta shiga na a matsayin zabin hanyar shiga/lambar tsaronmuza a iya " +"amfani tsarin tantancewa,domin shiga manhajar cikin fenfot API" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.topbottom" -msgstr "sama & kasa" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.title" +msgstr "mallakar tawaga" -#: src/app/main/ui/workspace/sidebar/options.cljs -msgid "workspace.options.design" -msgstr "zane" +msgid "dashboard.import" +msgstr "shigo da kundin fenfot" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "workspace.options.export" -msgstr "fitarwa" +#: src/app/main/ui/workspace/sidebar/options.cljs +msgid "workspace.options.prototype" +msgstr "samfur" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "workspace.options.export-multiple" -msgstr "Fitar da zababbun" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.right" +msgstr "dama" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "workspace.options.export-object" -msgid_plural "workspace.options.export-object" -msgstr[0] "Fitarwa 1 Sashi" -msgstr[1] "Fitarwa %s sashi-sashi" +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-delete-project" +msgstr "ka goge aikinka" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs -msgid "workspace.options.export.suffix" -msgstr "Kari na bayan baki" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.text" +msgstr "fenfot ta menbobin tawaga ce. kirawo kowa domin yin aiki tarekundaye" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-complete" -msgstr "An gama fitarwa" +#: src/app/main/ui/auth/recovery.cljs +msgid "profile.recovery.go-to-login" +msgstr "je ka hanyar shiga" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-object" -msgstr "Ana fitarwa" +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.theme-change" +msgstr "batun UI" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-object-error" -msgstr "An gaza fitarwa" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.use-play-button" +msgstr "yi amfani da madanneta ta sama ki tafi da samfuri." -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-object-slow" -msgstr "Fitarwa ba tsammani ta sami tsaiko" +msgid "modals.delete-font.message" +msgstr "" +"ka tabbata kana son goge wannan font xin ? ba zai yi aiki ba idan an yi " +"amfani da shi a kundi." -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.fill" -msgstr "Cikawa" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.hue" +msgstr "Haske haske" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.add-flow-start" -msgstr "Kara gudun farko" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-artboard-names" +msgstr "Nuna sunayen allo" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow-start" -msgstr "Gudun farko" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.save-error" +msgstr "an samu kuskure wajen adanawa" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow-starts" -msgstr "gudun farko" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.dashed" +msgstr "layin raba abu" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.auto" -msgstr "da kanshi" +msgid "common.share-link.all-users" +msgstr "duk fenfot" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.column" -msgstr "shafi" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "mallakar lambobin shiga na sirri" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.grid-title" -msgstr "Akwati" +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.password-change" +msgstr "sauya lambar tsaro" -msgid "workspace.options.grid.params.color" -msgstr "Kala" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canva" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.columns" -msgstr "shafi" +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.fill" +msgstr "Cikawa" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.gutter" -msgstr "mahada" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.left" +msgstr "hagu" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.height" -msgstr "tsawo" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "qara samun bayanin fenfot" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.margin" -msgstr "gefe" +msgid "workspace.shape.menu.thumbnail-remove" +msgstr "cire girman babban danyatsa" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.rows" -msgstr "jere" +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.width" +msgstr "fadi" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.set-default" -msgstr "saita a tsoho" +msgid "inspect.empty.select" +msgstr "zabar zubi, hukumar masu sa ido akan bangarorinsu da lambobinsu" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.size" -msgstr "girma" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "gama aiki kan %s" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type" -msgstr "Nau'i" +msgid "shortcuts.toggle-layout-flex" +msgstr "Tara/fitar da lankwasashhiyar shimfida" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.bottom" -msgstr "Kasa" +msgid "labels.or" +msgstr "ko" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.center" -msgstr "Tsakiya" +msgid "onboarding.choice.team-up.roles" +msgstr "gayyata tare da bayar da matsayi:" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.left" -msgstr "Hagu" +msgid "labels.font-providers" +msgstr "ma su fenfot" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.right" -msgstr "Dama" +msgid "shortcuts.italic" +msgstr "juya zuwa kwantaccen rubuyu" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.stretch" -msgstr "mikewa" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-around" +msgstr "kewayayyen sarrari" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.top" -msgstr "sama" +msgid "errors.webhooks.timeout" +msgstr "dakatarwa" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.use-default" -msgstr "yi amfani da tsoho" +msgid "errors.profile-blocked" +msgstr "bayanan a rufe suke" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.width" +msgid "workspace.options.width" msgstr "fadi" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.row" -msgstr "layuka" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.square" -msgstr "murabba'i" +msgid "shortcuts.letter-spacing-dec" +msgstr "rage filin harafin" -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.group-fill" -msgstr "Cika rukuni" +msgid "errors.webhooks.last-delivery" +msgstr "saqon qarshe bai je ba." -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.group-stroke" -msgstr "Ja layi a rukuni" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-files" +msgstr "an tura kundayenka" -msgid "workspace.options.height" -msgstr "Tsawo" +msgid "shortcut-subsection.general-dashboard" +msgstr "gamayya" -msgid "workspace.options.inspect" -msgstr "Duba" +#: src/app/main/ui/settings/password.cljs +msgid "errors.password-too-short" +msgstr "lambar tsaro dole ta kai yawan alamu 8" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-action" -msgstr "aiki" +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.title" +msgstr "ka tabbata ka na son goge asusunka?" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-after-delay" -msgstr "Bayan jinkiri" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.title" +msgstr "jagoranci" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation" -msgstr "hotuna masu motsi" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.rect" +msgstr "Rectangle (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-dissolve" -msgstr "narkewa" +msgid "labels.continue-with" +msgstr "ci gaba da" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-none" -msgstr "Babu" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-push" -msgstr "Tura" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-slide" -msgstr "Ja" - -msgid "workspace.options.interaction-auto" -msgstr "da kanshi" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-background" -msgstr "kara mai rufin bayan" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-outside" -msgstr "rufe yayin matsewa ta waje" +msgid "inspect.attributes.typography.text-transform.lowercase" +msgstr "qananan baqaqe" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay" -msgstr "kulle mai rufi" +msgid "workspace.undo.entry.single.group" +msgstr "rukuni" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay-dest" -msgstr "kulle mai rufi %s" +msgid "inspect.attributes.stroke.style.dotted" +msgstr "xige-xige" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-delay" -msgstr "jinkiri" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-max-w" +msgstr "fadi mafi yawa" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-destination" -msgstr "makoma" +msgid "shortcuts.align-right" +msgstr "tsarin dama" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-duration" -msgstr "tsahon lokaci" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "can baya" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing" -msgstr "saukakawa" +msgid "modals.invite-member.emails" +msgstr "imel, rabawar waqafi" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease" -msgstr "sauki" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.sitemap" +msgstr "taswirar wuri" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in" -msgstr "sauki ciki" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-dynamic-alignment" +msgstr "kashe daidaitawa mai canjawa" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in-out" -msgstr "sauki ciki waje" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-bottom-left" +msgstr "kasan hagu" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-out" -msgstr "sauki waje" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.right" +msgstr "Dama" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-linear" -msgstr "mikakke" +msgid "workspace.options.interaction-close-overlay" +msgstr "kulle mai rufi" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-in" -msgstr "ciki" +msgid "errors.invite-invalid.info" +msgstr "za a iya soke gayyata ko ta ki aiki." -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-enter" -msgstr "linzamin kwamfuter ya shiga" +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.fonts-added" +msgid_plural "dashboard.fonts.fonts-added" +msgstr[0] "an qara font 1" +msgstr[1] "%s an qara fonts da yawa" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-leave" -msgstr "linzamin kwamfutar ya fita" +msgid "modals.create-webhook.submit-label" +msgstr "qirqirar webhook" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-ms" -msgstr "ms" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "" +"danna maddanin qasa\"danna qasa\n" +"emo sabuwar lambar tsaro\" samar da wani." -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to" -msgstr "kewayawa zuwa" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "goge alama" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to-dest" -msgstr "kewayawa zywa: %s" +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vtop" +msgstr "Daidaita sama(%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-none" -msgstr "(ba'a saita ba )" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.viewer" +msgstr "ma su kallo" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-offset-effect" -msgstr "cire tasiri" +msgid "shortcuts.toggle-alignment" +msgstr "Danna a jere" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-on-click" -msgstr "da an danna" +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.invite-profile" +msgstr "neman mutane" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay" -msgstr "bude mai rufi" +#: src/app/main/ui/dashboard/grid.cljs +#, markdown +msgid "dashboard.empty-placeholder-drafts" +msgstr "" +"nan za a sami kundayen da aka sanya a taska. gwada sanya na ka kundin \"a " +"taskirarmumaginar kundi](https://manhajar fenfot/taskokin maginar kundaye." +"html)." -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay-dest" -msgstr "bude mai rufi: %s" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker" +msgstr "darajar kasuwa" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-url" -msgstr "bude URL" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.soft-light" +msgstr "haske mai sauki" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-out" -msgstr "fita" +msgid "shortcuts.decrease-zoom" +msgstr "fito da shi waje" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-center" -msgstr "kasa tsakiya" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-simple" +msgstr "sassaukan ciko" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-left" -msgstr "kasa hagu" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.gutter" +msgstr "mahada" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-right" -msgstr "kasa dama" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.group" +msgstr "rukuni" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-center" -msgstr "tsakiya" +msgid "dashboard.webhooks.update.success" +msgstr "sabunta Webhook." -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-manual" -msgstr "Yi da kanka" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-github-submit" +msgstr "matattarar manazarta" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-center" -msgstr "sama tsakiya" +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.letter-spacing" +msgstr "tazarar harafi" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-left" -msgstr "sama hagu" +msgid "inspect.tabs.code.selected.text" +msgstr "rubutu" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-right" -msgstr "sama dama" +msgid "shortcuts.opacity-4" +msgstr "Saita dishi dishi zuwa kashi 40" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-position" -msgstr "Mataki" +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "workspace.options.blur-options.title.multiple" +msgstr "zabin dishi dishi" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-preserve-scroll" -msgstr "adana komawa sama da kasa" +msgid "shortcuts.align-vcenter" +msgstr "tsarin tsakiya a tsaye" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-prev-screen" -msgstr "allon daya gabata" +msgid "workspace.shape.menu.create-annotation" +msgstr "kirkiri hoto mai motsi" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-relative-to" -msgstr "alaka zuwa" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-selected" +msgstr "zuko zababbe" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-self" -msgstr "kai/ni" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.message" +msgstr "" +"ka tabbata kana son goge wannan tawagar? Duk aiyukanka na kundayen da suka " +"danganci tawagar za su yi gogewar dindindin." #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay" -msgstr "Juya mai murfi" +msgid "workspace.options.interaction-open-overlay-dest" +msgstr "bude mai rufi: %s" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay-dest" -msgstr "Juya mai murfi: %s" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type" +msgstr "Nau'i" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-trigger" -msgstr "Jawo" +msgid "workspace.options.interaction-open-url" +msgstr "bude URL" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-url" -msgstr "URL" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.delete-invitation" +msgstr "goge gayyata" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-hovering" -msgstr "yayin shawagi" +msgid "workspace.path.actions.delete-node" +msgstr "goge kauri (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-pressing" -msgstr "yayin dannawa" +msgid "shortcuts.letter-spacing-inc" +msgstr "kara filin harafin" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interactions" -msgstr "yayin hulda" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.color" -msgstr "kala" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.color-burn" -msgstr "kala konanniya" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.color-dodge" -msgstr "kala gudajjiya" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.darken" -msgstr "kara masa duhu" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.difference" -msgstr "banbanci" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.exclusion" -msgstr "warewa" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.hard-light" -msgstr "Haske mai muya" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.hue" -msgstr "Haske haske" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.lighten" -msgstr "kara masa haske" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.luminosity" -msgstr "warewa" +msgid "workspace.options.interaction-destination" +msgstr "makoma" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.multiply" -msgstr "sau" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-google-submit" +msgstr "Gugul" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.normal" -msgstr "na kullum" +msgid "onboarding.newsletter.acceptance-message" +msgstr "" +"an aika maka da saqon buqatar biya, za mu aika maka da saqon imel tabbatar " +"da shi." -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.overlay" -msgstr "mai rufi" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.go-main" +msgstr "tafi ainihin wurin fal" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.saturation" -msgstr "jikewa" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "fara aiki na" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.screen" -msgstr "allo" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.delete-team" +msgstr "goge tawaga" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.soft-light" -msgstr "haske mai sauki" +msgid "shortcuts.draw-frame" +msgstr "Allo" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title" -msgstr "shafi" +msgid "shortcuts.text-align-center" +msgstr "jera tsakiya" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title.group" -msgstr "rukunin shafi" +msgid "shortcuts.undo" +msgstr "Cire" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title.multiple" -msgstr "dayawa" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "mashi" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.advanced-ops" -msgstr "zabi na ci gaba" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.accept" +msgstr "sabunta" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-max-h" -msgstr "tsawo mafi yawa" +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vcenter" +msgstr "Daidaita a kwance tsakiya (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-max-w" -msgstr "fadi mafi yawa" +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-subtitle1" +msgstr "tambayoyin da ke buqatar amsa." -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-min-h" -msgstr "tsawo mafi kankanta" +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.remove-account" +msgstr "ka na son cire taskarka?" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-min-w" -msgstr "fadi mafi kankanta" +msgid "labels.font-family" +msgstr "ire-iren font" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-max-h" -msgstr "tsawo mafi yawa" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.viewer" +msgstr "yanayin kallo (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-max-w" -msgstr "fadi mafi yawa" +msgid "workspace.path.actions.make-curve" +msgstr "Ta lankwasa (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-min-h" -msgstr "tsaho mafi kankanta" +msgid "workspace.options.search-font" +msgstr "nemo jerin harufa" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-min-w" -msgstr "fadi mafi kankanta" +msgid "onboarding.team-modal.create-team-feature-3" +msgstr "aiyukan shugaba" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.bottom" -msgstr "kasa" +msgid "workspace.path.actions.move-nodes" +msgstr "tafi da kauri (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column" -msgstr "shafi" +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-title" +msgstr "dangin fenfot" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column-reverse" -msgstr "sake shafi" +msgid "workspace.path.actions.join-nodes" +msgstr "hada kauri (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row" -msgstr "jerawa" +msgid "shortcuts.merge-nodes" +msgstr "hada da kauri" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row-reverse" -msgstr "jera sauyin fasali" +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "wane kayan zane ka fi iya aiki da shi?" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.gap" -msgstr "Gibi" +msgid "shortcuts.bool-difference" +msgstr "ma'auni mabanbanci" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.left" -msgstr "hagu" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-url" +msgstr "URL" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin" -msgstr "gefe" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "ka sami lambar tsaron da aka yi." -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin-all" -msgstr "gefen duka" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.community" +msgstr "matattara" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin-simple" -msgstr "Samfarin gefe" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.move" +msgstr "motsa abun" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.packed" -msgstr "cushe" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title.multiple" +msgstr "dayawa" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding" -msgstr "filla filla" +msgid "shortcuts.make-corner" +msgstr "kirkiri kwana" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding-all" -msgstr "duka gefan" +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-your-comments" +msgstr "bayyana na ka ra’ayin" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding-simple" -msgstr "sassaukan ciko" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "mi ne ne matsayinka?" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.right" -msgstr "dama" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.letter-spacing" +msgstr "fili a tsakanin haruffa" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.space-around" -msgstr "kewayayyen sarrari" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.direction-ltr" +msgstr "LTR" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.space-between" -msgstr "sarari tsakani" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.shared-libraries" +msgstr "taskoki" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.top" -msgstr "sama" +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-invitations" +msgstr "Gayyata - %s - Mazubin biruka" -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.more-colors" -msgstr "kaloli masu yawa" +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.pin-unpin" +msgstr "rufewa/buxewa" -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.more-lib-colors" -msgstr "Ma'ajiyar kaloli masu yawa" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.num-of-files" +msgid_plural "labels.num-of-files" +msgstr[0] "kundi 1" +msgstr[1] "kundaye %s" -msgid "workspace.options.opacity" -msgstr "dishi dishi" +msgid "labels.custom-fonts" +msgstr "kwalliya da fenfot" -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.position" -msgstr "matsayi" +#: src/app/main/ui/dashboard/comments.cljs +msgid "labels.comments" +msgstr "yabo" -#: src/app/main/ui/workspace/sidebar/options.cljs -msgid "workspace.options.prototype" -msgstr "samfur" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.height" +msgstr "tsawo" -msgid "workspace.options.radius" -msgstr "digon tsakiyar da'ira" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete" +msgstr "goge" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-bottom-left" -msgstr "kasan hagu" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-in-assets" +msgstr "nuna ta kusuwar kadara" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-bottom-right" -msgstr "kasan dama" +msgid "workspace.undo.entry.multiple.shape" +msgstr "siffa" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-top-left" -msgstr "saman hagu" +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.info" +msgstr "bayani" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-top-right" -msgstr "saman dama" +msgid "workspace.options.interaction-auto" +msgstr "da kanshi" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius.all-corners" -msgstr "duka kwanar" +msgid "onboarding.team-modal.create-team-feature-2" +msgstr "ma su yin shiri dayawa lokaci xaya" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius.single-corners" -msgstr "kwanar da take cin gashin kanta" +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"xakin ba komai. wurin ajiyar tawaga, turken da ka yi za ya yi aiki a sauran " +"kundaye. ka tabbata kai ne ka ke son wallafa shi?" -msgid "workspace.options.recent-fonts" -msgstr "da dimi dimi" +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.dashboard" +msgstr "dashbod" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.retry" -msgstr "sake" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title.multiple" +msgstr "inuwar zabi" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.rotation" -msgstr "juyawa" +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.save-settings" +msgstr "wurin ajiyar saiti" -msgid "workspace.options.search-font" -msgstr "nemo jerin harufa" +#: src/app/main/errors.cljs +msgid "errors.max-quote-reached" +msgstr "kammala adadin '%s' madogara. gyara." #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.select-a-shape" -msgstr "zabi surar allo, ko rukuni ta hadu da daya allon." +msgid "workspace.options.interaction-prev-screen" +msgstr "allon daya gabata" -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.selection-color" -msgstr "zababbabbin kaloli" +msgid "labels.active" +msgstr "mai amfani" -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.selection-fill" -msgstr "cika zabi" +msgid "shortcuts.text-align-right" +msgstr "jera dama" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.selection-stroke" -msgstr "gigciye zabi" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.add" +msgstr "tarawa" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.blur" -msgstr "dishi dishi" +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-decoration" +msgstr "kwalliyar rubutu" -msgid "workspace.options.shadow-options.color" -msgstr "inuwar kala" +msgid "dashboard.import.import-warning" +msgstr "wasu kundayen na dauke da abubuwan da ba su da amfani." -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.drop-shadow" -msgstr "ajiye inuwa" +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "errors.media-type-mismatch" +msgstr "hoton da aka sanya bai yi daidai da kundin da ake son faxaxawa ba." -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.inner-shadow" -msgstr "Inuwar ciki" +msgid "shortcuts.opacity-0" +msgstr "Saita dishi dishi zuwa kashi 100" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.offsetx" -msgstr "X" +msgid "shortcuts.clear-undo" +msgstr "goge sake" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.offsety" -msgstr "Y" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text" +msgstr "rubutu (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.spread" -msgstr "bazu" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.update" +msgstr "sabintawas" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title" -msgstr "inuwa" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.copy" +msgstr "kwafi" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title.group" -msgstr "rukunin inuwa" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.curve" +msgstr "kwana(%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title.multiple" -msgstr "inuwar zabi" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-all" +msgstr "duka gefan" -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.show-fill-on-export" -msgstr "fito da shi a ga" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title" +msgstr "rubutu" -msgid "workspace.options.show-in-viewer" -msgstr "fito da kaurin sosai" +#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs +msgid "viewer.empty-state" +msgstr "Babu allon da aka samu a wannan fejin." -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.size" -msgstr "girma" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.file-library" +msgstr "Ma'adanar fiyal" -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs -msgid "workspace.options.size-presets" -msgstr "yanayin girman yanayin" +msgid "inspect.tabs.code.selected.path" +msgstr "hanya" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke" -msgstr "gigciye" +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.left" +msgstr "hagu" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker" -msgstr "da'irar kasuwa" +msgid "shortcut-subsection.navigation-workspace" +msgstr "shawagi" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "da'ira" +msgid "shortcuts.bool-union" +msgstr "ma'auni hadaka" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker" -msgstr "darajar kasuwa" +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.submit" +msgstr "sake imel" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "mai daraja" +#: src/app/main/errors.cljs +msgid "errors.feature-not-supported" +msgstr "sassa '%s' ba za su yi aiki ba." -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow" -msgstr "layin mashiw" +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.rename-team" +msgstr "sake suna tawaga" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "mashi" +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "workspace.options.blur-options.title.group" +msgstr "rukuni" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.none" -msgstr "ba komai" +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-projects" +msgstr "aiyukan tawaga" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.round" -msgstr "da'ira" +msgid "shortcuts.underline" +msgstr "Danna ta layi a kasa" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square" -msgstr "murabba'i" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "bai yiwuwa" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker" -msgstr "murabba'in kasuwa" +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgb-complementary" +msgstr "Jituwar RGB" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Rectangle" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.edit" +msgstr "Tace" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow" -msgstr "Triangle mashi" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.message" +msgstr "ka tabbata kana son cire wannan memban a wannan tawaar?" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Triangle" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.hint" +msgstr "" +"ka kusa sabunta sashe a babbar taska. wannan za ya iya aiki a sauran " +"kundayen da ke amfani da ita." -msgid "workspace.options.stroke-color" -msgstr "gigciye kalar" +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.main-message" +msgstr "kuskuren ciki" -msgid "workspace.options.stroke-width" -msgstr "gigciye fadin" +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.title" +msgstr "sake imel xinka" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.center" -msgstr "tsakiya" +msgid "shortcut-subsection.modify-layers" +msgstr "gyara shimfida" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.dashed" -msgstr "layin raba abu" +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.release-notes" +msgstr "bayar da bayani" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.dotted" -msgstr "digo digo" +msgid "shortcuts.unmask" +msgstr "Cire takunkumi" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.inner" -msgstr "ciki" +msgid "workspace.options.y" +msgstr "Y layi" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.mixed" -msgstr "gauraya" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.message" +msgstr "cire “%s” a taskar shirye-shirye" #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.outer" -msgstr "waje" +msgid "workspace.options.stroke-cap.round" +msgstr "da'ira" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.solid" -msgstr "mai tauri" +msgid "shortcuts.toggle-lock" +msgstr "Rufe/bude" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-bottom" -msgstr "jerin kasa" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.password" +msgstr "lambar tsaro" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-middle" -msgstr "jerin tsakiya" +msgid "viewer.breaking-change.message" +msgstr "Sannu!" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-top" -msgstr "jerin sama" +msgid "shortcut-subsection.panels" +msgstr "allon sarrarfav naura" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.direction-ltr" -msgstr "LTR" +msgid "inspect.tabs.code.selected.circle" +msgstr "da'ira" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.direction-rtl" -msgstr "RTL" +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.info" +msgstr "idan ka cire asusunka za ka iya rasa aikin da ka kammala." -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-auto-height" -msgstr "sarrafaffan tsaho" +msgid "dashboard.loading-fonts" +msgstr "xora abin adonka …" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-auto-width" -msgstr "sarrafaffen fadi" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.hint1" +msgstr "" +"kai ne mai wannan tawagar. zabi wani memba da za ya iya inganta wa mai shi " +"kafin ka fita." -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-fixed" -msgstr "dasa" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-multi" +msgstr "tura %s kundaye a" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.letter-spacing" -msgstr "tazarar harafi" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.topbottom" +msgstr "sama & kasa" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.line-height" -msgstr "tsahon layi" +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vdistribute" +msgstr "rarraba filin tsaye (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.lowercase" -msgstr "yanayin kasa" +msgid "shortcuts.separate-nodes" +msgstr "raba kauri" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.none" -msgstr "babu" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.message" +msgstr "ka tabbata ka na son fita daga %s tawaga?" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.strikethrough" -msgstr "gigciye ta cikinsa (%s)" +msgid "shortcut-subsection.path-editor" +msgstr "Hanya" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-center" -msgstr "jerin tsakiya (%s)" +msgid "common.share-link.link-copied-success" +msgstr "an samo kwafi" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-justify" -msgstr "tabbatarwa (%s)" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "mawallafi/VP" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-left" -msgstr "jera hagu (%s)" +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke.width" +msgstr "fadi" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-right" -msgstr "jera dama (%s)" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.message" +msgid_plural "modals.delete-shared-confirm.message" +msgstr[0] "ka tabbata kana son goge wannan kundin?" +msgstr[1] "ka tabbata kana son goge waxannan kundayen?" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title" -msgstr "rubutu" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title" +msgstr "shafi" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title-group" -msgstr "rukunin rubutu" +#: src/app/main/ui/dashboard/fonts.cljs +msgid "title.dashboard.fonts" +msgstr "jerin harufa - %s - Mazubin biruka" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title-selection" -msgstr "zababbun rubutu" +msgid "workspace.undo.entry.multiple.text" +msgstr "rubutu" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.titlecase" -msgstr "yanayin lakani" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.email" +msgstr "imel" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.underline" -msgstr "ja layi (%s)" +msgid "workspace.sidebar.layers.shapes" +msgstr "Siffa" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.uppercase" -msgstr "yanayin sama" +#: src/app/main/ui/workspace/colorpicker/libraries.cljs, src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.recent-colors" +msgstr "kalar yanzu" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.use-play-button" -msgstr "yi amfani da madanneta ta sama ki tafi da samfuri." +msgid "workspace.options.flows.add-flow-start" +msgstr "Kara gudun farko" -msgid "workspace.options.width" -msgstr "fadi" +msgid "inspect.attributes.typography.text-transform.uppercase" +msgstr "manyan baqaqe" -msgid "workspace.options.x" -msgstr "X layi" +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.show-fill-on-export" +msgstr "fito da shi a ga" -msgid "workspace.options.y" -msgstr "Y layi" +msgid "labels.inactive" +msgstr "maras amfani" -msgid "workspace.path.actions.add-node" -msgstr "kara kauri (%s)" +msgid "dashboard.export.title" +msgstr "fitar da kundayr" -msgid "workspace.path.actions.delete-node" -msgstr "goge kauri (%s)" +msgid "modals.publish-empty-library.accept" +msgstr "wallafa" -msgid "workspace.path.actions.draw-nodes" -msgstr "zane da kauri (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.center" +msgstr "Tsakiya" -msgid "workspace.path.actions.join-nodes" -msgstr "hada kauri (%s)" +msgid "shortcuts.toggle-lock-size" +msgstr "Rufe rabo" -msgid "workspace.path.actions.make-corner" -msgstr "ta kwana (%s)" +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment" +msgstr "goge yabo" -msgid "workspace.path.actions.make-curve" -msgstr "Ta lankwasa (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-max-h" +msgstr "tsawo mafi yawa" -msgid "workspace.path.actions.merge-nodes" -msgstr "hade kauri (%s)" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.register-submit" +msgstr "qirqiri kundi" -msgid "workspace.path.actions.move-nodes" -msgstr "tafi da kauri (%s)" +msgid "onboarding-v2.before-start.desc3.title" +msgstr "koyarwa ta hoto mai motsi" -msgid "workspace.path.actions.separate-nodes" -msgstr "raba kauri (%s)" +msgid "shortcuts.thumbnail-set" +msgstr "saita babban yatsa" -msgid "workspace.path.actions.snap-nodes" -msgstr "tsinke kauri (%s)" +msgid "workspace.shape.menu.restore-main" +msgstr "saita ainihin wurin" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.add-flex" -msgstr "kara sassaukan tsarit" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.no-projects-placeholder" +msgstr "nan za a ga bayanin aiki" -msgid "workspace.shape.menu.add-grid" -msgstr "kara akwatin tsari" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.libraries" +msgstr "ma'adanai" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.back" -msgstr "tura zuwa baya" +msgid "onboarding-v2.welcome.desc1" +msgstr "" +"fenfot ne ke yin kelaidos kamar yadda mutane ke yi, mutane na taimakon " +"junansu. kowa za ya iya hada hannu da:" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.backward" -msgstr "tura zuwa baya" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "samar da alamar shiga" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.copy" -msgstr "kwafi" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.no-expiration" +msgstr "ba lokacin daina amfani" -msgid "workspace.shape.menu.create-annotation" -msgstr "kirkiri hoto mai motsi" +msgid "shortcuts.go-to-search" +msgstr "gajeran sako" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.create-artboard-from-selection" -msgstr "zababban allo" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "suna dole ya qunshi alamomin rubutu 250." -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.create-component" -msgstr "kirkiri abubuwa" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.libraries" +msgstr "dakunan karatu" -msgid "workspace.shape.menu.create-multiple-components" -msgstr "kirkiri abubuwa da yawa" +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.components" +msgstr "Bangarori" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.cut" -msgstr "cire" +#, permanent +msgid "inspect.attributes.stroke.alignment.inner" +msgstr "daga ciki" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.delete" -msgstr "goge" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.select-all" +msgstr "zabi duka" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.delete-flow-start" -msgstr "goge kwararar farko" +msgid "labels.upload-custom-fonts" +msgstr "Upload custom fonts" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.detach-instance" -msgstr "raba yanayin abin" +msgid "shortcuts.flip-horizontal" +msgstr "kifa shi dai dai" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.detach-instances-in-bulk" -msgstr "raba yanayin abin" +msgid "dashboard.import.progress.process-components" +msgstr "aikin sassa" -msgid "workspace.shape.menu.difference" -msgstr "bambanci" +#: src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs +msgid "dashboard.update-settings" +msgstr "zamanartarwa wurin gyara" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.duplicate" -msgstr "maimaita" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints" +msgstr "Takura" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.edit" -msgstr "tace" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.saturation" +msgstr "jikewa" -msgid "workspace.shape.menu.exclude" -msgstr "kebe" +msgid "workspace.sidebar.expand" +msgstr "kara yankin ma'agiyar bayani" -msgid "workspace.shape.menu.flatten" -msgstr "mikad da abu" +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur" +msgstr "xige-xige" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flip-horizontal" -msgstr "kifa ta tsaye" +#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.mask" +msgstr "takunkumik" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flip-vertical" -msgstr "kifa ta kwance" +#: src/app/main/ui/dashboard/fonts.cljs +msgid "title.dashboard.font-providers" +msgstr "samar da jerin harufa - %s - Mazubin biruka" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flow-start" -msgstr "fara malala" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.num-of-projects" +msgid_plural "labels.num-of-projects" +msgstr[0] "aiki" +msgstr[1] "aiyuka %s" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.forward" -msgstr "kawo ta gaba" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.libraries.text.multiple-typography-tooltip" +msgstr "Cire mahadar duka rabutun rubutu" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.front" -msgstr "kawo zuwa gaba" +msgid "shortcuts.start-editing" +msgstr "fara gyarawa" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.go-main" -msgstr "tafi ainihin wurin fal" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay-dest" +msgstr "Juya mai murfi: %s" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.group" -msgstr "rukuni" +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.graphics" +msgstr "zane zane" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.hide" -msgstr "boye" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.pending-invitation" +msgstr "tukuna" -msgid "workspace.shape.menu.hide-ui" -msgstr "nuna / boye UI" +msgid "workspace.path.actions.make-corner" +msgstr "ta kwana (%s)" -msgid "workspace.shape.menu.intersection" -msgstr "mahada" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.line-height" +msgstr "tsawon layi" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.lock" -msgstr "kulle" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "da'ira" -#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.mask" -msgstr "takunkumik" +msgid "modals.create-webhook.url.label" +msgstr "farashin URL" -#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.paste" -msgstr "manna" +msgid "workspace.options.stroke-color" +msgstr "gigciye kalar" -msgid "workspace.shape.menu.path" -msgstr "hanya" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.remove-flex" -msgstr "cire sassaukan tsari" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.copy-token" +msgstr "kwafar kyauta" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.reset-overrides" -msgstr "sake saita sokewa" +msgid "dashboard.export-binary-multi" +msgstr "sauke %s kundayen manhajar fenfot(.penpot)" -msgid "workspace.shape.menu.restore-main" -msgstr "saita ainihin wurin" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.components" +msgstr "%s bangarori" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.select-layer" -msgstr "zabi shimfida" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.title" +msgid_plural "modals.unpublish-shared-confirm.title" +msgstr[0] "rufe taska" +msgstr[1] "rufe taskoki" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show" -msgstr "nuna" +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.no-elements" +msgstr "ba wasu abubuwan da ake daidaitawa wajen tsara fitarwa." -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show-in-assets" -msgstr "nuna ta kusuwar kadara" +#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs +msgid "workspace.gradients.radial" +msgstr "a da'ira" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show-main" -msgstr "nuna ainihin wurin" +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.cancel" +msgstr "ajiye asusu da soke shi" -msgid "workspace.shape.menu.thumbnail-remove" -msgstr "cire girman babban danyatsa" +msgid "shortcuts.move-unit-left" +msgstr "Matsa da sashin hagu" -msgid "workspace.shape.menu.thumbnail-set" -msgstr "kara kamar girman babban yatsa" +msgid "inspect.attributes.stroke.style.mixed" +msgstr "gauraya" -msgid "workspace.shape.menu.transform-to-path" -msgstr "sauya zuwa hanya" +msgid "shortcuts.toggle-colorpalette" +msgstr "Danna launukan kala" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.ungroup" -msgstr "raba rukunin" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.outer" +msgstr "waje" -msgid "workspace.shape.menu.union" -msgstr "hadakan" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-top-left" +msgstr "saman hagu" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.unlock" -msgstr "bude" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.start" +msgstr "fara koyarwa" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.unmask" -msgstr "bude takunkumi" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.box-filter-all" +msgstr "duka kadara" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.update-components-in-bulk" -msgstr "sabunta ainihin wurin" +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.invite-invalid" +msgstr "gaiyar ba ta yi ba" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.update-main" -msgstr "sabunta ainihin wurin" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.normal" +msgstr "na kullum" -msgid "workspace.sidebar.collapse" -msgstr "ruguza a'ajiyar bayani" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete-multi-files" +msgstr "goge %s kundaye" -msgid "workspace.sidebar.expand" -msgstr "kara yankin ma'agiyar bayani" +msgid "shortcuts.join-nodes" +msgstr "hada abubuwan" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.sidebar.history" -msgstr "labari (%s)" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.preferences" +msgstr "fifiko" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.sidebar.layers" -msgstr "shafi" +#: src/app/main/ui/static.cljs +msgid "labels.service-unavailable.desc-message" +msgstr "mu na cikin kula a tsarinka." -msgid "workspace.sidebar.layers.components" -msgstr "bangare" +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vbottom" +msgstr "Daidaita kasa (%s)" -msgid "workspace.sidebar.layers.frames" -msgstr "allo" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.font-variant-id" +msgstr "bambanci" -msgid "workspace.sidebar.layers.groups" -msgstr "rukuni" +#: src/app/main/ui/settings/options.cljs +msgid "labels.language" +msgstr "harshe" -msgid "workspace.sidebar.layers.images" -msgstr "hoto" +msgid "shortcut-subsection.text-editor" +msgstr "Rubutu" -msgid "workspace.sidebar.layers.masks" -msgstr "takunkumi" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.shared-libraries" +msgstr "Rabban ma'adanai" -msgid "workspace.sidebar.layers.search" -msgstr "nemo shimfida" +msgid "workspace.shape.menu.exclude" +msgstr "kebe" -msgid "workspace.sidebar.layers.shapes" -msgstr "Siffa" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-delete-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "an goge kundinka" +msgstr[1] "an goge kundayenka" -msgid "workspace.sidebar.layers.texts" -msgstr "rubutu" +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.message" +msgstr "ka tabbata ka na son goge fira? duk sharhi a nan za a goge matsaloli." -#: src/app/main/ui/workspace/sidebar/options/menus/svg_attrs.cljs, src/app/main/ui/inspect/attributes/svg.cljs -msgid "workspace.sidebar.options.svg-attrs.title" -msgstr "shigo da shi SVG halaye" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.rotation" +msgstr "juyawa" -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "workspace.sidebar.sitemap" -msgstr "shafi" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... zane-zane, kayan kallo, tsarin qira, etc." -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.sitemap" -msgstr "taswirar wuri" +msgid "shortcuts.move-unit-up" +msgstr "Matsa da sashin samu" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.assets" -msgstr "kadara" +msgid "labels.upload" +msgstr "xorawa" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.color-palette" -msgstr "farantin kala (%s)" +msgid "onboarding-v2.welcome.desc2" +msgstr "" +"wurin da kowa zai iya koyo, fahimtar ta juna a kan fenfot, kasancewarta " +"manyan tawagar fenfot da sauran mutane." -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.comments" -msgstr "ra'ayi (%s)" +#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.rename" +msgstr "sake suna" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.curve" -msgstr "kwana(%s)" +msgid "shortcuts.zoom-lense-decrease" +msgstr "Zuko raguwar ido" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.ellipse" -msgstr "siffar kwai (%s)" +msgid "modals.edit-webhook.title" +msgstr "gyara webhook" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.frame" -msgstr "allo (%s)" +msgid "workspace.undo.entry.single.shape" +msgstr "siffa" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.image" -msgstr "hoto (%s)" +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "workspace.sidebar.sitemap" +msgstr "shafi" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.move" -msgstr "motsa (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.width" +msgstr "fadi" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.path" -msgstr "hanya (%s)" +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.send" +msgstr "aika" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.rect" -msgstr "Rectangle (%s)" +#: src/app/main/ui/workspace.cljs +msgid "title.workspace" +msgstr "%s - Mazubin biruka" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.shortcuts" -msgstr "yanke (%s)" +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.no-matches-for" +msgstr "ba wanda ya yi daidai da “%s“" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.text" -msgstr "rubutu (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.text-transform" +msgstr "canja rubutu" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.text-palette" -msgstr "rubutub rubutu (%s)" +msgid "errors.email-as-password" +msgstr "ba za ka iya amfani da imel ba a matsayin lambar tsaro ba" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.empty" -msgstr "babu labaran da su ka canja a yanzu" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate-multi" +msgstr "kwafi %s kundaye" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.delete" -msgstr "gogagge %s" +msgid "shortcuts.line-height-dec" +msgstr "rage tsawon layi" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.modify" -msgstr "gyaggyarawa %s" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.view" +msgstr "gani" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.move" -msgstr "motsa abun" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.detach-instances-in-bulk" +msgstr "raba yanayin abin" -msgid "workspace.undo.entry.multiple.circle" -msgstr "da'ira" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.scale" +msgstr "maauni" -msgid "workspace.undo.entry.multiple.color" -msgstr "kadarar kala" +msgid "inspect.empty.more-info" +msgstr "qarin bayani a fagen lura" -msgid "workspace.undo.entry.multiple.component" -msgstr "bangare" +#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs +msgid "notifications.profile-saved" +msgstr "an ajiye bayanai!" -msgid "workspace.undo.entry.multiple.curve" -msgstr "kwana" +msgid "workspace.focus.focus-off" +msgstr "karka maida hankali" -msgid "workspace.undo.entry.multiple.frame" -msgstr "allo" +msgid "shortcuts.toggle-fullscreen" +msgstr "Danna fuskar ta cika duka" -msgid "workspace.undo.entry.multiple.group" -msgstr "rukunis" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "karin bayani - Shiga alama" -msgid "workspace.undo.entry.multiple.media" -msgstr "kadarar zane" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-duplicate-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "an kwafi kundinka" +msgstr[1] "an kwafi kundayenka" -msgid "workspace.undo.entry.multiple.multiple" -msgstr "abu" +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.colors" +msgstr "kala" -msgid "workspace.undo.entry.multiple.page" -msgstr "shafi" +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.owner" +msgstr "mai" -msgid "workspace.undo.entry.multiple.path" -msgstr "hanya" +msgid "shortcuts.select-prev" +msgstr "zabi shafin da ya gabata" -msgid "workspace.undo.entry.multiple.rect" -msgstr "rectangles" +#: src/app/main/ui/dashboard/grid.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-file" +msgstr "an tura aikinka" -msgid "workspace.undo.entry.multiple.shape" -msgstr "siffa" +msgid "workspace.options.radius" +msgstr "digon tsakiyar da'ira" -msgid "workspace.undo.entry.multiple.text" -msgstr "rubutu" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.back" +msgstr "tura zuwa baya" -msgid "workspace.undo.entry.multiple.typography" -msgstr "rubutun rubuta kadara" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow" +msgstr "layin mashiw" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.new" -msgstr "sabo %s" +msgid "shortcuts.align-left" +msgstr "tsarin hagu" -msgid "workspace.undo.entry.single.circle" -msgstr "da'ira" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.edit" +msgstr "tace" -msgid "workspace.undo.entry.single.color" -msgstr "kalar kadara" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.ungroup" +msgstr "kashe daga kungiya" -msgid "workspace.undo.entry.single.component" -msgstr "bangarori" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.not-found" +msgstr "ba'a samu kadara ba" -msgid "workspace.undo.entry.single.curve" -msgstr "lankwasa" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fit-all" +msgstr "zuko yayi daidai da ko'ina" -msgid "workspace.undo.entry.single.frame" -msgstr "allo" +#: src/app/main/ui/auth/register.cljs +msgid "auth.login-here" +msgstr "shiga nan" -msgid "workspace.undo.entry.single.group" -msgstr "rukuni" +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subject" +msgstr "shugabanci" -msgid "workspace.undo.entry.single.image" -msgstr "hoto" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-after-delay" +msgstr "Bayan jinkiri" -msgid "workspace.undo.entry.single.media" -msgstr "kadarar zanen hotuna" +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team.placeholder" +msgstr "shigar da sabon sunan tawaga" -msgid "workspace.undo.entry.single.multiple" -msgstr "wani abu" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-max-h" +msgstr "tsawo mafi yawa" -msgid "workspace.undo.entry.single.page" -msgstr "shafi" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title" +msgstr "inuwa" -msgid "workspace.undo.entry.single.path" -msgstr "hanya" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.size" +msgstr "girma" -msgid "workspace.undo.entry.single.rect" -msgstr "rectangle" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.help-info" +msgstr "taimako & bayani" -msgid "workspace.undo.entry.single.shape" -msgstr "siffa" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title-group" +msgstr "rukunin rubutu" msgid "workspace.undo.entry.single.text" msgstr "sako" -msgid "workspace.undo.entry.single.typography" -msgstr "rubutun rubuta kadara" +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.type-something" +msgstr "rubuta neman sakamako" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.unknown" -msgstr "yanayi fiye da %s" +msgid "shortcuts.mask" +msgstr "takunkumi" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.title" -msgstr "labari" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-fixed" +msgstr "dasa" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.dismiss" -msgstr "watsar" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.image" +msgstr "hoto (%s)" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "bayanai masu yawa" +msgid "shortcuts.line-through" +msgstr "danna layin duk" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.there-are-updates" -msgstr "a kwai na zamani a rababban ma'ajiya" +msgid "workspace.undo.entry.single.path" +msgstr "hanya" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.update" -msgstr "sabintawas" +msgid "errors.cannot-upload" +msgstr "kasa xora xan aiken kundi." -msgid "workspace.viewport.click-to-close-path" -msgstr "latsa kusa da hanya" +msgid "onboarding.choice.team-up.create-team-placeholder" +msgstr "sanya sunan tawaga" + +msgid "shortcuts.move-fast-down" +msgstr "Matsa kasa da sauri" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.add-flex" +msgstr "kara sassaukan tsarit" diff --git a/frontend/translations/he.po b/frontend/translations/he.po index 5ea29f18a..eafd1cd44 100644 --- a/frontend/translations/he.po +++ b/frontend/translations/he.po @@ -1,16 +1,16 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-17 14:02+0000\n" +"PO-Revision-Date: 2023-10-16 04:09+0000\n" "Last-Translator: Yaron Shahrabani \n" -"Language-Team: Hebrew " -"\n" +"Language-Team: Hebrew \n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " "n % 10 == 0) ? 2 : 3));\n" -"X-Generator: Weblate 5.4\n" +"X-Generator: Weblate 5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -171,13 +171,6 @@ msgstr "תנאי השירות" msgid "auth.terms-privacy-agreement" msgstr "יצירת חשבון חדש מהווה את הסכמתך לתנאי השירות ולמדיניות הפרטיות." -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"עצם יצירת חשבון חדש מהווה הסכמה ל[תנאי השירות](%s) ול[מדיניות הפרטיות](%s) " -"שלנו." - #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "שלחנו הודעת דוא״ל לאימות אל" @@ -292,10 +285,6 @@ msgstr "יצירת אסימון חדש" msgid "dashboard.access-tokens.create.success" msgstr "אסימון הגישה נוצר בהצלחה." -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "נא ללחוץ על הכפתור „יצירת אסימון חדש” כדי ליצור אחד חדש." - #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.empty.no-access-tokens" msgstr "אין לך אסימונים עדיין." @@ -340,12 +329,6 @@ msgstr "אין תאריך תפוגה" msgid "dashboard.access-tokens.personal" msgstr "אסימוני כניסה אישיים" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"אסימוני גישה אישיים הם דרך חלופית למערכת אימות הכניסה/סיסמה שלנו ומאפשרים " -"ליישום לגשת ל־API הפנימי של Penpot" - #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.token-will-expire" msgstr "האסימון יפוג ב־%s" @@ -518,19 +501,9 @@ msgstr "ייבוא קובצי Penpot" msgid "dashboard.import.analyze-error" msgstr "אופס! לא הצלחנו לייבא את הקובץ הזה" -msgid "dashboard.import.analyze-error.components-v2" -msgstr "קובץ עם רכיבים בגרסה 2 מופעל אך הצוות הזה לא תומך בזה עדיין." - msgid "dashboard.import.import-error" msgstr "אירעה תקלה בייבוא הקובץ. הוא לא ייובא." -msgid "dashboard.import.import-message" -msgid_plural "dashboard.import.import-message" -msgstr[0] "קובץ יובא בהצלחה." -msgstr[1] "%s קבצים יובאו בהצלחה." -msgstr[2] "%s קבצים יובאו בהצלחה." -msgstr[3] "%s קבצים יובאו בהצלחה." - msgid "dashboard.import.import-warning" msgstr "חלק מהקבצים הכילו פריטים שגויים שהוסרו." @@ -896,12 +869,6 @@ msgstr "" msgid "errors.feature-not-supported" msgstr "אין תמיכה ביכולת ‚%s’." -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"נראה שאין התאמ בין היכולות הפעילות לבין הקובץ שניסית לפתוח. יש להחיל הסבות " -"עבור ‚%s’ לפני שיתאפשר לפתוח את הקובץ הזה." - #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -950,9 +917,6 @@ msgstr "סיסמת האימות חייבת להיות תואמת" msgid "errors.password-too-short" msgstr "הסיסמה חייבת להיות באורך 8 תווים לפחות" -msgid "errors.paste-data-validation" -msgstr "נתונים שגויים בלוח הגזירים" - msgid "errors.profile-blocked" msgstr "הפרופיל חסום" @@ -966,10 +930,6 @@ msgstr "הודעות הדוא״ל לפרופיל שלך מושתקות (דיוו msgid "errors.registration-disabled" msgstr "ההרשמה מושבתת כרגע." -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "התגלתה יכולת לא תואמת ‚%s’" - msgid "errors.team-leave.insufficient-members" msgstr "אין מספיק חברים כדי לעזוב את הצוות, כנראה יהיה עליך למחוק אותו." @@ -989,13 +949,6 @@ msgstr "אירעה שגיאה בלתי צפויה." msgid "errors.unexpected-token" msgstr "אסימון בלתי ידוע" -msgid "errors.validation" -msgstr "שגיאת אימות" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "מספר גרסת הקובץ לא תואם" - msgid "errors.webhooks.connection" msgstr "שגיאת תקשורת, הכתובת אינה נגישה" @@ -1227,9 +1180,6 @@ msgstr "ללא" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "ראשונות גדולות" -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "ביטול הגדרה" - msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "אותיות גדולות" @@ -1637,9 +1587,6 @@ msgstr "תפקיד" msgid "labels.save" msgstr "שמירה" -msgid "labels.search" -msgstr "חיפוש" - msgid "labels.search-font" msgstr "חיפוש גופן" @@ -1664,9 +1611,6 @@ msgstr "השירות אינו זמין" msgid "labels.settings" msgstr "הגדרות" -msgid "labels.share" -msgstr "שיתוף" - msgid "labels.share-prototype" msgstr "שיתוף אבטיפוס" @@ -1736,33 +1680,10 @@ msgstr "(אני)" msgid "labels.your-account" msgstr "החשבון שלך" -msgid "media.choose-image" -msgstr "בחירת תמונה" - -msgid "media.gradient" -msgstr "מדרג" - -msgid "media.image" -msgstr "תמונה" - -msgid "media.linear" -msgstr "קווי" - #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "התמונה נטענת…" -msgid "media.radial" -msgstr "מעגלי" - -msgid "media.solid" -msgstr "אחיד" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"הספרייה שלך ריקה. לאחר שנוספה כתיקייה משותפת, הנכסים שנוצרים על ידיך יהיו " -"זמינים לצד שאר הקבצים שלך. לפרסם אותה?" - #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -1880,12 +1801,6 @@ msgstr "למחוק את הדיון הזה? כל התגובות בשרשור תי msgid "modals.delete-comment-thread.title" msgstr "מחיקת דיון" -msgid "modals.delete-component-annotation.message" -msgstr "למחוק את הסימון הזה?" - -msgid "modals.delete-component-annotation.title" -msgstr "מחיקת סימון" - #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-file-confirm.accept" msgstr "מחיקת קובץ" @@ -1951,22 +1866,6 @@ msgstr[1] "מחיקת קבצים" msgstr[2] "מחיקת קבצים" msgstr[3] "מחיקת קבצים" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.no-files-message" -msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "לא מופעל באף קובץ." -msgstr[1] "לא מופעלים באף קובץ." -msgstr[2] "לא מופעלים באף קובץ." -msgstr[3] "לא מופעלים באף קובץ." - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.scd-message" -msgid_plural "modals.delete-shared-confirm.activated.scd-message" -msgstr[0] "הספרייה הזאת מופעלת כאן: " -msgstr[1] "הספריות האלו מופעלות כאן: " -msgstr[2] "הספריות האלו מופעלות כאן: " -msgstr[3] "הספריות האלו מופעלות כאן: " - #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-shared-confirm.message" @@ -2009,14 +1908,6 @@ msgstr "למחוק את החבר הזה מהצוות?" msgid "modals.delete-team-member-confirm.title" msgstr "למחוק חבר בצוות" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "נכסים שכבר נעשה בהם שימוש בקובץ הזה יישארו שם (אף עיצוב לא ייפגע)." -msgstr[1] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." -msgstr[2] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." -msgstr[3] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." - msgid "modals.delete-webhook.accept" msgstr "מחיקת התליה" @@ -2289,33 +2180,12 @@ msgstr "מדריך למתנדבים" msgid "onboarding-v2.welcome.title" msgstr "ברוך בואך ל־Penpot!" -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "להמשיך ביצירת צוות" - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "להמשיך בלי צוות" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "ליצור צוות ולהזמין" - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "ליצור צוות ולשלוח הזמנות" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "אפשר להזמין בהמשך" - msgid "onboarding.choice.team-up.create-team-desc" msgstr "לאחר מתן שם לצוות שלך, יתאפשר לך להזמין אנשים להצטרף." msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "נא למלא את שם הצוות" -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "ליצור צוות" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "ליצור צוות בלי לשלוח הזמנות" - msgid "onboarding.choice.team-up.invite-members" msgstr "הזמנת חברים" @@ -2325,12 +2195,6 @@ msgstr "רצוי לזכור לכלול את כולם. מפתחים, מעצבים msgid "onboarding.choice.team-up.roles" msgstr "הזמנה עם התפקיד:" -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "להתחיל בלי צוות" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "אפשר ליצור צוות בהמשך." - msgid "onboarding.newsletter.accept" msgstr "כן, להירשם" @@ -2427,30 +2291,14 @@ msgstr "היכרות מעמיקה יותר עם Penpot" msgid "questions.figma" msgstr "Figma" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "מייסד/סגן נשיא" - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.freelancer" msgstr "יש לי עסק משלי" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "הורדת הקוד מהמיזם הצוותי שלי " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "… עיצוב מנשק, נכסים חזותיים, מערכות עיצוב, וכו׳." - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.invision" msgstr "InVision" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "להשאיר משוב למיזם הצוותי שלי" - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.lets-get-started" msgstr "מתחילים!" @@ -2515,40 +2363,10 @@ msgstr "התחלה" msgid "questions.start-to-work-on-my-project" msgstr "התחלת עבודה על מיזם משלי" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "סטודנט/ית או מרצה" - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.team-size" msgstr "מה גודל הצוות שלך?" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "לבדוק את Penpot ולראות אם הוא מתאים לצוות שלי " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "אפשר להתנסות לפני שימוש ב־Penpot אצלך בעבודה" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "… תרשימי מתאר, סיפורי ותהליכי משתמשים, עצי ניווט ועוד." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "עבודה עם רעיונות למימוש" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"המשוב שלך יסייע לנו להבין מה הם ההרגלים וההעדפות שלך כדי שנוכל להמשיך להפוך " -"את Penpot לכלי מהנה ושימושי." - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "ניתוק" - #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, @@ -3005,9 +2823,6 @@ msgstr "הצגת/הסתרת סרגלים" msgid "shortcuts.toggle-textpalette" msgstr "החלפת לוח טקסט" -msgid "shortcuts.toggle-theme" -msgstr "החלפת ערכת עיצוב" - msgid "shortcuts.toggle-visibility" msgstr "החלפת מצב הצגה" @@ -3345,45 +3160,6 @@ msgstr "התמרת טקסט" msgid "workspace.assets.ungroup" msgstr "פירוק קבוצה" -msgid "workspace.context-menu.grid-cells.area" -msgstr "יצירת שטח" - -msgid "workspace.context-menu.grid-cells.create-board" -msgstr "יצירת לוח" - -msgid "workspace.context-menu.grid-cells.merge" -msgstr "מיזוג תאים" - -msgid "workspace.context-menu.grid-track.column.add-after" -msgstr "הוספת עמודה מימין" - -msgid "workspace.context-menu.grid-track.column.add-before" -msgstr "הוספת עמודה משמאל" - -msgid "workspace.context-menu.grid-track.column.delete" -msgstr "מחיקת עמודה" - -msgid "workspace.context-menu.grid-track.column.delete-shapes" -msgstr "מחיקת עמודה וצורות" - -msgid "workspace.context-menu.grid-track.column.duplicate" -msgstr "שכפול עמודה" - -msgid "workspace.context-menu.grid-track.row.add-after" -msgstr "הוספת שורה מתחת" - -msgid "workspace.context-menu.grid-track.row.add-before" -msgstr "הוספת שורה למעלה" - -msgid "workspace.context-menu.grid-track.row.delete" -msgstr "מחיקת שורה" - -msgid "workspace.context-menu.grid-track.row.delete-shapes" -msgstr "מחיקת שורה וצורות" - -msgid "workspace.context-menu.grid-track.row.duplicate" -msgstr "שכפול שורה" - msgid "workspace.focus.focus-mode" msgstr "מצב מיקוד" @@ -3507,12 +3283,6 @@ msgstr "הצגת סרגלים" msgid "workspace.header.menu.show-textpalette" msgstr "הצגת לוח גופנים" -msgid "workspace.header.menu.toggle-dark-theme" -msgstr "החלפה לערכת עיצוב כהה" - -msgid "workspace.header.menu.toggle-light-theme" -msgstr "החלפה לערכת עיצוב בהירה" - msgid "workspace.header.menu.undo" msgstr "החזרה" @@ -3564,21 +3334,6 @@ msgstr "מסך מלא" msgid "workspace.header.zoom-selected" msgstr "התמקדות על הנבחר" -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "עריכת רשת" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "יציאה מהמערכת" - -msgid "workspace.layout_grid.editor.title" -msgstr "רשת עריכה" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "בוצע" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "איתור" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "הוספה" @@ -3591,10 +3346,6 @@ msgstr "%s צבעים" msgid "workspace.libraries.colors.empty-palette" msgstr "אין עדיין סגנונות צבע בספרייה שלך" -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "עדיין אין סוגי טיפוגרפיה בספרייה שלך" - #: src/app/main/ui/workspace/colorpicker/libraries.cljs, #: src/app/main/ui/workspace/colorpalette.cljs msgid "workspace.libraries.colors.file-library" @@ -3649,10 +3400,6 @@ msgstr "ספרייה" msgid "workspace.libraries.library-updates" msgstr "עדכוני ספרייה" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.loading" -msgstr "בטעינה…" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "אין ספריות משותפות שדורשות עדכון" @@ -3724,27 +3471,6 @@ msgstr "חיתוך התוכן" msgid "workspace.options.component" msgstr "רכיב" -msgid "workspace.options.component.annotation" -msgstr "הסבר" - -msgid "workspace.options.component.copy" -msgstr "העתקה" - -msgid "workspace.options.component.create-annotation" -msgstr "יצירת הסבר" - -msgid "workspace.options.component.edit-annotation" -msgstr "עריכת הסבר" - -msgid "workspace.options.component.main" -msgstr "ראשי" - -msgid "workspace.options.component.swap" -msgstr "החלפת רכיב" - -msgid "workspace.options.component.swap.empty" -msgstr "עדיין אין נכסים בתיקייה הזאת" - #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "הגבלות" @@ -3840,10 +3566,6 @@ msgstr "מילוי" msgid "workspace.options.flows.add-flow-start" msgstr "הוספת תחילת זרימה" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "זרימה" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "התחלת זרימה" @@ -3947,9 +3669,6 @@ msgstr "מילוי קבוצה" msgid "workspace.options.group-stroke" msgstr "מתאר קבוצה" -msgid "workspace.options.guides.title" -msgstr "קווים מנחים" - msgid "workspace.options.height" msgstr "גובה" @@ -4496,26 +4215,14 @@ msgstr "מתאר" msgid "workspace.options.stroke-cap.circle-marker" msgstr "סמן עגול" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "עיגול" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "סמן יהלום" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "יהלום" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "חץ קו" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "חץ" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "ללא" @@ -4532,18 +4239,10 @@ msgstr "ריבוע" msgid "workspace.options.stroke-cap.square-marker" msgstr "סמן ריבוע" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "מרובע" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "חץ משולש" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "משולש" - msgid "workspace.options.stroke-color" msgstr "צבע מתאר" @@ -4733,9 +4432,6 @@ msgstr "הרחקה לאחור" msgid "workspace.shape.menu.copy" msgstr "העתקה" -msgid "workspace.shape.menu.create-annotation" -msgstr "יצירת הסבר" - #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.create-artboard-from-selection" msgstr "בחירה ללוח" @@ -5014,13 +4710,6 @@ msgstr "טקסט (%s)" msgid "workspace.toolbar.text-palette" msgstr "טיפוגרפיות (%s)" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**מצב חקירה** (צפייה בלבד)" - -msgid "workspace.top-bar.read-only.done" -msgstr "בוצע" - #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "אין שינויים היסטוריים עד כה" @@ -5154,3 +4843,146 @@ msgstr "עדכון" msgid "workspace.viewport.click-to-close-path" msgstr "לחיצה תסגור את הנתיב" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "אפשר להתנסות לפני שימוש ב־Penpot אצלך בעבודה" + +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "קובץ יובא בהצלחה." +msgstr[1] "%s קבצים יובאו בהצלחה." +msgstr[2] "%s קבצים יובאו בהצלחה." +msgstr[3] "%s קבצים יובאו בהצלחה." + +msgid "modals.delete-component-annotation.message" +msgstr "למחוק את הסימון הזה?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.scd-message" +msgid_plural "modals.delete-shared-confirm.activated.scd-message" +msgstr[0] "הספרייה הזאת מופעלת כאן: " +msgstr[1] "הספריות האלו מופעלות כאן: " +msgstr[2] "הספריות האלו מופעלות כאן: " +msgstr[3] "הספריות האלו מופעלות כאן: " + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "לא מופעל באף קובץ." +msgstr[1] "לא מופעלים באף קובץ." +msgstr[2] "לא מופעלים באף קובץ." +msgstr[3] "לא מופעלים באף קובץ." + +msgid "modals.delete-component-annotation.title" +msgstr "מחיקת סימון" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "לבדוק את Penpot ולראות אם הוא מתאים לצוות שלי " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "סטודנט/ית או מרצה" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "להשאיר משוב למיזם הצוותי שלי" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"אסימוני גישה אישיים הם דרך חלופית למערכת אימות הכניסה/סיסמה שלנו ומאפשרים " +"ליישום לגשת ל־API הפנימי של Penpot" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "נא ללחוץ על הכפתור „יצירת אסימון חדש” כדי ליצור אחד חדש." + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"הספרייה שלך ריקה. לאחר שנוספה כתיקייה משותפת, הנכסים שנוצרים על ידיך יהיו " +"זמינים לצד שאר הקבצים שלך. לפרסם אותה?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "… עיצוב מנשק, נכסים חזותיים, מערכות עיצוב, וכו׳." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "עבודה עם רעיונות למימוש" + +msgid "workspace.options.component.copy" +msgstr "העתקה" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"המשוב שלך יסייע לנו להבין מה הם ההרגלים וההעדפות שלך כדי שנוכל להמשיך להפוך " +"את Penpot לכלי מהנה ושימושי." + +msgid "workspace.options.component.create-annotation" +msgstr "יצירת הסבר" + +msgid "workspace.options.component.edit-annotation" +msgstr "עריכת הסבר" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "הורדת הקוד מהמיזם הצוותי שלי " + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "מרובע" + +msgid "workspace.options.component.main" +msgstr "ראשי" + +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "עדיין אין סוגי טיפוגרפיה בספרייה שלך" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "נכסים שכבר נעשה בהם שימוש בקובץ הזה יישארו שם (אף עיצוב לא ייפגע)." +msgstr[1] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." +msgstr[2] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." +msgstr[3] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." + +msgid "workspace.options.component.annotation" +msgstr "הסבר" + +msgid "workspace.layout_grid.editor.title" +msgstr "רשת עריכה" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "… תרשימי מתאר, סיפורי ותהליכי משתמשים, עצי ניווט ועוד." + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "יהלום" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "ניתוק" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "משולש" + +msgid "workspace.shape.menu.create-annotation" +msgstr "יצירת הסבר" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "חץ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "מייסד/סגן נשיא" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "עיגול" diff --git a/frontend/translations/hr.po b/frontend/translations/hr.po index 9075ac5de..a0e38637e 100644 --- a/frontend/translations/hr.po +++ b/frontend/translations/hr.po @@ -2697,6 +2697,7 @@ msgstr "Omogući dinamičko poravnanje" msgid "workspace.header.menu.enable-scale-text" msgstr "Omogući skaliranje teksta" + #: src/app/main/ui/workspace/header.cljs #, fuzzy msgid "workspace.header.menu.enable-snap-guides" diff --git a/frontend/translations/id.po b/frontend/translations/id.po index 86d745eef..037737bdd 100644 --- a/frontend/translations/id.po +++ b/frontend/translations/id.po @@ -1,15 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-08 15:01+0000\n" +"PO-Revision-Date: 2023-10-07 12:12+0000\n" "Last-Translator: Linerly \n" -"Language-Team: Indonesian " -"\n" +"Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -176,13 +176,6 @@ msgstr "" "Ketika membuat akun baru, Anda menyetujui kebijakan layanan dan kebijakan " "privasi kami." -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Ketika membuat akun baru, Anda menyetujui [persyaratan layanan](%s) dan " -"[kebijakan privasi](%s) kami." - #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "Kami telah mengirimkan surel verifikasi ke" @@ -535,9 +528,6 @@ msgstr "Impor berkas Penpot" msgid "dashboard.import.analyze-error" msgstr "Aduh! Kami tidak dapat mengimpor berkas ini" -msgid "dashboard.import.analyze-error.components-v2" -msgstr "Berkas dengan komponen v2 diaktifkan tetapi tim ini belum mendukungnya." - msgid "dashboard.import.import-error" msgstr "Terdapat masalah saat mengimpor berkas. Berkasnya tidak terimpor." @@ -904,13 +894,6 @@ msgstr "" msgid "errors.feature-not-supported" msgstr "Fitur '%s' tidak didukung." -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Sepertinya ada ketidakcocokan antara fitur yang diaktifkan dengan fitur " -"berkas yang sedang Anda buka. Migrasi untuk '%s' harus diterapkan sebelum " -"berkasnya dapat dibuka." - #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -961,9 +944,6 @@ msgstr "Kata sandi konfirmasi harus cocok" msgid "errors.password-too-short" msgstr "Kata sandi setidaknya 8 karakter" -msgid "errors.paste-data-validation" -msgstr "Data tidak valid dalam papan klip" - msgid "errors.profile-blocked" msgstr "Profil diblokir" @@ -977,10 +957,6 @@ msgstr "Profil Anda membisukan surel (laporan spam atau lompatan tinggi)." msgid "errors.registration-disabled" msgstr "Pendaftaran saat ini dinonaktifkan." -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Fitur '%s' tidak kompatibel terdeteksi" - msgid "errors.team-leave.insufficient-members" msgstr "" "Anggota tidak cukup untuk meninggalkan tim, Anda mungkin ingin menghapusnya " @@ -1004,13 +980,6 @@ msgstr "Sebuah kesalahan tidak terduga terjadi." msgid "errors.unexpected-token" msgstr "Token tidak diketahui" -msgid "errors.validation" -msgstr "Kesalahan Validasi" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Berkas memiliki nomor versi tidak kompatibel" - msgid "errors.webhooks.connection" msgstr "Kesalahan koneksi, URL tidak dapat diraih" @@ -1245,9 +1214,6 @@ msgstr "Tidak ada" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "Huruf Judul" -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Tidak ditetapkan" - msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Huruf Besar" @@ -1649,9 +1615,6 @@ msgstr "Peran" msgid "labels.save" msgstr "Simpan" -msgid "labels.search" -msgstr "Cari" - msgid "labels.search-font" msgstr "Cari fon" @@ -1676,9 +1639,6 @@ msgstr "Layanan Tidak Tersedia" msgid "labels.settings" msgstr "Pengaturan" -msgid "labels.share" -msgstr "Bagikan" - msgid "labels.share-prototype" msgstr "Bagikan prototipe" @@ -1748,34 +1708,10 @@ msgstr "(Anda)" msgid "labels.your-account" msgstr "Akun Anda" -msgid "media.choose-image" -msgstr "Pilih gambar" - -msgid "media.gradient" -msgstr "Gradien" - -msgid "media.image" -msgstr "Gambar" - -msgid "media.linear" -msgstr "Linear" - #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Memuat gambar…" -msgid "media.radial" -msgstr "Radial" - -msgid "media.solid" -msgstr "Padat" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Pustaka Anda saat ini kosong. Ketika ditambahkan sebagai Pustaka Terbagi, " -"aset yang Anda buat akan tersedia untuk digunakan bersama dengan berkas " -"Anda. Apakah Anda yakin ingin menerbitkannya?" - #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -2304,21 +2240,6 @@ msgstr "Panduan berkontribusi" msgid "onboarding-v2.welcome.title" msgstr "Selamat datang di Penpot!" -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Lanjutkan membuat tim" - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Lanjutkan tanpa tim" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Buat tim & undang" - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Buat tim dan kirim undangan" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Anda nanti akan dapat mengundang" - msgid "onboarding.choice.team-up.create-team-desc" msgstr "" "Setelah memberi nama tim, Anda akan dapat mengundang orang-orang untuk " @@ -2327,12 +2248,6 @@ msgstr "" msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "Masukkan nama tim" -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Buat tim" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Buat tim tanpa mengundang" - msgid "onboarding.choice.team-up.invite-members" msgstr "Undang anggota" @@ -2344,12 +2259,6 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Undang dengan peran:" -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Mulai tanpa tim" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Anda nanti akan dapat membuat tim." - msgid "onboarding.newsletter.accept" msgstr "Ya, berlangganan" @@ -2566,10 +2475,6 @@ msgstr "" "Masukan Anda akan membantu kami mengerti kebiasaan dan preferensi Anda " "supaya kami dapat membuat Penpot sebuah alat yang berguna dan nyaman." -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Copot" - #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, @@ -3026,9 +2931,6 @@ msgstr "Tampilkan/sembunyikan penggaris" msgid "shortcuts.toggle-textpalette" msgstr "Alih palet teks" -msgid "shortcuts.toggle-theme" -msgstr "Ubah tema" - msgid "shortcuts.toggle-visibility" msgstr "Alih keterlihatan" @@ -3363,45 +3265,6 @@ msgstr "Transformasi Teks" msgid "workspace.assets.ungroup" msgstr "Lepas kelompok" -msgid "workspace.context-menu.grid-cells.area" -msgstr "Buat area" - -msgid "workspace.context-menu.grid-cells.create-board" -msgstr "Buat papan" - -msgid "workspace.context-menu.grid-cells.merge" -msgstr "Gabungkan sel" - -msgid "workspace.context-menu.grid-track.column.add-after" -msgstr "Tambah 1 kolom ke kanan" - -msgid "workspace.context-menu.grid-track.column.add-before" -msgstr "Tambah 1 kolom ke kiri" - -msgid "workspace.context-menu.grid-track.column.delete" -msgstr "Hapus kolom" - -msgid "workspace.context-menu.grid-track.column.delete-shapes" -msgstr "Hapus kolom dan bentuk" - -msgid "workspace.context-menu.grid-track.column.duplicate" -msgstr "Gandakan kolom" - -msgid "workspace.context-menu.grid-track.row.add-after" -msgstr "Tambah 1 baris di bawah" - -msgid "workspace.context-menu.grid-track.row.add-before" -msgstr "Tambah 1 baris di atas" - -msgid "workspace.context-menu.grid-track.row.delete" -msgstr "Hapus baris" - -msgid "workspace.context-menu.grid-track.row.delete-shapes" -msgstr "Hapus baris dan bentuk" - -msgid "workspace.context-menu.grid-track.row.duplicate" -msgstr "Gandakan baris" - msgid "workspace.focus.focus-mode" msgstr "Mode fokus" @@ -3525,12 +3388,6 @@ msgstr "Tampilkan penggaris" msgid "workspace.header.menu.show-textpalette" msgstr "Tampilkan palet fon" -msgid "workspace.header.menu.toggle-dark-theme" -msgstr "Ubah ke tema gelap" - -msgid "workspace.header.menu.toggle-light-theme" -msgstr "Ubah ke tema terang" - msgid "workspace.header.menu.undo" msgstr "Urungkan" @@ -3582,21 +3439,9 @@ msgstr "Layar penuh" msgid "workspace.header.zoom-selected" msgstr "Zum ke terpilih" -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Sunting kisi" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Keluar" - msgid "workspace.layout_grid.editor.title" msgstr "Kisi penyuntingan" -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Selesai" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Cari lokasi" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Tambahkan" @@ -3667,10 +3512,6 @@ msgstr "PUSTAKA" msgid "workspace.libraries.library-updates" msgstr "PEMBARUAN PUSTAKA" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.loading" -msgstr "Memuat…" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "Tidak ada Pustaka Terbagi yang membutuhkan pembaruan" @@ -3745,24 +3586,12 @@ msgstr "Komponen" msgid "workspace.options.component.annotation" msgstr "Anotasi" -msgid "workspace.options.component.copy" -msgstr "Salin" - msgid "workspace.options.component.create-annotation" msgstr "Buat anotasi" msgid "workspace.options.component.edit-annotation" msgstr "Sunting anotasi" -msgid "workspace.options.component.main" -msgstr "Utama" - -msgid "workspace.options.component.swap" -msgstr "Ganti komponen" - -msgid "workspace.options.component.swap.empty" -msgstr "Belum ada aset dalam pustaka ini" - #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Pasangan" @@ -3855,10 +3684,6 @@ msgstr "Isian" msgid "workspace.options.flows.add-flow-start" msgstr "Tambahkan awalan alur" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Alur" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "Awalan alur" @@ -3962,9 +3787,6 @@ msgstr "Isian kelompok" msgid "workspace.options.group-stroke" msgstr "Sapuan kelompok" -msgid "workspace.options.guides.title" -msgstr "Panduan" - msgid "workspace.options.height" msgstr "Tinggi" @@ -4511,26 +4333,14 @@ msgstr "Sapuan" msgid "workspace.options.stroke-cap.circle-marker" msgstr "Penanda lingkaran" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Lingkaran" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "Penanda berlian" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Berlian" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "Panah garis" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Tanda panah" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "Tidak ada" @@ -4547,18 +4357,10 @@ msgstr "Kotak" msgid "workspace.options.stroke-cap.square-marker" msgstr "Penanda kotak" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Persegi panjang" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "Panah segi tiga" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Segitiga" - msgid "workspace.options.stroke-color" msgstr "Warna sapuan" @@ -5029,13 +4831,6 @@ msgstr "Teks (%s)" msgid "workspace.toolbar.text-palette" msgstr "Tipografi (%s)" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Mode inspeksi** (Hanya Tampilan)" - -msgid "workspace.top-bar.read-only.done" -msgstr "Selesai" - #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Tidak ada riwayat perubahan sejauh ini" @@ -5169,3 +4964,39 @@ msgstr "Perbarui" msgid "workspace.viewport.click-to-close-path" msgstr "Klik untuk menutup jalur" + +msgid "workspace.options.component.copy" +msgstr "Salin" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Persegi panjang" + +msgid "workspace.options.component.main" +msgstr "Utama" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Berlian" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Copot" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Segitiga" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Tanda panah" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Pustaka Anda saat ini kosong. Ketika ditambahkan sebagai Pustaka Terbagi, " +"aset yang Anda buat akan tersedia untuk digunakan bersama dengan berkas " +"Anda. Apakah Anda yakin ingin menerbitkannya?" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Lingkaran" diff --git a/frontend/translations/ig.po b/frontend/translations/ig.po deleted file mode 100644 index 79a03c878..000000000 --- a/frontend/translations/ig.po +++ /dev/null @@ -1,2098 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2024-02-14 08:02+0000\n" -"Last-Translator: Alejandro Alonso \n" -"Language-Team: Igbo " -"\n" -"Language: ig\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.4-dev\n" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.check-your-email" -msgstr "Nyoo ozi- n gị ma pịa na njikọ inyocha ma bido jiri ite mkpịsị rụwa ọrụ ." - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.confirm-password" -msgstr "kpebie akara mpibanye" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-account" -msgstr "mebeta akara ozigosi" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-profile" -msgstr "Chọọ nọọ ị nwa ya. ?" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.demo-warning" -msgstr "" -"Ihe bụ ọrụ ozigosi ,e jile ya rụọ ezigbo ọrụ , ọrụ ndị a ga-ekpochapụ site " -"na oge ruo na oge" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.email" -msgstr "Ozi- n" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.forgot-password" -msgstr "Chefuru akara mpibanye ?" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.fullname" -msgstr "Aha n'uju" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.login-here" -msgstr "Banye ebe a" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-submit" -msgstr "Banye" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Ihe ịtụnanya ịhụ gị !" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-github-submit" -msgstr "Obi Git" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-gitlab-submit" -msgstr "Ụlọ nchọcha Git" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-google-submit" -msgstr "Gọgụlụ" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-ldap-submit" -msgstr "LDAP" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-oidc-submit" -msgstr "Mepe ID" - -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "Aha ga-enweriri ụfọdụ mkpụrụ edemede karịa oghere ." - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "Aha ga-enweriri ọ karịa mkpụrụ okwu narị abụọ na iri ise" - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.new-password" -msgstr "Pinye akara mpịbanye ọhụrụ" - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.invalid-token-error" -msgstr "Ọdịmara e nweghachitere adabaghị ." - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.password-changed-successfully" -msgstr "Akara mpịbanye a gbanwere gara aga" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.profile-not-verified" -msgstr "E nyochaghị nchịkọta , Biko nyocha nchịkọta tupu ị gaa n'ihu." - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.recovery-token-sent" -msgstr "E zigara akara njikọ nnweghachi akara mpibanye n'igbe mbata ozi gị ." - -#: src/app/main/ui/auth/verify_token.cljs -msgid "auth.notifications.team-invitation-accepted" -msgstr "Sonyere n'otu nke ọma" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-length-hint" -msgstr "Ọ karịa mkpụrụ ederede asatọ" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-not-empty" -msgstr "Akara mpịbanye ga-enweriri ụfọdụ leta/akara mpị karịa oghere ." - -msgid "auth.privacy-policy" -msgstr "Iwu oñiño onwe" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-submit" -msgstr "Nweghachite akara mpịbanye" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-subtitle" -msgstr "Anyị ga-ezita ozi n na ndụmọdụ" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-title" -msgstr "Chefuru akara mpịbanye ?" - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.recovery-submit" -msgstr "Gbanye akara mpịbanye." - -#: src/app/main/ui/auth/login.cljs -msgid "auth.register" -msgstr "E nweghị ebe Ntinye ihe ma kịta?" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.register-submit" -msgstr "Mepee ebe Ntinye ihe" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-subtitle" -msgstr "Ọ bụ n'efu , ọ bụ ebe nsị a jere oje" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-title" -msgstr "Mepee ebe ntinye ihe" - -#: src/app/main/ui/auth.cljs -msgid "auth.sidebar-tagline" -msgstr "Nsina ghere oghe iji mee nse na atụtụ" - -msgid "auth.terms-of-service" -msgstr "Ọnọdụ ọrụ" - -msgid "auth.terms-privacy-agreement" -msgstr "" -"Mgbe Ị na-emepe akara mbata ọhụrụ , ị ga-ekwe nye n'ọnọdụ ọrụ anyị na iwu " -"oñiño onwe" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.verification-email-sent" -msgstr "Anyị ezigaala ozi nnyocha na" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "...onyinye aha, nkọwa gasị, ngwa ire ahịa dịrị gabazịa." - -msgid "common.publish" -msgstr "bipụta" - -msgid "common.share-link.all-users" -msgstr "Ndị niile ji ite mkpịsị arụ ọrụ" - -msgid "common.share-link.current-tag" -msgstr "(kee ugbu a )" - -msgid "common.share-link.destroy-link" -msgstr "Mebie njiko" - -msgid "common.share-link.get-link" -msgstr "Weta njiko" - -msgid "common.share-link.link-copied-success" -msgstr "E setere njiko nke ọma" - -msgid "common.share-link.manage-ops" -msgstr "Jikwa ikike" - -msgid "common.share-link.permissions-can-comment" -msgstr "nwere ike ikwu okwu" - -msgid "common.share-link.permissions-can-inspect" -msgstr "Nwere Ike inyocha akara" - -msgid "common.share-link.permissions-hint" -msgstr "Onye ọ bụla ga-enwe ohere mbanye" - -msgid "common.share-link.permissions-pages" -msgstr "Ihu akwụkwọ ekekoritara" - -msgid "common.share-link.placeholder" -msgstr "Njikọ e nwere ike ikekorita ga-apụta" - -msgid "common.share-link.team-members" -msgstr "Sọọsọ ndị otu" - -msgid "common.share-link.title" -msgstr "Kee atụ gasị" - -msgid "common.unpublish" -msgstr "Ebiputaghị" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.text" -msgstr "" -"Ite mkpịsị bụ maka otu . Kpọọ ndị otu ka arụkọta ọnụ on arụmarụ na ederede " -"ọnụ" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.title" -msgstr "Jikota ọnụ !" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.info" -msgstr "Mụọ ntọala na ite mkpịsị maka iji nkuzi mmemmekwa eme ihe egwu" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.start" -msgstr "Bido ọmụmụ" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.title" -msgstr "Nkuzi mmemmekwa" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.info" -msgstr "Mee ngagharị na ite mkpịsị ma mata isi a gwara ya." - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.start" -msgstr "Bido njem" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.title" -msgstr "Aba ngagharị" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "Mepụta ọdịmara ọhụrụ" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "Mmepụtara ọdịmara nnweta gara nke ọma ." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "Pịa mpi \"Nweta ọdịmara ọhụrụ \" inweta otu ." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "A chọrọ aha" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "Mkpụrụ ụbọchị narị na iri asatọ" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "Mkpụrụ ụbọchị iri atọ" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-60-days" -msgstr "Mkpụrụ ụbọchị iri isii" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-90-days" -msgstr "Mkpụrụ ụbọchị iri itoolu" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-never" -msgstr "Ncha ncha" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "Mebiri na%s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expires-on" -msgstr "Na-emebi na%s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.no-expiration" -msgstr "Enweghị ụbọchị mmebi" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "Ọdịmara nkeonwe" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"Ọdịmara nnweta nke onwe na-arụ ọrụ dị ka mgbamonwe mbanye anyị /akara " -"mpịbanye e nwere ike iji usoro mbinye aka kwe ka ngwa nweta ndịnime ite " -"mkpịsị API" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-expire" -msgstr "Ọdịmara ga-emebi na%s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-not-expire" -msgstr "Ọdịmara enweghị ụbọchị mmebi" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.add-shared" -msgstr "Tinye dị ka ọ a nkwekọrịta" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.change-email" -msgstr "Gbanwee ozi - n" - -#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs -msgid "dashboard.copy-suffix" -msgstr "(sere)" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.create-new-team" -msgstr "Mebe otu ọhụrụ" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.default-team-name" -msgstr "Ite mkpịsị gị" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.delete-team" -msgstr "kacha otu" - -msgid "dashboard.download-binary-file" -msgstr "Butuo ederede ite mkpịsị (.penpot)" - -msgid "dashboard.download-standard-file" -msgstr "Butuo ederede tozuru etozu (.svg + .json)" - -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.duplicate" -msgstr "mee oyiri" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.duplicate-multi" -msgstr "Mee o yiri %s ederede" - -#: src/app/main/ui/dashboard/grid.cljs -#, markdown -msgid "dashboard.empty-placeholder-drafts" -msgstr "" -"Ederede a tinyere n'ọba ederede ga-apụta ebe a. Gbalịa ikesa ma ọ bụ tinye " -"site n'[Ọba ederede na ndebiri anyị ](https://itemkpịsị.app/ọba ederede " -"gasị-ndebiri gasị.html)." - -msgid "dashboard.export-binary-multi" -msgstr "Butuo %s ederede ite mkpịsị (.penpot)" - -msgid "dashboard.export-frames" -msgstr "Bupu bọọdụ dị ka PDF" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-frames.title" -msgstr "Bupu dị ka PDF" - -msgid "dashboard.export-multi" -msgstr "Bupu %s ederede Ite mkpịsị" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-multiple.selected" -msgstr "A họrọ %s nke %s ndị na" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to" -msgstr "" -"Ị nwere ike ị tinye ntọala mbupu na ndịna site na ngwongwo nse (n'ala akụkụ " -"aka nri ihe ndepụta)" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to-link" -msgstr "Ozi etu esi ahazi mbupu n'ite mkpịsị" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.no-elements" -msgstr "E nweghị ndịna ọ bụla na ntọala mbupu" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.title" -msgstr "Nhọrọ mbupu" - -msgid "dashboard.export-standard-multi" -msgstr "Buto %s ederede tozuru etozu (.svg + .json)" - -msgid "dashboard.export.detail" -msgstr "* Nwere Ike ịgụnye ngwa , esereese gasị, agwụgwara na/ma ọ bụ akara nkụpụta." - -msgid "dashboard.export.options.all.message" -msgstr "" -"A ga-atinye ederede nwere ọba ederede nkekọrịta ma gụnyere mbupu , ma " -"jidekwa ụkpụrụ njikọ ha" - -msgid "dashboard.export.options.all.title" -msgstr "Bupu ọba ederede nkekọrịta" - -msgid "dashboard.export.options.detach.message" -msgstr "" -"Agaghị a tinye ọba ederede nkekọrịta na mbupu ma o nweghị ihe nnwe a ga a " -"tinye ọ a ederede . " - -msgid "dashboard.export.options.merge.title" -msgstr "Tinye ihe nnwe ọba ederede nkekọrịta n'ime ọ a ederede." - -msgid "dashboard.export.title" -msgstr "Ederede mbupu gasị" - -msgid "dashboard.fonts.deleted-placeholder" -msgstr "Mkpụrụ edemede na-efu efu" - -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.dismiss-all" -msgstr "Gbasaa ha niile" - -msgid "dashboard.fonts.empty-placeholder" -msgstr "Mkpụrụ edemede ndị ị bugoro ga-apụta ebe." - -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.upload-all" -msgstr "Bugo ha niile" - -#, markdown -msgid "dashboard.fonts.warning-text" -msgstr "" -"Anyị chọpụtara nsogbu nwere ike ịpụta na mkpụrụ edide gị gbasara ntụ kwụ " -"ọtọ " - -msgid "dashboard.import.analyze-error" -msgstr "Ewuu! Anyị enweghị ike bubata ederede a" - -msgid "dashboard.import.import-error" -msgstr "E nwere nsogbu na ibubata ederede . E bubataghị ederede ." - -msgid "dashboard.import.import-warning" -msgstr "Ụfọdụ ederede nwere ihe ndị adabaghị na ya nke ewepugoro. ." - -msgid "dashboard.import.progress.process-colors" -msgstr "Nhazi agwụgwara gasị" - -msgid "dashboard.import.progress.process-components" -msgstr "Nhazi ngwa gasị" - -msgid "dashboard.import.progress.process-media" -msgstr "Nhazi mgbasa ozi" - -msgid "dashboard.import.progress.process-page" -msgstr "Nhazi ihu akwụkwọ : %s" - -msgid "dashboard.import.progress.process-typographies" -msgstr "Nhazi akara nkụpụta" - -msgid "dashboard.import.progress.upload-data" -msgstr "Ibugo njatụle n'ebe nkesa (%s/%s)" - -msgid "dashboard.import.progress.upload-media" -msgstr "Ibugo ederede : %s" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.invite-profile" -msgstr "Kpọta mmadụ" - -#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.leave-team" -msgstr "Hapụ otu" - -msgid "dashboard.libraries-and-templates" -msgstr "Ọba ederede gasị & ndebiri" - -msgid "dashboard.libraries-and-templates.explore" -msgstr "Nyocha ọtụtụ n'ime ha ma mara etu ị ga-esi tinye ọnụ" - -msgid "dashboard.libraries-and-templates.import-error" -msgstr "E nwere nsogbu ibu aba ndebiri . E bubataghị ndebiri." - -#: src/app/main/ui/dashboard/libraries.cljs -msgid "dashboard.libraries-title" -msgstr "Ọba ederede gasị" - -#: src/app/main/ui/dashboard/grid.cljs -msgid "dashboard.loading-files" -msgstr "Mbụbata ederede gị …" - -msgid "dashboard.loading-fonts" -msgstr "mbubata mkpụrụ edemede gị …" - -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to" -msgstr "Ga na" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to-multi" -msgstr "Buga %s ederede gasị na" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to-other-team" -msgstr "Gaa n'otu ọzọ" - -#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/files.cljs -msgid "dashboard.new-file" -msgstr "+ Ederede ọhụrụ" - -#: src/app/main/data/dashboard.cljs -msgid "dashboard.new-file-prefix" -msgstr "Ederede ọhụrụ" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dashboard.new-project" -msgstr "+ Nchọcha ọhụrụ" - -#: src/app/main/data/dashboard.cljs -msgid "dashboard.new-project-prefix" -msgstr "Arụmarụ ọhụrụ" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.no-matches-for" -msgstr "Ọ nweghị ihe ndabara e nwetara maka “%s“" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.no-projects-placeholder" -msgstr "Arụmarụ a kụdoro ga-apụta ebe a" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "dashboard.notifications.email-changed-successfully" -msgstr "Adreesị ozi - n gị ahazigharịala gara nke ọma" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "dashboard.notifications.email-verified-successfully" -msgstr "E nyochala adreesị ozi - n gị nke ọma" - -#: src/app/main/ui/settings/password.cljs -msgid "dashboard.notifications.password-saved" -msgstr "E dọkwara akara mpịbanye nke ọma !" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.num-of-members" -msgstr "%s Ndị otu" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.open-in-new-tab" -msgstr "Mepe ederede na tabụ ọhụrụ" - -msgid "dashboard.options" -msgstr "Nhọrọ gasị" - -#: src/app/main/ui/settings/password.cljs -msgid "dashboard.password-change" -msgstr "Gbanwee akara mpịbanye" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.pin-unpin" -msgstr "Nọmba /Wepụ nọmba" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dashboard.projects-title" -msgstr "Arụmarụ" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.remove-account" -msgstr "Chọọ iwepu ebe Ntinye ihe gị ?" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.remove-shared" -msgstr "Wepụ dị ka ọba ederede nkekọrịta" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.save-settings" -msgstr "Dokwa ntọala" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.search-placeholder" -msgstr "Chọọ…" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.searching-for" -msgstr "Na-achọ “%s“…" - -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.select-ui-language" -msgstr "Họrọ asụsụ UI" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.success-duplicate-project" -msgstr "E megharịala arụmarụ gị nke ọma\"" - -#: src/app/main/ui/dashboard/grid.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-move-file" -msgstr "E wepula ederede gị nke ọma\"" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.success-move-project" -msgstr "E bupula arụmarụ gị nke ọma" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-info" -msgstr "Ozi otu" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-members" -msgstr "Ndị otu" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-projects" -msgstr "Arụmarụ otu" - -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.theme-change" -msgstr "Isiokwu UI" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.title-search" -msgstr "Chọọ risọltụ gasị" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.type-something" -msgstr "Pinye ịchọ risọltụ" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.unpublish-shared" -msgstr "Ọba ederede ebiputaghị" - -#: src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs -msgid "dashboard.update-settings" -msgstr "Hazie ntọala" - -msgid "dashboard.webhooks.active" -msgstr "Dị gara gara" - -msgid "dashboard.webhooks.active.explain" -msgstr "Mgbe a kpọlitere nkọ a, ọ ga-Ezipụta nkọwa emume n'uju" - -msgid "dashboard.webhooks.content-type" -msgstr "Ụdị ndịna" - -msgid "dashboard.webhooks.create" -msgstr "Mepe nko - ududọ" - -msgid "dashboard.webhooks.create.success" -msgstr "E mepere nko-ududọ nke ọma ." - -msgid "dashboard.webhooks.description" -msgstr "" -"Nko-ududọ bụ ụzọ dị mfe ga-ekwe ka ebe ududọ na apps ndị ọzọ nweta ozi Mgbe " -"ụfọdụ emume na eme n'ite mkpịsị . Anyị ga e ziga OZI arịrịọ nwe URLs ọ bụla " -"ị nwetara" - -msgid "dashboard.webhooks.empty.add-one" -msgstr "Pịa mpị \"Tinye nko-ududọ \" ịtinye otu ." - -msgid "dashboard.webhooks.empty.no-webhooks" -msgstr "E nweghị Nko-ududọ e ebere ruo ugbu a ." - -msgid "dashboard.webhooks.update.success" -msgstr "Ahazigharịrị nko-ududọ nke ọma ." - -#: src/app/main/ui/settings.cljs -msgid "dashboard.your-account-title" -msgstr "Ebe Ntinye ihe gị" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.your-email" -msgstr "Ozi-n" - -#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.your-penpot" -msgstr "Ite mkpịsị. gị" - -#: src/app/main/ui/alert.cljs -msgid "ds.alert-ok" -msgstr "Okay" - -#: src/app/main/ui/alert.cljs -msgid "ds.alert-title" -msgstr "Gee ntị" - -#: src/app/main/ui/confirm.cljs -msgid "ds.confirm-cancel" -msgstr "Kagbuo" - -#: src/app/main/ui/confirm.cljs -msgid "ds.confirm-ok" -msgstr "Okay" - -#: src/app/main/ui/confirm.cljs, src/app/main/ui/confirm.cljs -msgid "ds.confirm-title" -msgstr "Ọ doro gị anya ?" - -msgid "errors.auth.unable-to-login" -msgstr "Ọ dị ka enyochaghị gị ma ọ bụ na oge agwụla ." - -msgid "errors.bad-font" -msgstr "E nweghị ike bugo %s mkpụrụ edide" - -msgid "errors.bad-font-plural" -msgstr "E nweghị ike bugo %s mkpụrụ edide" - -msgid "errors.cannot-upload" -msgstr "E nweghị ike ị ugo ederede ." - -#: src/app/main/data/workspace.cljs -msgid "errors.clipboard-not-implemented" -msgstr "Your browser cannot do this operation" - -#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs -msgid "errors.email-already-exists" -msgstr "E jibuola ozi - n rụọ ọrụ" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.email-already-validated" -msgstr "Aha ozi-n adabala." - -msgid "errors.email-as-password" -msgstr "Ị nweghị ike iji aha ozi-n gị dị ka akara mpịbanye" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.email-has-permanent-bounces" -msgstr "Ozi-n «%s» nwere ọtụtụ ozi nkọwa mbịaghachigide." - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs -msgid "errors.email-invalid" -msgstr "Debanye aha ozi-n dabara adaba" - -#: src/app/main/ui/settings/change_email.cljs -msgid "errors.email-invalid-confirmation" -msgstr "Ozi-n nnabata ga-adabrịrị" - -msgid "errors.email-spam-or-permanent-bounces" -msgstr "E nwela ozi nkọwa na ozi-n«%s» dị ka ozi abaghị uru ma ọ bụ mbịaghachigide." - -#: src/app/main/errors.cljs -msgid "errors.feature-mismatch" -msgstr "" -"Ọ dị ka ị na-emepe ederede nwere a gwara naọ gara aga '%s' mana ihu " -"itemkpịsị gị akwadoghị ya ma ọ bụ gosiri ọ gaghị aga." - -#: src/app/main/errors.cljs -msgid "errors.feature-not-supported" -msgstr "Akwadoghị agwara '%s' ." - -#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.generic" -msgstr "Ihe ezighị ezi emela ." - -#: src/app/main/ui/components/color_input.cljs -msgid "errors.invalid-color" -msgstr "Agwụgwara adabaghị" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.invite-invalid" -msgstr "kpọọ òkù adabaghị" - -msgid "errors.invite-invalid.info" -msgstr "This invite might be canceled or may be expired." - -#: src/app/main/ui/auth/login.cljs -msgid "errors.ldap-disabled" -msgstr "LDAP mbinye aka agaghị ." - -#: src/app/main/errors.cljs -msgid "errors.max-quote-reached" -msgstr "I ruola '%s' ole a chọrọ . Chọọ enyemaka nkwado ." - -#: src/app/main/data/workspace/persistence.cljs -msgid "errors.media-too-large" -msgstr "Onyinyo a ebuka ibu maka itinye ." - -#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs -msgid "errors.media-type-mismatch" -msgstr "Dị ka ihe dị na onyinyo adabaghị na mgbatị ederede." - -#: src/app/main/ui/dashboard/team.cljs -msgid "errors.member-is-muted" -msgstr "" -"Nchịkọta gị nwere ozi-n mechiri emechi (akụkọ ozi-n adịghị mma ma ọ bụ " -"nwere oké bịaghachiri )." - -msgid "errors.profile-blocked" -msgstr "A gbachiri nchịkọta agbachi" - -#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.profile-is-muted" -msgstr "" -"Nchịkọta gị lnwere ozi-n mechiri emechi(akụkọ ozi-n adịghị mma ma ọ bụ " -"nwere oké bịaghachiri ).\")." - -#: src/app/main/ui/auth/register.cljs -msgid "errors.registration-disabled" -msgstr "Ndebanye merụrụ emerụ ugbu a." - -msgid "errors.team-leave.insufficient-members" -msgstr "Ndị otu ezughị okè ịhapụ otu, ọ nyere ike na ị chọrọ ihichapụ ya ." - -msgid "errors.team-leave.member-does-not-exists" -msgstr "Onye otu ị na-achọ inye adịghị ." - -msgid "errors.team-leave.owner-cant-leave" -msgstr "O wee enweghị ike ịhapụ otu, ị ga-enyegharịrị ọrụ onwee." - -#: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "errors.unexpected-error" -msgstr "Ndejo atughị anya ya pụtara ." - -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.unexpected-token" -msgstr "Ọdịmara amaghị ama" - -msgid "errors.webhooks.connection" -msgstr "Mmejọ, e nwetaghị URL" - -msgid "errors.webhooks.invalid-uri" -msgstr "URL enweghị nkwado ." - -msgid "errors.webhooks.ssl-validation" -msgstr "Mmejọ na nkwado SSL ." - -msgid "errors.webhooks.timeout" -msgstr "Oge ezuola" - -#: src/app/main/ui/auth/login.cljs -msgid "errors.wrong-credentials" -msgstr "Ozi-na ma ọ bụ akara mpịbanye adịghị mma ." - -#: src/app/main/ui/settings/password.cljs -msgid "errors.wrong-old-password" -msgstr "Akara mpịbanye ochie adịghị mma" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.description" -msgstr "Nkọwa" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-go-to" -msgstr "Gaa n'ebe ite mkpịsị" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-subtitle1" -msgstr "" -"Obi dị anyị añụrị ịhụ gị ebea. Ọ bụrụ na enyemaka dị mkpa , biko chọọ tupu " -"ị ịga ozi ." - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-title" -msgstr "Ogbe Ite mkpịsị" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.subject" -msgstr "Isiokwu" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.subtitle" -msgstr "" -"Biko, kọwaa ihe isi ozi-n gị , kwuo ma ọ bụ nsogbu , ncheputara ma ọ bụ " -"ekaenyeghị. Onye otu anyị ga-azaghachi ozugbo ọ nwere ike ." - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.title" -msgstr "Ozi- n" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.twitter-go-to" -msgstr "Gaa na Twita" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.twitter-subtitle1" -msgstr "Ebe inyere gị aka n'ajụjụ nkà gị ." - -#: src/app/main/ui/settings/password.cljs -msgid "generic.error" -msgstr "Mmehie apụtala" - -#: src/app/main/ui/inspect/attributes/blur.cljs -msgid "inspect.attributes.blur" -msgstr "Inyogo" - -#: src/app/main/ui/inspect/attributes/blur.cljs -msgid "inspect.attributes.blur.value" -msgstr "Uru" - -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.hex" -msgstr "HEX" - -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.hsla" -msgstr "HSLA" - -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.rgba" -msgstr "RGBA" - -#: src/app/main/ui/inspect/attributes/fill.cljs -msgid "inspect.attributes.fill" -msgstr "Wunye" - -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.download" -msgstr "Butuo onyinyo nsina" - -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.height" -msgstr "Ogo" - -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.width" -msgstr "Uhie" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout" -msgstr "Mpụta" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.height" -msgstr "Ogo" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.left" -msgstr "Aka ekpe" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.rotation" -msgstr "Ntụgharị" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.top" -msgstr "Elu" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.width" -msgstr "Uhie" - -#: src/app/main/ui/inspect/attributes/shadow.cljs -msgid "inspect.attributes.shadow" -msgstr "Oninyo" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.size" -msgstr "Nhazi na ọnọdụ" - -#: src/app/main/ui/inspect/attributes/stroke.cljs -msgid "inspect.attributes.stroke" -msgstr "Akara" - -#, permanent -msgid "inspect.attributes.stroke.alignment.center" -msgstr "Etiti" - -#, permanent -msgid "inspect.attributes.stroke.alignment.inner" -msgstr "Ime" - -#, permanent -msgid "inspect.attributes.stroke.alignment.outer" -msgstr "Ezi" - -msgid "inspect.attributes.stroke.style.dotted" -msgstr "Atụrụ kpọm kpọm" - -msgid "inspect.attributes.stroke.style.mixed" -msgstr "Gwakọtara" - -msgid "inspect.attributes.stroke.style.none" -msgstr "Ncha ncha" - -msgid "inspect.attributes.stroke.style.solid" -msgstr "Akpụrụka" - -#: src/app/main/ui/inspect/attributes/stroke.cljs -msgid "inspect.attributes.stroke.width" -msgstr "Uhie" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography" -msgstr "Akara nkụpụta" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-family" -msgstr "Ezinụlọ mkpụrụ edide" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-size" -msgstr "Nhazi mkpụrụ edide" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.letter-spacing" -msgstr "Ndesa mkpụrụ edemede" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.line-height" -msgstr "Ogo akara" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.text-decoration" -msgstr "Nkwazi ederede" - -msgid "inspect.attributes.typography.text-decoration.none" -msgstr "Ncha ncha" - -msgid "inspect.attributes.typography.text-decoration.strikethrough" -msgstr "Kụọgafee" - -msgid "inspect.attributes.typography.text-decoration.underline" -msgstr "N'okpuru" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.text-transform" -msgstr "Mgbanwe ederede" - -msgid "inspect.attributes.typography.text-transform.none" -msgstr "None" - -msgid "inspect.attributes.typography.text-transform.titlecase" -msgstr "Mkpụrụ edemede isiokwu" - -msgid "inspect.attributes.typography.text-transform.uppercase" -msgstr "Mkpụrụ edemede nnukwu" - -msgid "inspect.empty.help" -msgstr "" -"Ị chọọ ị ma ihe ndị ọzọ maka nnyocha esereese, gaa n'ebe enyemaka ite " -"mkpịsị r" - -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.code" -msgstr "Akara" - -msgid "inspect.tabs.code.selected.circle" -msgstr "Okirikiri" - -msgid "inspect.tabs.code.selected.component" -msgstr "Ndịna" - -msgid "inspect.tabs.code.selected.curve" -msgstr "Nrọgọ" - -msgid "inspect.tabs.code.selected.frame" -msgstr "Ogwe." - -msgid "inspect.tabs.code.selected.group" -msgstr "Otu" - -msgid "inspect.tabs.code.selected.image" -msgstr "Onyinyo" - -msgid "inspect.tabs.code.selected.mask" -msgstr "kpuchie" - -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.code.selected.multiple" -msgstr "%s a họrọ" - -msgid "inspect.tabs.code.selected.path" -msgstr "Ụzọ" - -msgid "inspect.tabs.code.selected.rect" -msgstr "Rekụtagụlụ" - -msgid "inspect.tabs.code.selected.svg-raw" -msgstr "SVG" - -msgid "inspect.tabs.code.selected.text" -msgstr "Ederede" - -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.info" -msgstr "Ozi" - -#: src/app/main/ui/workspace/header.cljs -msgid "label.shortcuts" -msgstr "Ụzọ mkpirisi" - -msgid "labels.accept" -msgstr "Nabata" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.access-tokens" -msgstr "Nweta ọdịmara gasị" - -msgid "labels.active" -msgstr "Gara gara" - -msgid "labels.add-custom-font" -msgstr "Tinye mkpụrụ edide a haziri ahazi" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.admin" -msgstr "Ọchịkwa" - -#: src/app/main/ui/workspace/comments.cljs -msgid "labels.all" -msgstr "Ha niile" - -msgid "labels.and" -msgstr "na" - -msgid "labels.back" -msgstr "Azụ" - -#: src/app/main/ui/static.cljs -msgid "labels.bad-gateway.main-message" -msgstr "Ajọ ụzọ mbanye" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.cancel" -msgstr "Kagbuo" - -msgid "labels.close" -msgstr "Megbuo" - -#: src/app/main/ui/dashboard/comments.cljs -msgid "labels.comments" -msgstr "Okwu gasị" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.community" -msgstr "Ogbe" - -#: src/app/main/ui/settings/password.cljs -msgid "labels.confirm-password" -msgstr "Nabata akara mpịbanye" - -msgid "labels.continue" -msgstr "Ga n'ihu" - -msgid "labels.continue-with" -msgstr "Gaa n'ihu" - -msgid "labels.continue-with-penpot" -msgstr "I Nwere Ike ịganihu" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.copy-invitation-link" -msgstr "Dọrọ njikọ" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "labels.create" -msgstr "Meputa" - -#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs -msgid "labels.create-team" -msgstr "Mepee otu ọhụrụ" - -msgid "labels.custom-fonts" -msgstr "mkpụrụ edide a haziri" - -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.delete" -msgstr "Hichaa" - -#: src/app/main/ui/comments.cljs -msgid "labels.delete-comment" -msgstr "Hichaa okwu" - -#: src/app/main/ui/comments.cljs -msgid "labels.delete-comment-thread" -msgstr "Hichapụ eri" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.delete-invitation" -msgstr "Hichapụ oku" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.delete-multi-files" -msgstr "Hichapụ ederede %s" - -#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.drafts" -msgstr "Ndesita" - -#: src/app/main/ui/comments.cljs -msgid "labels.edit" -msgstr "Dezie" - -msgid "labels.edit-file" -msgstr "Dezie ederede" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.editor" -msgstr "Odezi" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.expired-invitation" -msgstr "Mebiri" - -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.feedback-disabled" -msgstr "Nzaghachi merụrụ emeru" - -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.feedback-sent" -msgstr "Zigara nzaghachi" - -msgid "labels.font-family" -msgstr "Ezinụlọ mkpụrụ edide" - -msgid "labels.font-providers" -msgstr "Ndị na-enye mkpụrụ edide" - -msgid "labels.font-variants" -msgstr "Ụdịdị gasị" - -msgid "labels.fonts" -msgstr "Mkpụrụ edide gasị" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.github-repo" -msgstr "Ọ a Github" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.give-feedback" -msgstr "Nye nzaghachi" - -msgid "labels.go-back" -msgstr "Gaa azụ" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.help-center" -msgstr "Ebe enyemaka" - -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.hide-resolved-comments" -msgstr "Zoo nkwupụta e kpebiri" - -msgid "labels.inactive" -msgstr "Arụghị ọrụ" - -msgid "labels.installed-fonts" -msgstr "Mkpụrụ edide gasị ewubere" - -#: src/app/main/ui/static.cljs -msgid "labels.internal-error.desc-message" -msgstr "Ihe ọjọọ mere . Biko, rụgharịa ọrụ ma ọ bụ na nsogbu aka dị , kpọọ nkwado ." - -#: src/app/main/ui/static.cljs -msgid "labels.internal-error.main-message" -msgstr "Nrụjọ ndịnime" - -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.invitations" -msgstr "Akwụkwọ ịkpọ ọkụ gasị" - -#: src/app/main/ui/settings/options.cljs -msgid "labels.language" -msgstr "Asụsụ" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.libraries-and-templates" -msgstr "Ọba ederede na Ndebiri gasị" - -msgid "labels.log-or-sign" -msgstr "Banye ma ọ bụ debanye" - -#: src/app/main/ui/settings.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.logout" -msgstr "Pụọ" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.member" -msgstr "Onye otu" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.members" -msgstr "Ndị otu" - -#: src/app/main/ui/settings/password.cljs -msgid "labels.new-password" -msgstr "Akara mpịbanye ọhụrụ" - -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs -msgid "labels.no-comments-available" -msgstr "E jidere unu niile! Ngosi nkwupụta ọhụrụ ga-apụta ebe a ." - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.no-invitations" -msgstr "E nweghị ọkụ na-echere" - -#: src/app/main/ui/dashboard/team.cljs -#, markdown -msgid "labels.no-invitations-hint" -msgstr "Pịa mpị**kpọọ ndị mmadụ ** ịkpọọ ndị mmadụ n'otu a." - -#: src/app/main/ui/static.cljs -msgid "labels.not-found.desc-message" -msgstr "Ihu akwụkwọ a nwere ike ọ gaghị adị ma ọ bụ ị nweghị ikikere inweta ya ." - -#: src/app/main/ui/static.cljs -msgid "labels.not-found.main-message" -msgstr "E wuu !" - -#: src/app/main/ui/settings/password.cljs -msgid "labels.old-password" -msgstr "Akara mpịbanye ochie" - -#: src/app/main/ui/workspace/comments.cljs -msgid "labels.only-yours" -msgstr "Sọọsọ nke gị" - -msgid "labels.or" -msgstr "ma ọ bụ" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.owner" -msgstr "Onye nwe" - -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.password" -msgstr "Akara mpịbanye" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.pending-invitation" -msgstr "Na-echere" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.profile" -msgstr "Nchịkọta" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.projects" -msgstr "Ọrụ gasị" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.release-notes" -msgstr "Wepụta ndetu" - -#: src/app/main/ui/workspace.cljs -msgid "labels.reload-file" -msgstr "Bugharịa ederede" - -#: src/app/main/ui/workspace/libraries.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.remove" -msgstr "Wepu" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.remove-member" -msgstr "Wepụ onye otu" - -#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.rename" -msgstr "Nyegharịa aha" - -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.rename-team" -msgstr "Nyegharịa otu" - -#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs -msgid "labels.retry" -msgstr "Nwagharịa" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.role" -msgstr "Ọrụ" - -msgid "labels.save" -msgstr "Dokwa" - -msgid "labels.search-font" -msgstr "Chọọ mkpụrụ edide" - -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.send" -msgstr "Ziga" - -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.sending" -msgstr "Na-eziga…" - -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.settings" -msgstr "Ntọala" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.shared-libraries" -msgstr "Ọba ederede" - -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.show-all-comments" -msgstr "Gosi nkwupụta niile" - -msgid "labels.show-comments-list" -msgstr "Gosi ndepụta nkwupụta gasị" - -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.show-your-comments" -msgstr "Gosi nanị nkwupụta gị gasị" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.status" -msgstr "Ọnọdụ" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.tutorials" -msgstr "Nkuzi" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.unpublish-multi-files" -msgstr "%s ederede ebipụtaghị" - -#: src/app/main/ui/settings/profile.cljs -msgid "labels.update" -msgstr "Hazigharịa" - -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.update-team" -msgstr "Hazigharịa otu" - -msgid "labels.upload" -msgstr "Bugo" - -msgid "labels.upload-custom-fonts" -msgstr "Bugo ederede gasị ahaziri" - -msgid "labels.uploading" -msgstr "Na-ebugo…" - -msgid "labels.view-only" -msgstr "Sọọsọ nkiri" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.viewer" -msgstr "Ndị nkiri" - -msgid "labels.webhooks" -msgstr "Nko-ududọ" - -#: src/app/main/ui/comments.cljs -msgid "labels.write-new-comment" -msgstr "Dee nkwupụta ọhụrụ" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.you" -msgstr "(gị)" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.your-account" -msgstr "Akara mbata gị" - -#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs -msgid "media.loading" -msgstr "Na-ebupụta onyinyo …" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"E nweghị ihe dị n'ọba ederede gị. \"Ozugbo e tinyere dị ka ọba ederede " -"ekekoritara, ngwongwo ị mepere ga a dị maka iji ya rụọ ọrụ n'edemede gị ndị " -"ọzọ niile. Ọ kara gị obi na ị chọrọ ị bipụta ya?" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.accept" -msgstr "Tinye ka ọba ederede Kekoritara" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.hint" -msgstr "" -".Ozugbo e tinyere dị ka ọba ederede ekekoritara, ngwongwo ị mepere ga a dị " -"maka iji ya rụọ ọrụ n'edemede gị ndị ọzọ niile." - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.message" -msgstr "Tinye “%s” dị ka ọba ederede ekekoritara" - -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.big-nudge" -msgstr "nnukwu nkpatụ" - -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.submit" -msgstr "Gbanwee ozi nl" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.expiration-date.label" -msgstr "Ụbọchị mmebi" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.label" -msgstr "Aha" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.submit-label" -msgstr "Create token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.title" -msgstr "Mepụta ọdịmara nweta" - -msgid "modals.create-webhook.submit-label" -msgstr "Mebe nko - ududo" - -msgid "modals.create-webhook.title" -msgstr "Mebe nko-ududo" - -msgid "modals.create-webhook.url.label" -msgstr "Isi ozi URL" - -msgid "modals.create-webhook.url.placeholder" -msgstr "https://ọmụmaaụ.com/ozi anabara" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.accept" -msgstr "Hichapụ ọdịmara" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.title" -msgstr "Hichapụ ọdịmara" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.cancel" -msgstr "Kagbuo ma dobe ebe ntinye ihe m" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.confirm" -msgstr "Eee, hichapụ ebe ntinye ihe m" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.info" -msgstr "" -"Site na iwepu ebe ntinye ihe gị, arụmarụ gị gasị ugbu a naebe nchekwa " -"ga-efu ." - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.title" -msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ ebe ntinye ihe gị?" - -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.accept" -msgstr "Hichapụ mkparịtaụka" - -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.message" -msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ mkparịtaụka a?" - -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.title" -msgstr "Hichaa mkparịtaụka" - -msgid "modals.delete-component-annotation.message" -msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ nkọwa ?" - -msgid "modals.delete-component-annotation.title" -msgstr "Hichapụ nkọwa" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.accept" -msgstr "Hichapụ ederede" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.message" -msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ ederede ?" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.title" -msgstr "Na-ehichapụ ederede" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-multi-confirm.title" -msgstr "Na-ehichapụ ederede %s" - -msgid "modals.delete-font.title" -msgstr "Na-ehichapụ mkpụrụ edide" - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "modals.delete-page.body" -msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ ihu akwụkwọ a?" - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "modals.delete-page.title" -msgstr "Hichapụ ihu akwụkwọ" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.accept" -msgstr "Hichapụ arụmarụ" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.message" -msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ arụmarụ ?" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.title" -msgstr "Hichapụ arụmarụ" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.accept" -msgstr "Hichapụ otu" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.message" -msgstr "" -"Ọ kara gị obi na ị chọrọ ị hichapụ otu? ARỤMARỤ na ederede nille gasị " -"gbasara otú ga-ehichapụ kpam kpam" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.title" -msgstr "Na-ehichapụ otu" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.accept" -msgstr "Hichapụ onye otu" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.message" -msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ onye otu n'otu a?" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.title" -msgstr "Hichapụ onye otu" - -msgid "modals.delete-webhook.accept" -msgstr "Hichapụ nko-ududọ" - -msgid "modals.delete-webhook.message" -msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ nko-ududọ ?" - -msgid "modals.delete-webhook.title" -msgstr "Na-ehichapụ nko-ududo" - -msgid "modals.edit-webhook.submit-label" -msgstr "Dezie nko-ududo" - -msgid "modals.edit-webhook.title" -msgstr "Dezie nko-ududo" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.invite-member-confirm.accept" -msgstr "Ziga akwụkwọ ozi mkpọta" - -msgid "modals.invite-member.emails" -msgstr "Ozi-n gasị, Rịkọm e kewara" - -msgid "modals.invite-member.repeated-invitation" -msgstr "Ụfọdụ ozi n sitere na ndị ugbu a A gaghị e ịga akwụkwọ ozi mkpọta ha" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.invite-team-member.title" -msgstr "kpọta ndị otu n'otu a" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-close-confirm.hint" -msgstr "" -"Etu ị bụ sọọ otu onye otu , a ga e hichapụ otu a ya n'ọrụ na ederede ya " -"gasịits projects and files." - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-close-confirm.message" -msgstr "Ọ kara gị obi na ị chọrọ ịhapụ otu %s ?" - -msgid "modals.leave-and-reassign.forbidden" -msgstr "" -"I nweghị ike ịhapụ otu ma ọ bụrụ na e nweghị onye otu ọzọ akwalitere ga na " -"onye nwe ya . Ị nwere ike chọọ ị hichapụ otu ." - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.hint1" -msgstr "" -"Gị bụ onye nwee otu a, . Biko, họrọ onye otu ọzọ maka ịkwalite gana onye " -"nweeya tupu ị hapụ ." - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.promote-and-leave" -msgstr "Kwalite ma hapụ" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.select-member-to-promote" -msgstr "Họrọ onye otu maka ịkwalite" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.title" -msgstr "Tupu ị hapụ" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-confirm.accept" -msgstr "Hapụ otu" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-confirm.message" -msgstr "Ọ kara gị obi na ịchọrọ ịhapụ otu ?" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-confirm.title" -msgstr "Nhapụ otu" - -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.nudge-title" -msgstr "ọnụ ọgụgụ nkpatụ" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.hint" -msgstr "" -"Ọ bụrụ na Inyefe onwunwe , ị ga-agbanwe ọrụ gị ka ọchikwa, ụfọdụ ikikere " -"n'isi ndị otu na-efu " - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.message" -msgstr "" -"G bụ onye nwe otu a ugbu a, Ọ doro gị anya na ị chọrọ ime%s Onye ọhụrụ nwe " -"otu a?" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.title" -msgstr "Onye nwe otu ọhụrụ" - -msgid "modals.publish-empty-library.accept" -msgstr "Biputa" - -msgid "modals.publish-empty-library.message" -msgstr "Your library is empty. Are you sure you want to publish it?" - -msgid "modals.publish-empty-library.title" -msgstr "Biputa ọba ederede efu" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.accept" -msgstr "Wepụ dịka ọba ederede ekekoritara" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.hint" -msgstr "" -"Ozugbo e wepụrụ dị ka ọba ederede ekekoritara, ọba ederede ederede a " -"ga-akwụsị dị n'ime ederede ndị ọzọ gasị e ji rụọ ọrụ" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.message" -msgstr "Wepu“%s” dịka ọba ederede ekekoritara" - -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.small-nudge" -msgstr "kpatụ obere" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component-in-bulk.hint" -msgstr "" -"Ị na-achọ ịhazigharị ngwa gasị n'ọba ederede ekekoritara. Ihe nwere ike " -"imetuta ederede ndị ọzọ ji ya arụ ọrụ" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component-in-bulk.message" -msgstr "Update components in a shared library" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.accept" -msgstr "Hazigharịa" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.cancel" -msgstr "Kagbuo" - -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "A new version is available, please refresh the page" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "notifications.profile-deletion-not-allowed" -msgstr "I nweghị ike ị hichapụ nchịkọta gị . Nyegharịa ya ndị otu gị tupu ị ganihu" - -#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs -msgid "notifications.profile-saved" -msgstr "E dọkwara nchịkọta nke ọma" - -#: src/app/main/ui/settings/change_email.cljs -msgid "notifications.validation-email-sent" -msgstr "Ozi nnyocha n zigara na%s. Mepe ozi n gị !" - -msgid "onboarding-v2.before-start.desc1" -msgstr "" -"I kwesịrị ịma na e nwere ọtụtụ ihe e ji arụ ọrụ dị inwere gị iji bido n'ite " -"mkpịsị , dị ka ntuziaka onye ọrụ na ọwa YouTube anyị l." - -msgid "onboarding-v2.before-start.desc2" -msgstr "" -"Ozi banyere etu esi eji ite mkpịsị arụ ọrụ uju. Site na ime atụtụ ga na " -"nhazi ma ọ bụ nkesa esereese ." - -msgid "onboarding-v2.before-start.desc2.title" -msgstr "Mkpanaka" - -msgid "onboarding-v2.before-start.desc3" -msgstr "Ị nwere ike ikiri amụmamụ anyị na amụmamụ nke ndị obodo anyị mere." - -msgid "onboarding-v2.before-start.desc3.title" -msgstr "Amụmamụ onyonyo" - -msgid "onboarding-v2.before-start.title" -msgstr "Tupu i bido" - -msgid "onboarding-v2.newsletter.desc" -msgstr "" -"Debanye aha n'akụkụ ozi ite mkpịsị iji nọrọ gam gam na ngwa ahịa aaga n'ihu " -"mwulite na akụkọ ụwa." - -msgid "onboarding-v2.newsletter.news" -msgstr "" -"Zitere m akụkọ banyere ite mkpịsị (ozi edemonye gasị, Nkụzi ihe onyonyo, " -"nkirigarị...)." - -msgid "onboarding-v2.newsletter.privacy1" -msgstr "Anyị na-eche banyere nzochi onwe, ebe a inwere ike ịgụ..... anyị " - -msgid "onboarding-v2.newsletter.privacy2" -msgstr "" -"Anyị ga e zitere ozi n bara uru sọọsọ . Ị nwere ike idepu aha oge ọ bụla " -"site na njikọ ndepu aha n'akwụkwọ ozi gasị anyị ọ bụla ." - -msgid "onboarding-v2.newsletter.updates" -msgstr "" -"Zitere m nhazigharị ngwa ahịa (a gwara ọhụrụ gasị , ihe ndị ewepụta gasịrị " -", ndo ị gasị..)." - -msgid "onboarding-v2.welcome.desc1" -msgstr "" -"Ite mkpịsị bụ nsina ghere oghe ma bụrụ nke Kaleidos nakwa ndị obodo rụrụ " -"Ebe ọtụtụ mmadụ nyewegoroa onwe anyị aka..Onye ọ bụla nwere arụkọrịtasite " -"na :" - -msgid "onboarding-v2.welcome.desc2" -msgstr "" -"Oghere ọha na ndị obodo niile na ndị otu ite mkpịsị kpọmkwem ịmụ, kesa ma " -"kọwaa maka ite mkpịsị , ọnọdụ ya ugbu a na ọdịnihu ya" - -msgid "onboarding-v2.welcome.desc3.title" -msgstr "Ntụziaka inye aka" - -msgid "onboarding-v2.welcome.title" -msgstr "Nabata ite mkpịsị !" - -msgid "onboarding.choice.team-up.create-team-desc" -msgstr "I nye ha otu gị aha , I nwere ike ị kpọta ndị mmadụ ka ha sonye." - -msgid "onboarding.choice.team-up.create-team-placeholder" -msgstr "Denye aha otu" - -msgid "onboarding.choice.team-up.invite-members" -msgstr "Kpọta ndị otu" - -msgid "onboarding.choice.team-up.invite-members-info" -msgstr "" -"Cheta ka itinye onye ọ bụla Ndị nzụlite, ndị nrụpụta, ndị njikwa... dị iche " -"iche adds up :)" - -msgid "onboarding.choice.team-up.roles" -msgstr "kpọta tinye ọrụ :" - -msgid "onboarding.newsletter.accept" -msgstr "Eee, debanye aha" - -msgid "onboarding.newsletter.acceptance-message" -msgstr "E zigala arịrịọ ndenye aha gị , anyị ga-ezi tara gị ozi - n iji nabata ya" - -msgid "onboarding.newsletter.title" -msgstr "Chọrọ inweta ozi ite mkpịsị ?" - -msgid "onboarding.team-modal.create-team" -msgstr "Mepụta otu" - -msgid "onboarding.team-modal.create-team-desc" -msgstr "" -"Otu ga-ekwe gị na ndị ọzọ ji ite mkpịsị arụ ọrụ ịrụkọta n'otu ederede na " -"arụmarụ gasị ." - -msgid "onboarding.team-modal.create-team-feature-1" -msgstr "Ederede na arụmarụ na enweghị njedebe" - -msgid "onboarding.team-modal.create-team-feature-2" -msgstr "Mbipụta ọtụtụ egwuregwu" - -msgid "onboarding.team-modal.create-team-feature-3" -msgstr "Njikwa ọrụ" - -msgid "onboarding.team-modal.create-team-feature-4" -msgstr "Ndị otu enweghị njedebe" - -msgid "onboarding.team-modal.create-team-feature-5" -msgstr "% narị efu!" - -msgid "onboarding.templates.subtitle" -msgstr "Ụfọdụ ndebiri nọ ebe a." - -msgid "onboarding.templates.title" -msgstr "Bido osise" - -#: src/app/main/ui/auth/recovery.cljs -msgid "profile.recovery.go-to-login" -msgstr "Gaa na mbanye" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "Kedu ngwa ọrụ nse ị ka mara eji arụ ọrụ ?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "Iri na otu ruo na iri atọ" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "Abụọ ruo na iri" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "Iri atọ na otu ruo na iri ise" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "Ọtụtụ" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Ngwa nrụkọrịta ọrụ Adobe" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Kanva" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "Kedụ ka Ị ga-esi kọwaa ọfụma ihe ndị ị hụrụ ịrụ ọrụ na..." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "Onye nrụpụta" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "Chọpụta ihe ndị ọzọ gbasara ite mkpịsị" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Ihe onyonyo" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Onye malitere /VP" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "Onye nwere onwe ya" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "Weta akara site n'arụmarụ otu m " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "... Nhazi ihu nse, uru ahụmụzọ, usoro imewe , etc." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "Mmakpo" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "Hapụ Nzaghachi maka arụmarụ ndị otu m" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "Ka anyị bido!" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "Onye njikwa ngwaahịa ma ọ bụ arụmarụ" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Ịzụ ahịa" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "Karịrị iri ise" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.never-used-a-tool" -msgstr "E jibeghị m ngwa ọrụ nse rụọ ọrụ mbụ" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "Ọzọ" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "Onweghị" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "Ọzọ (zipụta)" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "A na m arụ ọrụ n'arụmarụ onwe" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "Kedụ ka ị sị akwado iji ite mkpịsị arụ ọrụ ?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "Gịnị bụ ọrụ gị ?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "Họrọ nhọ" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Eserese" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.some" -msgstr "Ụfọdụ" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "Bido" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "Bido ịrụ ọrụ m" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "Nwata akwụkwọ ma ọ bụ onye nkụzi" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "Kedụ ka otu gị ha?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "Nwale ite mkpịsị ịhụ ma ọ bụ ihe ndaba maka otu " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "Gbalịa mee mbụ tupu ị jiri ite mkpịsị rụọ ọrụ n'ebe ọ dị" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "... waya etiti , ndị ọrụ njem na eruba , osisi ngagharị gasị , dgz." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "Na-arụ ọrụ n'echiche ihe" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"Nzaghachi gị ga-enyere anyị aka ịghọta ihe agwa na mmasị gị bụ Ka anyị ga " -"na-eme Ite mkpịsị ụdị ngwa ọrụ bara uru dị ụtọ ." - -msgid "shortcuts.bring-backward" -msgstr "Wega ebe azụ" - -msgid "shortcuts.duplicate" -msgstr "Mkpị" - -msgid "shortcuts.letter-spacing-inc" -msgstr "Leta mmụba oghere" - -msgid "shortcuts.paste" -msgstr "Nyado" - -msgid "shortcuts.text-align-left" -msgstr "Dozie akaekpe" - -msgid "viewer.breaking-change.message" -msgstr "Ndo" - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.delete" -msgstr "Kachapụ" - -msgid "workspace.focus.focus-mode" -msgstr "Umezi nlekwasa anya" - -msgid "workspace.focus.focus-on" -msgstr "Gbanye nlekwasa anya" - -msgid "workspace.shape.menu.create-multiple-components" -msgstr "Mee ọtụtụ akọrọngwa ga" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.color-palette" -msgstr "Agba[ Palette (Na narị)" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.there-are-updates" -msgstr "E nwegasịrị nhazizigharị nime ọba ederede ga e kere eke" diff --git a/frontend/translations/lv.po b/frontend/translations/lv.po index 4f6b9ab4f..72c325638 100644 --- a/frontend/translations/lv.po +++ b/frontend/translations/lv.po @@ -1,16 +1,16 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-19 08:03+0000\n" +"PO-Revision-Date: 2024-01-06 22:06+0000\n" "Last-Translator: Edgars Andersons \n" -"Language-Team: Latvian " -"\n" +"Language-Team: Latvian \n" "Language: lv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 " -"<= 19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" -"X-Generator: Weblate 5.5-dev\n" +"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= " +"19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" +"X-Generator: Weblate 5.4-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -55,11 +55,11 @@ msgstr "Pilns vārds" #: src/app/main/ui/auth/register.cljs msgid "auth.login-here" -msgstr "Pieteikties šeit" +msgstr "Ienākt šeit" #: src/app/main/ui/auth/login.cljs msgid "auth.login-submit" -msgstr "Pieteikties" +msgstr "Ienākt" #: src/app/main/ui/auth/login.cljs msgid "auth.login-title" @@ -179,13 +179,6 @@ msgstr "" "Ar jauna konta izveidošanu tiek piekrists mūsu pakalpojuma noteikumiem un " "privātuma nosacījumiem." -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Ar jauna konta izveidošanu tiek piekrists mūsu [pakalpojuma " -"noteikumiem](%s) un [privātuma nosacījumiem](%s)." - #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "Mēs esam nosūtījuši apstiprinājuma e-pasta ziņojumu uz" @@ -201,7 +194,8 @@ msgid "common.share-link.all-users" msgstr "Visi Penpot lietotāji" msgid "common.share-link.confirm-deletion-link-description" -msgstr "Vai tiešām noņemt šo saiti? Noņemot to, saite vairs nebūs pieejama nevienam" +msgstr "" +"Vai tiešām noņemt šo saiti? Noņemot to, saite vairs nebūs pieejama nevienam" msgid "common.share-link.current-tag" msgstr "(pašreizējais)" @@ -267,7 +261,8 @@ msgstr "Apvienojieties!" #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.tutorial-hero.info" -msgstr "Penpot pamatu apgūšana, kamēr tiek gūts prieks, ar šo praktisko apmācību." +msgstr "" +"Penpot pamatu apgūšana, kamēr tiek gūts prieks, ar šo praktisko apmācību." #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.tutorial-hero.start" @@ -352,9 +347,9 @@ msgstr "Privātās piekļuves pilnvaras" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.personal.description" msgstr "" -"Privātās piekļuves pilnvaras darbojas kā alternatīva mūsu " -"pieteikšanās/paroles autentificēšanas sistēmai, un tās var izmantot, lai " -"ļautu lietotnēm piekļūt iekšējam Penpot API" +"Privātās piekļuves pilnvaras darbojas kā alternatīva mūsu pieteikšanās/" +"paroles autentificēšanas sistēmai, un tās var izmantot, lai ļautu lietotnēm " +"piekļūt iekšējam Penpot API" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.token-will-expire" @@ -408,8 +403,8 @@ msgstr "Divkāršot %s datnes" msgid "dashboard.empty-placeholder-drafts" msgstr "" "Šeit tiks parādītas bibliotēkām pievienotās datnes. Mēģini koplietot datnes " -"vai pievienot tās no mūsu [bibliotēkām un " -"veidnēm](https://penpot.app/libraries-templates.html)." +"vai pievienot tās no mūsu [bibliotēkām un veidnēm](https://penpot.app/" +"libraries-templates.html)." msgid "dashboard.export-binary-multi" msgstr "Lejupielādēt %s Penpot datnes (.penpot)" @@ -435,8 +430,8 @@ msgstr "Izgūt" #: src/app/main/ui/export.cljs msgid "dashboard.export-shapes.how-to" msgstr "" -"Izgūšanas iestatījumus elementiem var pievienot no noformējuma īpašībām " -"(labās sānjoslas apakšā)." +"Izgūšanas iestatījumus elementiem var pievienot no noformējuma īpašībām (" +"labās sānjoslas apakšā)." #: src/app/main/ui/export.cljs msgid "dashboard.export-shapes.how-to-link" @@ -454,7 +449,8 @@ msgid "dashboard.export-standard-multi" msgstr "Lejupielādēt %s standarta datnes (. svg +. json)" msgid "dashboard.export.detail" -msgstr "* var ietvert sastāvdaļas, attēlus, krāsas un/vai burtu stilus un veidus." +msgstr "" +"* var ietvert sastāvdaļas, attēlus, krāsas un/vai burtu stilus un veidus." msgid "dashboard.export.explain" msgstr "" @@ -475,7 +471,8 @@ msgstr "" "pievienoti līdzekļi. " msgid "dashboard.export.options.detach.title" -msgstr "Attiekties pret koplietojamo bibliotēku līdzekļiem kā pret pamatobjektiem" +msgstr "" +"Attiekties pret koplietojamo bibliotēku līdzekļiem kā pret pamatobjektiem" msgid "dashboard.export.options.merge.message" msgstr "" @@ -527,8 +524,8 @@ msgid "dashboard.fonts.warning-text" msgstr "" "Esam noteikuši iespējamu sarežģījumu ar fontiem, kas ir saistīta ar " "vertikālajiem rādītājiem dažādām operētājsistēmām. Lai to pārbaudītu, var " -"izmantot tādus fontu vertikālo rādītāju pakalpojumus kā " -"[šis](https://vertical-metrics.netlify.app/). Turklāt ir ieteicams izmantot " +"izmantot tādus fontu vertikālo rādītāju pakalpojumus kā [šis](https" +"://vertical-metrics.netlify.app/). Turklāt ir ieteicams izmantot " "[Transfonter](https://transfonter.org/), lai izveidotu tīmekļa fontus un " "novērstu kļūdas. " @@ -538,18 +535,9 @@ msgstr "Ievietot Penpot datnes" msgid "dashboard.import.analyze-error" msgstr "Ak vai! Šo datni nevarēja ievietot" -msgid "dashboard.import.analyze-error.components-v2" -msgstr "Datne ar v2 sastāvdaļām ir aktivizēta, bet šī komanda to vēl neatbalsta." - msgid "dashboard.import.import-error" msgstr "Datnes ievietošanas laikā radās sarežģījumi. Datne netika ievietota." -msgid "dashboard.import.import-message" -msgid_plural "dashboard.import.import-message" -msgstr[0] "%s datņu tika veiksmīgi ievietotas." -msgstr[1] "%s datne tika veiksmīgi ievietota." -msgstr[2] "%s datnes tika veiksmīgi ievietotas." - msgid "dashboard.import.import-warning" msgstr "Dažās datnēs bija nederīgi objekti, kuri tika noņemti." @@ -906,20 +894,13 @@ msgstr "E-pasta adrese “%s” ir atzīmēta surogātpasts vai pastāvīgi saņ #: src/app/main/errors.cljs msgid "errors.feature-mismatch" msgstr "" -"Šķiet, ka tiek atvērta datne, kurā ir iespējota iespēja '%s', bet " -"pašreizējā Penpot versija to neatbalsta vai tā ir atspējota." +"Šķiet, ka tiek atvērta datne, kurā ir iespējota iespēja '%s', bet pašreizējā " +"Penpot versija to neatbalsta vai tā ir atspējota." #: src/app/main/errors.cljs msgid "errors.feature-not-supported" msgstr "Līdzeklis '%s' netiek atbalstīts." -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Izskatās, ka ir nesaderība starp iespējotajām iespējām un iespējām datnē, " -"kuru tiek mēģināts atvērt. Jāpiemēro '%s' migrācijas, pirms datne var tikt " -"atvērta." - #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -970,9 +951,6 @@ msgstr "Apstiprinājuma parolei ir jāsakrīt" msgid "errors.password-too-short" msgstr "Parolē ir jābūt vismaz 8 rakstzīmēm" -msgid "errors.paste-data-validation" -msgstr "Starpliktuvē ir nederīgi dati" - msgid "errors.profile-blocked" msgstr "Profils ir bloķēts" @@ -981,17 +959,13 @@ msgstr "Profils ir bloķēts" #: src/app/main/ui/dashboard/team.cljs msgid "errors.profile-is-muted" msgstr "" -"Profila epasta saņemšana ir apklusināta (ziņojumi par surogātpastu vai " -"daudz atlēcienu)." +"Profila epasta saņemšana ir apklusināta (ziņojumi par surogātpastu vai daudz " +"atlēcienu)." #: src/app/main/ui/auth/register.cljs msgid "errors.registration-disabled" msgstr "Reģistrācija pašlaik ir atspējota." -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Noteikta nesaderīga iespēja '%s'" - msgid "errors.team-leave.insufficient-members" msgstr "" "Komandā ir nepietiekams dalībnieku skaits, lai to pamestu. Iespējams, ka to " @@ -1013,13 +987,6 @@ msgstr "Atgadījās neparedzēta kļūda." msgid "errors.unexpected-token" msgstr "Nezināma tekstvienība" -msgid "errors.validation" -msgstr "Pārbaudes kļūda" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Datnei ir nesaderīgs versijas numurs" - msgid "errors.webhooks.connection" msgstr "Savienojuma kļūda, URL nav sasniedzams" @@ -1075,8 +1042,8 @@ msgstr "Temats" msgid "feedback.subtitle" msgstr "" "Lūgums aprakstīt e-pasta ziņojuma iemeslu, norādot, vai tā ir nepilnība, " -"ierosinājums vai šaubas. Kāds mūsu komandas dalībnieks atbildēs pēc " -"iespējas ātrāk." +"ierosinājums vai šaubas. Kāds mūsu komandas dalībnieks atbildēs pēc iespējas " +"ātrāk." #: src/app/main/ui/settings/feedback.cljs msgid "feedback.title" @@ -1254,9 +1221,6 @@ msgstr "Nav" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "Virsraksta stils" -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Atiestatīt" - msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Lielie burti" @@ -1350,8 +1314,8 @@ msgstr "Atpakaļ" #: src/app/main/ui/static.cljs msgid "labels.bad-gateway.desc-message" msgstr "" -"Izskatās, ka mazliet jāuzgaida un jāmēģina vēlreiz; mēs veicam nelielus " -"mūsu serveru uzturēšanas darbus." +"Izskatās, ka mazliet jāuzgaida un jāmēģina vēlreiz; mēs veicam nelielus mūsu " +"serveru uzturēšanas darbus." #: src/app/main/ui/static.cljs msgid "labels.bad-gateway.main-message" @@ -1664,9 +1628,6 @@ msgstr "Loma" msgid "labels.save" msgstr "Saglabāt" -msgid "labels.search" -msgstr "Meklēt" - msgid "labels.search-font" msgstr "Meklēt fontu" @@ -1691,9 +1652,6 @@ msgstr "Pakalpojums nav pieejams" msgid "labels.settings" msgstr "Iestatījumi" -msgid "labels.share" -msgstr "Kopīgot" - msgid "labels.share-prototype" msgstr "Kopīgot prototipu" @@ -1763,34 +1721,10 @@ msgstr "(Jūs)" msgid "labels.your-account" msgstr "Mans konts" -msgid "media.choose-image" -msgstr "Izvēlēties attēlu" - -msgid "media.gradient" -msgstr "Pāreja" - -msgid "media.image" -msgstr "Attēls" - -msgid "media.linear" -msgstr "Līnijveida" - #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Ielādē attēlu…" -msgid "media.radial" -msgstr "Radiāls" - -msgid "media.solid" -msgstr "Viengabalains" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Bibliotēka ir tukša. Tiklīdz tā būs pievienota kā koplietojama bibliotēka, " -"izveidotie līdzekļi būs pieejami izmantošanai pārējos failos. Vai tiešām " -"padarīt to pieejamu?" - #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -1904,7 +1838,8 @@ msgstr "Dzēst sarunu" #: src/app/main/ui/comments.cljs msgid "modals.delete-comment-thread.message" -msgstr "Vai tiešām izdzēst šo sarunu? Visas šī pavediena piebildes tiks izdzēstas." +msgstr "" +"Vai tiešām izdzēst šo sarunu? Visas šī pavediena piebildes tiks izdzēstas." #: src/app/main/ui/comments.cljs msgid "modals.delete-comment-thread.title" @@ -1949,7 +1884,8 @@ msgid "modals.delete-font-variant.title" msgstr "Fonta stila dzēšana" msgid "modals.delete-font.message" -msgstr "Vai tiešām izdzēst šo fontu? Tas netiks ielādēts, ja tiek izmantots datnē." +msgstr "" +"Vai tiešām izdzēst šo fontu? Tas netiks ielādēts, ja tiek izmantots datnē." msgid "modals.delete-font.title" msgstr "Fonta dzēšana" @@ -2038,19 +1974,6 @@ msgstr "Vai tiešām izdzēst šo dalībnieku no komandas?" msgid "modals.delete-team-member-confirm.title" msgstr "Dzēst komandas dalībnieku" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "" -"Līdzekļi, kas jau tiek izmantoti šajā datnē, paliks tajā (dizains netiks " -"salauzts)." -msgstr[1] "" -"Līdzeklis, kas jau tiek izmantots šajā datnē, paliks tajā (dizains netiks " -"salauzts)." -msgstr[2] "" -"Līdzekļi, kas jau tiek izmantoti šajā datnē, paliks tajā (dizains netiks " -"salauzts)." - msgid "modals.delete-webhook.accept" msgstr "Izdzēst tīmekļa aizķeri" @@ -2239,10 +2162,6 @@ msgstr "" msgid "modals.update-remote-component.message" msgstr "Atjaunināt sastāvdaļu koplietojamā bibliotēkā" -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "Ir pieejama jauna versija, lūgums atsvaidzināt lapu" - #: src/app/main/ui/dashboard/team.cljs msgid "notifications.invitation-email-sent" msgstr "Uzaicinājums veiksmīgi nosūtīts" @@ -2253,7 +2172,8 @@ msgstr "Uzaicinājuma saite nokopēta" #: src/app/main/ui/settings/delete_account.cljs msgid "notifications.profile-deletion-not-allowed" -msgstr "Profilu nevar izdzēst. Pirms turpināšanas jāpiešķir savas komandas citiem." +msgstr "" +"Profilu nevar izdzēst. Pirms turpināšanas jāpiešķir savas komandas citiem." #: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs msgid "notifications.profile-saved" @@ -2279,7 +2199,8 @@ msgid "onboarding-v2.before-start.desc2.title" msgstr "Lietotāja rokasgrāmata" msgid "onboarding-v2.before-start.desc3" -msgstr "Ir iespējams apskatīt mūsu pamācības un mūsu kopienas izveidotās pamācības." +msgstr "" +"Ir iespējams apskatīt mūsu pamācības un mūsu kopienas izveidotās pamācības." msgid "onboarding-v2.before-start.desc3.title" msgstr "Video pamācības" @@ -2334,21 +2255,6 @@ msgstr "Līdzdalības rokasgrāmata" msgid "onboarding-v2.welcome.title" msgstr "Laipni lūdzam Penpot!" -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Turpināt komandas izveidošanu" - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Turpināt bez komandas" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Izveidot komandu un uzaicināt" - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Izveidot komandu un nosūtīt uzaicinājumus" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Uzaicināt būs iespējams vēlāk" - msgid "onboarding.choice.team-up.create-team-desc" msgstr "" "Pēc komandas nosaukuma piešķiršanas varēs uzaicināt cilvēkus tai " @@ -2357,12 +2263,6 @@ msgstr "" msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "Jāievada komandas nosaukums" -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Izveidot komandu" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Izveidot komandu bez uzaicināšanas" - msgid "onboarding.choice.team-up.invite-members" msgstr "Uzaicināt dalībniekus" @@ -2374,12 +2274,6 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Uzaicināt ar lomu:" -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Uzsākt bez komandas" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Komandu būs iespējams izveidot vēlāk." - msgid "onboarding.newsletter.accept" msgstr "Jā, abonēt" @@ -2462,14 +2356,6 @@ msgstr "Canva" msgid "questions.describe-your-experience-working-on" msgstr "Kā vislabāk raksturotu savu pieredzi strādājot pie..." -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "Modelētājs" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "Izstrādātājs" - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.discover-more-about-penpot" msgstr "Atklāt vairāk par Penpot" @@ -2478,10 +2364,6 @@ msgstr "Atklāt vairāk par Penpot" msgid "questions.figma" msgstr "Figma" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Dibinātājs/viceprezidents" - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.freelancer" msgstr "Esmu ārštātnieks(-ce)/Pašnodarbināts(-ā)" @@ -2506,14 +2388,6 @@ msgstr "Atstāt atsauksmes par manas grupas projektu" msgid "questions.lets-get-started" msgstr "Ķeramies pie darba!" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "Produktu vai projektu vadītājs" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Tirgvedība" - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.more-than-50" msgstr "Vairāk nekā 50" @@ -2542,10 +2416,6 @@ msgstr "Iepriekšējais" msgid "questions.questions-how-are-you-planning-to-use-penpot" msgstr "Kā ir iecerēts izmantot Penpot?" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "Kāda ir ieņemamā loma?" - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.select-option" msgstr "Atlasīt iespēju" @@ -2566,10 +2436,6 @@ msgstr "Sākt" msgid "questions.start-to-work-on-my-project" msgstr "Sākt strādāt pie sava projekta" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "Students vai pasniedzējs" - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.team-size" msgstr "Cik liela ir komanda?" @@ -2593,12 +2459,8 @@ msgstr "Darbs koncepcijas idejās" #: src/app/main/ui/onboarding/questions.cljs msgid "questions.your-feedback-will-help-us" msgstr "" -"Atsauksmes palīdzēs mums saprast, kādi ir lietotāju paradumi un izvēles, " -"lai mēs varētu turpināt padarīt Penpot par noderīgu un patīkamu rīku." - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Atdalīt" +"Atsauksmes palīdzēs mums saprast, kādi ir lietotāju paradumi un izvēles, lai " +"mēs varētu turpināt padarīt Penpot par noderīgu un patīkamu rīku." #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, @@ -3056,9 +2918,6 @@ msgstr "Rādīt/paslēpt mērjoslas" msgid "shortcuts.toggle-textpalette" msgstr "Pārslēgt teksta paleti" -msgid "shortcuts.toggle-theme" -msgstr "Mainīt izskatu" - msgid "shortcuts.toggle-visibility" msgstr "Pārslēgt redzamību" @@ -3165,7 +3024,8 @@ msgid "title.workspace" msgstr "%s - Penpot" msgid "viewer.breaking-change.description" -msgstr "Šī kopīgojamā saite vairs nav derīga. Jāizveido vai jālūdz īpašniekam jauna." +msgstr "" +"Šī kopīgojamā saite vairs nav derīga. Jāizveido vai jālūdz īpašniekam jauna." msgid "viewer.breaking-change.message" msgstr "Piedošanu!" @@ -3274,7 +3134,8 @@ msgstr "Izveidot kopu" #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.create-group-hint" -msgstr "Vienumi tiks automātiski nosaukti kā “kopas nosaukums/vienuma nosaukums”" +msgstr "" +"Vienumi tiks automātiski nosaukti kā “kopas nosaukums/vienuma nosaukums”" #: src/app/main/ui/workspace/sidebar/sitemap.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs, @@ -3287,9 +3148,6 @@ msgstr "Dzēst" msgid "workspace.assets.duplicate" msgstr "Divkāršot" -msgid "workspace.assets.duplicate-main" -msgstr "Divkāršot galveno" - #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.edit" @@ -3313,7 +3171,7 @@ msgid "workspace.assets.libraries" msgstr "Bibliotēkas" msgid "workspace.assets.local-library" -msgstr "vietējā bibliotēka" +msgstr "lokālā bibliotēka" #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.not-found" @@ -3393,45 +3251,6 @@ msgstr "Teksta pārveide" msgid "workspace.assets.ungroup" msgstr "Atapkopot" -msgid "workspace.context-menu.grid-cells.area" -msgstr "Izveidot laukumu" - -msgid "workspace.context-menu.grid-cells.create-board" -msgstr "Izveidot plātni" - -msgid "workspace.context-menu.grid-cells.merge" -msgstr "Apvienot šūnas" - -msgid "workspace.context-menu.grid-track.column.add-after" -msgstr "Pievienot 1 sleju pa labi" - -msgid "workspace.context-menu.grid-track.column.add-before" -msgstr "Pievienot 1 sleju pa kreisi" - -msgid "workspace.context-menu.grid-track.column.delete" -msgstr "Izdzēst sleju" - -msgid "workspace.context-menu.grid-track.column.delete-shapes" -msgstr "Izdzēst slejas un apveidus" - -msgid "workspace.context-menu.grid-track.column.duplicate" -msgstr "Divkāršota sleja" - -msgid "workspace.context-menu.grid-track.row.add-after" -msgstr "Pievienot 1 rindu zem" - -msgid "workspace.context-menu.grid-track.row.add-before" -msgstr "Pievienot 1 rindu virs" - -msgid "workspace.context-menu.grid-track.row.delete" -msgstr "Izdzēst rindu" - -msgid "workspace.context-menu.grid-track.row.delete-shapes" -msgstr "Izdzēst rindu un apveidus" - -msgid "workspace.context-menu.grid-track.row.duplicate" -msgstr "Divkāršot rindu" - msgid "workspace.focus.focus-mode" msgstr "Fokusa režīms" @@ -3555,12 +3374,6 @@ msgstr "Rādīt mērjoslas" msgid "workspace.header.menu.show-textpalette" msgstr "Rādīt fontu paleti" -msgid "workspace.header.menu.toggle-dark-theme" -msgstr "Pārslēgties uz tumšo izskatu" - -msgid "workspace.header.menu.toggle-light-theme" -msgstr "Pārslēgties uz gaišo izskatu" - msgid "workspace.header.menu.undo" msgstr "Atsaukt" @@ -3612,21 +3425,6 @@ msgstr "Pilnekrāns" msgid "workspace.header.zoom-selected" msgstr "Tālummainīt uz atlasi" -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Labot režģi" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Iziet" - -msgid "workspace.layout_grid.editor.title" -msgstr "Režģa labošana" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Darīts" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Noteikt atrašanās vietu" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Pievienot" @@ -3697,10 +3495,6 @@ msgstr "BIBLIOTĒKA" msgid "workspace.libraries.library-updates" msgstr "BIBLIOTĒKAS JAUNINĀJUMI" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.loading" -msgstr "Ielādē…" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "Nav nevienas koplietojamās bibliotēkas, kas būtu jāatjaunina" @@ -3775,24 +3569,12 @@ msgstr "Sastāvdaļa" msgid "workspace.options.component.annotation" msgstr "Piezīme" -msgid "workspace.options.component.copy" -msgstr "Ievietot starpliktuvē" - msgid "workspace.options.component.create-annotation" msgstr "Izveidot piezīmi" msgid "workspace.options.component.edit-annotation" msgstr "Labot piezīmi" -msgid "workspace.options.component.main" -msgstr "Galvenais" - -msgid "workspace.options.component.swap" -msgstr "Mijmainīt sastāvdaļu" - -msgid "workspace.options.component.swap.empty" -msgstr "Šajā bibliotēkā vēl nav līdzekļu" - #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Ierobežojumi" @@ -3887,10 +3669,6 @@ msgstr "Aizpildīšana" msgid "workspace.options.flows.add-flow-start" msgstr "Pievienot plūsmas sākumu" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Plūsma" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "Plūsmas sākums" @@ -3905,7 +3683,7 @@ msgstr "Auto" #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.column" -msgstr "Slejas" +msgstr "Kolonnas" #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.grid-title" @@ -3916,7 +3694,7 @@ msgstr "Krāsa" #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.params.columns" -msgstr "Slejas" +msgstr "Kolonnas" #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.params.gutter" @@ -3994,9 +3772,6 @@ msgstr "Kopas aizpildījums" msgid "workspace.options.group-stroke" msgstr "Kopas vilkums" -msgid "workspace.options.guides.title" -msgstr "Vadotnes" - msgid "workspace.options.height" msgstr "Augstums" @@ -4336,11 +4111,11 @@ msgstr "Apakša" #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.direction.column" -msgstr "Sleja" +msgstr "Kolona" #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.direction.column-reverse" -msgstr "Apvērsta sleja" +msgstr "Apgrieztā kolonna" #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.direction.row" @@ -4466,7 +4241,8 @@ msgstr "Meklēt fontu" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.select-a-shape" -msgstr "Jāatlasa apveids, plātne vai kopa, lai vilktu savienojumu uz citu plātni." +msgstr "" +"Jāatlasa apveids, plātne vai kopa, lai vilktu savienojumu uz citu plātni." #: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs msgid "workspace.options.selection-color" @@ -4543,26 +4319,14 @@ msgstr "Vilkums" msgid "workspace.options.stroke-cap.circle-marker" msgstr "Apļa marķieris" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Aplis" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "Rombveida marķieris" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Dimants" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "Līnijas bulta" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Bulta" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "Nav" @@ -4579,18 +4343,10 @@ msgstr "Kvadrāts" msgid "workspace.options.stroke-cap.square-marker" msgstr "Kvadrāta marķieris" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Taisnstūris" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "Trīsstūra bulta" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Trijstūris" - msgid "workspace.options.stroke-color" msgstr "Vilkuma krāsa" @@ -5061,13 +4817,6 @@ msgstr "Teksts (%s)" msgid "workspace.toolbar.text-palette" msgstr "Burtu stili un veidi (%s)" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Apskatīšana** (tikai skatīt)" - -msgid "workspace.top-bar.read-only.done" -msgstr "Darīts" - #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Līdz šim nav notikušas nekādas vēsturiskās izmaiņas" @@ -5201,3 +4950,210 @@ msgstr "Atjaunināt" msgid "workspace.viewport.click-to-close-path" msgstr "Jānoklikšķina, lai aizvērtu ceļu" + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Noteikta nesaderīga iespēja '%s'" + +msgid "errors.paste-data-validation" +msgstr "Starpliktuvē ir nederīgi dati" + +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Turpināt komandas izveidošanu" + +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Uzsākt bez komandas" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Komandu būs iespējams izveidot vēlāk." + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Turpināt bez komandas" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Izveidot komandu un nosūtīt uzaicinājumus" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Izveidot komandu un uzaicināt" + +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Izveidot komandu" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Uzaicināt būs iespējams vēlāk" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Izstrādātājs" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Iziet" + +msgid "media.image" +msgstr "Attēls" + +msgid "media.solid" +msgstr "Viengabalains" + +msgid "media.linear" +msgstr "Līnijveida" + +msgid "media.radial" +msgstr "Radiāls" + +msgid "media.gradient" +msgstr "Pāreja" + +msgid "media.choose-image" +msgstr "Izvēlēties attēlu" + +msgid "workspace.options.guides.title" +msgstr "Vadotnes" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Datnei ir nesaderīgs versijas numurs" + +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Izskatās, ka ir nesaderība starp iespējotajām iespējām un iespējām datnē, " +"kuru tiek mēģināts atvērt. Jāpiemēro '%s' migrācijas, pirms datne var tikt " +"atvērta." + +msgid "errors.validation" +msgstr "Pārbaudes kļūda" + +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Atiestatīt" + +msgid "labels.share" +msgstr "Kopīgot" + +msgid "labels.search" +msgstr "Meklēt" + +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Ar jauna konta izveidošanu tiek piekrists mūsu [pakalpojuma noteikumiem](%s) " +"un [privātuma nosacījumiem](%s)." + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Izveidot komandu bez uzaicināšanas" + +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Labot režģi" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Noteikt atrašanās vietu" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Darīts" + +msgid "workspace.options.component.swap" +msgstr "Mijmainīt sastāvdaļu" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Plūsma" + +msgid "workspace.top-bar.read-only.done" +msgstr "Darīts" + +msgid "workspace.options.component.swap.empty" +msgstr "Šajā bibliotēkā vēl nav līdzekļu" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Bulta" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Trijstūris" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Taisnstūris" + +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**Apskatīšana** (tikai skatīt)" + +msgid "workspace.assets.duplicate-main" +msgstr "Divkāršot galveno" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Modelētājs" + +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "%s datņu tika veiksmīgi ievietotas." +msgstr[1] "%s datne tika veiksmīgi ievietota." +msgstr[2] "%s datnes tika veiksmīgi ievietotas." + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Bibliotēka ir tukša. Tiklīdz tā būs pievienota kā koplietojama bibliotēka, " +"izveidotie līdzekļi būs pieejami izmantošanai pārējos failos. Vai tiešām " +"padarīt to pieejamu?" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Atdalīt" + +msgid "workspace.options.component.copy" +msgstr "Ievietot starpliktuvē" + +msgid "workspace.options.component.main" +msgstr "Galvenais" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Aplis" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Dimants" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "" +"Līdzekļi, kas jau tiek izmantoti šajā datnē, paliks tajā (dizains netiks " +"salauzts)." +msgstr[1] "" +"Līdzeklis, kas jau tiek izmantots šajā datnē, paliks tajā (dizains netiks " +"salauzts)." +msgstr[2] "" +"Līdzekļi, kas jau tiek izmantoti šajā datnē, paliks tajā (dizains netiks " +"salauzts)." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Tirgvedība" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Dibinātājs/viceprezidents" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Produktu vai projektu vadītājs" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Kāda ir ieņemamā loma?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Students vai pasniedzējs" + +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "Ir pieejama jauna versija, lūgums atsvaidzināt lapu" + +msgid "workspace.layout_grid.editor.title" +msgstr "Režģa labošana" diff --git a/frontend/translations/ms.po b/frontend/translations/ms.po index 087eb384d..110f93eca 100644 --- a/frontend/translations/ms.po +++ b/frontend/translations/ms.po @@ -1,30 +1,16 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-10 15:02+0000\n" +"PO-Revision-Date: 2024-02-09 13:58+0000\n" "Last-Translator: Revenant \n" -"Language-Team: Malay " -"\n" +"Language-Team: Malay \n" "Language: ms\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" +"Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.4-dev\n" -#: src/app/main/ui/auth/register.cljs -msgid "auth.already-have-account" -msgstr "Sudah mempunyai akaun?" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.check-your-email" -msgstr "" -"Semak e-mel anda dan klik pada pautan untuk mengesahkan dan mula " -"menggunakan Penpot." - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.confirm-password" -msgstr "Mengesahkan kata laluan" - #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.create-demo-account" msgstr "Cipta akaun demo" @@ -83,18 +69,6 @@ msgstr "LDAP" msgid "auth.login-with-oidc-submit" msgstr "OpenID Connect" -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "Nama mesti mengandungi beberapa aksara selain ruang." - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "Nama mesti mengandungi paling banyak 250 aksara." - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.new-password" -msgstr "Taip kata laluan baharu" - #: src/app/main/ui/auth/recovery.cljs msgid "auth.notifications.invalid-token-error" msgstr "Token pemulihan adalah tidak sah." @@ -150,18 +124,10 @@ msgstr "Tukar kata laluan anda" msgid "auth.register" msgstr "Tiada akaun lagi?" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.register-submit" -msgstr "Cipta akaun" - #: src/app/main/ui/auth/register.cljs msgid "auth.register-subtitle" msgstr "Ia percuma dan Sumber Terbuka" -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-title" -msgstr "Cipta akaun" - #: src/app/main/ui/auth.cljs msgid "auth.sidebar-tagline" msgstr "Penyelesaian sumber terbuka untuk reka bentuk dan prototaip." @@ -169,11 +135,6 @@ msgstr "Penyelesaian sumber terbuka untuk reka bentuk dan prototaip." msgid "auth.terms-of-service" msgstr "Syarat perkhidmatan" -msgid "auth.terms-privacy-agreement" -msgstr "" -"Apabila membuat akaun baharu, anda bersetuju menerima syarat perkhidmatan " -"dan dasar privasi kami." - #: src/app/main/ui/auth/register.cljs #, markdown msgid "auth.terms-privacy-agreement-md" @@ -181,9 +142,10 @@ msgstr "" "Apabila membuat akaun baharu, anda bersetuju menerima [syarat " "perkhidmatan](%s) dan [dasar privasi](%s) kami." -#: src/app/main/ui/auth/register.cljs -msgid "auth.verification-email-sent" -msgstr "Kami telah menghantar e-mel pengesahan kepada" +msgid "auth.terms-privacy-agreement" +msgstr "" +"Apabila membuat akaun baharu, anda bersetuju menerima syarat perkhidmatan " +"dan dasar privasi kami." #: src/app/main/ui/onboarding/questions.cljs msgid "branding-illustrations-marketing-pieces" @@ -195,11 +157,6 @@ msgstr "Terbitkan" msgid "common.share-link.all-users" msgstr "Semua pengguna Penpot" -msgid "common.share-link.confirm-deletion-link-description" -msgstr "" -"Adakah anda pasti untuk mengalih keluar pautan ini? Jika anda melakukannya, " -"ia tidak lagi tersedia untuk sesiapa sahaja" - msgid "common.share-link.current-tag" msgstr "(semasa)" @@ -222,9 +179,6 @@ msgstr[0] "%s halaman dikongsi" msgid "common.share-link.permissions-can-comment" msgstr "Boleh komen" -msgid "common.share-link.permissions-can-inspect" -msgstr "Boleh memeriksa kod" - msgid "common.share-link.permissions-hint" msgstr "Sesiapa yang mempunyai pautan akan mendapat akses" @@ -266,10 +220,6 @@ msgstr "" "Pelajari asas-asas di Penpot sambil berseronok dengan tutorial guna tangan " "ini." -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.start" -msgstr "Mulakan tutorial" - #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.tutorial-hero.title" msgstr "Tutorial guna tangan" @@ -294,22 +244,10 @@ msgstr "Token disalin" msgid "dashboard.access-tokens.create" msgstr "Jana token baru" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "Token capaian berjaya dihasilkan." - #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.empty.add-one" msgstr "Tekan butang \"Jana token baharu\" untuk menjana token." -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.no-access-tokens" -msgstr "Anda tidak mempunyai token setakat ini." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "Nama diperlukan" - #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.expiration-180-days" msgstr "180 hari" @@ -346,13 +284,6 @@ msgstr "Tiada tarikh tamat tempoh" msgid "dashboard.access-tokens.personal" msgstr "Token capaian peribadi" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"Token capaian peribadi berfungsi seperti alternatif kepada sistem " -"pengesahan log masuk/kata laluan kami dan boleh digunakan untuk membenarkan " -"aplikasi mengakses API dalaman Penpot" - #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.token-will-expire" msgstr "Token akan luput pada %s" @@ -403,9 +334,9 @@ msgstr "Pendua %s fail" #, markdown msgid "dashboard.empty-placeholder-drafts" msgstr "" -"Fail yang ditambahkan pada Perpustakaan akan dipaparkan di sini. Cuba " -"kongsi fail anda atau tambahkan daripada [Perpustakaan & " -"templat](https://penpot.app/libraries-templates.html) kami." +"Fail yang ditambahkan pada Perpustakaan akan dipaparkan di sini. Cuba kongsi " +"fail anda atau tambahkan daripada [Perpustakaan & templat](https://penpot." +"app/libraries-templates.html) kami." msgid "dashboard.export-binary-multi" msgstr "Muat turun %s fail Penpot (.penpot)" @@ -413,2356 +344,75 @@ msgstr "Muat turun %s fail Penpot (.penpot)" msgid "dashboard.export-frames" msgstr "Eksport papan sebagai PDF" -#: src/app/main/ui/export.cljs -msgid "dashboard.export-frames.title" -msgstr "Eksport sebagai PDF" - -msgid "dashboard.export-multi" -msgstr "Eksport fail Penpot %s" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-multiple.selected" -msgstr "%s daripada %s elemen dipilih" - -#: src/app/main/ui/workspace/header.cljs -msgid "dashboard.export-shapes" -msgstr "Eksport" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to" -msgstr "" -"Anda boleh menambah tetapan eksport ke elemen daripada sifat reka bentuk " -"(di bahagian bawah bar sisi kanan)." - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to-link" -msgstr "Maklumat cara untuk menetapkan eksport di Penpot." - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.no-elements" -msgstr "Tiada unsur dengan tetapan eksport." - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.title" -msgstr "Eksport Pemilihan" - -msgid "dashboard.export-standard-multi" -msgstr "Muat turun %s fail standard (.svg + .json)" - -msgid "dashboard.export.detail" -msgstr "* Mungkin termasuk komponen, grafik, warna dan/atau tipografi." - -msgid "dashboard.export.explain" -msgstr "" -"Satu atau lebih fail yang anda ingin eksport menggunakan perpustakaan " -"kongsi. Apa yang anda mahu lakukan dengan aset mereka*?" - -msgid "dashboard.export.options.all.message" -msgstr "" -"fail dengan perpustakaan kongsi akan disertakan dalam eksport, mengekalkan " -"hubungannya." - -msgid "dashboard.export.options.all.title" -msgstr "Eksport perpustakaan kongsi" - -msgid "dashboard.export.options.detach.message" -msgstr "" -"Perpustakaan kongsi tidak akan disertakan dalam eksport dan tiada aset akan " -"ditambahkan ke perpustakaan. " - -msgid "dashboard.export.options.detach.title" -msgstr "Anggap aset perpustakaan kongsi sebagai objek asas" - -msgid "dashboard.export.options.merge.message" -msgstr "" -"Fail anda akan dieksport dengan semua aset luaran digabungkan ke dalam " -"pustaka fail." - -msgid "dashboard.export.options.merge.title" -msgstr "Sertakan aset perpustakaan kongsi dalam pustaka fail" - -msgid "dashboard.export.title" -msgstr "Eksport fail" - -msgid "dashboard.fonts.deleted-placeholder" -msgstr "Fon hilang" - -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.dismiss-all" -msgstr "Tolak semua" - -msgid "dashboard.fonts.empty-placeholder" -msgstr "Fon tersuai yang anda muat naik akan dipaparkan di sini." - -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.fonts-added" -msgid_plural "dashboard.fonts.fonts-added" -msgstr[0] "%s fon ditambah" - -#, markdown -msgid "dashboard.fonts.hero-text1" -msgstr "" -"Sebarang fon web yang anda muat naik di sini akan ditambahkan pada senarai " -"keluarga fon yang tersedia pada sifat teks fail pasukan ini. Fon dengan " -"nama keluarga fon yang sama akan dikumpulkan sebagai **keluarga fon " -"tunggal**. Anda boleh memuat naik fon dengan format berikut: **TTF, OTF dan " -"WOFF** (hanya satu sahaja diperlukan)." +#: src/app/main/ui/auth/register.cljs +msgid "auth.already-have-account" +msgstr "Sudah mempunyai akaun?" -#, markdown -msgid "dashboard.fonts.hero-text2" +#: src/app/main/ui/auth/register.cljs +msgid "auth.check-your-email" msgstr "" -"Anda hanya perlu memuat naik fon yang anda miliki atau mempunyai lesen " -"untuk digunakan dalam Penpot. Ketahui lebih lanjut dalam bahagian Hak " -"kandungan [Syarat Perkhidmatan Penpot](https://penpot.app/terms.html). Anda " -"juga mungkin ingin membaca tentang [pelesenan " -"fon](https://www.typography.com/faq)." - -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.upload-all" -msgstr "Muat naik semua" +"Semak e-mel anda dan klik pada pautan untuk mengesahkan dan mula menggunakan " +"Penpot." -#, markdown -msgid "dashboard.fonts.warning-text" -msgstr "" -"Kami telah mengesan kemungkinan masalah dalam fon anda yang berkaitan " -"dengan metrik menegak untuk sistem pengendalian yang berbeza. Untuk " -"menyemaknya, anda boleh menggunakan perkhidmatan metrik menegak fon seperti " -"[ini](https://vertical-metrics.netlify.app/). Selain itu, kami mengesyorkan " -"menggunakan [Transfonter](https://transfonter.org/) untuk menjana fon web " -"dan membetulkan ralat. " +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-title" +msgstr "Cipta akaun" -msgid "dashboard.import" -msgstr "Import fail Penpot" +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.confirm-password" +msgstr "Mengesahkan kata laluan" -msgid "dashboard.import.analyze-error" -msgstr "Alamak! Kami tidak dapat mengimport fail ini" +#: src/app/main/ui/auth/register.cljs +msgid "auth.verification-email-sent" +msgstr "Kami telah menghantar e-mel pengesahan kepada" -msgid "dashboard.import.analyze-error.components-v2" +msgid "common.share-link.confirm-deletion-link-description" msgstr "" -"Fail dengan komponen v2 diaktifkan tetapi pasukan ini belum menyokongnya " -"lagi." - -msgid "dashboard.import.import-error" -msgstr "Terdapat masalah mengimport fail. Fail tidak diimport." - -msgid "dashboard.import.import-message" -msgid_plural "dashboard.import.import-message" -msgstr[0] "%s fail telah berjaya diimport." - -msgid "dashboard.import.import-warning" -msgstr "Sesetengah fail mengandungi objek tidak sah telah dialih keluar." - -msgid "dashboard.import.progress.process-colors" -msgstr "memproses warna" - -msgid "dashboard.import.progress.process-components" -msgstr "Memproses komponen" - -msgid "dashboard.import.progress.process-media" -msgstr "Memproses media" - -msgid "dashboard.import.progress.process-page" -msgstr "Memproses halaman: %s" - -msgid "dashboard.import.progress.process-typographies" -msgstr "Memproses tipografi" - -msgid "dashboard.import.progress.upload-data" -msgstr "Memuat naik data ke pelayan (%s/%s)" - -msgid "dashboard.import.progress.upload-media" -msgstr "Memuat naik fail: %s" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.invite-profile" -msgstr "Jemput orang ramai" - -#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.leave-team" -msgstr "Tinggalkan pasukan" - -msgid "dashboard.libraries-and-templates" -msgstr "Perpustakaan & Templat" - -msgid "dashboard.libraries-and-templates.explore" -msgstr "Terokai lebih banyak daripada mereka dan ketahui cara untuk menyumbang" - -msgid "dashboard.libraries-and-templates.import-error" -msgstr "Terdapat masalah mengimport templat. Templat tidak diimport." - -#: src/app/main/ui/dashboard/libraries.cljs -msgid "dashboard.libraries-title" -msgstr "Perpustakaan" - -#: src/app/main/ui/dashboard/grid.cljs -msgid "dashboard.loading-files" -msgstr "memuatkan fail anda…" - -msgid "dashboard.loading-fonts" -msgstr "memuatkan fon anda…" - -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to" -msgstr "Berpindah ke" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to-multi" -msgstr "Pindahkan fail %s ke" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to-other-team" -msgstr "Pindah ke pasukan lain" - -#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/files.cljs -msgid "dashboard.new-file" -msgstr "+ Fail Baharu" - -#: src/app/main/data/dashboard.cljs -msgid "dashboard.new-file-prefix" -msgstr "Fail Baharu" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dashboard.new-project" -msgstr "+ Projek baharu" - -#: src/app/main/data/dashboard.cljs -msgid "dashboard.new-project-prefix" -msgstr "Projek Baharu" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.no-matches-for" -msgstr "Tiada padanan ditemui untuk \"%s\"" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.no-projects-placeholder" -msgstr "Projek yang disemat akan muncul di sini" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "dashboard.notifications.email-changed-successfully" -msgstr "Alamat e-mel anda telah berjaya dikemas kini" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "dashboard.notifications.email-verified-successfully" -msgstr "Alamat e-mel anda telah berjaya disahkan" - -#: src/app/main/ui/settings/password.cljs -msgid "dashboard.notifications.password-saved" -msgstr "Kata laluan berjaya disimpan!" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.num-of-members" -msgstr "%s ahli" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.open-in-new-tab" -msgstr "Buka fail dalam tab baharu" - -msgid "dashboard.options" -msgstr "Pilihan" - -#: src/app/main/ui/settings/password.cljs -msgid "dashboard.password-change" -msgstr "Tukar kata laluan" +"Adakah anda pasti untuk mengalih keluar pautan ini? Jika anda melakukannya, " +"ia tidak lagi tersedia untuk sesiapa sahaja" -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.pin-unpin" -msgstr "Semat/Nyahsemat" +msgid "common.share-link.permissions-can-inspect" +msgstr "Boleh memeriksa kod" #: src/app/main/ui/dashboard/projects.cljs -msgid "dashboard.projects-title" -msgstr "Projek" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.remove-account" -msgstr "Mahu mengalih keluar akaun anda?" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.remove-shared" -msgstr "Alih keluar sebagai Pustaka Dikongsi" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.save-settings" -msgstr "Simpan tetapan" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.search-placeholder" -msgstr "Cari…" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.searching-for" -msgstr "Mencari \"%s\"…" - -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.select-ui-language" -msgstr "Pilih Bahasa UI" - -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.select-ui-theme" -msgstr "Pilih tema" - -#: src/app/main/ui/dashboard/grid.cljs -msgid "dashboard.show-all-files" -msgstr "Tunjukkan semua fail" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-delete-file" -msgid_plural "dashboard.success-delete-file" -msgstr[0] "Fail anda telah berjaya dipadamkan" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.success-delete-project" -msgstr "Projek anda telah berjaya dipadamkan" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-duplicate-file" -msgid_plural "dashboard.success-delete-file" -msgstr[0] "Fail anda telah berjaya dibuat pendua" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.success-duplicate-project" -msgstr "Projek anda telah berjaya dibuat pendua" - -#: src/app/main/ui/dashboard/grid.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-move-file" -msgstr "Fail anda berjaya dialihkan" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-move-files" -msgstr "Fail anda telah berjaya dialihkan" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.success-move-project" -msgstr "Projek anda berjaya dialihkan" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-info" -msgstr "Maklumat pasukan" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-members" -msgstr "Anggota kumpulan" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-projects" -msgstr "Projek pasukan" - -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.theme-change" -msgstr "Tema UI" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.title-search" -msgstr "Hasil carian" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.type-something" -msgstr "Taip untuk hasil carian" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.unpublish-shared" -msgstr "Nyahterbit Perpustakaan" - -#: src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs -msgid "dashboard.update-settings" -msgstr "Kemas kini tetapan" - -msgid "dashboard.webhooks.active" -msgstr "Adalah aktif" - -msgid "dashboard.webhooks.active.explain" -msgstr "Apabila cangkuk ini dicetuskan, butiran peristiwa akan dihantar" - -msgid "dashboard.webhooks.content-type" -msgstr "Jenis kandungan" - -msgid "dashboard.webhooks.create" -msgstr "Cipta webhook" +msgid "dasboard.tutorial-hero.start" +msgstr "Mulakan tutorial" -msgid "dashboard.webhooks.create.success" -msgstr "Webhook berjaya dihasilkan." +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "Token capaian berjaya dihasilkan." -msgid "dashboard.webhooks.description" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" msgstr "" -"Webhooks adalah cara mudah untuk membolehkan tapak web dan apl lain " -"dimaklumkan apabila acara tertentu berlaku di Penpot. Kami akan menghantar " -"permintaan POST ke setiap URL yang anda berikan." - -msgid "dashboard.webhooks.empty.add-one" -msgstr "Tekan butang \"Tambah webhook\" untuk menambahnya." - -msgid "dashboard.webhooks.empty.no-webhooks" -msgstr "Tiada webhook dibuat setakat ini." - -msgid "dashboard.webhooks.update.success" -msgstr "Webhook berjaya dikemas kini." - -#: src/app/main/ui/settings.cljs -msgid "dashboard.your-account-title" -msgstr "Akaun anda" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.your-email" -msgstr "E-mel" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.your-name" -msgstr "Nama anda" - -#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.your-penpot" -msgstr "Penpot anda" - -#: src/app/main/ui/alert.cljs -msgid "ds.alert-ok" -msgstr "Ok" - -#: src/app/main/ui/alert.cljs -msgid "ds.alert-title" -msgstr "Perhatian" - -#: src/app/main/ui/confirm.cljs -msgid "ds.component-subtitle" -msgstr "Komponen untuk dikemas kini:" +"Token capaian peribadi berfungsi seperti alternatif kepada sistem pengesahan " +"log masuk/kata laluan kami dan boleh digunakan untuk membenarkan aplikasi " +"mengakses API dalaman Penpot" -#: src/app/main/ui/confirm.cljs -msgid "ds.confirm-cancel" -msgstr "Batal" - -#: src/app/main/ui/confirm.cljs -msgid "ds.confirm-ok" -msgstr "Ok" - -#: src/app/main/ui/confirm.cljs, src/app/main/ui/confirm.cljs -msgid "ds.confirm-title" -msgstr "Adakah anda pasti?" - -#: src/app/main/ui/auth/login.cljs -msgid "errors.auth-provider-not-configured" -msgstr "Pembekal pengesahan tidak dikonfigurasikan." - -msgid "errors.auth.unable-to-login" -msgstr "Nampaknya anda belum disahkan atau sesi telah tamat tempoh." +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "Anda tidak mempunyai token setakat ini." -msgid "errors.bad-font" -msgstr "Fon %s tidak dapat dimuatkan" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "Nama diperlukan" -msgid "errors.bad-font-plural" -msgstr "Fon %s tidak dapat dimuatkan" +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "Nama mesti mengandungi beberapa aksara selain ruang." -msgid "errors.cannot-upload" -msgstr "Tidak boleh memuat naik fail media." +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "Nama mesti mengandungi paling banyak 250 aksara." -#: src/app/main/data/workspace.cljs -msgid "errors.clipboard-not-implemented" -msgstr "Pelayar anda tidak dapat melakukan operasi ini" +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.new-password" +msgstr "Taip kata laluan baharu" -#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs -msgid "errors.email-already-exists" -msgstr "E-mel sudah digunakan" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.register-submit" +msgstr "Cipta akaun" -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.email-already-validated" -msgstr "E-mel sudah disahkan." - -msgid "errors.email-as-password" -msgstr "Anda tidak boleh menggunakan e-mel sebagai kata laluan" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.email-has-permanent-bounces" -msgstr "E-mel «%s» mempunyai banyak laporan lantunan kekal." - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs -msgid "errors.email-invalid" -msgstr "Sila masukkan e-mel yang sah" - -#: src/app/main/ui/settings/change_email.cljs -msgid "errors.email-invalid-confirmation" -msgstr "E-mel pengesahan mesti sepadan" - -msgid "errors.email-spam-or-permanent-bounces" -msgstr "E-mel «%s» telah dilaporkan sebagai spam atau melantun secara kekal." - -#: src/app/main/errors.cljs -msgid "errors.feature-mismatch" -msgstr "" -"Nampaknya anda sedang membuka fail yang mendayakan ciri '%s' tetapi versi " -"penpot semasa tidak menyokongnya atau menyahdayakannya." - -#: src/app/main/errors.cljs -msgid "errors.feature-not-supported" -msgstr "Ciri '%s' tidak disokong." - -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Nampaknya terdapat ketidakpadanan antara ciri yang didayakan dan ciri fail " -"yang anda cuba buka. Migrasi untuk '%s' perlu digunakan sebelum fail boleh " -"dibuka." - -#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.generic" -msgstr "Sesuatu yang tidak kena telah berlaku." - -#: src/app/main/ui/components/color_input.cljs -msgid "errors.invalid-color" -msgstr "Warna tidak sah" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.invite-invalid" -msgstr "Jemputan tidak sah" - -msgid "errors.invite-invalid.info" -msgstr "Jemputan ini mungkin dibatalkan atau mungkin tamat tempoh." - -#: src/app/main/ui/auth/login.cljs -msgid "errors.ldap-disabled" -msgstr "Pengesahan LDAP dilumpuhkan." - -#: src/app/main/errors.cljs -msgid "errors.max-quote-reached" -msgstr "Anda telah mencapai petikan '%s'. Hubungi sokongan." - -#: src/app/main/data/workspace/persistence.cljs -msgid "errors.media-too-large" -msgstr "Imej terlalu besar untuk dimasukkan." - -#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs -msgid "errors.media-type-mismatch" -msgstr "Nampaknya kandungan imej tidak sepadan dengan sambungan fail." - -#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs -msgid "errors.media-type-not-allowed" -msgstr "Nampaknya ini bukan imej yang sah." - -#: src/app/main/ui/dashboard/team.cljs -msgid "errors.member-is-muted" -msgstr "" -"Profil yang anda jemput mempunyai e-mel yang diredamkan (laporan spam atau " -"lantunan tinggi)." - -#: src/app/main/ui/settings/password.cljs -msgid "errors.password-invalid-confirmation" -msgstr "Kata laluan pengesahan mesti sepadan" - -#: src/app/main/ui/settings/password.cljs -msgid "errors.password-too-short" -msgstr "Kata laluan hendaklah sekurang-kurangnya 8 aksara" - -msgid "errors.paste-data-validation" -msgstr "Data tidak sah dalam papan klip" - -msgid "errors.profile-blocked" -msgstr "Profil disekat" - -#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.profile-is-muted" -msgstr "" -"Profil anda mempunyai e-mel yang diredamkan (laporan spam atau lantunan " -"tinggi)." - -#: src/app/main/ui/auth/register.cljs -msgid "errors.registration-disabled" -msgstr "Pendaftaran dilumpuhkan pada masa ini." - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Ciri tidak serasi '%s' dikesan" - -msgid "errors.team-leave.insufficient-members" -msgstr "" -"Ahli tidak mencukupi untuk meninggalkan pasukan, anda mungkin mahu " -"memadamkannya." - -msgid "errors.team-leave.member-does-not-exists" -msgstr "Ahli yang anda cuba tetapkan tidak wujud." - -msgid "errors.team-leave.owner-cant-leave" -msgstr "" -"Pemilik tidak boleh meninggalkan pasukan, anda mesti menetapkan semula " -"peranan pemilik." - -#: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "errors.unexpected-error" -msgstr "Ralat yang tidak dijangka berlaku." - -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.unexpected-token" -msgstr "Token tidak diketahui" - -msgid "errors.validation" -msgstr "Ralat Pengesahan" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Fail mempunyai nombor versi yang tidak serasi" - -msgid "errors.webhooks.connection" -msgstr "Ralat sambungan, URL tidak dapat dicapai" - -msgid "errors.webhooks.invalid-uri" -msgstr "URL tidak lulus pengesahan." - -msgid "errors.webhooks.last-delivery" -msgstr "Penghantaran terakhir tidak berjaya." - -msgid "errors.webhooks.ssl-validation" -msgstr "Ralat pada pengesahan SSL." - -msgid "errors.webhooks.timeout" -msgstr "Masa tamat" - -msgid "errors.webhooks.unexpected" -msgstr "Ralat yang tidak dijangka semasa mengesahkan" - -msgid "errors.webhooks.unexpected-status" -msgstr "Status tidak dijangka %s" - -#: src/app/main/ui/auth/login.cljs -msgid "errors.wrong-credentials" -msgstr "E-mel atau kata laluan tidak betul." - -#: src/app/main/ui/settings/password.cljs -msgid "errors.wrong-old-password" -msgstr "Kata laluan lama tidak betul" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.description" -msgstr "Penerangan" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-go-to" -msgstr "Pergi ke forum Penpot" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-subtitle1" -msgstr "" -"Kami berbesar hati anda berada disini. Jika anda memerlukan bantuan, sila " -"cari sebelum anda menyiarkan siaran baharu." - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-title" -msgstr "Komuniti Penpot" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.subject" -msgstr "Subjek" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.subtitle" -msgstr "" -"Sila terangkan sebab e-mel anda, nyatakan sama ada isu, idea atau keraguan. " -"Seorang ahli pasukan kami akan menjawab secepat mungkin." - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.title" -msgstr "E-mel" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.twitter-go-to" -msgstr "Pergi ke Twitter" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.twitter-subtitle1" -msgstr "Kami di sini untuk membantu dengan pertanyaan teknikal anda." - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.twitter-title" -msgstr "Akaun sokongan Twitter" - -#: src/app/main/ui/settings/password.cljs -msgid "generic.error" -msgstr "Ralat telah berlaku" - -#: src/app/main/ui/inspect/attributes/blur.cljs -msgid "inspect.attributes.blur" -msgstr "Kabur" - -#: src/app/main/ui/inspect/attributes/blur.cljs -msgid "inspect.attributes.blur.value" -msgstr "Nilai" - -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.hex" -msgstr "HEX" - -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.hsla" -msgstr "HSLA" - -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.rgba" -msgstr "RGBA" - -#: src/app/main/ui/inspect/attributes/fill.cljs -msgid "inspect.attributes.fill" -msgstr "Isi" - -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.download" -msgstr "Muat turun sumber gambar" - -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.height" -msgstr "Tinggi" - -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.width" -msgstr "Lebar" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout" -msgstr "Susun atur" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.height" -msgstr "Tinggi" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.left" -msgstr "kiri" - -#: src/app/main/ui/inspect/attributes/layout.cljs, src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.radius" -msgstr "Jejari" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.rotation" -msgstr "Putaran" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.top" -msgstr "Atas" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.width" -msgstr "Lebar" - -#: src/app/main/ui/inspect/attributes/shadow.cljs -msgid "inspect.attributes.shadow" -msgstr "Bayang" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.size" -msgstr "Ukuran dan kedudukan" - -#: src/app/main/ui/inspect/attributes/stroke.cljs -#, fuzzy -msgid "inspect.attributes.stroke" -msgstr "Gurisan" - -#, permanent -msgid "inspect.attributes.stroke.alignment.center" -msgstr "Tengah" - -#, permanent -msgid "inspect.attributes.stroke.alignment.inner" -msgstr "Dalam" - -#, permanent -msgid "inspect.attributes.stroke.alignment.outer" -msgstr "Luar" - -msgid "inspect.attributes.stroke.style.dotted" -msgstr "Bertitik" - -msgid "inspect.attributes.stroke.style.mixed" -msgstr "bercampur" - -msgid "inspect.attributes.stroke.style.none" -msgstr "Tiada" - -msgid "inspect.attributes.stroke.style.solid" -msgstr "Padu" - -#: src/app/main/ui/inspect/attributes/stroke.cljs -msgid "inspect.attributes.stroke.width" -msgstr "Lebar" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography" -msgstr "Tipografi" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-family" -msgstr "Keluarga Fon" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-size" -msgstr "Saiz huruf" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-style" -msgstr "Gaya Huruf" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-weight" -msgstr "Berat Huruf" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.letter-spacing" -msgstr "Jarak Huruf" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.line-height" -msgstr "Tinggi Garis" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.text-decoration" -msgstr "Hiasan Teks" - -msgid "inspect.attributes.typography.text-decoration.none" -msgstr "Tiada" - -msgid "inspect.attributes.typography.text-decoration.strikethrough" -msgstr "Tembus" - -msgid "inspect.attributes.typography.text-decoration.underline" -msgstr "Garis bawah" - -#: src/app/main/ui/inspect/attributes/text.cljs -#, fuzzy -msgid "inspect.attributes.typography.text-transform" -msgstr "Transformasian Teks" - -msgid "inspect.attributes.typography.text-transform.lowercase" -msgstr "Huruf Kecil" - -msgid "inspect.attributes.typography.text-transform.none" -msgstr "Tiada" - -msgid "inspect.attributes.typography.text-transform.titlecase" -msgstr "Huruf Tajuk" - -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Nyahset" - -msgid "inspect.attributes.typography.text-transform.uppercase" -msgstr "Huruf Besar" - -msgid "inspect.empty.help" -msgstr "" -"Jika anda ingin mengetahui lebih lanjut tentang pemeriksaan reka bentuk, " -"lawati pusat bantuan Penpot" - -#, fuzzy -msgid "inspect.empty.more-info" -msgstr "Maklumat lanjut tentang inspect" - -msgid "inspect.empty.select" -msgstr "Pilih bentuk, papan atau kumpulan untuk memeriksa sifat dan kod mereka" - -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.code" -msgstr "Kod" - -msgid "inspect.tabs.code.selected.circle" -msgstr "Bulatan" - -msgid "inspect.tabs.code.selected.component" -msgstr "Komponen" - -msgid "inspect.tabs.code.selected.curve" -msgstr "Lengkung" - -msgid "inspect.tabs.code.selected.frame" -msgstr "Papan" - -msgid "inspect.tabs.code.selected.group" -msgstr "Kumpulan" - -msgid "inspect.tabs.code.selected.image" -msgstr "Gambar" - -msgid "inspect.tabs.code.selected.mask" -msgstr "Maska" - -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.code.selected.multiple" -msgstr "%s Dipilih" - -msgid "inspect.tabs.code.selected.path" -msgstr "Laluan" - -msgid "inspect.tabs.code.selected.rect" -msgstr "Segi empat tepat" - -msgid "inspect.tabs.code.selected.svg-raw" -msgstr "SVG" - -msgid "inspect.tabs.code.selected.text" -msgstr "Teks" - -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.info" -msgstr "Maklumat" - -#: src/app/main/ui/workspace/header.cljs -msgid "label.shortcuts" -msgstr "Pintasan" - -msgid "labels.accept" -msgstr "Terima" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.access-tokens" -msgstr "Token capaian" - -msgid "labels.active" -msgstr "Aktif" - -msgid "labels.add-custom-font" -msgstr "Tambah fon tersuai" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.admin" -msgstr "Pentadbir" - -#: src/app/main/ui/workspace/comments.cljs -msgid "labels.all" -msgstr "Semua" - -msgid "labels.and" -msgstr "dan" - -msgid "labels.back" -msgstr "Kembali" - -#: src/app/main/ui/static.cljs -msgid "labels.bad-gateway.desc-message" -msgstr "" -"Nampaknya anda perlu menunggu sebentar dan mencuba semula; kami sedang " -"melakukan penyelenggaraan kecil pelayan kami." - -#: src/app/main/ui/static.cljs -msgid "labels.bad-gateway.main-message" -msgstr "Ralat pelayan (Bad Gateway)" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.cancel" -msgstr "Batal" - -msgid "labels.close" -msgstr "Tutup" - -#: src/app/main/ui/dashboard/comments.cljs -msgid "labels.comments" -msgstr "Komen" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.community" -msgstr "Komuniti" - -#: src/app/main/ui/settings/password.cljs -msgid "labels.confirm-password" -msgstr "Sahkan kata laluan" - -msgid "labels.continue" -msgstr "Teruskan" - -msgid "labels.continue-with" -msgstr "Teruskan dengan" - -msgid "labels.continue-with-penpot" -msgstr "Anda boleh meneruskan dengan akaun Penpot" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.copy-invitation-link" -msgstr "Salin pautan" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "labels.create" -msgstr "Cipta" - -#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs -msgid "labels.create-team" -msgstr "Cipta pasukan baharu" - -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.create-team.placeholder" -msgstr "Masukkan nama pasukan baharu" - -msgid "labels.custom-fonts" -msgstr "Fon tersuai" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.dashboard" -msgstr "Papan pemuka" - -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.delete" -msgstr "Padam" - -#: src/app/main/ui/comments.cljs -msgid "labels.delete-comment" -msgstr "Padam komen" - -#: src/app/main/ui/comments.cljs -msgid "labels.delete-comment-thread" -msgstr "Padam bebenang" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.delete-invitation" -msgstr "Padam jemputan" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.delete-multi-files" -msgstr "Padam fail %s" - -msgid "labels.discard" -msgstr "Buang" - -#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.drafts" -msgstr "Draf" - -#: src/app/main/ui/comments.cljs -msgid "labels.edit" -msgstr "Sunting" - -msgid "labels.edit-file" -msgstr "Sunting fail" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.editor" -msgstr "Penyunting" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.expired-invitation" -msgstr "Tamat tempoh" - -msgid "labels.export" -msgstr "Eksport" - -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.feedback-disabled" -msgstr "Maklum balas dilumpuhkan" - -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.feedback-sent" -msgstr "Maklum balas dihantar" - -msgid "labels.font-family" -msgstr "Keluarga Fon" - -msgid "labels.font-providers" -msgstr "Pembekal fon" - -msgid "labels.font-variants" -msgstr "Gaya" - -msgid "labels.fonts" -msgstr "Fon" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.github-repo" -msgstr "Repositori Github" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.give-feedback" -msgstr "Beri maklum balas" - -msgid "labels.go-back" -msgstr "Pergi balik" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.help-center" -msgstr "Pusat Bantuan" - -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.hide-resolved-comments" -msgstr "Sembunyikan komen yang diselesaikan" - -msgid "labels.inactive" -msgstr "tidak aktif" - -msgid "labels.installed-fonts" -msgstr "Fon yang dipasang" - -#: src/app/main/ui/static.cljs -msgid "labels.internal-error.desc-message" -msgstr "" -"Sesuatu yang buruk telah berlaku. Sila cuba semula operasi dan jika masalah " -"berterusan, hubungi sokongan." - -#: src/app/main/ui/static.cljs -msgid "labels.internal-error.main-message" -msgstr "Ralat Dalaman" - -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.invitations" -msgstr "Jemputan" - -#: src/app/main/ui/settings/options.cljs -msgid "labels.language" -msgstr "Bahasa" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.libraries-and-templates" -msgstr "Perpustakaan & Templat" - -msgid "labels.log-or-sign" -msgstr "Log masuk atau daftar" - -#: src/app/main/ui/settings.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.logout" -msgstr "Log keluar" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.member" -msgstr "Ahli" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.members" -msgstr "Ahli" - -#: src/app/main/ui/settings/password.cljs -msgid "labels.new-password" -msgstr "Kata laluan baharu" - -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs -msgid "labels.no-comments-available" -msgstr "" -"Anda telah melihat semua yang baru! Pemberitahuan ulasan baharu akan " -"dipaparkan di sini." - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.no-invitations" -msgstr "Tiada jemputan tertunda." - -#: src/app/main/ui/dashboard/team.cljs -#, markdown -msgid "labels.no-invitations-hint" -msgstr "Klik butang **Jemput orang** untuk menjemput orang ke pasukan ini." - -#: src/app/main/ui/static.cljs -msgid "labels.not-found.desc-message" -msgstr "" -"Halaman ini mungkin tidak wujud atau anda tiada kebenaran untuk " -"mengaksesnya." - -#: src/app/main/ui/static.cljs -msgid "labels.not-found.main-message" -msgstr "Alamak!" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.num-of-files" -msgid_plural "labels.num-of-files" -msgstr[0] "%s fail" - -msgid "labels.num-of-frames" -msgid_plural "labels.num-of-frames" -msgstr[0] "%s papan" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.num-of-projects" -msgid_plural "labels.num-of-projects" -msgstr[0] "%s projek" - -#: src/app/main/ui/settings/password.cljs -msgid "labels.old-password" -msgstr "Kata laluan lama" - -#: src/app/main/ui/workspace/comments.cljs -msgid "labels.only-yours" -msgstr "Hanya milik anda" - -msgid "labels.or" -msgstr "atau" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.owner" -msgstr "Pemilik" - -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.password" -msgstr "Kata laluan" - -#: src/app/main/ui/dashboard/team.cljs -#, fuzzy -msgid "labels.pending-invitation" -msgstr "Belum selesai" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.profile" -msgstr "Profil" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.projects" -msgstr "Projek" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.release-notes" -msgstr "Nota keluaran" - -#: src/app/main/ui/workspace.cljs -msgid "labels.reload-file" -msgstr "Muat semula fail" - -#: src/app/main/ui/workspace/libraries.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.remove" -msgstr "Alih keluar" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.remove-member" -msgstr "Buang ahli" - -#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.rename" -msgstr "Namakan semula" - -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.rename-team" -msgstr "Namakan semula pasukan" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.resend-invitation" -msgstr "Hantar semula jemputan" - -#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs -msgid "labels.retry" -msgstr "Cuba semula" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.role" -msgstr "Peranan" - -msgid "labels.save" -msgstr "Simpan" - -msgid "labels.search" -msgstr "Cari" - -msgid "labels.search-font" -msgstr "Cari fon" - -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.send" -msgstr "Hantar" - -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.sending" -msgstr "Menghantar…" - -#: src/app/main/ui/static.cljs -msgid "labels.service-unavailable.desc-message" -msgstr "Kami sedang menjalankan penyelenggaraan berjadual pada sistem kami." - -#: src/app/main/ui/static.cljs -msgid "labels.service-unavailable.main-message" -msgstr "Perkhidmatan Tidak Tersedia" - -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.settings" -msgstr "Tetapan" - -msgid "labels.share" -msgstr "Kongsi" - -msgid "labels.share-prototype" -msgstr "Kongsi prototaip" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.shared-libraries" -msgstr "Perpustakaan" - -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.show-all-comments" -msgstr "Paparkan semua komen" - -msgid "labels.show-comments-list" -msgstr "Paparkan senarai komen" - -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.show-your-comments" -msgstr "Paparkan komen anda sahaja" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.status" -msgstr "Status" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.tutorials" -msgstr "Tutorial" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.unpublish-multi-files" -msgstr "Nyahterbitkan %s fail" - -#: src/app/main/ui/settings/profile.cljs -msgid "labels.update" -msgstr "Kemas kini" - -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.update-team" -msgstr "Kemas kini pasukan" - -msgid "labels.upload" -msgstr "Muat naik" - -msgid "labels.upload-custom-fonts" -msgstr "Muat naik fon tersuai" - -msgid "labels.uploading" -msgstr "Memuat naik…" - -msgid "labels.view-only" -msgstr "LIHAT SAHAJA" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.viewer" -msgstr "Penonton" - -msgid "labels.webhooks" -msgstr "Cangkuk Web (Webhook)" - -#: src/app/main/ui/comments.cljs -msgid "labels.write-new-comment" -msgstr "Tulis komen baharu" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.you" -msgstr "(anda)" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.your-account" -msgstr "Akaun anda" - -#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs -msgid "media.loading" -msgstr "Memuatkan gambar…" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Pustaka anda kosong. Setelah ditambahkan sebagai Pustaka Dikongsi, aset " -"yang anda buat akan tersedia untuk digunakan antara fail anda yang lain. " -"Adakah anda pasti mahu menerbitkannya?" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.accept" -msgstr "Tambah sebagai Pustaka Kongsi" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.hint" -msgstr "" -"Setelah ditambahkan sebagai Pustaka Kongsi, aset pustaka fail ini akan " -"tersedia untuk digunakan antara fail anda yang lain." - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.message" -msgstr "Tambah “%s” sebagai Pustaka Kongsi" - -#: src/app/main/ui/workspace/nudge.cljs -#, fuzzy -msgid "modals.big-nudge" -msgstr "Anjakan besar" - -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.confirm-email" -msgstr "Sahkan e-mel baharu" - -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.info" -msgstr "" -"Kami akan menghantar e-mel ke e-mel semasa anda “%s” untuk pengesahan " -"identiti." - -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.new-email" -msgstr "E-mel baharu" - -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.submit" -msgstr "Tukar e-mel" - -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.title" -msgstr "Tukar e-mel anda" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.copy-token" -msgstr "Salin token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.expiration-date.label" -msgstr "Tarikh tamat tempoh" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.label" -msgstr "Nama" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.placeholder" -msgstr "Nama boleh membantu untuk mengetahui token itu untuk apa" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.submit-label" -msgstr "Cipta token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.title" -msgstr "Jana token capaian" - -msgid "modals.create-webhook.submit-label" -msgstr "Cipta cangkuk web (webhook)" - -msgid "modals.create-webhook.title" -msgstr "Cipta cangkuk web (webhook)" - -msgid "modals.create-webhook.url.label" -msgstr "URL muatan" - -msgid "modals.create-webhook.url.placeholder" -msgstr "https://example.com/postreceive" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.accept" -msgstr "Padam token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.message" -msgstr "Adakah anda pasti mahu memadamkan token ini?" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.title" -msgstr "Padam token" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.cancel" -msgstr "Batal dan kekalkan akaun saya" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.confirm" -msgstr "Ya, padam akaun saya" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.info" -msgstr "" -"Dengan mengalih keluar akaun anda, anda akan kehilangan semua projek dan " -"arkib semasa anda." - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.title" -msgstr "Adakah anda pasti mahu memadam akaun anda?" - -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.accept" -msgstr "Padam perbualan" - -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.message" -msgstr "" -"Adakah anda pasti mahu memadamkan perbualan ini? Semua komen dalam urutan " -"ini akan dipadamkan." - -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.title" -msgstr "Padam perbualan" - -msgid "modals.delete-component-annotation.message" -msgstr "Adakah anda pasti ingin memadamkan anotasi ini?" - -msgid "modals.delete-component-annotation.title" -msgstr "Padam anotasi" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.accept" -msgstr "Padam fail" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.message" -msgstr "Adakah anda pasti mahu memadamkan fail ini?" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.title" -msgstr "Memadam fail" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-multi-confirm.accept" -msgstr "Padam fail" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-multi-confirm.message" -msgstr "Adakah anda pasti mahu memadamkan %s fail?" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-multi-confirm.title" -msgstr "Memadamkan %s fail" - -msgid "modals.delete-font-variant.message" -msgstr "" -"Adakah anda pasti mahu memadamkan gaya fon ini? Ia tidak akan dimuatkan " -"jika digunakan dalam fail." - -msgid "modals.delete-font-variant.title" -msgstr "Memadam gaya fon" - -msgid "modals.delete-font.message" -msgstr "" -"Adakah anda pasti mahu memadamkan fon ini? Ia tidak akan dimuatkan jika " -"digunakan dalam fail." - -msgid "modals.delete-font.title" -msgstr "Memadam fon" - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "modals.delete-page.body" -msgstr "Adakah anda pasti mahu memadamkan halaman ini?" - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "modals.delete-page.title" -msgstr "Padam halaman" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.accept" -msgstr "Padam projek" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.message" -msgstr "Adakah anda pasti mahu memadamkan projek ini?" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.title" -msgstr "Padam projek" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.accept" -msgid_plural "modals.delete-shared-confirm.accept" -msgstr[0] "Padam fail" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.no-files-message" -msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "Ia tidak diaktifkan dalam mana-mana fail." - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.scd-message" -msgid_plural "modals.delete-shared-confirm.activated.scd-message" -msgstr[0] "Pustaka ini diaktifkan di sini: " - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.message" -msgid_plural "modals.delete-shared-confirm.message" -msgstr[0] "Adakah anda pasti mahu memadamkan fail ini?" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.title" -msgid_plural "modals.delete-shared-confirm.title" -msgstr[0] "Memadam fail" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.accept" -msgstr "Padam pasukan" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.message" -msgstr "" -"Adakah anda pasti mahu memadamkan pasukan ini? Semua projek dan fail yang " -"dikaitkan dengan pasukan akan dipadamkan secara kekal." - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.title" -msgstr "Memadam pasukan" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.accept" -msgstr "Padam ahli" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.message" -msgstr "Adakah anda pasti mahu memadamkan ahli ini daripada pasukan?" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.title" -msgstr "Padam ahli pasukan" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "" -"Aset yang telah digunakan dalam fail ini akan kekal di sana (tiada reka " -"bentuk akan rosak)." - -msgid "modals.delete-webhook.accept" -msgstr "Padam cangkuk web (webhook)" - -msgid "modals.delete-webhook.message" -msgstr "Adakah anda pasti mahu memadamkan cangkuk web (webhook) ini?" - -msgid "modals.delete-webhook.title" -msgstr "Memadam cangkuk web (webhook)" - -msgid "modals.edit-webhook.submit-label" -msgstr "Sunting cangkuk web (webhook)" - -msgid "modals.edit-webhook.title" -msgstr "Sunting cangkuk web (webhook)" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.invite-member-confirm.accept" -msgstr "Hantar jemputan" - -msgid "modals.invite-member.emails" -msgstr "E-mel, dipisahkan dengan koma" - -msgid "modals.invite-member.repeated-invitation" -msgstr "" -"Sesetengah e-mel adalah daripada ahli pasukan semasa. Jemputan mereka tidak " -"akan dihantar." - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.invite-team-member.title" -msgstr "Jemput ahli ke pasukan" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-close-confirm.hint" -msgstr "" -"Memandangkan anda satu-satunya ahli pasukan, pasukan ini akan dipadamkan " -"bersama-sama dengan projek dan failnya." - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-close-confirm.message" -msgstr "Adakah anda pasti mahu meninggalkan pasukan %s?" - -msgid "modals.leave-and-reassign.forbidden" -msgstr "" -"Anda tidak boleh meninggalkan pasukan jika tiada ahli lain untuk dinaikkan " -"pangkat kepada pemilik. Anda mungkin mahu memadamkan pasukan." - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.hint1" -msgstr "" -"Anda adalah pemilik pasukan ini. Sila pilih ahli lain untuk dinaikkan " -"pangkat kepada pemilik sebelum anda pergi." - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.promote-and-leave" -msgstr "Naik pangkat dan tinggalkan" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.select-member-to-promote" -msgstr "Pilih ahli untuk dinaikkan pangkat" - -#: src/app/main/ui/dashboard/sidebar.cljs -#, fuzzy -msgid "modals.leave-and-reassign.title" -msgstr "Sebelum anda pergi" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-confirm.accept" -msgstr "Tinggalkan pasukan" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-confirm.message" -msgstr "Adakah anda pasti mahu meninggalkan pasukan ini?" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-confirm.title" -msgstr "Meninggalkan pasukan" - -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.nudge-title" -msgstr "Jumlah anjakan" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.accept" -msgstr "Pindah hak milik" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.hint" -msgstr "" -"Jika anda memindahkan pemilikan, anda akan menukar peranan anda kepada " -"Pentadbir, kehilangan beberapa kebenaran ke atas pasukan ini. " - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.message" -msgstr "" -"Anda adalah pemilik semasa pasukan ini. Adakah anda pasti mahu menjadikan " -"%s pemilik baharu pasukan?" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.title" -msgstr "Pemilik pasukan baru" - -msgid "modals.publish-empty-library.accept" -msgstr "Terbitkan" - -msgid "modals.publish-empty-library.message" -msgstr "Pustaka anda kosong. Adakah anda pasti mahu menerbitkannya?" - -msgid "modals.publish-empty-library.title" -msgstr "Terbitkan perpustakaan kosong" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.accept" -msgstr "Alih keluar sebagai Pustaka Kongsi" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.hint" -msgstr "" -"Setelah dialih keluar sebagai Pustaka Kongsi, Pustaka Fail fail ini akan " -"berhenti tersedia untuk digunakan di antara fail anda yang lain." - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.message" -msgstr "Alih keluar \"%s\" sebagai Pustaka Kongsi" - -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.small-nudge" -msgstr "Anjakan kecil" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.accept" -msgid_plural "modals.unpublish-shared-confirm.accept" -msgstr[0] "Nyahterbit" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.activated.no-files-message" -msgid_plural "modals.unpublish-shared-confirm.activated.no-files-message" -msgstr[0] "Ia tidak diaktifkan dalam mana-mana fail." - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.activated.scd-message" -msgid_plural "modals.unpublish-shared-confirm.activated.scd-message" -msgstr[0] "Perpustakaan ini diaktifkan di sini:" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.message" -msgid_plural "modals.unpublish-shared-confirm.message" -msgstr[0] "Adakah anda pasti mahu menyahterbitkan perpustakaan ini?" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.title" -msgid_plural "modals.unpublish-shared-confirm.title" -msgstr[0] "Nyahterbit pustaka" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component-in-bulk.hint" -msgstr "" -"Anda akan mengemas kini komponen dalam pustaka kongsi. Ini mungkin " -"menjejaskan fail lain yang menggunakannya." - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component-in-bulk.message" -msgstr "Kemas kini komponen dalam pustaka kongsi" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.accept" -msgstr "Kemas kini" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.cancel" -msgstr "Batal" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.hint" -msgstr "" -"Anda akan mengemas kini komponen dalam pustaka kongsi. Ini mungkin " -"menjejaskan fail lain yang menggunakannya." - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.message" -msgstr "Kemas kini komponen dalam pustaka kongsi" - -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "Versi baharu tersedia, sila muat semula halaman" - -#: src/app/main/ui/dashboard/team.cljs -msgid "notifications.invitation-email-sent" -msgstr "Jemputan berjaya dihantar" - -#: src/app/main/ui/dashboard/team.cljs -msgid "notifications.invitation-link-copied" -msgstr "Pautan jemputan disalin" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "notifications.profile-deletion-not-allowed" -msgstr "" -"Anda tidak boleh memadamkan profil anda. Tetapkan semula pasukan anda " -"sebelum meneruskan." - -#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs -msgid "notifications.profile-saved" -msgstr "Profil berjaya disimpan!" - -#: src/app/main/ui/settings/change_email.cljs -msgid "notifications.validation-email-sent" -msgstr "E-mel pengesahan dihantar kepada %s. Semak e-mel anda!" - -msgid "onboarding-v2.before-start.desc1" -msgstr "" -"Anda harus tahu bahawa terdapat banyak sumber yang tersedia untuk membantu " -"anda bermula dengan Penpot, seperti Panduan Pengguna dan saluran Youtube " -"kami." - -msgid "onboarding-v2.before-start.desc2" -msgstr "" -"Maklumat terperinci tentang cara menggunakan Penpot. Daripada prototaip " -"kepada menyusun atau berkongsi reka bentuk." - -msgid "onboarding-v2.before-start.desc2.title" -msgstr "Panduan pengguna" - -msgid "onboarding-v2.before-start.desc3" -msgstr "" -"Anda boleh menonton tutorial kami dan tutorial yang dibuat oleh komuniti " -"kami." - -msgid "onboarding-v2.before-start.desc3.title" -msgstr "Video tutorial" - -msgid "onboarding-v2.before-start.title" -msgstr "Sebelum anda mula" - -msgid "onboarding-v2.newsletter.desc" -msgstr "" -"Langgan surat berita Penpot untuk mengikuti perkembangan dan berita " -"pembangunan produk." - -msgid "onboarding-v2.newsletter.news" -msgstr "" -"Hantar kepada saya berita tentang Penpot (siaran blog, tutorial video, " -"penstriman...)." - -msgid "onboarding-v2.newsletter.privacy1" -msgstr "Kami mengambil berat tentang privasi, di sini anda boleh membaca. " - -msgid "onboarding-v2.newsletter.privacy2" -msgstr "" -"Kami hanya akan menghantar e-mel yang berkaitan kepada anda. Anda boleh " -"berhenti melanggan pada bila-bila masa melalui pautan nyahlanggan dalam " -"mana-mana surat berita kami." - -msgid "onboarding-v2.newsletter.updates" -msgstr "Hantar kepada saya kemas kini produk (ciri baharu, keluaran, pembetulan...)." - -msgid "onboarding-v2.welcome.desc1" -msgstr "" -"Penpot ialah Sumber Terbuka dan ia dibuat oleh Kaleidos serta komuniti, di " -"mana ramai orang sudah membantu antara satu sama lain. Semua orang boleh " -"bekerjasama dengan:" - -msgid "onboarding-v2.welcome.desc2" -msgstr "" -"Ruang awam untuk belajar, berkongsi dan membincangkan tentang Penpot, masa " -"kini dan masa depannya dengan seluruh Komuniti dan pasukan teras Penpot." - -msgid "onboarding-v2.welcome.desc2.title" -msgstr "Mengambil bahagian dalam Komuniti" - -msgid "onboarding-v2.welcome.desc3" -msgstr "" -"Di mana anda akan menemui cara untuk bekerjasama dengan terjemahan, " -"permintaan ciri, sumbangan teras, pemburuan pepijat…" - -msgid "onboarding-v2.welcome.desc3.title" -msgstr "Panduan memberi sumbangan" - -msgid "onboarding-v2.welcome.title" -msgstr "Selamat datang ke Penpot!" - -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Teruskan mencipta pasukan" - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Teruskan tanpa pasukan" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Buat pasukan & jemput" - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Buat pasukan dan hantar jemputan" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Anda boleh menjemput kemudian" - -msgid "onboarding.choice.team-up.create-team-desc" -msgstr "" -"Selepas menamakan pasukan anda, anda akan dapat menjemput orang untuk " -"menyertai." - -msgid "onboarding.choice.team-up.create-team-placeholder" -msgstr "Masukkan nama pasukan" - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Cipta pasukan" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Buat pasukan tanpa menjemput" - -msgid "onboarding.choice.team-up.invite-members" -msgstr "Jemput ahli" - -msgid "onboarding.choice.team-up.invite-members-info" -msgstr "" -"Ingat untuk memasukkan semua orang. Pemaju, pereka bentuk, pengurus... " -"kepelbagaian bertambah :)" - -msgid "onboarding.choice.team-up.roles" -msgstr "Jemput dengan peranan:" - -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Mulakan tanpa pasukan" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Anda boleh membuat pasukan kemudian." - -msgid "onboarding.newsletter.accept" -msgstr "Ya, langgan" - -msgid "onboarding.newsletter.acceptance-message" -msgstr "" -"Permintaan langganan anda telah dihantar, kami akan menghantar e-mel kepada " -"anda untuk mengesahkannya." - -msgid "onboarding.newsletter.policy" -msgstr "Dasar Privasi." - -msgid "onboarding.newsletter.title" -msgstr "Ingin menerima berita Penpot?" - -msgid "onboarding.team-modal.create-team" -msgstr "Cipta pasukan" - -msgid "onboarding.team-modal.create-team-desc" -msgstr "" -"Pasukan membolehkan anda bekerjasama dengan pengguna Penpot lain yang " -"bekerja dalam fail dan projek yang sama." - -msgid "onboarding.team-modal.create-team-feature-1" -msgstr "Fail dan projek tanpa had" - -msgid "onboarding.team-modal.create-team-feature-2" -msgstr "Edisi berbilang pemain" - -msgid "onboarding.team-modal.create-team-feature-3" -msgstr "Pengurusan peranan" - -msgid "onboarding.team-modal.create-team-feature-4" -msgstr "Ahli tanpa had" - -msgid "onboarding.team-modal.create-team-feature-5" -msgstr "100% percuma!" - -msgid "onboarding.templates.subtitle" -msgstr "Berikut adalah beberapa templat." - -msgid "onboarding.templates.title" -msgstr "Mula mereka bentuk" - -msgid "onboarding.welcome.alt" -msgstr "Penpot" - -#: src/app/main/ui/auth/recovery.cljs -msgid "profile.recovery.go-to-login" -msgstr "Pergi ke log masuk" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "Alat reka bentuk yang manakah anda mempunyai lebih banyak pengalaman?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "11-30" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "31-50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "Banyak" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Adobe XD" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Canva" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "Bagaimanakah cara terbaik anda menerangkan pengalaman anda bekerja pada..." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "Pereka bentuk" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "Pembangun" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "Ketahui lebih lanjut tentang Penpot" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Figma" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Pengasas/VP" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "Saya seorang pekerja bebas (freelancer)" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "Dapatkan kod daripada projek pasukan saya " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "... reka bentuk antara muka, aset visual, sistem reka bentuk, dsb." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "InVision" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "Tinggalkan maklum balas untuk projek pasukan saya" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "Mari mulakan!" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "Pengurus Produk atau Projek" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Pemasaran" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "Lebih daripada 50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.never-used-a-tool" -msgstr "Saya tidak pernah menggunakan alat reka bentuk sebelum ini" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "Seterusnya" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "Tiada" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "Lain-lain (nyatakan)" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "Saya sedang menjalankan projek peribadi" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "Sebelumnya" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "Bagaimanakah anda merancang untuk menggunakan Penpot?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "Apakah peranan anda?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "Pilih pilihan" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Sketch" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.some" -msgstr "Beberapa" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "Mula" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "Mula mengerjakan projek saya" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "Pelajar atau guru" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "Berapakah saiz pasukan anda?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "Uji Penpot untuk melihat sama ada ia sesuai untuk pasukan " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "Cuba sebelum menggunakan Penpot pada pelayar peribadi" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "... rangka wayar, perjalanan & aliran pengguna, pepohon navigasi, dsb." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "Bekerja dalam idea konsep" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"Maklum balas anda akan membantu kami memahami tabiat dan keutamaan anda " -"supaya kami boleh terus menjadikan Penpot sebagai alat yang berguna dan " -"menyeronokkan." - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -#, fuzzy -msgid "settings.detach" -msgstr "Tanggalkan" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "settings.multiple" -msgstr "Bercampur" - -# SECTIONS -msgid "shortcut-section.basics" -msgstr "Asas" - -msgid "shortcut-section.dashboard" -msgstr "Papan pemuka" - -msgid "shortcut-section.viewer" -msgstr "Penonton" - -msgid "shortcut-section.workspace" -msgstr "Ruang kerja" - -# SUBSECTIONS -msgid "shortcut-subsection.alignment" -msgstr "Penjajaran" - -msgid "shortcut-subsection.edit" -msgstr "Sunting" - -msgid "shortcut-subsection.general-dashboard" -msgstr "Generik" - -msgid "shortcut-subsection.general-viewer" -msgstr "Generik" - -msgid "shortcut-subsection.main-menu" -msgstr "Menu utama" - -msgid "shortcut-subsection.modify-layers" -msgstr "Ubah suai lapisan" - -msgid "shortcut-subsection.navigation-dashboard" -msgstr "Navigasi" - -msgid "shortcut-subsection.navigation-viewer" -msgstr "Navigasi" - -msgid "shortcut-subsection.navigation-workspace" -msgstr "Navigasi" - -msgid "shortcut-subsection.panels" -msgstr "Panel" - -msgid "shortcut-subsection.path-editor" -msgstr "laluan" - -msgid "shortcut-subsection.shape" -msgstr "Bentuk" - -msgid "shortcut-subsection.text-editor" -msgstr "Teks" - -msgid "shortcut-subsection.tools" -msgstr "Alatan" - -msgid "shortcut-subsection.zoom-viewer" -msgstr "Zum" - -msgid "shortcut-subsection.zoom-workspace" -msgstr "Zum" - -msgid "shortcuts.add-comment" -msgstr "Komen" - -msgid "shortcuts.add-node" -msgstr "Tambah nota" - -msgid "shortcuts.align-bottom" -msgstr "Sejajarkan bahagian bawah" - -msgid "shortcuts.align-center" -msgstr "Jajarkan tengah" - -msgid "shortcuts.align-hcenter" -msgstr "Jajarkan tengah secara mendatar" - -msgid "shortcuts.align-justify" -msgstr "Mengimbangkan keselarasan" - -msgid "shortcuts.align-left" -msgstr "Jajar ke kiri" - -msgid "shortcuts.align-right" -msgstr "Sejajar ke kanan" - -msgid "shortcuts.align-top" -msgstr "Jajarkan atas" - -msgid "shortcuts.align-vcenter" -msgstr "Jajarkan tengah secara menegak" - -msgid "shortcuts.artboard-selection" -msgstr "Cipta papan daripada pemilihan" - -msgid "shortcuts.bold" -msgstr "Togol tebal" - -msgid "shortcuts.bool-difference" -msgstr "Perbezaan Boolean" - -msgid "shortcuts.bool-exclude" -msgstr "Pengecualian Boolean" - -msgid "shortcuts.bool-intersection" -msgstr "Persimpangan Boolean" - -msgid "shortcuts.bool-union" -msgstr "Kesatuan Boolean" - -msgid "shortcuts.bring-back" -msgstr "Hantar ke paling belakang" - -msgid "shortcuts.bring-backward" -msgstr "Hantar ke belakang" - -msgid "shortcuts.bring-forward" -msgstr "Bawa ke hadapan" - -msgid "shortcuts.bring-front" -msgstr "Bawa ke paling hadapan" - -msgid "shortcuts.clear-undo" -msgstr "Kosongkan buat asal" - -msgid "shortcuts.copy" -msgstr "Salin" - -msgid "shortcuts.create-component" -msgstr "Cipta komponen" - -msgid "shortcuts.create-new-project" -msgstr "Buat baharu" - -msgid "shortcuts.cut" -msgstr "Potong" - -msgid "shortcuts.decrease-zoom" -msgstr "Zum keluar" - -msgid "shortcuts.delete" -msgstr "Padam" - -msgid "shortcuts.delete-node" -msgstr "Padamkan nod" - -msgid "shortcuts.detach-component" -msgstr "Tanggalkan komponen" - -msgid "shortcuts.draw-curve" -msgstr "Lengkung" - -msgid "shortcuts.draw-ellipse" -msgstr "elips" - -msgid "shortcuts.draw-frame" -msgstr "Papan" - -msgid "shortcuts.draw-nodes" -msgstr "Lukis laluan" - -msgid "shortcuts.draw-path" -msgstr "Laluan" - -msgid "shortcuts.draw-rect" -msgstr "Segi empat tepat" - -msgid "shortcuts.draw-text" -msgstr "Teks" - -msgid "shortcuts.duplicate" -msgstr "Pendua" - -msgid "shortcuts.escape" -msgstr "Batal" - -msgid "shortcuts.export-shapes" -msgstr "Eksport bentuk" - -msgid "shortcuts.fit-all" -msgstr "Zum untuk muat semua" - -msgid "shortcuts.flip-horizontal" -msgstr "Terbalikkan secara mendatar" - -msgid "shortcuts.flip-vertical" -msgstr "Terbalikkan secara menegak" - -msgid "shortcuts.font-size-dec" -msgstr "Kurangkan saiz fon" - -msgid "shortcuts.font-size-inc" -msgstr "Tambah saiz fon" - -msgid "shortcuts.go-to-drafts" -msgstr "Pergi ke draf" - -msgid "shortcuts.go-to-libs" -msgstr "Pergi ke perpustakaan kongsi" - -msgid "shortcuts.go-to-search" -msgstr "Cari" - -msgid "shortcuts.group" -msgstr "Kumpulan" - -msgid "shortcuts.h-distribute" -msgstr "Edarkan secara mendatar" - -msgid "shortcuts.hide-ui" -msgstr "Tunjukkan / Sembunyikan UI" - -msgid "shortcuts.increase-zoom" -msgstr "Zum kedalam" - -msgid "shortcuts.insert-image" -msgstr "Masukkan gambar" - -msgid "shortcuts.italic" -msgstr "Togol condong" - -msgid "shortcuts.join-nodes" -msgstr "Sambung nod" - -msgid "shortcuts.letter-spacing-dec" -msgstr "Kurangkan jarak huruf" - -msgid "shortcuts.letter-spacing-inc" -msgstr "Penambahan jarak huruf" +#: src/app/main/ui/export.cljs +msgid "dashboard.export-frames.title" +msgstr "Eksport sebagai PDF" diff --git a/frontend/translations/nl.po b/frontend/translations/nl.po index c2676f780..3e7a9bc04 100644 --- a/frontend/translations/nl.po +++ b/frontend/translations/nl.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-12 19:02+0000\n" +"PO-Revision-Date: 2023-12-29 21:08+0000\n" "Last-Translator: Stephan Paternotte \n" -"Language-Team: Dutch " -"\n" +"Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -118,7 +118,8 @@ msgstr "Wachtwoord succesvol gewijzigd" #: src/app/main/ui/auth/recovery_request.cljs msgid "auth.notifications.profile-not-verified" -msgstr "Profiel is niet geverifieerd. Verifieer het profiel voordat je verder gaat." +msgstr "" +"Profiel is niet geverifieerd. Verifieer het profiel voordat je verder gaat." #: src/app/main/ui/auth/recovery_request.cljs msgid "auth.notifications.recovery-token-sent" @@ -188,13 +189,6 @@ msgstr "" "Met het aanmaken van een nieuw account ga je akkoord met onze " "gebruiksvoorwaarden en ons privacybeleid." -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Met het aanmaken van een nieuw account ga je akkoord met onze " -"[servicevoorwaarden] (%s) en [privacybeleid] (%s)." - #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "We hebben een verificatie-e-mail verzonden naar" @@ -291,7 +285,8 @@ msgstr "Praktische introductie" #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.walkthrough-hero.info" -msgstr "Maak een rondleiding door Penpot en leer de belangrijkste functies kennen." +msgstr "" +"Maak een rondleiding door Penpot en leer de belangrijkste functies kennen." #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.walkthrough-hero.start" @@ -315,7 +310,8 @@ msgstr "Toegangsbewijs is succesvol aangemaakt." #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.empty.add-one" -msgstr "Klik op de knop \"Nieuw toegangsbewijs aanmaken\" om er een aan te maken." +msgstr "" +"Klik op de knop \"Nieuw toegangsbewijs aanmaken\" om er een aan te maken." #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.empty.no-access-tokens" @@ -364,9 +360,9 @@ msgstr "Persoonlijke toegangsbewijzen" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.personal.description" msgstr "" -"Persoonlijke toegangsbewijzen functioneren als alternatief voor ons " -"login/wachtwoord-authenticatiesysteem en kunnen worden gebruikt om een " -"applicatie toegang te geven tot de interne Penpot API" +"Persoonlijke toegangsbewijzen functioneren als alternatief voor ons login/" +"wachtwoord-authenticatiesysteem en kunnen worden gebruikt om een applicatie " +"toegang te geven tot de interne Penpot API" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.token-will-expire" @@ -527,9 +523,9 @@ msgid "dashboard.fonts.hero-text2" msgstr "" "Je mag alleen lettertypen uploaden waarvan je de eigenaar bent of waarvoor " "je een licentie hebt om te gebruiken in Penpot. Lees meer in de sectie " -"Inhoudsrechten van [Penpot's " -"Servicevoorwaarden](https://penpot.app/terms.html). Misschien wil je ook " -"meer lezen over [lettertypelicenties](https://www.typography.com/faq)." +"Inhoudsrechten van [Penpot's Servicevoorwaarden](https://penpot.app/terms." +"html). Misschien wil je ook meer lezen over [lettertypelicenties](https://" +"www.typography.com/faq)." #: src/app/main/ui/dashboard/fonts.cljs msgid "dashboard.fonts.upload-all" @@ -550,11 +546,6 @@ msgstr "Importeer Penpot-bestanden" msgid "dashboard.import.analyze-error" msgstr "Oeps! We konden dit bestand niet importeren" -msgid "dashboard.import.analyze-error.components-v2" -msgstr "" -"Bestand met componenten v2 geactiveerd, maar dit team ondersteunt dit nog " -"niet." - msgid "dashboard.import.import-error" msgstr "" "Er is een probleem opgetreden bij het importeren van het bestand. Het " @@ -797,7 +788,8 @@ msgid "dashboard.webhooks.active" msgstr "Is actief" msgid "dashboard.webhooks.active.explain" -msgstr "Wanneer deze hook wordt getriggerd, worden gebeurtenisdetails afgeleverd" +msgstr "" +"Wanneer deze hook wordt getriggerd, worden gebeurtenisdetails afgeleverd" msgid "dashboard.webhooks.content-type" msgstr "Contenttype" @@ -873,8 +865,7 @@ msgstr "Authenticatie-provider niet geconfigureerd." msgid "errors.auth.unable-to-login" msgstr "" -"Het lijkt erop dat je niet geauthentiseerd bent of dat de sessie is " -"verlopen." +"Het lijkt erop dat je niet geauthentiseerd bent of dat de sessie is verlopen." msgid "errors.bad-font" msgstr "Het lettertype %s kon niet geladen worden" @@ -931,14 +922,6 @@ msgstr "" msgid "errors.feature-not-supported" msgstr "Functie '%s' wordt niet ondersteund." -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Het lijkt erop dat er een discrepantie bestaat tussen de ingeschakelde " -"functies en de functies van het bestand dat je probeert te openen. Er " -"moeten migraties voor '%s' worden toegepast voordat het bestand kan worden " -"geopend." - #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -991,9 +974,6 @@ msgstr "Bevestigingswachtwoord moet overeenkomen" msgid "errors.password-too-short" msgstr "Wachtwoord moet minimaal 8 tekens lang zijn" -msgid "errors.paste-data-validation" -msgstr "Ongeldige gegevens op klembord" - msgid "errors.profile-blocked" msgstr "Het profiel is geblokkeerd" @@ -1007,10 +987,6 @@ msgstr "Je profiel heeft e-mails gedempt (spammeldingen of hoge bounces)." msgid "errors.registration-disabled" msgstr "De registratie is momenteel uitgeschakeld." -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Incompatibele functie '%s' gedetecteerd" - msgid "errors.team-leave.insufficient-members" msgstr "" "Onvoldoende leden om het team te verlaten, je kunt dit team maar beter " @@ -1034,13 +1010,6 @@ msgstr "Er is een onverwachte fout opgetreden." msgid "errors.unexpected-token" msgstr "Onbekend bewijsstuk" -msgid "errors.validation" -msgstr "Validatiefout" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Bestand heeft een incompatibel versienummer" - msgid "errors.webhooks.connection" msgstr "Verbindingsfout, URL niet bereikbaar" @@ -1274,9 +1243,6 @@ msgstr "Geen" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "Beginhoofdletters" -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Uitschakelen" - msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "HOOFDLETTERS" @@ -1290,8 +1256,7 @@ msgstr "Meer info over inspecteren" msgid "inspect.empty.select" msgstr "" -"Selecteer een vorm, bord of groep om hun eigenschappen en code te " -"inspecteren" +"Selecteer een vorm, bord of groep om hun eigenschappen en code te inspecteren" #: src/app/main/ui/inspect/right_sidebar.cljs msgid "inspect.tabs.code" @@ -1581,8 +1546,7 @@ msgstr "Geen openstaande uitnodigingen." #: src/app/main/ui/dashboard/team.cljs msgid "labels.no-invitations-hint" msgstr "" -"Klik op de knop **Mensen uitnodigen** om mensen uit te nodigen voor dit " -"team." +"Klik op de knop **Mensen uitnodigen** om mensen uit te nodigen voor dit team." #: src/app/main/ui/static.cljs msgid "labels.not-found.desc-message" @@ -1683,9 +1647,6 @@ msgstr "Rol" msgid "labels.save" msgstr "Opslaan" -msgid "labels.search" -msgstr "Zoeken" - msgid "labels.search-font" msgstr "Lettertype zoeken" @@ -1710,9 +1671,6 @@ msgstr "Service niet beschikbaar" msgid "labels.settings" msgstr "Instellingen" -msgid "labels.share" -msgstr "Delen" - msgid "labels.share-prototype" msgstr "Prototype delen" @@ -1782,34 +1740,10 @@ msgstr "(jij)" msgid "labels.your-account" msgstr "Jouw account" -msgid "media.choose-image" -msgstr "Afbeelding kiezen" - -msgid "media.gradient" -msgstr "Verloop" - -msgid "media.image" -msgstr "Afbeelding" - -msgid "media.linear" -msgstr "Lineair" - #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Afbeelding laden…" -msgid "media.radial" -msgstr "Radiaal" - -msgid "media.solid" -msgstr "Solide" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Je bibliotheek is leeg. Eenmaal toegevoegd als Gedeelde Bibliotheek, zijn " -"de assets die je aanmaakt beschikbaar voor gebruik in de rest van je " -"bestanden. Weet je zeker dat je dit wilt publiceren??" - #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -1820,8 +1754,7 @@ msgstr "Toevoegen als gedeelde bibliotheek" msgid "modals.add-shared-confirm.hint" msgstr "" "Eenmaal toegevoegd als gedeelde bibliotheek, zijn de assets van deze " -"bestandsbibliotheek beschikbaar voor gebruik tussen de rest van je " -"bestanden." +"bestandsbibliotheek beschikbaar voor gebruik tussen de rest van je bestanden." #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs @@ -2096,8 +2029,8 @@ msgstr "E-mailadressen, kommagescheiden" msgid "modals.invite-member.repeated-invitation" msgstr "" -"Sommige e-mailadressen zijn van bestaande teamleden. Zij krijgen geen " -"nieuwe uitnodigingen." +"Sommige e-mailadressen zijn van bestaande teamleden. Zij krijgen geen nieuwe " +"uitnodigingen." #: src/app/main/ui/dashboard/team.cljs msgid "modals.invite-team-member.title" @@ -2214,10 +2147,10 @@ msgstr[1] "Publicaties ongedaan maken" #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.message" msgid_plural "modals.unpublish-shared-confirm.message" -msgstr[0] "Weet je zeker dat je de publicatie van deze bibliotheek ongedaan wilt maken?" +msgstr[0] "" +"Weet je zeker dat je de publicatie van deze bibliotheek ongedaan wilt maken?" msgstr[1] "" -"Weet je zeker dat je de publicatie van deze bibliotheken ongedaan wilt " -"maken?" +"Weet je zeker dat je de publicatie van deze bibliotheken ongedaan wilt maken?" #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs @@ -2316,15 +2249,16 @@ msgstr "" "voortgang van de productontwikkeling en nieuws." msgid "onboarding-v2.newsletter.news" -msgstr "Stuur mij nieuws over Penpot (blogposts, video-introducties, streamings…)." +msgstr "" +"Stuur mij nieuws over Penpot (blogposts, video-introducties, streamings…)." msgid "onboarding-v2.newsletter.privacy1" msgstr "Wij geven om privacy, lees hier onze " msgid "onboarding-v2.newsletter.privacy2" msgstr "" -"We sturen je alleen relevante e-mails. Je kunt je op elk moment afmelden " -"via de afmeldlink in al onze nieuwsbrieven." +"We sturen je alleen relevante e-mails. Je kunt je op elk moment afmelden via " +"de afmeldlink in al onze nieuwsbrieven." msgid "onboarding-v2.newsletter.updates" msgstr "Stuur mij productnieuws (nieuwe functies, releases, correcties…)." @@ -2353,21 +2287,6 @@ msgstr "Bijdragen" msgid "onboarding-v2.welcome.title" msgstr "Welkom bij Penpot!" -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Doorgaan met team aanmaken" - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Doorgaan zonder team" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Team aanmaken & uitnodigen" - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Team aanmaken en uitnodigingen versturen" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Je kunt later uitnodigen" - msgid "onboarding.choice.team-up.create-team-desc" msgstr "" "Nadat je je team een naam hebt gegeven, kun je mensen uitnodigen om lid te " @@ -2376,12 +2295,6 @@ msgstr "" msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "Voer de naam van het team in" -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Team aanmaken" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Team aanmaken zonder uitnodigingen" - msgid "onboarding.choice.team-up.invite-members" msgstr "Leden uitnodigen" @@ -2393,12 +2306,6 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Uitnodigen met rol:" -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Zonder team beginnen" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Je kunt later een team samenstellen." - msgid "onboarding.newsletter.accept" msgstr "Ja, abonneren" @@ -2617,10 +2524,6 @@ msgstr "" "Jouw feedback helpt ons te begrijpen wat je gewoonten en voorkeuren zijn, " "zodat we van Penpot een nuttig en plezierig hulpmiddel kunnen blijven maken." -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Ontkoppelen" - #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, @@ -3077,9 +2980,6 @@ msgstr "Linialen tonen/verbergen" msgid "shortcuts.toggle-textpalette" msgstr "Tekstpalet in/uitschakelen" -msgid "shortcuts.toggle-theme" -msgstr "Thema veranderen" - msgid "shortcuts.toggle-visibility" msgstr "Tonen/verbergen" @@ -3415,45 +3315,6 @@ msgstr "Tekst transformeren" msgid "workspace.assets.ungroup" msgstr "Groep opheffen" -msgid "workspace.context-menu.grid-cells.area" -msgstr "Gebied aanmaken" - -msgid "workspace.context-menu.grid-cells.create-board" -msgstr "Bord aanmaken" - -msgid "workspace.context-menu.grid-cells.merge" -msgstr "Cellen samenvoegen" - -msgid "workspace.context-menu.grid-track.column.add-after" -msgstr "Rechts 1 kolom toevoegen" - -msgid "workspace.context-menu.grid-track.column.add-before" -msgstr "Links 1 kolom toevoegen" - -msgid "workspace.context-menu.grid-track.column.delete" -msgstr "Kolom verwijderen" - -msgid "workspace.context-menu.grid-track.column.delete-shapes" -msgstr "Kolom en vormen verwijderen" - -msgid "workspace.context-menu.grid-track.column.duplicate" -msgstr "Kolom dupliceren" - -msgid "workspace.context-menu.grid-track.row.add-after" -msgstr "Onder 1 rij toevoegen" - -msgid "workspace.context-menu.grid-track.row.add-before" -msgstr "Boven 1 rij toevoegen" - -msgid "workspace.context-menu.grid-track.row.delete" -msgstr "Rij verwijderen" - -msgid "workspace.context-menu.grid-track.row.delete-shapes" -msgstr "Rij en vormen verwijderen" - -msgid "workspace.context-menu.grid-track.row.duplicate" -msgstr "Rij dupliceren" - msgid "workspace.focus.focus-mode" msgstr "Focusmodus" @@ -3577,12 +3438,6 @@ msgstr "Linialen tonen" msgid "workspace.header.menu.show-textpalette" msgstr "Lettertype-palet tonen" -msgid "workspace.header.menu.toggle-dark-theme" -msgstr "Donker thema inschakelen" - -msgid "workspace.header.menu.toggle-light-theme" -msgstr "Licht thema inschakelen" - msgid "workspace.header.menu.undo" msgstr "Ongedaan maken" @@ -3634,21 +3489,9 @@ msgstr "Volledig scherm" msgid "workspace.header.zoom-selected" msgstr "Naar selectie zoomen" -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Raster bewerken" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Sluiten" - msgid "workspace.layout_grid.editor.title" msgstr "Raster bewerken" -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Klaar" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Lokaliseren" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Toevoegen" @@ -3719,10 +3562,6 @@ msgstr "BIBLIOTHEEK" msgid "workspace.libraries.library-updates" msgstr "BIBLIOTHEEK-UPDATES" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.loading" -msgstr "Laden…" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "Er zijn geen gedeelde bibliotheken die moeten worden bijgewerkt" @@ -3797,24 +3636,12 @@ msgstr "Component" msgid "workspace.options.component.annotation" msgstr "Aantekening" -msgid "workspace.options.component.copy" -msgstr "Kopiëren" - msgid "workspace.options.component.create-annotation" msgstr "Aantekening maken" msgid "workspace.options.component.edit-annotation" msgstr "Aantekening bewerken" -msgid "workspace.options.component.main" -msgstr "Hoofd" - -msgid "workspace.options.component.swap" -msgstr "Component uitwisselen" - -msgid "workspace.options.component.swap.empty" -msgstr "Er zijn nog geen assets in deze bibliotheek" - #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Beperkingen" @@ -3908,10 +3735,6 @@ msgstr "Vullen" msgid "workspace.options.flows.add-flow-start" msgstr "Stroomdiagram-startpunt toevoegen" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Stroomdiagram" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "Stroomdiagram-startpunt" @@ -4015,9 +3838,6 @@ msgstr "Groep vullen" msgid "workspace.options.group-stroke" msgstr "Groep-streek" -msgid "workspace.options.guides.title" -msgstr "Hulplijnen" - msgid "workspace.options.height" msgstr "Hoogte" @@ -4566,26 +4386,14 @@ msgstr "Streek" msgid "workspace.options.stroke-cap.circle-marker" msgstr "Cirkelmarkering" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Cirkel" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "Ruitmarkering" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Ruit" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "Lijn-pijl" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Pijl" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "Geen" @@ -4602,18 +4410,10 @@ msgstr "Vierkant" msgid "workspace.options.stroke-cap.square-marker" msgstr "Vierkantmarkering" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Rechthoek" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "Driehoek-pijl" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Driehoek" - msgid "workspace.options.stroke-color" msgstr "Streekkleur" @@ -4743,7 +4543,8 @@ msgstr "HOOFDLETTERS" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.use-play-button" -msgstr "Gebruik de afspeelknop in de koptekst om de prototypeweergave uit te voeren." +msgstr "" +"Gebruik de afspeelknop in de koptekst om de prototypeweergave uit te voeren." msgid "workspace.options.width" msgstr "Breedte" @@ -5084,13 +4885,6 @@ msgstr "Tekst (%s)" msgid "workspace.toolbar.text-palette" msgstr "Typografie (%s)" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "** Inspectiemodus ** (alleen bekijken)" - -msgid "workspace.top-bar.read-only.done" -msgstr "Klaar" - #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Er zijn tot nu toe geen wijzigingen in de geschiedenis" @@ -5224,3 +5018,153 @@ msgstr "Bijwerken" msgid "workspace.viewport.click-to-close-path" msgstr "Klik om het pad te sluiten" + +msgid "workspace.options.component.copy" +msgstr "Kopiëren" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Rechthoek" + +msgid "workspace.options.component.main" +msgstr "Hoofd" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Ruit" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Ontkoppelen" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Driehoek" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Pijl" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Je bibliotheek is leeg. Eenmaal toegevoegd als Gedeelde Bibliotheek, zijn de " +"assets die je aanmaakt beschikbaar voor gebruik in de rest van je bestanden. " +"Weet je zeker dat je dit wilt publiceren??" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Cirkel" + +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Doorgaan met team aanmaken" + +msgid "workspace.options.guides.title" +msgstr "Hulplijnen" + +msgid "media.choose-image" +msgstr "Afbeelding kiezen" + +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Met het aanmaken van een nieuw account ga je akkoord met onze " +"[servicevoorwaarden] (%s) en [privacybeleid] (%s)." + +msgid "workspace.options.component.swap.empty" +msgstr "Er zijn nog geen assets in deze bibliotheek" + +msgid "media.solid" +msgstr "Solide" + +msgid "workspace.top-bar.read-only.done" +msgstr "Klaar" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Team aanmaken & uitnodigen" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Klaar" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Doorgaan zonder team" + +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Uitschakelen" + +msgid "errors.validation" +msgstr "Validatiefout" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Sluiten" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Bestand heeft een incompatibel versienummer" + +msgid "workspace.options.component.swap" +msgstr "Component uitwisselen" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Team aanmaken zonder uitnodigingen" + +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Het lijkt erop dat er een discrepantie bestaat tussen de ingeschakelde " +"functies en de functies van het bestand dat je probeert te openen. Er moeten " +"migraties voor '%s' worden toegepast voordat het bestand kan worden geopend." + +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Team aanmaken" + +msgid "media.linear" +msgstr "Lineair" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Stroomdiagram" + +msgid "labels.search" +msgstr "Zoeken" + +msgid "media.image" +msgstr "Afbeelding" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Je kunt later een team samenstellen." + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Team aanmaken en uitnodigingen versturen" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Lokaliseren" + +msgid "media.gradient" +msgstr "Verloop" + +msgid "labels.share" +msgstr "Delen" + +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Raster bewerken" + +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Zonder team beginnen" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Je kunt later uitnodigen" + +msgid "media.radial" +msgstr "Radiaal" + +msgid "errors.paste-data-validation" +msgstr "Ongeldige gegevens op klembord" + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Incompatibele functie '%s' gedetecteerd" + +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "** Inspectiemodus ** (alleen bekijken)" diff --git a/frontend/translations/pt_PT.po b/frontend/translations/pt_PT.po index da48c8ece..3bd8735be 100644 --- a/frontend/translations/pt_PT.po +++ b/frontend/translations/pt_PT.po @@ -1,15 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-20 23:07+0000\n" +"PO-Revision-Date: 2023-12-29 21:08+0000\n" "Last-Translator: TheScientistPT \n" -"Language-Team: Portuguese (Portugal) " -"\n" +"Language-Team: Portuguese (Portugal) \n" "Language: pt_PT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.4-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -176,13 +176,6 @@ msgstr "" "Ao criar uma nova conta, concordas com os nossos termos de serviço e " "política de privacidade." -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Ao criar uma nova conta, concordas com os nossos [termos de serviço](%s) e " -"[política de privacidade](%s)." - #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "Enviámos um email de verificação para" @@ -350,9 +343,9 @@ msgstr "Tokens de acesso pessoais" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.personal.description" msgstr "" -"Os tokens de acesso pessoais funcionam como uma alternativa ao nosso " -"sistema de autenticação de login/palavra-passe e podem ser usados para " -"permitir que uma aplicação tenha acesso à API interna do Penpot" +"Os tokens de acesso pessoais funcionam como uma alternativa ao nosso sistema " +"de autenticação de login/palavra-passe e podem ser usados para permitir que " +"uma aplicação tenha acesso à API interna do Penpot" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.token-will-expire" @@ -405,9 +398,9 @@ msgstr "Duplicar %s ficheiros" #: src/app/main/ui/dashboard/grid.cljs msgid "dashboard.empty-placeholder-drafts" msgstr "" -"Os ficheiros adicionados às Bibliotecas irão aparecer aqui. Experimenta " -"adicionar os teus ficheiros ou experimenta algumas das nossas [Bibliotecas " -"e templates](https://penpot.app/libraries-templates.html)." +"Oh não! Ainda não tens ficheiros! Se quiseres experimentar podes começar " +"com os nossos templates em [Libraries & " +"templates](https://penpot.app/libraries-templates.html)." msgid "dashboard.export-binary-multi" msgstr "Descarrega %s ficheiros Penpot (.penpot)" @@ -536,19 +529,9 @@ msgstr "Importar ficheiros Penpot" msgid "dashboard.import.analyze-error" msgstr "Oops! Não conseguimos importar este ficheiro" -msgid "dashboard.import.analyze-error.components-v2" -msgstr "" -"Ficheiro exportado com componentes v2 mas a equipa atual ainda não os " -"suporta." - msgid "dashboard.import.import-error" msgstr "Ocorreu um problema na importação do ficheiro. O ficheiro não foi importado." -msgid "dashboard.import.import-message" -msgid_plural "dashboard.import.import-message" -msgstr[0] "1 ficheiro foi importado com sucesso." -msgstr[1] "%s ficheiros foram importados com sucesso." - msgid "dashboard.import.import-warning" msgstr "Alguns ficheiros continham objetos inválidos que foram removidos." @@ -710,22 +693,10 @@ msgstr "Selecionar tema" msgid "dashboard.show-all-files" msgstr "Mostrar todos os ficheiros" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-delete-file" -msgid_plural "dashboard.success-delete-file" -msgstr[0] "O teu ficheiro foi apagado com sucesso" -msgstr[1] "Os teus ficheiros foram apagados com sucesso" - #: src/app/main/ui/dashboard/project_menu.cljs msgid "dashboard.success-delete-project" msgstr "O teu projeto foi eliminado com sucesso" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-duplicate-file" -msgid_plural "dashboard.success-delete-file" -msgstr[0] "O teu ficheiro foi duplicado com sucesso" -msgstr[1] "Os teus ficheiros foram duplicados com sucesso" - #: src/app/main/ui/dashboard/project_menu.cljs msgid "dashboard.success-duplicate-project" msgstr "O teu projeto foi duplicado com sucesso" @@ -911,13 +882,6 @@ msgstr "" msgid "errors.feature-not-supported" msgstr "A funcionalidade '%s' não é suportada." -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Parece que existem discrepâncias entre as funcionalidades ativadas e as " -"funcionalidades do ficheiro que estás a tentar abrir. Será necessário " -"aplicar migrações para '%s' antes de poder abrir o ficheiro." - #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -968,9 +932,6 @@ msgstr "A palavra-passe de confirmação tem de corresponder" msgid "errors.password-too-short" msgstr "A palavra-passe deverá conter no mínimo 8 caracteres" -msgid "errors.paste-data-validation" -msgstr "Dados inválidos na área de transferência" - msgid "errors.profile-blocked" msgstr "O perfil está bloqueado" @@ -986,10 +947,6 @@ msgstr "" msgid "errors.registration-disabled" msgstr "A criação de contas está atualmente desativada." -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Funcionalidade incompatível '%s' detetada" - msgid "errors.team-leave.insufficient-members" msgstr "Membros insuficientes para deixar a equipa, provavelmente queres eliminá-la." @@ -1011,13 +968,6 @@ msgstr "Ocorreu um erro inesperado." msgid "errors.unexpected-token" msgstr "Token desconhecido" -msgid "errors.validation" -msgstr "Erro de validação" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "O ficheiro tem um número de versão incompatível" - msgid "errors.webhooks.connection" msgstr "Erro de conexão, não foi possível alcançar o URL" @@ -1252,9 +1202,6 @@ msgstr "Nenhum" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "Capitalização de Título" -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Sem atribuição" - msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Maiúsculas" @@ -1659,9 +1606,6 @@ msgstr "Cargo" msgid "labels.save" msgstr "Salvar" -msgid "labels.search" -msgstr "Pesquisar" - msgid "labels.search-font" msgstr "Pesquisar font" @@ -1686,9 +1630,6 @@ msgstr "Serviço Indisponível" msgid "labels.settings" msgstr "Definições" -msgid "labels.share" -msgstr "Partilhar" - msgid "labels.share-prototype" msgstr "Partilhar protótipo" @@ -1758,35 +1699,10 @@ msgstr "(tu)" msgid "labels.your-account" msgstr "A tua conta" -msgid "media.choose-image" -msgstr "Escolher imagem" - -msgid "media.gradient" -msgstr "Gradiente" - -msgid "media.image" -msgstr "Imagem" - -msgid "media.linear" -msgstr "Linear" - #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "A carregar imagem…" -msgid "media.radial" -msgstr "Radial" - -msgid "media.solid" -msgstr "Sólido" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"A tua biblioteca está vazia. Assim que ela seja adicionada como uma " -"biblioteca partilhada, os recursos que criares nela estarão disponíveis " -"para serem usados nos teus outros ficheiros. Tens a certeza que queres " -"publicá-la?" - #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -2174,12 +2090,6 @@ msgstr "Remover \"%s\" como Biblioteca Partilhada" msgid "modals.small-nudge" msgstr "Pequeno deslocamento" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.accept" -msgid_plural "modals.unpublish-shared-confirm.accept" -msgstr[0] "Cancelar publicação" -msgstr[1] "Cancelar publicações" - #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.message" @@ -2324,33 +2234,12 @@ msgstr "Guia de Contribuição" msgid "onboarding-v2.welcome.title" msgstr "Bem-vindo ao Penpot!" -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Continuar criação de equipa" - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Continuar sem equipa" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Criar equipa e convidar" - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Criar equipa e enviar convites" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Poderás enviar convites mais tarde" - msgid "onboarding.choice.team-up.create-team-desc" msgstr "Depois de nomeares a tua equipa, poderás convidar pessoas para entrar." msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "Escreve o nome da equipa" -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Criar equipa" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Criar equipa sem convidar" - msgid "onboarding.choice.team-up.invite-members" msgstr "Convida membros" @@ -2362,12 +2251,6 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Convidar com a função:" -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Começar sem equipa" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Poderás criar uma equipa mais tarde." - msgid "onboarding.newsletter.accept" msgstr "Sim, subscreve" @@ -2585,10 +2468,6 @@ msgstr "" "preferências para que possamos continuar a tornar o Penpot numa ferramenta " "fácil e divertida de usar." -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Desacoplar" - #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, @@ -3045,9 +2924,6 @@ msgstr "Mostrar/ocultar regras" msgid "shortcuts.toggle-textpalette" msgstr "Alternar paleta de texto" -msgid "shortcuts.toggle-theme" -msgstr "Mudar tema" - msgid "shortcuts.toggle-visibility" msgstr "Mostrar / Ocultar" @@ -3385,45 +3261,6 @@ msgstr "Transformar Texto" msgid "workspace.assets.ungroup" msgstr "Desagrupar" -msgid "workspace.context-menu.grid-cells.area" -msgstr "Criar área" - -msgid "workspace.context-menu.grid-cells.create-board" -msgstr "Criar prancheta" - -msgid "workspace.context-menu.grid-cells.merge" -msgstr "Unir células" - -msgid "workspace.context-menu.grid-track.column.add-after" -msgstr "Adicionar 1 coluna à direita" - -msgid "workspace.context-menu.grid-track.column.add-before" -msgstr "Adicionar 1 coluna à esquerda" - -msgid "workspace.context-menu.grid-track.column.delete" -msgstr "Eliminar coluna" - -msgid "workspace.context-menu.grid-track.column.delete-shapes" -msgstr "Apagar coluna e conteúdos" - -msgid "workspace.context-menu.grid-track.column.duplicate" -msgstr "Duplicar coluna" - -msgid "workspace.context-menu.grid-track.row.add-after" -msgstr "Adicionar 1 fila abaixo" - -msgid "workspace.context-menu.grid-track.row.add-before" -msgstr "Adicionar 1 fila acima" - -msgid "workspace.context-menu.grid-track.row.delete" -msgstr "Apagar fila" - -msgid "workspace.context-menu.grid-track.row.delete-shapes" -msgstr "Apagar fila e conteúdos" - -msgid "workspace.context-menu.grid-track.row.duplicate" -msgstr "Duplicar fila" - msgid "workspace.focus.focus-mode" msgstr "Modo de foco" @@ -3547,12 +3384,6 @@ msgstr "Mostrar regras" msgid "workspace.header.menu.show-textpalette" msgstr "Mostrar paleta de texto" -msgid "workspace.header.menu.toggle-dark-theme" -msgstr "Alterar para tema escuro" - -msgid "workspace.header.menu.toggle-light-theme" -msgstr "Mudar para tema claro" - msgid "workspace.header.menu.undo" msgstr "Desfazer" @@ -3604,21 +3435,9 @@ msgstr "Tela cheia" msgid "workspace.header.zoom-selected" msgstr "Aumentar para seleção" -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Editar grelha" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Sair" - msgid "workspace.layout_grid.editor.title" msgstr "A editar grelha" -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Feito" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Localizar" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Adicionar" @@ -3689,10 +3508,6 @@ msgstr "BIBLIOTECA" msgid "workspace.libraries.library-updates" msgstr "ATUALIZAÇÕES DE BIBLIOTECAS" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.loading" -msgstr "A carregar…" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "Não há bibliotecas partilhadas que precisem de atualização" @@ -3767,24 +3582,12 @@ msgstr "Componente" msgid "workspace.options.component.annotation" msgstr "Nota" -msgid "workspace.options.component.copy" -msgstr "Cópia" - msgid "workspace.options.component.create-annotation" msgstr "Criar uma nota" msgid "workspace.options.component.edit-annotation" msgstr "Editar uma nota" -msgid "workspace.options.component.main" -msgstr "Principal" - -msgid "workspace.options.component.swap" -msgstr "Trocar de componente" - -msgid "workspace.options.component.swap.empty" -msgstr "Ainda não existem recursos nesta biblioteca" - #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Restrições" @@ -3878,10 +3681,6 @@ msgstr "Preenchimento" msgid "workspace.options.flows.add-flow-start" msgstr "Adicionar início de fluxo" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Fluxo" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "Início de fluxo" @@ -3985,9 +3784,6 @@ msgstr "Preenchimento de grupo" msgid "workspace.options.group-stroke" msgstr "Traço de grupo" -msgid "workspace.options.guides.title" -msgstr "Guias" - msgid "workspace.options.height" msgstr "Altura" @@ -4536,26 +4332,14 @@ msgstr "Traço" msgid "workspace.options.stroke-cap.circle-marker" msgstr "Marcador circular" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Círculo" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "Marcador em diamante" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Diamante" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "Seta de linha" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Seta" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "Nenhum" @@ -4572,18 +4356,10 @@ msgstr "Quadrado" msgid "workspace.options.stroke-cap.square-marker" msgstr "Marcador quadrado" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Retângulo" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "Seta triangular" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Triângulo" - msgid "workspace.options.stroke-color" msgstr "Cor do traço" @@ -5056,13 +4832,6 @@ msgstr "Texto (%s)" msgid "workspace.toolbar.text-palette" msgstr "Tipografias (%s)" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Modo de inspeção** (Somente leitura)" - -msgid "workspace.top-bar.read-only.done" -msgstr "Feito" - #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Não há histórico de mudanças até agora" @@ -5245,3 +5014,176 @@ msgstr "Clica para fechar o caminho" #~ msgid "workspace.options.layout.direction.left" #~ msgstr "Linha" + +msgid "workspace.options.component.copy" +msgstr "Cópia" + +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "1 ficheiro foi importado com sucesso." +msgstr[1] "%s ficheiros foram importados com sucesso." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.accept" +msgid_plural "modals.unpublish-shared-confirm.accept" +msgstr[0] "Cancelar publicação" +msgstr[1] "Cancelar publicações" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Retângulo" + +msgid "workspace.options.component.main" +msgstr "Principal" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Diamante" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Desacoplar" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Triângulo" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Seta" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"A tua biblioteca está vazia. Assim que ela seja adicionada como uma " +"biblioteca partilhada, os recursos que criares nela estarão disponíveis para " +"serem usados nos teus outros ficheiros. Tens a certeza que queres publicá-la?" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Círculo" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-delete-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "O teu ficheiro foi apagado com sucesso" +msgstr[1] "Os teus ficheiros foram apagados com sucesso" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-duplicate-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "O teu ficheiro foi duplicado com sucesso" +msgstr[1] "Os teus ficheiros foram duplicados com sucesso" + +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Continuar criação de equipa" + +msgid "workspace.options.guides.title" +msgstr "Guias" + +msgid "media.choose-image" +msgstr "Escolher imagem" + +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Ao criar uma nova conta, concordas com os nossos [termos de serviço](%s) e [" +"política de privacidade](%s)." + +msgid "workspace.options.component.swap.empty" +msgstr "Ainda não existem recursos nesta biblioteca" + +msgid "media.solid" +msgstr "Sólido" + +msgid "workspace.top-bar.read-only.done" +msgstr "Feito" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Criar equipa e convidar" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Feito" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Continuar sem equipa" + +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Sem atribuição" + +msgid "errors.validation" +msgstr "Erro de validação" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Sair" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "O ficheiro tem um número de versão incompatível" + +msgid "workspace.options.component.swap" +msgstr "Trocar de componente" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Criar equipa sem convidar" + +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Parece que existem discrepâncias entre as funcionalidades ativadas e as " +"funcionalidades do ficheiro que estás a tentar abrir. Será necessário " +"aplicar migrações para '%s' antes de poder abrir o ficheiro." + +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Criar equipa" + +msgid "media.linear" +msgstr "Linear" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Fluxo" + +msgid "labels.search" +msgstr "Pesquisar" + +msgid "media.image" +msgstr "Imagem" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Poderás criar uma equipa mais tarde." + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Criar equipa e enviar convites" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Localizar" + +msgid "media.gradient" +msgstr "Gradiente" + +msgid "labels.share" +msgstr "Partilhar" + +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Editar grelha" + +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Começar sem equipa" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Poderás enviar convites mais tarde" + +msgid "media.radial" +msgstr "Radial" + +msgid "errors.paste-data-validation" +msgstr "Dados inválidos na área de transferência" + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Funcionalidade incompatível '%s' detetada" + +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**Modo de inspeção** (Somente leitura)" diff --git a/frontend/translations/ro.po b/frontend/translations/ro.po index ee3aa0aa9..232fc9a6c 100644 --- a/frontend/translations/ro.po +++ b/frontend/translations/ro.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2023-10-10 10:01+0000\n" "Last-Translator: AlexTECPlayz \n" -"Language-Team: Romanian " -"\n" +"Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -539,12 +539,6 @@ msgstr "Hopa! Nu am putut importa acest fișier" msgid "dashboard.import.import-error" msgstr "A apărut o problemă la importul fișierului. Fișierul nu a fost importat." -msgid "dashboard.import.import-message" -msgid_plural "dashboard.import.import-message" -msgstr[0] "1 fișier a fost importat cu succes." -msgstr[1] "% fișiere au fost importate cu succes." -msgstr[2] "% de fișiere au fost importate cu succes." - msgid "dashboard.import.import-warning" msgstr "Unele fișiere conțineau obiecte nevalide care au fost eliminate." @@ -1737,12 +1731,6 @@ msgstr "Contul tău" msgid "media.loading" msgstr "Încarcă imaginea…" -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Biblioteca dumneavoastră este goală. Odată adăugate ca bibliotecă " -"partajată, obiectele pe care le creați vor fi disponibile pentru a fi " -"utilizate în celelalte fișiere. Sunteți sigur că doriți să o publicați?" - #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -2520,10 +2508,6 @@ msgstr "" "preferințele dvs. pentru a putea continua să facem Penpot o unealtă " "folositoare și plăcută." -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Detașați" - #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, @@ -3637,18 +3621,12 @@ msgstr "Componentă" msgid "workspace.options.component.annotation" msgstr "Notă" -msgid "workspace.options.component.copy" -msgstr "Copiați" - msgid "workspace.options.component.create-annotation" msgstr "Creați o notă" msgid "workspace.options.component.edit-annotation" msgstr "Editați o notă" -msgid "workspace.options.component.main" -msgstr "Principal" - #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Constrângeri" @@ -4392,26 +4370,14 @@ msgstr "Contur" msgid "workspace.options.stroke-cap.circle-marker" msgstr "Marcator cerc" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Cerc" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "Marcator diamant" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Diamant" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "Săgeată linie" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Săgeată" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "Nimic" @@ -4428,18 +4394,10 @@ msgstr "Pătrat" msgid "workspace.options.stroke-cap.square-marker" msgstr "Marcator pătrat" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Dreptunghi" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "Săgeată triunghi" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Triunghi" - msgid "workspace.options.stroke-color" msgstr "Culoare contur" @@ -5043,3 +5001,45 @@ msgstr "Actualizează" msgid "workspace.viewport.click-to-close-path" msgstr "Click pentru a închide calea" + +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "1 fișier a fost importat cu succes." +msgstr[1] "% fișiere au fost importate cu succes." +msgstr[2] "% de fișiere au fost importate cu succes." + +msgid "workspace.options.component.copy" +msgstr "Copiați" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Dreptunghi" + +msgid "workspace.options.component.main" +msgstr "Principal" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Diamant" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Detașați" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Triunghi" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Săgeată" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Biblioteca dumneavoastră este goală. Odată adăugate ca bibliotecă partajată, " +"obiectele pe care le creați vor fi disponibile pentru a fi utilizate în " +"celelalte fișiere. Sunteți sigur că doriți să o publicați?" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Cerc" diff --git a/frontend/translations/ru.po b/frontend/translations/ru.po index f76e5ff25..5a68e36df 100644 --- a/frontend/translations/ru.po +++ b/frontend/translations/ru.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-01-23 15:01+0000\n" "Last-Translator: Stas Haas \n" -"Language-Team: Russian " -"\n" +"Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -262,26 +262,6 @@ msgstr "Начать тур" msgid "dasboard.walkthrough-hero.title" msgstr "Руководство по интерфейсу" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "180 дней" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "30 дней" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-60-days" -msgstr "60 дней" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-90-days" -msgstr "90 дней" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-never" -msgstr "Никогда" - #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "dashboard.add-shared" @@ -2564,9 +2544,6 @@ msgstr "Заливка для группы" msgid "workspace.options.group-stroke" msgstr "Обводка для группы" -msgid "workspace.options.guides.title" -msgstr "Направляющие" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interactions" msgstr "Интерактив" @@ -3032,3 +3009,26 @@ msgstr "Обновить" msgid "workspace.viewport.click-to-close-path" msgstr "Нажмите для замыкания контура" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "90 дней" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "Никогда" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "180 дней" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "30 дней" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "60 дней" + +msgid "workspace.options.guides.title" +msgstr "Направляющие" diff --git a/frontend/translations/tr.po b/frontend/translations/tr.po index 647a720bf..f1ef022f9 100644 --- a/frontend/translations/tr.po +++ b/frontend/translations/tr.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-10 15:02+0000\n" +"PO-Revision-Date: 2024-01-28 11:01+0000\n" "Last-Translator: Oğuz Ersen \n" -"Language-Team: Turkish " -"\n" +"Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -84,14 +84,6 @@ msgstr "LDAP" msgid "auth.login-with-oidc-submit" msgstr "OpenID" -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "İsim boşluk dışında bir karakter içermelidir." - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "İsim en fazla 250 karakter içermelidir." - #: src/app/main/ui/auth/recovery.cljs msgid "auth.new-password" msgstr "Yeni bir parola gir" @@ -124,10 +116,6 @@ msgstr "Parola" msgid "auth.password-length-hint" msgstr "En az 8 karakter" -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-not-empty" -msgstr "Parola boşluk dışında bir karakter içermelidir." - msgid "auth.privacy-policy" msgstr "Gizlilik politikası" @@ -176,21 +164,10 @@ msgstr "" "Bir hesap oluştururken, koşullarımızı ve gizlilik politikamızı kabul etmiş " "sayılırsınız." -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Bir hesap oluştururken, [koşullarımızı](%s) ve [gizlilik politikamızı](%s) " -"kabul etmiş sayılırsınız." - #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "Onay e-postanı şu adrese gönderdik" -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "...marka çalışması, çizimler, pazarlama materyalleri, vb." - msgid "common.publish" msgstr "Yayınla" @@ -289,81 +266,6 @@ msgstr "Gezintiyi başlat" msgid "dasboard.walkthrough-hero.title" msgstr "Arayüz İncelemesi" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.copied-success" -msgstr "Belirteç kopyalandı" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "Yeni belirteç oluştur" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "Erişim belirteci başarıyla oluşturuldu." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "Bir belirteç oluşturmak için \"Yeni belirteç oluştur\" düğmesine basın." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.no-access-tokens" -msgstr "Şu ana kadar hiç belirteciniz yok." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "İsim gereklidir" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "180 gün" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "30 gün" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-60-days" -msgstr "60 gün" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-90-days" -msgstr "90 gün" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-never" -msgstr "Asla" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "%s tarihinde sona erdi" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expires-on" -msgstr "%s tarihinde sona eriyor" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.no-expiration" -msgstr "Süresiz" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "Kişisel erişim belirteçleri" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"Kişisel erişim belirteçleri, oturum açma/parola kimlik doğrulama " -"sistemimize alternatif olarak işlev görür ve bir uygulamanın dahili Penpot " -"API'sine erişmesine izin vermek için kullanılabilir" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-expire" -msgstr "Belirtecin süresi %s tarihinde sona erecek" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-not-expire" -msgstr "Belirtecin sona erme tarihi yok" - #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "dashboard.add-shared" @@ -507,10 +409,10 @@ msgstr[1] "%s yazı tipi eklendi" msgid "dashboard.fonts.hero-text1" msgstr "" "Buraya yüklediğiniz herhangi bir web yazı tipi, bu takımın dosyalarının " -"metin özelliklerinde bulunan yazı tipi ailesi listesine eklenecek. Aynı " -"yazı tipi ailesi adına sahip yazı tipleri, **tek yazı tipi ailesi** olarak " -"gruplandırılacak. Yazı tiplerini şu biçimlerde yükleyebilirsiniz: **TTF, " -"OTF ve WOFF** (yalnızca bir tane gerekli olacak)." +"metin özelliklerinde bulunan yazı tipi ailesi listesine eklenecek. Aynı yazı " +"tipi ailesi adına sahip yazı tipleri, **tek yazı tipi ailesi** olarak " +"gruplandırılacak. Yazı tiplerini şu biçimlerde yükleyebilirsiniz: **TTF, OTF " +"ve WOFF** (yalnızca bir tane gerekli olacak)." msgid "dashboard.fonts.hero-text2" msgstr "" @@ -525,35 +427,15 @@ msgstr "" msgid "dashboard.fonts.upload-all" msgstr "Tümünü karşıya yükle" -#, markdown -msgid "dashboard.fonts.warning-text" -msgstr "" -"İşletim sistemlerinin farklı dikey metriklerine ilişkin olarak yazı " -"tiplerinizde olası bir sorun tespit ettik. Bu durumu kontrol etmek için " -"[bunun gibi](https://vertical-metrics.netlify.app/) yazı tipi dikey metrik " -"hizmetlerini kullanabilirsiniz. Ayrıca web yazı tipleri oluşturmak ve " -"hataları düzeltmek için [Transfonter](https://transfonter.org/) " -"kullanmanızı öneririz. " - msgid "dashboard.import" msgstr "Penpot dosyalarını içe aktar" msgid "dashboard.import.analyze-error" msgstr "Oops! Bu dosyayı içeri aktaramadık" -msgid "dashboard.import.analyze-error.components-v2" -msgstr "" -"Bileşenler v2 ile dosya etkinleştirildi ancak bu takım henüz bunu " -"desteklemiyor." - msgid "dashboard.import.import-error" msgstr "Dosya içeri aktarılırken bir sorun oluştu. Dosya içeri aktarılmadı." -msgid "dashboard.import.import-message" -msgid_plural "dashboard.import.import-message" -msgstr[0] "1 dosya başarıyla içeri aktarıldı." -msgstr[1] "%s dosya başarıyla içeri aktarıldı." - msgid "dashboard.import.import-warning" msgstr "Bazı dosyalar kaldırılmış geçersiz nesneler içeriyordu." @@ -713,22 +595,10 @@ msgstr "Tema seç" msgid "dashboard.show-all-files" msgstr "Tüm dosyaları göster" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-delete-file" -msgid_plural "dashboard.success-delete-file" -msgstr[0] "Dosyanız başarıyla silindi" -msgstr[1] "Dosyalarınız başarıyla silindi" - #: src/app/main/ui/dashboard/project_menu.cljs msgid "dashboard.success-delete-project" msgstr "Projeniz başarıyla silindi" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-duplicate-file" -msgid_plural "dashboard.success-delete-file" -msgstr[0] "Dosyanız başarıyla kopyalandı" -msgstr[1] "Dosyalarınız başarıyla kopyalandı" - #: src/app/main/ui/dashboard/project_menu.cljs msgid "dashboard.success-duplicate-project" msgstr "Projenin kopyası başarıyla oluşturuldu" @@ -868,9 +738,6 @@ msgstr "%s yazı tipi yüklenemedi" msgid "errors.bad-font-plural" msgstr "%s yazı tipleri yüklenemedi" -msgid "errors.cannot-upload" -msgstr "Medya dosyası yüklenemedi." - #: src/app/main/data/workspace.cljs msgid "errors.clipboard-not-implemented" msgstr "Tarayıcın bu işlemi gerçekleştiremiyor" @@ -916,13 +783,6 @@ msgstr "" msgid "errors.feature-not-supported" msgstr "'%s' özelliği desteklenmiyor." -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Etkinleştirilen özellikler ile açmaya çalıştığınız dosyanın özellikleri " -"arasında bir uyumsuzluk var gibi görünüyor. Dosyanın açılabilmesi için önce " -"'%s' için geçişlerin uygulanması gerekiyor." - #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -973,9 +833,6 @@ msgstr "Parolalar eşleşmedi" msgid "errors.password-too-short" msgstr "Parola en az 8 karakterden oluşmalı" -msgid "errors.paste-data-validation" -msgstr "Panoda geçersiz veri" - msgid "errors.profile-blocked" msgstr "Profil engellendi" @@ -991,10 +848,6 @@ msgstr "" msgid "errors.registration-disabled" msgstr "Kayıt olma şu anda devre dışı." -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Uyumsuz '%s' özelliği algılandı" - msgid "errors.team-leave.insufficient-members" msgstr "Takımdan ayrılmak için yeterli üye yok, onu silmek isteyebilirsiniz." @@ -1014,13 +867,6 @@ msgstr "Beklenmedik bir hata oluştu." msgid "errors.unexpected-token" msgstr "Bilinmeyen jeton" -msgid "errors.validation" -msgstr "Doğrulama Hatası" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Dosyanın uyumsuz bir sürüm numarası var" - msgid "errors.webhooks.connection" msgstr "Bağlantı hatası, URL'ye erişilemiyor" @@ -1216,10 +1062,6 @@ msgstr "Yazı Tipi Boyutu" msgid "inspect.attributes.typography.font-style" msgstr "Yazı Tipi Biçimi" -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-weight" -msgstr "Yazı Tipi Kalınlığı" - #: src/app/main/ui/inspect/attributes/text.cljs msgid "inspect.attributes.typography.letter-spacing" msgstr "Harf Aralığı" @@ -1254,9 +1096,6 @@ msgstr "Hiçbiri" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "İlk Harfleri Büyük" -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Ayarlanmadı" - msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Büyük Harf" @@ -1325,10 +1164,6 @@ msgstr "Kısayollar" msgid "labels.accept" msgstr "Kabul et" -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.access-tokens" -msgstr "Erişim belirteçleri" - msgid "labels.active" msgstr "Etkin" @@ -1432,9 +1267,6 @@ msgstr "Daveti sil" msgid "labels.delete-multi-files" msgstr "%s dosyayı sil" -msgid "labels.discard" -msgstr "At" - #: src/app/main/ui/dashboard/projects.cljs, #: src/app/main/ui/dashboard/sidebar.cljs, #: src/app/main/ui/dashboard/files.cljs, @@ -1664,9 +1496,6 @@ msgstr "Rol" msgid "labels.save" msgstr "Kaydet" -msgid "labels.search" -msgstr "Ara" - msgid "labels.search-font" msgstr "Yazı tipi ara" @@ -1691,9 +1520,6 @@ msgstr "Hizmet Kullanılamıyor" msgid "labels.settings" msgstr "Ayarlar" -msgid "labels.share" -msgstr "Paylaş" - #: src/app/main/ui/viewer/header.cljs, src/app/main/ui/viewer/header.cljs msgid "labels.share-prototype" msgstr "Prototipi paylaş" @@ -1764,34 +1590,10 @@ msgstr "(siz)" msgid "labels.your-account" msgstr "Hesabınız" -msgid "media.choose-image" -msgstr "Görsel seç" - -msgid "media.gradient" -msgstr "Değişim" - -msgid "media.image" -msgstr "Görsel" - -msgid "media.linear" -msgstr "Doğrusal" - #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Görsel yükleniyor…" -msgid "media.radial" -msgstr "Işınsal" - -msgid "media.solid" -msgstr "Katı" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Kütüphaneniz boş. Paylaşılan Kütüphane olarak eklendiğinde, oluşturduğunuz " -"varlıklar diğer dosyalarınız arasında kullanılabilir olacak. Yayınlamak " -"istediğinizden emin misiniz?" - #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -1835,30 +1637,6 @@ msgstr "E-postayı değiştir" msgid "modals.change-email.title" msgstr "E-postanızı değiştirin" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.copy-token" -msgstr "Belirteci kopyala" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.expiration-date.label" -msgstr "Sona erme tarihi" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.label" -msgstr "İsim" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.placeholder" -msgstr "Adı, belirtecin ne için olduğunu bilmenize yardımcı olabilir" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.submit-label" -msgstr "Belirteç oluştur" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.title" -msgstr "Erişim belirteci oluştur" - msgid "modals.create-webhook.submit-label" msgstr "Web kancası oluştur" @@ -1871,18 +1649,6 @@ msgstr "Yük URL'si" msgid "modals.create-webhook.url.placeholder" msgstr "https://example.com/postreceive" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.accept" -msgstr "Belirteci sil" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.message" -msgstr "Bu belirteci silmek istediğinizden emin misiniz?" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.title" -msgstr "Belirteci sil" - #: src/app/main/ui/settings/delete_account.cljs msgid "modals.delete-account.cancel" msgstr "İptal et ve hesabımı koru" @@ -1913,12 +1679,6 @@ msgstr "" msgid "modals.delete-comment-thread.title" msgstr "Konuşmayı sil" -msgid "modals.delete-component-annotation.message" -msgstr "Bu açıklamayı silmek istediğinize emin misiniz?" - -msgid "modals.delete-component-annotation.title" -msgstr "Açıklamayı sil" - #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-file-confirm.accept" msgstr "Dosyayı sil" @@ -1986,18 +1746,6 @@ msgid_plural "modals.delete-shared-confirm.accept" msgstr[0] "Dosyayı sil" msgstr[1] "Dosyaları sil" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.no-files-message" -msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "Hiçbir dosyada etkinleştirilmedi." -msgstr[1] "Hiçbir dosyada etkinleştirilmediler." - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.scd-message" -msgid_plural "modals.delete-shared-confirm.activated.scd-message" -msgstr[0] "Bu kütüphane burada etkinleştirildi: " -msgstr[1] "Bu kütüphaneler burada etkinleştirildiler: " - #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-shared-confirm.message" @@ -2038,16 +1786,6 @@ msgstr "Bu üyeyi takımdan silmek istediğinden emin misin?" msgid "modals.delete-team-member-confirm.title" msgstr "Takım üyesini sil" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "" -"Bu dosyada daha önce kullanılmış olan varlıklar orada kalmaya devam edecek " -"(hiçbir tasarım bozulmayacak)." -msgstr[1] "" -"Bu dosyalarda daha önce kullanılmış olan varlıklar orada kalmaya devam " -"edecek (hiçbir tasarım bozulmayacak)." - msgid "modals.delete-webhook.accept" msgstr "Web kancasını sil" @@ -2070,11 +1808,6 @@ msgstr "Davet gönder" msgid "modals.invite-member.emails" msgstr "E-posta adresleri, virgülle ayrılmış" -msgid "modals.invite-member.repeated-invitation" -msgstr "" -"Bazı e-posta adresleri mevcut takım üyelerine aittir. Davetleri " -"gönderilmeyecektir." - #: src/app/main/ui/dashboard/team.cljs msgid "modals.invite-team-member.title" msgstr "Üyeleri takıma davet et" @@ -2148,15 +1881,6 @@ msgstr "" msgid "modals.promote-owner-confirm.title" msgstr "Yeni takım sahibi" -msgid "modals.publish-empty-library.accept" -msgstr "Yayınla" - -msgid "modals.publish-empty-library.message" -msgstr "Kütüphaneniz boş. Yine de yayınlamak istediğinizden emin misiniz?" - -msgid "modals.publish-empty-library.title" -msgstr "Boş kütüphaneyi yayınla" - #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.remove-shared-confirm.accept" @@ -2178,12 +1902,6 @@ msgstr "“%s” Paylaşılan Kütüphanesini Kaldır" msgid "modals.small-nudge" msgstr "Küçük dürtme" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.accept" -msgid_plural "modals.unpublish-shared-confirm.accept" -msgstr[0] "Yayından kaldır" -msgstr[1] "Yayından kaldır" - #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.message" @@ -2232,10 +1950,6 @@ msgstr "" msgid "modals.update-remote-component.message" msgstr "Paylaşılmış bir kütüphanede bir bileşen güncelle" -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "Yeni bir sürüm mevcut, lütfen sayfayı yenileyin" - #: src/app/main/ui/dashboard/team.cljs msgid "notifications.invitation-email-sent" msgstr "Davet başarıyla iletildi" @@ -2325,33 +2039,12 @@ msgstr "Katkıda bulunma kılavuzu" msgid "onboarding-v2.welcome.title" msgstr "Penpot'a hoş geldiniz!" -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Takım oluşturmaya devam edin" - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Takım olmadan devam edin" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Takım oluşturun ve davet edin" - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Takım oluşturun ve davet gönderin" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Daha sonra davet edebileceksiniz" - msgid "onboarding.choice.team-up.create-team-desc" msgstr "Takımınızı adlandırdıktan sonra, insanları katılmaya davet edebileceksiniz." msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "Takımın adını girin" -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Takım oluşturun" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Davet etmeden takım oluşturun" - msgid "onboarding.choice.team-up.invite-members" msgstr "Üyeleri davet edin" @@ -2363,12 +2056,6 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Rol ile davet et:" -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Takım olmadan başlayın" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Daha sonra bir takım oluşturabileceksiniz." - msgid "onboarding.newsletter.accept" msgstr "Evet, abone ol" @@ -2417,179 +2104,6 @@ msgstr "Penpot" msgid "profile.recovery.go-to-login" msgstr "Oturum açmaya git" -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "Hangi tasarım aracını daha iyi kullanıyorsunuz?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "11-30" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "31-50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "Çok fazla" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Adobe XD" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Canva" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "... üzerinde çalışma deneyiminizi en iyi nasıl tarif edersiniz?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "Tasarımcı" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "Geliştirici" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "Penpot'u daha fazla keşfedin" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Figma" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Kurucu/Başkan Yardımcısı" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "Serbest çalışıyorum" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "Takım projemin kodunu al " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "... kullanıcı arayüzü tasarımı, görsel öğeler, tasarım sistemleri, vb." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "InVision" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "Takımımın projesi için geri bildirim bırakın" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "Haydi başlayalım!" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "Ürün veya Proje yöneticisi" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Pazarlama" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "50'den fazla" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "Sonraki" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "Hiçbiri" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "Diğer (lütfen belirtiniz)" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "Kendi projem üzerinde çalışıyorum" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "Önceki" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "Penpot'u nasıl kullanmayı planlıyorsunuz?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "Göreviniz nedir?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "Bir seçenek belirleyin" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Sketch" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.some" -msgstr "Biraz" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "Başla" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "Projem üzerinde çalışmaya başla" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "Öğrenci veya öğretmen" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "Takımınızın büyüklüğü nedir?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "Penpot'un takımınız için uygun olup olmadığını görmek için test edin " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "Penpot'u fiziksel bir sunucuda kullanmadan önce deneyin" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "" -"... taslak çizimler, kullanıcı deneyimi yol haritası ve akışları, gezinme " -"menüsü, vb." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "Konsept fikirler üzerinde çalışmak" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"Geri bildiriminiz, Penpot'u kullanışlı ve eğlenceli bir araç haline " -"getirmeye devam edebilmemiz için alışkanlıklarınızı ve tercihlerinizi " -"anlamamıza yardımcı olacaktır." - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Çıkar" - #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, @@ -2649,9 +2163,6 @@ msgstr "Yollar" msgid "shortcut-subsection.shape" msgstr "Şekiller" -msgid "shortcut-subsection.text-editor" -msgstr "Metinler" - msgid "shortcut-subsection.tools" msgstr "Araçlar" @@ -2670,15 +2181,9 @@ msgstr "Düğüm ekle" msgid "shortcuts.align-bottom" msgstr "Alta hizala" -msgid "shortcuts.align-center" -msgstr "Ortala" - msgid "shortcuts.align-hcenter" msgstr "Ortayı yatay olarak hizala" -msgid "shortcuts.align-justify" -msgstr "İki yana yasla" - msgid "shortcuts.align-left" msgstr "Sola hizala" @@ -2694,9 +2199,6 @@ msgstr "Ortayı dikey olarak hizala" msgid "shortcuts.artboard-selection" msgstr "Seçimden çalışma yüzeyi oluştur" -msgid "shortcuts.bold" -msgstr "Kalın yazı aç/kapat" - msgid "shortcuts.bool-difference" msgstr "Boole farkı" @@ -2787,12 +2289,6 @@ msgstr "Yatay olarak çevir" msgid "shortcuts.flip-vertical" msgstr "Dikey olarak çevir" -msgid "shortcuts.font-size-dec" -msgstr "Yazı boyutunu azalt" - -msgid "shortcuts.font-size-inc" -msgstr "Yazı boyutunu artır" - msgid "shortcuts.go-to-drafts" msgstr "Taslaklara git" @@ -2817,27 +2313,9 @@ msgstr "Yakınlaştır" msgid "shortcuts.insert-image" msgstr "Görsel ekle" -msgid "shortcuts.italic" -msgstr "İtalik yazı aç/kapat" - msgid "shortcuts.join-nodes" msgstr "Düğümlere katıl" -msgid "shortcuts.letter-spacing-dec" -msgstr "Harf aralığını azalt" - -msgid "shortcuts.letter-spacing-inc" -msgstr "Harf aralığını artır" - -msgid "shortcuts.line-height-dec" -msgstr "Satır yüksekliğini azalt" - -msgid "shortcuts.line-height-inc" -msgstr "Satır yüksekliğini artır" - -msgid "shortcuts.line-through" -msgstr "Üstü çizili yazı aç/kapat" - msgid "shortcuts.make-corner" msgstr "Köşe yap" @@ -2958,15 +2436,6 @@ msgstr "Kısayolları ara" msgid "shortcuts.select-all" msgstr "Tümünü seç" -msgid "shortcuts.select-next" -msgstr "Sonraki katmanı seç" - -msgid "shortcuts.select-parent-layer" -msgstr "Ana katmanı seç" - -msgid "shortcuts.select-prev" -msgstr "Önceki katmanı seç" - msgid "shortcuts.separate-nodes" msgstr "Düğümleri ayır" @@ -2991,18 +2460,6 @@ msgstr "Ölçüme başla" msgid "shortcuts.stop-measure" msgstr "Ölçümü durdur" -msgid "shortcuts.text-align-center" -msgstr "Ortaya hizala" - -msgid "shortcuts.text-align-justify" -msgstr "İki yana yasla" - -msgid "shortcuts.text-align-left" -msgstr "Sola hizala" - -msgid "shortcuts.text-align-right" -msgstr "Sağa hizala" - msgid "shortcuts.thumbnail-set" msgstr "Küçük resimleri ayarla" @@ -3046,18 +2503,9 @@ msgstr "Cetvelleri göster/gizle" msgid "shortcuts.toggle-textpalette" msgstr "Metin paletini değiştir" -msgid "shortcuts.toggle-theme" -msgstr "Temayı değiştir" - -msgid "shortcuts.toggle-visibility" -msgstr "Göster / Gizle" - msgid "shortcuts.toggle-zoom-style" msgstr "Yakınlaştırma şeklini değiştir" -msgid "shortcuts.underline" -msgstr "Alt çizgiyi aç/kapat" - msgid "shortcuts.undo" msgstr "Geri al" @@ -3070,19 +2518,9 @@ msgstr "Maskelemeyi kaldır" msgid "shortcuts.v-distribute" msgstr "Dikey olarak dağıt" -msgid "shortcuts.zoom-lense-decrease" -msgstr "Görüntüyü küçült" - -msgid "shortcuts.zoom-lense-increase" -msgstr "Görüntüyü büyült" - msgid "shortcuts.zoom-selected" msgstr "Seçilene yakınlaştır" -#: src/app/main/ui/dashboard/team.cljs -msgid "team.webhooks.max-length" -msgstr "Webhook adı en fazla 2048 karakter içermelidir." - #: src/app/main/ui/dashboard/files.cljs msgid "title.dashboard.files" msgstr "%s - Penpot" @@ -3111,10 +2549,6 @@ msgstr "Paylaşılmış Kütüphaneler - %s - Penpot" msgid "title.default" msgstr "Penpot - Takımlar için Özgür Tasarım" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "title.settings.access-tokens" -msgstr "Profil - Erişim belirteçleri" - #: src/app/main/ui/settings/feedback.cljs msgid "title.settings.feedback" msgstr "Geri bildirimde bulun - Penpot" @@ -3279,9 +2713,6 @@ msgstr "Sil" msgid "workspace.assets.duplicate" msgstr "Çoğalt" -msgid "workspace.assets.duplicate-main" -msgstr "Ana bileşeni çoğalt" - #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.edit" @@ -3311,9 +2742,6 @@ msgstr "yerel kütüphane" msgid "workspace.assets.not-found" msgstr "Varlık bulunmadı" -msgid "workspace.assets.open-library" -msgstr "Kütüphane dosyasını aç" - #: src/app/main/ui/workspace/sidebar/sitemap.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs @@ -3334,10 +2762,6 @@ msgid_plural "workspace.assets.selected-count" msgstr[0] "%s öge seçildi" msgstr[1] "%s öge seçildi" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "Paylaşılan kütüphane" - #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" @@ -3384,45 +2808,6 @@ msgstr "Metin Dönüşümü" msgid "workspace.assets.ungroup" msgstr "Grubu dağıt" -msgid "workspace.context-menu.grid-cells.area" -msgstr "Alan oluştur" - -msgid "workspace.context-menu.grid-cells.create-board" -msgstr "Çalışma yüzeyi oluştur" - -msgid "workspace.context-menu.grid-cells.merge" -msgstr "Hücreleri birleştir" - -msgid "workspace.context-menu.grid-track.column.add-after" -msgstr "Sağa 1 sütun ekle" - -msgid "workspace.context-menu.grid-track.column.add-before" -msgstr "Sola 1 sütun ekle" - -msgid "workspace.context-menu.grid-track.column.delete" -msgstr "Sütunu sil" - -msgid "workspace.context-menu.grid-track.column.delete-shapes" -msgstr "Sütun ve şekilleri sil" - -msgid "workspace.context-menu.grid-track.column.duplicate" -msgstr "Yinelenen sütun" - -msgid "workspace.context-menu.grid-track.row.add-after" -msgstr "Aşağıya 1 satır ekle" - -msgid "workspace.context-menu.grid-track.row.add-before" -msgstr "Yukarıya 1 satır ekle" - -msgid "workspace.context-menu.grid-track.row.delete" -msgstr "Satırı sil" - -msgid "workspace.context-menu.grid-track.row.delete-shapes" -msgstr "Satır ve şekilleri sil" - -msgid "workspace.context-menu.grid-track.row.duplicate" -msgstr "Yinelenen satır" - msgid "workspace.focus.focus-mode" msgstr "Odaklanma modu" @@ -3449,9 +2834,6 @@ msgstr "Dairesel degrade" msgid "workspace.header.menu.disable-dynamic-alignment" msgstr "Dinamik hizalamayı devre dışı bırak" -msgid "workspace.header.menu.disable-scale-content" -msgstr "Orantılı ölçeklendirmeyi devre dışı bırak" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-scale-text" msgstr "Metin ölçeklendirmeyi devre dışı bırak" @@ -3467,9 +2849,6 @@ msgstr "Piksele tutturmayı devre dışı bırak" msgid "workspace.header.menu.enable-dynamic-alignment" msgstr "Dinamik hizalamayı etkinleştir" -msgid "workspace.header.menu.enable-scale-content" -msgstr "Orantılı ölçeklendirmeyi etkinleştir" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-scale-text" msgstr "Metin ölçeklendirmeyi etkinleştir" @@ -3520,9 +2899,6 @@ msgstr "Tercihler" msgid "workspace.header.menu.option.view" msgstr "Görünüm" -msgid "workspace.header.menu.redo" -msgstr "Tekrarla" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.select-all" msgstr "Tümünü seç" @@ -3546,15 +2922,6 @@ msgstr "Cetvelleri göster" msgid "workspace.header.menu.show-textpalette" msgstr "Yazı tipi paletini göster" -msgid "workspace.header.menu.toggle-dark-theme" -msgstr "Koyu temaya geç" - -msgid "workspace.header.menu.toggle-light-theme" -msgstr "Açık temaya geç" - -msgid "workspace.header.menu.undo" -msgstr "Geri al" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.reset-zoom" msgstr "Sıfırla" @@ -3579,10 +2946,6 @@ msgstr "Kaydedilmemiş değişiklikler" msgid "workspace.header.viewer" msgstr "Görünüm modu (%s)" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom" -msgstr "Yakınlaştırma" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.zoom-fill" msgstr "Doldur - Doldurmak için ölçeklendir" @@ -3603,21 +2966,6 @@ msgstr "Tam ekran" msgid "workspace.header.zoom-selected" msgstr "Seçilene yakınlaştır" -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Izgarayı düzenle" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Çıkış" - -msgid "workspace.layout_grid.editor.title" -msgstr "Düzenleme ızgarası" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Bitti" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Bul" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Ekle" @@ -3626,14 +2974,6 @@ msgstr "Ekle" msgid "workspace.libraries.colors" msgstr "%s renk" -#: src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.empty-palette" -msgstr "Kütüphanenizde henüz renk stili yok" - -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "Kütüphanenizde henüz tipografi stili yok" - #: src/app/main/ui/workspace/colorpicker/libraries.cljs, #: src/app/main/ui/workspace/colorpalette.cljs msgid "workspace.libraries.colors.file-library" @@ -3684,14 +3024,6 @@ msgstr "KÜTÜPHANELER" msgid "workspace.libraries.library" msgstr "KÜTÜPHANE" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library-updates" -msgstr "KÜTÜPHANE GÜNCELLEMELERİ" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.loading" -msgstr "Yükleniyor…" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "Güncelleme gerektiren Paylaşılmış Kütüphane bulunmuyor" @@ -3728,10 +3060,6 @@ msgstr "%s tipografi" msgid "workspace.libraries.update" msgstr "Güncelle" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "tüm değişiklikleri gör" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.updates" msgstr "GÜNCELLEMELER" @@ -3763,27 +3091,6 @@ msgstr "İçeriği kırp" msgid "workspace.options.component" msgstr "Bileşen" -msgid "workspace.options.component.annotation" -msgstr "Açıklama" - -msgid "workspace.options.component.copy" -msgstr "Kopyala" - -msgid "workspace.options.component.create-annotation" -msgstr "Bir açıklama oluştur" - -msgid "workspace.options.component.edit-annotation" -msgstr "Bir açıklamayı düzenle" - -msgid "workspace.options.component.main" -msgstr "Ana bileşen" - -msgid "workspace.options.component.swap" -msgstr "Bileşeni değiştir" - -msgid "workspace.options.component.swap.empty" -msgstr "Bu kütüphanede henüz varlık yok" - #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Kısıtlamalar" @@ -3838,12 +3145,6 @@ msgstr "Dışa aktar" msgid "workspace.options.export-multiple" msgstr "Seçimi dışa aktar" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "workspace.options.export-object" -msgid_plural "workspace.options.export-object" -msgstr[0] "1 ögeyi dışa aktar" -msgstr[1] "%s ögeyi dışa aktar" - #: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs msgid "workspace.options.export.suffix" msgstr "Son ek" @@ -3876,10 +3177,6 @@ msgstr "Doldur" msgid "workspace.options.flows.add-flow-start" msgstr "Akış başlangıcı ekle" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Akış" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "Akış başlangıcı" @@ -3983,9 +3280,6 @@ msgstr "Grubu doldur" msgid "workspace.options.group-stroke" msgstr "Grubu çiz" -msgid "workspace.options.guides.title" -msgstr "Kılavuzlar" - msgid "workspace.options.height" msgstr "Yükseklik" @@ -4534,26 +3828,14 @@ msgstr "Çerçeve" msgid "workspace.options.stroke-cap.circle-marker" msgstr "Daire işaretleyici" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Daire" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "Elmas işaretleyici" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Elmas" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "Çizgi oku" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Ok" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "Hiçbiri" @@ -4570,18 +3852,10 @@ msgstr "Kare" msgid "workspace.options.stroke-cap.square-marker" msgstr "Kare işaretleyici" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Dikdörtgen" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "Üçgen ok" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Üçgen" - msgid "workspace.options.stroke-color" msgstr "Çerçeve rengi" @@ -4756,9 +4030,6 @@ msgstr "Düğümleri tuttur (%s)" msgid "workspace.shape.menu.add-flex" msgstr "Esnek düzen ekle" -msgid "workspace.shape.menu.add-grid" -msgstr "Izgara düzeni ekle" - #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.back" msgstr "En arkaya gönder" @@ -4771,9 +4042,6 @@ msgstr "Arkaya gönder" msgid "workspace.shape.menu.copy" msgstr "Kopyala" -msgid "workspace.shape.menu.create-annotation" -msgstr "Açıklama oluştur" - #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.create-artboard-from-selection" msgstr "Çalışma yüzeyi için seçim" @@ -4782,9 +4050,6 @@ msgstr "Çalışma yüzeyi için seçim" msgid "workspace.shape.menu.create-component" msgstr "Bileşen oluştur" -msgid "workspace.shape.menu.create-multiple-components" -msgstr "Çoklu bileşen oluştur" - #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.cut" msgstr "Kes" @@ -5052,13 +4317,6 @@ msgstr "Metin (%s)" msgid "workspace.toolbar.text-palette" msgstr "Tipografiler (%s)" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**İnceleme modu** (Yalnızca görüntüle)" - -msgid "workspace.top-bar.read-only.done" -msgstr "Bitti" - #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Şu ana kadar değişim geçmişi yok" @@ -5178,10 +4436,6 @@ msgstr "Geçmiş" msgid "workspace.updates.dismiss" msgstr "Yoksay" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "Daha fazla bilgi" - #: src/app/main/data/workspace/libraries.cljs msgid "workspace.updates.there-are-updates" msgstr "Paylaşılan kütüphaneler için güncellemeler var" @@ -5250,3 +4504,692 @@ msgstr "Yolu kapatmak için tıklayın" #~ msgid "workspace.options.layout-item.title.min-w" #~ msgstr "Asgari genişlik" + +msgid "shortcuts.bold" +msgstr "Kalın yazı aç/kapat" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Penpot'u fiziksel bir sunucuda kullanmadan önce deneyin" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Konsept fikirler üzerinde çalışmak" + +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "Kütüphanenizde henüz renk stili yok" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "30 gün" + +msgid "workspace.options.component.copy" +msgstr "Kopyala" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Geri bildiriminiz, Penpot'u kullanışlı ve eğlenceli bir araç haline " +"getirmeye devam edebilmemiz için alışkanlıklarınızı ve tercihlerinizi " +"anlamamıza yardımcı olacaktır." + +msgid "modals.invite-member.repeated-invitation" +msgstr "" +"Bazı e-posta adresleri mevcut takım üyelerine aittir. Davetleri " +"gönderilmeyecektir." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Geliştirici" + +msgid "shortcuts.align-justify" +msgstr "İki yana yasla" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Ürün veya Proje yöneticisi" + +msgid "workspace.options.component.create-annotation" +msgstr "Bir açıklama oluştur" + +#, markdown +msgid "dashboard.fonts.warning-text" +msgstr "" +"İşletim sistemlerinin farklı dikey metriklerine ilişkin olarak yazı " +"tiplerinizde olası bir sorun tespit ettik. Bu durumu kontrol etmek için [" +"bunun gibi](https://vertical-metrics.netlify.app/) yazı tipi dikey metrik " +"hizmetlerini kullanabilirsiniz. Ayrıca web yazı tipleri oluşturmak ve " +"hataları düzeltmek için [Transfonter](https://transfonter.org/) kullanmanızı " +"öneririz. " + +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "Yeni bir sürüm mevcut, lütfen sayfayı yenileyin" + +msgid "modals.delete-component-annotation.message" +msgstr "Bu açıklamayı silmek istediğinize emin misiniz?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Pazarlama" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "180 gün" + +msgid "workspace.options.component.edit-annotation" +msgstr "Bir açıklamayı düzenle" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Takım projemin kodunu al " + +msgid "workspace.shape.menu.create-multiple-components" +msgstr "Çoklu bileşen oluştur" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "Kendi projem üzerinde çalışıyorum" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Dikdörtgen" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "İsim gereklidir" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.scd-message" +msgid_plural "modals.delete-shared-confirm.activated.scd-message" +msgstr[0] "Bu kütüphane burada etkinleştirildi: " +msgstr[1] "Bu kütüphaneler burada etkinleştirildiler: " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Serbest çalışıyorum" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.copied-success" +msgstr "Belirteç kopyalandı" + +msgid "modals.publish-empty-library.title" +msgstr "Boş kütüphaneyi yayınla" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "tüm değişiklikleri gör" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...marka çalışması, çizimler, pazarlama materyalleri, vb." + +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "Kütüphanenizde henüz tipografi stili yok" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "90 gün" + +msgid "shortcuts.zoom-lense-increase" +msgstr "Görüntüyü büyült" + +msgid "workspace.shape.menu.add-grid" +msgstr "Izgara düzeni ekle" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "" +"Bu dosyada daha önce kullanılmış olan varlıklar orada kalmaya devam edecek (" +"hiçbir tasarım bozulmayacak)." +msgstr[1] "" +"Bu dosyalarda daha önce kullanılmış olan varlıklar orada kalmaya devam " +"edecek (hiçbir tasarım bozulmayacak)." + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "Yakınlaştırma" + +msgid "workspace.options.component.annotation" +msgstr "Açıklama" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Biraz" + +msgid "shortcuts.text-align-justify" +msgstr "İki yana yasla" + +msgid "workspace.layout_grid.editor.title" +msgstr "Düzenleme ızgarası" + +#: src/app/main/ui/dashboard/team.cljs +msgid "team.webhooks.max-length" +msgstr "Webhook adı en fazla 2048 karakter içermelidir." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "%s tarihinde sona erdi" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.expiration-date.label" +msgstr "Sona erme tarihi" + +msgid "workspace.header.menu.undo" +msgstr "Geri al" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "50'den fazla" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-weight" +msgstr "Yazı Tipi Kalınlığı" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "Parola boşluk dışında bir karakter içermelidir." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Sonraki" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "Takımınızın büyüklüğü nedir?" + +msgid "shortcuts.toggle-visibility" +msgstr "Göster / Gizle" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "" +"... taslak çizimler, kullanıcı deneyimi yol haritası ve akışları, gezinme " +"menüsü, vb." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "60 gün" + +msgid "workspace.header.menu.disable-scale-content" +msgstr "Orantılı ölçeklendirmeyi devre dışı bırak" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "Çok fazla" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Başla" + +msgid "shortcuts.align-center" +msgstr "Ortala" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Elmas" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Penpot'u nasıl kullanmayı planlıyorsunuz?" + +msgid "workspace.header.menu.redo" +msgstr "Tekrarla" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "... üzerinde çalışma deneyiminizi en iyi nasıl tarif edersiniz?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Bir seçenek belirleyin" + +msgid "shortcuts.text-align-left" +msgstr "Sola hizala" + +msgid "shortcuts.font-size-dec" +msgstr "Yazı boyutunu azalt" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Tasarımcı" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Hiçbiri" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "Haydi başlayalım!" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Çıkar" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Sketch" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library-updates" +msgstr "KÜTÜPHANE GÜNCELLEMELERİ" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Üçgen" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "İsim" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "Hiçbir dosyada etkinleştirilmedi." +msgstr[1] "Hiçbir dosyada etkinleştirilmediler." + +msgid "modals.publish-empty-library.message" +msgstr "Kütüphaneniz boş. Yine de yayınlamak istediğinizden emin misiniz?" + +msgid "workspace.assets.open-library" +msgstr "Kütüphane dosyasını aç" + +msgid "modals.delete-component-annotation.title" +msgstr "Açıklamayı sil" + +msgid "shortcuts.select-parent-layer" +msgstr "Ana katmanı seç" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "Paylaşılan kütüphane" + +msgid "shortcuts.select-next" +msgstr "Sonraki katmanı seç" + +msgid "workspace.header.menu.enable-scale-content" +msgstr "Orantılı ölçeklendirmeyi etkinleştir" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "Daha fazla bilgi" + +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "İsim boşluk dışında bir karakter içermelidir." + +msgid "shortcuts.line-height-inc" +msgstr "Satır yüksekliğini artır" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Diğer (lütfen belirtiniz)" + +msgid "labels.discard" +msgstr "At" + +msgid "shortcuts.font-size-inc" +msgstr "Yazı boyutunu artır" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Penpot'un takımınız için uygun olup olmadığını görmek için test edin " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Öğrenci veya öğretmen" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Takımımın projesi için geri bildirim bırakın" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "InVision" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canva" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "Penpot'u daha fazla keşfedin" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "%s tarihinde sona eriyor" + +msgid "shortcuts.italic" +msgstr "İtalik yazı aç/kapat" + +msgid "shortcuts.letter-spacing-dec" +msgstr "Harf aralığını azalt" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "Önceki" + +msgid "workspace.shape.menu.create-annotation" +msgstr "Açıklama oluştur" + +msgid "shortcuts.letter-spacing-inc" +msgstr "Harf aralığını artır" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Projem üzerinde çalışmaya başla" + +msgid "shortcuts.text-align-center" +msgstr "Ortaya hizala" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Ok" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "Hangi tasarım aracını daha iyi kullanıyorsunuz?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Göreviniz nedir?" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Kütüphaneniz boş. Paylaşılan Kütüphane olarak eklendiğinde, oluşturduğunuz " +"varlıklar diğer dosyalarınız arasında kullanılabilir olacak. Yayınlamak " +"istediğinizden emin misiniz?" + +msgid "shortcuts.text-align-right" +msgstr "Sağa hizala" + +msgid "shortcuts.underline" +msgstr "Alt çizgiyi aç/kapat" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "Asla" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Kurucu/Başkan Yardımcısı" + +msgid "modals.publish-empty-library.accept" +msgstr "Yayınla" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.no-expiration" +msgstr "Süresiz" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "İsim en fazla 250 karakter içermelidir." + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Daire" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" + +msgid "shortcut-subsection.text-editor" +msgstr "Metinler" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... kullanıcı arayüzü tasarımı, görsel öğeler, tasarım sistemleri, vb." + +msgid "shortcuts.zoom-lense-decrease" +msgstr "Görüntüyü küçült" + +msgid "shortcuts.line-height-dec" +msgstr "Satır yüksekliğini azalt" + +msgid "shortcuts.select-prev" +msgstr "Önceki katmanı seç" + +msgid "shortcuts.line-through" +msgstr "Üstü çizili yazı aç/kapat" + +msgid "errors.cannot-upload" +msgstr "Medya dosyası yüklenemedi." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.message" +msgstr "Bu belirteci silmek istediğinizden emin misiniz?" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "Erişim belirteçleri" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "Belirtecin sona erme tarihi yok" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "Yeni belirteç oluştur" + +msgid "workspace.options.component.main" +msgstr "Ana bileşen" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "Belirtecin süresi %s tarihinde sona erecek" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "Belirteci sil" + +msgid "workspace.assets.duplicate-main" +msgstr "Ana bileşeni çoğalt" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "Belirteç oluştur" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.placeholder" +msgstr "Adı, belirtecin ne için olduğunu bilmenize yardımcı olabilir" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "Şu ana kadar hiç belirteciniz yok." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"Kişisel erişim belirteçleri, oturum açma/parola kimlik doğrulama sistemimize " +"alternatif olarak işlev görür ve bir uygulamanın dahili Penpot API'sine " +"erişmesine izin vermek için kullanılabilir" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "Kişisel erişim belirteçleri" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "Bir belirteç oluşturmak için \"Yeni belirteç oluştur\" düğmesine basın." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "Belirteci sil" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "Erişim belirteci başarıyla oluşturuldu." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "Erişim belirteci oluştur" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.copy-token" +msgstr "Belirteci kopyala" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "Profil - Erişim belirteçleri" + +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Bir hesap oluştururken, [koşullarımızı](%s) ve [gizlilik politikamızı](%s) " +"kabul etmiş sayılırsınız." + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-delete-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "Dosyanız başarıyla silindi" +msgstr[1] "Dosyalarınız başarıyla silindi" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Dosyanın uyumsuz bir sürüm numarası var" + +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Etkinleştirilen özellikler ile açmaya çalıştığınız dosyanın özellikleri " +"arasında bir uyumsuzluk var gibi görünüyor. Dosyanın açılabilmesi için önce " +"'%s' için geçişlerin uygulanması gerekiyor." + +msgid "errors.validation" +msgstr "Doğrulama Hatası" + +msgid "errors.paste-data-validation" +msgstr "Panoda geçersiz veri" + +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Ayarlanmadı" + +msgid "labels.share" +msgstr "Paylaş" + +msgid "labels.search" +msgstr "Ara" + +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Takım olmadan başlayın" + +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Takım oluşturmaya devam edin" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Daha sonra bir takım oluşturabileceksiniz." + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Takım olmadan devam edin" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Takım oluşturun ve davet gönderin" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Davet etmeden takım oluşturun" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Takım oluşturun ve davet edin" + +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Takım oluşturun" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Daha sonra davet edebileceksiniz" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Bul" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Bitti" + +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Izgarayı düzenle" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Çıkış" + +msgid "workspace.options.component.swap" +msgstr "Bileşeni değiştir" + +msgid "workspace.options.component.swap.empty" +msgstr "Bu kütüphanede henüz varlık yok" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Akış" + +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**İnceleme modu** (Yalnızca görüntüle)" + +msgid "workspace.top-bar.read-only.done" +msgstr "Bitti" + +msgid "media.image" +msgstr "Görsel" + +msgid "media.solid" +msgstr "Katı" + +msgid "media.linear" +msgstr "Doğrusal" + +msgid "media.radial" +msgstr "Işınsal" + +msgid "media.gradient" +msgstr "Değişim" + +msgid "media.choose-image" +msgstr "Görsel seç" + +msgid "workspace.options.guides.title" +msgstr "Kılavuzlar" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.accept" +msgid_plural "modals.unpublish-shared-confirm.accept" +msgstr[0] "Yayından kaldır" +msgstr[1] "Yayından kaldır" + +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "1 dosya başarıyla içeri aktarıldı." +msgstr[1] "%s dosya başarıyla içeri aktarıldı." + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-duplicate-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "Dosyanız başarıyla kopyalandı" +msgstr[1] "Dosyalarınız başarıyla kopyalandı" + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Uyumsuz '%s' özelliği algılandı" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export-object" +msgid_plural "workspace.options.export-object" +msgstr[0] "1 ögeyi dışa aktar" +msgstr[1] "%s ögeyi dışa aktar" diff --git a/frontend/translations/yo.po b/frontend/translations/yo.po deleted file mode 100644 index 6a9b82b11..000000000 --- a/frontend/translations/yo.po +++ /dev/null @@ -1,4646 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2024-02-14 08:02+0000\n" -"Last-Translator: Alejandro Alonso \n" -"Language-Team: Yoruba " -"\n" -"Language: yo\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.4-dev\n" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.check-your-email" -msgstr "" -"yẹ ímeèlì rẹ wò kí o tẹ ọ̀nà-àsopọ̀ láti mọ̀ dájú àti láti bẹ̀rẹ̀ sí lo " -"pẹ́ńpọtì." - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.confirm-password" -msgstr "jẹ́rìísí ọ̀rọ̀-ìgbaniwọlé" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-account" -msgstr "ṣẹ̀dá ìfihàn àkáùntí" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-profile" -msgstr "kàn fẹ́ gbìyànjú ú rẹ̀?" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.demo-warning" -msgstr "" -"\"\"This is a DEMO service, DO NOT USE for real work, the projects will be " -"parẹ́ lóòrèkóòrè." - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.email" -msgstr "ímeèlì" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.forgot-password" -msgstr "gbàgbé ọ̀rọ̀-ìgbaniwọlé ?" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.fullname" -msgstr "orúkọ lẹ́kùnn-ún-rẹ́rẹ́" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.login-here" -msgstr "wọlé síbí" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-submit" -msgstr "wọlé" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "ó dára láti rí ẹ lẹ́ẹ̀kan sí i!" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-github-submit" -msgstr "ibùdó gítì" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-gitlab-submit" -msgstr "láàbù gítì" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-google-submit" -msgstr "ṣàwárí" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-ldap-submit" -msgstr "LDAP" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-oidc-submit" -msgstr "ṣílẹ̀kuǹ ìdánimọ̀" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "orúkọ kò gbọdọ̀ ju àádọ́jọ́ lẹ́tà lọ." - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.new-password" -msgstr "tẹ ọ̀rọ̀ ìgbaniwọlé tuntun" - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.invalid-token-error" -msgstr "àmì àtúnwárí ti díbàjẹ́." - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.password-changed-successfully" -msgstr "ọ̀rọ̀-ìgbaniwọlé ti yí padà dáadáa" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.profile-not-verified" -msgstr "" -"a tí ì ṣe ìwádìí bí o ṣe jẹ́, jọ̀wọ́ ṣe ìwádìí bí o ṣe jẹ́ kí o tó tẹ̀ " -"síwájú." - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.recovery-token-sent" -msgstr "a ti fi ọ̀rọ̀-ìgbaniwọle aṣàtúnwárí ránṣẹ sínu àpótí rẹ." - -#: src/app/main/ui/auth/verify_token.cljs -msgid "auth.notifications.team-invitation-accepted" -msgstr "o ti wọ inú ẹgbẹ́ bó ṣeyẹ" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.password" -msgstr "ọ̀rọ̀- ìgbaniwọlé" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-length-hint" -msgstr "kò gbọdọ̀ ju ohun kíkọ mẹ́jọ lọ" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-not-empty" -msgstr "ọ̀rọ̀-ìgbaniwọlé gbọ́dọ̀ ní nǹkan kíkọ láìsí àlàfo." - -msgid "auth.privacy-policy" -msgstr "ìpamọ ètò ìmúló" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-submit" -msgstr "ṣàtuńwárí ọ̀rọ̀-ìgbaniwọlé" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-subtitle" -msgstr "a má a fi àwọn ìtọ́nisọ́nà ránsẹ́ sínú ímeèlì rẹ" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-title" -msgstr "gbàgbé ọ̀rọ̀-ìgbaniwọle ?" - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.recovery-submit" -msgstr "yí ọ̀rọ̀-ìgbaniwọlé rẹ padà" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.register" -msgstr "kò tí ì sí àkáùntì?" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.register-submit" -msgstr "ṣẹ̀dá àkáùntì" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-subtitle" -msgstr "ọ̀fẹ́ ni,orísun rẹ̀ ṣí lẹ" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-title" -msgstr "ṣẹ̀dá àkáùntì" - -#: src/app/main/ui/auth.cljs -msgid "auth.sidebar-tagline" -msgstr "ṣíṣí orísun yíyà àti àwòrán ni yóò fi lojútùú ." - -msgid "auth.terms-of-service" -msgstr "òfin ibiṣẹ́" - -msgid "auth.terms-privacy-agreement" -msgstr "" -"\"nígbà, tí o bá ń ṣẹ̀dá àkáùntí tuntun ,o gbọ́dọ̀ gba àwọn òfin ibiṣẹ́ " -"àti àṣírí rẹ́`." - -#: src/app/main/ui/auth/register.cljs -msgid "auth.verification-email-sent" -msgstr "a ti fi ìjẹ́rìísí ránsẹ́ sínú ímeèlì rẹ" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr ".. ìyàsọ́tọ, àpèjúwe,títajà nǹkan, abbl." - -msgid "common.publish" -msgstr "ìgbéjáde" - -msgid "common.share-link.all-users" -msgstr "gbogbo àwọn tó ń lo pẹ́ńpọtì" - -msgid "common.share-link.current-tag" -msgstr "(lọ́wọ́lọ́wọ́)" - -msgid "common.share-link.destroy-link" -msgstr "pa ọ̀nà-àsopọ̀ run" - -msgid "common.share-link.get-link" -msgstr "gba ọ̀nà-àsopọ́" - -msgid "common.share-link.link-copied-success" -msgstr "so àdàkọ pọ̀ bó ṣeyẹ" - -msgid "common.share-link.manage-ops" -msgstr "ṣàkóṣo ìgbaniláàye" - -msgid "common.share-link.permissions-can-comment" -msgstr "o lè sọ̀rọ̀" - -msgid "common.share-link.permissions-can-inspect" -msgstr "ṣe àyẹ̀wò kóòdù" - -msgid "common.share-link.permissions-hint" -msgstr "ẹnikẹ́ni tí ó bá ní ọ̀nà-àsopọ á ní àǹfààní àtiwọle" - -msgid "common.share-link.permissions-pages" -msgstr "pín ojú ìwé" - -msgid "common.share-link.placeholder" -msgstr "ọ̀nà-àsopọ̀ ojú ìwé tí a pín á hàn ní bí yìí" - -msgid "common.share-link.team-members" -msgstr "ọmọ ẹgbẹ́ nìkan ni" - -msgid "common.share-link.title" -msgstr "pín àwọn àpẹrẹ" - -msgid "common.share-link.view-all" -msgstr "yan gbogbo rẹ̀" - -msgid "common.unpublish" -msgstr "ohun tí a kò tí ì kọ jáde" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.management" -msgstr "ìṣàkóṣo ọmọ ẹgbẹ" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.title" -msgstr "kẹ́gbẹ́ ṣera wọn lọ́kan" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.info" -msgstr "" -"\"kọ́ nípa kókó bi pẹ́ńpọtì nígbàtí ò ń dára rẹ láraya nípa fífi àwon " -"ọwọ́ rẹ ṣe “ “ìdánilẹ́kọ̀ọ́ ." - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.start" -msgstr "bẹ̀rẹ̀ ìdánilẹ́kọ̀ọ́" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.title" -msgstr "gbọ́wọ́ lórí idánilẹ́kọ̀ọ́" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.info" -msgstr "rìn kàákiri pẹ́ńpọti kí o lè mọ kókó àwẹn ẹ̀yà ara rẹ̀." - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.start" -msgstr "bẹ̀rẹ̀ ìrìn kiri" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.title" -msgstr "wò ó bí o ṣe ń rìn kiri" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "ṣe ìpilẹ̀sẹ̀ àmì tókìnnì" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "ṣe àyẹ̀wò àmì tókìnnì tí o ṣẹ̀dá bó ṣeyẹ." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "tẹ bọ́tìnnì \" ṣe ìpilẹ̀sẹ̀ àmì tókìnnì tuntun\" láti ṣe ìpilẹ̀sẹ̀ òmíràn." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.no-access-tokens" -msgstr "o kò tí ì ní àmì tókínnì títí di ìsinsìn yìí." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "a nílò orúkọ" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "ọgọ́saǹ-ań ọjọ́" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "ọgbọ̀n ọjọ́" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-60-days" -msgstr "ọgọ́ta ọjọ́" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-90-days" -msgstr "àádọ́ruǹ-ún ọjọ́" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-never" -msgstr "rárá" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "ó parí ní %s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expires-on" -msgstr "ó parí %s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.no-expiration" -msgstr "kò sì ọjọ́ ìparí" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "àmì tokìnnì ìwọlé ti ara ẹni" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"Iṣẹ́ àmì tókìnì ìwọlé ti ara ẹni dàbì ọ̀nà kejí tí a le gbà wọlé/ ọ̀rọ̀- " -"agbaniwọle a lè lo ìfàsẹ sí ètò láti gbaye fún ohun èlò à tì wọlé " -"pẹ́ńpọtì ti abẹ́nú api" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-expire" -msgstr "àmì tòkìn yóò parí ní %s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-not-expire" -msgstr "kò sí ọjọ́ ìparí fún àmì tókìn" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.add-shared" -msgstr "ṣe àpàpọ̀ bí i yàrá ìkàwe tí a pín" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.change-email" -msgstr "pàrọ̀ ímeèlí" - -#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs -msgid "dashboard.copy-suffix" -msgstr "(dàákọ)" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.create-new-team" -msgstr "ṣẹ̀dá ẹgbẹ́ tuntun" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.default-team-name" -msgstr "pẹ́ńpọtì rẹ" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.delete-team" -msgstr "pa ẹgbẹ́ rẹ́" - -msgid "dashboard.download-binary-file" -msgstr "sọ fáìlí pẹ́ńpọtì kalẹ̀ (.penpot)" - -msgid "dashboard.download-standard-file" -msgstr "sọ fáìlì ìpéwọ̀n kalẹ̀ (.svg + .json)" - -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.duplicate" -msgstr "ṣe ẹ̀dà" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.duplicate-multi" -msgstr "ṣe ẹ̀dà %s fáìlì" - -#: src/app/main/ui/dashboard/grid.cljs -#, markdown -msgid "dashboard.empty-placeholder-drafts" -msgstr "" -"\"\" fáìlí tí a dàpọ̀ mọ yàrá ìkàwé á hàn níbí yìí. gbìyànjú láti má a " -"pín àwon fáìlì rẹ̀ tàbí ṣàfikún láti ibi [yàrá ìkàwé wa àti àwòṣe " -"](https://penpot.app/libraries-templates.html)." - -msgid "dashboard.export-binary-multi" -msgstr "sọ àwọn fáìlì pẹ́ẹ́pọtì kalẹ́ %s (.pẹ́ńpọtì)" - -msgid "dashboard.export-frames" -msgstr "fi bọọdù ráńṣẹ bí i PDF" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-frames.title" -msgstr "fi ráńṣẹ́ bí i PDF" - -msgid "dashboard.export-multi" -msgstr "fi pẹ́ńpọtì ráńṣẹ́%s files" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-multiple.selected" -msgstr "% ti %s ẹ́límẹ́ǹti tí a yàn" - -#: src/app/main/ui/workspace/header.cljs -msgid "dashboard.export-shapes" -msgstr "fi ráńṣẹ" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to" -msgstr "" -"o lé ṣe àfikún ti ètò ìfiráńṣẹ si ẹ́límẹ́ǹtì láti bi àmì ohun ìní ( níbi " -"ìsàlẹ̀ báà lẹ́gbẹ̀ẹ́ ọ̀tun )." - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to-link" -msgstr "àlàyé bí a ti ṣètò ìfiráńṣẹ sí pẹ́ńpọtì ." - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.no-elements" -msgstr "kòsí àwọn ẹ́límẹ́ǹtì pẹ̀lú ètò ìfirańńṣẹ." - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.title" -msgstr "àṣàyàn ìfiránṣẹ́" - -msgid "dashboard.export-standard-multi" -msgstr "danlóòdù %s àwọn ojúlówó fáìli (.svg + .json)" - -msgid "dashboard.export.detail" -msgstr "* ó le ní àwọn ẹ̀yà ara, àwòrán àti àwon àwọ̀ àti / tàbí àtẹ̀jáde." - -msgid "dashboard.export.options.all.message" -msgstr "" -"àwọn fáìli tí ó wà nínú yàrá ìkàwé pípín á dàpọ̀ mọ́ ti ìfiráńṣẹ́, fún " -"síṣetọ́jútheir linkage ìsopọ̀ wọn." - -msgid "dashboard.export.options.all.title" -msgstr "ṣe ìfiráńṣẹ́ yàrá ìkàwé pípín" - -msgid "dashboard.export.options.detach.message" -msgstr "" -"Shared libraries will not be included in the export and no assets will be " -"yàrá ìkàwé pípín kò ní sí nínú ti ìfiráńṣẹ́ àti pé kò ni ohun ìní kan tí " -"a ó fi kún yàrá ìkàwé. " - -msgid "dashboard.export.options.detach.title" -msgstr "ṣe ìtọ́jú ohun ìní iyàrá ìkàwé pípín bí i nǹkan tó jẹ́ kókó" - -msgid "dashboard.export.options.merge.message" -msgstr "" -"á fi fáìlì rẹ ráńṣẹ́ pẹ̀lú gbogbo àwọn ohun ìní tó wà láyìíka ni a ó papọ̀ " -"sínú fáìlì yàrá ìkàwé." - -msgid "dashboard.export.options.merge.title" -msgstr "da ohun ìní yàrá ìkàwé pípín pọ̀ mọ́ fáìlì yàrá ìkàwé" - -msgid "dashboard.export.title" -msgstr "fi àwọn fáìlì ráńṣẹ" - -msgid "dashboard.fonts.deleted-placeholder" -msgstr "fọ́ǹtì tó sọnù" - -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.dismiss-all" -msgstr "yọ gbogbo wọn kúrò" - -msgid "dashboard.fonts.empty-placeholder" -msgstr "àwọn fọ́ǹtì tí o ọpulóòdù yó hàn níbí." - -#, markdown -msgid "dashboard.fonts.hero-text1" -msgstr "" -"èyíkéyìí wẹ́bù fọ́ǹtì tí o bá ti ọpulóòdù níbí ni á di àkópọ̀ mọ́ ẹbí " -"fọ́ǹtì àwọn ọ̀rọ̀ ohun ìní tí o wà nínú àwọn fáìlì ẹgbẹ́. Fọ́ǹtì " -"pẹ̀lú u orúkọ ẹbi fọ́ǹtì kanna la ó dàpọ̀ mọ́ ẹgbẹ́ bí i**ẹbí fọ́ǹtì kan " -"soso**. O lè ọpulóòdù fọ́ǹtì pẹ̀lú àwọn ìlànà wọ̀nyí: **TTF, OTF and " -"WOFF** (ẹyọ kan péré la ó nílò)." - -#, markdown -msgid "dashboard.fonts.hero-text2" -msgstr "" -"àwọn fọ́ǹtì tí ó bá jẹ́ tì ẹ nìkan ni o lè ọpulóòdù tàbí èyí tí o ní ìwé " -"àṣẹ láti lò ní pẹ́ńpọtì. Wá a sí i nínú kọ́ńtẹ́tì abala apá ọ̀tún àwọn " -"òfin pẹ́ńpọtìiṣẹ́](https://pẹ́ńpọtì.apù/àwọn òfin.html). o sì le fẹ́ kà " -"nípa[ ìwé àṣẹ- pẹ́ńpọtì](https://www.taipogíráfì.com/faq)." - -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.upload-all" -msgstr "ọpulóòdù gbogbo rẹ̀" - -#, markdown -msgid "dashboard.fonts.warning-text" -msgstr "" -"a ti ṣàwárí àwọn ohun tí ó le fa wàhálà nínú àwọn fọ́ǹtì ìlànà olóòro " -"oríṣiríṣi àwọn ètò tó wà fún ìṣesí ọ̀nà ẹ̀rọ. láti ṣe àyẹ̀wò rẹ̀ o lè " -"lofont vertical metrics services like ìlànà fọ́ǹtì olóòró fún àwọn iṣẹ́ " -"ọ̀nà ẹ̀rọ bí i [èyí èkínní](https://mẹ́tíríkì ìlànà olóòró.netlify .app/). " -"Ní àfikún, a rẹkọmẹ́ǹdì lílo[tíráńsìfọtà(https://tíráńsìfọtà.org/) láti " -"pilẹ̀ṣẹ̀ àwọn wẹ́bù fọ́ǹtì láti túnṣeàsìṣe. " - -msgid "dashboard.import" -msgstr "gbé àwọn fáìlì pẹ́ńpọtì wọlé" - -msgid "dashboard.import.analyze-error" -msgstr "ooho! a kò lè gbé fáìlì yìí wọlé" - -msgid "dashboard.import.import-error" -msgstr "wàhálà wà láti gbé kan wà láti gbé fáìlì wọlé . fáìlì kò wọlé." - -msgid "dashboard.import.import-warning" -msgstr "àwọn fáìlì tí ó ní nǹkan tí kò fẹsẹ múlẹ̀ ti di yíyọ kúro." - -msgid "dashboard.import.progress.process-colors" -msgstr "síṣe ètò àwọ̀" - -msgid "dashboard.import.progress.process-components" -msgstr "síṣe ètò àwọn irin iṣẹ́" - -msgid "dashboard.import.progress.process-media" -msgstr "síṣe ètò àwọn ohun ìgbéròyìn jáde" - -msgid "dashboard.import.progress.process-page" -msgstr "síṣe ètò ojú ìwe : %s" - -msgid "dashboard.import.progress.process-typographies" -msgstr "síṣe ètò àkọsílẹ̀ ojú ìwé" - -msgid "dashboard.import.progress.upload-data" -msgstr "ọpulóòdù dátà sínú sáfà (%s/%s)" - -msgid "dashboard.import.progress.upload-media" -msgstr "ọpulóòdù fáìlì: %s" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.invite-profile" -msgstr "pe àwọn ènìyàn" - -#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.leave-team" -msgstr "fẹgbẹ́ sílẹ̀" - -msgid "dashboard.libraries-and-templates" -msgstr "yàrá ìkàwé àti àwọn àwòṣe" - -msgid "dashboard.libraries-and-templates.explore" -msgstr "ṣe ìwákiri ọ̀pọ̀ wọn kí o sì mọ bí ó ṣe sojúṣe tiẹ" - -msgid "dashboard.libraries-and-templates.import-error" -msgstr "wàhálà wà fún gbígbé tẹ́ńpílétì wọlé. tẹ́ńpílétì kò wọlé." - -#: src/app/main/ui/dashboard/libraries.cljs -msgid "dashboard.libraries-title" -msgstr "yàrá ìkàwé" - -#: src/app/main/ui/dashboard/grid.cljs -msgid "dashboard.loading-files" -msgstr "ṣe ìkójọpọ̀ àwọn fáìlí rẹ …" - -msgid "dashboard.loading-fonts" -msgstr "ṣèkójọpọ̀ àwọ fọ́ǹtì rẹ …" - -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to" -msgstr "gbé lọ" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to-multi" -msgstr "gbé %s àwọn fáìlì lọ" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to-other-team" -msgstr "gbé lọ sí ẹgbẹ́ mìíràn" - -#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/files.cljs -msgid "dashboard.new-file" -msgstr "+ fáìlì tuntun" - -#: src/app/main/data/dashboard.cljs -msgid "dashboard.new-file-prefix" -msgstr "fáìlì tuntun" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dashboard.new-project" -msgstr "+ iṣẹ́ àgbéṣe tuntun" - -#: src/app/main/data/dashboard.cljs -msgid "dashboard.new-project-prefix" -msgstr "iṣẹ́ àgbéṣe tuntun" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.no-matches-for" -msgstr "kò sí èyí tó báramu fún un“%s“" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.no-projects-placeholder" -msgstr "àwon iṣẹ́ àgbéṣe tí a kànpọ á hàn níbí" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "dashboard.notifications.email-changed-successfully" -msgstr "a ti mú ímeèlì rẹ dójú ìwọn dáadáa" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "dashboard.notifications.email-verified-successfully" -msgstr "a ti ṣe ìwádìí ímeèlì rẹ dáadáa" - -#: src/app/main/ui/settings/password.cljs -msgid "dashboard.notifications.password-saved" -msgstr "a ti fi ọ̀rọ̀ ìgbaniwọlé rẹ pamọ́ dáadáa!" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.num-of-members" -msgstr "%s àwọn ọmọ ẹgbẹ́" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.open-in-new-tab" -msgstr "ṣí fáìlì sínú tábù tuntun" - -msgid "dashboard.options" -msgstr "àwọn àṣàyàn" - -#: src/app/main/ui/settings/password.cljs -msgid "dashboard.password-change" -msgstr "yí ọ̀rọ̀ ìgbaniwọlé padà" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.pin-unpin" -msgstr "pínì/yọ pínì kúrò" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dashboard.projects-title" -msgstr "àwọn iṣẹ́ àgbéṣe" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.remove-account" -msgstr "o fẹ́ yọ àkáǹtì rẹ kúro?" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.remove-shared" -msgstr "yọ ọ́ kúrò gẹ́gẹ́ bí yàrá kàwé pípín" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.save-settings" -msgstr "fi àwọn eto pamọ́" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.search-placeholder" -msgstr "ṣàwárí…" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.searching-for" -msgstr "ṣàwárí fún “%s“…" - -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.select-ui-language" -msgstr "yan èdè ui" - -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.select-ui-theme" -msgstr "yan àkọlé" - -#: src/app/main/ui/dashboard/grid.cljs -msgid "dashboard.show-all-files" -msgstr "fi gbogbo àwn fáìlì hàn" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.success-delete-project" -msgstr "iṣẹ́ àgbéṣe rẹ ti parẹ́ dáadáa" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.success-duplicate-project" -msgstr "a ti ṣe ẹ̀dà iṣẹ́ àgbéṣe rẹ dáadáa" - -#: src/app/main/ui/dashboard/grid.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-move-file" -msgstr "a ti gbé fáìlì rẹ kúro dáadáa" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-move-files" -msgstr "a ti gbé àwọn fáìlì rẹ kúrò dáadáa" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.success-move-project" -msgstr "a ti gbé iṣẹ́ àgbéṣe rẹ kúrò dáadáa" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-info" -msgstr "àlàyé ẹgbẹ́" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-members" -msgstr "àwọn ọmọ ẹgbẹ́" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-projects" -msgstr "iṣẹ́ àgbéṣe ọmọ ẹgbẹ́" - -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.theme-change" -msgstr "àkọlé ui" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.title-search" -msgstr "ṣàwárí àwọn èsì" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.type-something" -msgstr "tẹ̀ láti rí àwọn èsì" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.unpublish-shared" -msgstr "yàrá ìkàwé tí a kòtí ì gbé jáde" - -#: src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs -msgid "dashboard.update-settings" -msgstr "mú àwọn ètò dójú ìwọ̀n" - -msgid "dashboard.webhooks.active" -msgstr "ti ń siṣẹ́" - -msgid "dashboard.webhooks.active.explain" -msgstr "When this hook is triggered event details will be delivered" - -msgid "dashboard.webhooks.content-type" -msgstr "ẹ̀yà kọ́ńtẹ́ǹtì" - -msgid "dashboard.webhooks.create" -msgstr "ṣẹ̀dá ìkọ́-wẹ́bù" - -msgid "dashboard.webhooks.create.success" -msgstr "a ti ṣẹ̀dá ìkọ́-wẹ́bù dáadáa ." - -msgid "dashboard.webhooks.description" -msgstr "" -"àwọn ìkọ́-wẹ́bù jẹ́ ọ̀nà tó rọrùn láti fi ààyè sílẹ̀ fún àwọn ààyè " -"ayélujára mìíràn àti awọn ápù ṣe filọ́ tí àwọn ìṣẹ̀lẹ̀ kan bá ní " -"pẹ́ńpọtì’’ a ó fi ìbéèrè ráńṣẹ́ sí ọ̀kọ̀kan wọn tí urls tó o pèsè." - -msgid "dashboard.webhooks.empty.add-one" -msgstr "tẹ bọ́tínnì \"fikún ìkọ́- wẹ́bù\" láti fì kan sí i." - -msgid "dashboard.webhooks.empty.no-webhooks" -msgstr "kò sí ìkọ́-wẹ́bù tí a ṣẹ̀da´dì sisìnyí." - -#: src/app/main/ui/settings.cljs -msgid "dashboard.your-account-title" -msgstr "àkáǹtì rẹ" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.your-email" -msgstr "ímeèlì" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.your-name" -msgstr "ímeèlì rẹ" - -#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.your-penpot" -msgstr "pẹ́ńpọtì rẹ" - -#: src/app/main/ui/alert.cljs -msgid "ds.alert-ok" -msgstr "ó dára" - -#: src/app/main/ui/alert.cljs -msgid "ds.alert-title" -msgstr "àkíyèsí" - -#: src/app/main/ui/confirm.cljs -msgid "ds.component-subtitle" -msgstr "ní láti ṣe ìmúdójú ìwọ̀n àwọn irin iṣẹ́:" - -#: src/app/main/ui/confirm.cljs -msgid "ds.confirm-cancel" -msgstr "fagilé e" - -#: src/app/main/ui/confirm.cljs -msgid "ds.confirm-ok" -msgstr "ó dára" - -#: src/app/main/ui/auth/login.cljs -msgid "errors.auth-provider-not-configured" -msgstr "a kò tí ì fàṣẹ si àtúntò olùpèṣè." - -msgid "errors.auth.unable-to-login" -msgstr "ó dàbí pé o kò tí ì fàṣẹ sí i tàbí àkókò ti kọjá ." - -msgid "errors.bad-font" -msgstr "fọ́ǹtì %s kò ṣe kójọpọ̀" - -msgid "errors.bad-font-plural" -msgstr "àwọn fọ́ǹtì %s kò ṣe kójọpọ̀" - -msgid "errors.cannot-upload" -msgstr "kò le ọpulóòdù fáìlì ìgbéròyìn-jáde." - -#: src/app/main/data/workspace.cljs -msgid "errors.clipboard-not-implemented" -msgstr "a ṣàwákiri rẹ kò le ṣe iṣẹ́ yìí" - -#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs -msgid "errors.email-already-exists" -msgstr "ímeèlì yìí ti jẹ́ lílò tẹ́lẹ" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.email-already-validated" -msgstr "a ti fọwọ́ sí ímeèlì rẹ tẹ́lẹ̀." - -msgid "errors.email-as-password" -msgstr "o kò le lo ímeèlì rẹ gẹ́gẹ́ bí ọ̀rọ̀ ìgbaniwọlé" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.email-has-permanent-bounces" -msgstr "Ímeèlì «%s» ti ní ìjábọ̀ ọ̀pọ̀ọlọpọ̀ ìta-bọn-ọ̀n ti pẹ́." - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs -msgid "errors.email-invalid" -msgstr "Tẹ àti wọlé pẹ̀lú ímeèlì tó wúlo jọ̀wọ́" - -#: src/app/main/ui/settings/change_email.cljs -msgid "errors.email-invalid-confirmation" -msgstr "Ímeèlì tí a ti mọ̀dájú gbọ́dọ̀ báramu" - -msgid "errors.email-spam-or-permanent-bounces" -msgstr "Ímeèlì ti «%s» ń jábọ̀ gẹ́gẹ́ bí i awúrúju tàbí ìta-bọ̀n-ọnọǹ tipẹ́." - -#: src/app/main/errors.cljs -msgid "errors.feature-not-supported" -msgstr "Àwọn ẹ̀yà ara ẹ̀rọ '%s' kò ní àtìlẹ́yìn." - -#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.generic" -msgstr "Àsìṣe kan ti ṣẹlẹ̀." - -#: src/app/main/ui/components/color_input.cljs -msgid "errors.invalid-color" -msgstr "àwọ̀ tó ti díbàjẹ́" - -msgid "errors.invite-invalid.info" -msgstr "Èyí tí a pè le parẹ́ tàbí ki àkókò lekọjá ." - -#: src/app/main/ui/auth/login.cljs -msgid "errors.ldap-disabled" -msgstr "Ìfàṣẹsí LDAP kò ṣe é ṣe ." - -#: src/app/main/errors.cljs -msgid "errors.max-quote-reached" -msgstr "O ti débi '%s' ìfàmìsí. Késí i pẹ̀lú àtìlẹ́yìn ." - -#: src/app/main/data/workspace/persistence.cljs -msgid "errors.media-too-large" -msgstr "Àwòrán tóbi púpọ ju ohun tí a le fisí lọ." - -#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs -msgid "errors.media-type-not-allowed" -msgstr "Ó dàbí pé èyí kì í ṣe àwòrán tó fẹsẹ́ múlẹ̀." - -#: src/app/main/ui/dashboard/team.cljs -msgid "errors.member-is-muted" -msgstr "" -"Pírófáìlì ímeèlì tí ò ǹ pè ti dákẹ (ti jábọ̀ àwúrúju tàbí ìtabọ̀n-ọ̀n tó " -"ga)." - -#: src/app/main/ui/settings/password.cljs -msgid "errors.password-invalid-confirmation" -msgstr "Ijẹ́rìísí ọ̀rọ̀ ìgbaniwọlé rẹ gbọ́dọ̀ báramu" - -#: src/app/main/ui/settings/password.cljs -msgid "errors.password-too-short" -msgstr "Ọ̀rọ̀ ìgbaniwọlé kò gbọdọ̀ dín ní lẹ́tà mẹ́jọ" - -msgid "errors.profile-blocked" -msgstr "Ti dínà mọ́ pírófáìlì" - -#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.profile-is-muted" -msgstr "Ímeèlì pírófáìlì rẹ ti ní ìdákẹ́ (ìjábọ̀ àwúrúju tàbí ìtabọ̀n-ọ̀n tó ga)." - -#: src/app/main/ui/auth/register.cljs -msgid "errors.registration-disabled" -msgstr "Ìforúkọ-sílẹ̀ kò ṣe é ṣe lọ́wọ́lọ́wọ́." - -msgid "errors.team-leave.insufficient-members" -msgstr "kí àwọn ọmọ ẹgbẹ́ tí kò péye fi ẹgbẹ́ sílẹ̀, àbí bóyá o fẹ́ paárẹ́ ni ." - -msgid "errors.team-leave.member-does-not-exists" -msgstr "Kòsí ọmọ ẹgbẹ́ tí o fẹ́ yàn ." - -msgid "errors.team-leave.owner-cant-leave" -msgstr "Oní nǹkan kò le fi ẹgbẹ́ sílẹ̀ , o gbọ́dọ̀ tún ṣe àtúnyàn iṣẹ́ oní nǹkan." - -#: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "errors.unexpected-error" -msgstr "Àsìṣe tí a kòrò tẹ́lẹ̀ ti ṣẹlẹ." - -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.unexpected-token" -msgstr "Tókìnnì àìmọ̀" - -msgid "errors.webhooks.connection" -msgstr "Àsìṣe nínú ètò ìsopọ̀, kò lè dé ibi URL" - -msgid "errors.webhooks.invalid-uri" -msgstr "URL kò páásì ìfọwọ́sí." - -msgid "errors.webhooks.last-delivery" -msgstr "Èyí tí a fijíṣẹ́ kẹ́yìn kò dára." - -msgid "errors.webhooks.ssl-validation" -msgstr "Àsìṣe nínú ìfẹwọ́sí SSL ." - -msgid "errors.webhooks.timeout" -msgstr "Àkókò ti lọ" - -msgid "errors.webhooks.unexpected" -msgstr "Unexpected error on validating àsìṣe àìròtẹ́lẹ̀ lórí ìfọwọ́sí" - -msgid "errors.webhooks.unexpected-status" -msgstr "Ipò àìròtẹ́lẹ̀ %s" - -#: src/app/main/ui/auth/login.cljs -msgid "errors.wrong-credentials" -msgstr "Ímeèlì tàbí ọ̀rọ̀ ìgbaniwọlé kò tọ̀nà." - -#: src/app/main/ui/settings/password.cljs -msgid "errors.wrong-old-password" -msgstr "Ọ̀rọ̀ ìgbaniwọlé ti àtijọ́ kò tọ̀nà" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.description" -msgstr "Àpèjúwe" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-go-to" -msgstr "Lọ ibi àpérò pẹ́ńpọtì" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-subtitle1" -msgstr "" -"Inú wa dùn láti rí ẹ níbí. Tí o bá nílò ìrànlọ́wọ, please search before " -"you jọ̀wọ́ ṣàwárí kí o tó firáńṣẹ́." - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-title" -msgstr "Agbègbè pẹ́ńpọtì" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.subject" -msgstr "Kókó-ọ̀rọ̀" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.subtitle" -msgstr "" -"Jọ̀wọ́ ṣàpèjúwe ìdí tó wà fún ímeèlì rẹ, ṣàfihàn tì àríyànjiyàn bá wà, le " -"jẹ́ èrò tàbí síṣe iyèméjì. Ìkan lára àwọn ọmọ ẹgbẹ́ wa yóò dáhùn láìpẹ́ " -"láìjìnnà." - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.title" -msgstr "Ímeèlì" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.twitter-go-to" -msgstr "Lọ sí Tíwítà" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.twitter-subtitle1" -msgstr "A wà níbí láti ṣe ìrànlọ́wọ́ fún àwọn ìbéèrè tó bá wà lórí iṣẹ́ ọnà." - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.twitter-title" -msgstr "Àkáùnti àtìlẹ́yìn fún Tíwítà" - -#: src/app/main/ui/settings/password.cljs -msgid "generic.error" -msgstr "Àsìṣe kan ti ṣẹlẹ̀" - -#: src/app/main/ui/inspect/attributes/blur.cljs -msgid "inspect.attributes.blur" -msgstr "ìkùku ti wà" - -#: src/app/main/ui/inspect/attributes/blur.cljs -msgid "inspect.attributes.blur.value" -msgstr "bó se péye" - -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.hex" -msgstr "dínà mọ́" - -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.hsla" -msgstr "Ti dínà mọ" - -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.rgba" -msgstr "RGBA" - -#: src/app/main/ui/inspect/attributes/fill.cljs -msgid "inspect.attributes.fill" -msgstr "Fílì" - -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.download" -msgstr "Danlóòdù orísun àwòrán" - -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.height" -msgstr "Gíga" - -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.width" -msgstr "Fífẹ" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout" -msgstr "Layout" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.height" -msgstr "Gíga" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.left" -msgstr "Òsì" - -#: src/app/main/ui/inspect/attributes/layout.cljs, src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.radius" -msgstr "Rédíọ́sì" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.rotation" -msgstr "Yíyí" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.top" -msgstr "Òkè" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.width" -msgstr "Fífẹ̀" - -#: src/app/main/ui/inspect/attributes/shadow.cljs -msgid "inspect.attributes.shadow" -msgstr "Ibòòji" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.size" -msgstr "Ìwọ̀n àti ipò" - -#: src/app/main/ui/inspect/attributes/stroke.cljs -msgid "inspect.attributes.stroke" -msgstr "Stroke Sítírókì" - -#, permanent -msgid "inspect.attributes.stroke.alignment.center" -msgstr "Ààrin" - -#, permanent -msgid "inspect.attributes.stroke.alignment.inner" -msgstr "Nínú" - -#, permanent -msgid "inspect.attributes.stroke.alignment.outer" -msgstr "Ìtá" - -msgid "inspect.attributes.stroke.style.dotted" -msgstr "ti sàmì" - -msgid "inspect.attributes.stroke.style.mixed" -msgstr "Àdàlú" - -msgid "inspect.attributes.stroke.style.none" -msgstr "Kò sí" - -msgid "inspect.attributes.stroke.style.solid" -msgstr "Lágbára" - -#: src/app/main/ui/inspect/attributes/stroke.cljs -msgid "inspect.attributes.stroke.width" -msgstr "Fífẹ̀" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography" -msgstr "Taipogíráfì" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-family" -msgstr "Ẹbí Fọ́ǹtì" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-size" -msgstr "Ìwọ̀n Fọ́ǹtì" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-style" -msgstr "Àrà Fọ́ǹtì" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-weight" -msgstr "Ìwúwo Fọ́ǹtì" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.letter-spacing" -msgstr "Ìfàyè sí ààrin Lẹ́tà" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.line-height" -msgstr "Gíga Ìlà" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.text-decoration" -msgstr "Síṣe ọ̀rọ̀ lọ́ṣọ̀ọ́" - -msgid "inspect.attributes.typography.text-decoration.none" -msgstr "Kò sí" - -msgid "inspect.attributes.typography.text-decoration.strikethrough" -msgstr "Strikethrough" - -msgid "inspect.attributes.typography.text-decoration.underline" -msgstr "Fàlà sí" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.text-transform" -msgstr "ọ̀rọ̀ ti yí padà" - -msgid "inspect.attributes.typography.text-transform.lowercase" -msgstr "Lẹ́tà Kékeré" - -msgid "inspect.attributes.typography.text-transform.none" -msgstr "Kò sí" - -msgid "inspect.attributes.typography.text-transform.titlecase" -msgstr "Àkọlé Lẹ́tà" - -msgid "inspect.attributes.typography.text-transform.uppercase" -msgstr "Lẹ́tà ńlá" - -msgid "inspect.empty.help" -msgstr "" -"Tí o bá fẹ́ mọ̀ nípa àpẹẹrẹ alárà bẹ ààrin gbùngbùn àwọn pẹ́ńpọtì wò fún " -"ìràlọ́wọ́" - -msgid "inspect.empty.more-info" -msgstr "Àfikún àlàyé fún ìbẹ̀wò" - -msgid "inspect.empty.select" -msgstr "Yan ìrísí, bọ́ọ̀dù tàbí ẹgbẹ́ láti lọ ṣe ìbẹ̀wò ohun ìní wọn àti kóòdù" - -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.code" -msgstr "Kóòdù" - -msgid "inspect.tabs.code.selected.circle" -msgstr "Àyíká" - -msgid "inspect.tabs.code.selected.component" -msgstr "Ẹ̀yà" - -msgid "inspect.tabs.code.selected.curve" -msgstr "Igun" - -msgid "inspect.tabs.code.selected.frame" -msgstr "Bọ́ọ̀dù" - -msgid "inspect.tabs.code.selected.group" -msgstr "Ẹgbẹ́" - -msgid "inspect.tabs.code.selected.image" -msgstr "Àwòrán" - -msgid "inspect.tabs.code.selected.mask" -msgstr "Ìbòjú" - -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.code.selected.multiple" -msgstr "%s Ti yàn" - -msgid "inspect.tabs.code.selected.path" -msgstr "Ipa-ọ̀nà" - -msgid "inspect.tabs.code.selected.rect" -msgstr "Rectangle" - -msgid "inspect.tabs.code.selected.svg-raw" -msgstr "SVG" - -msgid "inspect.tabs.code.selected.text" -msgstr "Ọ̀rọ̀" - -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.info" -msgstr "Àlàyé" - -#: src/app/main/ui/workspace/header.cljs -msgid "label.shortcuts" -msgstr "Ọ̀nà àbùjá" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.access-tokens" -msgstr "Ṣàyẹ̀wò tókín-nì" - -msgid "labels.active" -msgstr "Ń siṣẹ́" - -msgid "labels.add-custom-font" -msgstr "Ṣàfikún àṣà Fọ́ǹtì" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.admin" -msgstr "Alábòjútó" - -#: src/app/main/ui/workspace/comments.cljs -msgid "labels.all" -msgstr "Gbogbo ẹ̀" - -msgid "labels.and" -msgstr "àti" - -msgid "labels.back" -msgstr "Padá" - -#: src/app/main/ui/static.cljs -msgid "labels.bad-gateway.desc-message" -msgstr "" -"Ó dàbí ẹnipé o ní láti dúró díẹ̀ kí o tún gbìyàjú ; à ń siṣẹ́ díẹ̀ síṣe " -"ìtọ́jú sáfà wa." - -#: src/app/main/ui/static.cljs -msgid "labels.bad-gateway.main-message" -msgstr "Ọ̀nà-àbáwọle búburú" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.cancel" -msgstr "Párẹ́" - -msgid "labels.close" -msgstr "Tì í" - -#: src/app/main/ui/dashboard/comments.cljs -msgid "labels.comments" -msgstr "dásí i" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.community" -msgstr "Agbègbè" - -#: src/app/main/ui/settings/password.cljs -msgid "labels.confirm-password" -msgstr "Jẹ́rìísí" - -msgid "labels.continue" -msgstr "Tẹ̀ síwájú" - -msgid "labels.continue-with" -msgstr "Tẹ̀ síwájú pẹ̀lú" - -msgid "labels.continue-with-penpot" -msgstr "O lè tẹ̀ síwájú pẹ̀lú àkáúnti pẹ́ńpọtì" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.copy-invitation-link" -msgstr "ṣà dàkọ ọ̀nà àsopọ̀" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "labels.create" -msgstr "Ṣẹ̀dá" - -#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs -msgid "labels.create-team" -msgstr "Ṣẹ̀dá ẹgbẹ́ tuntun" - -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.create-team.placeholder" -msgstr "Fi orúkọ ẹgbẹ́ tuntun wọlé" - -msgid "labels.custom-fonts" -msgstr "Kọ́sítọ́mù àwọn fọ́ǹtì" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.dashboard" -msgstr "Dáṣìbọọ̀dù" - -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.delete" -msgstr "Paárẹ́" - -#: src/app/main/ui/comments.cljs -msgid "labels.delete-comment" -msgstr "Pa kọ́mẹ́ǹtì rẹ́" - -#: src/app/main/ui/comments.cljs -msgid "labels.delete-comment-thread" -msgstr "Pa gbogbo kọ́mẹ́ǹtì rẹ́" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.delete-invitation" -msgstr "Pa ìfìwépè rẹ́" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.delete-multi-files" -msgstr "Pa gbogbo %s fáìlì rẹ́" - -msgid "labels.discard" -msgstr "Yọ́ kúrò" - -#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.drafts" -msgstr "Kọ ọ́ sílẹ̀" - -#: src/app/main/ui/comments.cljs -msgid "labels.edit" -msgstr "sàtúnkà" - -msgid "labels.edit-file" -msgstr "sàtúnkà fáìlì" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.editor" -msgstr "Olóòtú" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.expired-invitation" -msgstr "Kọjá àkókò" - -msgid "labels.export" -msgstr "Fi ránṣẹ́" - -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.feedback-disabled" -msgstr "Èsì kò siṣẹ́" - -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.feedback-sent" -msgstr "Èsì ti lọ" - -msgid "labels.font-family" -msgstr "Ẹbí fọ́ǹtì" - -msgid "labels.font-providers" -msgstr "Àwọn Olùpèṣè fọ́ǹtì" - -msgid "labels.font-variants" -msgstr "Àrà" - -msgid "labels.fonts" -msgstr "Fọ̀ǹtì" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.github-repo" -msgstr "Báǹkì gítì-ọbù" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.give-feedback" -msgstr "Fèsì padà" - -msgid "labels.go-back" -msgstr "Padà sẹ́yìn" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.help-center" -msgstr "Ibi ìranilọ́wọ́" - -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.hide-resolved-comments" -msgstr "Fi àwọn ọ̀rọ̀ tí a ti yanjú pamọ́" - -msgid "labels.inactive" -msgstr "kò ja fáfá" - -msgid "labels.installed-fonts" -msgstr "Fi àwọn fọ́ǹtì sí orí ẹ̀rọ" - -#: src/app/main/ui/static.cljs -msgid "labels.internal-error.desc-message" -msgstr "" -"Nǹkan bíburú ti ṣẹlè. Jọ̀wọ́ ṣe àtúnṣe iṣẹ́ náà àti pé tí wàhálà bá sì " -"tẹ̀ síwájú, ké sí olùbásọ̀rọ̀." - -#: src/app/main/ui/static.cljs -msgid "labels.internal-error.main-message" -msgstr "Àsìṣe ti abẹ́nú" - -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.invitations" -msgstr "Ìfiwépè" - -#: src/app/main/ui/settings/options.cljs -msgid "labels.language" -msgstr "Èdè" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.libraries-and-templates" -msgstr "Àwọn yàrá ìkàwé & Tẹ́ńpílétì" - -msgid "labels.log-or-sign" -msgstr "ṣí kí o wọle tàbí kí o ṣàmì wọlé" - -#: src/app/main/ui/settings.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.logout" -msgstr "Padé kí ojáde" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.member" -msgstr "Ẹgbẹ" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.members" -msgstr "Àwọn ọmọ Ẹgbẹ́" - -#: src/app/main/ui/settings/password.cljs -msgid "labels.new-password" -msgstr "Ọ̀rọ̀ Ìgbaniwọlé tuntun" - -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs -msgid "labels.no-comments-available" -msgstr "A ti gbé gbogbo yín dè! Àwọn ọ̀rọ̀ ìfitónilétí tuntun yí ó hàn níbí." - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.no-invitations" -msgstr "kò si àwọn ìfìwépè kankan nílẹ̀." - -#: src/app/main/ui/dashboard/team.cljs -#, markdown -msgid "labels.no-invitations-hint" -msgstr "Tẹ̀ ẹ́ **Pe àwọn ènìyàn** tẹ bọ́tìnnì láti pe àwọn ènìyàn sínú ẹgbẹ́." - -#: src/app/main/ui/static.cljs -msgid "labels.not-found.desc-message" -msgstr "Ojú ìwé yìí le má sìí tàbí ò kò ni ìgbaniláàyè láti wọlé sí bẹ̀ ." - -#: src/app/main/ui/static.cljs -msgid "labels.not-found.main-message" -msgstr "Óóho!" - -#: src/app/main/ui/settings/password.cljs -msgid "labels.old-password" -msgstr "Ọ̀rọ̀ ìgbaniwọlé àtijọ́" - -#: src/app/main/ui/workspace/comments.cljs -msgid "labels.only-yours" -msgstr "Tìrẹ nìkan" - -msgid "labels.or" -msgstr "tàbí" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.owner" -msgstr "Oníǹkan" - -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.password" -msgstr "Ọ̀rọ̀ ìgbaniwọlé" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.pending-invitation" -msgstr "Ńńdúró" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.profile" -msgstr "Pírófáìlì" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.projects" -msgstr "Àwọn iṣẹ́ àgbéṣe" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.release-notes" -msgstr "Fi àkọsílẹ̀ rẹ sílẹ̀" - -#: src/app/main/ui/workspace.cljs -msgid "labels.reload-file" -msgstr "Tún gbé fáìlì sí i" - -#: src/app/main/ui/workspace/libraries.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.remove" -msgstr "Yọ ọ́ kúrò" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.remove-member" -msgstr "Yọ ọmọ ẹgbẹ́ kúrò" - -#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.rename" -msgstr "Fún un lórúkọ mìíràn" - -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.rename-team" -msgstr "Fún ẹgbẹ́ lórúkọ mìíràn" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.resend-invitation" -msgstr "Tún fì ìwé ìpè ránńṣẹ́" - -#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs -msgid "labels.retry" -msgstr "Tún gbìyànjú" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.role" -msgstr "Ojúṣe" - -msgid "labels.save" -msgstr "Fi pamọ́" - -msgid "labels.search-font" -msgstr "Ṣàwárí fọ́ǹtì" - -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.send" -msgstr "Fi ránńṣẹ́" - -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.sending" -msgstr "Fífi-ránńṣẹ…" - -#: src/app/main/ui/static.cljs -msgid "labels.service-unavailable.desc-message" -msgstr "A wà níbi ètò ìpèsè ìtọ́jú àwọn sísítẹ́mù wa." - -#: src/app/main/ui/static.cljs -msgid "labels.service-unavailable.main-message" -msgstr "Sáfísì kòsí" - -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.settings" -msgstr "Àwọn ètò" - -msgid "labels.share-prototype" -msgstr "Pín àwọn ohun tí a ti kọ tẹ́lẹ̀" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.shared-libraries" -msgstr "Yàrá ìkáwe" - -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.show-all-comments" -msgstr "Fi gbogbo kọ́mẹ́ǹtì hàn" - -msgid "labels.show-comments-list" -msgstr "Fi àkójọ àwọn kọ́mẹ́ǹtì hàn" - -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.show-your-comments" -msgstr "Fi àwọn kọ́mẹ́ǹtì tìrẹ nìkan hàn" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.status" -msgstr "Ipò" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.tutorials" -msgstr "Ìbáṣepọ̀" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.unpublish-multi-files" -msgstr "%s àwọn fáìlì tí a kò tí kọ jáde" - -#: src/app/main/ui/settings/profile.cljs -msgid "labels.update" -msgstr "mú dójú ìwọ̀n" - -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.update-team" -msgstr "Mẹ́gbẹ́ dójú ìwọ̀n" - -msgid "labels.upload" -msgstr "Ọpulóòdù" - -msgid "labels.upload-custom-fonts" -msgstr "Ọpulóòdù kọ́sítẹ́mù fọ́ǹtì" - -msgid "labels.uploading" -msgstr "Ń ọpulóòdù…" - -msgid "labels.view-only" -msgstr "Wò ó nìkan" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.viewer" -msgstr "Olùwo" - -msgid "labels.webhooks" -msgstr "àwọn ìwé ìkọ́ wẹ́bù" - -#: src/app/main/ui/comments.cljs -msgid "labels.write-new-comment" -msgstr "Write new comment Kọ kọ́mẹ́ǹtì tuntun" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.you" -msgstr "(ìwọ)" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.your-account" -msgstr "Àkáùntì rẹ" - -#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs -msgid "media.loading" -msgstr "Ìkójọpọ̀ àwòrán…" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Yàrá ìkàwé rẹ ti dófìfo. Lọ́gán tí o bá ti ṣàfikún gẹ́gẹ́ bí yàrá ìkàwé " -"pípín, dúkìá tí o ṣẹ̀dá á wà fún lílò àwọn fáìlì rẹ tó kù. Are you sure " -"you tí o fẹ́ kọ jáde?" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.accept" -msgstr "Ṣàfikún gẹ́gẹ́ bí yàrá ìkàwé pípín" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.hint" -msgstr "" -"Lẹ́ẹ̀kan-nà tí o bá ti ṣàfikún gẹ́gẹ́ bí yàrá ìkàwé pípín, àwọn dúkìá inú " -"fáìlì yàrá á di wíwà fún lílò àwọn fáìlì rẹ tó kù." - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.message" -msgstr "Ṣàfikún “%s” gẹ́gẹ́ bí yàrá ìkàwé pípí" - -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.big-nudge" -msgstr "Big nudge Nọ́ọ̀jì ńlá" - -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.confirm-email" -msgstr "Ṣàyẹ̀wò ímeèlì tuntun" - -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.info" -msgstr "" -"A fi ímeèlì kan ránń ṣẹ́ sí inú ímeèlì tí ò ń lò lọ́wọ́lọ́wọ́“%s” láti ṣe " -"àyẹ̀wò ìdánimọ̀ rẹ." - -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.new-email" -msgstr "Ímeèlì tuntun" - -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.submit" -msgstr "Pàrọ̀ ímeèlìl" - -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.title" -msgstr "Pàrọ̀ ímeèlì rẹ" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.copy-token" -msgstr "Ṣẹ̀dà tókìn" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.expiration-date.label" -msgstr "Ọjọ́ ìparí" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.label" -msgstr "Orúkọ" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.placeholder" -msgstr "Orúkọ yí ó ràn wá lọ́wọ́ láti mọ ohun tí tókìn wà fún" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.submit-label" -msgstr "Ṣẹ̀dà tókìn" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.title" -msgstr "Pilẹ̀ṣẹ̀ wí wọlé tókìń" - -msgid "modals.create-webhook.submit-label" -msgstr "Ṣẹ̀dá ìkọ́- wẹ́bù" - -msgid "modals.create-webhook.title" -msgstr "Ṣẹ̀dá ìkọ́-wẹ́bù" - -msgid "modals.create-webhook.url.label" -msgstr "Péloòdù URL" - -msgid "modals.create-webhook.url.placeholder" -msgstr "https://àpẹrẹ.com/postreceive ìgbà àtẹ̀yinwá" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.accept" -msgstr "Pa tókìn rẹ́" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.message" -msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa tókìn yi rẹ́?" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.title" -msgstr "Pa tókìn rẹ́" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.cancel" -msgstr "Fagilé e kí o sì fi àkáùntì mi pamọ́" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.confirm" -msgstr "Bẹ́ẹ̀ni, pa àkáùntì mi rẹ́" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.info" -msgstr "" -"Nípa yíyọ àkáùntì rẹ kúrò o ’ pàdánù gbogbo àwọn iṣẹ́ àgbéṣe rẹ àti àwọn tí " -"ó wà lápamọ́." - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.title" -msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa àkáùntì rẹ rẹ́ ?" - -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.accept" -msgstr "Pa ìtàkurọ̀sọ rẹ́" - -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.message" -msgstr "" -"Ṣé ódá ọ lójú pé o fẹ́ pa ìtàkurọ̀sọ yìí rẹ́? All comments in this Gbogbo " -"àsọyé tó wà níbí tó tẹ̀lé ra wọn ni á di píparẹ́." - -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.title" -msgstr "Pa ìtàkurọ̀sọ rẹ" - -msgid "modals.delete-component-annotation.message" -msgstr "Ṣe ó dá ọ lójú pé o fẹ́ pa àkọsílẹ̀ yìí rẹ́?" - -msgid "modals.delete-component-annotation.title" -msgstr "Pa àkọsílẹ̀ rẹ́" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.accept" -msgstr "Pa fáìlì rẹ́" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.message" -msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa fáìlì yìí rẹ́?" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.title" -msgstr "Pa fáìlì rẹ́" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-multi-confirm.accept" -msgstr "Pa àwọn fáìlì rẹ́" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-multi-confirm.message" -msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa %s àwọn fáìlì rẹ́ ?" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-multi-confirm.title" -msgstr "Pa fáìlì rẹ́ %s" - -msgid "modals.delete-font-variant.message" -msgstr "" -"Ṣé ó dá ọ lójú pé o fẹ́ pa fọ́ǹtì alárà yìí rẹ́ ? Kò ní gbé e tí a bá lò " -"ó nínú fáìlì." - -msgid "modals.delete-font.message" -msgstr "" -"Ṣé ó dá ọ lójú pé o fẹ́ pa fẹ́ǹtì yí rẹ́? Kò ní le gbé e tí a bá lò ó nínú " -"Fáìlì." - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "modals.delete-page.body" -msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa ojú ìwé yìí rẹ́?" - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "modals.delete-page.title" -msgstr "Pa ojú ìwé rẹ́" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.accept" -msgstr "Pa iṣẹ́ àgbéṣe rẹ́" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.message" -msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa iṣẹ́ àgbéṣe yìí rẹ́?" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.title" -msgstr "Pa iṣẹ́ àgbéṣe rẹ́" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.accept" -msgstr "Pa ẹgbẹ́ rẹ́" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.message" -msgstr "" -"Ṣé ó dá ọ lójú pé o fẹ́ pa ẹgbẹ́ yìí rẹ́? Ggogbo iṣẹ́ àgbéṣe àti fáìlì tí ó " -"bá ní nǹkan ṣe pẹ̀lú ẹgbẹ́ ni a ó parẹ́ pátápátá." - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.title" -msgstr "Yọ ẹgbẹ́ kúrò" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.accept" -msgstr "Yọ ọmọ ẹgbẹ́ kúrò" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.message" -msgstr "Ṣé ó dá ọ lójú pé o fẹ́ yọ ọmọ ẹgbẹ́ yìí kúrò nínú ẹgbẹ́?" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.title" -msgstr "Yọ ọmọ ẹgbẹ́ kúrò" - -msgid "modals.delete-webhook.accept" -msgstr "Pa ìkọ́-wẹ́bù rẹ́" - -msgid "modals.delete-webhook.message" -msgstr "Ṣe ó dá ọ lójú pé o fẹ́ pa ìkọ́-wẹ́bù yìí rẹ́?" - -msgid "modals.delete-webhook.title" -msgstr "Pa ìkọ́- wẹ́bù rẹ́" - -msgid "modals.edit-webhook.submit-label" -msgstr "Ṣe àtúnṣe ìkọ́- wẹ́bù" - -msgid "modals.edit-webhook.title" -msgstr "Ṣe àtúnṣe ìkọ́-wẹ́bù" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.invite-member-confirm.accept" -msgstr "Fi ìfìwépè ránńṣẹ́" - -msgid "modals.invite-member.emails" -msgstr "Ímeèlì, kí kọmá yà á sọ́tọ̀" - -msgid "modals.invite-member.repeated-invitation" -msgstr "" -"Díẹ̀ nínú àwọn ímeèlì wá láti ọ̀dọ̀ àwọn tó jẹ́ ọmọ ẹgbẹ́ ní ìsinsìnyí. Ìwé " -"ìfipé wọn a kò nífi ránńṣẹ́." - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.invite-team-member.title" -msgstr "Pe àwọn ọmọ ẹgbẹ́ sínú ẹgbẹ́" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-close-confirm.hint" -msgstr "" -"Gẹ́gẹ́ bí o ṣe jẹ́ ìwọ nìkan ni ọmọ ẹgbẹ́ nínú ẹgbẹ́ yìí, a ó yọ ẹgbẹ́ " -"kúrò pẹ̀lú iṣẹ́ àgbéṣe rẹ̀ àti àwọn fáìlì." - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-close-confirm.message" -msgstr "Ṣé ó dá ọ lójú pé o fẹ́ kúrò nínú %s ẹgbẹ́?" - -msgid "modals.leave-and-reassign.forbidden" -msgstr "" -"O kò lè kúrò nínú ẹgbẹ́ tí kò bá sí ọmọ ẹgbẹ́ mìíràn tó ní ìgbéga sí oní " -"ǹǹkan. O lè fẹ́ pa ẹgbẹ́ rẹ́." - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.hint1" -msgstr "" -"Ìwọ ni ẹni tí ó ni ẹgbẹ́ yìí. Please select another member to promote to " -"Jọ̀wọ́ yan ọmọ ẹgbẹ́ mìíràn tí yíò ní ìgbéga ẹni tí ó ni nǹkan kí o tó " -"kúrò." - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.promote-and-leave" -msgstr "Ṣe ìgbéga kí o kúrò" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.select-member-to-promote" -msgstr "Yan ọmọ ẹgbẹ́ kan tí o ó gbéga" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.title" -msgstr "Kí o tó kúrò" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-confirm.accept" -msgstr "Fi ẹgbẹ́ sílẹ̀" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-confirm.message" -msgstr "Ṣé ó dá ọ lójú pé o fẹ́ fi ẹgbẹ́ yìí sílẹ̀?" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-confirm.title" -msgstr "Ń fi ẹgbẹ́ sílẹ̀" - -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.nudge-title" -msgstr "Fi kún iye tó jẹ́" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.accept" -msgstr "Gbé ẹni tó ni nǹkan" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.hint" -msgstr "" -"Tí o bá gbé ẹni tí ó ni nǹkan, o ó yìí ojúṣe rẹ pada sí Alábòjútó, losing " -" àwọn ìgbà láàyè díẹ̀ á wà fún ẹgbẹ́ yìí. " - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.message" -msgstr "" -"Ìwọ ni ẹni tí ó ni ẹgbẹ́ yìí lọ́wọ́lọ́wọ́. Are you sure you want to make Ṣé " -"ó dá ọ lójú pé o fẹ́ jẹ́ %s oní nǹkan tuntun fún ẹgbẹ́?" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.title" -msgstr "Ẹni tó ni ẹgbẹ́ tuntun" - -msgid "modals.publish-empty-library.accept" -msgstr "Kọ ọ́ jáde" - -msgid "modals.publish-empty-library.message" -msgstr "Yàrá ìkàwé rẹ ṣófìfo. Ṣé ó dá ọ lójú pé o fẹ́ kọ ọ́ jáde?" - -msgid "modals.publish-empty-library.title" -msgstr "Gbé yàrá ìkàwé tó ṣófìfo jáde" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.accept" -msgstr "Yọ ọ́ kúrò gẹ́gẹ́ bí i yàrá ìkàwé pípín" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.hint" -msgstr "" -"Lọ́gán tí o bá ti yọ ọ́ kúrò gẹ́gẹ́ bí i Fáìlì yàrá ìkàwé pípín , Fáìlì " -"yàrà ìkàwé ti fáìlì yìí á dúró tí á wà fún lílò àwọn fáìlì rẹ tó kù." - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.message" -msgstr "Yọ ọ́ kúrò“%s” gẹ́gẹ́ bí yàrá ìkàwé pípín" - -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.small-nudge" -msgstr "Fọwọ́ làn-ań díẹ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component-in-bulk.hint" -msgstr "" -"O ṣetán láti mú àwọn ẹ̀yà irin iṣẹ́ dé ojú ìwọ̀n ní yàrá ìkàwé pípín. Èyí " -"le fa wàhálà fún àwọn fáìlì mìíràn tí ó ń lò ó." - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component-in-bulk.message" -msgstr "Mú àwọn ẹ̀yà irin iṣẹ́ dójú ìwọ̀n nínú iyàram ìkàwé pípín" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.accept" -msgstr "Mú dójú ìwọ̀n" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.cancel" -msgstr "Fagilé e" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.hint" -msgstr "" -"O ṣetán látí mú àwọn ẹ̀yà irin iṣẹ́ yàrá ìkàwé dójú ìwọ̀n . This may affect " -"Èyí lè fa wàhálà fún àwọn fáìlì míràn tí ó ń lò ó." - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.message" -msgstr "Mú ẹ̀yà iyàrá ìkàwé pípín kan dójú ìwọ̀n" - -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "Ẹ̀yà tuntun ti wà, jọ̀wọ́ tún sọ ọ́ jí" - -#: src/app/main/ui/dashboard/team.cljs -msgid "notifications.invitation-email-sent" -msgstr "Ìfipè tí a fi ránńṣẹ́ ti lọ dáadáa" - -#: src/app/main/ui/dashboard/team.cljs -msgid "notifications.invitation-link-copied" -msgstr "ti ṣe àdàkọ ìfipè ọ̀nà ìtọ́ka sí" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "notifications.profile-deletion-not-allowed" -msgstr "O kò le è yọ pírófáìlì rẹ kúro. Ṣe àtún yàn àwọn ẹgbẹ́ kí o tó tẹ̀ síwájú." - -#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs -msgid "notifications.profile-saved" -msgstr "A ti fi pírófáìlì pamọ́ dáadáa!" - -#: src/app/main/ui/settings/change_email.cljs -msgid "notifications.validation-email-sent" -msgstr "Verification email sent to %s. Check your email!" - -msgid "onboarding-v2.before-start.desc1" -msgstr "" -"O ní láti mọ̀ pé oríṣiríṣi ohu ohun èlò ló wà láti ràn ọ́ lọ́wọ́ láti rí " -"gbà bẹ̀rẹ̀ pẹ̀lú Pẹ́ńpọtì, gẹ́gẹ́ bí ohun èlò ìtọ́nisọ́nà àti yútuùbù wa " -"fún ìlànà ìbáni sọ̀rọ̀." - -msgid "onboarding-v2.before-start.desc2" -msgstr "" -"Ẹ̀kún-uń rẹ́rẹ́ àlàyé nípa bí a ó ṣe lo pẹ́ńpọtì . Láti bi àfọwọ́kọ lọ sí " -"síṣe ètò tàbí pípiń àwọn àrà orísi ." - -msgid "onboarding-v2.before-start.desc2.title" -msgstr "Ìtọ́ni sọ́nà Onílò" - -msgid "onboarding-v2.before-start.desc3" -msgstr "O lè wo ìbáṣepọ̀ wa àti ìbáṣepọ̀ ti èyí tí agbègbè wa ṣe." - -msgid "onboarding-v2.before-start.desc3.title" -msgstr "Fídíò àwọn ìbáṣepọ̀" - -msgid "onboarding-v2.before-start.title" -msgstr "Kí o tó bẹ̀rẹ̀" - -msgid "onboarding-v2.newsletter.desc" -msgstr "" -"Ṣe alábàápín ìwé ìròyìn ti pẹ́ńpọtì kí o lè mọ ohun tí ó ń lọ ọjà " -"development progress and new Ìdàgbàsókè, Ìlọsíwájú,àti àwọn ìròyìn ." - -msgid "onboarding-v2.newsletter.news" -msgstr "" -"Fí ìròyìn ránńṣẹ́ sí mi nípa Pẹ́ńpọtì (àwọn bulọ́ọ̀gì,àwọn fídiò " -"ìbáṣepọ̀, àwọn sísàn wọlé...)." - -msgid "onboarding-v2.newsletter.privacy1" -msgstr "Ìfi pamọ́ jẹ wá lógún, ní bí o le kà nípa wa " - -msgid "onboarding-v2.newsletter.privacy2" -msgstr "" -"Àwọn ímeèlì tó ṣe kókó nìknn la ó fi ránńṣẹ́ sí ọ. o lè yọwọ́ kúrò ní " -"ìgbàkììgbàní ìlànà ti ìyọwọ́ kúrò nínú èyíkéyìí ìwé ìròyìn wa." - -msgid "onboarding-v2.newsletter.updates" -msgstr "" -"Fi ìmú dójú ìwọ̀n ọjà ránńṣẹ́ sí mi (àwọn ẹ̀yà yuntun, tú sílẹ̀, ṣà " -"túnṣe...)." - -msgid "onboarding-v2.welcome.desc1" -msgstr "" -"Pẹ́ńpọtì ni orísun ìṣílẹ̀kùn àti pe Kálẹidòsìló ṣe é àti àwọn agbègbè, Ní " -"bi ọ̀pọ̀lọpọ̀ àwọn ènìyàn ti ran ara wọn lọ́wọ́ tẹ́lẹ̀ . Gbgbo wọn ló lè " -"ṣe àjùmọ̀ṣenípa:" - -msgid "onboarding-v2.welcome.desc2" -msgstr "" -"Ìkẹ́kọ̀ọ́ ìta gbangba, pín-in kí ẹ sì jí ròrò nípa Pẹ́ńpọtì, ibi tó wà " -"lọ́wọ́lọ́wọ́ ọ̀jọ́ iwájú pẹ̀lú gbogbo agbègbè àti ìmójútó ẹgbẹ́ pẹ́ńpọtì . " -" ." - -msgid "onboarding-v2.welcome.desc3" -msgstr "" -"Ibi tí a ó ti ri bí a ó ti ṣe àjùmọ̀ṣepọ̀ pẹ̀lú àwọn ìtumọ̀, àwọn ìbéèrè " -"ẹ̀yà ara ẹ̀rọ, ìmójútó síṣe ojúṣe, ìṣọdẹ kòkòrò…" - -msgid "onboarding-v2.welcome.desc3.title" -msgstr "Sísojúṣe ìtọ́sẹ́nà" - -msgid "onboarding-v2.welcome.title" -msgstr "Káàbọ̀ sí pẹ́ńpọtì!" - -msgid "onboarding.choice.team-up.create-team-desc" -msgstr "" -"Lẹ́yìn tí o bá ti fún ẹgbẹ́ rẹ lórúkọ, Ó le pe àwọn ènìyàn láti darapọ̀ mọ́ " -"ẹgbẹ́." - -msgid "onboarding.choice.team-up.create-team-placeholder" -msgstr "Tẹ orúkọ ẹgbẹ́" - -msgid "onboarding.choice.team-up.invite-members" -msgstr "Fìwépè ọmọ àwọn ẹgbẹ́" - -msgid "onboarding.choice.team-up.invite-members-info" -msgstr "" -"Rántí láti fi gbogbo wọn sí i. Àwọn Olùdásílẹ̀, àwọn aṣàpẹẹrẹ, alákóso... " -"onírúúrú dà wọ́n pọ̀ :)" - -msgid "onboarding.choice.team-up.roles" -msgstr "Pè wọ́n pẹ̀lú ojúṣe wọn:" - -msgid "onboarding.newsletter.accept" -msgstr "Bẹ́ẹ̀ni, ṣe alábàpín" - -msgid "onboarding.newsletter.acceptance-message" -msgstr "" -"A ti fi ìbéèrè fún síṣe alá-bápín rẹ ránńṣẹ́, a ó fi ímeèlì ránńṣẹ́ sí ọ " -"látijẹ́rìí sí." - -msgid "onboarding.newsletter.policy" -msgstr "Ètò ìmúlò tí a fi pamọ́." - -msgid "onboarding.newsletter.title" -msgstr "Fẹ́ gba àwọn ìròyìn pẹ́ńpọti?" - -msgid "onboarding.team-modal.create-team" -msgstr "Ṣẹ̀dá ẹgbẹ́ kan" - -msgid "onboarding.team-modal.create-team-desc" -msgstr "" -"A team allows you to collaborate with other Penpot users working in the " -"Ẹgbẹ́ kan yí ó gbà ọ́ láyè láti lè siṣẹ́pọ̀ pẹ̀lú àwọn onílò pẹ́ńpọti tí ó " -"siṣẹ́ nínú àwọn fáìlì àti àwọn iṣẹ́ àgbéṣe kan náà ." - -msgid "onboarding.team-modal.create-team-feature-1" -msgstr "Àwọn fáìlì àti àwọn iṣẹ́ àgbéṣe tí kò lópin" - -msgid "onboarding.team-modal.create-team-feature-2" -msgstr "Multiplayer edition" - -msgid "onboarding.team-modal.create-team-feature-3" -msgstr "àwọn ipa ìṣàkóṣo" - -msgid "onboarding.team-modal.create-team-feature-4" -msgstr "Àwọn ọmọ ẹgbẹ́ tí kò lópin" - -msgid "onboarding.team-modal.create-team-feature-5" -msgstr "100% Ọ̀fẹ́!" - -msgid "onboarding.templates.subtitle" -msgstr "Àwọn àwòṣe díẹ̀ nìyí níbí." - -msgid "onboarding.templates.title" -msgstr "Bẹ̀rẹ̀ sí ṣe ẹ̀yà alárà" - -msgid "onboarding.welcome.alt" -msgstr "Pẹ́ńpọtì" - -#: src/app/main/ui/auth/recovery.cljs -msgid "profile.recovery.go-to-login" -msgstr "Lọ láti wọlé" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "Èwo ni ohun èlò irin iṣẹ́ tí o ní ìmọ̀ kíkún nínú pẹ̀lú rẹ̀?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "Mọ́kànlá-Ọgbọ̀n" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "Méjì – mẹ́wàá" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "Mọ́kànlélọ́gbọ̀n-Àádọ́ta" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "O ´ pọ̀jù" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Àdòbí XD" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Káńfà" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "" -"Báwo ni ó ti le ṣe àpèjúwe bó ṣe dára tó lórí ìrírí rẹ lórí iṣẹ́ tí o ń ṣe " -"lọ́wọ́..." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "Olùyà nǹkan" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "Olùdásílẹ̀" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "Ṣàwárí sí i nípa pẹ́ńpọtì" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Fígímà" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Olùdásílẹ̀/VP" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "Oníṣẹ́ ni mí" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "Gba kóòdù láti inú iṣẹ́ àgbéṣe mi " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "... wíwò ètò ọnà , ìrírí àwọn ohun ìní, àwọn ètò ọnà, abbl." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "Ìkógun wọ̀lú" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "Fi èsì sílẹ̀ fún iṣẹ́ àgbéṣe ẹgbẹ́ mi" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "Ẹjẹ́ 'ká bẹ̀rẹ̀ !" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "Ohun títà tàbí iṣẹ́ àgbéṣe Olùṣàkóso" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Títajà" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "Ju àádọ́ta lọ" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.never-used-a-tool" -msgstr "N kò tí lo irin iṣẹ́ eto ọnà tẹ́lẹ̀ rí" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "Èyí tó kàn" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "Kòsí" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "Òmíìràn(ní pàtó)" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "Mò ń siṣẹ́ àgbéṣẹ ti ara mi ni" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "Tàtẹ̀yìn wá" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "Báwo lo ṣe ń gbèrò lórí bí o ṣe lo pẹ́ńpọtì?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "Ṣe àṣàyàn" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Yàwòrán" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.some" -msgstr "Díẹ̀" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "Bẹ̀rẹ̀" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "Bẹ̀rẹ̀ láti lórí iṣẹ́ àgbéṣe mi" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "Akẹ́kọ̀ọ́ tàbí olùkọ̀ọ́" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "kín ni ìwọ̀n ẹgbẹ́ rẹ ?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "Ṣàyẹ̀wọ̀ pẹ́ńpọtì láti rí pé ó bẹ́gbẹ́ mu " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "Gbìyànjú láti mọ̀ kí o tó bẹ̀rẹ̀ sí lo pẹ́ńpọtì ní àyíká" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "... wáyà-fèrèsé, ìrìàjò àwọn onílò & sísàn, àwọn igi ìyíkiri, abbl." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "Iṣẹ́ lórí èròǹgbà àti àwọn èrò" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"Èsì rẹ yó ràn wá lọ́wọ́ láti jẹ́ kó yé wa lórí kín ni ìhùwàsí rẹ àti àwọn " -"ohun tí o fẹ́ràn jù èyí yó jẹ́ kí á má ṣàmúlò pẹ́ńpọtì gẹ́gẹ́ bí èyí tí ó " -"wúlò àti ohun èlò fun ìgbáládùn." - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Yọ kúrò" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "settings.multiple" -msgstr "Dàárú" - -# SECTIONS -msgid "shortcut-section.basics" -msgstr "Ipìlẹ̀" - -msgid "shortcut-section.viewer" -msgstr "Ólùwò" - -msgid "shortcut-section.workspace" -msgstr "Àaye ìṣẹ́" - -# SUBSECTIONS -msgid "shortcut-subsection.alignment" -msgstr "Titete" - -msgid "shortcut-subsection.edit" -msgstr "Sàtunkọ" - -msgid "shortcut-subsection.general-viewer" -msgstr "àbùdá" - -msgid "shortcut-subsection.main-menu" -msgstr "Akojọ ólórì aṣyn" - -msgid "shortcut-subsection.modify-layers" -msgstr "Yípàdá fẹ́lẹ́fẹ́lẹ́" - -msgid "shortcut-subsection.navigation-dashboard" -msgstr "Lìlọ́ kìrì" - -msgid "shortcut-subsection.navigation-viewer" -msgstr "Lìlọ́ kìrì" - -msgid "shortcut-subsection.navigation-workspace" -msgstr "Lìlọ́ kìrì" - -msgid "shortcut-subsection.panels" -msgstr "Àwọ̀n pánẹ̀lí" - -msgid "shortcut-subsection.path-editor" -msgstr "Àwọ́n ọna" - -msgid "shortcut-subsection.shape" -msgstr "Àwọ́n apẹ́rẹ́" - -msgid "shortcut-subsection.text-editor" -msgstr "Àwọ́n ọ́rọ̀" - -msgid "shortcut-subsection.tools" -msgstr "Àwọ́n irínṣẹ̀" - -msgid "shortcut-subsection.zoom-viewer" -msgstr "Sun-un" - -msgid "shortcut-subsection.zoom-workspace" -msgstr "Sun-un" - -msgid "shortcuts.add-comment" -msgstr "Ọ́rọ̀íwòye" - -msgid "shortcuts.add-node" -msgstr "Fí ípàdé kùn" - -msgid "shortcuts.align-bottom" -msgstr "Sópọ sí ísàle" - -msgid "shortcuts.align-center" -msgstr "Parapọ àárin" - -msgid "shortcuts.align-hcenter" -msgstr "Páràpọ àárin naa" - -msgid "shortcuts.align-justify" -msgstr "Ṣe dèédé si ìdálárè" - -msgid "shortcuts.align-left" -msgstr "Sosi ósì" - -msgid "shortcuts.align-right" -msgstr "Sosi ọtún" - -msgid "shortcuts.align-top" -msgstr "Sopo si òké" - -msgid "shortcuts.align-vcenter" -msgstr "Tẹle àárin ni inàró" - -msgid "shortcuts.artboard-selection" -msgstr "Ṣẹ̀dá ọ̀kọ̀ lati yìyán" - -msgid "shortcuts.bold" -msgstr "Yipàdà to han" - -msgid "shortcuts.bool-difference" -msgstr "Iyàtò Boolean" - -msgid "shortcuts.bool-exclude" -msgstr "Boolean tà yọ̀kúro" - -msgid "shortcuts.bool-intersection" -msgstr "ikòritá Boolean" - -msgid "shortcuts.bool-union" -msgstr "Asépọ̀ Boolean" - -msgid "shortcuts.bring-back" -msgstr "Fírànṣẹ́ si ẹ́hin" - -msgid "shortcuts.bring-backward" -msgstr "Ran pàdà sí ehin" - -msgid "shortcuts.bring-forward" -msgstr "Mù siwájù" - -msgid "shortcuts.bring-front" -msgstr "Mù si wájù" - -msgid "shortcuts.clear-undo" -msgstr "Pa yipàdá rẹ" - -msgid "shortcuts.copy" -msgstr "Dàákọ" - -msgid "shortcuts.create-component" -msgstr "Ṣẹ̀dá pàátì" - -msgid "shortcuts.create-new-project" -msgstr "Ṣẹ̀dá títún" - -msgid "shortcuts.cut" -msgstr "Ge" - -msgid "shortcuts.decrease-zoom" -msgstr "Sun-un jàdé" - -msgid "shortcuts.delete" -msgstr "Pàrẹ" - -msgid "shortcuts.delete-node" -msgstr "Pa ipàdé" - -msgid "shortcuts.detach-component" -msgstr "Yà paati" - -msgid "shortcuts.draw-curve" -msgstr "Yìyí" - -msgid "shortcuts.draw-ellipse" -msgstr "Ẹ́lipsì" - -msgid "shortcuts.draw-nodes" -msgstr "Fà ọnà" - -msgid "shortcuts.draw-path" -msgstr "Ọnà" - -msgid "shortcuts.draw-rect" -msgstr "Ònìgún mèrìn" - -msgid "shortcuts.draw-text" -msgstr "Ọ́rọ̀" - -msgid "shortcuts.duplicate" -msgstr "Ṣe pidánpidán" - -msgid "shortcuts.escape" -msgstr "Fàgílèè" - -msgid "shortcuts.export-shapes" -msgstr "Ókèéré apẹ̀rẹ̀" - -msgid "shortcuts.fit-all" -msgstr "Sun-un látì ba gbògbò rẹ̀ mú" - -msgid "shortcuts.flip-horizontal" -msgstr "Yipadà ní pẹ̀tẹ̀lẹ̀" - -msgid "shortcuts.flip-vertical" -msgstr "Yipadà ní ínàró" - -msgid "shortcuts.font-size-dec" -msgstr "Dìn íwọ̀n fonti kù" - -msgid "shortcuts.font-size-inc" -msgstr "Alekun iwọn fonti" - -msgid "shortcuts.go-to-drafts" -msgstr "Lọ sí iyáwòran" - -msgid "shortcuts.go-to-libs" -msgstr "Lọ si awọn ílé-Ikàwé tí a pín" - -msgid "shortcuts.go-to-search" -msgstr "Wàá" - -msgid "shortcuts.group" -msgstr "Ẹgbẹ" - -msgid "shortcuts.h-distribute" -msgstr "Pinpín kàákírì pètèlè" - -msgid "shortcuts.hide-ui" -msgstr "Ífìhan / Tọju UI" - -msgid "shortcuts.increase-zoom" -msgstr "Sùn-un sínú" - -msgid "shortcuts.insert-image" -msgstr "Fí àwóran sii" - -msgid "shortcuts.italic" -msgstr "Yipàdà ítalikì" - -msgid "shortcuts.join-nodes" -msgstr "Dàràpọ̀ awọn ipàdé" - -msgid "shortcuts.letter-spacing-dec" -msgstr "Din aayé lẹ́tà kù" - -msgid "shortcuts.letter-spacing-inc" -msgstr "Alekun aayé lẹ́tà" - -msgid "shortcuts.line-height-dec" -msgstr "Dinkù gígà ílà" - -msgid "shortcuts.line-height-inc" -msgstr "Ílà ton gá sókè" - -msgid "shortcuts.line-through" -msgstr "Íyìpàdà ílà to yọ̀rí" - -msgid "shortcuts.make-corner" -msgstr "Ṣè ígùn" - -msgid "shortcuts.make-curve" -msgstr "Ṣe ìsépọ" - -msgid "shortcuts.mask" -msgstr "Ibòjú" - -msgid "shortcuts.merge-nodes" -msgstr "Dàpọ̀ awọ́n apa" - -msgid "shortcuts.move" -msgstr "Gbé" - -msgid "shortcuts.move-fast-down" -msgstr "Sàré lọ́ sí isàlẹ̀" - -msgid "shortcuts.move-fast-left" -msgstr "Gbé sí osi kiákiá" - -msgid "shortcuts.move-fast-right" -msgstr "Gbé si ọ̀tún kiákiá" - -msgid "shortcuts.move-fast-up" -msgstr "Gbé si òké kiákiá" - -msgid "shortcuts.move-nodes" -msgstr "Gbé ipàdé" - -msgid "shortcuts.move-unit-down" -msgstr "Gbé sílè" - -msgid "shortcuts.move-unit-left" -msgstr "Gbé osi" - -msgid "shortcuts.move-unit-right" -msgstr "Gbé sọtùn" - -msgid "shortcuts.move-unit-up" -msgstr "Gbé sóke" - -msgid "shortcuts.next-frame" -msgstr "Ọ̀kọ̀ tókan" - -msgid "shortcuts.not-found" -msgstr "Kò sí awọ́n ọ̀nà abùjá ti à rii" - -msgid "shortcuts.opacity-0" -msgstr "Fí akomo sí ipò 100%" - -msgid "shortcuts.opacity-1" -msgstr "Fi akomo si ipo 10%" - -msgid "shortcuts.opacity-2" -msgstr "Fi akomo si ipo 20%" - -msgid "shortcuts.opacity-3" -msgstr "Fi akomo si ipo 30%" - -msgid "shortcuts.opacity-4" -msgstr "Fi akomo si ipo 40%" - -msgid "shortcuts.opacity-5" -msgstr "Fi akomo si ipo 50%" - -msgid "shortcuts.opacity-6" -msgstr "Fi akomo si ipo 60%" - -msgid "shortcuts.opacity-7" -msgstr "Fi akomo si ipo 70%" - -msgid "shortcuts.opacity-8" -msgstr "Fi akomo si ipo 80%" - -msgid "shortcuts.opacity-9" -msgstr "Fi akomo si ipo 90%" - -msgid "shortcuts.open-color-picker" -msgstr "Ólùṣà àwọ̀" - -msgid "shortcuts.open-dashboard" -msgstr "Lọ si dasibodu" - -msgid "shortcuts.open-inspect" -msgstr "Lọ si apaa ayewo olùwò" - -msgid "shortcuts.open-viewer" -msgstr "Lọ si apaa ibaraẹnisọrọ olùwò" - -msgid "shortcuts.or" -msgstr " tabi " - -msgid "shortcuts.paste" -msgstr "Lẹẹmọ" - -msgid "shortcuts.prev-frame" -msgstr "Ọkọ ti tẹlẹ" - -msgid "shortcuts.redo" -msgstr "Tunṣe" - -msgid "shortcuts.reset-zoom" -msgstr "tun sun" - -msgid "shortcuts.search-placeholder" -msgstr "Wa awọn ọna abuja" - -msgid "shortcuts.select-all" -msgstr "Ṣa gbogbo re" - -msgid "shortcuts.select-parent-layer" -msgstr "Yan Obii pẹlẹbẹ" - -msgid "shortcuts.show-shortcuts" -msgstr "Ifihan / Itọju ọna abùjá" - -msgid "shortcuts.snap-nodes" -msgstr "Yaa si awon apa" - -msgid "shortcuts.snap-pixel-grid" -msgstr "Yaa si pikseli ilana" - -msgid "shortcuts.start-measure" -msgstr "Bẹ̀rẹ̀ wíwọ̀n" - -msgid "shortcuts.stop-measure" -msgstr "da wíwọ̀n duro" - -msgid "shortcuts.text-align-center" -msgstr "Parapọ saarin" - -msgid "shortcuts.text-align-justify" -msgstr "Sedede lárè" - -msgid "shortcuts.text-align-left" -msgstr "mo si osi" - -msgid "shortcuts.text-align-right" -msgstr "Mo sotun" - -msgid "shortcuts.thumbnail-set" -msgstr "Se étò awòn áwòran fun fidio" - -msgid "shortcuts.toggle-alignment" -msgstr "Iyipada titete ìmúdàgba" - -msgid "shortcuts.toggle-assets" -msgstr "Yi dukia pada" - -msgid "shortcuts.toggle-colorpalette" -msgstr "Yi paleti awọ pada" - -msgid "shortcuts.toggle-focus-mode" -msgstr "Yi ipo idojukọ pada" - -msgid "shortcuts.toggle-fullscreen" -msgstr "Yi kuro ni fulscrin" - -msgid "shortcuts.toggle-grid" -msgstr "Fihan / Tọju ilana" - -msgid "shortcuts.toggle-layers" -msgstr "Yi awon pelebe yii pada" - -msgid "shortcuts.toggle-lock" -msgstr "Tiipa / Siilẹ" - -msgid "shortcuts.toggle-lock-size" -msgstr "títìipa lápàkàn" - -msgid "shortcuts.toggle-rules" -msgstr "Fifihan / Titọju ólórì" - -msgid "shortcuts.toggle-scale-text" -msgstr "Yipada asekale ọrọ" - -msgid "shortcuts.toggle-snap-guide" -msgstr "Pín si awọ́n ítọ̀nisọ́nà" - -msgid "shortcuts.toggle-textpalette" -msgstr "Yíípàda ọrọ paleti" - -msgid "shortcuts.toggle-visibility" -msgstr "Fihan / Toju re" - -msgid "shortcuts.toggle-zoom-style" -msgstr "Yiipada asa sun-un" - -msgid "shortcuts.underline" -msgstr "Yii abẹlẹ" - -msgid "shortcuts.undo" -msgstr "Yi pada" - -msgid "shortcuts.ungroup" -msgstr "Tu ẹgbẹ" - -msgid "shortcuts.unmask" -msgstr "Aiboju" - -msgid "shortcuts.v-distribute" -msgstr "Pin ni inaro" - -msgid "shortcuts.zoom-lense-decrease" -msgstr "Dín lẹnsì sisun kù" - -msgid "shortcuts.zoom-lense-increase" -msgstr "Lílọ̀soké lẹnsi sisun" - -msgid "shortcuts.zoom-selected" -msgstr "Yiyan pelu sun-un" - -#: src/app/main/ui/dashboard/team.cljs -msgid "team.webhooks.max-length" -msgstr "Orúkọ̀ webhook kò gbọ́dọ̀ kọjà awọ́n óhun kíkọ́ 2048." - -#: src/app/main/ui/dashboard/files.cljs -msgid "title.dashboard.files" -msgstr "%s - Penpot" - -#: src/app/main/ui/dashboard/fonts.cljs -msgid "title.dashboard.font-providers" -msgstr "Pipese oniru fọnti - %s - Penpot" - -#: src/app/main/ui/dashboard/fonts.cljs -msgid "title.dashboard.fonts" -msgstr "Fọnti - %s - Penpot" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "title.dashboard.projects" -msgstr "Awọn ísè agbèsè - %s - Penpot" - -#: src/app/main/ui/dashboard/search.cljs -msgid "title.dashboard.search" -msgstr "Wà - %s - Penpot" - -#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/auth.cljs -msgid "title.default" -msgstr "Penpot – Se onìrú òmínìra fun awọ̀n ẹ̀gbẹ̀" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "title.settings.access-tokens" -msgstr "Profaili – Aami wiwọle" - -#: src/app/main/ui/settings/feedback.cljs -msgid "title.settings.feedback" -msgstr "Fi esi- Penpot" - -#: src/app/main/ui/settings/options.cljs -msgid "title.settings.options" -msgstr "Awon eto - Penpot" - -#: src/app/main/ui/settings/password.cljs -msgid "title.settings.password" -msgstr "Ọrọigbaníwólé - Penpot" - -#: src/app/main/ui/settings/profile.cljs -msgid "title.settings.profile" -msgstr "Profaili - Penpot" - -#: src/app/main/ui/dashboard/team.cljs -msgid "title.team-invitations" -msgstr "Ifíwẹ́pe - %s - Penpot" - -#: src/app/main/ui/dashboard/team.cljs -msgid "title.team-members" -msgstr "Ọ́́mọ̀ ẹgbẹ - %s - Penpot" - -#: src/app/main/ui/dashboard/team.cljs -msgid "title.team-settings" -msgstr "Awọn eto - %s - Penpot" - -msgid "title.team-webhooks" -msgstr "Webhooks - %s - Penpot" - -#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs -msgid "title.viewer" -msgstr "%s –Ipo wíwò - Penpot" - -#: src/app/main/ui/workspace.cljs -msgid "title.workspace" -msgstr "%s - Penpot" - -#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs -msgid "viewer.empty-state" -msgstr "No boards found on the page." - -#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs -msgid "viewer.frame-not-found" -msgstr "A kò ri ọ̀kọ̀." - -msgid "viewer.header.comments-section" -msgstr "Ọrọìwòye (%s)" - -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.dont-show-interactions" -msgstr "Maa fi ìbaráẹ̀nìsepọ han" - -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.fullscreen" -msgstr "Fé ká gḅọgbọ síkírínì" - -msgid "viewer.header.inspect-section" -msgstr "Ayéwò (%s)" - -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.interactions" -msgstr "Ibaraenisépọ̀" - -msgid "viewer.header.interactions-section" -msgstr "Awọ̀n Ibaraenisépọ̀ (%s)" - -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.share.copy-link" -msgstr "Da línkì kọ̀" - -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.show-interactions" -msgstr "Ifihan Ibaraenisépọ̀" - -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.sitemap" -msgstr "Áwòran átọ̀kà ílẹ̀" - -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.hcenter" -msgstr "Paŕàpọ̀ sí petelè aarin (%s)" - -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.hdistribute" -msgstr "Pin aayè ni pètélè (%s)" - -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.hleft" -msgstr "Páràpọ̀ sí òsì (%s)" - -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.hright" -msgstr "Páràpọ̀ sí ọtun (%s)" - -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.vbottom" -msgstr "Páràpọ̀ sí isàlẹ̀ (%s)" - -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.vcenter" -msgstr "Páràpọ̀ sí inàro aarin (%s)" - -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.vdistribute" -msgstr "Pin aayè inàró (%s)" - -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.vtop" -msgstr "Párápọ̀ sóké (%s)" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.assets" -msgstr "Awọ̀n dukia" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.box-filter-all" -msgstr "Gbọ̀gbọ̀ awọ̀n dukia" - -#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.colors" -msgstr "Áwò" - -#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.components" -msgstr "Awọ̀n eroja" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.create-group" -msgstr "Ṣẹ̀dá ẹ̀gbẹ̀ kan" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.create-group-hint" -msgstr "páarẹ̀" - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.duplicate" -msgstr "ẹẹdà" - -#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.edit" -msgstr "Ṣatunkọ" - -#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.graphics" -msgstr "Awọn Awòran" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.group" -msgstr "Ẹgbẹ" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.group-name" -msgstr "Orúkọ̀ ẹgbẹ" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.libraries" -msgstr "Ílè-iwè" - -msgid "workspace.assets.local-library" -msgstr "Ílè-iwè agbegbe" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.not-found" -msgstr "Ko si ohun-ini ti a rii" - -msgid "workspace.assets.open-library" -msgstr "Ṣii faili ìlé-ikáwè" - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.rename" -msgstr "Lo oruko imiran" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.rename-group" -msgstr "Lo oruko imiran fun ẹgbẹ" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.search" -msgstr "Wa dukia" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "Iĺẹ̀ iwekika ti a pln" - -#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.typography" -msgstr "Iwe itẹwe" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.font-id" -msgstr "Fonti" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.font-size" -msgstr "Iwon" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.font-variant-id" -msgstr "Iyatọ" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.letter-spacing" -msgstr "Aaye leta" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.line-height" -msgstr "Giga ila" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/inspect/attributes/text.cljs, src/app/main/ui/inspect/attributes/text.cljs -msgid "workspace.assets.typography.sample" -msgstr "Ag" - -msgid "workspace.assets.typography.text-styles" -msgstr "Oniru ọrọ" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.text-transform" -msgstr "Iyipádà ọrọ" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.ungroup" -msgstr "Títù ẹ̀gbẹ́" - -msgid "workspace.focus.focus-mode" -msgstr "Ipo Idojukọ" - -msgid "workspace.focus.focus-off" -msgstr "Pa Ídòjúkọ" - -msgid "workspace.focus.focus-on" -msgstr "Tan Ídòjúkọ" - -msgid "workspace.focus.selection" -msgstr "Yiyan" - -#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs -msgid "workspace.gradients.linear" -msgstr "Itesiwaju gerege" - -#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs -msgid "workspace.gradients.radial" -msgstr "Itesiwaju Radial" - -msgid "workspace.header.menu.disable-scale-content" -msgstr "Pa asèkalẹ̀ iwọnbà" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-scale-text" -msgstr "Pa ọrọ iwọnba" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "Pa yipada si ilana" - -msgid "workspace.header.menu.disable-snap-pixel-grid" -msgstr "Pa yipada si piseli" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-dynamic-alignment" -msgstr "Tan imudagba to Sedede" - -msgid "workspace.header.menu.enable-scale-content" -msgstr "Tan asèkalẹ̀ iwọnbà" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-scale-text" -msgstr "Tan iwọnbà ọrọ" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "Yipada si ilana" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-guides" -msgstr "Yipada si itọ̀nìsọna" - -msgid "workspace.header.menu.enable-snap-pixel-grid" -msgstr "Tan Yipada si piseli" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-grid" -msgstr "Tọ̀jú ilana" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-palette" -msgstr "Tọ̀jú awọ palẹti" - -msgid "workspace.header.menu.hide-pixel-grid" -msgstr "Tọ̀jú pisẹli ilana" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-rules" -msgstr "Tọ̀jú awọn ólòrí" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-textpalette" -msgstr "Tọ̀jú awọn fọnti paleti" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.edit" -msgstr "Satunkọ" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.file" -msgstr "Faili" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.help-info" -msgstr "Iranlọwọ ati alaye" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.preferences" -msgstr "Awọn àyánfẹ̀" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.view" -msgstr "Wiwo" - -msgid "workspace.header.menu.redo" -msgstr "Tun ṣe" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.select-all" -msgstr "Sa gbogbo rẹ" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "ifihan akoj" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-palette" -msgstr "Fi awo paleti han" - -msgid "workspace.header.menu.show-pixel-grid" -msgstr "Fi piseli ilana han" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-rules" -msgstr "Ifihan awọ̀n ólórí" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-textpalette" -msgstr "Ifihan fonti paleti" - -msgid "workspace.header.menu.undo" -msgstr "Yi pada" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.reset-zoom" -msgstr "Tunto" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.save-error" -msgstr "àsisè lórì fíf́ipamọ" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.saved" -msgstr "Ti a fipamọ" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.saving" -msgstr "Fifipámọ" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.unsaved" -msgstr "Awọn ayípàdà ti kó ni fipamọ" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.viewer" -msgstr "Ipo wiwo(%s)" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom" -msgstr "sun-un" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fill" -msgstr "Kun - óṣùwọn to kun" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fit" -msgstr "Báràmù - óṣùwọn to Báràmù" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fit-all" -msgstr "Suun kí o bá gbógbó rẹ̀ dọ́gbà" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-full-screen" -msgstr "Áseàfihan to kún" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-selected" -msgstr "Ṣuum lati yan" - -msgid "workspace.layout_grid.editor.title" -msgstr "Ilànà àyípàdà" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.add" -msgstr "Afikùn" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.colors" -msgstr "%s awọn awọ" - -#: src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.empty-palette" -msgstr "Kòyi si oniruiru awọ ni ilé-ikàwé re" - -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "Ko si oniruiru iwé itẹ̀wé ni ilé ikàwé rẹ̀" - -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.hsv" -msgstr "HSV" - -#: src/app/main/ui/workspace/colorpicker/libraries.cljs, src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.recent-colors" -msgstr "Awọn àwò tálò láipẹ̀" - -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgb-complementary" -msgstr "RGB Ibáramù" - -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgba" -msgstr "RGBA" - -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.save-color" -msgstr "Fi awọn oniru awọ pamọ" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.components" -msgstr "%s Ẹya ara ẹrọ" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.file-library" -msgstr "Faili ilé ikàwé" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.graphics" -msgstr "%s ayaworan" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.libraries" -msgstr "Awọn Ílè íkawè" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library" -msgstr "Ílè íkawè" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library-updates" -msgstr "Ílè íkawè ímùdojúiwọn" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.no-libraries-need-sync" -msgstr "Kò si Ilé kàwé ti a pin si ímùdojúiwọn" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.shared-libraries" -msgstr "Awọn ilé kàwé tí a pìn" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.libraries.text.multiple-typography" -msgstr "Óríṣí awọn íwè itẹ̀wé" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.libraries.text.multiple-typography-tooltip" -msgstr "Tú gbógbó lińkí awọn íwè itẹ̀wé" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.typography" -msgstr "%s awọn íwè itẹ̀wé" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.update" -msgstr "ímùdojúiwọn" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "wò gbògbò awọn ayípàdà" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.updates" -msgstr "Awọn ímùdojúiwọn" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.add-interaction" -msgstr "Tẹ amí + làtí fi íbàràénisépọ̀ kun" - -#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "workspace.options.blur-options.title" -msgstr "Baìbaì" - -#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "workspace.options.blur-options.title.group" -msgstr "Ẹ̀gdẹ́ Baìbaì" - -#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "workspace.options.blur-options.title.multiple" -msgstr "Asayan Baìbaì" - -#: src/app/main/ui/workspace/sidebar/options/page.cljs -msgid "workspace.options.canvas-background" -msgstr "Kánfásì abẹ́le" - -msgid "workspace.options.clip-content" -msgstr "Ábẹrẹ́ ákoonù" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs -msgid "workspace.options.component" -msgstr "Apakan" - -msgid "workspace.options.component.copy" -msgstr "Ádàakọ" - -msgid "workspace.options.component.edit-annotation" -msgstr "Ṣatunkọ àkọ̀silẹ̀" - -msgid "workspace.options.component.main" -msgstr "Ólòrí" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints" -msgstr "Awọn ihámọ" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.bottom" -msgstr "Ídì" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.center" -msgstr "Aarin" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.left" -msgstr "Òsi" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.leftright" -msgstr "Osi ati otun" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.right" -msgstr "Ọ̀tún" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.scale" -msgstr "Íwọ́n" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.top" -msgstr "Ókè" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.topbottom" -msgstr "Ókè ati Ídí" - -#: src/app/main/ui/workspace/sidebar/options.cljs -msgid "workspace.options.design" -msgstr "Ónirú" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "workspace.options.export" -msgstr "Sí ilẹ́ òkèeré" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs -msgid "workspace.options.export.suffix" -msgstr "afikun ọrọ niipárí" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-complete" -msgstr "Gbígbè okeere ti pari" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-object" -msgstr "Gbígbè okeere …" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-object-error" -msgstr "Gbígbè okeere kuna" - -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.fill" -msgstr "Kún" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.add-flow-start" -msgstr "Safikun ibẹrè ṣiṣan" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow-start" -msgstr "ibẹrè ṣiṣan" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow-starts" -msgstr "íbẹrè awọn ṣiṣan" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.auto" -msgstr "Aifọ́wọyi" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.grid-title" -msgstr "Ilánà" - -msgid "workspace.options.grid.params.color" -msgstr "Awọ" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.columns" -msgstr "Awọn ọwọn" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.gutter" -msgstr "Gota" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.height" -msgstr "Òkè" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.margin" -msgstr "Àlà" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.rows" -msgstr "Àwọn orí ìlà ìbú" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.set-default" -msgstr "Fi sípò abínibí" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.size" -msgstr "Ìwọ̀n" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type" -msgstr "Irú" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.bottom" -msgstr "ìsàlẹ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.center" -msgstr "Àárín" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.left" -msgstr "Òsì" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.right" -msgstr "Ọ̀tún" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.stretch" -msgstr "Nà" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.top" -msgstr "Òkè" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.use-default" -msgstr "Lo ipò abínibí" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.width" -msgstr "Ìgbòrò" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.row" -msgstr "Àwọn orị ìlà ìbú" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.square" -msgstr "Alápoméjì" - -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.group-fill" -msgstr "Ẹ̀kún ẹgbẹ́" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.group-stroke" -msgstr "Ẹgba ẹgbẹ́" - -msgid "workspace.options.height" -msgstr "Gíga" - -msgid "workspace.options.inspect" -msgstr "Ṣàyẹ̀wò" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-action" -msgstr "Ìgbésẹ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-after-delay" -msgstr "Lẹ́yìn ìdádúro" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation" -msgstr "Àwòrán abẹ̀mí" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-dissolve" -msgstr "Túká" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-none" -msgstr "Kòsí" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-push" -msgstr "Tì" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-slide" -msgstr "Aṣàfihàn" - -msgid "workspace.options.interaction-auto" -msgstr "Ọkọ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-background" -msgstr "Fi àyíká ìtẹ̀lẹ̀ ìlànà síi" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-outside" -msgstr "Páadé tí o bá n tẹ ìta" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay" -msgstr "Pa ìlànà ìtẹ̀lẹ̀ dé" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay-dest" -msgstr "Pa ìlànà ìtẹ̀lẹ̀ dé: %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-delay" -msgstr "Ìdádúró" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-destination" -msgstr "Èbúté" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-duration" -msgstr "Ịgbà" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing" -msgstr "Rírokùn" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease" -msgstr "Ìrọ̀rùn" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in" -msgstr "Rọra wọlé" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in-out" -msgstr "Rọra wọlé jáde" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-out" -msgstr "Rọra jáde" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-linear" -msgstr "Ilà" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-in" -msgstr "Inú" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-enter" -msgstr "Atọ́ka ìwọnú" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-leave" -msgstr "Atọ́ka kíkúrò" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-ms" -msgstr "ms" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to" -msgstr "Lílọ kiri sí" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to-dest" -msgstr "Lílo kiri sí: %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-none" -msgstr "(Akò ṣètò)" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-offset-effect" -msgstr "Ipa àìṣedédé" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-on-click" -msgstr "Tẹ orí" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay" -msgstr "Ṣíìtẹ̀lé ìlànà" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay-dest" -msgstr "Ṣí ìtẹ̀lé ìlànà: %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-url" -msgstr "Ṣí URL" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-out" -msgstr "Jáde" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-center" -msgstr "Àáriń ìsàlẹ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-left" -msgstr "Ìsàlẹ̀ òsì" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-right" -msgstr "Ìsàḷ̀ẹ̀ ọ̀tún" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-center" -msgstr "Àárín" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-manual" -msgstr "Aláfọwóṣe" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-center" -msgstr "Àárín òkè" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-left" -msgstr "Òkè òsì" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-right" -msgstr "Òkè ọ̀tún" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-position" -msgstr "Ipò" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-preserve-scroll" -msgstr "Ṣe ìtọ́jú ipò àyílọ" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-prev-screen" -msgstr "Aṣàfihàn àtẹ̀yìnwá" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-relative-to" -msgstr "Ìbátan sí" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-self" -msgstr "Tìkara" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay" -msgstr "Àyípadà ìtẹ̀lé ìlànà" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay-dest" -msgstr "Àyípadà ìtẹ̀lé ìlànà: %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-trigger" -msgstr "Okùnfà" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-url" -msgstr "URL" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-hovering" -msgstr "Nígbàtí óhún rábàbà" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-pressing" -msgstr "Nígbàtị óhún tẹ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interactions" -msgstr "Àwọn ìbáraẹniṣepọ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.color" -msgstr "Àwọ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.color-burn" -msgstr "Ṣẹ̀dà àwọ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.color-dodge" -msgstr "Òpó àwọ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.darken" -msgstr "Ṣókuǹkùn" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.difference" -msgstr "Ìyàtọ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.exclusion" -msgstr "Ìyàsọ́tọ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.hard-light" -msgstr "Iná líle" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.hue" -msgstr "Ọdà" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.lighten" -msgstr "Fẹ́ẹ́rẹ́fẹ́" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.luminosity" -msgstr "Ìmọ́lẹ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.multiply" -msgstr "Ìsọdipúpọ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.normal" -msgstr "Déédé" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.overlay" -msgstr "Ìtẹ̀lẹ́ ìlànà" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.saturation" -msgstr "Ẹ̀kúnrẹ́rẹ́" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.screen" -msgstr "Aṣàfihàn" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.soft-light" -msgstr "Ìmọ́lẹ̀ rokoṣo" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title" -msgstr "Ìpele" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title.group" -msgstr "Ẹgbẹ́ ìpele" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title.multiple" -msgstr "Egbẹ́ ààyò" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.advanced-ops" -msgstr "Ànàálè ìtẹ̀síwájú" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-max-h" -msgstr "Ibi tó ga jùlọ" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-max-w" -msgstr "Ìgbòrò tó ga jù" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-min-h" -msgstr "Gíga to kéré jù lọ" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-min-w" -msgstr "Ìgbòrò tó kéré jù lọ" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-max-h" -msgstr "Gíga tó pọ̀jù" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-max-w" -msgstr "Ìgbòrò tí pòjù" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-min-h" -msgstr "Gíga tó kéré jùlọ" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-min-w" -msgstr "Gbígbòrò tó kéré jù lọ" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.bottom" -msgstr "Ìdí" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column" -msgstr "Ìlà òòró" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column-reverse" -msgstr "Ìlà òòró yíyípadà" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row" -msgstr "Ilà ìbú" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row-reverse" -msgstr "Ilà ìbú yíyípadà" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.gap" -msgstr "Àlàfo" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.left" -msgstr "Òsì" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin" -msgstr "Etí ìwé" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin-all" -msgstr "Gbogbo àwọn àwòrán" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin-simple" -msgstr "Etí ìwé ẹyọ" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.packed" -msgstr "tí wọn dì" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding" -msgstr "Ìtẹ̀wọ́nú" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding-all" -msgstr "Gbogbo ẹ̀gbẹ́" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding-simple" -msgstr "Ìtẹ̀wọ́nú pọ́nbélé" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.right" -msgstr "Ọ̀tún" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.space-around" -msgstr "Àyè àyíká" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.space-between" -msgstr "Àyè àárín" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.top" -msgstr "Òkè" - -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.more-colors" -msgstr "Àwọn àwọ̀ púpọ̀ sí i" - -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.more-lib-colors" -msgstr "Àwọn yàrá àwọ̀ púpọ̀ sí I" - -msgid "workspace.options.opacity" -msgstr "Àìríran" - -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.position" -msgstr "Ipò" - -#: src/app/main/ui/workspace/sidebar/options.cljs -msgid "workspace.options.prototype" -msgstr "Ìtẹ̀lé ìlànà" - -msgid "workspace.options.radius" -msgstr "Ìdáméjì òbìrìkìtiì" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-bottom-left" -msgstr "Apá òsì ìsàlẹ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-bottom-right" -msgstr "Apá ọ̀tún ìsàle" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-top-left" -msgstr "Òkè òsì" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-top-right" -msgstr "Òkè ọ̀tún" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius.all-corners" -msgstr "Àwọn gbogbo igun" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius.single-corners" -msgstr "Àwọn igun olómìnira" - -msgid "workspace.options.recent-fonts" -msgstr "Àìpẹ́" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.retry" -msgstr "Tún gbìyànjú" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.rotation" -msgstr "Yíyípo" - -msgid "workspace.options.search-font" -msgstr "Àdàkọ ìwádìí" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.select-a-shape" -msgstr "" -"Yan ìrísi ,pátákó tàbí ẹgbẹ́ láti fa ìsopọ̀ mọ́ pátákó " -"òmíràn." - -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.selection-color" -msgstr "Àwọn àwọ̀ tí a ti yàn" - -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.selection-fill" -msgstr "Ìmúṣẹ tí a yàn" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.selection-stroke" -msgstr "Ipò ìlù tí a yàn" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.blur" -msgstr "Rẹ́súrẹ́sú" - -msgid "workspace.options.shadow-options.color" -msgstr "Àwọ̀ òjíjí" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.drop-shadow" -msgstr "Da òjìjí" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.inner-shadow" -msgstr "Òjìjí inú" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.offsetx" -msgstr "X" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.offsety" -msgstr "Y" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.spread" -msgstr "Tànkálẹ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title" -msgstr "Òjìjí" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title.group" -msgstr "Àwùjọ òjìjí" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title.multiple" -msgstr "Òjìjí tí a yàn" - -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.show-fill-on-export" -msgstr "Fihàn nínụ àgbéjáde" - -msgid "workspace.options.show-in-viewer" -msgstr "Fihàn nínú ipò wíwò" - -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.size" -msgstr "Ìwọ̀n" - -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs -msgid "workspace.options.size-presets" -msgstr "Àwọn àtòjọ" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke" -msgstr "Ipò ìlà" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker" -msgstr "Àmì yíyíká" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Yíyíká" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker" -msgstr "Àmì dáyámọ́ǹdì" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Dáyámọ́ǹdì" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow" -msgstr "Ọfà ìlà" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Ofà" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.none" -msgstr "Kòsí" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.round" -msgstr "Yíká" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square" -msgstr "Alápoméjì" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker" -msgstr "Àmì alápoméjì" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Onígun mẹ́rin" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow" -msgstr "Ofà onígun mẹ́ta" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Onígun mẹ́ta" - -msgid "workspace.options.stroke-color" -msgstr "Àwọ ìlà" - -msgid "workspace.options.stroke-width" -msgstr "Ìgbòrò ìlà" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.center" -msgstr "Àárín" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.dashed" -msgstr "Tó ní ìlà-ìlà" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.dotted" -msgstr "àmì tó tó tó" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.inner" -msgstr "Nínú" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.mixed" -msgstr "Tí a ti dàpọ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.outer" -msgstr "Ìta" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.solid" -msgstr "Ṣinsin" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-bottom" -msgstr "Mú dọ́gba abẹ́" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-middle" -msgstr "Mú dọgba àárín" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-top" -msgstr "Mú dọ́gba òkè" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.direction-ltr" -msgstr "LTR" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.direction-rtl" -msgstr "RTL" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-auto-height" -msgstr "Gíga aládàáṣiṣẹ́" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-auto-width" -msgstr "Gbígbòòrò aládáàṣiṣé" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-fixed" -msgstr "Tí kò yíyadà" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.letter-spacing" -msgstr "Àlàfo lẹ́tà" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.line-height" -msgstr "Gíga ìlà" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.lowercase" -msgstr "Lẹ́tà kékeré" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.none" -msgstr "Kòsí" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.strikethrough" -msgstr "Ìfọwọ́bàyíká (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-center" -msgstr "Mú dọ́gba àárín (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-justify" -msgstr "Ìdálàre (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-left" -msgstr "Mú dọ́gba òsì (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-right" -msgstr "Mú dọ́gba ọ̀tún (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title" -msgstr "Àyọkà" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title-group" -msgstr "Àwùjọ àyọkà" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title-selection" -msgstr "Àṣàyàn ọ̀rọ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.titlecase" -msgstr "ipò ọ̀rọ̀ àkórí" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.underline" -msgstr "Fífàlà (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.uppercase" -msgstr "Lẹ́tà ńlá" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.use-play-button" -msgstr "" -"Lo bọ́tìnì ìṣe tó wà lóori àkọsórí náà láti ṣakóso ìwò " -"àkàwé." - -msgid "workspace.options.width" -msgstr "Ìgbòrò" - -msgid "workspace.options.x" -msgstr "Ipò X" - -msgid "workspace.options.y" -msgstr "Ipò Y" - -msgid "workspace.path.actions.add-node" -msgstr "Fi ìpàdé kún (%s)" - -msgid "workspace.path.actions.delete-node" -msgstr "Pa ìpàdé ré (%s)" - -msgid "workspace.path.actions.draw-nodes" -msgstr "Fa ìpàdé (%s)" - -msgid "workspace.path.actions.join-nodes" -msgstr "Da ìpàdé pọ̀ (%s)" - -msgid "workspace.path.actions.make-corner" -msgstr "Sí igun (%s)" - -msgid "workspace.path.actions.make-curve" -msgstr "Sí ẹkọ̀rọ̀ (%s)" - -msgid "workspace.path.actions.merge-nodes" -msgstr "Da ìpàdé pò (%s)" - -msgid "workspace.path.actions.move-nodes" -msgstr "Gbé ìpàde (%s)" - -msgid "workspace.path.actions.separate-nodes" -msgstr "Ya ̣ìpàdé sọ́tọ̀ (%s)" - -msgid "workspace.path.actions.snap-nodes" -msgstr "Ìmọ̀lára ìpàdé (%s)" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.add-flex" -msgstr "Fi àrọ ètò ìrísí kun" - -msgid "workspace.shape.menu.add-grid" -msgstr "Fi gírídì ètò ìrísị kun" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.back" -msgstr "dáa padà séyiǹ" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.backward" -msgstr "dá padà sọ́wọ èyiǹ" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.copy" -msgstr "Ṣẹ̀dà" - -msgid "workspace.shape.menu.create-annotation" -msgstr "Ṣèda àlàyé" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.create-artboard-from-selection" -msgstr "Yíyàn sí pátákó" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.create-component" -msgstr "Ṣẹ́dá àkóónú" - -msgid "workspace.shape.menu.create-multiple-components" -msgstr "Ṣẹ̀dá ọ̀pọ̀lọpọ̀ àkóónú" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.cut" -msgstr "Gé" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.delete" -msgstr "Parẹ́" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.delete-flow-start" -msgstr "Pa ìbẹ̀ẹ̀rè ìsàn rẹ́" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.detach-instance" -msgstr "ṣẹ́ àpẹ̣ẹre yọ nípò" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.detach-instances-in-bulk" -msgstr "Ṣẹ́ àwọn àpẹẹrẹ yọ nípò" - -msgid "workspace.shape.menu.difference" -msgstr "Ìyàtọ̀" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.duplicate" -msgstr "Sẹ ẹ̀dà" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.edit" -msgstr "Sàtúnṣe" - -msgid "workspace.shape.menu.exclude" -msgstr "Ṣà yọ sílè" - -msgid "workspace.shape.menu.flatten" -msgstr "Tẹ́ pẹrẹsẹ" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flip-horizontal" -msgstr "Ìyí padà oníbùú" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flip-vertical" -msgstr "Ìyí padà olóòró" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flow-start" -msgstr "Ìbẹ̀rè ìṣàn" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.forward" -msgstr "Mú wá sọ́wọ́ iwájú" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.front" -msgstr "Mú wá sí wájú" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.go-main" -msgstr "Lọ sí olórí fáìlì àkóónú" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.group" -msgstr "Àwùjọ" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.hide" -msgstr "Tọ́jú" - -msgid "workspace.shape.menu.hide-ui" -msgstr "Fihàn/ Tọ́jú UI" - -msgid "workspace.shape.menu.intersection" -msgstr "Ìkòríta" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.lock" -msgstr "Tì" - -#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.mask" -msgstr "Ìbòjú" - -#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.paste" -msgstr "lẹ̀mọ́" - -msgid "workspace.shape.menu.path" -msgstr "Ipa ọ̀nà" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.remove-flex" -msgstr "Yọ àrọ ètò ìrísí kúrò" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.reset-overrides" -msgstr "Ṣe àtúnṣe ìdojúkọ" - -msgid "workspace.shape.menu.restore-main" -msgstr "Dạ àkóónú pàtàkì sí pò" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.select-layer" -msgstr "Yan ìpele" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show" -msgstr "Ṣà fihàn" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show-in-assets" -msgstr "Ṣafihàn nínú atọ́ka àwọn ìgbìmọ̀ ìní" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show-main" -msgstr "Ṣà fihàn àkóónú pàtàkì" - -msgid "workspace.shape.menu.thumbnail-remove" -msgstr "Yọ àwòrán aláṣojú kúrò" - -msgid "workspace.shape.menu.thumbnail-set" -msgstr "Fi sípò àwòrań aláṣojú" - -msgid "workspace.shape.menu.transform-to-path" -msgstr "Yípadà sí pópó ọ̀nà" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.ungroup" -msgstr "Ṣe àìkójọ" - -msgid "workspace.shape.menu.union" -msgstr "Ìbáṣepò" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.unlock" -msgstr "Ṣíí" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.unmask" -msgstr "Sí ìbòjú" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.update-components-in-bulk" -msgstr "Mímú àwọn ọ̀rọ̀ àkóónú pàtàkì dójú ìwọ̀n" - -msgid "workspace.sidebar.collapse" -msgstr "Wó òpó ègbẹ́" - -msgid "workspace.sidebar.expand" -msgstr "Fẹ òpó ẹ̀gbẹ́" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.sidebar.history" -msgstr "Ìtàn (%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.sidebar.layers" -msgstr "Àwọn ìpele" - -msgid "workspace.sidebar.layers.components" -msgstr "Àwọn àkóónú" - -msgid "workspace.sidebar.layers.frames" -msgstr "Àwọn pátákó" - -msgid "workspace.sidebar.layers.groups" -msgstr "Àkójọ" - -msgid "workspace.sidebar.layers.images" -msgstr "Àwọn àwòrán" - -msgid "workspace.sidebar.layers.masks" -msgstr "Àwọn ìbòjú" - -msgid "workspace.sidebar.layers.search" -msgstr "Àwọn ìpele wíwá" - -msgid "workspace.sidebar.layers.shapes" -msgstr "Àwọn ìrísí" - -msgid "workspace.sidebar.layers.texts" -msgstr "Àwọn àyọkà" - -#: src/app/main/ui/workspace/sidebar/options/menus/svg_attrs.cljs, src/app/main/ui/inspect/attributes/svg.cljs -msgid "workspace.sidebar.options.svg-attrs.title" -msgstr "Gbígbé àwọn ànímọ́ SVG wọlé wá" - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "workspace.sidebar.sitemap" -msgstr "Àwọn abala" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.sitemap" -msgstr "Máàpù ojú ìlà" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.assets" -msgstr "Àwọn ohun ìní" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.color-palette" -msgstr "Pálètì àwọ̀ (%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.comments" -msgstr "Àwọn ìdáásí (%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.curve" -msgstr "Ìṣépo (%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.ellipse" -msgstr "Àlàfo (%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.frame" -msgstr "Pátákó (%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.image" -msgstr "Àwòrán(%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.move" -msgstr "Gbé (%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.path" -msgstr "Pópó ọ̀nà (%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.rect" -msgstr "Onígun mẹ́rin (%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.shortcuts" -msgstr "Àwón ọ̀nà àbùjá (%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.text" -msgstr "Àyọkà (%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.text-palette" -msgstr "Àwọn ohun ìtẹ̀wé (%s)" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.empty" -msgstr "Di ìgbà yìí kò sí àyípadà nínú ìtàn" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.delete" -msgstr "Paarẹ́%s" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.modify" -msgstr "Àtuńṣe %s" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.move" -msgstr "Àwọn ohun tí a ti gbé lọ" - -msgid "workspace.undo.entry.multiple.circle" -msgstr "Awọn àyíká" - -msgid "workspace.undo.entry.multiple.color" -msgstr "Àwọn ohun àmúṣọrọ̀ àwọ̀" - -msgid "workspace.undo.entry.multiple.component" -msgstr "Àkóónú" - -msgid "workspace.undo.entry.multiple.curve" -msgstr "Àwọn ẹkọ̀rọ̀" - -msgid "workspace.undo.entry.multiple.frame" -msgstr "Pátákó" - -msgid "workspace.undo.entry.multiple.group" -msgstr "Àwọn àkójọ" - -msgid "workspace.undo.entry.multiple.media" -msgstr "Àwọn ohun ìyì àwòrán" - -msgid "workspace.undo.entry.multiple.multiple" -msgstr "Àwọn ǹǹkan" - -msgid "workspace.undo.entry.multiple.page" -msgstr "Àwọn ojú awé" - -msgid "workspace.undo.entry.multiple.path" -msgstr "Àwọn ẹ̀bá ọ̀nà" - -msgid "workspace.undo.entry.multiple.rect" -msgstr "Àwọn onígun mẹ́rin" - -msgid "workspace.undo.entry.multiple.shape" -msgstr "Ìrísí" - -msgid "workspace.undo.entry.multiple.text" -msgstr "Àwọn àyọkà" - -msgid "workspace.undo.entry.multiple.typography" -msgstr "Àwọn ohun ìyì ìwé títẹ̀" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.new" -msgstr "Titun %s" - -msgid "workspace.undo.entry.single.circle" -msgstr "Àyíká" - -msgid "workspace.undo.entry.single.color" -msgstr "Ohun àmúṣọrọ̀ àwọ̀" - -msgid "workspace.undo.entry.single.component" -msgstr "Àkóónú" - -msgid "workspace.undo.entry.single.curve" -msgstr "Ẹkọ̀rọ̀" - -msgid "workspace.undo.entry.single.frame" -msgstr "Pátákó" - -msgid "workspace.undo.entry.single.group" -msgstr "Àkójọ" - -msgid "workspace.undo.entry.single.image" -msgstr "Àwòrán" - -msgid "workspace.undo.entry.single.media" -msgstr "Ohun àmúṣọrọ̀ èyà àwòrán" - -msgid "workspace.undo.entry.single.multiple" -msgstr "Ohun" - -msgid "workspace.undo.entry.single.page" -msgstr "Ojú awẹ́" - -msgid "workspace.undo.entry.single.path" -msgstr "Pópó ònà" - -msgid "workspace.undo.entry.single.rect" -msgstr "Onígun mẹ́rin" - -msgid "workspace.undo.entry.single.shape" -msgstr "Ìrísí" - -msgid "workspace.undo.entry.single.text" -msgstr "Àyọkà" - -msgid "workspace.undo.entry.single.typography" -msgstr "Ohun ìyì ìwé títẹ̀" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.unknown" -msgstr "Iṣẹ́ parí %s" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.title" -msgstr "Ìtàn" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.dismiss" -msgstr "Ta nù" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "Àlàyé síi" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.there-are-updates" -msgstr "Àwọn imúdójúìwọ̀n wà nínú àwọn yàrá ìkàwẹ tí a pín" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.update" -msgstr "Ìmúdójúìwọ̀n" - -msgid "workspace.viewport.click-to-close-path" -msgstr "Tẹ̀ láti pa pópó ọ̀nà dé" diff --git a/frontend/translations/zh_CN.po b/frontend/translations/zh_CN.po index 247639c11..c7f736a1f 100644 --- a/frontend/translations/zh_CN.po +++ b/frontend/translations/zh_CN.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-01-12 23:06+0000\n" "Last-Translator: Geek Squirrel \n" -"Language-Team: Chinese (Simplified) " -"\n" +"Language-Team: Chinese (Simplified) \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -80,14 +80,6 @@ msgstr "LDAP登录" msgid "auth.login-with-oidc-submit" msgstr "OpenID登录" -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "姓名必须包含一些空格以外的字符。" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "姓名最多包含250个字符。" - #: src/app/main/ui/auth/recovery.cljs msgid "auth.new-password" msgstr "输入新的密码" @@ -120,10 +112,6 @@ msgstr "密码" msgid "auth.password-length-hint" msgstr "至少8位字符" -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-not-empty" -msgstr "密码必须包含一些空格以外的字符。" - msgid "auth.privacy-policy" msgstr "隐私政策" @@ -170,19 +158,10 @@ msgstr "服务协议" msgid "auth.terms-privacy-agreement" msgstr "创建账号意味着您认可我们的服务条例和隐私政策。" -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "创建新账号,即代表你同意我们的[服务条例](%s)和[隐私政策](%s)。" - #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "我们已经发送了一封验证邮件到" -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "品牌设计、插图、营销物料等。" - msgid "common.publish" msgstr "发布" @@ -275,78 +254,6 @@ msgstr "开始浏览" msgid "dasboard.walkthrough-hero.title" msgstr "界面浏览" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.copied-success" -msgstr "已复制令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "生成新令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "成功创建访问令牌。" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "点击“生成新令牌”按钮来生成一个。" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.no-access-tokens" -msgstr "你目前还没有令牌。" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "名称是必填项" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "180天" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "30天" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-60-days" -msgstr "60天" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-90-days" -msgstr "90天" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-never" -msgstr "从不" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "已经于%s到期" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expires-on" -msgstr "将于%s到期" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.no-expiration" -msgstr "无到期时限" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "个人访问令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "个人访问令牌可被理解为密码认证的代替选项,常用于允许(第三方)应用访问Penpot内部API" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-expire" -msgstr "令牌将于%s到期" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-not-expire" -msgstr "令牌无到期时限" - #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "dashboard.add-shared" @@ -819,9 +726,6 @@ msgstr "无法加载%s字体" msgid "errors.bad-font-plural" msgstr "无法加载%s等字体" -msgid "errors.cannot-upload" -msgstr "无法上传该媒体文件。" - #: src/app/main/data/workspace.cljs msgid "errors.clipboard-not-implemented" msgstr "你的浏览器不支持该操作" @@ -859,16 +763,13 @@ msgstr "此邮箱[%s]已被标记为垃圾邮件或已被永久拉黑。" #: src/app/main/errors.cljs msgid "errors.feature-mismatch" -msgstr "看起来你正在打开一个启用了'%s'功能的文件,但当前penpot版本并不支持该功能或已将其禁用。" +msgstr "看起来你正在打开一个启用了'%s'功能的文件,但当前penpot版本并不支持该功能或已" +"将其禁用。" #: src/app/main/errors.cljs msgid "errors.feature-not-supported" msgstr "不支持功能“%s”。" -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "看起来当前启用的功能,与正在打开的文件所依赖的功能不匹配。在打开文件前,需要应用对“%s”修改。" - #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -917,9 +818,6 @@ msgstr "确认密码必须保持一致" msgid "errors.password-too-short" msgstr "密码最少需要8位字符" -msgid "errors.paste-data-validation" -msgstr "剪切板中为无效数据" - msgid "errors.profile-blocked" msgstr "个人资料已被屏蔽" @@ -933,10 +831,6 @@ msgstr "你设置了邮件免打扰(报告垃圾邮件或者多次退信)。 msgid "errors.registration-disabled" msgstr "当前禁止注册。" -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "检测到不兼容功能“%s”" - msgid "errors.team-leave.insufficient-members" msgstr "离开团队后成员不足,您可能要将其删除。" @@ -956,13 +850,6 @@ msgstr "发生了意料之外的错误。" msgid "errors.unexpected-token" msgstr "未知的令牌" -msgid "errors.validation" -msgstr "验证错误" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "文件具有不兼容的版本号" - msgid "errors.webhooks.connection" msgstr "连接错误,无法访问 URL" @@ -1192,9 +1079,6 @@ msgstr "无" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "首字母大写" -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "取消设置" - msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "大写" @@ -1259,10 +1143,6 @@ msgstr "快捷方式" msgid "labels.accept" msgstr "接受" -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.access-tokens" -msgstr "访问令牌" - msgid "labels.active" msgstr "激活" @@ -1364,9 +1244,6 @@ msgstr "删除邀请" msgid "labels.delete-multi-files" msgstr "删除%s个文件" -msgid "labels.discard" -msgstr "丢弃" - #: src/app/main/ui/dashboard/projects.cljs, #: src/app/main/ui/dashboard/sidebar.cljs, #: src/app/main/ui/dashboard/files.cljs, @@ -1592,9 +1469,6 @@ msgstr "角色" msgid "labels.save" msgstr "保存" -msgid "labels.search" -msgstr "搜索" - msgid "labels.search-font" msgstr "搜索字体" @@ -1619,9 +1493,6 @@ msgstr "服务不可用" msgid "labels.settings" msgstr "设置" -msgid "labels.share" -msgstr "分享" - msgid "labels.share-prototype" msgstr "分享原型" @@ -1691,31 +1562,10 @@ msgstr "(你)" msgid "labels.your-account" msgstr "你的账户" -msgid "media.choose-image" -msgstr "选择图片" - -msgid "media.gradient" -msgstr "渐变" - -msgid "media.image" -msgstr "图片" - -msgid "media.linear" -msgstr "线性" - #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "正在加载图片…" -msgid "media.radial" -msgstr "径向" - -msgid "media.solid" -msgstr "纯色" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "你的库是空白的。一旦添加为共享库,此文档库中的素材就可被用于你的其他文档中。你确定要发布它吗?" - #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -1755,30 +1605,6 @@ msgstr "修改电子邮件" msgid "modals.change-email.title" msgstr "修改你的电子邮件" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.copy-token" -msgstr "复制令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.expiration-date.label" -msgstr "到期时间" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.label" -msgstr "名称" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.placeholder" -msgstr "名称可以帮你记住令牌的用途" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.submit-label" -msgstr "创建令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.title" -msgstr "生成访问令牌" - msgid "modals.create-webhook.submit-label" msgstr "创建webhook" @@ -1791,18 +1617,6 @@ msgstr "有效负载网址" msgid "modals.create-webhook.url.placeholder" msgstr "https://example.com/postreceive" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.accept" -msgstr "删除令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.message" -msgstr "你确定想要删除这个令牌吗?" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.title" -msgstr "删除令牌" - #: src/app/main/ui/settings/delete_account.cljs msgid "modals.delete-account.cancel" msgstr "取消操作并保留我的账号" @@ -1831,12 +1645,6 @@ msgstr "你确定想要删除这个对话?该讨论串里的所有评论都会 msgid "modals.delete-comment-thread.title" msgstr "删除对话" -msgid "modals.delete-component-annotation.message" -msgstr "你确定想要删除这个注释?" - -msgid "modals.delete-component-annotation.title" -msgstr "删除注释" - #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-file-confirm.accept" msgstr "删除文档" @@ -1900,18 +1708,6 @@ msgid_plural "modals.delete-shared-confirm.accept" msgstr[0] "删除文件" msgstr[1] "批量删除文件" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.no-files-message" -msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "" -msgstr[1] "" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.scd-message" -msgid_plural "modals.delete-shared-confirm.activated.scd-message" -msgstr[0] "该库被以下文档使用: " -msgstr[1] "这些库被以下文档使用: " - #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-shared-confirm.message" @@ -2038,15 +1834,6 @@ msgstr "您是此团队的所有者,你确定想要将所有者转让给该成 msgid "modals.promote-owner-confirm.title" msgstr "新增团队所有者" -msgid "modals.publish-empty-library.accept" -msgstr "发布" - -msgid "modals.publish-empty-library.message" -msgstr "你的库是空白的。你确定想要发布它?" - -msgid "modals.publish-empty-library.title" -msgstr "发布空白库" - #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.remove-shared-confirm.accept" @@ -2117,10 +1904,6 @@ msgstr "你即将更新共享库中的一个组件。这可能会对使用该组 msgid "modals.update-remote-component.message" msgstr "更新共享库中的一个组件" -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "有新版本可用,请刷新页面" - #: src/app/main/ui/dashboard/team.cljs msgid "notifications.invitation-email-sent" msgstr "成功发送邀请" @@ -2192,33 +1975,12 @@ msgstr "贡献指南" msgid "onboarding-v2.welcome.title" msgstr "欢迎来到Penpot!" -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "继续创建团队" - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "以个人身份继续" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "创建团队 & 邀请" - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "创建团队并发送邀请" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "你可以稍后再邀请成员" - msgid "onboarding.choice.team-up.create-team-desc" msgstr "命名团队后,您将能够邀请他人加入。" msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "输入团队名称" -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "创建团队" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "创建团队但暂不邀请" - msgid "onboarding.choice.team-up.invite-members" msgstr "邀请成员" @@ -2228,12 +1990,6 @@ msgstr "记得将开发人员、设计师、经理……等各类人员都加进 msgid "onboarding.choice.team-up.roles" msgstr "邀请角色:" -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "以个人身份开始" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "你可以稍后再创建团队。" - msgid "onboarding.newsletter.accept" msgstr "是的,订阅" @@ -2280,166 +2036,14 @@ msgstr "Penpot" msgid "profile.recovery.go-to-login" msgstr "去登录" -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "你最熟悉哪个设计工具?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "11-30" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "31-50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "非常多" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Adobe XD" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Canva" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "设计师" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "开发者" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "深入了解Penpot的精彩之处" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Figma" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "创始人/副总裁" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "我是一名自由职业者" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "从我的团队项目获得邀请码 " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "...界面设计,视觉素材,设计系统等。" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "InVision" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "给我的团队项目做反馈" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "让我们开始吧!" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "产品经理/项目经理" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "市场营销" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "50以上" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "下一项" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "无" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "其他(请注明)" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "我在做个人项目" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "前一项" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "你计划用Penpot做什么?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "你是哪种身份?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Sketch" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "开始" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "开始着手我的项目" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "学生/教师" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "你的团队有多少人?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "试用Penpot,来看它是否适合团队 " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "在本地部署Penpot前进行试用" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "...线框图,用户轨迹和用户流程,导航树等。" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "从事概念构想的工作" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "你的反馈将帮助我们更好地理解你的习惯和偏好,以便我们不断改进Penpot,使其成为一个有用且好用的工具。" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "settings.multiple" -msgstr "混合" +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "settings.multiple" +msgstr "混合" # SECTIONS msgid "shortcut-section.basics" @@ -2803,9 +2407,6 @@ msgstr "选择所有" msgid "shortcuts.select-next" msgstr "选择下一个图层" -msgid "shortcuts.select-parent-layer" -msgstr "选择上级图层" - msgid "shortcuts.select-prev" msgstr "选择上一个图层" @@ -2833,18 +2434,6 @@ msgstr "启用测量" msgid "shortcuts.stop-measure" msgstr "停止测量" -msgid "shortcuts.text-align-center" -msgstr "水平居中" - -msgid "shortcuts.text-align-justify" -msgstr "两端对齐" - -msgid "shortcuts.text-align-left" -msgstr "靠左对齐" - -msgid "shortcuts.text-align-right" -msgstr "靠右对齐" - msgid "shortcuts.thumbnail-set" msgstr "设置缩略图" @@ -2918,10 +2507,6 @@ msgstr "变焦镜头放大" msgid "shortcuts.zoom-selected" msgstr "缩放到选定对象" -#: src/app/main/ui/dashboard/team.cljs -msgid "team.webhooks.max-length" -msgstr "Webhook的名称最多包含2048个字符。" - #: src/app/main/ui/dashboard/files.cljs msgid "title.dashboard.files" msgstr "%s - Penpot" @@ -2950,10 +2535,6 @@ msgstr "共享库 - %s - Penpot" msgid "title.default" msgstr "Penpot - 面向团队,设计自由" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "title.settings.access-tokens" -msgstr "个人资料 — 访问令牌" - #: src/app/main/ui/settings/feedback.cljs msgid "title.settings.feedback" msgstr "提交反馈 - Penpot" @@ -3148,9 +2729,6 @@ msgstr "本地库" msgid "workspace.assets.not-found" msgstr "未找到素材" -msgid "workspace.assets.open-library" -msgstr "打开库文档" - #: src/app/main/ui/workspace/sidebar/sitemap.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs @@ -3171,10 +2749,6 @@ msgid_plural "workspace.assets.selected-count" msgstr[0] "已选中%s个物件" msgstr[1] "已选中%s个物件" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "共享库" - #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" @@ -3371,10 +2945,6 @@ msgstr "未保存的修改" msgid "workspace.header.viewer" msgstr "预览模式(%s)" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom" -msgstr "缩放" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.zoom-fill" msgstr "填充 - 填充比例" @@ -3395,21 +2965,6 @@ msgstr "全屏" msgid "workspace.header.zoom-selected" msgstr "缩放到选定的位置" -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "编辑网格" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "退出" - -msgid "workspace.layout_grid.editor.title" -msgstr "编辑网格" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "完成" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "定位" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "添加" @@ -3418,14 +2973,6 @@ msgstr "添加" msgid "workspace.libraries.colors" msgstr "%s种颜色" -#: src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.empty-palette" -msgstr "你的库中还没有颜色风格" - -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "你的库中还没有排版风格" - #: src/app/main/ui/workspace/colorpicker/libraries.cljs, #: src/app/main/ui/workspace/colorpalette.cljs msgid "workspace.libraries.colors.file-library" @@ -3512,10 +3059,6 @@ msgstr "%s个排版" msgid "workspace.libraries.update" msgstr "更新" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "查看所有修改" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.updates" msgstr "更新" @@ -3547,21 +3090,6 @@ msgstr "剪辑内容" msgid "workspace.options.component" msgstr "组件" -msgid "workspace.options.component.annotation" -msgstr "注释" - -msgid "workspace.options.component.copy" -msgstr "复制" - -msgid "workspace.options.component.create-annotation" -msgstr "创建注释" - -msgid "workspace.options.component.edit-annotation" -msgstr "编辑注释" - -msgid "workspace.options.component.swap.empty" -msgstr "你的库中还没有素材" - #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "限制条件" @@ -3655,10 +3183,6 @@ msgstr "填充" msgid "workspace.options.flows.add-flow-start" msgstr "增加流程起点" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "流程" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "流程起点" @@ -4308,26 +3832,14 @@ msgstr "边框" msgid "workspace.options.stroke-cap.circle-marker" msgstr "圆形标记" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "圆形" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "钻石标记" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "钻石" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "箭头" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "箭头" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "无边框" @@ -4344,18 +3856,10 @@ msgstr "方头" msgid "workspace.options.stroke-cap.square-marker" msgstr "方形标记" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "矩形" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "三角箭头" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "三角形" - msgid "workspace.options.stroke-color" msgstr "线条颜色" @@ -4530,9 +4034,6 @@ msgstr "对接节点 (%s)" msgid "workspace.shape.menu.add-flex" msgstr "添加弹性布局" -msgid "workspace.shape.menu.add-grid" -msgstr "添加网格布局" - #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.back" msgstr "移至底层" @@ -4545,9 +4046,6 @@ msgstr "向下移动一层" msgid "workspace.shape.menu.copy" msgstr "复制" -msgid "workspace.shape.menu.create-annotation" -msgstr "创建注释" - #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.create-artboard-from-selection" msgstr "转为画板" @@ -4556,9 +4054,6 @@ msgstr "转为画板" msgid "workspace.shape.menu.create-component" msgstr "创建组件" -msgid "workspace.shape.menu.create-multiple-components" -msgstr "创建多个组件" - #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.cut" msgstr "剪切" @@ -4826,13 +4321,6 @@ msgstr "文本(%s)" msgid "workspace.toolbar.text-palette" msgstr "排字式样 (%s)" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**检查模式**(不可编辑)" - -msgid "workspace.top-bar.read-only.done" -msgstr "完成" - #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "目前没有历史修改" @@ -4952,10 +4440,6 @@ msgstr "历史" msgid "workspace.updates.dismiss" msgstr "忽略" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "更多信息" - #: src/app/main/data/workspace/libraries.cljs msgid "workspace.updates.there-are-updates" msgstr "共享库有更新" @@ -4966,3 +4450,524 @@ msgstr "更新" msgid "workspace.viewport.click-to-close-path" msgstr "单击以闭合路径" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "定位" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "完成" + +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "编辑网格" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "退出" + +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "你的库中还没有排版风格" + +msgid "workspace.options.component.swap.empty" +msgstr "你的库中还没有素材" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "流程" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "钻石" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "箭头" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "矩形" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "三角形" + +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**检查模式**(不可编辑)" + +msgid "workspace.top-bar.read-only.done" +msgstr "完成" + +msgid "media.solid" +msgstr "纯色" + +msgid "media.linear" +msgstr "线性" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "你目前还没有令牌。" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "名称是必填项" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "180天" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "30天" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "60天" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "90天" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "从不" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "已经于%s到期" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "个人访问令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "令牌将于%s到期" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "将于%s到期" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.no-expiration" +msgstr "无到期时限" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "文件具有不兼容的版本号" + +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "看起来当前启用的功能,与正在打开的文件所依赖的功能不匹配。在打开文件前,需要" +"应用对“%s”修改。" + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "检测到不兼容功能“%s”" + +msgid "errors.validation" +msgstr "验证错误" + +msgid "errors.paste-data-validation" +msgstr "剪切板中为无效数据" + +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "取消设置" + +msgid "labels.share" +msgstr "分享" + +msgid "labels.search" +msgstr "搜索" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "你的库是空白的。一旦添加为共享库,此文档库中的素材就可被用于你的其他文档中。" +"你确定要发布它吗?" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.copy-token" +msgstr "复制令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.expiration-date.label" +msgstr "到期时间" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "名称" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.placeholder" +msgstr "名称可以帮你记住令牌的用途" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "创建令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "生成访问令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "删除令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.message" +msgstr "你确定想要删除这个令牌吗?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.scd-message" +msgid_plural "modals.delete-shared-confirm.activated.scd-message" +msgstr[0] "该库被以下文档使用: " +msgstr[1] "这些库被以下文档使用: " + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "" +msgstr[1] "" + +msgid "modals.publish-empty-library.accept" +msgstr "发布" + +msgid "modals.publish-empty-library.message" +msgstr "你的库是空白的。你确定想要发布它?" + +msgid "modals.publish-empty-library.title" +msgstr "发布空白库" + +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "有新版本可用,请刷新页面" + +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "继续创建团队" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "你可以稍后再创建团队。" + +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "以个人身份开始" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "以个人身份继续" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "创建团队并发送邀请" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "创建团队但暂不邀请" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "创建团队 & 邀请" + +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "创建团队" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "你可以稍后再邀请成员" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "...界面设计,视觉素材,设计系统等。" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "无" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "其他(请注明)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "我在做个人项目" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "前一项" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "你计划用Penpot做什么?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Sketch" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "开始着手我的项目" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "学生/教师" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "开始" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "试用Penpot,来看它是否适合团队 " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "在本地部署Penpot前进行试用" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "从事概念构想的工作" + +#: src/app/main/ui/dashboard/team.cljs +msgid "team.webhooks.max-length" +msgstr "Webhook的名称最多包含2048个字符。" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "个人资料 — 访问令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "令牌无到期时限" + +msgid "workspace.shape.menu.add-grid" +msgstr "添加网格布局" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "给我的团队项目做反馈" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "品牌设计、插图、营销物料等。" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "非常多" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "...线框图,用户轨迹和用户流程,导航树等。" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "你最熟悉哪个设计工具?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "InVision" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "50以上" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "我是一名自由职业者" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.copied-success" +msgstr "已复制令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "生成新令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "点击“生成新令牌”按钮来生成一个。" + +msgid "labels.discard" +msgstr "丢弃" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "创始人/副总裁" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "从我的团队项目获得邀请码 " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "让我们开始吧!" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "市场营销" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "下一项" + +msgid "shortcuts.text-align-center" +msgstr "水平居中" + +msgid "shortcuts.text-align-left" +msgstr "靠左对齐" + +msgid "shortcuts.text-align-justify" +msgstr "两端对齐" + +msgid "workspace.options.component.annotation" +msgstr "注释" + +msgid "workspace.options.component.copy" +msgstr "复制" + +msgid "workspace.options.component.create-annotation" +msgstr "创建注释" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "圆形" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "更多信息" + +msgid "modals.delete-component-annotation.message" +msgstr "你确定想要删除这个注释?" + +msgid "workspace.shape.menu.create-annotation" +msgstr "创建注释" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canva" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "删除令牌" + +msgid "modals.delete-component-annotation.title" +msgstr "删除注释" + +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "你的库中还没有颜色风格" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "设计师" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "开发者" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "深入了解Penpot的精彩之处" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "产品经理/项目经理" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "你是哪种身份?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "你的团队有多少人?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "你的反馈将帮助我们更好地理解你的习惯和偏好,以便我们不断改进Penpot,使其成为" +"一个有用且好用的工具。" + +msgid "shortcuts.select-parent-layer" +msgstr "选择上级图层" + +msgid "shortcuts.text-align-right" +msgstr "靠右对齐" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "查看所有修改" + +msgid "workspace.assets.open-library" +msgstr "打开库文档" + +msgid "workspace.options.component.edit-annotation" +msgstr "编辑注释" + +msgid "workspace.shape.menu.create-multiple-components" +msgstr "创建多个组件" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "共享库" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "缩放" + +msgid "workspace.layout_grid.editor.title" +msgstr "编辑网格" + +msgid "media.radial" +msgstr "径向" + +msgid "media.gradient" +msgstr "渐变" + +msgid "media.choose-image" +msgstr "选择图片" + +msgid "media.image" +msgstr "图片" + +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "姓名必须包含一些空格以外的字符。" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "姓名最多包含250个字符。" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "密码必须包含一些空格以外的字符。" + +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "创建新账号,即代表你同意我们的[服务条例](%s)和[隐私政策](%s)。" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "成功创建访问令牌。" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "个人访问令牌可被理解为密码认证的代替选项,常用于允许(第三方)应用访问Penpot" +"内部API" + +msgid "errors.cannot-upload" +msgstr "无法上传该媒体文件。" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "访问令牌" -- Gitee From 727836af7630ac043377f4b55fb2979bc5bc4ca2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Fri, 9 Feb 2024 16:33:44 +0000 Subject: [PATCH 0347/1266] :globe_with_meridians: Add translations for: Turkish. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/ --- frontend/translations/tr.po | 59 ++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/frontend/translations/tr.po b/frontend/translations/tr.po index f1ef022f9..25ee0d42f 100644 --- a/frontend/translations/tr.po +++ b/frontend/translations/tr.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-01-28 11:01+0000\n" +"PO-Revision-Date: 2024-02-10 15:02+0000\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" @@ -5193,3 +5193,60 @@ msgid "workspace.options.export-object" msgid_plural "workspace.options.export-object" msgstr[0] "1 ögeyi dışa aktar" msgstr[1] "%s ögeyi dışa aktar" + +msgid "shortcuts.toggle-theme" +msgstr "Temayı değiştir" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "Açık temaya geç" + +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Koyu temaya geç" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Yükleniyor…" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Sola 1 sütun ekle" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Sağa 1 sütun ekle" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Sütunu sil" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Sütun ve şekilleri sil" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Yinelenen satır" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Satırı sil" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Hücreleri birleştir" + +msgid "workspace.context-menu.grid-cells.area" +msgstr "Alan oluştur" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Çalışma yüzeyi oluştur" + +msgid "dashboard.import.analyze-error.components-v2" +msgstr "" +"Bileşenler v2 ile dosya etkinleştirildi ancak bu takım henüz bunu " +"desteklemiyor." + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Yinelenen sütun" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Yukarıya 1 satır ekle" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Aşağıya 1 satır ekle" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Satır ve şekilleri sil" -- Gitee From b4853fca7a3aad44ef5a7719c9ad3f728e26b7bd Mon Sep 17 00:00:00 2001 From: Revenant Date: Fri, 9 Feb 2024 14:51:25 +0000 Subject: [PATCH 0348/1266] :globe_with_meridians: Add translations for: Malay. Currently translated at 52.0% (709 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ms/ --- frontend/translations/ms.po | 2353 ++++++++++++++++++++++++++++++++++- 1 file changed, 2352 insertions(+), 1 deletion(-) diff --git a/frontend/translations/ms.po b/frontend/translations/ms.po index 110f93eca..862241857 100644 --- a/frontend/translations/ms.po +++ b/frontend/translations/ms.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-09 13:58+0000\n" +"PO-Revision-Date: 2024-02-10 15:02+0000\n" "Last-Translator: Revenant \n" "Language-Team: Malay \n" @@ -416,3 +416,2354 @@ msgstr "Cipta akaun" #: src/app/main/ui/export.cljs msgid "dashboard.export-frames.title" msgstr "Eksport sebagai PDF" + +msgid "dashboard.loading-fonts" +msgstr "memuatkan fon anda…" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-multi" +msgstr "Pindahkan fail %s ke" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-other-team" +msgstr "Pindah ke pasukan lain" + +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/files.cljs +msgid "dashboard.new-file" +msgstr "+ Fail Baharu" + +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-file-prefix" +msgstr "Fail Baharu" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.new-project" +msgstr "+ Projek baharu" + +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-project-prefix" +msgstr "Projek Baharu" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.no-matches-for" +msgstr "Tiada padanan ditemui untuk \"%s\"" + +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.notifications.password-saved" +msgstr "Kata laluan berjaya disimpan!" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.num-of-members" +msgstr "%s ahli" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.open-in-new-tab" +msgstr "Buka fail dalam tab baharu" + +msgid "dashboard.options" +msgstr "Pilihan" + +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.password-change" +msgstr "Tukar kata laluan" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-theme" +msgstr "Pilih tema" + +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.show-all-files" +msgstr "Tunjukkan semua fail" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-delete-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "Fail anda telah berjaya dipadamkan" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-delete-project" +msgstr "Projek anda telah berjaya dipadamkan" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-duplicate-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "Fail anda telah berjaya dibuat pendua" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-duplicate-project" +msgstr "Projek anda telah berjaya dibuat pendua" + +#: src/app/main/ui/dashboard/grid.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-file" +msgstr "Fail anda berjaya dialihkan" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-files" +msgstr "Fail anda telah berjaya dialihkan" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-move-project" +msgstr "Projek anda berjaya dialihkan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-info" +msgstr "Maklumat pasukan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-members" +msgstr "Anggota kumpulan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-projects" +msgstr "Projek pasukan" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.theme-change" +msgstr "Tema UI" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.title-search" +msgstr "Hasil carian" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.type-something" +msgstr "Taip untuk hasil carian" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.unpublish-shared" +msgstr "Nyahterbit Perpustakaan" + +#: src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs +msgid "dashboard.update-settings" +msgstr "Kemas kini tetapan" + +msgid "dashboard.webhooks.active" +msgstr "Adalah aktif" + +msgid "dashboard.webhooks.active.explain" +msgstr "Apabila cangkuk ini dicetuskan, butiran peristiwa akan dihantar" + +msgid "dashboard.webhooks.content-type" +msgstr "Jenis kandungan" + +msgid "dashboard.webhooks.create" +msgstr "Cipta webhook" + +msgid "dashboard.webhooks.create.success" +msgstr "Webhook berjaya dihasilkan." + +msgid "dashboard.webhooks.description" +msgstr "" +"Webhooks adalah cara mudah untuk membolehkan tapak web dan apl lain " +"dimaklumkan apabila acara tertentu berlaku di Penpot. Kami akan menghantar " +"permintaan POST ke setiap URL yang anda berikan." + +#: src/app/main/ui/settings.cljs +msgid "dashboard.your-account-title" +msgstr "Akaun anda" + +msgid "errors.bad-font" +msgstr "Fon %s tidak dapat dimuatkan" + +msgid "errors.cannot-upload" +msgstr "Tidak boleh memuat naik fail media." + +#: src/app/main/data/workspace.cljs +msgid "errors.clipboard-not-implemented" +msgstr "Pelayar anda tidak dapat melakukan operasi ini" + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs +msgid "errors.email-already-exists" +msgstr "E-mel sudah digunakan" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.email-already-validated" +msgstr "E-mel sudah disahkan." + +msgid "errors.email-as-password" +msgstr "Anda tidak boleh menggunakan e-mel sebagai kata laluan" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.email-has-permanent-bounces" +msgstr "E-mel «%s» mempunyai banyak laporan lantunan kekal." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs +msgid "errors.email-invalid" +msgstr "Sila masukkan e-mel yang sah" + +#: src/app/main/ui/settings/change_email.cljs +msgid "errors.email-invalid-confirmation" +msgstr "E-mel pengesahan mesti sepadan" + +msgid "errors.email-spam-or-permanent-bounces" +msgstr "E-mel «%s» telah dilaporkan sebagai spam atau melantun secara kekal." + +#: src/app/main/errors.cljs +msgid "errors.feature-mismatch" +msgstr "" +"Nampaknya anda sedang membuka fail yang mendayakan ciri '%s' tetapi versi " +"penpot semasa tidak menyokongnya atau menyahdayakannya." + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Fail mempunyai nombor versi yang tidak serasi" + +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Nampaknya terdapat ketidakpadanan antara ciri yang didayakan dan ciri fail " +"yang anda cuba buka. Migrasi untuk '%s' perlu digunakan sebelum fail boleh " +"dibuka." + +#: src/app/main/errors.cljs +msgid "errors.feature-not-supported" +msgstr "Ciri '%s' tidak disokong." + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Ciri tidak serasi '%s' dikesan" + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.generic" +msgstr "Sesuatu yang tidak kena telah berlaku." + +#: src/app/main/ui/components/color_input.cljs +msgid "errors.invalid-color" +msgstr "Warna tidak sah" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.invite-invalid" +msgstr "Jemputan tidak sah" + +msgid "errors.invite-invalid.info" +msgstr "Jemputan ini mungkin dibatalkan atau mungkin tamat tempoh." + +#: src/app/main/ui/auth/login.cljs +msgid "errors.ldap-disabled" +msgstr "Pengesahan LDAP dilumpuhkan." + +#: src/app/main/errors.cljs +msgid "errors.max-quote-reached" +msgstr "Anda telah mencapai petikan '%s'. Hubungi sokongan." + +#: src/app/main/data/workspace/persistence.cljs +msgid "errors.media-too-large" +msgstr "Imej terlalu besar untuk dimasukkan." + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "errors.media-type-mismatch" +msgstr "Nampaknya kandungan imej tidak sepadan dengan sambungan fail." + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "errors.media-type-not-allowed" +msgstr "Nampaknya ini bukan imej yang sah." + +#: src/app/main/ui/dashboard/team.cljs +msgid "errors.member-is-muted" +msgstr "" +"Profil yang anda jemput mempunyai e-mel yang diredamkan (laporan spam atau " +"lantunan tinggi)." + +#: src/app/main/ui/settings/password.cljs +msgid "errors.password-invalid-confirmation" +msgstr "Kata laluan pengesahan mesti sepadan" + +#: src/app/main/ui/settings/password.cljs +msgid "errors.password-too-short" +msgstr "Kata laluan hendaklah sekurang-kurangnya 8 aksara" + +msgid "errors.profile-blocked" +msgstr "Profil disekat" + +#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.profile-is-muted" +msgstr "" +"Profil anda mempunyai e-mel yang diredamkan (laporan spam atau lantunan " +"tinggi)." + +#: src/app/main/ui/auth/register.cljs +msgid "errors.registration-disabled" +msgstr "Pendaftaran dilumpuhkan pada masa ini." + +msgid "errors.team-leave.insufficient-members" +msgstr "" +"Ahli tidak mencukupi untuk meninggalkan pasukan, anda mungkin mahu " +"memadamkannya." + +msgid "errors.team-leave.member-does-not-exists" +msgstr "Ahli yang anda cuba tetapkan tidak wujud." + +msgid "errors.team-leave.owner-cant-leave" +msgstr "" +"Pemilik tidak boleh meninggalkan pasukan, anda mesti menetapkan semula " +"peranan pemilik." + +#: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "errors.unexpected-error" +msgstr "Ralat yang tidak dijangka berlaku." + +msgid "errors.webhooks.connection" +msgstr "Ralat sambungan, URL tidak dapat dicapai" + +msgid "errors.webhooks.invalid-uri" +msgstr "URL tidak lulus pengesahan." + +msgid "errors.webhooks.last-delivery" +msgstr "Penghantaran terakhir tidak berjaya." + +msgid "errors.webhooks.ssl-validation" +msgstr "Ralat pada pengesahan SSL." + +msgid "errors.webhooks.unexpected" +msgstr "Ralat yang tidak dijangka semasa mengesahkan" + +msgid "errors.webhooks.unexpected-status" +msgstr "Status tidak dijangka %s" + +#: src/app/main/ui/auth/login.cljs +msgid "errors.wrong-credentials" +msgstr "E-mel atau kata laluan tidak betul." + +#: src/app/main/ui/settings/password.cljs +msgid "errors.wrong-old-password" +msgstr "Kata laluan lama tidak betul" + +msgid "errors.validation" +msgstr "Ralat Pengesahan" + +msgid "errors.paste-data-validation" +msgstr "Data tidak sah dalam papan klip" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.description" +msgstr "Penerangan" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-go-to" +msgstr "Pergi ke forum Penpot" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-subtitle1" +msgstr "" +"Kami berbesar hati anda berada disini. Jika anda memerlukan bantuan, sila " +"cari sebelum anda menyiarkan siaran baharu." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.title" +msgstr "E-mel" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-go-to" +msgstr "Pergi ke Twitter" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-subtitle1" +msgstr "Kami di sini untuk membantu dengan pertanyaan teknikal anda." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-title" +msgstr "Akaun sokongan Twitter" + +#: src/app/main/ui/settings/password.cljs +msgid "generic.error" +msgstr "Ralat telah berlaku" + +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur" +msgstr "Kabur" + +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur.value" +msgstr "Nilai" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hex" +msgstr "HEX" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hsla" +msgstr "HSLA" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.rgba" +msgstr "RGBA" + +#: src/app/main/ui/inspect/attributes/fill.cljs +msgid "inspect.attributes.fill" +msgstr "Isi" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.download" +msgstr "Muat turun sumber gambar" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.width" +msgstr "Lebar" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout" +msgstr "Susun atur" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.height" +msgstr "Tinggi" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.height" +msgstr "Tinggi" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.left" +msgstr "kiri" + +#: src/app/main/ui/inspect/attributes/layout.cljs, src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.radius" +msgstr "Jejari" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.rotation" +msgstr "Putaran" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.size" +msgstr "Ukuran dan kedudukan" + +#: src/app/main/ui/inspect/attributes/stroke.cljs +#, fuzzy +msgid "inspect.attributes.stroke" +msgstr "Gurisan" + +#, permanent +msgid "inspect.attributes.stroke.alignment.center" +msgstr "Tengah" + +#, permanent +msgid "inspect.attributes.stroke.alignment.inner" +msgstr "Dalam" + +#, permanent +msgid "inspect.attributes.stroke.alignment.outer" +msgstr "Luar" + +msgid "inspect.attributes.stroke.style.dotted" +msgstr "Bertitik" + +msgid "inspect.attributes.stroke.style.mixed" +msgstr "bercampur" + +msgid "inspect.attributes.stroke.style.none" +msgstr "Tiada" + +msgid "inspect.attributes.stroke.style.solid" +msgstr "Padu" + +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke.width" +msgstr "Lebar" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography" +msgstr "Tipografi" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-family" +msgstr "Keluarga Fon" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-size" +msgstr "Saiz huruf" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-style" +msgstr "Gaya Huruf" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.letter-spacing" +msgstr "Jarak Huruf" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.line-height" +msgstr "Tinggi Garis" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-decoration" +msgstr "Hiasan Teks" + +msgid "inspect.attributes.typography.text-decoration.none" +msgstr "Tiada" + +msgid "inspect.attributes.typography.text-decoration.strikethrough" +msgstr "Tembus" + +#: src/app/main/ui/inspect/attributes/text.cljs +#, fuzzy +msgid "inspect.attributes.typography.text-transform" +msgstr "Transformasian Teks" + +msgid "inspect.attributes.typography.text-transform.lowercase" +msgstr "Huruf Kecil" + +msgid "inspect.attributes.typography.text-transform.none" +msgstr "Tiada" + +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Nyahset" + +msgid "inspect.attributes.typography.text-transform.titlecase" +msgstr "Huruf Tajuk" + +msgid "inspect.attributes.typography.text-transform.uppercase" +msgstr "Huruf Besar" + +msgid "inspect.empty.help" +msgstr "" +"Jika anda ingin mengetahui lebih lanjut tentang pemeriksaan reka bentuk, " +"lawati pusat bantuan Penpot" + +#, fuzzy +msgid "inspect.empty.more-info" +msgstr "Maklumat lanjut tentang inspect" + +msgid "inspect.empty.select" +msgstr "Pilih bentuk, papan atau kumpulan untuk memeriksa sifat dan kod mereka" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code" +msgstr "Kod" + +msgid "inspect.tabs.code.selected.circle" +msgstr "Bulatan" + +msgid "inspect.tabs.code.selected.component" +msgstr "Komponen" + +msgid "inspect.tabs.code.selected.curve" +msgstr "Lengkung" + +msgid "inspect.tabs.code.selected.frame" +msgstr "Papan" + +msgid "inspect.tabs.code.selected.group" +msgstr "Kumpulan" + +msgid "inspect.tabs.code.selected.image" +msgstr "Gambar" + +msgid "inspect.tabs.code.selected.mask" +msgstr "Maska" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code.selected.multiple" +msgstr "%s Dipilih" + +msgid "inspect.tabs.code.selected.path" +msgstr "Laluan" + +msgid "inspect.tabs.code.selected.rect" +msgstr "Segi empat tepat" + +msgid "inspect.tabs.code.selected.text" +msgstr "Teks" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.info" +msgstr "Maklumat" + +#: src/app/main/ui/workspace/header.cljs +msgid "label.shortcuts" +msgstr "Pintasan" + +msgid "labels.accept" +msgstr "Terima" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "Token capaian" + +msgid "labels.add-custom-font" +msgstr "Tambah fon tersuai" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.admin" +msgstr "Pentadbir" + +msgid "labels.and" +msgstr "dan" + +msgid "labels.back" +msgstr "Kembali" + +#: src/app/main/ui/static.cljs +msgid "labels.bad-gateway.desc-message" +msgstr "" +"Nampaknya anda perlu menunggu sebentar dan mencuba semula; kami sedang " +"melakukan penyelenggaraan kecil pelayan kami." + +#: src/app/main/ui/static.cljs +msgid "labels.bad-gateway.main-message" +msgstr "Ralat pelayan (Bad Gateway)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.cancel" +msgstr "Batal" + +msgid "labels.close" +msgstr "Tutup" + +#: src/app/main/ui/dashboard/comments.cljs +msgid "labels.comments" +msgstr "Komen" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.community" +msgstr "Komuniti" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.confirm-password" +msgstr "Sahkan kata laluan" + +msgid "labels.continue" +msgstr "Teruskan" + +msgid "labels.continue-with" +msgstr "Teruskan dengan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.copy-invitation-link" +msgstr "Salin pautan" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team.placeholder" +msgstr "Masukkan nama pasukan baharu" + +msgid "labels.custom-fonts" +msgstr "Fon tersuai" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.dashboard" +msgstr "Papan pemuka" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete" +msgstr "Padam" + +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment" +msgstr "Padam komen" + +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment-thread" +msgstr "Padam bebenang" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.delete-invitation" +msgstr "Padam jemputan" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete-multi-files" +msgstr "Padam fail %s" + +msgid "labels.discard" +msgstr "Buang" + +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.drafts" +msgstr "Draf" + +#: src/app/main/ui/comments.cljs +msgid "labels.edit" +msgstr "Sunting" + +msgid "labels.edit-file" +msgstr "Sunting fail" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.editor" +msgstr "Penyunting" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.expired-invitation" +msgstr "Tamat tempoh" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-disabled" +msgstr "Maklum balas dilumpuhkan" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-sent" +msgstr "Maklum balas dihantar" + +msgid "labels.font-family" +msgstr "Keluarga Fon" + +msgid "labels.font-providers" +msgstr "Pembekal fon" + +msgid "labels.font-variants" +msgstr "Gaya" + +msgid "labels.fonts" +msgstr "Fon" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.github-repo" +msgstr "Repositori Github" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.give-feedback" +msgstr "Beri maklum balas" + +msgid "labels.go-back" +msgstr "Pergi balik" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.hide-resolved-comments" +msgstr "Sembunyikan komen yang diselesaikan" + +msgid "labels.inactive" +msgstr "tidak aktif" + +msgid "labels.installed-fonts" +msgstr "Fon yang dipasang" + +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.main-message" +msgstr "Ralat Dalaman" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.invitations" +msgstr "Jemputan" + +#: src/app/main/ui/settings/options.cljs +msgid "labels.language" +msgstr "Bahasa" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.libraries-and-templates" +msgstr "Perpustakaan & Templat" + +msgid "labels.log-or-sign" +msgstr "Log masuk atau daftar" + +#: src/app/main/ui/settings.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.logout" +msgstr "Log keluar" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.member" +msgstr "Ahli" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.members" +msgstr "Ahli" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.new-password" +msgstr "Kata laluan baharu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.no-invitations" +msgstr "Tiada jemputan tertunda." + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.desc-message" +msgstr "" +"Halaman ini mungkin tidak wujud atau anda tiada kebenaran untuk mengaksesnya." + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.main-message" +msgstr "Alamak!" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.num-of-files" +msgid_plural "labels.num-of-files" +msgstr[0] "%s fail" + +msgid "labels.num-of-frames" +msgid_plural "labels.num-of-frames" +msgstr[0] "%s papan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.num-of-projects" +msgid_plural "labels.num-of-projects" +msgstr[0] "%s projek" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.old-password" +msgstr "Kata laluan lama" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.only-yours" +msgstr "Hanya milik anda" + +msgid "labels.or" +msgstr "atau" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.owner" +msgstr "Pemilik" + +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.rename" +msgstr "Namakan semula" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.resend-invitation" +msgstr "Hantar semula jemputan" + +#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs +msgid "labels.retry" +msgstr "Cuba semula" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.role" +msgstr "Peranan" + +msgid "labels.save" +msgstr "Simpan" + +msgid "labels.search-font" +msgstr "Cari fon" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.send" +msgstr "Hantar" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.sending" +msgstr "Menghantar…" + +#: src/app/main/ui/static.cljs +msgid "labels.service-unavailable.desc-message" +msgstr "Kami sedang menjalankan penyelenggaraan berjadual pada sistem kami." + +#: src/app/main/ui/static.cljs +msgid "labels.service-unavailable.main-message" +msgstr "Perkhidmatan Tidak Tersedia" + +msgid "labels.share-prototype" +msgstr "Kongsi prototaip" + +msgid "labels.share" +msgstr "Kongsi" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.shared-libraries" +msgstr "Perpustakaan" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-all-comments" +msgstr "Paparkan semua komen" + +msgid "labels.show-comments-list" +msgstr "Paparkan senarai komen" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-your-comments" +msgstr "Paparkan komen anda sahaja" + +msgid "labels.upload-custom-fonts" +msgstr "Muat naik fon tersuai" + +msgid "labels.view-only" +msgstr "LIHAT SAHAJA" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.viewer" +msgstr "Penonton" + +msgid "labels.webhooks" +msgstr "Cangkuk Web (Webhook)" + +#: src/app/main/ui/comments.cljs +msgid "labels.write-new-comment" +msgstr "Tulis komen baharu" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.you" +msgstr "(anda)" + +msgid "labels.search" +msgstr "Cari" + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "media.loading" +msgstr "Memuatkan gambar…" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.accept" +msgstr "Tambah sebagai Pustaka Kongsi" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.message" +msgstr "Tambah “%s” sebagai Pustaka Kongsi" + +#: src/app/main/ui/workspace/nudge.cljs +#, fuzzy +msgid "modals.big-nudge" +msgstr "Anjakan besar" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.info" +msgstr "" +"Kami akan menghantar e-mel ke e-mel semasa anda “%s” untuk pengesahan " +"identiti." + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.new-email" +msgstr "E-mel baharu" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.submit" +msgstr "Tukar e-mel" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.title" +msgstr "Tukar e-mel anda" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.copy-token" +msgstr "Salin token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.expiration-date.label" +msgstr "Tarikh tamat tempoh" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "Nama" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.placeholder" +msgstr "Nama boleh membantu untuk mengetahui token itu untuk apa" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "Cipta token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "Jana token capaian" + +msgid "modals.create-webhook.submit-label" +msgstr "Cipta cangkuk web (webhook)" + +msgid "modals.create-webhook.title" +msgstr "Cipta cangkuk web (webhook)" + +msgid "modals.create-webhook.url.label" +msgstr "URL muatan" + +msgid "modals.create-webhook.url.placeholder" +msgstr "https://example.com/postreceive" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "Padam token" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.cancel" +msgstr "Batal dan kekalkan akaun saya" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.title" +msgstr "Padam perbualan" + +msgid "modals.delete-component-annotation.message" +msgstr "Adakah anda pasti ingin memadamkan anotasi ini?" + +msgid "modals.delete-component-annotation.title" +msgstr "Padam anotasi" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.accept" +msgstr "Padam fail" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.title" +msgstr "Memadam fail" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.accept" +msgstr "Padam fail" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.message" +msgstr "Adakah anda pasti mahu memadamkan %s fail?" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.title" +msgstr "Memadamkan %s fail" + +msgid "modals.delete-font-variant.message" +msgstr "" +"Adakah anda pasti mahu memadamkan gaya fon ini? Ia tidak akan dimuatkan jika " +"digunakan dalam fail." + +msgid "modals.delete-font-variant.title" +msgstr "Memadam gaya fon" + +msgid "modals.delete-font.message" +msgstr "" +"Adakah anda pasti mahu memadamkan fon ini? Ia tidak akan dimuatkan jika " +"digunakan dalam fail." + +msgid "modals.delete-font.title" +msgstr "Memadam fon" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.body" +msgstr "Adakah anda pasti mahu memadamkan halaman ini?" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.title" +msgstr "Padam halaman" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.accept" +msgstr "Padam projek" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.message" +msgstr "Adakah anda pasti mahu memadamkan projek ini?" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.title" +msgstr "Padam projek" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.accept" +msgid_plural "modals.delete-shared-confirm.accept" +msgstr[0] "Padam fail" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "Ia tidak diaktifkan dalam mana-mana fail." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.scd-message" +msgid_plural "modals.delete-shared-confirm.activated.scd-message" +msgstr[0] "Pustaka ini diaktifkan di sini: " + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.message" +msgid_plural "modals.delete-shared-confirm.message" +msgstr[0] "Adakah anda pasti mahu memadamkan fail ini?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.title" +msgid_plural "modals.delete-shared-confirm.title" +msgstr[0] "Memadam fail" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.message" +msgstr "" +"Adakah anda pasti mahu memadamkan pasukan ini? Semua projek dan fail yang " +"dikaitkan dengan pasukan akan dipadamkan secara kekal." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.title" +msgstr "Memadam pasukan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.message" +msgstr "Adakah anda pasti mahu memadamkan ahli ini daripada pasukan?" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.title" +msgstr "Padam ahli pasukan" + +msgid "modals.delete-webhook.accept" +msgstr "Padam cangkuk web (webhook)" + +msgid "modals.delete-webhook.message" +msgstr "Adakah anda pasti mahu memadamkan cangkuk web (webhook) ini?" + +msgid "modals.delete-webhook.title" +msgstr "Memadam cangkuk web (webhook)" + +msgid "modals.edit-webhook.submit-label" +msgstr "Sunting cangkuk web (webhook)" + +msgid "modals.edit-webhook.title" +msgstr "Sunting cangkuk web (webhook)" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-member-confirm.accept" +msgstr "Hantar jemputan" + +msgid "modals.invite-member.emails" +msgstr "E-mel, dipisahkan dengan koma" + +msgid "modals.invite-member.repeated-invitation" +msgstr "" +"Sesetengah e-mel adalah daripada ahli pasukan semasa. Jemputan mereka tidak " +"akan dihantar." + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-team-member.title" +msgstr "Jemput ahli ke pasukan" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.hint" +msgstr "" +"Memandangkan anda satu-satunya ahli pasukan, pasukan ini akan dipadamkan " +"bersama-sama dengan projek dan failnya." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.message" +msgstr "Adakah anda pasti mahu meninggalkan pasukan %s?" + +msgid "modals.leave-and-reassign.forbidden" +msgstr "" +"Anda tidak boleh meninggalkan pasukan jika tiada ahli lain untuk dinaikkan " +"pangkat kepada pemilik. Anda mungkin mahu memadamkan pasukan." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.promote-and-leave" +msgstr "Naik pangkat dan tinggalkan" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.select-member-to-promote" +msgstr "Pilih ahli untuk dinaikkan pangkat" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.message" +msgstr "Adakah anda pasti mahu meninggalkan pasukan ini?" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.title" +msgstr "Meninggalkan pasukan" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.nudge-title" +msgstr "Jumlah anjakan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.accept" +msgstr "Pindah hak milik" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.hint" +msgstr "" +"Jika anda memindahkan pemilikan, anda akan menukar peranan anda kepada " +"Pentadbir, kehilangan beberapa kebenaran ke atas pasukan ini. " + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.message" +msgstr "" +"Anda adalah pemilik semasa pasukan ini. Adakah anda pasti mahu menjadikan %s " +"pemilik baharu pasukan?" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.title" +msgstr "Pemilik pasukan baru" + +msgid "modals.publish-empty-library.accept" +msgstr "Terbitkan" + +msgid "modals.publish-empty-library.message" +msgstr "Pustaka anda kosong. Adakah anda pasti mahu menerbitkannya?" + +msgid "modals.publish-empty-library.title" +msgstr "Terbitkan perpustakaan kosong" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.hint" +msgstr "" +"Setelah dialih keluar sebagai Pustaka Kongsi, Pustaka Fail fail ini akan " +"berhenti tersedia untuk digunakan di antara fail anda yang lain." + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.small-nudge" +msgstr "Anjakan kecil" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.accept" +msgid_plural "modals.unpublish-shared-confirm.accept" +msgstr[0] "Nyahterbit" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.activated.no-files-message" +msgid_plural "modals.unpublish-shared-confirm.activated.no-files-message" +msgstr[0] "Ia tidak diaktifkan dalam mana-mana fail." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.activated.scd-message" +msgid_plural "modals.unpublish-shared-confirm.activated.scd-message" +msgstr[0] "Perpustakaan ini diaktifkan di sini:" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.message" +msgid_plural "modals.unpublish-shared-confirm.message" +msgstr[0] "Adakah anda pasti mahu menyahterbitkan perpustakaan ini?" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.hint" +msgstr "" +"Anda akan mengemas kini komponen dalam pustaka kongsi. Ini mungkin " +"menjejaskan fail lain yang menggunakannya." + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.message" +msgstr "Kemas kini komponen dalam pustaka kongsi" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.accept" +msgstr "Kemas kini" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.cancel" +msgstr "Batal" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.hint" +msgstr "" +"Anda akan mengemas kini komponen dalam pustaka kongsi. Ini mungkin " +"menjejaskan fail lain yang menggunakannya." + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.message" +msgstr "Kemas kini komponen dalam pustaka kongsi" + +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "Versi baharu tersedia, sila muat semula halaman" + +#: src/app/main/ui/dashboard/team.cljs +msgid "notifications.invitation-email-sent" +msgstr "Jemputan berjaya dihantar" + +#: src/app/main/ui/dashboard/team.cljs +msgid "notifications.invitation-link-copied" +msgstr "Pautan jemputan disalin" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "notifications.profile-deletion-not-allowed" +msgstr "" +"Anda tidak boleh memadamkan profil anda. Tetapkan semula pasukan anda " +"sebelum meneruskan." + +#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs +msgid "notifications.profile-saved" +msgstr "Profil berjaya disimpan!" + +#: src/app/main/ui/settings/change_email.cljs +msgid "notifications.validation-email-sent" +msgstr "E-mel pengesahan dihantar kepada %s. Semak e-mel anda!" + +msgid "onboarding-v2.before-start.desc1" +msgstr "" +"Anda harus tahu bahawa terdapat banyak sumber yang tersedia untuk membantu " +"anda bermula dengan Penpot, seperti Panduan Pengguna dan saluran Youtube " +"kami." + +msgid "onboarding-v2.before-start.desc2" +msgstr "" +"Maklumat terperinci tentang cara menggunakan Penpot. Daripada prototaip " +"kepada menyusun atau berkongsi reka bentuk." + +msgid "onboarding-v2.before-start.desc2.title" +msgstr "Panduan pengguna" + +msgid "onboarding-v2.before-start.desc3" +msgstr "" +"Anda boleh menonton tutorial kami dan tutorial yang dibuat oleh komuniti " +"kami." + +msgid "onboarding-v2.before-start.desc3.title" +msgstr "Video tutorial" + +msgid "onboarding-v2.before-start.title" +msgstr "Sebelum anda mula" + +msgid "onboarding-v2.newsletter.desc" +msgstr "" +"Langgan surat berita Penpot untuk mengikuti perkembangan dan berita " +"pembangunan produk." + +msgid "onboarding-v2.newsletter.news" +msgstr "" +"Hantar kepada saya berita tentang Penpot (siaran blog, tutorial video, " +"penstriman...)." + +msgid "onboarding-v2.newsletter.privacy1" +msgstr "Kami mengambil berat tentang privasi, di sini anda boleh membaca. " + +msgid "onboarding-v2.newsletter.updates" +msgstr "" +"Hantar kepada saya kemas kini produk (ciri baharu, keluaran, pembetulan...)." + +msgid "onboarding-v2.welcome.desc1" +msgstr "" +"Penpot ialah Sumber Terbuka dan ia dibuat oleh Kaleidos serta komuniti, di " +"mana ramai orang sudah membantu antara satu sama lain. Semua orang boleh " +"bekerjasama dengan:" + +msgid "onboarding-v2.welcome.desc2" +msgstr "" +"Ruang awam untuk belajar, berkongsi dan membincangkan tentang Penpot, masa " +"kini dan masa depannya dengan seluruh Komuniti dan pasukan teras Penpot." + +msgid "onboarding-v2.welcome.desc3" +msgstr "" +"Di mana anda akan menemui cara untuk bekerjasama dengan terjemahan, " +"permintaan ciri, sumbangan teras, pemburuan pepijat…" + +msgid "onboarding-v2.welcome.desc3.title" +msgstr "Panduan memberi sumbangan" + +msgid "onboarding-v2.welcome.title" +msgstr "Selamat datang ke Penpot!" + +msgid "onboarding.choice.team-up.create-team-placeholder" +msgstr "Masukkan nama pasukan" + +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Teruskan mencipta pasukan" + +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Mulakan tanpa pasukan" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Anda boleh membuat pasukan kemudian." + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Buat pasukan tanpa menjemput" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Anda boleh menjemput kemudian" + +msgid "onboarding.choice.team-up.invite-members" +msgstr "Jemput ahli" + +msgid "onboarding.choice.team-up.invite-members-info" +msgstr "" +"Ingat untuk memasukkan semua orang. Pemaju, pereka bentuk, pengurus... " +"kepelbagaian bertambah :)" + +msgid "onboarding.choice.team-up.roles" +msgstr "Jemput dengan peranan:" + +msgid "onboarding.newsletter.accept" +msgstr "Ya, langgan" + +msgid "onboarding.newsletter.acceptance-message" +msgstr "" +"Permintaan langganan anda telah dihantar, kami akan menghantar e-mel kepada " +"anda untuk mengesahkannya." + +msgid "onboarding.newsletter.policy" +msgstr "Dasar Privasi." + +msgid "onboarding.newsletter.title" +msgstr "Ingin menerima berita Penpot?" + +msgid "onboarding.team-modal.create-team" +msgstr "Cipta pasukan" + +msgid "onboarding.team-modal.create-team-feature-1" +msgstr "Fail dan projek tanpa had" + +msgid "onboarding.team-modal.create-team-feature-2" +msgstr "Edisi berbilang pemain" + +msgid "onboarding.team-modal.create-team-feature-3" +msgstr "Pengurusan peranan" + +msgid "onboarding.team-modal.create-team-feature-4" +msgstr "Ahli tanpa had" + +msgid "onboarding.team-modal.create-team-feature-5" +msgstr "100% percuma!" + +msgid "onboarding.templates.subtitle" +msgstr "Berikut adalah beberapa templat." + +msgid "onboarding.templates.title" +msgstr "Mula mereka bentuk" + +msgid "onboarding.welcome.alt" +msgstr "Penpot" + +#: src/app/main/ui/auth/recovery.cljs +msgid "profile.recovery.go-to-login" +msgstr "Pergi ke log masuk" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "Alat reka bentuk yang manakah anda mempunyai lebih banyak pengalaman?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "Banyak" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canva" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "" +"Bagaimanakah cara terbaik anda menerangkan pengalaman anda bekerja pada..." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Pereka bentuk" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Pembangun" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "Ketahui lebih lanjut tentang Penpot" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Saya seorang pekerja bebas (freelancer)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... reka bentuk antara muka, aset visual, sistem reka bentuk, dsb." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "InVision" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Tinggalkan maklum balas untuk projek pasukan saya" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "Mari mulakan!" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Pengurus Produk atau Projek" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "Lebih daripada 50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-a-tool" +msgstr "Saya tidak pernah menggunakan alat reka bentuk sebelum ini" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Tiada" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Lain-lain (nyatakan)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "Saya sedang menjalankan projek peribadi" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "Sebelumnya" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Sketch" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Beberapa" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Mula" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Mula mengerjakan projek saya" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Pelajar atau guru" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "Berapakah saiz pasukan anda?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Uji Penpot untuk melihat sama ada ia sesuai untuk pasukan " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Cuba sebelum menggunakan Penpot pada pelayar peribadi" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "... rangka wayar, perjalanan & aliran pengguna, pepohon navigasi, dsb." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Bekerja dalam idea konsep" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Maklum balas anda akan membantu kami memahami tabiat dan keutamaan anda " +"supaya kami boleh terus menjadikan Penpot sebagai alat yang berguna dan " +"menyeronokkan." + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +#, fuzzy +msgid "settings.detach" +msgstr "Tanggalkan" + +# SECTIONS +msgid "shortcut-section.basics" +msgstr "Asas" + +msgid "shortcut-section.dashboard" +msgstr "Papan pemuka" + +msgid "shortcut-section.viewer" +msgstr "Penonton" + +msgid "shortcut-section.workspace" +msgstr "Ruang kerja" + +# SUBSECTIONS +msgid "shortcut-subsection.alignment" +msgstr "Penjajaran" + +msgid "shortcut-subsection.edit" +msgstr "Sunting" + +msgid "shortcut-subsection.general-dashboard" +msgstr "Generik" + +msgid "shortcut-subsection.general-viewer" +msgstr "Generik" + +msgid "shortcut-subsection.main-menu" +msgstr "Menu utama" + +msgid "shortcut-subsection.modify-layers" +msgstr "Ubah suai lapisan" + +msgid "shortcut-subsection.navigation-viewer" +msgstr "Navigasi" + +msgid "shortcut-subsection.navigation-workspace" +msgstr "Navigasi" + +msgid "shortcut-subsection.panels" +msgstr "Panel" + +msgid "shortcut-subsection.path-editor" +msgstr "laluan" + +msgid "shortcut-subsection.shape" +msgstr "Bentuk" + +msgid "shortcut-subsection.text-editor" +msgstr "Teks" + +msgid "shortcut-subsection.tools" +msgstr "Alatan" + +msgid "shortcut-subsection.zoom-viewer" +msgstr "Zum" + +msgid "shortcut-subsection.zoom-workspace" +msgstr "Zum" + +msgid "shortcuts.add-comment" +msgstr "Komen" + +msgid "shortcuts.add-node" +msgstr "Tambah nota" + +msgid "shortcuts.align-bottom" +msgstr "Sejajarkan bahagian bawah" + +msgid "shortcuts.align-center" +msgstr "Jajarkan tengah" + +msgid "shortcuts.align-hcenter" +msgstr "Jajarkan tengah secara mendatar" + +msgid "shortcuts.align-justify" +msgstr "Mengimbangkan keselarasan" + +msgid "shortcuts.align-left" +msgstr "Jajar ke kiri" + +msgid "shortcuts.align-right" +msgstr "Sejajar ke kanan" + +msgid "shortcuts.align-top" +msgstr "Jajarkan atas" + +msgid "shortcuts.align-vcenter" +msgstr "Jajarkan tengah secara menegak" + +msgid "shortcuts.artboard-selection" +msgstr "Cipta papan daripada pemilihan" + +msgid "shortcuts.bold" +msgstr "Togol tebal" + +msgid "shortcuts.bool-difference" +msgstr "Perbezaan Boolean" + +msgid "shortcuts.bool-exclude" +msgstr "Pengecualian Boolean" + +msgid "shortcuts.bool-intersection" +msgstr "Persimpangan Boolean" + +msgid "shortcuts.bool-union" +msgstr "Kesatuan Boolean" + +msgid "shortcuts.bring-backward" +msgstr "Hantar ke belakang" + +msgid "shortcuts.bring-back" +msgstr "Hantar ke paling belakang" + +msgid "shortcuts.bring-forward" +msgstr "Bawa ke hadapan" + +msgid "shortcuts.bring-front" +msgstr "Bawa ke paling hadapan" + +msgid "shortcuts.clear-undo" +msgstr "Kosongkan buat asal" + +msgid "shortcuts.copy" +msgstr "Salin" + +msgid "shortcuts.create-component" +msgstr "Cipta komponen" + +msgid "shortcuts.create-new-project" +msgstr "Buat baharu" + +msgid "shortcuts.decrease-zoom" +msgstr "Zum keluar" + +msgid "shortcuts.go-to-search" +msgstr "Cari" + +msgid "shortcuts.group" +msgstr "Kumpulan" + +msgid "shortcuts.h-distribute" +msgstr "Edarkan secara mendatar" + +msgid "shortcuts.hide-ui" +msgstr "Tunjukkan / Sembunyikan UI" + +msgid "shortcuts.increase-zoom" +msgstr "Zum kedalam" + +msgid "shortcuts.insert-image" +msgstr "Masukkan gambar" + +msgid "shortcuts.italic" +msgstr "Togol condong" + +msgid "shortcuts.join-nodes" +msgstr "Sambung nod" + +msgid "shortcuts.letter-spacing-dec" +msgstr "Kurangkan jarak huruf" + +msgid "shortcuts.letter-spacing-inc" +msgstr "Penambahan jarak huruf" + +msgid "dashboard.export-multi" +msgstr "Eksport fail Penpot %s" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-multiple.selected" +msgstr "%s daripada %s elemen dipilih" + +#: src/app/main/ui/workspace/header.cljs +msgid "dashboard.export-shapes" +msgstr "Eksport" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to" +msgstr "" +"Anda boleh menambah tetapan eksport ke elemen daripada sifat reka bentuk (di " +"bahagian bawah bar sisi kanan)." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to-link" +msgstr "Maklumat cara untuk menetapkan eksport di Penpot." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.no-elements" +msgstr "Tiada unsur dengan tetapan eksport." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.title" +msgstr "Eksport Pemilihan" + +msgid "dashboard.export-standard-multi" +msgstr "Muat turun %s fail standard (.svg + .json)" + +msgid "dashboard.export.detail" +msgstr "* Mungkin termasuk komponen, grafik, warna dan/atau tipografi." + +msgid "dashboard.export.explain" +msgstr "" +"Satu atau lebih fail yang anda ingin eksport menggunakan perpustakaan " +"kongsi. Apa yang anda mahu lakukan dengan aset mereka*?" + +msgid "dashboard.export.options.all.message" +msgstr "" +"fail dengan perpustakaan kongsi akan disertakan dalam eksport, mengekalkan " +"hubungannya." + +msgid "dashboard.export.options.all.title" +msgstr "Eksport perpustakaan kongsi" + +msgid "dashboard.export.options.detach.message" +msgstr "" +"Perpustakaan kongsi tidak akan disertakan dalam eksport dan tiada aset akan " +"ditambahkan ke perpustakaan. " + +msgid "dashboard.export.options.detach.title" +msgstr "Anggap aset perpustakaan kongsi sebagai objek asas" + +msgid "dashboard.export.options.merge.message" +msgstr "" +"Fail anda akan dieksport dengan semua aset luaran digabungkan ke dalam " +"pustaka fail." + +msgid "dashboard.export.options.merge.title" +msgstr "Sertakan aset perpustakaan kongsi dalam pustaka fail" + +msgid "dashboard.export.title" +msgstr "Eksport fail" + +msgid "dashboard.fonts.deleted-placeholder" +msgstr "Fon hilang" + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.dismiss-all" +msgstr "Tolak semua" + +msgid "dashboard.fonts.empty-placeholder" +msgstr "Fon tersuai yang anda muat naik akan dipaparkan di sini." + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.fonts-added" +msgid_plural "dashboard.fonts.fonts-added" +msgstr[0] "%s fon ditambah" + +#, markdown +msgid "dashboard.fonts.hero-text1" +msgstr "" +"Sebarang fon web yang anda muat naik di sini akan ditambahkan pada senarai " +"keluarga fon yang tersedia pada sifat teks fail pasukan ini. Fon dengan nama " +"keluarga fon yang sama akan dikumpulkan sebagai **keluarga fon tunggal**. " +"Anda boleh memuat naik fon dengan format berikut: **TTF, OTF dan WOFF** (" +"hanya satu sahaja diperlukan)." + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.upload-all" +msgstr "Muat naik semua" + +#, markdown +msgid "dashboard.fonts.warning-text" +msgstr "" +"Kami telah mengesan kemungkinan masalah dalam fon anda yang berkaitan dengan " +"metrik menegak untuk sistem pengendalian yang berbeza. Untuk menyemaknya, " +"anda boleh menggunakan perkhidmatan metrik menegak fon seperti [ini](https" +"://vertical-metrics.netlify.app/). Selain itu, kami mengesyorkan menggunakan " +"[Transfonter](https://transfonter.org/) untuk menjana fon web dan " +"membetulkan ralat. " + +msgid "dashboard.import" +msgstr "Import fail Penpot" + +msgid "dashboard.import.analyze-error" +msgstr "Alamak! Kami tidak dapat mengimport fail ini" + +#: src/app/main/ui/dashboard/team.cljs +#, fuzzy +msgid "labels.pending-invitation" +msgstr "Belum selesai" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.profile" +msgstr "Profil" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.projects" +msgstr "Projek" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.release-notes" +msgstr "Nota keluaran" + +#: src/app/main/ui/workspace.cljs +msgid "labels.reload-file" +msgstr "Muat semula fail" + +#: src/app/main/ui/workspace/libraries.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.remove" +msgstr "Alih keluar" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.remove-member" +msgstr "Buang ahli" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.rename-team" +msgstr "Namakan semula pasukan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.status" +msgstr "Status" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.tutorials" +msgstr "Tutorial" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.unpublish-multi-files" +msgstr "Nyahterbitkan %s fail" + +#: src/app/main/ui/settings/profile.cljs +msgid "labels.update" +msgstr "Kemas kini" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.update-team" +msgstr "Kemas kini pasukan" + +msgid "labels.upload" +msgstr "Muat naik" + +msgid "labels.uploading" +msgstr "Memuat naik…" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.message" +msgstr "" +"Adakah anda pasti mahu memadamkan perbualan ini? Semua komen dalam urutan " +"ini akan dipadamkan." + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.confirm" +msgstr "Ya, padam akaun saya" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.info" +msgstr "" +"Dengan mengalih keluar akaun anda, anda akan kehilangan semua projek dan " +"arkib semasa anda." + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.title" +msgstr "Adakah anda pasti mahu memadam akaun anda?" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.accept" +msgstr "Padam perbualan" + +msgid "shortcut-subsection.navigation-dashboard" +msgstr "Navigasi" + +msgid "shortcuts.duplicate" +msgstr "Pendua" + +msgid "shortcuts.escape" +msgstr "Batal" + +msgid "shortcuts.export-shapes" +msgstr "Eksport bentuk" + +msgid "shortcuts.fit-all" +msgstr "Zum untuk muat semua" + +msgid "shortcuts.flip-horizontal" +msgstr "Terbalikkan secara mendatar" + +msgid "shortcuts.flip-vertical" +msgstr "Terbalikkan secara menegak" + +msgid "shortcuts.font-size-dec" +msgstr "Kurangkan saiz fon" + +#, markdown +msgid "dashboard.fonts.hero-text2" +msgstr "" +"Anda hanya perlu memuat naik fon yang anda miliki atau mempunyai lesen untuk " +"digunakan dalam Penpot. Ketahui lebih lanjut dalam bahagian Hak kandungan [" +"Syarat Perkhidmatan Penpot](https://penpot.app/terms.html). Anda juga " +"mungkin ingin membaca tentang [pelesenan fon](https://www.typography.com/" +"faq)." + +msgid "dashboard.import.analyze-error.components-v2" +msgstr "" +"Fail dengan komponen v2 diaktifkan tetapi pasukan ini belum menyokongnya " +"lagi." + +msgid "dashboard.import.progress.process-components" +msgstr "Memproses komponen" + +msgid "dashboard.import.progress.process-media" +msgstr "Memproses media" + +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.loading-files" +msgstr "memuatkan fail anda…" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to" +msgstr "Berpindah ke" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.no-projects-placeholder" +msgstr "Projek yang disemat akan muncul di sini" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-changed-successfully" +msgstr "Alamat e-mel anda telah berjaya dikemas kini" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-verified-successfully" +msgstr "Alamat e-mel anda telah berjaya disahkan" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.pin-unpin" +msgstr "Semat/Nyahsemat" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.remove-account" +msgstr "Mahu mengalih keluar akaun anda?" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.projects-title" +msgstr "Projek" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.remove-shared" +msgstr "Alih keluar sebagai Pustaka Dikongsi" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.search-placeholder" +msgstr "Cari…" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.save-settings" +msgstr "Simpan tetapan" + +#: src/app/main/ui/confirm.cljs +msgid "ds.component-subtitle" +msgstr "Komponen untuk dikemas kini:" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.searching-for" +msgstr "Mencari \"%s\"…" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-language" +msgstr "Pilih Bahasa UI" + +msgid "dashboard.import.import-error" +msgstr "Terdapat masalah mengimport fail. Fail tidak diimport." + +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "%s fail telah berjaya diimport." + +msgid "dashboard.import.import-warning" +msgstr "Sesetengah fail mengandungi objek tidak sah telah dialih keluar." + +msgid "dashboard.import.progress.process-colors" +msgstr "memproses warna" + +msgid "dashboard.import.progress.process-page" +msgstr "Memproses halaman: %s" + +msgid "dashboard.import.progress.process-typographies" +msgstr "Memproses tipografi" + +msgid "dashboard.import.progress.upload-data" +msgstr "Memuat naik data ke pelayan (%s/%s)" + +msgid "dashboard.import.progress.upload-media" +msgstr "Memuat naik fail: %s" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.invite-profile" +msgstr "Jemput orang ramai" + +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.leave-team" +msgstr "Tinggalkan pasukan" + +msgid "dashboard.libraries-and-templates" +msgstr "Perpustakaan & Templat" + +msgid "dashboard.libraries-and-templates.explore" +msgstr "Terokai lebih banyak daripada mereka dan ketahui cara untuk menyumbang" + +msgid "dashboard.libraries-and-templates.import-error" +msgstr "Terdapat masalah mengimport templat. Templat tidak diimport." + +#: src/app/main/ui/dashboard/libraries.cljs +msgid "dashboard.libraries-title" +msgstr "Perpustakaan" + +msgid "dashboard.webhooks.empty.no-webhooks" +msgstr "Tiada webhook dibuat setakat ini." + +msgid "dashboard.webhooks.empty.add-one" +msgstr "Tekan butang \"Tambah webhook\" untuk menambahnya." + +msgid "dashboard.webhooks.update.success" +msgstr "Webhook berjaya dikemas kini." + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-email" +msgstr "E-mel" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-name" +msgstr "Nama anda" + +#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.your-penpot" +msgstr "Penpot anda" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-ok" +msgstr "Ok" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-title" +msgstr "Perhatian" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-cancel" +msgstr "Batal" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-ok" +msgstr "Ok" + +#: src/app/main/ui/confirm.cljs, src/app/main/ui/confirm.cljs +msgid "ds.confirm-title" +msgstr "Adakah anda pasti?" + +#: src/app/main/ui/auth/login.cljs +msgid "errors.auth-provider-not-configured" +msgstr "Pembekal pengesahan tidak dikonfigurasikan." + +msgid "errors.auth.unable-to-login" +msgstr "Nampaknya anda belum disahkan atau sesi telah tamat tempoh." + +msgid "errors.bad-font-plural" +msgstr "Fon %s tidak dapat dimuatkan" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.unexpected-token" +msgstr "Token tidak diketahui" + +msgid "errors.webhooks.timeout" +msgstr "Masa tamat" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-title" +msgstr "Komuniti Penpot" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subject" +msgstr "Subjek" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subtitle" +msgstr "" +"Sila terangkan sebab e-mel anda, nyatakan sama ada isu, idea atau keraguan. " +"Seorang ahli pasukan kami akan menjawab secepat mungkin." + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.top" +msgstr "Atas" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.width" +msgstr "Lebar" + +#: src/app/main/ui/inspect/attributes/shadow.cljs +msgid "inspect.attributes.shadow" +msgstr "Bayang" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-weight" +msgstr "Berat Huruf" + +msgid "inspect.attributes.typography.text-decoration.underline" +msgstr "Garis bawah" + +msgid "inspect.tabs.code.selected.svg-raw" +msgstr "SVG" + +msgid "labels.active" +msgstr "Aktif" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.all" +msgstr "Semua" + +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.desc-message" +msgstr "" +"Sesuatu yang buruk telah berlaku. Sila cuba semula operasi dan jika masalah " +"berterusan, hubungi sokongan." + +msgid "labels.continue-with-penpot" +msgstr "Anda boleh meneruskan dengan akaun Penpot" + +msgid "labels.export" +msgstr "Eksport" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "labels.create" +msgstr "Cipta" + +#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team" +msgstr "Cipta pasukan baharu" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs +msgid "labels.no-comments-available" +msgstr "" +"Anda telah melihat semua yang baru! Pemberitahuan ulasan baharu akan " +"dipaparkan di sini." + +#: src/app/main/ui/dashboard/team.cljs +#, markdown +msgid "labels.no-invitations-hint" +msgstr "Klik butang **Jemput orang** untuk menjemput orang ke pasukan ini." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.help-center" +msgstr "Pusat Bantuan" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.password" +msgstr "Kata laluan" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.settings" +msgstr "Tetapan" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "Padam token" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.message" +msgstr "Adakah anda pasti mahu memadamkan fail ini?" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.message" +msgstr "Adakah anda pasti mahu memadamkan token ini?" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.hint1" +msgstr "" +"Anda adalah pemilik pasukan ini. Sila pilih ahli lain untuk dinaikkan " +"pangkat kepada pemilik sebelum anda pergi." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.accept" +msgstr "Padam pasukan" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.your-account" +msgstr "Akaun anda" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Pustaka anda kosong. Setelah ditambahkan sebagai Pustaka Dikongsi, aset yang " +"anda buat akan tersedia untuk digunakan antara fail anda yang lain. Adakah " +"anda pasti mahu menerbitkannya?" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.accept" +msgstr "Padam ahli" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "" +"Aset yang telah digunakan dalam fail ini akan kekal di sana (tiada reka " +"bentuk akan rosak)." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.hint" +msgstr "" +"Setelah ditambahkan sebagai Pustaka Kongsi, aset pustaka fail ini akan " +"tersedia untuk digunakan antara fail anda yang lain." + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.confirm-email" +msgstr "Sahkan e-mel baharu" + +#: src/app/main/ui/dashboard/sidebar.cljs +#, fuzzy +msgid "modals.leave-and-reassign.title" +msgstr "Sebelum anda pergi" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.accept" +msgstr "Tinggalkan pasukan" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.accept" +msgstr "Alih keluar sebagai Pustaka Kongsi" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.message" +msgstr "Alih keluar \"%s\" sebagai Pustaka Kongsi" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.title" +msgid_plural "modals.unpublish-shared-confirm.title" +msgstr[0] "Nyahterbit pustaka" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Teruskan tanpa pasukan" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Pemasaran" + +msgid "onboarding-v2.welcome.desc2.title" +msgstr "Mengambil bahagian dalam Komuniti" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Buat pasukan dan hantar jemputan" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Seterusnya" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Buat pasukan & jemput" + +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Cipta pasukan" + +msgid "onboarding.choice.team-up.create-team-desc" +msgstr "" +"Selepas menamakan pasukan anda, anda akan dapat menjemput orang untuk " +"menyertai." + +msgid "onboarding-v2.newsletter.privacy2" +msgstr "" +"Kami hanya akan menghantar e-mel yang berkaitan kepada anda. Anda boleh " +"berhenti melanggan pada bila-bila masa melalui pautan nyahlanggan dalam mana-" +"mana surat berita kami." + +msgid "onboarding.team-modal.create-team-desc" +msgstr "" +"Pasukan membolehkan anda bekerjasama dengan pengguna Penpot lain yang " +"bekerja dalam fail dan projek yang sama." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Pengasas/VP" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Dapatkan kod daripada projek pasukan saya " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Bagaimanakah anda merancang untuk menggunakan Penpot?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Apakah peranan anda?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Pilih pilihan" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "settings.multiple" +msgstr "Bercampur" + +msgid "shortcuts.cut" +msgstr "Potong" + +msgid "shortcuts.delete" +msgstr "Padam" + +msgid "shortcuts.draw-curve" +msgstr "Lengkung" + +msgid "shortcuts.delete-node" +msgstr "Padamkan nod" + +msgid "shortcuts.font-size-inc" +msgstr "Tambah saiz fon" + +msgid "shortcuts.go-to-drafts" +msgstr "Pergi ke draf" + +msgid "shortcuts.go-to-libs" +msgstr "Pergi ke perpustakaan kongsi" + +msgid "shortcuts.detach-component" +msgstr "Tanggalkan komponen" + +msgid "shortcuts.draw-ellipse" +msgstr "elips" + +msgid "shortcuts.draw-frame" +msgstr "Papan" + +msgid "shortcuts.draw-nodes" +msgstr "Lukis laluan" + +msgid "shortcuts.draw-path" +msgstr "Laluan" + +msgid "shortcuts.draw-text" +msgstr "Teks" + +msgid "shortcuts.draw-rect" +msgstr "Segi empat tepat" -- Gitee From 9369cf2d944b6cb4d499de0b58bc8dc769758328 Mon Sep 17 00:00:00 2001 From: Stas Haas Date: Mon, 12 Feb 2024 12:19:51 +0000 Subject: [PATCH 0349/1266] :globe_with_meridians: Add translations for: German. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/ --- frontend/translations/de.po | 59 ++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/frontend/translations/de.po b/frontend/translations/de.po index fe563da32..051e038d4 100644 --- a/frontend/translations/de.po +++ b/frontend/translations/de.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-01-23 15:01+0000\n" +"PO-Revision-Date: 2024-02-12 19:01+0000\n" "Last-Translator: Stas Haas \n" "Language-Team: German \n" @@ -5175,3 +5175,60 @@ msgstr "" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow" msgstr "Flow" + +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Zum dunklen Theme wechseln" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Laden…" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Spalte löschen" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Spalte und Formen löschen" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Zeile duplizieren" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Zeile löschen" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Zeile und Formen löschen" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Zellen zusammenführen" + +msgid "workspace.context-menu.grid-cells.area" +msgstr "Bereich erstellen" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Board erstellen" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "1 Spalte links einfügen" + +msgid "shortcuts.toggle-theme" +msgstr "Theme ändern" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "Zum hellen Theme wechseln" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Spalte duplizieren" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "1 Zeile unterhalb einfügen" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "1 Zeile oberhalb einfügen" + +msgid "dashboard.import.analyze-error.components-v2" +msgstr "" +"Datei mit Komponenten v2 aktiviert, aber dieses Team unterstützt es noch " +"nicht." + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "1 Spalte rechts einfügen" -- Gitee From f3b68725d3ef213fe71640e69e14197536f056a7 Mon Sep 17 00:00:00 2001 From: TheScientistPT Date: Mon, 12 Feb 2024 15:26:14 +0000 Subject: [PATCH 0350/1266] :globe_with_meridians: Add translations for: Portuguese (Portugal). Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/ --- frontend/translations/pt_PT.po | 59 +++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/frontend/translations/pt_PT.po b/frontend/translations/pt_PT.po index 3bd8735be..0b0abda0c 100644 --- a/frontend/translations/pt_PT.po +++ b/frontend/translations/pt_PT.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-12-29 21:08+0000\n" +"PO-Revision-Date: 2024-02-12 19:02+0000\n" "Last-Translator: TheScientistPT \n" "Language-Team: Portuguese (Portugal) \n" @@ -5187,3 +5187,60 @@ msgstr "Funcionalidade incompatível '%s' detetada" #, markdown msgid "workspace.top-bar.read-only" msgstr "**Modo de inspeção** (Somente leitura)" + +msgid "shortcuts.toggle-theme" +msgstr "Mudar tema" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "Mudar para tema claro" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Duplicar coluna" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Adicionar 1 coluna à esquerda" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Adicionar 1 coluna à direita" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Eliminar coluna" + +msgid "workspace.context-menu.grid-cells.area" +msgstr "Criar área" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Apagar coluna e conteúdos" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Duplicar fila" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Adicionar 1 fila acima" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Apagar fila" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Apagar fila e conteúdos" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Unir células" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Criar prancheta" + +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Alterar para tema escuro" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "A carregar…" + +msgid "dashboard.import.analyze-error.components-v2" +msgstr "" +"Ficheiro exportado com componentes v2 mas a equipa atual ainda não os " +"suporta." + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Adicionar 1 fila abaixo" -- Gitee From 99417bd124d572cdfcc94c3a618f1958581cd4c2 Mon Sep 17 00:00:00 2001 From: Stephan Paternotte Date: Sun, 11 Feb 2024 18:37:40 +0000 Subject: [PATCH 0351/1266] :globe_with_meridians: Add translations for: Dutch. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/ --- frontend/translations/nl.po | 59 ++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/frontend/translations/nl.po b/frontend/translations/nl.po index 3e7a9bc04..396dd4648 100644 --- a/frontend/translations/nl.po +++ b/frontend/translations/nl.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-12-29 21:08+0000\n" +"PO-Revision-Date: 2024-02-12 19:02+0000\n" "Last-Translator: Stephan Paternotte \n" "Language-Team: Dutch \n" @@ -5168,3 +5168,60 @@ msgstr "Incompatibele functie '%s' gedetecteerd" #, markdown msgid "workspace.top-bar.read-only" msgstr "** Inspectiemodus ** (alleen bekijken)" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Laden…" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Links 1 kolom toevoegen" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Rij dupliceren" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Boven 1 rij toevoegen" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Onder 1 rij toevoegen" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Rij verwijderen" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Rij en vormen verwijderen" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Cellen samenvoegen" + +msgid "workspace.context-menu.grid-cells.area" +msgstr "Gebied aanmaken" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Bord aanmaken" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Rechts 1 kolom toevoegen" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Kolom verwijderen" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Kolom en vormen verwijderen" + +msgid "dashboard.import.analyze-error.components-v2" +msgstr "" +"Bestand met componenten v2 geactiveerd, maar dit team ondersteunt dit nog " +"niet." + +msgid "shortcuts.toggle-theme" +msgstr "Thema veranderen" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "Licht thema inschakelen" + +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Donker thema inschakelen" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Kolom dupliceren" -- Gitee From d5827562a361b722486680b9f621be33013991be Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 13 Feb 2024 07:31:10 +0100 Subject: [PATCH 0352/1266] :globe_with_meridians: Added translation for: Yoruba. --- frontend/translations/yo.po | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 frontend/translations/yo.po diff --git a/frontend/translations/yo.po b/frontend/translations/yo.po new file mode 100644 index 000000000..4f8f6e6de --- /dev/null +++ b/frontend/translations/yo.po @@ -0,0 +1,2 @@ +msgid "" +msgstr "X-Generator: Weblate\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit" \ No newline at end of file -- Gitee From 80b635af6702649719df856d9dbabc8274b9140c Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 13 Feb 2024 06:48:41 +0000 Subject: [PATCH 0353/1266] :globe_with_meridians: Add translations for: Yoruba. Currently translated at 1.5% (21 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/yo/ --- frontend/translations/yo.po | 100 +++++++++++++++++++++++++++++++++++- 1 file changed, 99 insertions(+), 1 deletion(-) diff --git a/frontend/translations/yo.po b/frontend/translations/yo.po index 4f8f6e6de..3bfbe5043 100644 --- a/frontend/translations/yo.po +++ b/frontend/translations/yo.po @@ -1,2 +1,100 @@ msgid "" -msgstr "X-Generator: Weblate\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit" \ No newline at end of file +msgstr "" +"PO-Revision-Date: 2024-02-13 06:56+0000\n" +"Last-Translator: Alejandro Alonso \n" +"Language-Team: Yoruba \n" +"Language: yo\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.4-dev\n" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.check-your-email" +msgstr "" +"yẹ ímeèlì rẹ wò kí o tẹ ọ̀nà-àsopọ̀ láti mọ̀ dájú àti láti bẹ̀rẹ̀ sí lo " +"pẹ́ńpọtì." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.confirm-password" +msgstr "jẹ́rìísí ọ̀rọ̀-ìgbaniwọlé" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-oidc-submit" +msgstr "ṣílẹ̀kuǹ ìdánimọ̀" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.new-password" +msgstr "tẹ ọ̀rọ̀ ìgbaniwọlé tuntun" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-account" +msgstr "ṣẹ̀dá ìfihàn àkáùntí" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-profile" +msgstr "kàn fẹ́ gbìyànjú ú rẹ̀?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.demo-warning" +msgstr "" +"\"\"This is a DEMO service, DO NOT USE for real work, the projects will be " +"parẹ́ lóòrèkóòrè." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.email" +msgstr "ímeèlì" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.forgot-password" +msgstr "gbàgbé ọ̀rọ̀-ìgbaniwọlé ?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.fullname" +msgstr "orúkọ lẹ́kùnn-ún-rẹ́rẹ́" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.login-here" +msgstr "wọlé síbí" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-submit" +msgstr "wọlé" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-title" +msgstr "ó dára láti rí ẹ lẹ́ẹ̀kan sí i!" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-github-submit" +msgstr "ibùdó gítì" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-gitlab-submit" +msgstr "láàbù gítì" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-google-submit" +msgstr "ṣàwárí" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-ldap-submit" +msgstr "LDAP" + +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "orúkọ kíkọ gbọ́dọ̀ jẹ̀ lẹ́tà láìsí àlàfo ." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "orúkọ kò gbọdọ̀ ju àádọ́jọ́ lẹ́tà lọ." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.invalid-token-error" +msgstr "àmì àtúnwárí ti díbàjẹ́." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.password-changed-successfully" +msgstr "ọ̀rọ̀-ìgbaniwọlé ti yí padà dáadáa" -- Gitee From 0eb35f352a41e0a79b9225c43cad6360a3efdf19 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 13 Feb 2024 08:12:28 +0100 Subject: [PATCH 0354/1266] :globe_with_meridians: Deleted translation: Yoruba. --- frontend/translations/yo.po | 100 ------------------------------------ 1 file changed, 100 deletions(-) delete mode 100644 frontend/translations/yo.po diff --git a/frontend/translations/yo.po b/frontend/translations/yo.po deleted file mode 100644 index 3bfbe5043..000000000 --- a/frontend/translations/yo.po +++ /dev/null @@ -1,100 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2024-02-13 06:56+0000\n" -"Last-Translator: Alejandro Alonso \n" -"Language-Team: Yoruba \n" -"Language: yo\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.4-dev\n" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.check-your-email" -msgstr "" -"yẹ ímeèlì rẹ wò kí o tẹ ọ̀nà-àsopọ̀ láti mọ̀ dájú àti láti bẹ̀rẹ̀ sí lo " -"pẹ́ńpọtì." - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.confirm-password" -msgstr "jẹ́rìísí ọ̀rọ̀-ìgbaniwọlé" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-oidc-submit" -msgstr "ṣílẹ̀kuǹ ìdánimọ̀" - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.new-password" -msgstr "tẹ ọ̀rọ̀ ìgbaniwọlé tuntun" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-account" -msgstr "ṣẹ̀dá ìfihàn àkáùntí" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-profile" -msgstr "kàn fẹ́ gbìyànjú ú rẹ̀?" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.demo-warning" -msgstr "" -"\"\"This is a DEMO service, DO NOT USE for real work, the projects will be " -"parẹ́ lóòrèkóòrè." - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.email" -msgstr "ímeèlì" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.forgot-password" -msgstr "gbàgbé ọ̀rọ̀-ìgbaniwọlé ?" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.fullname" -msgstr "orúkọ lẹ́kùnn-ún-rẹ́rẹ́" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.login-here" -msgstr "wọlé síbí" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-submit" -msgstr "wọlé" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "ó dára láti rí ẹ lẹ́ẹ̀kan sí i!" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-github-submit" -msgstr "ibùdó gítì" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-gitlab-submit" -msgstr "láàbù gítì" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-google-submit" -msgstr "ṣàwárí" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-ldap-submit" -msgstr "LDAP" - -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "orúkọ kíkọ gbọ́dọ̀ jẹ̀ lẹ́tà láìsí àlàfo ." - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "orúkọ kò gbọdọ̀ ju àádọ́jọ́ lẹ́tà lọ." - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.invalid-token-error" -msgstr "àmì àtúnwárí ti díbàjẹ́." - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.password-changed-successfully" -msgstr "ọ̀rọ̀-ìgbaniwọlé ti yí padà dáadáa" -- Gitee From 4e6dd0975375074334d179da88b502908f2ec1e8 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 13 Feb 2024 08:13:03 +0100 Subject: [PATCH 0355/1266] :globe_with_meridians: Added translation for: Igbo. --- frontend/translations/ig.po | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 frontend/translations/ig.po diff --git a/frontend/translations/ig.po b/frontend/translations/ig.po new file mode 100644 index 000000000..4f8f6e6de --- /dev/null +++ b/frontend/translations/ig.po @@ -0,0 +1,2 @@ +msgid "" +msgstr "X-Generator: Weblate\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit" \ No newline at end of file -- Gitee From 5d899df4567cea008e3899041582043e19901a17 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 13 Feb 2024 08:55:28 +0100 Subject: [PATCH 0356/1266] :globe_with_meridians: Added translation for: Yoruba. --- frontend/translations/yo.po | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 frontend/translations/yo.po diff --git a/frontend/translations/yo.po b/frontend/translations/yo.po new file mode 100644 index 000000000..4f8f6e6de --- /dev/null +++ b/frontend/translations/yo.po @@ -0,0 +1,2 @@ +msgid "" +msgstr "X-Generator: Weblate\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit" \ No newline at end of file -- Gitee From f5d7dc7c5cd0570f52d94d03e10d95e7353fa4c2 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 13 Feb 2024 07:52:31 +0000 Subject: [PATCH 0357/1266] :globe_with_meridians: Add translations for: Igbo. Currently translated at 40.0% (546 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ig/ --- frontend/translations/ig.po | 2103 ++++++++++++++++++++++++++++++++++- 1 file changed, 2102 insertions(+), 1 deletion(-) diff --git a/frontend/translations/ig.po b/frontend/translations/ig.po index 4f8f6e6de..c45887bb5 100644 --- a/frontend/translations/ig.po +++ b/frontend/translations/ig.po @@ -1,2 +1,2103 @@ msgid "" -msgstr "X-Generator: Weblate\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit" \ No newline at end of file +msgstr "" +"PO-Revision-Date: 2024-02-14 08:02+0000\n" +"Last-Translator: Alejandro Alonso \n" +"Language-Team: Igbo " +"\n" +"Language: ig\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.4-dev\n" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-title" +msgstr "Ihe ịtụnanya ịhụ gị !" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-github-submit" +msgstr "Obi Git" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-gitlab-submit" +msgstr "Ụlọ nchọcha Git" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-google-submit" +msgstr "Gọgụlụ" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-ldap-submit" +msgstr "LDAP" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.no-expiration" +msgstr "Enweghị ụbọchị mmebi" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "Ọdịmara nkeonwe" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "Ọdịmara ga-emebi na%s" + +msgid "dashboard.fonts.deleted-placeholder" +msgstr "Mkpụrụ edemede na-efu efu" + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.upload-all" +msgstr "Bugo ha niile" + +msgid "dashboard.import.progress.process-media" +msgstr "Nhazi mgbasa ozi" + +msgid "dashboard.import.progress.process-page" +msgstr "Nhazi ihu akwụkwọ : %s" + +msgid "dashboard.import.progress.process-typographies" +msgstr "Nhazi akara nkụpụta" + +msgid "dashboard.import.progress.upload-data" +msgstr "Ibugo njatụle n'ebe nkesa (%s/%s)" + +msgid "dashboard.libraries-and-templates" +msgstr "Ọba ederede gasị & ndebiri" + +msgid "dashboard.libraries-and-templates.explore" +msgstr "Nyocha ọtụtụ n'ime ha ma mara etu ị ga-esi tinye ọnụ" + +msgid "dashboard.libraries-and-templates.import-error" +msgstr "E nwere nsogbu ibu aba ndebiri . E bubataghị ndebiri." + +#: src/app/main/ui/dashboard/libraries.cljs +msgid "dashboard.libraries-title" +msgstr "Ọba ederede gasị" + +msgid "dashboard.options" +msgstr "Nhọrọ gasị" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.projects-title" +msgstr "Arụmarụ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.search-placeholder" +msgstr "Chọọ…" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.searching-for" +msgstr "Na-achọ “%s“…" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-language" +msgstr "Họrọ asụsụ UI" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.theme-change" +msgstr "Isiokwu UI" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.title-search" +msgstr "Chọọ risọltụ gasị" + +#: src/app/main/ui/confirm.cljs, src/app/main/ui/confirm.cljs +msgid "ds.confirm-title" +msgstr "Ọ doro gị anya ?" + +msgid "errors.auth.unable-to-login" +msgstr "Ọ dị ka enyochaghị gị ma ọ bụ na oge agwụla ." + +msgid "errors.bad-font" +msgstr "E nweghị ike bugo %s mkpụrụ edide" + +msgid "errors.bad-font-plural" +msgstr "E nweghị ike bugo %s mkpụrụ edide" + +msgid "errors.cannot-upload" +msgstr "E nweghị ike ị ugo ederede ." + +#: src/app/main/data/workspace.cljs +msgid "errors.clipboard-not-implemented" +msgstr "Your browser cannot do this operation" + +msgid "errors.profile-blocked" +msgstr "A gbachiri nchịkọta agbachi" + +#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.profile-is-muted" +msgstr "" +"Nchịkọta gị lnwere ozi-n mechiri emechi(akụkọ ozi-n adịghị mma ma ọ bụ nwere " +"oké bịaghachiri ).\")." + +#: src/app/main/ui/auth/register.cljs +msgid "errors.registration-disabled" +msgstr "Ndebanye merụrụ emerụ ugbu a." + +msgid "errors.team-leave.owner-cant-leave" +msgstr "O wee enweghị ike ịhapụ otu, ị ga-enyegharịrị ọrụ onwee." + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.unexpected-token" +msgstr "Ọdịmara amaghị ama" + +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur.value" +msgstr "Uru" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hex" +msgstr "HEX" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hsla" +msgstr "HSLA" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.rgba" +msgstr "RGBA" + +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke" +msgstr "Akara" + +#, permanent +msgid "inspect.attributes.stroke.alignment.center" +msgstr "Etiti" + +msgid "labels.font-providers" +msgstr "Ndị na-enye mkpụrụ edide" + +msgid "labels.font-variants" +msgstr "Ụdịdị gasị" + +msgid "labels.fonts" +msgstr "Mkpụrụ edide gasị" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.github-repo" +msgstr "Ọ a Github" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.libraries-and-templates" +msgstr "Ọba ederede na Ndebiri gasị" + +msgid "labels.log-or-sign" +msgstr "Banye ma ọ bụ debanye" + +#: src/app/main/ui/dashboard/team.cljs +#, markdown +msgid "labels.no-invitations-hint" +msgstr "Pịa mpị**kpọọ ndị mmadụ ** ịkpọọ ndị mmadụ n'otu a." + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.desc-message" +msgstr "" +"Ihu akwụkwọ a nwere ike ọ gaghị adị ma ọ bụ ị nweghị ikikere inweta ya ." + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.main-message" +msgstr "E wuu !" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.old-password" +msgstr "Akara mpịbanye ochie" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.only-yours" +msgstr "Sọọsọ nke gị" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.pending-invitation" +msgstr "Na-echere" + +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.rename" +msgstr "Nyegharịa aha" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.rename-team" +msgstr "Nyegharịa otu" + +#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs +msgid "labels.retry" +msgstr "Nwagharịa" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.role" +msgstr "Ọrụ" + +msgid "labels.save" +msgstr "Dokwa" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.settings" +msgstr "Ntọala" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.shared-libraries" +msgstr "Ọba ederede" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-all-comments" +msgstr "Gosi nkwupụta niile" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.unpublish-multi-files" +msgstr "%s ederede ebipụtaghị" + +msgid "labels.upload" +msgstr "Bugo" + +msgid "modals.delete-font.title" +msgstr "Na-ehichapụ mkpụrụ edide" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.body" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ ihu akwụkwọ a?" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.title" +msgstr "Hichapụ ihu akwụkwọ" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.accept" +msgstr "Hichapụ arụmarụ" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.message" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ arụmarụ ?" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.title" +msgstr "Hichapụ arụmarụ" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "notifications.profile-deletion-not-allowed" +msgstr "" +"I nweghị ike ị hichapụ nchịkọta gị . Nyegharịa ya ndị otu gị tupu ị ganihu" + +#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs +msgid "notifications.profile-saved" +msgstr "E dọkwara nchịkọta nke ọma" + +#: src/app/main/ui/settings/change_email.cljs +msgid "notifications.validation-email-sent" +msgstr "Ozi nnyocha n zigara na%s. Mepe ozi n gị !" + +msgid "onboarding-v2.before-start.desc1" +msgstr "" +"I kwesịrị ịma na e nwere ọtụtụ ihe e ji arụ ọrụ dị inwere gị iji bido n'ite " +"mkpịsị , dị ka ntuziaka onye ọrụ na ọwa YouTube anyị l." + +msgid "onboarding-v2.before-start.desc2" +msgstr "" +"Ozi banyere etu esi eji ite mkpịsị arụ ọrụ uju. Site na ime atụtụ ga na " +"nhazi ma ọ bụ nkesa esereese ." + +msgid "onboarding-v2.before-start.title" +msgstr "Tupu i bido" + +msgid "onboarding-v2.newsletter.news" +msgstr "" +"Zitere m akụkọ banyere ite mkpịsị (ozi edemonye gasị, Nkụzi ihe onyonyo, " +"nkirigarị...)." + +msgid "onboarding.choice.team-up.invite-members" +msgstr "Kpọta ndị otu" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "Kedu ngwa ọrụ nse ị ka mara eji arụ ọrụ ?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "Iri na otu ruo na iri atọ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "Abụọ ruo na iri" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "Kedụ ka Ị ga-esi kọwaa ọfụma ihe ndị ị hụrụ ịrụ ọrụ na..." + +msgid "shortcuts.paste" +msgstr "Nyado" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.color-palette" +msgstr "Agba[ Palette (Na narị)" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.check-your-email" +msgstr "" +"Nyoo ozi- n gị ma pịa na njikọ inyocha ma bido jiri ite mkpịsị rụwa ọrụ ." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.confirm-password" +msgstr "kpebie akara mpibanye" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-account" +msgstr "mebeta akara ozigosi" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-profile" +msgstr "Chọọ nọọ ị nwa ya. ?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.demo-warning" +msgstr "" +"Ihe bụ ọrụ ozigosi ,e jile ya rụọ ezigbo ọrụ , ọrụ ndị a ga-ekpochapụ site " +"na oge ruo na oge" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.email" +msgstr "Ozi- n" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.forgot-password" +msgstr "Chefuru akara mpibanye ?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.fullname" +msgstr "Aha n'uju" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.login-here" +msgstr "Banye ebe a" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-submit" +msgstr "Banye" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-oidc-submit" +msgstr "Mepe ID" + +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "Aha ga-enweriri ụfọdụ mkpụrụ edemede karịa oghere ." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "Aha ga-enweriri ọ karịa mkpụrụ okwu narị abụọ na iri ise" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.register" +msgstr "E nweghị ebe Ntinye ihe ma kịta?" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.new-password" +msgstr "Pinye akara mpịbanye ọhụrụ" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.invalid-token-error" +msgstr "Ọdịmara e nweghachitere adabaghị ." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.password-changed-successfully" +msgstr "Akara mpịbanye a gbanwere gara aga" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.profile-not-verified" +msgstr "E nyochaghị nchịkọta , Biko nyocha nchịkọta tupu ị gaa n'ihu." + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.recovery-token-sent" +msgstr "E zigara akara njikọ nnweghachi akara mpibanye n'igbe mbata ozi gị ." + +#: src/app/main/ui/auth/verify_token.cljs +msgid "auth.notifications.team-invitation-accepted" +msgstr "Sonyere n'otu nke ọma" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-length-hint" +msgstr "Ọ karịa mkpụrụ ederede asatọ" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "Akara mpịbanye ga-enweriri ụfọdụ leta/akara mpị karịa oghere ." + +msgid "auth.privacy-policy" +msgstr "Iwu oñiño onwe" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-submit" +msgstr "Nweghachite akara mpịbanye" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-subtitle" +msgstr "Anyị ga-ezita ozi n na ndụmọdụ" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-title" +msgstr "Chefuru akara mpịbanye ?" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.recovery-submit" +msgstr "Gbanye akara mpịbanye." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.register-submit" +msgstr "Mepee ebe Ntinye ihe" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-subtitle" +msgstr "Ọ bụ n'efu , ọ bụ ebe nsị a jere oje" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-title" +msgstr "Mepee ebe ntinye ihe" + +#: src/app/main/ui/auth.cljs +msgid "auth.sidebar-tagline" +msgstr "Nsina ghere oghe iji mee nse na atụtụ" + +msgid "auth.terms-of-service" +msgstr "Ọnọdụ ọrụ" + +msgid "auth.terms-privacy-agreement" +msgstr "" +"Mgbe Ị na-emepe akara mbata ọhụrụ , ị ga-ekwe nye n'ọnọdụ ọrụ anyị na iwu " +"oñiño onwe" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.verification-email-sent" +msgstr "Anyị ezigaala ozi nnyocha na" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...onyinye aha, nkọwa gasị, ngwa ire ahịa dịrị gabazịa." + +msgid "common.publish" +msgstr "bipụta" + +msgid "common.share-link.all-users" +msgstr "Ndị niile ji ite mkpịsị arụ ọrụ" + +msgid "common.share-link.current-tag" +msgstr "(kee ugbu a )" + +msgid "common.share-link.destroy-link" +msgstr "Mebie njiko" + +msgid "common.share-link.get-link" +msgstr "Weta njiko" + +msgid "common.share-link.link-copied-success" +msgstr "E setere njiko nke ọma" + +msgid "common.share-link.manage-ops" +msgstr "Jikwa ikike" + +msgid "common.share-link.permissions-can-comment" +msgstr "nwere ike ikwu okwu" + +msgid "common.share-link.permissions-can-inspect" +msgstr "Nwere Ike inyocha akara" + +msgid "common.share-link.permissions-hint" +msgstr "Onye ọ bụla ga-enwe ohere mbanye" + +msgid "common.share-link.permissions-pages" +msgstr "Ihu akwụkwọ ekekoritara" + +msgid "common.share-link.placeholder" +msgstr "Njikọ e nwere ike ikekorita ga-apụta" + +msgid "common.share-link.team-members" +msgstr "Sọọsọ ndị otu" + +msgid "common.share-link.title" +msgstr "Kee atụ gasị" + +msgid "common.unpublish" +msgstr "Ebiputaghị" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.text" +msgstr "" +"Ite mkpịsị bụ maka otu . Kpọọ ndị otu ka arụkọta ọnụ on arụmarụ na ederede " +"ọnụ" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.title" +msgstr "Jikota ọnụ !" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.info" +msgstr "Mụọ ntọala na ite mkpịsị maka iji nkuzi mmemmekwa eme ihe egwu" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.start" +msgstr "Bido ọmụmụ" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.title" +msgstr "Nkuzi mmemmekwa" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.info" +msgstr "Mee ngagharị na ite mkpịsị ma mata isi a gwara ya." + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.start" +msgstr "Bido njem" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.title" +msgstr "Aba ngagharị" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "Mepụta ọdịmara ọhụrụ" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "Mmepụtara ọdịmara nnweta gara nke ọma ." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "Pịa mpi \"Nweta ọdịmara ọhụrụ \" inweta otu ." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "A chọrọ aha" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "Mkpụrụ ụbọchị narị na iri asatọ" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "Mkpụrụ ụbọchị iri atọ" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "Mkpụrụ ụbọchị iri isii" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "Mkpụrụ ụbọchị iri itoolu" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "Ncha ncha" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "Mebiri na%s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "Na-emebi na%s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"Ọdịmara nnweta nke onwe na-arụ ọrụ dị ka mgbamonwe mbanye anyị /akara " +"mpịbanye e nwere ike iji usoro mbinye aka kwe ka ngwa nweta ndịnime ite " +"mkpịsị API" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "Ọdịmara enweghị ụbọchị mmebi" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.add-shared" +msgstr "Tinye dị ka ọ a nkwekọrịta" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.change-email" +msgstr "Gbanwee ozi - n" + +#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs +msgid "dashboard.copy-suffix" +msgstr "(sere)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.create-new-team" +msgstr "Mebe otu ọhụrụ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.default-team-name" +msgstr "Ite mkpịsị gị" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.delete-team" +msgstr "kacha otu" + +msgid "dashboard.download-binary-file" +msgstr "Butuo ederede ite mkpịsị (.penpot)" + +msgid "dashboard.download-standard-file" +msgstr "Butuo ederede tozuru etozu (.svg + .json)" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate" +msgstr "mee oyiri" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate-multi" +msgstr "Mee o yiri %s ederede" + +#: src/app/main/ui/dashboard/grid.cljs +#, markdown +msgid "dashboard.empty-placeholder-drafts" +msgstr "" +"Ederede a tinyere n'ọba ederede ga-apụta ebe a. Gbalịa ikesa ma ọ bụ tinye " +"site n'[Ọba ederede na ndebiri anyị ](https://itemkpịsị.app/ọba ederede gasị-" +"ndebiri gasị.html)." + +msgid "dashboard.export-binary-multi" +msgstr "Butuo %s ederede ite mkpịsị (.penpot)" + +msgid "dashboard.export-frames" +msgstr "Bupu bọọdụ dị ka PDF" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-frames.title" +msgstr "Bupu dị ka PDF" + +msgid "dashboard.export-multi" +msgstr "Bupu %s ederede Ite mkpịsị" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-multiple.selected" +msgstr "A họrọ %s nke %s ndị na" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to" +msgstr "" +"Ị nwere ike ị tinye ntọala mbupu na ndịna site na ngwongwo nse (n'ala akụkụ " +"aka nri ihe ndepụta)" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to-link" +msgstr "Ozi etu esi ahazi mbupu n'ite mkpịsị" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.no-elements" +msgstr "E nweghị ndịna ọ bụla na ntọala mbupu" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.title" +msgstr "Nhọrọ mbupu" + +msgid "dashboard.export-standard-multi" +msgstr "Buto %s ederede tozuru etozu (.svg + .json)" + +msgid "dashboard.export.detail" +msgstr "" +"* Nwere Ike ịgụnye ngwa , esereese gasị, agwụgwara na/ma ọ bụ akara nkụpụta." + +msgid "dashboard.export.options.all.message" +msgstr "" +"A ga-atinye ederede nwere ọba ederede nkekọrịta ma gụnyere mbupu , ma " +"jidekwa ụkpụrụ njikọ ha" + +msgid "dashboard.export.options.all.title" +msgstr "Bupu ọba ederede nkekọrịta" + +msgid "dashboard.export.options.detach.message" +msgstr "" +"Agaghị a tinye ọba ederede nkekọrịta na mbupu ma o nweghị ihe nnwe a ga a " +"tinye ọ a ederede . " + +msgid "dashboard.export.options.merge.title" +msgstr "Tinye ihe nnwe ọba ederede nkekọrịta n'ime ọ a ederede." + +msgid "dashboard.export.title" +msgstr "Ederede mbupu gasị" + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.dismiss-all" +msgstr "Gbasaa ha niile" + +msgid "dashboard.fonts.empty-placeholder" +msgstr "Mkpụrụ edemede ndị ị bugoro ga-apụta ebe." + +#, markdown +msgid "dashboard.fonts.warning-text" +msgstr "" +"Anyị chọpụtara nsogbu nwere ike ịpụta na mkpụrụ edide gị gbasara ntụ kwụ ọtọ " + +msgid "dashboard.import.analyze-error" +msgstr "Ewuu! Anyị enweghị ike bubata ederede a" + +msgid "dashboard.import.import-error" +msgstr "E nwere nsogbu na ibubata ederede . E bubataghị ederede ." + +msgid "dashboard.import.import-warning" +msgstr "Ụfọdụ ederede nwere ihe ndị adabaghị na ya nke ewepugoro. ." + +msgid "dashboard.import.progress.process-colors" +msgstr "Nhazi agwụgwara gasị" + +msgid "dashboard.import.progress.process-components" +msgstr "Nhazi ngwa gasị" + +msgid "dashboard.import.progress.upload-media" +msgstr "Ibugo ederede : %s" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.invite-profile" +msgstr "Kpọta mmadụ" + +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.leave-team" +msgstr "Hapụ otu" + +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.loading-files" +msgstr "Mbụbata ederede gị …" + +msgid "dashboard.loading-fonts" +msgstr "mbubata mkpụrụ edemede gị …" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to" +msgstr "Ga na" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-changed-successfully" +msgstr "Adreesị ozi - n gị ahazigharịala gara nke ọma" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-multi" +msgstr "Buga %s ederede gasị na" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-other-team" +msgstr "Gaa n'otu ọzọ" + +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/files.cljs +msgid "dashboard.new-file" +msgstr "+ Ederede ọhụrụ" + +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-file-prefix" +msgstr "Ederede ọhụrụ" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.new-project" +msgstr "+ Nchọcha ọhụrụ" + +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-project-prefix" +msgstr "Arụmarụ ọhụrụ" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.no-matches-for" +msgstr "Ọ nweghị ihe ndabara e nwetara maka “%s“" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.no-projects-placeholder" +msgstr "Arụmarụ a kụdoro ga-apụta ebe a" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-verified-successfully" +msgstr "E nyochala adreesị ozi - n gị nke ọma" + +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.notifications.password-saved" +msgstr "E dọkwara akara mpịbanye nke ọma !" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.num-of-members" +msgstr "%s Ndị otu" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.open-in-new-tab" +msgstr "Mepe ederede na tabụ ọhụrụ" + +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.password-change" +msgstr "Gbanwee akara mpịbanye" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.pin-unpin" +msgstr "Nọmba /Wepụ nọmba" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.remove-account" +msgstr "Chọọ iwepu ebe Ntinye ihe gị ?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.remove-shared" +msgstr "Wepụ dị ka ọba ederede nkekọrịta" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.save-settings" +msgstr "Dokwa ntọala" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-duplicate-project" +msgstr "E megharịala arụmarụ gị nke ọma\"" + +#: src/app/main/ui/dashboard/grid.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-file" +msgstr "E wepula ederede gị nke ọma\"" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-move-project" +msgstr "E bupula arụmarụ gị nke ọma" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-info" +msgstr "Ozi otu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-members" +msgstr "Ndị otu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-projects" +msgstr "Arụmarụ otu" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.type-something" +msgstr "Pinye ịchọ risọltụ" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.unpublish-shared" +msgstr "Ọba ederede ebiputaghị" + +#: src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs +msgid "dashboard.update-settings" +msgstr "Hazie ntọala" + +msgid "dashboard.webhooks.active" +msgstr "Dị gara gara" + +msgid "dashboard.webhooks.active.explain" +msgstr "Mgbe a kpọlitere nkọ a, ọ ga-Ezipụta nkọwa emume n'uju" + +msgid "dashboard.webhooks.content-type" +msgstr "Ụdị ndịna" + +msgid "dashboard.webhooks.create" +msgstr "Mepe nko - ududọ" + +msgid "dashboard.webhooks.create.success" +msgstr "E mepere nko-ududọ nke ọma ." + +msgid "dashboard.webhooks.description" +msgstr "" +"Nko-ududọ bụ ụzọ dị mfe ga-ekwe ka ebe ududọ na apps ndị ọzọ nweta ozi Mgbe " +"ụfọdụ emume na eme n'ite mkpịsị . Anyị ga e ziga OZI arịrịọ nwe URLs ọ bụla " +"ị nwetara" + +msgid "dashboard.webhooks.empty.add-one" +msgstr "Pịa mpị \"Tinye nko-ududọ \" ịtinye otu ." + +msgid "dashboard.webhooks.empty.no-webhooks" +msgstr "E nweghị Nko-ududọ e ebere ruo ugbu a ." + +msgid "errors.email-spam-or-permanent-bounces" +msgstr "" +"E nwela ozi nkọwa na ozi-n«%s» dị ka ozi abaghị uru ma ọ bụ mbịaghachigide." + +msgid "dashboard.webhooks.update.success" +msgstr "Ahazigharịrị nko-ududọ nke ọma ." + +#: src/app/main/ui/settings.cljs +msgid "dashboard.your-account-title" +msgstr "Ebe Ntinye ihe gị" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-email" +msgstr "Ozi-n" + +#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.your-penpot" +msgstr "Ite mkpịsị. gị" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-ok" +msgstr "Okay" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-title" +msgstr "Gee ntị" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-cancel" +msgstr "Kagbuo" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-ok" +msgstr "Okay" + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs +msgid "errors.email-already-exists" +msgstr "E jibuola ozi - n rụọ ọrụ" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.email-already-validated" +msgstr "Aha ozi-n adabala." + +msgid "errors.email-as-password" +msgstr "Ị nweghị ike iji aha ozi-n gị dị ka akara mpịbanye" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.email-has-permanent-bounces" +msgstr "Ozi-n «%s» nwere ọtụtụ ozi nkọwa mbịaghachigide." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs +msgid "errors.email-invalid" +msgstr "Debanye aha ozi-n dabara adaba" + +#: src/app/main/ui/settings/change_email.cljs +msgid "errors.email-invalid-confirmation" +msgstr "Ozi-n nnabata ga-adabrịrị" + +#: src/app/main/errors.cljs +msgid "errors.feature-mismatch" +msgstr "" +"Ọ dị ka ị na-emepe ederede nwere a gwara naọ gara aga '%s' mana ihu " +"itemkpịsị gị akwadoghị ya ma ọ bụ gosiri ọ gaghị aga." + +#: src/app/main/errors.cljs +msgid "errors.feature-not-supported" +msgstr "Akwadoghị agwara '%s' ." + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.generic" +msgstr "Ihe ezighị ezi emela ." + +#: src/app/main/ui/components/color_input.cljs +msgid "errors.invalid-color" +msgstr "Agwụgwara adabaghị" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.invite-invalid" +msgstr "kpọọ òkù adabaghị" + +msgid "errors.invite-invalid.info" +msgstr "This invite might be canceled or may be expired." + +#: src/app/main/ui/auth/login.cljs +msgid "errors.ldap-disabled" +msgstr "LDAP mbinye aka agaghị ." + +#: src/app/main/errors.cljs +msgid "errors.max-quote-reached" +msgstr "I ruola '%s' ole a chọrọ . Chọọ enyemaka nkwado ." + +#: src/app/main/data/workspace/persistence.cljs +msgid "errors.media-too-large" +msgstr "Onyinyo a ebuka ibu maka itinye ." + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "errors.media-type-mismatch" +msgstr "Dị ka ihe dị na onyinyo adabaghị na mgbatị ederede." + +#: src/app/main/ui/dashboard/team.cljs +msgid "errors.member-is-muted" +msgstr "" +"Nchịkọta gị nwere ozi-n mechiri emechi (akụkọ ozi-n adịghị mma ma ọ bụ " +"nwere oké bịaghachiri )." + +msgid "errors.team-leave.insufficient-members" +msgstr "Ndị otu ezughị okè ịhapụ otu, ọ nyere ike na ị chọrọ ihichapụ ya ." + +msgid "errors.team-leave.member-does-not-exists" +msgstr "Onye otu ị na-achọ inye adịghị ." + +#: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "errors.unexpected-error" +msgstr "Ndejo atughị anya ya pụtara ." + +msgid "errors.webhooks.connection" +msgstr "Mmejọ, e nwetaghị URL" + +msgid "errors.webhooks.invalid-uri" +msgstr "URL enweghị nkwado ." + +msgid "errors.webhooks.ssl-validation" +msgstr "Mmejọ na nkwado SSL ." + +msgid "errors.webhooks.timeout" +msgstr "Oge ezuola" + +#: src/app/main/ui/auth/login.cljs +msgid "errors.wrong-credentials" +msgstr "Ozi-na ma ọ bụ akara mpịbanye adịghị mma ." + +#: src/app/main/ui/settings/password.cljs +msgid "errors.wrong-old-password" +msgstr "Akara mpịbanye ochie adịghị mma" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.description" +msgstr "Nkọwa" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-go-to" +msgstr "Gaa n'ebe ite mkpịsị" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-subtitle1" +msgstr "" +"Obi dị anyị añụrị ịhụ gị ebea. Ọ bụrụ na enyemaka dị mkpa , biko chọọ tupu " +"ị ịga ozi ." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-title" +msgstr "Ogbe Ite mkpịsị" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subject" +msgstr "Isiokwu" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subtitle" +msgstr "" +"Biko, kọwaa ihe isi ozi-n gị , kwuo ma ọ bụ nsogbu , ncheputara ma ọ bụ " +"ekaenyeghị. Onye otu anyị ga-azaghachi ozugbo ọ nwere ike ." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.title" +msgstr "Ozi- n" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-go-to" +msgstr "Gaa na Twita" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-subtitle1" +msgstr "Ebe inyere gị aka n'ajụjụ nkà gị ." + +#: src/app/main/ui/settings/password.cljs +msgid "generic.error" +msgstr "Mmehie apụtala" + +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur" +msgstr "Inyogo" + +#: src/app/main/ui/inspect/attributes/fill.cljs +msgid "inspect.attributes.fill" +msgstr "Wunye" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.download" +msgstr "Butuo onyinyo nsina" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.height" +msgstr "Ogo" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.width" +msgstr "Uhie" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout" +msgstr "Mpụta" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.height" +msgstr "Ogo" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.left" +msgstr "Aka ekpe" + +#: src/app/main/ui/inspect/attributes/shadow.cljs +msgid "inspect.attributes.shadow" +msgstr "Oninyo" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.size" +msgstr "Nhazi na ọnọdụ" + +#, permanent +msgid "inspect.attributes.stroke.alignment.inner" +msgstr "Ime" + +#, permanent +msgid "inspect.attributes.stroke.alignment.outer" +msgstr "Ezi" + +msgid "inspect.attributes.stroke.style.dotted" +msgstr "Atụrụ kpọm kpọm" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.rotation" +msgstr "Ntụgharị" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.top" +msgstr "Elu" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.width" +msgstr "Uhie" + +msgid "inspect.attributes.stroke.style.mixed" +msgstr "Gwakọtara" + +msgid "inspect.attributes.stroke.style.none" +msgstr "Ncha ncha" + +msgid "inspect.attributes.stroke.style.solid" +msgstr "Akpụrụka" + +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke.width" +msgstr "Uhie" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography" +msgstr "Akara nkụpụta" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-family" +msgstr "Ezinụlọ mkpụrụ edide" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-size" +msgstr "Nhazi mkpụrụ edide" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.letter-spacing" +msgstr "Ndesa mkpụrụ edemede" + +msgid "inspect.empty.help" +msgstr "" +"Ị chọọ ị ma ihe ndị ọzọ maka nnyocha esereese, gaa n'ebe enyemaka ite mkpịsị " +"r" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.line-height" +msgstr "Ogo akara" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-decoration" +msgstr "Nkwazi ederede" + +msgid "inspect.attributes.typography.text-decoration.none" +msgstr "Ncha ncha" + +msgid "inspect.attributes.typography.text-decoration.strikethrough" +msgstr "Kụọgafee" + +msgid "inspect.attributes.typography.text-decoration.underline" +msgstr "N'okpuru" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-transform" +msgstr "Mgbanwe ederede" + +msgid "inspect.attributes.typography.text-transform.none" +msgstr "None" + +msgid "inspect.attributes.typography.text-transform.titlecase" +msgstr "Mkpụrụ edemede isiokwu" + +msgid "inspect.attributes.typography.text-transform.uppercase" +msgstr "Mkpụrụ edemede nnukwu" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code" +msgstr "Akara" + +msgid "inspect.tabs.code.selected.circle" +msgstr "Okirikiri" + +msgid "inspect.tabs.code.selected.component" +msgstr "Ndịna" + +msgid "inspect.tabs.code.selected.curve" +msgstr "Nrọgọ" + +msgid "inspect.tabs.code.selected.frame" +msgstr "Ogwe." + +msgid "inspect.tabs.code.selected.group" +msgstr "Otu" + +msgid "inspect.tabs.code.selected.image" +msgstr "Onyinyo" + +msgid "inspect.tabs.code.selected.mask" +msgstr "kpuchie" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code.selected.multiple" +msgstr "%s a họrọ" + +msgid "inspect.tabs.code.selected.path" +msgstr "Ụzọ" + +msgid "inspect.tabs.code.selected.rect" +msgstr "Rekụtagụlụ" + +msgid "inspect.tabs.code.selected.svg-raw" +msgstr "SVG" + +msgid "inspect.tabs.code.selected.text" +msgstr "Ederede" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.info" +msgstr "Ozi" + +#: src/app/main/ui/workspace/header.cljs +msgid "label.shortcuts" +msgstr "Ụzọ mkpirisi" + +msgid "labels.accept" +msgstr "Nabata" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "Nweta ọdịmara gasị" + +msgid "labels.active" +msgstr "Gara gara" + +msgid "labels.add-custom-font" +msgstr "Tinye mkpụrụ edide a haziri ahazi" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.admin" +msgstr "Ọchịkwa" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.all" +msgstr "Ha niile" + +msgid "labels.and" +msgstr "na" + +msgid "labels.back" +msgstr "Azụ" + +#: src/app/main/ui/static.cljs +msgid "labels.bad-gateway.main-message" +msgstr "Ajọ ụzọ mbanye" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.cancel" +msgstr "Kagbuo" + +msgid "labels.close" +msgstr "Megbuo" + +#: src/app/main/ui/dashboard/comments.cljs +msgid "labels.comments" +msgstr "Okwu gasị" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.community" +msgstr "Ogbe" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.confirm-password" +msgstr "Nabata akara mpịbanye" + +msgid "labels.continue" +msgstr "Ga n'ihu" + +msgid "labels.continue-with" +msgstr "Gaa n'ihu" + +msgid "labels.continue-with-penpot" +msgstr "I Nwere Ike ịganihu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.copy-invitation-link" +msgstr "Dọrọ njikọ" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "labels.create" +msgstr "Meputa" + +#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team" +msgstr "Mepee otu ọhụrụ" + +msgid "labels.custom-fonts" +msgstr "mkpụrụ edide a haziri" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete" +msgstr "Hichaa" + +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment" +msgstr "Hichaa okwu" + +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment-thread" +msgstr "Hichapụ eri" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.delete-invitation" +msgstr "Hichapụ oku" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete-multi-files" +msgstr "Hichapụ ederede %s" + +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.drafts" +msgstr "Ndesita" + +#: src/app/main/ui/comments.cljs +msgid "labels.edit" +msgstr "Dezie" + +msgid "labels.edit-file" +msgstr "Dezie ederede" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.editor" +msgstr "Odezi" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.expired-invitation" +msgstr "Mebiri" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-disabled" +msgstr "Nzaghachi merụrụ emeru" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-sent" +msgstr "Zigara nzaghachi" + +msgid "labels.font-family" +msgstr "Ezinụlọ mkpụrụ edide" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.give-feedback" +msgstr "Nye nzaghachi" + +msgid "labels.go-back" +msgstr "Gaa azụ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.help-center" +msgstr "Ebe enyemaka" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.hide-resolved-comments" +msgstr "Zoo nkwupụta e kpebiri" + +msgid "labels.inactive" +msgstr "Arụghị ọrụ" + +msgid "labels.installed-fonts" +msgstr "Mkpụrụ edide gasị ewubere" + +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.desc-message" +msgstr "" +"Ihe ọjọọ mere . Biko, rụgharịa ọrụ ma ọ bụ na nsogbu aka dị , kpọọ nkwado ." + +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.main-message" +msgstr "Nrụjọ ndịnime" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.invitations" +msgstr "Akwụkwọ ịkpọ ọkụ gasị" + +#: src/app/main/ui/settings/options.cljs +msgid "labels.language" +msgstr "Asụsụ" + +#: src/app/main/ui/settings.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.logout" +msgstr "Pụọ" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.member" +msgstr "Onye otu" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.members" +msgstr "Ndị otu" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.new-password" +msgstr "Akara mpịbanye ọhụrụ" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs +msgid "labels.no-comments-available" +msgstr "E jidere unu niile! Ngosi nkwupụta ọhụrụ ga-apụta ebe a ." + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.no-invitations" +msgstr "E nweghị ọkụ na-echere" + +msgid "labels.or" +msgstr "ma ọ bụ" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.owner" +msgstr "Onye nwe" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.password" +msgstr "Akara mpịbanye" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.profile" +msgstr "Nchịkọta" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.projects" +msgstr "Ọrụ gasị" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.release-notes" +msgstr "Wepụta ndetu" + +#: src/app/main/ui/workspace.cljs +msgid "labels.reload-file" +msgstr "Bugharịa ederede" + +#: src/app/main/ui/workspace/libraries.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.remove" +msgstr "Wepu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.remove-member" +msgstr "Wepụ onye otu" + +msgid "labels.search-font" +msgstr "Chọọ mkpụrụ edide" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.send" +msgstr "Ziga" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.sending" +msgstr "Na-eziga…" + +msgid "labels.show-comments-list" +msgstr "Gosi ndepụta nkwupụta gasị" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-your-comments" +msgstr "Gosi nanị nkwupụta gị gasị" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.tutorials" +msgstr "Nkuzi" + +#: src/app/main/ui/settings/profile.cljs +msgid "labels.update" +msgstr "Hazigharịa" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.status" +msgstr "Ọnọdụ" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.update-team" +msgstr "Hazigharịa otu" + +msgid "labels.upload-custom-fonts" +msgstr "Bugo ederede gasị ahaziri" + +msgid "labels.uploading" +msgstr "Na-ebugo…" + +msgid "labels.view-only" +msgstr "Sọọsọ nkiri" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.viewer" +msgstr "Ndị nkiri" + +msgid "labels.webhooks" +msgstr "Nko-ududọ" + +#: src/app/main/ui/comments.cljs +msgid "labels.write-new-comment" +msgstr "Dee nkwupụta ọhụrụ" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.you" +msgstr "(gị)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.your-account" +msgstr "Akara mbata gị" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.info" +msgstr "" +"Site na iwepu ebe ntinye ihe gị, arụmarụ gị gasị ugbu a naebe nchekwa ga-" +"efu ." + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "media.loading" +msgstr "Na-ebupụta onyinyo …" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"E nweghị ihe dị n'ọba ederede gị. \"Ozugbo e tinyere dị ka ọba ederede " +"ekekoritara, ngwongwo ị mepere ga a dị maka iji ya rụọ ọrụ n'edemede gị ndị " +"ọzọ niile. Ọ kara gị obi na ị chọrọ ị bipụta ya?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.accept" +msgstr "Tinye ka ọba ederede Kekoritara" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.hint" +msgstr "" +".Ozugbo e tinyere dị ka ọba ederede ekekoritara, ngwongwo ị mepere ga a dị " +"maka iji ya rụọ ọrụ n'edemede gị ndị ọzọ niile." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.message" +msgstr "Tinye “%s” dị ka ọba ederede ekekoritara" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.big-nudge" +msgstr "nnukwu nkpatụ" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.submit" +msgstr "Gbanwee ozi nl" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.expiration-date.label" +msgstr "Ụbọchị mmebi" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "Aha" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "Create token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "Mepụta ọdịmara nweta" + +msgid "modals.create-webhook.submit-label" +msgstr "Mebe nko - ududo" + +msgid "modals.create-webhook.title" +msgstr "Mebe nko-ududo" + +msgid "modals.create-webhook.url.label" +msgstr "Isi ozi URL" + +msgid "modals.create-webhook.url.placeholder" +msgstr "https://ọmụmaaụ.com/ozi anabara" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "Hichapụ ọdịmara" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "Hichapụ ọdịmara" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.cancel" +msgstr "Kagbuo ma dobe ebe ntinye ihe m" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.confirm" +msgstr "Eee, hichapụ ebe ntinye ihe m" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.title" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ ebe ntinye ihe gị?" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.accept" +msgstr "Hichapụ mkparịtaụka" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.message" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ mkparịtaụka a?" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.title" +msgstr "Hichaa mkparịtaụka" + +msgid "modals.delete-component-annotation.message" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ nkọwa ?" + +msgid "modals.delete-component-annotation.title" +msgstr "Hichapụ nkọwa" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.accept" +msgstr "Hichapụ ederede" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.message" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ ederede ?" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.title" +msgstr "Na-ehichapụ ederede" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.title" +msgstr "Na-ehichapụ ederede %s" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.accept" +msgstr "Hichapụ otu" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.message" +msgstr "" +"Ọ kara gị obi na ị chọrọ ị hichapụ otu? ARỤMARỤ na ederede nille gasị " +"gbasara otú ga-ehichapụ kpam kpam" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.title" +msgstr "Na-ehichapụ otu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.accept" +msgstr "Hichapụ onye otu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.message" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ onye otu n'otu a?" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.title" +msgstr "Hichapụ onye otu" + +msgid "modals.delete-webhook.accept" +msgstr "Hichapụ nko-ududọ" + +msgid "modals.delete-webhook.message" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ nko-ududọ ?" + +msgid "modals.delete-webhook.title" +msgstr "Na-ehichapụ nko-ududo" + +msgid "modals.edit-webhook.submit-label" +msgstr "Dezie nko-ududo" + +msgid "modals.edit-webhook.title" +msgstr "Dezie nko-ududo" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-member-confirm.accept" +msgstr "Ziga akwụkwọ ozi mkpọta" + +msgid "modals.invite-member.emails" +msgstr "Ozi-n gasị, Rịkọm e kewara" + +msgid "modals.invite-member.repeated-invitation" +msgstr "Ụfọdụ ozi n sitere na ndị ugbu a A gaghị e ịga akwụkwọ ozi mkpọta ha" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-team-member.title" +msgstr "kpọta ndị otu n'otu a" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.hint1" +msgstr "" +"Gị bụ onye nwee otu a, . Biko, họrọ onye otu ọzọ maka ịkwalite gana onye " +"nweeya tupu ị hapụ ." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.promote-and-leave" +msgstr "Kwalite ma hapụ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.hint" +msgstr "" +"Etu ị bụ sọọ otu onye otu , a ga e hichapụ otu a ya n'ọrụ na ederede ya " +"gasịits projects and files." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.message" +msgstr "Ọ kara gị obi na ị chọrọ ịhapụ otu %s ?" + +msgid "modals.leave-and-reassign.forbidden" +msgstr "" +"I nweghị ike ịhapụ otu ma ọ bụrụ na e nweghị onye otu ọzọ akwalitere ga na " +"onye nwe ya . Ị nwere ike chọọ ị hichapụ otu ." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.select-member-to-promote" +msgstr "Họrọ onye otu maka ịkwalite" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.title" +msgstr "Tupu ị hapụ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.accept" +msgstr "Hapụ otu" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.message" +msgstr "Ọ kara gị obi na ịchọrọ ịhapụ otu ?" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.title" +msgstr "Nhapụ otu" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.nudge-title" +msgstr "ọnụ ọgụgụ nkpatụ" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.hint" +msgstr "" +"Ọ bụrụ na Inyefe onwunwe , ị ga-agbanwe ọrụ gị ka ọchikwa, ụfọdụ ikikere " +"n'isi ndị otu na-efu " + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.message" +msgstr "" +"G bụ onye nwe otu a ugbu a, Ọ doro gị anya na ị chọrọ ime%s Onye ọhụrụ nwe " +"otu a?" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.title" +msgstr "Onye nwe otu ọhụrụ" + +msgid "modals.publish-empty-library.accept" +msgstr "Biputa" + +msgid "modals.publish-empty-library.message" +msgstr "Your library is empty. Are you sure you want to publish it?" + +msgid "modals.publish-empty-library.title" +msgstr "Biputa ọba ederede efu" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.accept" +msgstr "Wepụ dịka ọba ederede ekekoritara" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.hint" +msgstr "" +"Ozugbo e wepụrụ dị ka ọba ederede ekekoritara, ọba ederede ederede a ga-" +"akwụsị dị n'ime ederede ndị ọzọ gasị e ji rụọ ọrụ" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.message" +msgstr "Wepu“%s” dịka ọba ederede ekekoritara" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.small-nudge" +msgstr "kpatụ obere" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.hint" +msgstr "" +"Ị na-achọ ịhazigharị ngwa gasị n'ọba ederede ekekoritara. Ihe nwere ike " +"imetuta ederede ndị ọzọ ji ya arụ ọrụ" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.message" +msgstr "Update components in a shared library" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.accept" +msgstr "Hazigharịa" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.cancel" +msgstr "Kagbuo" + +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "A new version is available, please refresh the page" + +msgid "onboarding-v2.before-start.desc2.title" +msgstr "Mkpanaka" + +msgid "onboarding-v2.before-start.desc3" +msgstr "Ị nwere ike ikiri amụmamụ anyị na amụmamụ nke ndị obodo anyị mere." + +msgid "onboarding-v2.before-start.desc3.title" +msgstr "Amụmamụ onyonyo" + +msgid "onboarding-v2.newsletter.desc" +msgstr "" +"Debanye aha n'akụkụ ozi ite mkpịsị iji nọrọ gam gam na ngwa ahịa aaga n'ihu " +"mwulite na akụkọ ụwa." + +msgid "onboarding-v2.newsletter.privacy1" +msgstr "Anyị na-eche banyere nzochi onwe, ebe a inwere ike ịgụ..... anyị " + +msgid "onboarding.team-modal.create-team-feature-5" +msgstr "% narị efu!" + +msgid "onboarding-v2.newsletter.privacy2" +msgstr "" +"Anyị ga e zitere ozi n bara uru sọọsọ . Ị nwere ike idepu aha oge ọ bụla " +"site na njikọ ndepu aha n'akwụkwọ ozi gasị anyị ọ bụla ." + +msgid "onboarding-v2.newsletter.updates" +msgstr "" +"Zitere m nhazigharị ngwa ahịa (a gwara ọhụrụ gasị , ihe ndị ewepụta gasịrị , " +"ndo ị gasị..)." + +msgid "onboarding-v2.welcome.desc1" +msgstr "" +"Ite mkpịsị bụ nsina ghere oghe ma bụrụ nke Kaleidos nakwa ndị obodo rụrụ Ebe " +"ọtụtụ mmadụ nyewegoroa onwe anyị aka..Onye ọ bụla nwere arụkọrịtasite na :" + +msgid "onboarding-v2.welcome.desc2" +msgstr "" +"Oghere ọha na ndị obodo niile na ndị otu ite mkpịsị kpọmkwem ịmụ, kesa ma " +"kọwaa maka ite mkpịsị , ọnọdụ ya ugbu a na ọdịnihu ya" + +msgid "onboarding-v2.welcome.desc3.title" +msgstr "Ntụziaka inye aka" + +msgid "onboarding-v2.welcome.title" +msgstr "Nabata ite mkpịsị !" + +msgid "onboarding.choice.team-up.create-team-desc" +msgstr "I nye ha otu gị aha , I nwere ike ị kpọta ndị mmadụ ka ha sonye." + +msgid "onboarding.choice.team-up.create-team-placeholder" +msgstr "Denye aha otu" + +msgid "onboarding.choice.team-up.invite-members-info" +msgstr "" +"Cheta ka itinye onye ọ bụla Ndị nzụlite, ndị nrụpụta, ndị njikwa... dị iche " +"iche adds up :)" + +msgid "onboarding.choice.team-up.roles" +msgstr "kpọta tinye ọrụ :" + +msgid "onboarding.newsletter.accept" +msgstr "Eee, debanye aha" + +msgid "onboarding.newsletter.acceptance-message" +msgstr "" +"E zigala arịrịọ ndenye aha gị , anyị ga-ezi tara gị ozi - n iji nabata ya" + +msgid "onboarding.newsletter.title" +msgstr "Chọrọ inweta ozi ite mkpịsị ?" + +msgid "onboarding.team-modal.create-team" +msgstr "Mepụta otu" + +msgid "onboarding.team-modal.create-team-desc" +msgstr "" +"Otu ga-ekwe gị na ndị ọzọ ji ite mkpịsị arụ ọrụ ịrụkọta n'otu ederede na " +"arụmarụ gasị ." + +msgid "onboarding.team-modal.create-team-feature-1" +msgstr "Ederede na arụmarụ na enweghị njedebe" + +msgid "onboarding.team-modal.create-team-feature-2" +msgstr "Mbipụta ọtụtụ egwuregwu" + +msgid "onboarding.team-modal.create-team-feature-3" +msgstr "Njikwa ọrụ" + +msgid "onboarding.team-modal.create-team-feature-4" +msgstr "Ndị otu enweghị njedebe" + +msgid "onboarding.templates.subtitle" +msgstr "Ụfọdụ ndebiri nọ ebe a." + +msgid "onboarding.templates.title" +msgstr "Bido osise" + +#: src/app/main/ui/auth/recovery.cljs +msgid "profile.recovery.go-to-login" +msgstr "Gaa na mbanye" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "Iri atọ na otu ruo na iri ise" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "Ọtụtụ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Ngwa nrụkọrịta ọrụ Adobe" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Kanva" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Onye nrụpụta" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "Chọpụta ihe ndị ọzọ gbasara ite mkpịsị" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Ihe onyonyo" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Onye malitere /VP" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Onye nwere onwe ya" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Weta akara site n'arụmarụ otu m " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... Nhazi ihu nse, uru ahụmụzọ, usoro imewe , etc." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "Mmakpo" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Hapụ Nzaghachi maka arụmarụ ndị otu m" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "Ka anyị bido!" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Onye njikwa ngwaahịa ma ọ bụ arụmarụ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Ịzụ ahịa" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "Karịrị iri ise" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-a-tool" +msgstr "E jibeghị m ngwa ọrụ nse rụọ ọrụ mbụ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Ọzọ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Onweghị" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Ọzọ (zipụta)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "A na m arụ ọrụ n'arụmarụ onwe" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Kedụ ka ị sị akwado iji ite mkpịsị arụ ọrụ ?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Gịnị bụ ọrụ gị ?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Họrọ nhọ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Eserese" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Ụfọdụ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Bido" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Bido ịrụ ọrụ m" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Nwata akwụkwọ ma ọ bụ onye nkụzi" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "Kedụ ka otu gị ha?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Nwale ite mkpịsị ịhụ ma ọ bụ ihe ndaba maka otu " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Gbalịa mee mbụ tupu ị jiri ite mkpịsị rụọ ọrụ n'ebe ọ dị" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "... waya etiti , ndị ọrụ njem na eruba , osisi ngagharị gasị , dgz." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Na-arụ ọrụ n'echiche ihe" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Nzaghachi gị ga-enyere anyị aka ịghọta ihe agwa na mmasị gị bụ Ka anyị ga na-" +"eme Ite mkpịsị ụdị ngwa ọrụ bara uru dị ụtọ ." + +msgid "shortcuts.bring-backward" +msgstr "Wega ebe azụ" + +msgid "shortcuts.duplicate" +msgstr "Mkpị" + +msgid "shortcuts.letter-spacing-inc" +msgstr "Leta mmụba oghere" + +msgid "shortcuts.text-align-left" +msgstr "Dozie akaekpe" + +msgid "viewer.breaking-change.message" +msgstr "Ndo" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.delete" +msgstr "Kachapụ" + +msgid "workspace.focus.focus-mode" +msgstr "Umezi nlekwasa anya" + +msgid "workspace.focus.focus-on" +msgstr "Gbanye nlekwasa anya" + +msgid "workspace.shape.menu.create-multiple-components" +msgstr "Mee ọtụtụ akọrọngwa ga" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.there-are-updates" +msgstr "E nwegasịrị nhazizigharị nime ọba ederede ga e kere eke" -- Gitee From a678eb7295972a58f116da7358ec06050ba0f949 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 13 Feb 2024 07:55:49 +0000 Subject: [PATCH 0358/1266] :globe_with_meridians: Add translations for: Yoruba. Currently translated at 90.6% (1234 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/yo/ --- frontend/translations/yo.po | 4651 ++++++++++++++++++++++++++++++++++- 1 file changed, 4650 insertions(+), 1 deletion(-) diff --git a/frontend/translations/yo.po b/frontend/translations/yo.po index 4f8f6e6de..7d573ec6f 100644 --- a/frontend/translations/yo.po +++ b/frontend/translations/yo.po @@ -1,2 +1,4651 @@ msgid "" -msgstr "X-Generator: Weblate\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit" \ No newline at end of file +msgstr "" +"PO-Revision-Date: 2024-02-14 08:02+0000\n" +"Last-Translator: Alejandro Alonso \n" +"Language-Team: Yoruba \n" +"Language: yo\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.4-dev\n" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.login-here" +msgstr "wọlé síbí" + +msgid "common.publish" +msgstr "ìgbéjáde" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.start" +msgstr "bẹ̀rẹ̀ ìrìn kiri" + +msgid "dashboard.import" +msgstr "gbé àwọn fáìlì pẹ́ńpọtì wọlé" + +msgid "dashboard.import.analyze-error" +msgstr "ooho! a kò lè gbé fáìlì yìí wọlé" + +msgid "dashboard.import.import-error" +msgstr "wàhálà wà láti gbé kan wà láti gbé fáìlì wọlé . fáìlì kò wọlé." + +#: src/app/main/ui/dashboard/libraries.cljs +msgid "dashboard.libraries-title" +msgstr "yàrá ìkàwé" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-duplicate-project" +msgstr "a ti ṣe ẹ̀dà iṣẹ́ àgbéṣe rẹ dáadáa" + +#: src/app/main/ui/dashboard/grid.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-file" +msgstr "a ti gbé fáìlì rẹ kúro dáadáa" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-files" +msgstr "a ti gbé àwọn fáìlì rẹ kúrò dáadáa" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs +msgid "errors.email-invalid" +msgstr "Tẹ àti wọlé pẹ̀lú ímeèlì tó wúlo jọ̀wọ́" + +msgid "errors.webhooks.timeout" +msgstr "Àkókò ti lọ" + +msgid "inspect.tabs.code.selected.circle" +msgstr "Àyíká" + +msgid "inspect.tabs.code.selected.component" +msgstr "Ẹ̀yà" + +msgid "inspect.tabs.code.selected.curve" +msgstr "Igun" + +msgid "inspect.tabs.code.selected.frame" +msgstr "Bọ́ọ̀dù" + +msgid "inspect.tabs.code.selected.group" +msgstr "Ẹgbẹ́" + +msgid "inspect.tabs.code.selected.image" +msgstr "Àwòrán" + +msgid "inspect.tabs.code.selected.mask" +msgstr "Ìbòjú" + +msgid "labels.and" +msgstr "àti" + +msgid "labels.share-prototype" +msgstr "Pín àwọn ohun tí a ti kọ tẹ́lẹ̀" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.shared-libraries" +msgstr "Yàrá ìkáwe" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-all-comments" +msgstr "Fi gbogbo kọ́mẹ́ǹtì hàn" + +msgid "labels.show-comments-list" +msgstr "Fi àkójọ àwọn kọ́mẹ́ǹtì hàn" + +msgid "modals.delete-webhook.message" +msgstr "Ṣe ó dá ọ lójú pé o fẹ́ pa ìkọ́-wẹ́bù yìí rẹ́?" + +msgid "modals.publish-empty-library.accept" +msgstr "Kọ ọ́ jáde" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "Mọ́kànlélọ́gbọ̀n-Àádọ́ta" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "O ´ pọ̀jù" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Àdòbí XD" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.share.copy-link" +msgstr "Da línkì kọ̀" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.show-interactions" +msgstr "Ifihan Ibaraenisépọ̀" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "wò gbògbò awọn ayípàdà" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.updates" +msgstr "Awọn ímùdojúiwọn" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.add-interaction" +msgstr "Tẹ amí + làtí fi íbàràénisépọ̀ kun" + +#: src/app/main/ui/workspace/sidebar/options.cljs +msgid "workspace.options.design" +msgstr "Ónirú" + +msgid "workspace.options.height" +msgstr "Gíga" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-on-click" +msgstr "Tẹ orí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay" +msgstr "Ṣíìtẹ̀lé ìlànà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay-dest" +msgstr "Ṣí ìtẹ̀lé ìlànà: %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-relative-to" +msgstr "Ìbátan sí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-self" +msgstr "Tìkara" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay" +msgstr "Àyípadà ìtẹ̀lé ìlànà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay-dest" +msgstr "Àyípadà ìtẹ̀lé ìlànà: %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-trigger" +msgstr "Okùnfà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-url" +msgstr "URL" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row" +msgstr "Ilà ìbú" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row-reverse" +msgstr "Ilà ìbú yíyípadà" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.gap" +msgstr "Àlàfo" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.left" +msgstr "Òsì" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin" +msgstr "Etí ìwé" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin-all" +msgstr "Gbogbo àwọn àwòrán" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin-simple" +msgstr "Etí ìwé ẹyọ" + +msgid "workspace.options.shadow-options.color" +msgstr "Àwọ̀ òjíjí" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.forward" +msgstr "Mú wá sọ́wọ́ iwájú" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.front" +msgstr "Mú wá sí wájú" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.go-main" +msgstr "Lọ sí olórí fáìlì àkóónú" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.group" +msgstr "Àwùjọ" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.hide" +msgstr "Tọ́jú" + +msgid "workspace.shape.menu.hide-ui" +msgstr "Fihàn/ Tọ́jú UI" + +msgid "workspace.shape.menu.intersection" +msgstr "Ìkòríta" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.lock" +msgstr "Tì" + +#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.mask" +msgstr "Ìbòjú" + +#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.paste" +msgstr "lẹ̀mọ́" + +msgid "workspace.shape.menu.path" +msgstr "Ipa ọ̀nà" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-flex" +msgstr "Yọ àrọ ètò ìrísí kúrò" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.unlock" +msgstr "Ṣíí" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.unmask" +msgstr "Sí ìbòjú" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.update-components-in-bulk" +msgstr "Mímú àwọn ọ̀rọ̀ àkóónú pàtàkì dójú ìwọ̀n" + +msgid "workspace.sidebar.collapse" +msgstr "Wó òpó ègbẹ́" + +msgid "workspace.sidebar.expand" +msgstr "Fẹ òpó ẹ̀gbẹ́" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.sidebar.history" +msgstr "Ìtàn (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.sidebar.layers" +msgstr "Àwọn ìpele" + +msgid "workspace.sidebar.layers.components" +msgstr "Àwọn àkóónú" + +msgid "workspace.sidebar.layers.frames" +msgstr "Àwọn pátákó" + +#: src/app/main/ui/workspace/sidebar/options/menus/svg_attrs.cljs, src/app/main/ui/inspect/attributes/svg.cljs +msgid "workspace.sidebar.options.svg-attrs.title" +msgstr "Gbígbé àwọn ànímọ́ SVG wọlé wá" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "workspace.sidebar.sitemap" +msgstr "Àwọn abala" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.new" +msgstr "Titun %s" + +msgid "workspace.undo.entry.single.circle" +msgstr "Àyíká" + +msgid "workspace.undo.entry.single.color" +msgstr "Ohun àmúṣọrọ̀ àwọ̀" + +msgid "workspace.undo.entry.single.component" +msgstr "Àkóónú" + +msgid "workspace.undo.entry.single.curve" +msgstr "Ẹkọ̀rọ̀" + +msgid "workspace.undo.entry.single.frame" +msgstr "Pátákó" + +msgid "workspace.undo.entry.single.group" +msgstr "Àkójọ" + +msgid "workspace.undo.entry.single.image" +msgstr "Àwòrán" + +msgid "workspace.undo.entry.single.media" +msgstr "Ohun àmúṣọrọ̀ èyà àwòrán" + +msgid "workspace.undo.entry.single.multiple" +msgstr "Ohun" + +msgid "workspace.undo.entry.single.page" +msgstr "Ojú awẹ́" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.check-your-email" +msgstr "" +"yẹ ímeèlì rẹ wò kí o tẹ ọ̀nà-àsopọ̀ láti mọ̀ dájú àti láti bẹ̀rẹ̀ sí lo " +"pẹ́ńpọtì." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.confirm-password" +msgstr "jẹ́rìísí ọ̀rọ̀-ìgbaniwọlé" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-account" +msgstr "ṣẹ̀dá ìfihàn àkáùntí" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-profile" +msgstr "kàn fẹ́ gbìyànjú ú rẹ̀?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.demo-warning" +msgstr "" +"\"\"This is a DEMO service, DO NOT USE for real work, the projects will be " +"parẹ́ lóòrèkóòrè." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.email" +msgstr "ímeèlì" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.forgot-password" +msgstr "gbàgbé ọ̀rọ̀-ìgbaniwọlé ?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.fullname" +msgstr "orúkọ lẹ́kùnn-ún-rẹ́rẹ́" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-submit" +msgstr "wọlé" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-title" +msgstr "ó dára láti rí ẹ lẹ́ẹ̀kan sí i!" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-github-submit" +msgstr "ibùdó gítì" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-gitlab-submit" +msgstr "láàbù gítì" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-google-submit" +msgstr "ṣàwárí" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-ldap-submit" +msgstr "LDAP" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-oidc-submit" +msgstr "ṣílẹ̀kuǹ ìdánimọ̀" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "orúkọ kò gbọdọ̀ ju àádọ́jọ́ lẹ́tà lọ." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.new-password" +msgstr "tẹ ọ̀rọ̀ ìgbaniwọlé tuntun" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.invalid-token-error" +msgstr "àmì àtúnwárí ti díbàjẹ́." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.password-changed-successfully" +msgstr "ọ̀rọ̀-ìgbaniwọlé ti yí padà dáadáa" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.profile-not-verified" +msgstr "" +"a tí ì ṣe ìwádìí bí o ṣe jẹ́, jọ̀wọ́ ṣe ìwádìí bí o ṣe jẹ́ kí o tó tẹ̀ " +"síwájú." + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.recovery-token-sent" +msgstr "a ti fi ọ̀rọ̀-ìgbaniwọle aṣàtúnwárí ránṣẹ sínu àpótí rẹ." + +#: src/app/main/ui/auth/verify_token.cljs +msgid "auth.notifications.team-invitation-accepted" +msgstr "o ti wọ inú ẹgbẹ́ bó ṣeyẹ" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.password" +msgstr "ọ̀rọ̀- ìgbaniwọlé" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-length-hint" +msgstr "kò gbọdọ̀ ju ohun kíkọ mẹ́jọ lọ" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "ọ̀rọ̀-ìgbaniwọlé gbọ́dọ̀ ní nǹkan kíkọ láìsí àlàfo." + +msgid "auth.privacy-policy" +msgstr "ìpamọ ètò ìmúló" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-submit" +msgstr "ṣàtuńwárí ọ̀rọ̀-ìgbaniwọlé" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-subtitle" +msgstr "a má a fi àwọn ìtọ́nisọ́nà ránsẹ́ sínú ímeèlì rẹ" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-title" +msgstr "gbàgbé ọ̀rọ̀-ìgbaniwọle ?" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.recovery-submit" +msgstr "yí ọ̀rọ̀-ìgbaniwọlé rẹ padà" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.register" +msgstr "kò tí ì sí àkáùntì?" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.register-submit" +msgstr "ṣẹ̀dá àkáùntì" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-subtitle" +msgstr "ọ̀fẹ́ ni,orísun rẹ̀ ṣí lẹ" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-title" +msgstr "ṣẹ̀dá àkáùntì" + +#: src/app/main/ui/auth.cljs +msgid "auth.sidebar-tagline" +msgstr "ṣíṣí orísun yíyà àti àwòrán ni yóò fi lojútùú ." + +msgid "auth.terms-of-service" +msgstr "òfin ibiṣẹ́" + +msgid "auth.terms-privacy-agreement" +msgstr "" +"\"nígbà, tí o bá ń ṣẹ̀dá àkáùntí tuntun ,o gbọ́dọ̀ gba àwọn òfin ibiṣẹ́ àti " +"àṣírí rẹ́`." + +#: src/app/main/ui/auth/register.cljs +msgid "auth.verification-email-sent" +msgstr "a ti fi ìjẹ́rìísí ránsẹ́ sínú ímeèlì rẹ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr ".. ìyàsọ́tọ, àpèjúwe,títajà nǹkan, abbl." + +msgid "common.share-link.all-users" +msgstr "gbogbo àwọn tó ń lo pẹ́ńpọtì" + +msgid "common.share-link.current-tag" +msgstr "(lọ́wọ́lọ́wọ́)" + +msgid "common.share-link.destroy-link" +msgstr "pa ọ̀nà-àsopọ̀ run" + +msgid "common.share-link.get-link" +msgstr "gba ọ̀nà-àsopọ́" + +msgid "common.share-link.link-copied-success" +msgstr "so àdàkọ pọ̀ bó ṣeyẹ" + +msgid "common.share-link.manage-ops" +msgstr "ṣàkóṣo ìgbaniláàye" + +msgid "common.share-link.permissions-can-comment" +msgstr "o lè sọ̀rọ̀" + +msgid "common.share-link.permissions-can-inspect" +msgstr "ṣe àyẹ̀wò kóòdù" + +msgid "common.share-link.permissions-hint" +msgstr "ẹnikẹ́ni tí ó bá ní ọ̀nà-àsopọ á ní àǹfààní àtiwọle" + +msgid "common.share-link.permissions-pages" +msgstr "pín ojú ìwé" + +msgid "common.share-link.placeholder" +msgstr "ọ̀nà-àsopọ̀ ojú ìwé tí a pín á hàn ní bí yìí" + +msgid "common.share-link.team-members" +msgstr "ọmọ ẹgbẹ́ nìkan ni" + +msgid "common.share-link.title" +msgstr "pín àwọn àpẹrẹ" + +msgid "common.share-link.view-all" +msgstr "yan gbogbo rẹ̀" + +msgid "common.unpublish" +msgstr "ohun tí a kò tí ì kọ jáde" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.management" +msgstr "ìṣàkóṣo ọmọ ẹgbẹ" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.title" +msgstr "kẹ́gbẹ́ ṣera wọn lọ́kan" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.info" +msgstr "" +"\"kọ́ nípa kókó bi pẹ́ńpọtì nígbàtí ò ń dára rẹ láraya nípa fífi àwon ọwọ́ " +"rẹ ṣe “ “ìdánilẹ́kọ̀ọ́ ." + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.start" +msgstr "bẹ̀rẹ̀ ìdánilẹ́kọ̀ọ́" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.title" +msgstr "gbọ́wọ́ lórí idánilẹ́kọ̀ọ́" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.info" +msgstr "rìn kàákiri pẹ́ńpọti kí o lè mọ kókó àwẹn ẹ̀yà ara rẹ̀." + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.title" +msgstr "wò ó bí o ṣe ń rìn kiri" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "ṣe ìpilẹ̀sẹ̀ àmì tókìnnì" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "ṣe àyẹ̀wò àmì tókìnnì tí o ṣẹ̀dá bó ṣeyẹ." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "" +"tẹ bọ́tìnnì \" ṣe ìpilẹ̀sẹ̀ àmì tókìnnì tuntun\" láti ṣe ìpilẹ̀sẹ̀ òmíràn." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "o kò tí ì ní àmì tókínnì títí di ìsinsìn yìí." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "a nílò orúkọ" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "ọgọ́saǹ-ań ọjọ́" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "ọgbọ̀n ọjọ́" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "ọgọ́ta ọjọ́" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "àádọ́ruǹ-ún ọjọ́" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "rárá" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "ó parí ní %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "ó parí %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.no-expiration" +msgstr "kò sì ọjọ́ ìparí" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "àmì tokìnnì ìwọlé ti ara ẹni" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"Iṣẹ́ àmì tókìnì ìwọlé ti ara ẹni dàbì ọ̀nà kejí tí a le gbà wọlé/ ọ̀rọ̀- " +"agbaniwọle a lè lo ìfàsẹ sí ètò láti gbaye fún ohun èlò à tì wọlé pẹ́ń" +"pọtì ti abẹ́nú api" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "àmì tòkìn yóò parí ní %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "kò sí ọjọ́ ìparí fún àmì tókìn" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.add-shared" +msgstr "ṣe àpàpọ̀ bí i yàrá ìkàwe tí a pín" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.change-email" +msgstr "pàrọ̀ ímeèlí" + +#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs +msgid "dashboard.copy-suffix" +msgstr "(dàákọ)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.create-new-team" +msgstr "ṣẹ̀dá ẹgbẹ́ tuntun" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.default-team-name" +msgstr "pẹ́ńpọtì rẹ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.delete-team" +msgstr "pa ẹgbẹ́ rẹ́" + +msgid "dashboard.download-binary-file" +msgstr "sọ fáìlí pẹ́ńpọtì kalẹ̀ (.penpot)" + +msgid "dashboard.download-standard-file" +msgstr "sọ fáìlì ìpéwọ̀n kalẹ̀ (.svg + .json)" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate" +msgstr "ṣe ẹ̀dà" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate-multi" +msgstr "ṣe ẹ̀dà %s fáìlì" + +#: src/app/main/ui/dashboard/grid.cljs +#, markdown +msgid "dashboard.empty-placeholder-drafts" +msgstr "" +"\"\" fáìlí tí a dàpọ̀ mọ yàrá ìkàwé á hàn níbí yìí. gbìyànjú láti má a pín " +"àwon fáìlì rẹ̀ tàbí ṣàfikún láti ibi [yàrá ìkàwé wa àti àwòṣe " +"](https://penpot.app/libraries-templates.html)." + +msgid "dashboard.export-binary-multi" +msgstr "sọ àwọn fáìlì pẹ́ẹ́pọtì kalẹ́ %s (.pẹ́ńpọtì)" + +msgid "dashboard.export-frames" +msgstr "fi bọọdù ráńṣẹ bí i PDF" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-frames.title" +msgstr "fi ráńṣẹ́ bí i PDF" + +msgid "dashboard.export-multi" +msgstr "fi pẹ́ńpọtì ráńṣẹ́%s files" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-multiple.selected" +msgstr "% ti %s ẹ́límẹ́ǹti tí a yàn" + +#: src/app/main/ui/workspace/header.cljs +msgid "dashboard.export-shapes" +msgstr "fi ráńṣẹ" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to" +msgstr "" +"o lé ṣe àfikún ti ètò ìfiráńṣẹ si ẹ́límẹ́ǹtì láti bi àmì ohun ìní ( níbi " +"ìsàlẹ̀ báà lẹ́gbẹ̀ẹ́ ọ̀tun )." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to-link" +msgstr "àlàyé bí a ti ṣètò ìfiráńṣẹ sí pẹ́ńpọtì ." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.no-elements" +msgstr "kòsí àwọn ẹ́límẹ́ǹtì pẹ̀lú ètò ìfirańńṣẹ." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.title" +msgstr "àṣàyàn ìfiránṣẹ́" + +msgid "dashboard.export-standard-multi" +msgstr "danlóòdù %s àwọn ojúlówó fáìli (.svg + .json)" + +msgid "dashboard.export.detail" +msgstr "* ó le ní àwọn ẹ̀yà ara, àwòrán àti àwon àwọ̀ àti / tàbí àtẹ̀jáde." + +msgid "dashboard.export.options.all.message" +msgstr "" +"àwọn fáìli tí ó wà nínú yàrá ìkàwé pípín á dàpọ̀ mọ́ ti ìfiráńṣẹ́, fún " +"síṣetọ́jútheir linkage ìsopọ̀ wọn." + +msgid "dashboard.export.options.all.title" +msgstr "ṣe ìfiráńṣẹ́ yàrá ìkàwé pípín" + +msgid "dashboard.export.options.detach.message" +msgstr "" +"Shared libraries will not be included in the export and no assets will be " +"yàrá ìkàwé pípín kò ní sí nínú ti ìfiráńṣẹ́ àti pé kò ni ohun ìní kan tí " +"a ó fi kún yàrá ìkàwé. " + +msgid "dashboard.export.options.detach.title" +msgstr "ṣe ìtọ́jú ohun ìní iyàrá ìkàwé pípín bí i nǹkan tó jẹ́ kókó" + +msgid "dashboard.export.options.merge.message" +msgstr "" +"á fi fáìlì rẹ ráńṣẹ́ pẹ̀lú gbogbo àwọn ohun ìní tó wà láyìíka ni a ó papọ̀ " +"sínú fáìlì yàrá ìkàwé." + +msgid "dashboard.export.options.merge.title" +msgstr "da ohun ìní yàrá ìkàwé pípín pọ̀ mọ́ fáìlì yàrá ìkàwé" + +msgid "dashboard.export.title" +msgstr "fi àwọn fáìlì ráńṣẹ" + +msgid "dashboard.fonts.deleted-placeholder" +msgstr "fọ́ǹtì tó sọnù" + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.dismiss-all" +msgstr "yọ gbogbo wọn kúrò" + +msgid "dashboard.fonts.empty-placeholder" +msgstr "àwọn fọ́ǹtì tí o ọpulóòdù yó hàn níbí." + +#, markdown +msgid "dashboard.fonts.hero-text1" +msgstr "" +"èyíkéyìí wẹ́bù fọ́ǹtì tí o bá ti ọpulóòdù níbí ni á di àkópọ̀ mọ́ ẹbí fọ́ǹ" +"tì àwọn ọ̀rọ̀ ohun ìní tí o wà nínú àwọn fáìlì ẹgbẹ́. Fọ́ǹtì pẹ̀lú u " +"orúkọ ẹbi fọ́ǹtì kanna la ó dàpọ̀ mọ́ ẹgbẹ́ bí i**ẹbí fọ́ǹtì kan soso**. O " +"lè ọpulóòdù fọ́ǹtì pẹ̀lú àwọn ìlànà wọ̀nyí: **TTF, OTF and WOFF** (ẹyọ kan " +"péré la ó nílò)." + +#, markdown +msgid "dashboard.fonts.hero-text2" +msgstr "" +"àwọn fọ́ǹtì tí ó bá jẹ́ tì ẹ nìkan ni o lè ọpulóòdù tàbí èyí tí o ní ìwé " +"àṣẹ láti lò ní pẹ́ńpọtì. Wá a sí i nínú kọ́ńtẹ́tì abala apá ọ̀tún àwọn " +"òfin pẹ́ńpọtìiṣẹ́](https://pẹ́ńpọtì.apù/àwọn òfin.html). o sì le fẹ́ kà " +"nípa[ ìwé àṣẹ- pẹ́ńpọtì](https://www.taipogíráfì.com/faq)." + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.upload-all" +msgstr "ọpulóòdù gbogbo rẹ̀" + +#, markdown +msgid "dashboard.fonts.warning-text" +msgstr "" +"a ti ṣàwárí àwọn ohun tí ó le fa wàhálà nínú àwọn fọ́ǹtì ìlànà olóòro " +"oríṣiríṣi àwọn ètò tó wà fún ìṣesí ọ̀nà ẹ̀rọ. láti ṣe àyẹ̀wò rẹ̀ o lè " +"lofont vertical metrics services like ìlànà fọ́ǹtì olóòró fún àwọn iṣẹ́ ọ̀" +"nà ẹ̀rọ bí i [èyí èkínní](https://mẹ́tíríkì ìlànà olóòró.netlify .app/). Ní " +"àfikún, a rẹkọmẹ́ǹdì lílo[tíráńsìfọtà(https://tíráńsìfọtà.org/) láti " +"pilẹ̀ṣẹ̀ àwọn wẹ́bù fọ́ǹtì láti túnṣeàsìṣe. " + +msgid "dashboard.import.import-warning" +msgstr "àwọn fáìlì tí ó ní nǹkan tí kò fẹsẹ múlẹ̀ ti di yíyọ kúro." + +msgid "dashboard.import.progress.process-colors" +msgstr "síṣe ètò àwọ̀" + +msgid "dashboard.import.progress.process-components" +msgstr "síṣe ètò àwọn irin iṣẹ́" + +msgid "dashboard.import.progress.process-media" +msgstr "síṣe ètò àwọn ohun ìgbéròyìn jáde" + +msgid "dashboard.import.progress.process-page" +msgstr "síṣe ètò ojú ìwe : %s" + +msgid "dashboard.import.progress.process-typographies" +msgstr "síṣe ètò àkọsílẹ̀ ojú ìwé" + +msgid "dashboard.import.progress.upload-data" +msgstr "ọpulóòdù dátà sínú sáfà (%s/%s)" + +msgid "dashboard.import.progress.upload-media" +msgstr "ọpulóòdù fáìlì: %s" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.invite-profile" +msgstr "pe àwọn ènìyàn" + +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.leave-team" +msgstr "fẹgbẹ́ sílẹ̀" + +msgid "dashboard.libraries-and-templates" +msgstr "yàrá ìkàwé àti àwọn àwòṣe" + +msgid "dashboard.libraries-and-templates.explore" +msgstr "ṣe ìwákiri ọ̀pọ̀ wọn kí o sì mọ bí ó ṣe sojúṣe tiẹ" + +msgid "dashboard.libraries-and-templates.import-error" +msgstr "wàhálà wà fún gbígbé tẹ́ńpílétì wọlé. tẹ́ńpílétì kò wọlé." + +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.loading-files" +msgstr "ṣe ìkójọpọ̀ àwọn fáìlí rẹ …" + +msgid "dashboard.loading-fonts" +msgstr "ṣèkójọpọ̀ àwọ fọ́ǹtì rẹ …" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to" +msgstr "gbé lọ" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-multi" +msgstr "gbé %s àwọn fáìlì lọ" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-other-team" +msgstr "gbé lọ sí ẹgbẹ́ mìíràn" + +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/files.cljs +msgid "dashboard.new-file" +msgstr "+ fáìlì tuntun" + +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-file-prefix" +msgstr "fáìlì tuntun" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.new-project" +msgstr "+ iṣẹ́ àgbéṣe tuntun" + +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-project-prefix" +msgstr "iṣẹ́ àgbéṣe tuntun" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.no-matches-for" +msgstr "kò sí èyí tó báramu fún un“%s“" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.no-projects-placeholder" +msgstr "àwon iṣẹ́ àgbéṣe tí a kànpọ á hàn níbí" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-changed-successfully" +msgstr "a ti mú ímeèlì rẹ dójú ìwọn dáadáa" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-verified-successfully" +msgstr "a ti ṣe ìwádìí ímeèlì rẹ dáadáa" + +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.notifications.password-saved" +msgstr "a ti fi ọ̀rọ̀ ìgbaniwọlé rẹ pamọ́ dáadáa!" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.num-of-members" +msgstr "%s àwọn ọmọ ẹgbẹ́" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.open-in-new-tab" +msgstr "ṣí fáìlì sínú tábù tuntun" + +msgid "dashboard.options" +msgstr "àwọn àṣàyàn" + +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.password-change" +msgstr "yí ọ̀rọ̀ ìgbaniwọlé padà" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.pin-unpin" +msgstr "pínì/yọ pínì kúrò" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.projects-title" +msgstr "àwọn iṣẹ́ àgbéṣe" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.remove-account" +msgstr "o fẹ́ yọ àkáǹtì rẹ kúro?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.remove-shared" +msgstr "yọ ọ́ kúrò gẹ́gẹ́ bí yàrá kàwé pípín" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.save-settings" +msgstr "fi àwọn eto pamọ́" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.search-placeholder" +msgstr "ṣàwárí…" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.searching-for" +msgstr "ṣàwárí fún “%s“…" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-language" +msgstr "yan èdè ui" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-theme" +msgstr "yan àkọlé" + +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.show-all-files" +msgstr "fi gbogbo àwn fáìlì hàn" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-delete-project" +msgstr "iṣẹ́ àgbéṣe rẹ ti parẹ́ dáadáa" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-move-project" +msgstr "a ti gbé iṣẹ́ àgbéṣe rẹ kúrò dáadáa" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-info" +msgstr "àlàyé ẹgbẹ́" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-members" +msgstr "àwọn ọmọ ẹgbẹ́" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-projects" +msgstr "iṣẹ́ àgbéṣe ọmọ ẹgbẹ́" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.theme-change" +msgstr "àkọlé ui" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.title-search" +msgstr "ṣàwárí àwọn èsì" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.type-something" +msgstr "tẹ̀ láti rí àwọn èsì" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.unpublish-shared" +msgstr "yàrá ìkàwé tí a kòtí ì gbé jáde" + +#: src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs +msgid "dashboard.update-settings" +msgstr "mú àwọn ètò dójú ìwọ̀n" + +msgid "dashboard.webhooks.active" +msgstr "ti ń siṣẹ́" + +msgid "dashboard.webhooks.active.explain" +msgstr "When this hook is triggered event details will be delivered" + +msgid "dashboard.webhooks.content-type" +msgstr "ẹ̀yà kọ́ńtẹ́ǹtì" + +msgid "dashboard.webhooks.create" +msgstr "ṣẹ̀dá ìkọ́-wẹ́bù" + +msgid "dashboard.webhooks.create.success" +msgstr "a ti ṣẹ̀dá ìkọ́-wẹ́bù dáadáa ." + +msgid "dashboard.webhooks.description" +msgstr "" +"àwọn ìkọ́-wẹ́bù jẹ́ ọ̀nà tó rọrùn láti fi ààyè sílẹ̀ fún àwọn ààyè ayélujára " +"mìíràn àti awọn ápù ṣe filọ́ tí àwọn ìṣẹ̀lẹ̀ kan bá ní pẹ́ńpọtì’’ a ó fi " +"ìbéèrè ráńṣẹ́ sí ọ̀kọ̀kan wọn tí urls tó o pèsè." + +msgid "dashboard.webhooks.empty.add-one" +msgstr "tẹ bọ́tínnì \"fikún ìkọ́- wẹ́bù\" láti fì kan sí i." + +msgid "dashboard.webhooks.empty.no-webhooks" +msgstr "kò sí ìkọ́-wẹ́bù tí a ṣẹ̀da´dì sisìnyí." + +#: src/app/main/ui/settings.cljs +msgid "dashboard.your-account-title" +msgstr "àkáǹtì rẹ" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-email" +msgstr "ímeèlì" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-name" +msgstr "ímeèlì rẹ" + +#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.your-penpot" +msgstr "pẹ́ńpọtì rẹ" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-ok" +msgstr "ó dára" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-title" +msgstr "àkíyèsí" + +#: src/app/main/ui/confirm.cljs +msgid "ds.component-subtitle" +msgstr "ní láti ṣe ìmúdójú ìwọ̀n àwọn irin iṣẹ́:" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-cancel" +msgstr "fagilé e" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-ok" +msgstr "ó dára" + +#: src/app/main/ui/auth/login.cljs +msgid "errors.auth-provider-not-configured" +msgstr "a kò tí ì fàṣẹ si àtúntò olùpèṣè." + +msgid "errors.auth.unable-to-login" +msgstr "ó dàbí pé o kò tí ì fàṣẹ sí i tàbí àkókò ti kọjá ." + +msgid "errors.bad-font" +msgstr "fọ́ǹtì %s kò ṣe kójọpọ̀" + +msgid "errors.bad-font-plural" +msgstr "àwọn fọ́ǹtì %s kò ṣe kójọpọ̀" + +msgid "errors.cannot-upload" +msgstr "kò le ọpulóòdù fáìlì ìgbéròyìn-jáde." + +#: src/app/main/data/workspace.cljs +msgid "errors.clipboard-not-implemented" +msgstr "a ṣàwákiri rẹ kò le ṣe iṣẹ́ yìí" + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs +msgid "errors.email-already-exists" +msgstr "ímeèlì yìí ti jẹ́ lílò tẹ́lẹ" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.email-already-validated" +msgstr "a ti fọwọ́ sí ímeèlì rẹ tẹ́lẹ̀." + +msgid "errors.email-as-password" +msgstr "o kò le lo ímeèlì rẹ gẹ́gẹ́ bí ọ̀rọ̀ ìgbaniwọlé" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.email-has-permanent-bounces" +msgstr "Ímeèlì «%s» ti ní ìjábọ̀ ọ̀pọ̀ọlọpọ̀ ìta-bọn-ọ̀n ti pẹ́." + +#: src/app/main/ui/settings/change_email.cljs +msgid "errors.email-invalid-confirmation" +msgstr "Ímeèlì tí a ti mọ̀dájú gbọ́dọ̀ báramu" + +msgid "errors.email-spam-or-permanent-bounces" +msgstr "" +"Ímeèlì ti «%s» ń jábọ̀ gẹ́gẹ́ bí i awúrúju tàbí ìta-bọ̀n-ọnọǹ tipẹ́." + +#: src/app/main/errors.cljs +msgid "errors.feature-not-supported" +msgstr "Àwọn ẹ̀yà ara ẹ̀rọ '%s' kò ní àtìlẹ́yìn." + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.generic" +msgstr "Àsìṣe kan ti ṣẹlẹ̀." + +#: src/app/main/ui/components/color_input.cljs +msgid "errors.invalid-color" +msgstr "àwọ̀ tó ti díbàjẹ́" + +msgid "errors.invite-invalid.info" +msgstr "Èyí tí a pè le parẹ́ tàbí ki àkókò lekọjá ." + +#: src/app/main/ui/auth/login.cljs +msgid "errors.ldap-disabled" +msgstr "Ìfàṣẹsí LDAP kò ṣe é ṣe ." + +#: src/app/main/errors.cljs +msgid "errors.max-quote-reached" +msgstr "O ti débi '%s' ìfàmìsí. Késí i pẹ̀lú àtìlẹ́yìn ." + +#: src/app/main/data/workspace/persistence.cljs +msgid "errors.media-too-large" +msgstr "Àwòrán tóbi púpọ ju ohun tí a le fisí lọ." + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "errors.media-type-not-allowed" +msgstr "Ó dàbí pé èyí kì í ṣe àwòrán tó fẹsẹ́ múlẹ̀." + +#: src/app/main/ui/dashboard/team.cljs +msgid "errors.member-is-muted" +msgstr "" +"Pírófáìlì ímeèlì tí ò ǹ pè ti dákẹ (ti jábọ̀ àwúrúju tàbí ìtabọ̀n-ọ̀n tó " +"ga)." + +#: src/app/main/ui/settings/password.cljs +msgid "errors.password-invalid-confirmation" +msgstr "Ijẹ́rìísí ọ̀rọ̀ ìgbaniwọlé rẹ gbọ́dọ̀ báramu" + +#: src/app/main/ui/settings/password.cljs +msgid "errors.password-too-short" +msgstr "Ọ̀rọ̀ ìgbaniwọlé kò gbọdọ̀ dín ní lẹ́tà mẹ́jọ" + +msgid "errors.team-leave.insufficient-members" +msgstr "kí àwọn ọmọ ẹgbẹ́ tí kò péye fi ẹgbẹ́ sílẹ̀, àbí bóyá o fẹ́ paárẹ́ ni ." + +msgid "errors.team-leave.member-does-not-exists" +msgstr "Kòsí ọmọ ẹgbẹ́ tí o fẹ́ yàn ." + +msgid "errors.profile-blocked" +msgstr "Ti dínà mọ́ pírófáìlì" + +#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.profile-is-muted" +msgstr "" +"Ímeèlì pírófáìlì rẹ ti ní ìdákẹ́ (ìjábọ̀ àwúrúju tàbí ìtabọ̀n-ọ̀n tó ga)." + +#: src/app/main/ui/auth/register.cljs +msgid "errors.registration-disabled" +msgstr "Ìforúkọ-sílẹ̀ kò ṣe é ṣe lọ́wọ́lọ́wọ́." + +msgid "errors.team-leave.owner-cant-leave" +msgstr "" +"Oní nǹkan kò le fi ẹgbẹ́ sílẹ̀ , o gbọ́dọ̀ tún ṣe àtúnyàn iṣẹ́ oní nǹkan." + +#: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "errors.unexpected-error" +msgstr "Àsìṣe tí a kòrò tẹ́lẹ̀ ti ṣẹlẹ." + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.unexpected-token" +msgstr "Tókìnnì àìmọ̀" + +msgid "errors.webhooks.connection" +msgstr "Àsìṣe nínú ètò ìsopọ̀, kò lè dé ibi URL" + +msgid "errors.webhooks.invalid-uri" +msgstr "URL kò páásì ìfọwọ́sí." + +msgid "errors.webhooks.last-delivery" +msgstr "Èyí tí a fijíṣẹ́ kẹ́yìn kò dára." + +msgid "errors.webhooks.ssl-validation" +msgstr "Àsìṣe nínú ìfẹwọ́sí SSL ." + +msgid "errors.webhooks.unexpected" +msgstr "Unexpected error on validating àsìṣe àìròtẹ́lẹ̀ lórí ìfọwọ́sí" + +msgid "errors.webhooks.unexpected-status" +msgstr "Ipò àìròtẹ́lẹ̀ %s" + +#: src/app/main/ui/auth/login.cljs +msgid "errors.wrong-credentials" +msgstr "Ímeèlì tàbí ọ̀rọ̀ ìgbaniwọlé kò tọ̀nà." + +#: src/app/main/ui/settings/password.cljs +msgid "errors.wrong-old-password" +msgstr "Ọ̀rọ̀ ìgbaniwọlé ti àtijọ́ kò tọ̀nà" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.description" +msgstr "Àpèjúwe" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-go-to" +msgstr "Lọ ibi àpérò pẹ́ńpọtì" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-subtitle1" +msgstr "" +"Inú wa dùn láti rí ẹ níbí. Tí o bá nílò ìrànlọ́wọ, please search before you " +"jọ̀wọ́ ṣàwárí kí o tó firáńṣẹ́." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.title" +msgstr "Ímeèlì" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-title" +msgstr "Agbègbè pẹ́ńpọtì" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subject" +msgstr "Kókó-ọ̀rọ̀" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subtitle" +msgstr "" +"Jọ̀wọ́ ṣàpèjúwe ìdí tó wà fún ímeèlì rẹ, ṣàfihàn tì àríyànjiyàn bá wà, le jẹ́" +" èrò tàbí síṣe iyèméjì. Ìkan lára àwọn ọmọ ẹgbẹ́ wa yóò dáhùn láìpẹ́ " +"láìjìnnà." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-go-to" +msgstr "Lọ sí Tíwítà" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-subtitle1" +msgstr "A wà níbí láti ṣe ìrànlọ́wọ́ fún àwọn ìbéèrè tó bá wà lórí iṣẹ́ ọnà." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-title" +msgstr "Àkáùnti àtìlẹ́yìn fún Tíwítà" + +#: src/app/main/ui/settings/password.cljs +msgid "generic.error" +msgstr "Àsìṣe kan ti ṣẹlẹ̀" + +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur" +msgstr "ìkùku ti wà" + +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur.value" +msgstr "bó se péye" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hex" +msgstr "dínà mọ́" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hsla" +msgstr "Ti dínà mọ" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.rgba" +msgstr "RGBA" + +#: src/app/main/ui/inspect/attributes/fill.cljs +msgid "inspect.attributes.fill" +msgstr "Fílì" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.download" +msgstr "Danlóòdù orísun àwòrán" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.height" +msgstr "Gíga" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.width" +msgstr "Fífẹ" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout" +msgstr "Layout" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.height" +msgstr "Gíga" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.left" +msgstr "Òsì" + +#: src/app/main/ui/inspect/attributes/layout.cljs, src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.radius" +msgstr "Rédíọ́sì" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.rotation" +msgstr "Yíyí" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.top" +msgstr "Òkè" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.width" +msgstr "Fífẹ̀" + +#: src/app/main/ui/inspect/attributes/shadow.cljs +msgid "inspect.attributes.shadow" +msgstr "Ibòòji" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.size" +msgstr "Ìwọ̀n àti ipò" + +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke" +msgstr "Stroke Sítírókì" + +#, permanent +msgid "inspect.attributes.stroke.alignment.center" +msgstr "Ààrin" + +#, permanent +msgid "inspect.attributes.stroke.alignment.inner" +msgstr "Nínú" + +#, permanent +msgid "inspect.attributes.stroke.alignment.outer" +msgstr "Ìtá" + +msgid "inspect.attributes.stroke.style.dotted" +msgstr "ti sàmì" + +msgid "inspect.attributes.stroke.style.mixed" +msgstr "Àdàlú" + +msgid "inspect.attributes.stroke.style.none" +msgstr "Kò sí" + +msgid "inspect.attributes.stroke.style.solid" +msgstr "Lágbára" + +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke.width" +msgstr "Fífẹ̀" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography" +msgstr "Taipogíráfì" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-family" +msgstr "Ẹbí Fọ́ǹtì" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-size" +msgstr "Ìwọ̀n Fọ́ǹtì" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-style" +msgstr "Àrà Fọ́ǹtì" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-weight" +msgstr "Ìwúwo Fọ́ǹtì" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.letter-spacing" +msgstr "Ìfàyè sí ààrin Lẹ́tà" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.line-height" +msgstr "Gíga Ìlà" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-decoration" +msgstr "Síṣe ọ̀rọ̀ lọ́ṣọ̀ọ́" + +msgid "inspect.attributes.typography.text-decoration.none" +msgstr "Kò sí" + +msgid "inspect.attributes.typography.text-decoration.strikethrough" +msgstr "Strikethrough" + +msgid "inspect.attributes.typography.text-decoration.underline" +msgstr "Fàlà sí" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-transform" +msgstr "ọ̀rọ̀ ti yí padà" + +msgid "inspect.attributes.typography.text-transform.lowercase" +msgstr "Lẹ́tà Kékeré" + +msgid "inspect.attributes.typography.text-transform.none" +msgstr "Kò sí" + +msgid "inspect.attributes.typography.text-transform.titlecase" +msgstr "Àkọlé Lẹ́tà" + +msgid "inspect.attributes.typography.text-transform.uppercase" +msgstr "Lẹ́tà ńlá" + +msgid "inspect.empty.help" +msgstr "" +"Tí o bá fẹ́ mọ̀ nípa àpẹẹrẹ alárà bẹ ààrin gbùngbùn àwọn pẹ́ńpọtì wò fún " +"ìràlọ́wọ́" + +msgid "inspect.empty.more-info" +msgstr "Àfikún àlàyé fún ìbẹ̀wò" + +msgid "inspect.empty.select" +msgstr "Yan ìrísí, bọ́ọ̀dù tàbí ẹgbẹ́ láti lọ ṣe ìbẹ̀wò ohun ìní wọn àti kóòdù" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code" +msgstr "Kóòdù" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code.selected.multiple" +msgstr "%s Ti yàn" + +msgid "inspect.tabs.code.selected.path" +msgstr "Ipa-ọ̀nà" + +msgid "inspect.tabs.code.selected.rect" +msgstr "Rectangle" + +msgid "inspect.tabs.code.selected.svg-raw" +msgstr "SVG" + +msgid "inspect.tabs.code.selected.text" +msgstr "Ọ̀rọ̀" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.info" +msgstr "Àlàyé" + +#: src/app/main/ui/workspace/header.cljs +msgid "label.shortcuts" +msgstr "Ọ̀nà àbùjá" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "Ṣàyẹ̀wò tókín-nì" + +msgid "labels.active" +msgstr "Ń siṣẹ́" + +msgid "labels.add-custom-font" +msgstr "Ṣàfikún àṣà Fọ́ǹtì" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.admin" +msgstr "Alábòjútó" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.all" +msgstr "Gbogbo ẹ̀" + +msgid "labels.back" +msgstr "Padá" + +#: src/app/main/ui/static.cljs +msgid "labels.bad-gateway.desc-message" +msgstr "" +"Ó dàbí ẹnipé o ní láti dúró díẹ̀ kí o tún gbìyàjú ; à ń siṣẹ́ díẹ̀ síṣe " +"ìtọ́jú sáfà wa." + +#: src/app/main/ui/static.cljs +msgid "labels.bad-gateway.main-message" +msgstr "Ọ̀nà-àbáwọle búburú" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.cancel" +msgstr "Párẹ́" + +msgid "labels.font-family" +msgstr "Ẹbí fọ́ǹtì" + +msgid "labels.close" +msgstr "Tì í" + +#: src/app/main/ui/dashboard/comments.cljs +msgid "labels.comments" +msgstr "dásí i" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.community" +msgstr "Agbègbè" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.confirm-password" +msgstr "Jẹ́rìísí" + +msgid "labels.continue" +msgstr "Tẹ̀ síwájú" + +msgid "labels.continue-with" +msgstr "Tẹ̀ síwájú pẹ̀lú" + +msgid "labels.continue-with-penpot" +msgstr "O lè tẹ̀ síwájú pẹ̀lú àkáúnti pẹ́ńpọtì" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.copy-invitation-link" +msgstr "ṣà dàkọ ọ̀nà àsopọ̀" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "labels.create" +msgstr "Ṣẹ̀dá" + +#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team" +msgstr "Ṣẹ̀dá ẹgbẹ́ tuntun" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team.placeholder" +msgstr "Fi orúkọ ẹgbẹ́ tuntun wọlé" + +msgid "labels.custom-fonts" +msgstr "Kọ́sítọ́mù àwọn fọ́ǹtì" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.dashboard" +msgstr "Dáṣìbọọ̀dù" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete" +msgstr "Paárẹ́" + +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment" +msgstr "Pa kọ́mẹ́ǹtì rẹ́" + +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment-thread" +msgstr "Pa gbogbo kọ́mẹ́ǹtì rẹ́" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.delete-invitation" +msgstr "Pa ìfìwépè rẹ́" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete-multi-files" +msgstr "Pa gbogbo %s fáìlì rẹ́" + +msgid "labels.discard" +msgstr "Yọ́ kúrò" + +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.drafts" +msgstr "Kọ ọ́ sílẹ̀" + +#: src/app/main/ui/comments.cljs +msgid "labels.edit" +msgstr "sàtúnkà" + +msgid "labels.edit-file" +msgstr "sàtúnkà fáìlì" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.editor" +msgstr "Olóòtú" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.expired-invitation" +msgstr "Kọjá àkókò" + +msgid "labels.export" +msgstr "Fi ránṣẹ́" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-disabled" +msgstr "Èsì kò siṣẹ́" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-sent" +msgstr "Èsì ti lọ" + +msgid "labels.font-providers" +msgstr "Àwọn Olùpèṣè fọ́ǹtì" + +msgid "labels.font-variants" +msgstr "Àrà" + +msgid "labels.fonts" +msgstr "Fọ̀ǹtì" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.github-repo" +msgstr "Báǹkì gítì-ọbù" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.give-feedback" +msgstr "Fèsì padà" + +msgid "labels.go-back" +msgstr "Padà sẹ́yìn" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.help-center" +msgstr "Ibi ìranilọ́wọ́" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.hide-resolved-comments" +msgstr "Fi àwọn ọ̀rọ̀ tí a ti yanjú pamọ́" + +msgid "labels.inactive" +msgstr "kò ja fáfá" + +msgid "labels.installed-fonts" +msgstr "Fi àwọn fọ́ǹtì sí orí ẹ̀rọ" + +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.desc-message" +msgstr "" +"Nǹkan bíburú ti ṣẹlè. Jọ̀wọ́ ṣe àtúnṣe iṣẹ́ náà àti pé tí wàhálà bá sì tẹ̀ " +"síwájú, ké sí olùbásọ̀rọ̀." + +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.main-message" +msgstr "Àsìṣe ti abẹ́nú" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.invitations" +msgstr "Ìfiwépè" + +#: src/app/main/ui/settings/options.cljs +msgid "labels.language" +msgstr "Èdè" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.libraries-and-templates" +msgstr "Àwọn yàrá ìkàwé & Tẹ́ńpílétì" + +msgid "labels.log-or-sign" +msgstr "ṣí kí o wọle tàbí kí o ṣàmì wọlé" + +#: src/app/main/ui/settings.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.logout" +msgstr "Padé kí ojáde" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.member" +msgstr "Ẹgbẹ" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.members" +msgstr "Àwọn ọmọ Ẹgbẹ́" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.new-password" +msgstr "Ọ̀rọ̀ Ìgbaniwọlé tuntun" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs +msgid "labels.no-comments-available" +msgstr "A ti gbé gbogbo yín dè! Àwọn ọ̀rọ̀ ìfitónilétí tuntun yí ó hàn níbí." + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.no-invitations" +msgstr "kò si àwọn ìfìwépè kankan nílẹ̀." + +#: src/app/main/ui/dashboard/team.cljs +#, markdown +msgid "labels.no-invitations-hint" +msgstr "Tẹ̀ ẹ́ **Pe àwọn ènìyàn** tẹ bọ́tìnnì láti pe àwọn ènìyàn sínú ẹgbẹ́." + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.desc-message" +msgstr "Ojú ìwé yìí le má sìí tàbí ò kò ni ìgbaniláàyè láti wọlé sí bẹ̀ ." + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.main-message" +msgstr "Óóho!" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.old-password" +msgstr "Ọ̀rọ̀ ìgbaniwọlé àtijọ́" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.only-yours" +msgstr "Tìrẹ nìkan" + +msgid "labels.or" +msgstr "tàbí" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.owner" +msgstr "Oníǹkan" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.projects" +msgstr "Àwọn iṣẹ́ àgbéṣe" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.password" +msgstr "Ọ̀rọ̀ ìgbaniwọlé" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.release-notes" +msgstr "Fi àkọsílẹ̀ rẹ sílẹ̀" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.pending-invitation" +msgstr "Ńńdúró" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.profile" +msgstr "Pírófáìlì" + +#: src/app/main/ui/workspace.cljs +msgid "labels.reload-file" +msgstr "Tún gbé fáìlì sí i" + +#: src/app/main/ui/workspace/libraries.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.remove" +msgstr "Yọ ọ́ kúrò" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.remove-member" +msgstr "Yọ ọmọ ẹgbẹ́ kúrò" + +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.rename" +msgstr "Fún un lórúkọ mìíràn" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.rename-team" +msgstr "Fún ẹgbẹ́ lórúkọ mìíràn" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.resend-invitation" +msgstr "Tún fì ìwé ìpè ránńṣẹ́" + +#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs +msgid "labels.retry" +msgstr "Tún gbìyànjú" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.role" +msgstr "Ojúṣe" + +msgid "labels.save" +msgstr "Fi pamọ́" + +msgid "labels.search-font" +msgstr "Ṣàwárí fọ́ǹtì" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.send" +msgstr "Fi ránńṣẹ́" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.sending" +msgstr "Fífi-ránńṣẹ…" + +#: src/app/main/ui/static.cljs +msgid "labels.service-unavailable.desc-message" +msgstr "A wà níbi ètò ìpèsè ìtọ́jú àwọn sísítẹ́mù wa." + +#: src/app/main/ui/static.cljs +msgid "labels.service-unavailable.main-message" +msgstr "Sáfísì kòsí" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.settings" +msgstr "Àwọn ètò" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-your-comments" +msgstr "Fi àwọn kọ́mẹ́ǹtì tìrẹ nìkan hàn" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.status" +msgstr "Ipò" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.tutorials" +msgstr "Ìbáṣepọ̀" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.unpublish-multi-files" +msgstr "%s àwọn fáìlì tí a kò tí kọ jáde" + +#: src/app/main/ui/settings/profile.cljs +msgid "labels.update" +msgstr "mú dójú ìwọ̀n" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.update-team" +msgstr "Mẹ́gbẹ́ dójú ìwọ̀n" + +msgid "labels.upload" +msgstr "Ọpulóòdù" + +msgid "labels.upload-custom-fonts" +msgstr "Ọpulóòdù kọ́sítẹ́mù fọ́ǹtì" + +msgid "labels.uploading" +msgstr "Ń ọpulóòdù…" + +msgid "labels.view-only" +msgstr "Wò ó nìkan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.viewer" +msgstr "Olùwo" + +msgid "labels.webhooks" +msgstr "àwọn ìwé ìkọ́ wẹ́bù" + +#: src/app/main/ui/comments.cljs +msgid "labels.write-new-comment" +msgstr "Write new comment Kọ kọ́mẹ́ǹtì tuntun" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.you" +msgstr "(ìwọ)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.your-account" +msgstr "Àkáùntì rẹ" + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "media.loading" +msgstr "Ìkójọpọ̀ àwòrán…" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Yàrá ìkàwé rẹ ti dófìfo. Lọ́gán tí o bá ti ṣàfikún gẹ́gẹ́ bí yàrá ìkàwé " +"pípín, dúkìá tí o ṣẹ̀dá á wà fún lílò àwọn fáìlì rẹ tó kù. Are you sure " +"you tí o fẹ́ kọ jáde?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.accept" +msgstr "Ṣàfikún gẹ́gẹ́ bí yàrá ìkàwé pípín" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.hint" +msgstr "" +"Lẹ́ẹ̀kan-nà tí o bá ti ṣàfikún gẹ́gẹ́ bí yàrá ìkàwé pípín, àwọn dúkìá inú " +"fáìlì yàrá á di wíwà fún lílò àwọn fáìlì rẹ tó kù." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.message" +msgstr "Ṣàfikún “%s” gẹ́gẹ́ bí yàrá ìkàwé pípí" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.big-nudge" +msgstr "Big nudge Nọ́ọ̀jì ńlá" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.confirm-email" +msgstr "Ṣàyẹ̀wò ímeèlì tuntun" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.info" +msgstr "" +"A fi ímeèlì kan ránń ṣẹ́ sí inú ímeèlì tí ò ń lò lọ́wọ́lọ́wọ́“%s” láti ṣe " +"àyẹ̀wò ìdánimọ̀ rẹ." + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.new-email" +msgstr "Ímeèlì tuntun" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.submit" +msgstr "Pàrọ̀ ímeèlìl" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.title" +msgstr "Pàrọ̀ ímeèlì rẹ" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.copy-token" +msgstr "Ṣẹ̀dà tókìn" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.expiration-date.label" +msgstr "Ọjọ́ ìparí" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "Orúkọ" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.placeholder" +msgstr "Orúkọ yí ó ràn wá lọ́wọ́ láti mọ ohun tí tókìn wà fún" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "Ṣẹ̀dà tókìn" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "Pilẹ̀ṣẹ̀ wí wọlé tókìń" + +msgid "modals.create-webhook.submit-label" +msgstr "Ṣẹ̀dá ìkọ́- wẹ́bù" + +msgid "modals.create-webhook.title" +msgstr "Ṣẹ̀dá ìkọ́-wẹ́bù" + +msgid "modals.create-webhook.url.label" +msgstr "Péloòdù URL" + +msgid "modals.create-webhook.url.placeholder" +msgstr "https://àpẹrẹ.com/postreceive ìgbà àtẹ̀yinwá" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "Pa tókìn rẹ́" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa tókìn yi rẹ́?" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "Pa tókìn rẹ́" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.cancel" +msgstr "Fagilé e kí o sì fi àkáùntì mi pamọ́" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.confirm" +msgstr "Bẹ́ẹ̀ni, pa àkáùntì mi rẹ́" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.info" +msgstr "" +"Nípa yíyọ àkáùntì rẹ kúrò o ’ pàdánù gbogbo àwọn iṣẹ́ àgbéṣe rẹ àti àwọn tí " +"ó wà lápamọ́." + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.title" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa àkáùntì rẹ rẹ́ ?" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.accept" +msgstr "Pa ìtàkurọ̀sọ rẹ́" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.message" +msgstr "" +"Ṣé ódá ọ lójú pé o fẹ́ pa ìtàkurọ̀sọ yìí rẹ́? All comments in this Gbogbo " +"àsọyé tó wà níbí tó tẹ̀lé ra wọn ni á di píparẹ́." + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.title" +msgstr "Pa ìtàkurọ̀sọ rẹ" + +msgid "modals.delete-component-annotation.message" +msgstr "Ṣe ó dá ọ lójú pé o fẹ́ pa àkọsílẹ̀ yìí rẹ́?" + +msgid "modals.delete-component-annotation.title" +msgstr "Pa àkọsílẹ̀ rẹ́" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.accept" +msgstr "Pa fáìlì rẹ́" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa fáìlì yìí rẹ́?" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.title" +msgstr "Pa fáìlì rẹ́" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.accept" +msgstr "Pa àwọn fáìlì rẹ́" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa %s àwọn fáìlì rẹ́ ?" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.title" +msgstr "Pa fáìlì rẹ́ %s" + +msgid "modals.delete-font-variant.message" +msgstr "" +"Ṣé ó dá ọ lójú pé o fẹ́ pa fọ́ǹtì alárà yìí rẹ́ ? Kò ní gbé e tí a bá lò " +"ó nínú fáìlì." + +msgid "modals.delete-font.message" +msgstr "" +"Ṣé ó dá ọ lójú pé o fẹ́ pa fẹ́ǹtì yí rẹ́? Kò ní le gbé e tí a bá lò ó nínú " +"Fáìlì." + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.body" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa ojú ìwé yìí rẹ́?" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.title" +msgstr "Pa ojú ìwé rẹ́" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.accept" +msgstr "Pa iṣẹ́ àgbéṣe rẹ́" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa iṣẹ́ àgbéṣe yìí rẹ́?" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.title" +msgstr "Pa iṣẹ́ àgbéṣe rẹ́" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.accept" +msgstr "Pa ẹgbẹ́ rẹ́" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.message" +msgstr "" +"Ṣé ó dá ọ lójú pé o fẹ́ pa ẹgbẹ́ yìí rẹ́? Ggogbo iṣẹ́ àgbéṣe àti fáìlì tí ó " +"bá ní nǹkan ṣe pẹ̀lú ẹgbẹ́ ni a ó parẹ́ pátápátá." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.title" +msgstr "Yọ ẹgbẹ́ kúrò" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.accept" +msgstr "Yọ ọmọ ẹgbẹ́ kúrò" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ yọ ọmọ ẹgbẹ́ yìí kúrò nínú ẹgbẹ́?" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.title" +msgstr "Yọ ọmọ ẹgbẹ́ kúrò" + +msgid "modals.delete-webhook.accept" +msgstr "Pa ìkọ́-wẹ́bù rẹ́" + +msgid "modals.delete-webhook.title" +msgstr "Pa ìkọ́- wẹ́bù rẹ́" + +msgid "modals.edit-webhook.submit-label" +msgstr "Ṣe àtúnṣe ìkọ́- wẹ́bù" + +msgid "modals.edit-webhook.title" +msgstr "Ṣe àtúnṣe ìkọ́-wẹ́bù" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-member-confirm.accept" +msgstr "Fi ìfìwépè ránńṣẹ́" + +msgid "modals.invite-member.emails" +msgstr "Ímeèlì, kí kọmá yà á sọ́tọ̀" + +msgid "modals.invite-member.repeated-invitation" +msgstr "" +"Díẹ̀ nínú àwọn ímeèlì wá láti ọ̀dọ̀ àwọn tó jẹ́ ọmọ ẹgbẹ́ ní ìsinsìnyí. Ìwé " +"ìfipé wọn a kò nífi ránńṣẹ́." + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-team-member.title" +msgstr "Pe àwọn ọmọ ẹgbẹ́ sínú ẹgbẹ́" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.hint" +msgstr "" +"Gẹ́gẹ́ bí o ṣe jẹ́ ìwọ nìkan ni ọmọ ẹgbẹ́ nínú ẹgbẹ́ yìí, a ó yọ ẹgbẹ́ kúrò " +"pẹ̀lú iṣẹ́ àgbéṣe rẹ̀ àti àwọn fáìlì." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ kúrò nínú %s ẹgbẹ́?" + +msgid "modals.publish-empty-library.title" +msgstr "Gbé yàrá ìkàwé tó ṣófìfo jáde" + +msgid "modals.leave-and-reassign.forbidden" +msgstr "" +"O kò lè kúrò nínú ẹgbẹ́ tí kò bá sí ọmọ ẹgbẹ́ mìíràn tó ní ìgbéga sí oní ǹǹ" +"kan. O lè fẹ́ pa ẹgbẹ́ rẹ́." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.hint1" +msgstr "" +"Ìwọ ni ẹni tí ó ni ẹgbẹ́ yìí. Please select another member to promote to " +"Jọ̀wọ́ yan ọmọ ẹgbẹ́ mìíràn tí yíò ní ìgbéga ẹni tí ó ni nǹkan kí o tó " +"kúrò." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.promote-and-leave" +msgstr "Ṣe ìgbéga kí o kúrò" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.select-member-to-promote" +msgstr "Yan ọmọ ẹgbẹ́ kan tí o ó gbéga" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.title" +msgstr "Kí o tó kúrò" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.accept" +msgstr "Fi ẹgbẹ́ sílẹ̀" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ fi ẹgbẹ́ yìí sílẹ̀?" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.title" +msgstr "Ń fi ẹgbẹ́ sílẹ̀" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.nudge-title" +msgstr "Fi kún iye tó jẹ́" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.accept" +msgstr "Yọ ọ́ kúrò gẹ́gẹ́ bí i yàrá ìkàwé pípín" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.accept" +msgstr "Gbé ẹni tó ni nǹkan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.hint" +msgstr "" +"Tí o bá gbé ẹni tí ó ni nǹkan, o ó yìí ojúṣe rẹ pada sí Alábòjútó, losing " +"àwọn ìgbà láàyè díẹ̀ á wà fún ẹgbẹ́ yìí. " + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.message" +msgstr "" +"Ìwọ ni ẹni tí ó ni ẹgbẹ́ yìí lọ́wọ́lọ́wọ́. Are you sure you want to make Ṣé " +"ó dá ọ lójú pé o fẹ́ jẹ́ %s oní nǹkan tuntun fún ẹgbẹ́?" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.title" +msgstr "Ẹni tó ni ẹgbẹ́ tuntun" + +msgid "modals.publish-empty-library.message" +msgstr "Yàrá ìkàwé rẹ ṣófìfo. Ṣé ó dá ọ lójú pé o fẹ́ kọ ọ́ jáde?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.hint" +msgstr "" +"Lọ́gán tí o bá ti yọ ọ́ kúrò gẹ́gẹ́ bí i Fáìlì yàrá ìkàwé pípín , Fáìlì " +"yàrà ìkàwé ti fáìlì yìí á dúró tí á wà fún lílò àwọn fáìlì rẹ tó kù." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.message" +msgstr "Yọ ọ́ kúrò“%s” gẹ́gẹ́ bí yàrá ìkàwé pípín" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.message" +msgstr "Mú àwọn ẹ̀yà irin iṣẹ́ dójú ìwọ̀n nínú iyàram ìkàwé pípín" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.accept" +msgstr "Mú dójú ìwọ̀n" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.cancel" +msgstr "Fagilé e" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.hint" +msgstr "" +"O ṣetán látí mú àwọn ẹ̀yà irin iṣẹ́ yàrá ìkàwé dójú ìwọ̀n . This may affect " +"Èyí lè fa wàhálà fún àwọn fáìlì míràn tí ó ń lò ó." + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.message" +msgstr "Mú ẹ̀yà iyàrá ìkàwé pípín kan dójú ìwọ̀n" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.small-nudge" +msgstr "Fọwọ́ làn-ań díẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.hint" +msgstr "" +"O ṣetán láti mú àwọn ẹ̀yà irin iṣẹ́ dé ojú ìwọ̀n ní yàrá ìkàwé pípín. Èyí " +"le fa wàhálà fún àwọn fáìlì mìíràn tí ó ń lò ó." + +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "Ẹ̀yà tuntun ti wà, jọ̀wọ́ tún sọ ọ́ jí" + +#: src/app/main/ui/dashboard/team.cljs +msgid "notifications.invitation-email-sent" +msgstr "Ìfipè tí a fi ránńṣẹ́ ti lọ dáadáa" + +#: src/app/main/ui/dashboard/team.cljs +msgid "notifications.invitation-link-copied" +msgstr "ti ṣe àdàkọ ìfipè ọ̀nà ìtọ́ka sí" + +msgid "onboarding-v2.welcome.desc2" +msgstr "" +"Ìkẹ́kọ̀ọ́ ìta gbangba, pín-in kí ẹ sì jí ròrò nípa Pẹ́ńpọtì, ibi tó wà " +"lọ́wọ́lọ́wọ́ ọ̀jọ́ iwájú pẹ̀lú gbogbo agbègbè àti ìmójútó ẹgbẹ́ pẹ́ńpọtì " +". ." + +#: src/app/main/ui/settings/delete_account.cljs +msgid "notifications.profile-deletion-not-allowed" +msgstr "" +"O kò le è yọ pírófáìlì rẹ kúro. Ṣe àtún yàn àwọn ẹgbẹ́ kí o tó tẹ̀ síwájú." + +#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs +msgid "notifications.profile-saved" +msgstr "A ti fi pírófáìlì pamọ́ dáadáa!" + +#: src/app/main/ui/settings/change_email.cljs +msgid "notifications.validation-email-sent" +msgstr "Verification email sent to %s. Check your email!" + +msgid "onboarding-v2.before-start.desc1" +msgstr "" +"O ní láti mọ̀ pé oríṣiríṣi ohu ohun èlò ló wà láti ràn ọ́ lọ́wọ́ láti rí gbà " +"bẹ̀rẹ̀ pẹ̀lú Pẹ́ńpọtì, gẹ́gẹ́ bí ohun èlò ìtọ́nisọ́nà àti yútuùbù wa fún " +"ìlànà ìbáni sọ̀rọ̀." + +msgid "onboarding-v2.before-start.desc2" +msgstr "" +"Ẹ̀kún-uń rẹ́rẹ́ àlàyé nípa bí a ó ṣe lo pẹ́ńpọtì . Láti bi àfọwọ́kọ lọ sí " +"síṣe ètò tàbí pípiń àwọn àrà orísi ." + +msgid "onboarding-v2.before-start.desc2.title" +msgstr "Ìtọ́ni sọ́nà Onílò" + +msgid "onboarding-v2.before-start.desc3" +msgstr "O lè wo ìbáṣepọ̀ wa àti ìbáṣepọ̀ ti èyí tí agbègbè wa ṣe." + +msgid "onboarding-v2.before-start.desc3.title" +msgstr "Fídíò àwọn ìbáṣepọ̀" + +msgid "onboarding-v2.before-start.title" +msgstr "Kí o tó bẹ̀rẹ̀" + +msgid "onboarding-v2.newsletter.desc" +msgstr "" +"Ṣe alábàápín ìwé ìròyìn ti pẹ́ńpọtì kí o lè mọ ohun tí ó ń lọ ọjà " +"development progress and new Ìdàgbàsókè, Ìlọsíwájú,àti àwọn ìròyìn ." + +msgid "onboarding-v2.newsletter.news" +msgstr "" +"Fí ìròyìn ránńṣẹ́ sí mi nípa Pẹ́ńpọtì (àwọn bulọ́ọ̀gì,àwọn fídiò ìbáṣepọ̀, " +"àwọn sísàn wọlé...)." + +msgid "onboarding-v2.newsletter.privacy1" +msgstr "Ìfi pamọ́ jẹ wá lógún, ní bí o le kà nípa wa " + +msgid "onboarding-v2.newsletter.privacy2" +msgstr "" +"Àwọn ímeèlì tó ṣe kókó nìknn la ó fi ránńṣẹ́ sí ọ. o lè yọwọ́ kúrò ní " +"ìgbàkììgbàní ìlànà ti ìyọwọ́ kúrò nínú èyíkéyìí ìwé ìròyìn wa." + +msgid "onboarding-v2.newsletter.updates" +msgstr "" +"Fi ìmú dójú ìwọ̀n ọjà ránńṣẹ́ sí mi (àwọn ẹ̀yà yuntun, tú sílẹ̀, ṣà " +"túnṣe...)." + +msgid "onboarding-v2.welcome.desc1" +msgstr "" +"Pẹ́ńpọtì ni orísun ìṣílẹ̀kùn àti pe Kálẹidòsìló ṣe é àti àwọn agbègbè, Ní " +"bi ọ̀pọ̀lọpọ̀ àwọn ènìyàn ti ran ara wọn lọ́wọ́ tẹ́lẹ̀ . Gbgbo wọn ló lè ṣe " +"àjùmọ̀ṣenípa:" + +msgid "onboarding-v2.welcome.desc3" +msgstr "" +"Ibi tí a ó ti ri bí a ó ti ṣe àjùmọ̀ṣepọ̀ pẹ̀lú àwọn ìtumọ̀, àwọn ìbéèrè ẹ̀" +"yà ara ẹ̀rọ, ìmójútó síṣe ojúṣe, ìṣọdẹ kòkòrò…" + +msgid "onboarding.welcome.alt" +msgstr "Pẹ́ńpọtì" + +msgid "onboarding-v2.welcome.desc3.title" +msgstr "Sísojúṣe ìtọ́sẹ́nà" + +msgid "onboarding-v2.welcome.title" +msgstr "Káàbọ̀ sí pẹ́ńpọtì!" + +msgid "onboarding.choice.team-up.create-team-desc" +msgstr "" +"Lẹ́yìn tí o bá ti fún ẹgbẹ́ rẹ lórúkọ, Ó le pe àwọn ènìyàn láti darapọ̀ mọ́ " +"ẹgbẹ́." + +msgid "onboarding.choice.team-up.create-team-placeholder" +msgstr "Tẹ orúkọ ẹgbẹ́" + +msgid "onboarding.choice.team-up.invite-members" +msgstr "Fìwépè ọmọ àwọn ẹgbẹ́" + +msgid "onboarding.choice.team-up.invite-members-info" +msgstr "" +"Rántí láti fi gbogbo wọn sí i. Àwọn Olùdásílẹ̀, àwọn aṣàpẹẹrẹ, alákóso... " +"onírúúrú dà wọ́n pọ̀ :)" + +msgid "onboarding.choice.team-up.roles" +msgstr "Pè wọ́n pẹ̀lú ojúṣe wọn:" + +msgid "onboarding.newsletter.accept" +msgstr "Bẹ́ẹ̀ni, ṣe alábàpín" + +msgid "onboarding.newsletter.acceptance-message" +msgstr "" +"A ti fi ìbéèrè fún síṣe alá-bápín rẹ ránńṣẹ́, a ó fi ímeèlì ránńṣẹ́ sí ọ " +"látijẹ́rìí sí." + +msgid "onboarding.newsletter.policy" +msgstr "Ètò ìmúlò tí a fi pamọ́." + +msgid "onboarding.newsletter.title" +msgstr "Fẹ́ gba àwọn ìròyìn pẹ́ńpọti?" + +msgid "onboarding.team-modal.create-team" +msgstr "Ṣẹ̀dá ẹgbẹ́ kan" + +msgid "onboarding.team-modal.create-team-desc" +msgstr "" +"A team allows you to collaborate with other Penpot users working in the Ẹgbẹ́" +" kan yí ó gbà ọ́ láyè láti lè siṣẹ́pọ̀ pẹ̀lú àwọn onílò pẹ́ńpọti tí ó siṣẹ́ " +"nínú àwọn fáìlì àti àwọn iṣẹ́ àgbéṣe kan náà ." + +msgid "onboarding.team-modal.create-team-feature-1" +msgstr "Àwọn fáìlì àti àwọn iṣẹ́ àgbéṣe tí kò lópin" + +msgid "onboarding.team-modal.create-team-feature-2" +msgstr "Multiplayer edition" + +msgid "onboarding.team-modal.create-team-feature-3" +msgstr "àwọn ipa ìṣàkóṣo" + +msgid "onboarding.team-modal.create-team-feature-4" +msgstr "Àwọn ọmọ ẹgbẹ́ tí kò lópin" + +msgid "onboarding.team-modal.create-team-feature-5" +msgstr "100% Ọ̀fẹ́!" + +msgid "onboarding.templates.subtitle" +msgstr "Àwọn àwòṣe díẹ̀ nìyí níbí." + +msgid "onboarding.templates.title" +msgstr "Bẹ̀rẹ̀ sí ṣe ẹ̀yà alárà" + +#: src/app/main/ui/auth/recovery.cljs +msgid "profile.recovery.go-to-login" +msgstr "Lọ láti wọlé" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "Èwo ni ohun èlò irin iṣẹ́ tí o ní ìmọ̀ kíkún nínú pẹ̀lú rẹ̀?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "Mọ́kànlá-Ọgbọ̀n" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "Méjì – mẹ́wàá" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Káńfà" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "" +"Báwo ni ó ti le ṣe àpèjúwe bó ṣe dára tó lórí ìrírí rẹ lórí iṣẹ́ tí o ń ṣe " +"lọ́wọ́..." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Olùyà nǹkan" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Olùdásílẹ̀" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "Ṣàwárí sí i nípa pẹ́ńpọtì" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Fígímà" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Olùdásílẹ̀/VP" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Oníṣẹ́ ni mí" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... wíwò ètò ọnà , ìrírí àwọn ohun ìní, àwọn ètò ọnà, abbl." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "Ìkógun wọ̀lú" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Fi èsì sílẹ̀ fún iṣẹ́ àgbéṣe ẹgbẹ́ mi" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "Ẹjẹ́ 'ká bẹ̀rẹ̀ !" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Gba kóòdù láti inú iṣẹ́ àgbéṣe mi " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Ohun títà tàbí iṣẹ́ àgbéṣe Olùṣàkóso" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Títajà" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "Ju àádọ́ta lọ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-a-tool" +msgstr "N kò tí lo irin iṣẹ́ eto ọnà tẹ́lẹ̀ rí" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Èyí tó kàn" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Ṣe àṣàyàn" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Kòsí" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Yàwòrán" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Òmíìràn(ní pàtó)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "Mò ń siṣẹ́ àgbéṣẹ ti ara mi ni" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "Tàtẹ̀yìn wá" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Báwo lo ṣe ń gbèrò lórí bí o ṣe lo pẹ́ńpọtì?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Díẹ̀" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Bẹ̀rẹ̀" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Bẹ̀rẹ̀ láti lórí iṣẹ́ àgbéṣe mi" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Akẹ́kọ̀ọ́ tàbí olùkọ̀ọ́" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "kín ni ìwọ̀n ẹgbẹ́ rẹ ?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Ṣàyẹ̀wọ̀ pẹ́ńpọtì láti rí pé ó bẹ́gbẹ́ mu " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Gbìyànjú láti mọ̀ kí o tó bẹ̀rẹ̀ sí lo pẹ́ńpọtì ní àyíká" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "... wáyà-fèrèsé, ìrìàjò àwọn onílò & sísàn, àwọn igi ìyíkiri, abbl." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Iṣẹ́ lórí èròǹgbà àti àwọn èrò" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Èsì rẹ yó ràn wá lọ́wọ́ láti jẹ́ kó yé wa lórí kín ni ìhùwàsí rẹ àti àwọn " +"ohun tí o fẹ́ràn jù èyí yó jẹ́ kí á má ṣàmúlò pẹ́ńpọtì gẹ́gẹ́ bí èyí tí ó " +"wúlò àti ohun èlò fun ìgbáládùn." + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Yọ kúrò" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "settings.multiple" +msgstr "Dàárú" + +# SECTIONS +msgid "shortcut-section.basics" +msgstr "Ipìlẹ̀" + +msgid "shortcut-section.viewer" +msgstr "Ólùwò" + +msgid "shortcut-section.workspace" +msgstr "Àaye ìṣẹ́" + +# SUBSECTIONS +msgid "shortcut-subsection.alignment" +msgstr "Titete" + +msgid "shortcut-subsection.edit" +msgstr "Sàtunkọ" + +msgid "shortcut-subsection.general-viewer" +msgstr "àbùdá" + +msgid "shortcut-subsection.main-menu" +msgstr "Akojọ ólórì aṣyn" + +msgid "shortcut-subsection.modify-layers" +msgstr "Yípàdá fẹ́lẹ́fẹ́lẹ́" + +msgid "shortcut-subsection.navigation-dashboard" +msgstr "Lìlọ́ kìrì" + +msgid "shortcut-subsection.navigation-viewer" +msgstr "Lìlọ́ kìrì" + +msgid "shortcut-subsection.navigation-workspace" +msgstr "Lìlọ́ kìrì" + +msgid "shortcut-subsection.panels" +msgstr "Àwọ̀n pánẹ̀lí" + +msgid "shortcut-subsection.path-editor" +msgstr "Àwọ́n ọna" + +msgid "shortcut-subsection.shape" +msgstr "Àwọ́n apẹ́rẹ́" + +msgid "shortcut-subsection.text-editor" +msgstr "Àwọ́n ọ́rọ̀" + +msgid "shortcut-subsection.tools" +msgstr "Àwọ́n irínṣẹ̀" + +msgid "shortcut-subsection.zoom-viewer" +msgstr "Sun-un" + +msgid "shortcut-subsection.zoom-workspace" +msgstr "Sun-un" + +msgid "shortcuts.add-comment" +msgstr "Ọ́rọ̀íwòye" + +msgid "shortcuts.add-node" +msgstr "Fí ípàdé kùn" + +msgid "shortcuts.align-bottom" +msgstr "Sópọ sí ísàle" + +msgid "shortcuts.align-center" +msgstr "Parapọ àárin" + +msgid "shortcuts.align-hcenter" +msgstr "Páràpọ àárin naa" + +msgid "shortcuts.align-justify" +msgstr "Ṣe dèédé si ìdálárè" + +msgid "shortcuts.align-left" +msgstr "Sosi ósì" + +msgid "shortcuts.align-right" +msgstr "Sosi ọtún" + +msgid "shortcuts.align-top" +msgstr "Sopo si òké" + +msgid "shortcuts.align-vcenter" +msgstr "Tẹle àárin ni inàró" + +msgid "shortcuts.artboard-selection" +msgstr "Ṣẹ̀dá ọ̀kọ̀ lati yìyán" + +msgid "shortcuts.bold" +msgstr "Yipàdà to han" + +msgid "shortcuts.bool-difference" +msgstr "Iyàtò Boolean" + +msgid "shortcuts.bool-exclude" +msgstr "Boolean tà yọ̀kúro" + +msgid "shortcuts.bool-intersection" +msgstr "ikòritá Boolean" + +msgid "shortcuts.bool-union" +msgstr "Asépọ̀ Boolean" + +msgid "shortcuts.bring-back" +msgstr "Fírànṣẹ́ si ẹ́hin" + +msgid "shortcuts.bring-backward" +msgstr "Ran pàdà sí ehin" + +msgid "shortcuts.bring-forward" +msgstr "Mù siwájù" + +msgid "shortcuts.bring-front" +msgstr "Mù si wájù" + +msgid "shortcuts.clear-undo" +msgstr "Pa yipàdá rẹ" + +msgid "shortcuts.copy" +msgstr "Dàákọ" + +msgid "shortcuts.create-component" +msgstr "Ṣẹ̀dá pàátì" + +msgid "shortcuts.create-new-project" +msgstr "Ṣẹ̀dá títún" + +msgid "shortcuts.cut" +msgstr "Ge" + +msgid "shortcuts.decrease-zoom" +msgstr "Sun-un jàdé" + +msgid "shortcuts.delete" +msgstr "Pàrẹ" + +msgid "shortcuts.delete-node" +msgstr "Pa ipàdé" + +msgid "shortcuts.detach-component" +msgstr "Yà paati" + +msgid "shortcuts.draw-curve" +msgstr "Yìyí" + +msgid "shortcuts.draw-ellipse" +msgstr "Ẹ́lipsì" + +msgid "shortcuts.draw-nodes" +msgstr "Fà ọnà" + +msgid "shortcuts.draw-path" +msgstr "Ọnà" + +msgid "shortcuts.draw-rect" +msgstr "Ònìgún mèrìn" + +msgid "shortcuts.draw-text" +msgstr "Ọ́rọ̀" + +msgid "shortcuts.duplicate" +msgstr "Ṣe pidánpidán" + +msgid "shortcuts.escape" +msgstr "Fàgílèè" + +msgid "shortcuts.export-shapes" +msgstr "Ókèéré apẹ̀rẹ̀" + +msgid "shortcuts.fit-all" +msgstr "Sun-un látì ba gbògbò rẹ̀ mú" + +msgid "shortcuts.flip-horizontal" +msgstr "Yipadà ní pẹ̀tẹ̀lẹ̀" + +msgid "shortcuts.flip-vertical" +msgstr "Yipadà ní ínàró" + +msgid "shortcuts.font-size-dec" +msgstr "Dìn íwọ̀n fonti kù" + +msgid "shortcuts.font-size-inc" +msgstr "Alekun iwọn fonti" + +msgid "shortcuts.go-to-drafts" +msgstr "Lọ sí iyáwòran" + +msgid "shortcuts.go-to-libs" +msgstr "Lọ si awọn ílé-Ikàwé tí a pín" + +msgid "shortcuts.go-to-search" +msgstr "Wàá" + +msgid "shortcuts.group" +msgstr "Ẹgbẹ" + +msgid "shortcuts.h-distribute" +msgstr "Pinpín kàákírì pètèlè" + +msgid "shortcuts.hide-ui" +msgstr "Ífìhan / Tọju UI" + +msgid "shortcuts.increase-zoom" +msgstr "Sùn-un sínú" + +msgid "shortcuts.insert-image" +msgstr "Fí àwóran sii" + +msgid "shortcuts.italic" +msgstr "Yipàdà ítalikì" + +msgid "shortcuts.join-nodes" +msgstr "Dàràpọ̀ awọn ipàdé" + +msgid "shortcuts.letter-spacing-dec" +msgstr "Din aayé lẹ́tà kù" + +msgid "shortcuts.letter-spacing-inc" +msgstr "Alekun aayé lẹ́tà" + +msgid "shortcuts.line-height-dec" +msgstr "Dinkù gígà ílà" + +msgid "shortcuts.line-height-inc" +msgstr "Ílà ton gá sókè" + +msgid "shortcuts.line-through" +msgstr "Íyìpàdà ílà to yọ̀rí" + +msgid "shortcuts.make-corner" +msgstr "Ṣè ígùn" + +msgid "shortcuts.make-curve" +msgstr "Ṣe ìsépọ" + +msgid "shortcuts.mask" +msgstr "Ibòjú" + +msgid "shortcuts.merge-nodes" +msgstr "Dàpọ̀ awọ́n apa" + +msgid "shortcuts.move" +msgstr "Gbé" + +msgid "shortcuts.move-fast-down" +msgstr "Sàré lọ́ sí isàlẹ̀" + +msgid "shortcuts.move-fast-left" +msgstr "Gbé sí osi kiákiá" + +msgid "shortcuts.move-fast-right" +msgstr "Gbé si ọ̀tún kiákiá" + +msgid "shortcuts.move-fast-up" +msgstr "Gbé si òké kiákiá" + +msgid "shortcuts.move-nodes" +msgstr "Gbé ipàdé" + +msgid "shortcuts.move-unit-down" +msgstr "Gbé sílè" + +msgid "shortcuts.move-unit-left" +msgstr "Gbé osi" + +msgid "shortcuts.move-unit-right" +msgstr "Gbé sọtùn" + +msgid "shortcuts.move-unit-up" +msgstr "Gbé sóke" + +msgid "shortcuts.next-frame" +msgstr "Ọ̀kọ̀ tókan" + +msgid "shortcuts.not-found" +msgstr "Kò sí awọ́n ọ̀nà abùjá ti à rii" + +msgid "shortcuts.opacity-0" +msgstr "Fí akomo sí ipò 100%" + +msgid "shortcuts.opacity-1" +msgstr "Fi akomo si ipo 10%" + +msgid "shortcuts.opacity-2" +msgstr "Fi akomo si ipo 20%" + +msgid "shortcuts.opacity-3" +msgstr "Fi akomo si ipo 30%" + +msgid "shortcuts.opacity-4" +msgstr "Fi akomo si ipo 40%" + +msgid "shortcuts.opacity-5" +msgstr "Fi akomo si ipo 50%" + +msgid "shortcuts.opacity-6" +msgstr "Fi akomo si ipo 60%" + +msgid "shortcuts.opacity-7" +msgstr "Fi akomo si ipo 70%" + +msgid "shortcuts.opacity-8" +msgstr "Fi akomo si ipo 80%" + +msgid "shortcuts.opacity-9" +msgstr "Fi akomo si ipo 90%" + +msgid "shortcuts.open-color-picker" +msgstr "Ólùṣà àwọ̀" + +msgid "shortcuts.open-dashboard" +msgstr "Lọ si dasibodu" + +msgid "shortcuts.open-inspect" +msgstr "Lọ si apaa ayewo olùwò" + +msgid "shortcuts.open-viewer" +msgstr "Lọ si apaa ibaraẹnisọrọ olùwò" + +msgid "shortcuts.or" +msgstr " tabi " + +msgid "shortcuts.paste" +msgstr "Lẹẹmọ" + +msgid "shortcuts.prev-frame" +msgstr "Ọkọ ti tẹlẹ" + +msgid "shortcuts.redo" +msgstr "Tunṣe" + +msgid "shortcuts.reset-zoom" +msgstr "tun sun" + +msgid "shortcuts.search-placeholder" +msgstr "Wa awọn ọna abuja" + +msgid "shortcuts.select-all" +msgstr "Ṣa gbogbo re" + +msgid "shortcuts.select-parent-layer" +msgstr "Yan Obii pẹlẹbẹ" + +msgid "shortcuts.show-shortcuts" +msgstr "Ifihan / Itọju ọna abùjá" + +msgid "shortcuts.snap-nodes" +msgstr "Yaa si awon apa" + +msgid "shortcuts.snap-pixel-grid" +msgstr "Yaa si pikseli ilana" + +msgid "shortcuts.start-measure" +msgstr "Bẹ̀rẹ̀ wíwọ̀n" + +msgid "shortcuts.stop-measure" +msgstr "da wíwọ̀n duro" + +msgid "shortcuts.text-align-center" +msgstr "Parapọ saarin" + +msgid "shortcuts.text-align-justify" +msgstr "Sedede lárè" + +msgid "shortcuts.text-align-left" +msgstr "mo si osi" + +msgid "shortcuts.text-align-right" +msgstr "Mo sotun" + +msgid "shortcuts.thumbnail-set" +msgstr "Se étò awòn áwòran fun fidio" + +msgid "shortcuts.toggle-alignment" +msgstr "Iyipada titete ìmúdàgba" + +msgid "shortcuts.toggle-assets" +msgstr "Yi dukia pada" + +msgid "shortcuts.toggle-colorpalette" +msgstr "Yi paleti awọ pada" + +msgid "shortcuts.toggle-focus-mode" +msgstr "Yi ipo idojukọ pada" + +msgid "shortcuts.toggle-fullscreen" +msgstr "Yi kuro ni fulscrin" + +msgid "shortcuts.toggle-grid" +msgstr "Fihan / Tọju ilana" + +msgid "shortcuts.toggle-layers" +msgstr "Yi awon pelebe yii pada" + +msgid "shortcuts.toggle-lock" +msgstr "Tiipa / Siilẹ" + +msgid "shortcuts.toggle-lock-size" +msgstr "títìipa lápàkàn" + +msgid "shortcuts.toggle-rules" +msgstr "Fifihan / Titọju ólórì" + +msgid "shortcuts.toggle-scale-text" +msgstr "Yipada asekale ọrọ" + +msgid "shortcuts.toggle-snap-guide" +msgstr "Pín si awọ́n ítọ̀nisọ́nà" + +msgid "shortcuts.toggle-textpalette" +msgstr "Yíípàda ọrọ paleti" + +msgid "shortcuts.toggle-visibility" +msgstr "Fihan / Toju re" + +msgid "shortcuts.toggle-zoom-style" +msgstr "Yiipada asa sun-un" + +msgid "shortcuts.underline" +msgstr "Yii abẹlẹ" + +msgid "shortcuts.undo" +msgstr "Yi pada" + +msgid "shortcuts.ungroup" +msgstr "Tu ẹgbẹ" + +msgid "shortcuts.unmask" +msgstr "Aiboju" + +msgid "shortcuts.v-distribute" +msgstr "Pin ni inaro" + +msgid "shortcuts.zoom-lense-decrease" +msgstr "Dín lẹnsì sisun kù" + +msgid "shortcuts.zoom-lense-increase" +msgstr "Lílọ̀soké lẹnsi sisun" + +msgid "shortcuts.zoom-selected" +msgstr "Yiyan pelu sun-un" + +#: src/app/main/ui/dashboard/team.cljs +msgid "team.webhooks.max-length" +msgstr "Orúkọ̀ webhook kò gbọ́dọ̀ kọjà awọ́n óhun kíkọ́ 2048." + +#: src/app/main/ui/dashboard/files.cljs +msgid "title.dashboard.files" +msgstr "%s - Penpot" + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "title.dashboard.font-providers" +msgstr "Pipese oniru fọnti - %s - Penpot" + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "title.dashboard.fonts" +msgstr "Fọnti - %s - Penpot" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "title.dashboard.projects" +msgstr "Awọn ísè agbèsè - %s - Penpot" + +#: src/app/main/ui/dashboard/search.cljs +msgid "title.dashboard.search" +msgstr "Wà - %s - Penpot" + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/auth.cljs +msgid "title.default" +msgstr "Penpot – Se onìrú òmínìra fun awọ̀n ẹ̀gbẹ̀" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "Profaili – Aami wiwọle" + +#: src/app/main/ui/settings/feedback.cljs +msgid "title.settings.feedback" +msgstr "Fi esi- Penpot" + +#: src/app/main/ui/settings/options.cljs +msgid "title.settings.options" +msgstr "Awon eto - Penpot" + +#: src/app/main/ui/settings/password.cljs +msgid "title.settings.password" +msgstr "Ọrọigbaníwólé - Penpot" + +#: src/app/main/ui/settings/profile.cljs +msgid "title.settings.profile" +msgstr "Profaili - Penpot" + +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-invitations" +msgstr "Ifíwẹ́pe - %s - Penpot" + +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-members" +msgstr "Ọ́́mọ̀ ẹgbẹ - %s - Penpot" + +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-settings" +msgstr "Awọn eto - %s - Penpot" + +msgid "title.team-webhooks" +msgstr "Webhooks - %s - Penpot" + +#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs +msgid "title.viewer" +msgstr "%s –Ipo wíwò - Penpot" + +#: src/app/main/ui/workspace.cljs +msgid "title.workspace" +msgstr "%s - Penpot" + +#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs +msgid "viewer.empty-state" +msgstr "No boards found on the page." + +#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs +msgid "viewer.frame-not-found" +msgstr "A kò ri ọ̀kọ̀." + +msgid "viewer.header.comments-section" +msgstr "Ọrọìwòye (%s)" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.dont-show-interactions" +msgstr "Maa fi ìbaráẹ̀nìsepọ han" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.fullscreen" +msgstr "Fé ká gḅọgbọ síkírínì" + +msgid "viewer.header.inspect-section" +msgstr "Ayéwò (%s)" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.interactions" +msgstr "Ibaraenisépọ̀" + +msgid "viewer.header.interactions-section" +msgstr "Awọ̀n Ibaraenisépọ̀ (%s)" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.sitemap" +msgstr "Áwòran átọ̀kà ílẹ̀" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hcenter" +msgstr "Paŕàpọ̀ sí petelè aarin (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hdistribute" +msgstr "Pin aayè ni pètélè (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hleft" +msgstr "Páràpọ̀ sí òsì (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hright" +msgstr "Páràpọ̀ sí ọtun (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vbottom" +msgstr "Páràpọ̀ sí isàlẹ̀ (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vcenter" +msgstr "Páràpọ̀ sí inàro aarin (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vdistribute" +msgstr "Pin aayè inàró (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vtop" +msgstr "Párápọ̀ sóké (%s)" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.assets" +msgstr "Awọ̀n dukia" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.box-filter-all" +msgstr "Gbọ̀gbọ̀ awọ̀n dukia" + +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.colors" +msgstr "Áwò" + +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.components" +msgstr "Awọ̀n eroja" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.create-group" +msgstr "Ṣẹ̀dá ẹ̀gbẹ̀ kan" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.create-group-hint" +msgstr "páarẹ̀" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.duplicate" +msgstr "ẹẹdà" + +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.edit" +msgstr "Ṣatunkọ" + +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.graphics" +msgstr "Awọn Awòran" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.group" +msgstr "Ẹgbẹ" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.group-name" +msgstr "Orúkọ̀ ẹgbẹ" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.libraries" +msgstr "Ílè-iwè" + +msgid "workspace.assets.local-library" +msgstr "Ílè-iwè agbegbe" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.not-found" +msgstr "Ko si ohun-ini ti a rii" + +msgid "workspace.assets.open-library" +msgstr "Ṣii faili ìlé-ikáwè" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.rename" +msgstr "Lo oruko imiran" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.rename-group" +msgstr "Lo oruko imiran fun ẹgbẹ" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.search" +msgstr "Wa dukia" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "Iĺẹ̀ iwekika ti a pln" + +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.typography" +msgstr "Iwe itẹwe" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.font-id" +msgstr "Fonti" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.font-size" +msgstr "Iwon" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.font-variant-id" +msgstr "Iyatọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.letter-spacing" +msgstr "Aaye leta" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.line-height" +msgstr "Giga ila" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/inspect/attributes/text.cljs, src/app/main/ui/inspect/attributes/text.cljs +msgid "workspace.assets.typography.sample" +msgstr "Ag" + +msgid "workspace.assets.typography.text-styles" +msgstr "Oniru ọrọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.text-transform" +msgstr "Iyipádà ọrọ" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.ungroup" +msgstr "Títù ẹ̀gbẹ́" + +msgid "workspace.focus.focus-mode" +msgstr "Ipo Idojukọ" + +msgid "workspace.focus.focus-off" +msgstr "Pa Ídòjúkọ" + +msgid "workspace.focus.focus-on" +msgstr "Tan Ídòjúkọ" + +msgid "workspace.focus.selection" +msgstr "Yiyan" + +#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs +msgid "workspace.gradients.linear" +msgstr "Itesiwaju gerege" + +#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs +msgid "workspace.gradients.radial" +msgstr "Itesiwaju Radial" + +msgid "workspace.header.menu.disable-scale-content" +msgstr "Pa asèkalẹ̀ iwọnbà" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-scale-text" +msgstr "Pa ọrọ iwọnba" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-grid" +msgstr "Pa yipada si ilana" + +msgid "workspace.header.menu.disable-snap-pixel-grid" +msgstr "Pa yipada si piseli" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-dynamic-alignment" +msgstr "Tan imudagba to Sedede" + +msgid "workspace.header.menu.enable-scale-content" +msgstr "Tan asèkalẹ̀ iwọnbà" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-scale-text" +msgstr "Tan iwọnbà ọrọ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-grid" +msgstr "Yipada si ilana" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-guides" +msgstr "Yipada si itọ̀nìsọna" + +msgid "workspace.header.menu.enable-snap-pixel-grid" +msgstr "Tan Yipada si piseli" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-grid" +msgstr "Tọ̀jú ilana" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-palette" +msgstr "Tọ̀jú awọ palẹti" + +msgid "workspace.header.menu.hide-pixel-grid" +msgstr "Tọ̀jú pisẹli ilana" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-rules" +msgstr "Tọ̀jú awọn ólòrí" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-textpalette" +msgstr "Tọ̀jú awọn fọnti paleti" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.edit" +msgstr "Satunkọ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.file" +msgstr "Faili" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.help-info" +msgstr "Iranlọwọ ati alaye" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.preferences" +msgstr "Awọn àyánfẹ̀" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.view" +msgstr "Wiwo" + +msgid "workspace.header.menu.redo" +msgstr "Tun ṣe" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.select-all" +msgstr "Sa gbogbo rẹ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-grid" +msgstr "ifihan akoj" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-palette" +msgstr "Fi awo paleti han" + +msgid "workspace.header.menu.show-pixel-grid" +msgstr "Fi piseli ilana han" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-rules" +msgstr "Ifihan awọ̀n ólórí" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-textpalette" +msgstr "Ifihan fonti paleti" + +msgid "workspace.header.menu.undo" +msgstr "Yi pada" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.reset-zoom" +msgstr "Tunto" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.save-error" +msgstr "àsisè lórì fíf́ipamọ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.saved" +msgstr "Ti a fipamọ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.saving" +msgstr "Fifipámọ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.unsaved" +msgstr "Awọn ayípàdà ti kó ni fipamọ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.viewer" +msgstr "Ipo wiwo(%s)" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "sun-un" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fill" +msgstr "Kun - óṣùwọn to kun" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fit" +msgstr "Báràmù - óṣùwọn to Báràmù" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fit-all" +msgstr "Suun kí o bá gbógbó rẹ̀ dọ́gbà" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-full-screen" +msgstr "Áseàfihan to kún" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-selected" +msgstr "Ṣuum lati yan" + +msgid "workspace.layout_grid.editor.title" +msgstr "Ilànà àyípàdà" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.add" +msgstr "Afikùn" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.colors" +msgstr "%s awọn awọ" + +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "Kòyi si oniruiru awọ ni ilé-ikàwé re" + +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "Ko si oniruiru iwé itẹ̀wé ni ilé ikàwé rẹ̀" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.hsv" +msgstr "HSV" + +#: src/app/main/ui/workspace/colorpicker/libraries.cljs, src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.recent-colors" +msgstr "Awọn àwò tálò láipẹ̀" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgb-complementary" +msgstr "RGB Ibáramù" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgba" +msgstr "RGBA" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.save-color" +msgstr "Fi awọn oniru awọ pamọ" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.components" +msgstr "%s Ẹya ara ẹrọ" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.file-library" +msgstr "Faili ilé ikàwé" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.graphics" +msgstr "%s ayaworan" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.libraries" +msgstr "Awọn Ílè íkawè" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library" +msgstr "Ílè íkawè" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library-updates" +msgstr "Ílè íkawè ímùdojúiwọn" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.no-libraries-need-sync" +msgstr "Kò si Ilé kàwé ti a pin si ímùdojúiwọn" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.shared-libraries" +msgstr "Awọn ilé kàwé tí a pìn" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.libraries.text.multiple-typography" +msgstr "Óríṣí awọn íwè itẹ̀wé" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.libraries.text.multiple-typography-tooltip" +msgstr "Tú gbógbó lińkí awọn íwè itẹ̀wé" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.typography" +msgstr "%s awọn íwè itẹ̀wé" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.update" +msgstr "ímùdojúiwọn" + +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "workspace.options.blur-options.title" +msgstr "Baìbaì" + +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "workspace.options.blur-options.title.group" +msgstr "Ẹ̀gdẹ́ Baìbaì" + +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "workspace.options.blur-options.title.multiple" +msgstr "Asayan Baìbaì" + +#: src/app/main/ui/workspace/sidebar/options/page.cljs +msgid "workspace.options.canvas-background" +msgstr "Kánfásì abẹ́le" + +msgid "workspace.options.clip-content" +msgstr "Ábẹrẹ́ ákoonù" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs +msgid "workspace.options.component" +msgstr "Apakan" + +msgid "workspace.options.component.copy" +msgstr "Ádàakọ" + +msgid "workspace.options.component.edit-annotation" +msgstr "Ṣatunkọ àkọ̀silẹ̀" + +msgid "workspace.options.component.main" +msgstr "Ólòrí" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints" +msgstr "Awọn ihámọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.bottom" +msgstr "Ídì" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.center" +msgstr "Aarin" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.left" +msgstr "Òsi" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.leftright" +msgstr "Osi ati otun" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.right" +msgstr "Ọ̀tún" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.scale" +msgstr "Íwọ́n" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.top" +msgstr "Ókè" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.topbottom" +msgstr "Ókè ati Ídí" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export" +msgstr "Sí ilẹ́ òkèeré" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs +msgid "workspace.options.export.suffix" +msgstr "afikun ọrọ niipárí" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-complete" +msgstr "Gbígbè okeere ti pari" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object" +msgstr "Gbígbè okeere …" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object-error" +msgstr "Gbígbè okeere kuna" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.bottom" +msgstr "ìsàlẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.center" +msgstr "Àárín" + +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.fill" +msgstr "Kún" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.add-flow-start" +msgstr "Safikun ibẹrè ṣiṣan" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-start" +msgstr "ibẹrè ṣiṣan" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-starts" +msgstr "íbẹrè awọn ṣiṣan" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.auto" +msgstr "Aifọ́wọyi" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.grid-title" +msgstr "Ilánà" + +msgid "workspace.options.grid.params.color" +msgstr "Awọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.columns" +msgstr "Awọn ọwọn" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.gutter" +msgstr "Gota" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.height" +msgstr "Òkè" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.margin" +msgstr "Àlà" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.rows" +msgstr "Àwọn orí ìlà ìbú" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.set-default" +msgstr "Fi sípò abínibí" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.size" +msgstr "Ìwọ̀n" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type" +msgstr "Irú" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.left" +msgstr "Òsì" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.right" +msgstr "Ọ̀tún" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.stretch" +msgstr "Nà" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.top" +msgstr "Òkè" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.use-default" +msgstr "Lo ipò abínibí" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.width" +msgstr "Ìgbòrò" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.row" +msgstr "Àwọn orị ìlà ìbú" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.square" +msgstr "Alápoméjì" + +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.group-fill" +msgstr "Ẹ̀kún ẹgbẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.group-stroke" +msgstr "Ẹgba ẹgbẹ́" + +msgid "workspace.options.inspect" +msgstr "Ṣàyẹ̀wò" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-action" +msgstr "Ìgbésẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-after-delay" +msgstr "Lẹ́yìn ìdádúro" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation" +msgstr "Àwòrán abẹ̀mí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-dissolve" +msgstr "Túká" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-none" +msgstr "Kòsí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-push" +msgstr "Tì" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-slide" +msgstr "Aṣàfihàn" + +msgid "workspace.options.interaction-auto" +msgstr "Ọkọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-background" +msgstr "Fi àyíká ìtẹ̀lẹ̀ ìlànà síi" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-outside" +msgstr "Páadé tí o bá n tẹ ìta" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay" +msgstr "Pa ìlànà ìtẹ̀lẹ̀ dé" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay-dest" +msgstr "Pa ìlànà ìtẹ̀lẹ̀ dé: %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-delay" +msgstr "Ìdádúró" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-destination" +msgstr "Èbúté" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-duration" +msgstr "Ịgbà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing" +msgstr "Rírokùn" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease" +msgstr "Ìrọ̀rùn" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in" +msgstr "Rọra wọlé" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in-out" +msgstr "Rọra wọlé jáde" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-out" +msgstr "Rọra jáde" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-linear" +msgstr "Ilà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-in" +msgstr "Inú" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-enter" +msgstr "Atọ́ka ìwọnú" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-left" +msgstr "Ìsàlẹ̀ òsì" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-right" +msgstr "Ìsàḷ̀ẹ̀ ọ̀tún" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-center" +msgstr "Àárín" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-manual" +msgstr "Aláfọwóṣe" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-center" +msgstr "Àárín òkè" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-leave" +msgstr "Atọ́ka kíkúrò" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-ms" +msgstr "ms" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to" +msgstr "Lílọ kiri sí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to-dest" +msgstr "Lílo kiri sí: %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-none" +msgstr "(Akò ṣètò)" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-left" +msgstr "Òkè òsì" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-offset-effect" +msgstr "Ipa àìṣedédé" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-url" +msgstr "Ṣí URL" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-out" +msgstr "Jáde" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-center" +msgstr "Àáriń ìsàlẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-right" +msgstr "Òkè ọ̀tún" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-position" +msgstr "Ipò" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-preserve-scroll" +msgstr "Ṣe ìtọ́jú ipò àyílọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-prev-screen" +msgstr "Aṣàfihàn àtẹ̀yìnwá" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-hovering" +msgstr "Nígbàtí óhún rábàbà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-pressing" +msgstr "Nígbàtị óhún tẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interactions" +msgstr "Àwọn ìbáraẹniṣepọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color" +msgstr "Àwọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color-burn" +msgstr "Ṣẹ̀dà àwọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color-dodge" +msgstr "Òpó àwọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.darken" +msgstr "Ṣókuǹkùn" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.difference" +msgstr "Ìyàtọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.exclusion" +msgstr "Ìyàsọ́tọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.hard-light" +msgstr "Iná líle" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.hue" +msgstr "Ọdà" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.lighten" +msgstr "Fẹ́ẹ́rẹ́fẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.luminosity" +msgstr "Ìmọ́lẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.multiply" +msgstr "Ìsọdipúpọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.normal" +msgstr "Déédé" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.overlay" +msgstr "Ìtẹ̀lẹ́ ìlànà" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.saturation" +msgstr "Ẹ̀kúnrẹ́rẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.screen" +msgstr "Aṣàfihàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.soft-light" +msgstr "Ìmọ́lẹ̀ rokoṣo" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title" +msgstr "Ìpele" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title.group" +msgstr "Ẹgbẹ́ ìpele" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title.multiple" +msgstr "Egbẹ́ ààyò" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.advanced-ops" +msgstr "Ànàálè ìtẹ̀síwájú" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-max-h" +msgstr "Ibi tó ga jùlọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-max-w" +msgstr "Ìgbòrò tó ga jù" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-min-h" +msgstr "Gíga to kéré jù lọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-min-w" +msgstr "Ìgbòrò tó kéré jù lọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-max-h" +msgstr "Gíga tó pọ̀jù" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-max-w" +msgstr "Ìgbòrò tí pòjù" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-min-h" +msgstr "Gíga tó kéré jùlọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-min-w" +msgstr "Gbígbòrò tó kéré jù lọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.bottom" +msgstr "Ìdí" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column" +msgstr "Ìlà òòró" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column-reverse" +msgstr "Ìlà òòró yíyípadà" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.packed" +msgstr "tí wọn dì" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding" +msgstr "Ìtẹ̀wọ́nú" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-all" +msgstr "Gbogbo ẹ̀gbẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-simple" +msgstr "Ìtẹ̀wọ́nú pọ́nbélé" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.right" +msgstr "Ọ̀tún" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-around" +msgstr "Àyè àyíká" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-between" +msgstr "Àyè àárín" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.top" +msgstr "Òkè" + +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.more-colors" +msgstr "Àwọn àwọ̀ púpọ̀ sí i" + +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.more-lib-colors" +msgstr "Àwọn yàrá àwọ̀ púpọ̀ sí I" + +msgid "workspace.options.opacity" +msgstr "Àìríran" + +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.position" +msgstr "Ipò" + +#: src/app/main/ui/workspace/sidebar/options.cljs +msgid "workspace.options.prototype" +msgstr "Ìtẹ̀lé ìlànà" + +msgid "workspace.options.radius" +msgstr "Ìdáméjì òbìrìkìtiì" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-bottom-left" +msgstr "Apá òsì ìsàlẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-bottom-right" +msgstr "Apá ọ̀tún ìsàle" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-top-left" +msgstr "Òkè òsì" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-top-right" +msgstr "Òkè ọ̀tún" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius.all-corners" +msgstr "Àwọn gbogbo igun" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.blur" +msgstr "Rẹ́súrẹ́sú" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.drop-shadow" +msgstr "Da òjìjí" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.inner-shadow" +msgstr "Òjìjí inú" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsetx" +msgstr "X" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsety" +msgstr "Y" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.spread" +msgstr "Tànkálẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius.single-corners" +msgstr "Àwọn igun olómìnira" + +msgid "workspace.options.recent-fonts" +msgstr "Àìpẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.retry" +msgstr "Tún gbìyànjú" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.rotation" +msgstr "Yíyípo" + +msgid "workspace.options.search-font" +msgstr "Àdàkọ ìwádìí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.select-a-shape" +msgstr "" +"Yan ìrísi ,pátákó tàbí ẹgbẹ́ láti fa ìsopọ̀ mọ́ pátákó " +"òmíràn." + +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.selection-color" +msgstr "Àwọn àwọ̀ tí a ti yàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.selection-fill" +msgstr "Ìmúṣẹ tí a yàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.selection-stroke" +msgstr "Ipò ìlù tí a yàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title" +msgstr "Òjìjí" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title.group" +msgstr "Àwùjọ òjìjí" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker" +msgstr "Àmì alápoméjì" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title.multiple" +msgstr "Òjìjí tí a yàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.show-fill-on-export" +msgstr "Fihàn nínụ àgbéjáde" + +msgid "workspace.options.show-in-viewer" +msgstr "Fihàn nínú ipò wíwò" + +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.size" +msgstr "Ìwọ̀n" + +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs +msgid "workspace.options.size-presets" +msgstr "Àwọn àtòjọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke" +msgstr "Ipò ìlà" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker" +msgstr "Àmì yíyíká" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Yíyíká" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker" +msgstr "Àmì dáyámọ́ǹdì" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Dáyámọ́ǹdì" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow" +msgstr "Ọfà ìlà" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Onígun mẹ́rin" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow" +msgstr "Ofà onígun mẹ́ta" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Ofà" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.none" +msgstr "Kòsí" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.round" +msgstr "Yíká" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square" +msgstr "Alápoméjì" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Onígun mẹ́ta" + +msgid "workspace.options.stroke-color" +msgstr "Àwọ ìlà" + +msgid "workspace.options.stroke-width" +msgstr "Ìgbòrò ìlà" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.center" +msgstr "Àárín" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.dashed" +msgstr "Tó ní ìlà-ìlà" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.dotted" +msgstr "àmì tó tó tó" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.inner" +msgstr "Nínú" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.mixed" +msgstr "Tí a ti dàpọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.outer" +msgstr "Ìta" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.solid" +msgstr "Ṣinsin" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-bottom" +msgstr "Mú dọ́gba abẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-middle" +msgstr "Mú dọgba àárín" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-top" +msgstr "Mú dọ́gba òkè" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.direction-ltr" +msgstr "LTR" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.direction-rtl" +msgstr "RTL" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-auto-height" +msgstr "Gíga aládàáṣiṣẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-auto-width" +msgstr "Gbígbòòrò aládáàṣiṣé" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-fixed" +msgstr "Tí kò yíyadà" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.letter-spacing" +msgstr "Àlàfo lẹ́tà" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.line-height" +msgstr "Gíga ìlà" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.lowercase" +msgstr "Lẹ́tà kékeré" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.none" +msgstr "Kòsí" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.strikethrough" +msgstr "Ìfọwọ́bàyíká (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-center" +msgstr "Mú dọ́gba àárín (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-justify" +msgstr "Ìdálàre (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-left" +msgstr "Mú dọ́gba òsì (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-right" +msgstr "Mú dọ́gba ọ̀tún (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title" +msgstr "Àyọkà" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title-group" +msgstr "Àwùjọ àyọkà" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title-selection" +msgstr "Àṣàyàn ọ̀rọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.titlecase" +msgstr "ipò ọ̀rọ̀ àkórí" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.underline" +msgstr "Fífàlà (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.uppercase" +msgstr "Lẹ́tà ńlá" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.use-play-button" +msgstr "" +"Lo bọ́tìnì ìṣe tó wà lóori àkọsórí náà láti ṣakóso ìwò " +"àkàwé." + +msgid "workspace.options.width" +msgstr "Ìgbòrò" + +msgid "workspace.options.x" +msgstr "Ipò X" + +msgid "workspace.options.y" +msgstr "Ipò Y" + +msgid "workspace.path.actions.add-node" +msgstr "Fi ìpàdé kún (%s)" + +msgid "workspace.path.actions.delete-node" +msgstr "Pa ìpàdé ré (%s)" + +msgid "workspace.path.actions.draw-nodes" +msgstr "Fa ìpàdé (%s)" + +msgid "workspace.path.actions.join-nodes" +msgstr "Da ìpàdé pọ̀ (%s)" + +msgid "workspace.path.actions.make-corner" +msgstr "Sí igun (%s)" + +msgid "workspace.path.actions.make-curve" +msgstr "Sí ẹkọ̀rọ̀ (%s)" + +msgid "workspace.path.actions.merge-nodes" +msgstr "Da ìpàdé pò (%s)" + +msgid "workspace.path.actions.move-nodes" +msgstr "Gbé ìpàde (%s)" + +msgid "workspace.path.actions.separate-nodes" +msgstr "Ya ̣ìpàdé sọ́tọ̀ (%s)" + +msgid "workspace.path.actions.snap-nodes" +msgstr "Ìmọ̀lára ìpàdé (%s)" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.add-flex" +msgstr "Fi àrọ ètò ìrísí kun" + +msgid "workspace.shape.menu.add-grid" +msgstr "Fi gírídì ètò ìrísị kun" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.back" +msgstr "dáa padà séyiǹ" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.backward" +msgstr "dá padà sọ́wọ èyiǹ" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.copy" +msgstr "Ṣẹ̀dà" + +msgid "workspace.shape.menu.create-annotation" +msgstr "Ṣèda àlàyé" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.create-artboard-from-selection" +msgstr "Yíyàn sí pátákó" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.create-component" +msgstr "Ṣẹ́dá àkóónú" + +msgid "workspace.shape.menu.create-multiple-components" +msgstr "Ṣẹ̀dá ọ̀pọ̀lọpọ̀ àkóónú" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.cut" +msgstr "Gé" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete" +msgstr "Parẹ́" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete-flow-start" +msgstr "Pa ìbẹ̀ẹ̀rè ìsàn rẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.detach-instance" +msgstr "ṣẹ́ àpẹ̣ẹre yọ nípò" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.detach-instances-in-bulk" +msgstr "Ṣẹ́ àwọn àpẹẹrẹ yọ nípò" + +msgid "workspace.shape.menu.difference" +msgstr "Ìyàtọ̀" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.duplicate" +msgstr "Sẹ ẹ̀dà" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.edit" +msgstr "Sàtúnṣe" + +msgid "workspace.shape.menu.exclude" +msgstr "Ṣà yọ sílè" + +msgid "workspace.shape.menu.flatten" +msgstr "Tẹ́ pẹrẹsẹ" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flip-horizontal" +msgstr "Ìyí padà oníbùú" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flip-vertical" +msgstr "Ìyí padà olóòró" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flow-start" +msgstr "Ìbẹ̀rè ìṣàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.reset-overrides" +msgstr "Ṣe àtúnṣe ìdojúkọ" + +msgid "workspace.shape.menu.restore-main" +msgstr "Dạ àkóónú pàtàkì sí pò" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.select-layer" +msgstr "Yan ìpele" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show" +msgstr "Ṣà fihàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-in-assets" +msgstr "Ṣafihàn nínú atọ́ka àwọn ìgbìmọ̀ ìní" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-main" +msgstr "Ṣà fihàn àkóónú pàtàkì" + +msgid "workspace.shape.menu.thumbnail-remove" +msgstr "Yọ àwòrán aláṣojú kúrò" + +msgid "workspace.shape.menu.thumbnail-set" +msgstr "Fi sípò àwòrań aláṣojú" + +msgid "workspace.shape.menu.transform-to-path" +msgstr "Yípadà sí pópó ọ̀nà" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.ungroup" +msgstr "Ṣe àìkójọ" + +msgid "workspace.shape.menu.union" +msgstr "Ìbáṣepò" + +msgid "workspace.sidebar.layers.groups" +msgstr "Àkójọ" + +msgid "workspace.sidebar.layers.images" +msgstr "Àwọn àwòrán" + +msgid "workspace.sidebar.layers.masks" +msgstr "Àwọn ìbòjú" + +msgid "workspace.sidebar.layers.search" +msgstr "Àwọn ìpele wíwá" + +msgid "workspace.sidebar.layers.shapes" +msgstr "Àwọn ìrísí" + +msgid "workspace.sidebar.layers.texts" +msgstr "Àwọn àyọkà" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.sitemap" +msgstr "Máàpù ojú ìlà" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.assets" +msgstr "Àwọn ohun ìní" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.color-palette" +msgstr "Pálètì àwọ̀ (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.comments" +msgstr "Àwọn ìdáásí (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.curve" +msgstr "Ìṣépo (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.ellipse" +msgstr "Àlàfo (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.frame" +msgstr "Pátákó (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text" +msgstr "Àyọkà (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.image" +msgstr "Àwòrán(%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.move" +msgstr "Gbé (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.path" +msgstr "Pópó ọ̀nà (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.rect" +msgstr "Onígun mẹ́rin (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.shortcuts" +msgstr "Àwón ọ̀nà àbùjá (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text-palette" +msgstr "Àwọn ohun ìtẹ̀wé (%s)" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.empty" +msgstr "Di ìgbà yìí kò sí àyípadà nínú ìtàn" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.delete" +msgstr "Paarẹ́%s" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.modify" +msgstr "Àtuńṣe %s" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.move" +msgstr "Àwọn ohun tí a ti gbé lọ" + +msgid "workspace.undo.entry.multiple.circle" +msgstr "Awọn àyíká" + +msgid "workspace.undo.entry.multiple.color" +msgstr "Àwọn ohun àmúṣọrọ̀ àwọ̀" + +msgid "workspace.undo.entry.multiple.component" +msgstr "Àkóónú" + +msgid "workspace.undo.entry.multiple.multiple" +msgstr "Àwọn ǹǹkan" + +msgid "workspace.undo.entry.multiple.page" +msgstr "Àwọn ojú awé" + +msgid "workspace.undo.entry.multiple.curve" +msgstr "Àwọn ẹkọ̀rọ̀" + +msgid "workspace.undo.entry.multiple.frame" +msgstr "Pátákó" + +msgid "workspace.undo.entry.multiple.group" +msgstr "Àwọn àkójọ" + +msgid "workspace.undo.entry.multiple.media" +msgstr "Àwọn ohun ìyì àwòrán" + +msgid "workspace.undo.entry.multiple.path" +msgstr "Àwọn ẹ̀bá ọ̀nà" + +msgid "workspace.undo.entry.multiple.rect" +msgstr "Àwọn onígun mẹ́rin" + +msgid "workspace.undo.entry.multiple.shape" +msgstr "Ìrísí" + +msgid "workspace.undo.entry.multiple.text" +msgstr "Àwọn àyọkà" + +msgid "workspace.undo.entry.multiple.typography" +msgstr "Àwọn ohun ìyì ìwé títẹ̀" + +msgid "workspace.undo.entry.single.path" +msgstr "Pópó ònà" + +msgid "workspace.undo.entry.single.rect" +msgstr "Onígun mẹ́rin" + +msgid "workspace.undo.entry.single.shape" +msgstr "Ìrísí" + +msgid "workspace.undo.entry.single.text" +msgstr "Àyọkà" + +msgid "workspace.undo.entry.single.typography" +msgstr "Ohun ìyì ìwé títẹ̀" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.unknown" +msgstr "Iṣẹ́ parí %s" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.title" +msgstr "Ìtàn" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.dismiss" +msgstr "Ta nù" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "Àlàyé síi" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.there-are-updates" +msgstr "Àwọn imúdójúìwọ̀n wà nínú àwọn yàrá ìkàwẹ tí a pín" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.update" +msgstr "Ìmúdójúìwọ̀n" + +msgid "workspace.viewport.click-to-close-path" +msgstr "Tẹ̀ láti pa pópó ọ̀nà dé" -- Gitee From b4e46347d4becd20206313563f572785f429aadb Mon Sep 17 00:00:00 2001 From: Stas Haas Date: Wed, 14 Feb 2024 14:39:06 +0000 Subject: [PATCH 0359/1266] :globe_with_meridians: Add translations for: German. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/ --- frontend/translations/de.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/translations/de.po b/frontend/translations/de.po index 051e038d4..1bbda91f4 100644 --- a/frontend/translations/de.po +++ b/frontend/translations/de.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-12 19:01+0000\n" +"PO-Revision-Date: 2024-02-15 15:01+0000\n" "Last-Translator: Stas Haas \n" "Language-Team: German \n" @@ -2258,7 +2258,7 @@ msgstr "" "Gegenwart und Zukunft mit der gesamten Community und dem Penpot-Kernteam." msgid "onboarding-v2.welcome.desc2.title" -msgstr "In der Community mitmachen" +msgstr "Mitwirkung in der Community" msgid "onboarding-v2.welcome.desc3" msgstr "" -- Gitee From f410783283f594676fadf169c9303c2dd1966f5d Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Fri, 16 Feb 2024 13:28:08 +0000 Subject: [PATCH 0360/1266] :globe_with_meridians: Add translations for: Hebrew. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/ --- frontend/translations/he.po | 172 +++++++++++++++++++++++++++++++++++- 1 file changed, 170 insertions(+), 2 deletions(-) diff --git a/frontend/translations/he.po b/frontend/translations/he.po index eafd1cd44..24c08e675 100644 --- a/frontend/translations/he.po +++ b/frontend/translations/he.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-10-16 04:09+0000\n" +"PO-Revision-Date: 2024-02-17 14:02+0000\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew \n" @@ -10,7 +10,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " "n % 10 == 0) ? 2 : 3));\n" -"X-Generator: Weblate 5.1-dev\n" +"X-Generator: Weblate 5.4\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -4986,3 +4986,171 @@ msgstr "מייסד/סגן נשיא" #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.circle-marker-short" msgstr "עיגול" + +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"עצם יצירת חשבון חדש מהווה הסכמה ל[תנאי השירות](%s) ול[מדיניות הפרטיות](%s) " +"שלנו." + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "מספר גרסת הקובץ לא תואם" + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "התגלתה יכולת לא תואמת ‚%s’" + +msgid "labels.share" +msgstr "שיתוף" + +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "להמשיך ביצירת צוות" + +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "להתחיל בלי צוות" + +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "עריכת רשת" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "יציאה מהמערכת" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "איתור" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "בוצע" + +msgid "workspace.top-bar.read-only.done" +msgstr "בוצע" + +msgid "workspace.options.guides.title" +msgstr "קווים מנחים" + +msgid "media.linear" +msgstr "קווי" + +msgid "media.radial" +msgstr "מעגלי" + +msgid "media.gradient" +msgstr "מדרג" + +msgid "media.choose-image" +msgstr "בחירת תמונה" + +msgid "shortcuts.toggle-theme" +msgstr "החלפת ערכת עיצוב" + +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "החלפה לערכת עיצוב כהה" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "הוספת עמודה משמאל" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "מחיקת עמודה וצורות" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "שכפול שורה" + +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"נראה שאין התאמ בין היכולות הפעילות לבין הקובץ שניסית לפתוח. יש להחיל הסבות " +"עבור ‚%s’ לפני שיתאפשר לפתוח את הקובץ הזה." + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "החלפה לערכת עיצוב בהירה" + +msgid "workspace.options.component.swap" +msgstr "החלפת רכיב" + +msgid "workspace.options.component.swap.empty" +msgstr "עדיין אין נכסים בתיקייה הזאת" + +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**מצב חקירה** (צפייה בלבד)" + +msgid "dashboard.import.analyze-error.components-v2" +msgstr "קובץ עם רכיבים בגרסה 2 מופעל אך הצוות הזה לא תומך בזה עדיין." + +msgid "errors.validation" +msgstr "שגיאת אימות" + +msgid "errors.paste-data-validation" +msgstr "נתונים שגויים בלוח הגזירים" + +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "ביטול הגדרה" + +msgid "labels.search" +msgstr "חיפוש" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "אפשר ליצור צוות בהמשך." + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "להמשיך בלי צוות" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "ליצור צוות ולשלוח הזמנות" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "ליצור צוות בלי לשלוח הזמנות" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "ליצור צוות ולהזמין" + +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "ליצור צוות" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "אפשר להזמין בהמשך" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "בטעינה…" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "זרימה" + +msgid "media.image" +msgstr "תמונה" + +msgid "media.solid" +msgstr "אחיד" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "שכפול עמודה" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "הוספת עמודה מימין" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "מחיקת עמודה" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "הוספת שורה למעלה" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "הוספת שורה מתחת" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "מחיקת שורה" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "מחיקת שורה וצורות" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "מיזוג תאים" + +msgid "workspace.context-menu.grid-cells.area" +msgstr "יצירת שטח" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "יצירת לוח" -- Gitee From 8b17da4235db40e43755f7ff1eec8058a13b37d3 Mon Sep 17 00:00:00 2001 From: Louis Chance Date: Fri, 23 Feb 2024 15:07:26 +0000 Subject: [PATCH 0361/1266] :globe_with_meridians: Add translations for: French. Currently translated at 96.4% (1313 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/ --- frontend/translations/fr.po | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/frontend/translations/fr.po b/frontend/translations/fr.po index 87d06e573..e6fb17be5 100644 --- a/frontend/translations/fr.po +++ b/frontend/translations/fr.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-11-16 18:03+0000\n" -"Last-Translator: Swapnil C \n" +"PO-Revision-Date: 2024-02-24 15:02+0000\n" +"Last-Translator: Louis Chance \n" "Language-Team: French \n" "Language: fr\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" -"X-Generator: Weblate 5.2\n" +"X-Generator: Weblate 5.5-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -2267,7 +2267,7 @@ msgid "onboarding-v2.welcome.desc3.title" msgstr "Guide du contributeur" msgid "onboarding-v2.welcome.title" -msgstr "Bienvenu sur Penpot !" +msgstr "Bienvenue sur Penpot !" msgid "onboarding.choice.team-up.create-team-desc" msgstr "" @@ -5034,3 +5034,18 @@ msgstr "Après un délai" #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.add-flex" msgstr "Ajouter flex layout" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Le numéro de version du fichier est incompatible" + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Fonctionnalité incompatible détectée '%s'" + +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Il semble y avoir une incompatibilité entre les fonctionnalités actives et " +"celles du fichier que tentez d'ouvrir. Vous devez activer les migrations " +"pour '%s' avant de pouvoir ouvrir le fichier." -- Gitee From 11bfc45c0b3c81e4fc867e8886a187cda204b5f6 Mon Sep 17 00:00:00 2001 From: Edgars Andersons Date: Fri, 8 Mar 2024 12:06:32 +0000 Subject: [PATCH 0362/1266] :globe_with_meridians: Add translations for: Latvian. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/ --- frontend/translations/lv.po | 68 +++++++++++++++++++++++++++++++++---- 1 file changed, 62 insertions(+), 6 deletions(-) diff --git a/frontend/translations/lv.po b/frontend/translations/lv.po index 72c325638..6169cb2f0 100644 --- a/frontend/translations/lv.po +++ b/frontend/translations/lv.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-01-06 22:06+0000\n" +"PO-Revision-Date: 2024-03-09 13:01+0000\n" "Last-Translator: Edgars Andersons \n" "Language-Team: Latvian \n" @@ -10,7 +10,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= " "19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -3683,7 +3683,7 @@ msgstr "Auto" #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.column" -msgstr "Kolonnas" +msgstr "Slejas" #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.grid-title" @@ -3694,7 +3694,7 @@ msgstr "Krāsa" #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.params.columns" -msgstr "Kolonnas" +msgstr "Slejas" #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.params.gutter" @@ -4111,11 +4111,11 @@ msgstr "Apakša" #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.direction.column" -msgstr "Kolona" +msgstr "Sleja" #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.direction.column-reverse" -msgstr "Apgrieztā kolonna" +msgstr "Apvērsta sleja" #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.direction.row" @@ -5157,3 +5157,59 @@ msgstr "Ir pieejama jauna versija, lūgums atsvaidzināt lapu" msgid "workspace.layout_grid.editor.title" msgstr "Režģa labošana" + +msgid "shortcuts.toggle-theme" +msgstr "Mainīt izskatu" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "Pārslēgties uz gaišo izskatu" + +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Pārslēgties uz tumšo izskatu" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Divkāršota sleja" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Izdzēst sleju" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Izdzēst slejas un apveidus" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Divkāršot rindu" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Pievienot 1 rindu virs" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Pievienot 1 sleju pa labi" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Pievienot 1 sleju pa kreisi" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Pievienot 1 rindu zem" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Izdzēst rindu" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Izdzēst rindu un apveidus" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Apvienot šūnas" + +msgid "workspace.context-menu.grid-cells.area" +msgstr "Izveidot laukumu" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Izveidot plātni" + +msgid "dashboard.import.analyze-error.components-v2" +msgstr "" +"Datne ar v2 sastāvdaļām ir aktivizēta, bet šī komanda to vēl neatbalsta." + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Ielādē…" -- Gitee From 6e032676971c39b58d6d6bdf0743b56c72cece98 Mon Sep 17 00:00:00 2001 From: Stas Haas Date: Thu, 21 Mar 2024 15:14:58 +0000 Subject: [PATCH 0363/1266] :globe_with_meridians: Add translations for: German. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/ --- frontend/translations/de.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/translations/de.po b/frontend/translations/de.po index 1bbda91f4..41127a3ae 100644 --- a/frontend/translations/de.po +++ b/frontend/translations/de.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-15 15:01+0000\n" +"PO-Revision-Date: 2024-03-22 16:01+0000\n" "Last-Translator: Stas Haas \n" "Language-Team: German \n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -4836,7 +4836,7 @@ msgid "workspace.viewport.click-to-close-path" msgstr "Klicken Sie, um den Pfad zu schließen" msgid "workspace.options.component.copy" -msgstr "Kopieren" +msgstr "Kopie" #: src/app/main/ui/onboarding/questions.cljs msgid "questions.developer" @@ -4859,7 +4859,7 @@ msgid "workspace.options.stroke-cap.square-marker-short" msgstr "Rechteck" msgid "workspace.options.component.main" -msgstr "Main" +msgstr "Hauptkomponente" #: src/app/main/ui/onboarding/questions.cljs msgid "questions.freelancer" -- Gitee From 84b09050967c1fec4791be4a542a2e3ff3a57f34 Mon Sep 17 00:00:00 2001 From: Linerly Date: Sun, 7 Apr 2024 14:05:31 +0000 Subject: [PATCH 0364/1266] :globe_with_meridians: Add translations for: Indonesian. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/ --- frontend/translations/id.po | 173 +++++++++++++++++++++++++++++++++++- 1 file changed, 171 insertions(+), 2 deletions(-) diff --git a/frontend/translations/id.po b/frontend/translations/id.po index 037737bdd..810b2630c 100644 --- a/frontend/translations/id.po +++ b/frontend/translations/id.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-10-07 12:12+0000\n" +"PO-Revision-Date: 2024-04-08 15:01+0000\n" "Last-Translator: Linerly \n" "Language-Team: Indonesian \n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.1-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -5000,3 +5000,172 @@ msgstr "" #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.circle-marker-short" msgstr "Lingkaran" + +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Ketika membuat akun baru, Anda menyetujui [persyaratan layanan](%s) dan [" +"kebijakan privasi](%s) kami." + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Berkas memiliki nomor versi tidak kompatibel" + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Fitur '%s' tidak kompatibel terdeteksi" + +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Tidak ditetapkan" + +msgid "labels.share" +msgstr "Bagikan" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Buat tim dan kirim undangan" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Cari lokasi" + +msgid "workspace.options.component.swap" +msgstr "Ganti komponen" + +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**Mode inspeksi** (Hanya Tampilan)" + +msgid "media.gradient" +msgstr "Gradien" + +msgid "media.choose-image" +msgstr "Pilih gambar" + +msgid "media.solid" +msgstr "Padat" + +msgid "media.linear" +msgstr "Linear" + +msgid "media.radial" +msgstr "Radial" + +msgid "dashboard.import.analyze-error.components-v2" +msgstr "Berkas dengan komponen v2 diaktifkan tetapi tim ini belum mendukungnya." + +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Sepertinya ada ketidakcocokan antara fitur yang diaktifkan dengan fitur " +"berkas yang sedang Anda buka. Migrasi untuk '%s' harus diterapkan sebelum " +"berkasnya dapat dibuka." + +msgid "errors.validation" +msgstr "Kesalahan Validasi" + +msgid "errors.paste-data-validation" +msgstr "Data tidak valid dalam papan klip" + +msgid "labels.search" +msgstr "Cari" + +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Lanjutkan membuat tim" + +msgid "shortcuts.toggle-theme" +msgstr "Ubah tema" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Selesai" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Keluar" + +msgid "workspace.top-bar.read-only.done" +msgstr "Selesai" + +msgid "media.image" +msgstr "Gambar" + +msgid "workspace.options.guides.title" +msgstr "Panduan" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Hapus baris" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Hapus baris dan bentuk" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Gabungkan sel" + +msgid "workspace.context-menu.grid-cells.area" +msgstr "Buat area" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Buat papan" + +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Mulai tanpa tim" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Anda nanti akan dapat membuat tim." + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Lanjutkan tanpa tim" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Buat tim tanpa mengundang" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Buat tim & undang" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Anda nanti akan dapat mengundang" + +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Buat tim" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "Ubah ke tema terang" + +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Ubah ke tema gelap" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Memuat…" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Alur" + +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Sunting kisi" + +msgid "workspace.options.component.swap.empty" +msgstr "Belum ada aset dalam pustaka ini" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Gandakan kolom" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Tambah 1 kolom ke kiri" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Tambah 1 kolom ke kanan" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Hapus kolom" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Hapus kolom dan bentuk" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Gandakan baris" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Tambah 1 baris di atas" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Tambah 1 baris di bawah" -- Gitee From 084378556b28568fceb268b940c619bd35410d91 Mon Sep 17 00:00:00 2001 From: Edgars Andersons Date: Thu, 18 Apr 2024 07:49:49 +0000 Subject: [PATCH 0365/1266] :globe_with_meridians: Add translations for: Latvian. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/ --- frontend/translations/lv.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/translations/lv.po b/frontend/translations/lv.po index 6169cb2f0..7cba936a9 100644 --- a/frontend/translations/lv.po +++ b/frontend/translations/lv.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-03-09 13:01+0000\n" +"PO-Revision-Date: 2024-04-19 08:03+0000\n" "Last-Translator: Edgars Andersons \n" "Language-Team: Latvian \n" @@ -55,11 +55,11 @@ msgstr "Pilns vārds" #: src/app/main/ui/auth/register.cljs msgid "auth.login-here" -msgstr "Ienākt šeit" +msgstr "Pieteikties šeit" #: src/app/main/ui/auth/login.cljs msgid "auth.login-submit" -msgstr "Ienākt" +msgstr "Pieteikties" #: src/app/main/ui/auth/login.cljs msgid "auth.login-title" @@ -3171,7 +3171,7 @@ msgid "workspace.assets.libraries" msgstr "Bibliotēkas" msgid "workspace.assets.local-library" -msgstr "lokālā bibliotēka" +msgstr "vietējā bibliotēka" #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.not-found" -- Gitee From 30b0a2eddbff935aff2d83eed9a2eb925cd9d8c6 Mon Sep 17 00:00:00 2001 From: TheScientistPT Date: Fri, 19 Apr 2024 22:48:04 +0000 Subject: [PATCH 0366/1266] :globe_with_meridians: Add translations for: Portuguese (Portugal). Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/ --- frontend/translations/pt_PT.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/translations/pt_PT.po b/frontend/translations/pt_PT.po index 0b0abda0c..a37244223 100644 --- a/frontend/translations/pt_PT.po +++ b/frontend/translations/pt_PT.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-12 19:02+0000\n" +"PO-Revision-Date: 2024-04-20 23:07+0000\n" "Last-Translator: TheScientistPT \n" "Language-Team: Portuguese (Portugal) \n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -398,8 +398,8 @@ msgstr "Duplicar %s ficheiros" #: src/app/main/ui/dashboard/grid.cljs msgid "dashboard.empty-placeholder-drafts" msgstr "" -"Oh não! Ainda não tens ficheiros! Se quiseres experimentar podes começar " -"com os nossos templates em [Libraries & " +"Os ficheiros adicionados às Bibliotecas irão aparecer aqui. Experimenta " +"adicionar os teus ficheiros ou experimenta algumas das nossas [Bibliotecas e " "templates](https://penpot.app/libraries-templates.html)." msgid "dashboard.export-binary-multi" -- Gitee From 68d59051fc6ca7dc6494e7a1b78822881071e45a Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Wed, 24 Apr 2024 14:52:04 +0200 Subject: [PATCH 0367/1266] Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ --- frontend/translations/af.po | 4 ---- frontend/translations/ar.po | 7 ------- frontend/translations/bn.po | 4 ---- frontend/translations/ca.po | 7 ------- frontend/translations/cs.po | 11 ---------- frontend/translations/da.po | 4 ---- frontend/translations/de.po | 11 ---------- frontend/translations/el.po | 4 ---- frontend/translations/es.po | 5 ----- frontend/translations/es_419.po | 4 ---- frontend/translations/eu.po | 7 ------- frontend/translations/fa.po | 7 ------- frontend/translations/fin_FI.po | 4 ---- frontend/translations/fo.po | 4 ---- frontend/translations/fr.po | 7 ------- frontend/translations/gl.po | 4 ---- frontend/translations/ha.po | 7 ------- frontend/translations/he.po | 11 ---------- frontend/translations/hr.po | 9 -------- frontend/translations/id.po | 11 ---------- frontend/translations/ig.po | 8 ------- frontend/translations/it.po | 4 ---- frontend/translations/jpn_JP.po | 4 ---- frontend/translations/ko.po | 4 ---- frontend/translations/lt.po | 4 ---- frontend/translations/lv.po | 11 ---------- frontend/translations/ml.po | 4 ---- frontend/translations/ms.po | 18 ---------------- frontend/translations/nl.po | 11 ---------- frontend/translations/pl.po | 7 ------- frontend/translations/pt_BR.po | 7 ------- frontend/translations/pt_PT.po | 11 ---------- frontend/translations/ro.po | 7 ------- frontend/translations/ru.po | 7 ------- frontend/translations/ta.po | 4 ---- frontend/translations/tr.po | 11 ---------- frontend/translations/ukr_UA.po | 4 ---- frontend/translations/yo.po | 36 -------------------------------- frontend/translations/zh_CN.po | 11 ---------- frontend/translations/zh_Hant.po | 7 ------- 40 files changed, 312 deletions(-) diff --git a/frontend/translations/af.po b/frontend/translations/af.po index f037855e1..f6e89f529 100644 --- a/frontend/translations/af.po +++ b/frontend/translations/af.po @@ -41,10 +41,6 @@ msgstr "(huidige)" msgid "auth.notifications.invalid-token-error" msgstr "Die hersteltoken is ongeldig." -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Wonderlik om jou weer te sien!" - #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.create" msgstr "Genereer nuwe token" diff --git a/frontend/translations/ar.po b/frontend/translations/ar.po index 9bc152ac5..5f866b683 100644 --- a/frontend/translations/ar.po +++ b/frontend/translations/ar.po @@ -57,10 +57,6 @@ msgstr "تسجيل الدخول هنا" msgid "auth.login-submit" msgstr "تسجيل الدخول" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "سعيد برؤيتك مجددا!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "Github" @@ -3590,9 +3586,6 @@ msgstr "طول" msgid "workspace.shape.menu.update-main" msgstr "تحديث العنصر الرئيسي" -msgid "shortcuts.toggle-rules" -msgstr "إظهار\\إخفاء المسطرة" - #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.flow-start" msgstr "بداية المخطط" diff --git a/frontend/translations/bn.po b/frontend/translations/bn.po index 352aaac6a..456b8e988 100644 --- a/frontend/translations/bn.po +++ b/frontend/translations/bn.po @@ -55,10 +55,6 @@ msgstr "এখানে লগিন করুন" msgid "auth.login-submit" msgstr "লগিন" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "আপনাকে আবার দেখে ভালো লাগছে!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "গিটহাব" diff --git a/frontend/translations/ca.po b/frontend/translations/ca.po index b75496da4..ffa795e91 100644 --- a/frontend/translations/ca.po +++ b/frontend/translations/ca.po @@ -60,10 +60,6 @@ msgstr "Inicieu la sessió aquí" msgid "auth.login-submit" msgstr "Entra" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Ens agrada tornar a veure-vos!" - #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -2254,9 +2250,6 @@ msgstr "Bloqueja la selecció" msgid "shortcuts.toggle-lock-size" msgstr "Bloqueja les proporcions" -msgid "shortcuts.toggle-rules" -msgstr "Mostra/Amaga les regles" - msgid "shortcuts.toggle-textpalette" msgstr "Mostra/amaga la paleta de text" diff --git a/frontend/translations/cs.po b/frontend/translations/cs.po index b2f2225f4..224cbade2 100644 --- a/frontend/translations/cs.po +++ b/frontend/translations/cs.po @@ -60,10 +60,6 @@ msgstr "Přihlaste se zde" msgid "auth.login-submit" msgstr "Přihlásit se" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Rádi vás znovu vidíme!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -2571,9 +2567,6 @@ msgstr "Uzamknout vybrané" msgid "shortcuts.toggle-lock-size" msgstr "Uzamknout proporce" -msgid "shortcuts.toggle-rules" -msgstr "Zobrazit/skrýt pravítka" - msgid "shortcuts.toggle-textpalette" msgstr "Přepnout paletu textu" @@ -4801,10 +4794,6 @@ msgstr "Anotace" msgid "workspace.shape.menu.create-multiple-components" msgstr "Vytvořte více komponent" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Režim kontroly** (Pouze zobrazení)" - msgid "modals.add-shared-confirm-empty.hint" msgstr "" "Vaše knihovna je prázdná. Po přidání jako sdílená knihovna budou položky, " diff --git a/frontend/translations/da.po b/frontend/translations/da.po index 8e4d96ba6..31479ed12 100644 --- a/frontend/translations/da.po +++ b/frontend/translations/da.po @@ -59,10 +59,6 @@ msgstr "Log på her" msgid "auth.login-submit" msgstr "Log på" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Fedt at se dig igen!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "Github" diff --git a/frontend/translations/de.po b/frontend/translations/de.po index 41127a3ae..d691215b2 100644 --- a/frontend/translations/de.po +++ b/frontend/translations/de.po @@ -60,10 +60,6 @@ msgstr "Hier anmelden" msgid "auth.login-submit" msgstr "Anmelden" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Schön, Sie wiederzusehen!" - #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -2792,9 +2788,6 @@ msgstr "Auswahl sperren" msgid "shortcuts.toggle-lock-size" msgstr "Seitenverhältnis sperren/entsperren" -msgid "shortcuts.toggle-rules" -msgstr "Lineale ein-/ausblenden" - msgid "shortcuts.toggle-textpalette" msgstr "Textpalette ein-/ausblenden" @@ -5086,10 +5079,6 @@ msgstr "Bild auswählen" msgid "workspace.options.guides.title" msgstr "Hilfslinien" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Inspektionsmodus** (nur Ansicht)" - #: src/app/main/errors.cljs msgid "errors.version-not-supported" msgstr "Die Datei hat eine inkompatible Versionsnummer" diff --git a/frontend/translations/el.po b/frontend/translations/el.po index cc62a2301..a6bcf2b62 100644 --- a/frontend/translations/el.po +++ b/frontend/translations/el.po @@ -60,10 +60,6 @@ msgstr "Συνδεθείτε εδώ" msgid "auth.login-submit" msgstr "Συνδεθείτε" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Χαίρομαι που σας ξαναδώ" - #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" diff --git a/frontend/translations/es.po b/frontend/translations/es.po index 9c52e4a47..0d2c50800 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -3515,10 +3515,6 @@ msgstr "Seleccionar todo" msgid "workspace.header.menu.show-artboard-names" msgstr "Mostrar nombres de tableros" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-g" -msgstr "Mostrar rejilla" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Mostrar paleta de colores" @@ -5260,4 +5256,3 @@ msgstr "Crear area" msgid "workspace.context-menu.grid-cells.create-board" msgstr "Crear tablero" - diff --git a/frontend/translations/es_419.po b/frontend/translations/es_419.po index 725523935..de4afc63d 100644 --- a/frontend/translations/es_419.po +++ b/frontend/translations/es_419.po @@ -283,10 +283,6 @@ msgstr "" msgid "auth.fullname" msgstr "Nombre completo" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "¡Qué bueno verte de nuevo!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-google-submit" msgstr "Google" diff --git a/frontend/translations/eu.po b/frontend/translations/eu.po index 9436e9d85..e1c3a70fd 100644 --- a/frontend/translations/eu.po +++ b/frontend/translations/eu.po @@ -60,10 +60,6 @@ msgstr "Sartu" msgid "auth.login-submit" msgstr "Sartu" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Ongi etorri berriz ere!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -2568,9 +2564,6 @@ msgstr "Blokeatu/Desblokeatu" msgid "shortcuts.toggle-lock-size" msgstr "Blokeatu/Desblokeatu proportzioak" -msgid "shortcuts.toggle-rules" -msgstr "Erakutsi/ezkutatu erregelak" - msgid "shortcuts.toggle-textpalette" msgstr "Erakutsi/Ezkutatu testuen paleta" diff --git a/frontend/translations/fa.po b/frontend/translations/fa.po index f010b9a74..17bd3e5d7 100644 --- a/frontend/translations/fa.po +++ b/frontend/translations/fa.po @@ -60,10 +60,6 @@ msgstr "ورود از اینجا" msgid "auth.login-submit" msgstr "ورود" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "خوشحالم که دوباره شما را می‌بینم!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "گیتهاب" @@ -1876,9 +1872,6 @@ msgstr "انتقال" msgid "shortcuts.paste" msgstr "چسباندن" -msgid "shortcuts.toggle-rules" -msgstr "نمایش/پنهان کردن خط‌کش‌ها" - msgid "shortcuts.undo" msgstr "واگرد" diff --git a/frontend/translations/fin_FI.po b/frontend/translations/fin_FI.po index 2c733dca9..2e02a3c73 100644 --- a/frontend/translations/fin_FI.po +++ b/frontend/translations/fin_FI.po @@ -59,10 +59,6 @@ msgstr "Kirjaudu sisään" msgid "auth.login-submit" msgstr "Kirjaudu" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Mahtavaa nähdä sinut uudelleen!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" diff --git a/frontend/translations/fo.po b/frontend/translations/fo.po index 6daabf410..b4065190c 100644 --- a/frontend/translations/fo.po +++ b/frontend/translations/fo.po @@ -60,10 +60,6 @@ msgstr "Innrita her" msgid "auth.login-submit" msgstr "Rita inn" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Gott at síggja teg aftur!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" diff --git a/frontend/translations/fr.po b/frontend/translations/fr.po index e6fb17be5..be89108af 100644 --- a/frontend/translations/fr.po +++ b/frontend/translations/fr.po @@ -60,10 +60,6 @@ msgstr "Connectez-vous ici" msgid "auth.login-submit" msgstr "Se connecter" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Ravi de vous revoir !" - #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -2786,9 +2782,6 @@ msgstr "Verrou sélectionné" msgid "shortcuts.toggle-lock-size" msgstr "Verrouiller les proportions" -msgid "shortcuts.toggle-rules" -msgstr "Afficher/masquer les règles" - msgid "shortcuts.toggle-textpalette" msgstr "Afficher/masquer la palette de texte" diff --git a/frontend/translations/gl.po b/frontend/translations/gl.po index 17030b26a..e1b8b4d81 100644 --- a/frontend/translations/gl.po +++ b/frontend/translations/gl.po @@ -60,10 +60,6 @@ msgstr "Entra aquí" msgid "auth.login-submit" msgstr "Entrar" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Un pracer volverte ver!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" diff --git a/frontend/translations/ha.po b/frontend/translations/ha.po index 27661a3aa..c713efc84 100644 --- a/frontend/translations/ha.po +++ b/frontend/translations/ha.po @@ -337,10 +337,6 @@ msgid "dashboard.export.options.detach.message" msgstr "" "manhajar tura kundi ba ta shiga cikin fitarwa, wani amfaniqarawa a taska. " -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "na ji daxin sake haxuwa da kai!" - msgid "shortcut-subsection.shape" msgstr "Siffa" @@ -2549,9 +2545,6 @@ msgstr "gogewa webhook" msgid "workspace.shape.menu.update-main" msgstr "sabunta ainihin wurin" -msgid "shortcuts.toggle-rules" -msgstr "Nuna / boye magwaji" - msgid "shortcuts.draw-path" msgstr "Hanya" diff --git a/frontend/translations/he.po b/frontend/translations/he.po index 24c08e675..b71e312a8 100644 --- a/frontend/translations/he.po +++ b/frontend/translations/he.po @@ -57,10 +57,6 @@ msgstr "כניסה מכאן" msgid "auth.login-submit" msgstr "כניסה" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "שמחים לראות אותך שוב!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -2817,9 +2813,6 @@ msgstr "נעילת הנבחרים" msgid "shortcuts.toggle-lock-size" msgstr "נעילת יחס" -msgid "shortcuts.toggle-rules" -msgstr "הצגת/הסתרת סרגלים" - msgid "shortcuts.toggle-textpalette" msgstr "החלפת לוח טקסט" @@ -5071,10 +5064,6 @@ msgstr "החלפת רכיב" msgid "workspace.options.component.swap.empty" msgstr "עדיין אין נכסים בתיקייה הזאת" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**מצב חקירה** (צפייה בלבד)" - msgid "dashboard.import.analyze-error.components-v2" msgstr "קובץ עם רכיבים בגרסה 2 מופעל אך הצוות הזה לא תומך בזה עדיין." diff --git a/frontend/translations/hr.po b/frontend/translations/hr.po index a0e38637e..c51d077c9 100644 --- a/frontend/translations/hr.po +++ b/frontend/translations/hr.po @@ -59,10 +59,6 @@ msgstr "Prijavi se ovdje" msgid "auth.login-submit" msgstr "Prijava" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Drago nam je vidjeti te opet!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -2345,10 +2341,6 @@ msgstr "Zaključaj odabrano" msgid "shortcuts.toggle-lock-size" msgstr "Zaključaj proporcije" -#, fuzzy -msgid "shortcuts.toggle-rules" -msgstr "Prikaži/sakrij \"rules\"" - msgid "shortcuts.toggle-textpalette" msgstr "Promijeni paletu teksta" @@ -2697,7 +2689,6 @@ msgstr "Omogući dinamičko poravnanje" msgid "workspace.header.menu.enable-scale-text" msgstr "Omogući skaliranje teksta" - #: src/app/main/ui/workspace/header.cljs #, fuzzy msgid "workspace.header.menu.enable-snap-guides" diff --git a/frontend/translations/id.po b/frontend/translations/id.po index 810b2630c..c1f452191 100644 --- a/frontend/translations/id.po +++ b/frontend/translations/id.po @@ -60,10 +60,6 @@ msgstr "Masuk di sini" msgid "auth.login-submit" msgstr "Masuk" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Senang bertemu dengan Anda lagi!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -2925,9 +2921,6 @@ msgstr "Kunci dipilih" msgid "shortcuts.toggle-lock-size" msgstr "Kunci proporsi" -msgid "shortcuts.toggle-rules" -msgstr "Tampilkan/sembunyikan penggaris" - msgid "shortcuts.toggle-textpalette" msgstr "Alih palet teks" @@ -5031,10 +5024,6 @@ msgstr "Cari lokasi" msgid "workspace.options.component.swap" msgstr "Ganti komponen" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Mode inspeksi** (Hanya Tampilan)" - msgid "media.gradient" msgstr "Gradien" diff --git a/frontend/translations/ig.po b/frontend/translations/ig.po index c45887bb5..a3bc19749 100644 --- a/frontend/translations/ig.po +++ b/frontend/translations/ig.po @@ -11,10 +11,6 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.4-dev\n" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Ihe ịtụnanya ịhụ gị !" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "Obi Git" @@ -1992,10 +1988,6 @@ msgstr "Ịzụ ahịa" msgid "questions.more-than-50" msgstr "Karịrị iri ise" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.never-used-a-tool" -msgstr "E jibeghị m ngwa ọrụ nse rụọ ọrụ mbụ" - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.next" msgstr "Ọzọ" diff --git a/frontend/translations/it.po b/frontend/translations/it.po index e8ed1cd3d..538d09b8a 100644 --- a/frontend/translations/it.po +++ b/frontend/translations/it.po @@ -60,10 +60,6 @@ msgstr "Accedere qui" msgid "auth.login-submit" msgstr "Accedi" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Felice di rivederti!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" diff --git a/frontend/translations/jpn_JP.po b/frontend/translations/jpn_JP.po index e7847f005..e2de68012 100644 --- a/frontend/translations/jpn_JP.po +++ b/frontend/translations/jpn_JP.po @@ -55,10 +55,6 @@ msgstr "こちらからログイン" msgid "auth.login-submit" msgstr "ログイン" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "またお会いしましたね!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" diff --git a/frontend/translations/ko.po b/frontend/translations/ko.po index 2946e8f69..8105950ad 100644 --- a/frontend/translations/ko.po +++ b/frontend/translations/ko.po @@ -43,10 +43,6 @@ msgstr "여기서 로그인하세요" msgid "auth.login-submit" msgstr "로그인" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "다시 만나서 반가워요!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" diff --git a/frontend/translations/lt.po b/frontend/translations/lt.po index a4cebd6dd..a59ca0220 100644 --- a/frontend/translations/lt.po +++ b/frontend/translations/lt.po @@ -61,10 +61,6 @@ msgstr "Prisijungimas čia" msgid "auth.login-submit" msgstr "Prisijungti" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Malonu Jus vėl matyti!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" diff --git a/frontend/translations/lv.po b/frontend/translations/lv.po index 7cba936a9..7dee53ce3 100644 --- a/frontend/translations/lv.po +++ b/frontend/translations/lv.po @@ -61,10 +61,6 @@ msgstr "Pieteikties šeit" msgid "auth.login-submit" msgstr "Pieteikties" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Prieks Jūs atkal redzēt!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -2912,9 +2908,6 @@ msgstr "Slēgt / Atslēgt" msgid "shortcuts.toggle-lock-size" msgstr "Slēgt proporcijas" -msgid "shortcuts.toggle-rules" -msgstr "Rādīt/paslēpt mērjoslas" - msgid "shortcuts.toggle-textpalette" msgstr "Pārslēgt teksta paleti" @@ -5077,10 +5070,6 @@ msgstr "Trijstūris" msgid "workspace.options.stroke-cap.square-marker-short" msgstr "Taisnstūris" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Apskatīšana** (tikai skatīt)" - msgid "workspace.assets.duplicate-main" msgstr "Divkāršot galveno" diff --git a/frontend/translations/ml.po b/frontend/translations/ml.po index e24b0cba0..b14a96f5c 100644 --- a/frontend/translations/ml.po +++ b/frontend/translations/ml.po @@ -59,10 +59,6 @@ msgstr "ഇവിടെ ലോഗിൻ ചെയ്യുക" msgid "auth.login-submit" msgstr "ലോഗിൻ" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "നിങ്ങളെ വീണ്ടും കാണാൻ കഴിഞ്ഞതിൽ സന്തോഷം!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "ഗിറ്റ്ഹബ്ബ്" diff --git a/frontend/translations/ms.po b/frontend/translations/ms.po index 862241857..2abe1f136 100644 --- a/frontend/translations/ms.po +++ b/frontend/translations/ms.po @@ -45,10 +45,6 @@ msgstr "Log masuk disini" msgid "auth.login-submit" msgstr "Log masuk" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Gembira dapat berjumpa lagi!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "Github" @@ -1584,16 +1580,6 @@ msgid "modals.unpublish-shared-confirm.accept" msgid_plural "modals.unpublish-shared-confirm.accept" msgstr[0] "Nyahterbit" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.activated.no-files-message" -msgid_plural "modals.unpublish-shared-confirm.activated.no-files-message" -msgstr[0] "Ia tidak diaktifkan dalam mana-mana fail." - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.activated.scd-message" -msgid_plural "modals.unpublish-shared-confirm.activated.scd-message" -msgstr[0] "Perpustakaan ini diaktifkan di sini:" - #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.message" msgid_plural "modals.unpublish-shared-confirm.message" @@ -1864,10 +1850,6 @@ msgstr "Pengurus Produk atau Projek" msgid "questions.more-than-50" msgstr "Lebih daripada 50" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.never-used-a-tool" -msgstr "Saya tidak pernah menggunakan alat reka bentuk sebelum ini" - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.none" msgstr "Tiada" diff --git a/frontend/translations/nl.po b/frontend/translations/nl.po index 396dd4648..209a77791 100644 --- a/frontend/translations/nl.po +++ b/frontend/translations/nl.po @@ -60,10 +60,6 @@ msgstr "Hier inloggen" msgid "auth.login-submit" msgstr "Inloggen" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Goed om je weer te zien!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -2974,9 +2970,6 @@ msgstr "Vergrendelen/ontgrendelen" msgid "shortcuts.toggle-lock-size" msgstr "Proporties vergrendelen" -msgid "shortcuts.toggle-rules" -msgstr "Linialen tonen/verbergen" - msgid "shortcuts.toggle-textpalette" msgstr "Tekstpalet in/uitschakelen" @@ -5165,10 +5158,6 @@ msgstr "Ongeldige gegevens op klembord" msgid "errors.team-feature-mismatch" msgstr "Incompatibele functie '%s' gedetecteerd" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "** Inspectiemodus ** (alleen bekijken)" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.loading" msgstr "Laden…" diff --git a/frontend/translations/pl.po b/frontend/translations/pl.po index 839c34218..369ee2385 100644 --- a/frontend/translations/pl.po +++ b/frontend/translations/pl.po @@ -60,10 +60,6 @@ msgstr "Zaloguj się tutaj" msgid "auth.login-submit" msgstr "Zaloguj się" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Miło Cię znowu widzieć!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -2466,9 +2462,6 @@ msgstr "Zablokuj wybrane" msgid "shortcuts.toggle-lock-size" msgstr "Zablokuj proporcje" -msgid "shortcuts.toggle-rules" -msgstr "Pokaż/ukryj linijki" - msgid "shortcuts.toggle-textpalette" msgstr "Przełącz paletę tekstu" diff --git a/frontend/translations/pt_BR.po b/frontend/translations/pt_BR.po index 9610c9f4f..545d1dce8 100644 --- a/frontend/translations/pt_BR.po +++ b/frontend/translations/pt_BR.po @@ -59,10 +59,6 @@ msgstr "Entrar aqui" msgid "auth.login-submit" msgstr "Entrar" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Bom te ver novamente!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -2457,9 +2453,6 @@ msgstr "Bloquear selecionado" msgid "shortcuts.toggle-lock-size" msgstr "Fixar proporções" -msgid "shortcuts.toggle-rules" -msgstr "Mostrar/ocultar réguas" - msgid "shortcuts.toggle-textpalette" msgstr "Mostrar/Esconder paleta de tipografias" diff --git a/frontend/translations/pt_PT.po b/frontend/translations/pt_PT.po index a37244223..ac938a37a 100644 --- a/frontend/translations/pt_PT.po +++ b/frontend/translations/pt_PT.po @@ -60,10 +60,6 @@ msgstr "Iniciar sessão" msgid "auth.login-submit" msgstr "Iniciar sessão" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Que bom voltar a ver-te!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "Github" @@ -2918,9 +2914,6 @@ msgstr "Bloquear selecionado" msgid "shortcuts.toggle-lock-size" msgstr "Bloquear proporções" -msgid "shortcuts.toggle-rules" -msgstr "Mostrar/ocultar regras" - msgid "shortcuts.toggle-textpalette" msgstr "Alternar paleta de texto" @@ -5184,10 +5177,6 @@ msgstr "Dados inválidos na área de transferência" msgid "errors.team-feature-mismatch" msgstr "Funcionalidade incompatível '%s' detetada" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Modo de inspeção** (Somente leitura)" - msgid "shortcuts.toggle-theme" msgstr "Mudar tema" diff --git a/frontend/translations/ro.po b/frontend/translations/ro.po index 232fc9a6c..6f2a46e48 100644 --- a/frontend/translations/ro.po +++ b/frontend/translations/ro.po @@ -61,10 +61,6 @@ msgstr "Conectează-te" msgid "auth.login-submit" msgstr "Intră în cont" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Mă bucur să te văd din nou!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -2958,9 +2954,6 @@ msgstr "Blocați selecția" msgid "shortcuts.toggle-lock-size" msgstr "Blocați proporțiile" -msgid "shortcuts.toggle-rules" -msgstr "Afișați/ascundeți rigle" - msgid "shortcuts.toggle-textpalette" msgstr "Comutați paleta de text" diff --git a/frontend/translations/ru.po b/frontend/translations/ru.po index 5a68e36df..07b5c6339 100644 --- a/frontend/translations/ru.po +++ b/frontend/translations/ru.po @@ -58,10 +58,6 @@ msgstr "Войти здесь" msgid "auth.login-submit" msgstr "Вход" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Рады видеть Вас снова!" - #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -1979,9 +1975,6 @@ msgstr "Переключить историю" msgid "shortcuts.toggle-layers" msgstr "Переключить слои" -msgid "shortcuts.toggle-rules" -msgstr "Показать/скрыть линейки" - #: src/app/main/ui/dashboard/files.cljs msgid "title.dashboard.files" msgstr "%s - Penpot" diff --git a/frontend/translations/ta.po b/frontend/translations/ta.po index e3ab123eb..088fe8217 100644 --- a/frontend/translations/ta.po +++ b/frontend/translations/ta.po @@ -59,10 +59,6 @@ msgstr "இங்கே உள்நுழைக" msgid "auth.login-submit" msgstr "உள்நுழை" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "உங்களை மீண்டும் சந்திப்பதில் மகிழ்ச்சி!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" diff --git a/frontend/translations/tr.po b/frontend/translations/tr.po index 25ee0d42f..f10e6bb31 100644 --- a/frontend/translations/tr.po +++ b/frontend/translations/tr.po @@ -60,10 +60,6 @@ msgstr "Buradan oturum açın" msgid "auth.login-submit" msgstr "Oturum aç" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Seni tekrar görmek süper!" - #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -2497,9 +2493,6 @@ msgstr "Seçileni kilitle" msgid "shortcuts.toggle-lock-size" msgstr "Oranları kilitle" -msgid "shortcuts.toggle-rules" -msgstr "Cetvelleri göster/gizle" - msgid "shortcuts.toggle-textpalette" msgstr "Metin paletini değiştir" @@ -5139,10 +5132,6 @@ msgstr "Bu kütüphanede henüz varlık yok" msgid "workspace.options.flows.flow" msgstr "Akış" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**İnceleme modu** (Yalnızca görüntüle)" - msgid "workspace.top-bar.read-only.done" msgstr "Bitti" diff --git a/frontend/translations/ukr_UA.po b/frontend/translations/ukr_UA.po index 75c2e4e1c..7840000e3 100644 --- a/frontend/translations/ukr_UA.po +++ b/frontend/translations/ukr_UA.po @@ -36,10 +36,6 @@ msgstr "Ввійдіть тут" msgid "auth.login-submit" msgstr "Вхід" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Раді бачити Вас знову!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" diff --git a/frontend/translations/yo.po b/frontend/translations/yo.po index 7d573ec6f..880119490 100644 --- a/frontend/translations/yo.po +++ b/frontend/translations/yo.po @@ -363,10 +363,6 @@ msgstr "orúkọ lẹ́kùnn-ún-rẹ́rẹ́" msgid "auth.login-submit" msgstr "wọlé" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "ó dára láti rí ẹ lẹ́ẹ̀kan sí i!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "ibùdó gítì" @@ -2428,10 +2424,6 @@ msgstr "Títajà" msgid "questions.more-than-50" msgstr "Ju àádọ́ta lọ" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.never-used-a-tool" -msgstr "N kò tí lo irin iṣẹ́ eto ọnà tẹ́lẹ̀ rí" - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.next" msgstr "Èyí tó kàn" @@ -2904,9 +2896,6 @@ msgstr "Yi ipo idojukọ pada" msgid "shortcuts.toggle-fullscreen" msgstr "Yi kuro ni fulscrin" -msgid "shortcuts.toggle-grid" -msgstr "Fihan / Tọju ilana" - msgid "shortcuts.toggle-layers" msgstr "Yi awon pelebe yii pada" @@ -2916,15 +2905,6 @@ msgstr "Tiipa / Siilẹ" msgid "shortcuts.toggle-lock-size" msgstr "títìipa lápàkàn" -msgid "shortcuts.toggle-rules" -msgstr "Fifihan / Titọju ólórì" - -msgid "shortcuts.toggle-scale-text" -msgstr "Yipada asekale ọrọ" - -msgid "shortcuts.toggle-snap-guide" -msgstr "Pín si awọ́n ítọ̀nisọ́nà" - msgid "shortcuts.toggle-textpalette" msgstr "Yíípàda ọrọ paleti" @@ -3234,10 +3214,6 @@ msgstr "Pa asèkalẹ̀ iwọnbà" msgid "workspace.header.menu.disable-scale-text" msgstr "Pa ọrọ iwọnba" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "Pa yipada si ilana" - msgid "workspace.header.menu.disable-snap-pixel-grid" msgstr "Pa yipada si piseli" @@ -3252,10 +3228,6 @@ msgstr "Tan asèkalẹ̀ iwọnbà" msgid "workspace.header.menu.enable-scale-text" msgstr "Tan iwọnbà ọrọ" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "Yipada si ilana" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-guides" msgstr "Yipada si itọ̀nìsọna" @@ -3263,10 +3235,6 @@ msgstr "Yipada si itọ̀nìsọna" msgid "workspace.header.menu.enable-snap-pixel-grid" msgstr "Tan Yipada si piseli" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-grid" -msgstr "Tọ̀jú ilana" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "Tọ̀jú awọ palẹti" @@ -3309,10 +3277,6 @@ msgstr "Tun ṣe" msgid "workspace.header.menu.select-all" msgstr "Sa gbogbo rẹ" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "ifihan akoj" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Fi awo paleti han" diff --git a/frontend/translations/zh_CN.po b/frontend/translations/zh_CN.po index c7f736a1f..a95108c3b 100644 --- a/frontend/translations/zh_CN.po +++ b/frontend/translations/zh_CN.po @@ -56,10 +56,6 @@ msgstr "在这里登录" msgid "auth.login-submit" msgstr "登录" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "很高兴又见到你!" - #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub登录" @@ -2471,9 +2467,6 @@ msgstr "锁定所选" msgid "shortcuts.toggle-lock-size" msgstr "锁定比例" -msgid "shortcuts.toggle-rules" -msgstr "显示/隐藏规则" - msgid "shortcuts.toggle-textpalette" msgstr "切换文本调色板" @@ -4490,10 +4483,6 @@ msgstr "矩形" msgid "workspace.options.stroke-cap.triangle-arrow-short" msgstr "三角形" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**检查模式**(不可编辑)" - msgid "workspace.top-bar.read-only.done" msgstr "完成" diff --git a/frontend/translations/zh_Hant.po b/frontend/translations/zh_Hant.po index ad1fe9a14..89e0fa1e6 100644 --- a/frontend/translations/zh_Hant.po +++ b/frontend/translations/zh_Hant.po @@ -55,10 +55,6 @@ msgstr "在此登入" msgid "auth.login-submit" msgstr "登入" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "很高興再次見到你!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -1596,9 +1592,6 @@ msgstr "鎖定選擇" msgid "shortcuts.toggle-lock-size" msgstr "鎖定比例" -msgid "shortcuts.toggle-rules" -msgstr "顯示/隱藏尺規" - msgid "shortcuts.ungroup" msgstr "取消群組" -- Gitee From 990714c1daad28d2f4e0b0d9c4f1cf533fa308b2 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:53:06 +0000 Subject: [PATCH 0368/1266] :globe_with_meridians: Add translations for: Spanish. Currently translated at 99.3% (1353 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/ --- frontend/translations/es.po | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/frontend/translations/es.po b/frontend/translations/es.po index 0d2c50800..ecb5c7f77 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-01-25 12:01+0000\n" -"Last-Translator: Yessenia Villarte Vaca \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Spanish \n" "Language: es\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -1028,6 +1028,7 @@ msgstr "Error de conexion, la url no es alcanzable" msgid "errors.webhooks.invalid-uri" msgstr "La URL no pasa la validación." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Hubo un problema en el último envío." @@ -3208,6 +3209,7 @@ msgstr "Mostrar interacciones al hacer click" msgid "viewer.header.sitemap" msgstr "Mapa del sitio" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "El último envío fue correcto." -- Gitee From bb5f5eaba29d4ec72295c811d59c409ae10a597a Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:53:32 +0000 Subject: [PATCH 0369/1266] :globe_with_meridians: Add translations for: French. Currently translated at 96.4% (1313 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/ --- frontend/translations/fr.po | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/frontend/translations/fr.po b/frontend/translations/fr.po index be89108af..9f3061f2c 100644 --- a/frontend/translations/fr.po +++ b/frontend/translations/fr.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-24 15:02+0000\n" -"Last-Translator: Louis Chance \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: French \n" "Language: fr\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -1002,6 +1002,7 @@ msgstr "Erreur de connexion, URL inaccessible" msgid "errors.webhooks.invalid-uri" msgstr "L'URL ne passe pas la validation." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Il y a eu une erreur dans le dernier envoi." @@ -4541,6 +4542,7 @@ msgstr "Montrer en mode spectateur" msgid "workspace.shape.menu.create-multiple-components" msgstr "Créer plusieurs composants" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Le dernier envoi a réussi." -- Gitee From b1e645abe6330dc33565ba200665ee3fefbec20d Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:54:54 +0000 Subject: [PATCH 0370/1266] :globe_with_meridians: Add translations for: Portuguese (Brazil). Currently translated at 85.2% (1161 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/ --- frontend/translations/pt_BR.po | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/frontend/translations/pt_BR.po b/frontend/translations/pt_BR.po index 545d1dce8..2d187bf09 100644 --- a/frontend/translations/pt_BR.po +++ b/frontend/translations/pt_BR.po @@ -1,15 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-04-24 03:54+0000\n" -"Last-Translator: Ally Tiago \n" -"Language-Team: Portuguese (Brazil) " -"\n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" +"Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.18-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -852,6 +852,7 @@ msgstr "Erro de conexão, URL não acessível" msgid "errors.webhooks.invalid-uri" msgstr "A URL não passa na validação." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "O último envio não foi bem-sucedido." @@ -2594,6 +2595,7 @@ msgstr "Mostrar interações ao clicar" msgid "viewer.header.sitemap" msgstr "Mapa do site" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "O último envio foi bem-sucedido." -- Gitee From a7785f3a4707be1381f7b37594aa34592fbe993e Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:52:57 +0000 Subject: [PATCH 0371/1266] :globe_with_meridians: Add translations for: German. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/ --- frontend/translations/de.po | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/frontend/translations/de.po b/frontend/translations/de.po index d691215b2..102037b64 100644 --- a/frontend/translations/de.po +++ b/frontend/translations/de.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-03-22 16:01+0000\n" -"Last-Translator: Stas Haas \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: German \n" "Language: de\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -1003,6 +1003,7 @@ msgstr "Verbindungsfehler, URL ist nicht erreichbar" msgid "errors.webhooks.invalid-uri" msgstr "Die URL erfüllt nicht die Validierungskriterien." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Die letzte Übertragung war nicht erfolgreich." @@ -2949,6 +2950,7 @@ msgstr "Interaktionen beim Klicken anzeigen" msgid "viewer.header.sitemap" msgstr "Sitemap" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Die letzte Übertragung war erfolgreich." -- Gitee From 19639fed2dced2721cb8994cd6eadfd74cc9a860 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:55:01 +0000 Subject: [PATCH 0372/1266] :globe_with_meridians: Add translations for: Romanian. Currently translated at 96.1% (1310 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/ --- frontend/translations/ro.po | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/frontend/translations/ro.po b/frontend/translations/ro.po index 6f2a46e48..9e7ff5f78 100644 --- a/frontend/translations/ro.po +++ b/frontend/translations/ro.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-10-10 10:01+0000\n" -"Last-Translator: AlexTECPlayz \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Romanian \n" "Language: ro\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" -"X-Generator: Weblate 5.1-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -994,6 +994,7 @@ msgstr "Eroare de conexiune, URL-ul nu poate fi accesat" msgid "errors.webhooks.invalid-uri" msgstr "URL-ul nu a trecut validarea." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Ultima livrare nu a avut succes." @@ -3115,6 +3116,7 @@ msgstr "Afişează interacţiunile la click" msgid "viewer.header.sitemap" msgstr "Harta site-ului" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Ultima livrare a fost cu succes." -- Gitee From eef05c2352ad5eef235279e5280b75adde85447e Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:52:21 +0000 Subject: [PATCH 0373/1266] :globe_with_meridians: Add translations for: Arabic. Currently translated at 83.1% (1132 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/ --- frontend/translations/ar.po | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/frontend/translations/ar.po b/frontend/translations/ar.po index 5f866b683..c2b69ab49 100644 --- a/frontend/translations/ar.po +++ b/frontend/translations/ar.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-01-02 16:16+0000\n" -"Last-Translator: Alejandro Alonso \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Arabic \n" "Language: ar\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -855,6 +855,7 @@ msgstr "رمز غير معروف" msgid "errors.webhooks.connection" msgstr "خطأ في الاتصال ، عنوان إلكتروني لا يمكن الوصول إليه" +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "آخر تسليم لم يكن ناجحًا." @@ -914,6 +915,7 @@ msgid "feedback.twitter-subtitle1" msgstr "هنا للمساعدة في استفساراتك التقنية." #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-title" msgstr "رد عنوان تويتر" @@ -2997,6 +2999,7 @@ msgstr "مجموعات" msgid "workspace.shape.menu.create-multiple-components" msgstr "إنشاء عناصر جديدة" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "محاذاة المركز الأفقي" -- Gitee From 609ffae5800561efb6ab01d5949297adca7ab51e Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:54:05 +0000 Subject: [PATCH 0374/1266] :globe_with_meridians: Add translations for: Indonesian. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/ --- frontend/translations/id.po | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/frontend/translations/id.po b/frontend/translations/id.po index c1f452191..e30380c94 100644 --- a/frontend/translations/id.po +++ b/frontend/translations/id.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-08 15:01+0000\n" -"Last-Translator: Linerly \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Indonesian \n" "Language: id\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -982,6 +982,7 @@ msgstr "Kesalahan koneksi, URL tidak dapat diraih" msgid "errors.webhooks.invalid-uri" msgstr "URL tidak melewati validasi." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Pengiriman terakhir tidak berhasil." @@ -3082,6 +3083,7 @@ msgstr "Tampilkan interaksi pada klik" msgid "viewer.header.sitemap" msgstr "Peta Situs" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Pengiriman terakhir berhasil." -- Gitee From 330dddbc31f32381ce33c08110ad9bd2439e4ccd Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:53:57 +0000 Subject: [PATCH 0375/1266] :globe_with_meridians: Add translations for: Hebrew. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/ --- frontend/translations/he.po | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/frontend/translations/he.po b/frontend/translations/he.po index b71e312a8..0f7d42912 100644 --- a/frontend/translations/he.po +++ b/frontend/translations/he.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-17 14:02+0000\n" -"Last-Translator: Yaron Shahrabani \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Hebrew \n" "Language: he\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " "n % 10 == 0) ? 2 : 3));\n" -"X-Generator: Weblate 5.4\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -951,6 +951,7 @@ msgstr "שגיאת תקשורת, הכתובת אינה נגישה" msgid "errors.webhooks.invalid-uri" msgstr "הכתובת לא מעבירה תיקוף." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "ההעברה האחרונה לא הצליחה." @@ -1005,6 +1006,7 @@ msgid "feedback.title" msgstr "דוא״ל" #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-go-to" msgstr "מעבר לטוויטר" @@ -1013,6 +1015,7 @@ msgid "feedback.twitter-subtitle1" msgstr "כאן כדי לסייע בסוגיות טכניות." #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-title" msgstr "חשבון תמיכה בטוויטר" @@ -2974,6 +2977,7 @@ msgstr "הצגת פעילויות בקליק" msgid "viewer.header.sitemap" msgstr "מפת אתר" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "ההעברה האחרונה הצליחה." -- Gitee From 4b5d75bef00dbc33b444b1df107f1071dde1039b Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:53:20 +0000 Subject: [PATCH 0376/1266] :globe_with_meridians: Add translations for: Persian. Currently translated at 50.0% (681 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/ --- frontend/translations/fa.po | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/frontend/translations/fa.po b/frontend/translations/fa.po index 17bd3e5d7..ba5f00c96 100644 --- a/frontend/translations/fa.po +++ b/frontend/translations/fa.po @@ -1,15 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-01-24 14:27+0000\n" -"Last-Translator: Ahmad HosseinBor <123hozeifeh@gmail.com>\n" -"Language-Team: Persian " -"\n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" +"Language-Team: Persian \n" "Language: fa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.16-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -856,6 +856,7 @@ msgid "feedback.title" msgstr "ایمیل" #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-go-to" msgstr "به توییتر بروید" -- Gitee From b87b1120cadd00df9b8eae9333664731a0d19372 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:54:51 +0000 Subject: [PATCH 0377/1266] :globe_with_meridians: Add translations for: Polish. Currently translated at 85.3% (1162 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pl/ --- frontend/translations/pl.po | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/frontend/translations/pl.po b/frontend/translations/pl.po index 369ee2385..859eb8d2c 100644 --- a/frontend/translations/pl.po +++ b/frontend/translations/pl.po @@ -1,16 +1,16 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-04-21 21:52+0000\n" -"Last-Translator: Radek Sawicki \n" -"Language-Team: Polish " -"\n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" +"Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " -"|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.18-dev\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -854,6 +854,7 @@ msgstr "Błąd połączenia, adres URL nieosiągalny" msgid "errors.webhooks.invalid-uri" msgstr "Adres URL nie przechodzi weryfikacji." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Ostatnia wysyłka nie powiodła się." @@ -2603,6 +2604,7 @@ msgstr "Pokaż interakcje po kliknięciu" msgid "viewer.header.sitemap" msgstr "Mapa strony" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Ostatnia wysyłka przebiegła pomyślnie." -- Gitee From e97162bdae17f464a25d1e8e94e171681a84e782 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:53:16 +0000 Subject: [PATCH 0378/1266] :globe_with_meridians: Add translations for: Basque. Currently translated at 87.5% (1192 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/eu/ --- frontend/translations/eu.po | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/frontend/translations/eu.po b/frontend/translations/eu.po index e1c3a70fd..14019c8a6 100644 --- a/frontend/translations/eu.po +++ b/frontend/translations/eu.po @@ -1,15 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-07-01 12:52+0000\n" -"Last-Translator: Mikel Larreategi \n" -"Language-Team: Basque " -"\n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" +"Language-Team: Basque \n" "Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.0-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -889,6 +889,7 @@ msgstr "Konexio errorea, URLa ezin da ireki" msgid "errors.webhooks.invalid-uri" msgstr "URLak ez du balidazioa gainditu." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Errore bat gertatu da azken bidalketan." @@ -2717,6 +2718,7 @@ msgstr "Erakutsi interakzioak klik egitean" msgid "viewer.header.sitemap" msgstr "Webgunearen mapa" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Azken bidalketa ondo joan da." -- Gitee From ddd0e10c8474ca06b4f5dc3cc6daa709092f6ff4 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:52:50 +0000 Subject: [PATCH 0379/1266] :globe_with_meridians: Add translations for: Czech. Currently translated at 98.6% (1344 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/cs/ --- frontend/translations/cs.po | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/frontend/translations/cs.po b/frontend/translations/cs.po index 224cbade2..ade2d0b5d 100644 --- a/frontend/translations/cs.po +++ b/frontend/translations/cs.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-01-23 15:02+0000\n" -"Last-Translator: \"Amerey.eu\" \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Czech \n" "Language: cs\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -887,6 +887,7 @@ msgstr "Chyba připojení, adresa URL není dostupná" msgid "errors.webhooks.invalid-uri" msgstr "Adresa URL neprošla ověřením." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Poslední dodávka nebyla úspěšná." @@ -2718,6 +2719,7 @@ msgstr "Zobrazit interakce po kliknutí" msgid "viewer.header.sitemap" msgstr "Mapa stránek" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Poslední doručení proběhlo úspěšně." -- Gitee From 8f9ba827d803cc5bf62a944c5ee02ae447fe706c Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:54:58 +0000 Subject: [PATCH 0380/1266] :globe_with_meridians: Add translations for: Portuguese (Portugal). Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/ --- frontend/translations/pt_PT.po | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/frontend/translations/pt_PT.po b/frontend/translations/pt_PT.po index ac938a37a..c1dd5633c 100644 --- a/frontend/translations/pt_PT.po +++ b/frontend/translations/pt_PT.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-20 23:07+0000\n" -"Last-Translator: TheScientistPT \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Portuguese (Portugal) \n" "Language: pt_PT\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -970,6 +970,7 @@ msgstr "Erro de conexão, não foi possível alcançar o URL" msgid "errors.webhooks.invalid-uri" msgstr "O URL não passou na validação." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Último envio sem sucesso." @@ -3075,6 +3076,7 @@ msgstr "Mostrar interações com click" msgid "viewer.header.sitemap" msgstr "Mapa do site" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Último envio com sucesso." -- Gitee From 11cca08ec1e94b6c0e70fdd3277a754a3b58b5da Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:54:28 +0000 Subject: [PATCH 0381/1266] :globe_with_meridians: Add translations for: Latvian. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/ --- frontend/translations/lv.po | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/frontend/translations/lv.po b/frontend/translations/lv.po index 7dee53ce3..ba3bb167f 100644 --- a/frontend/translations/lv.po +++ b/frontend/translations/lv.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-19 08:03+0000\n" -"Last-Translator: Edgars Andersons \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Latvian \n" "Language: lv\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= " "19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -989,6 +989,7 @@ msgstr "Savienojuma kļūda, URL nav sasniedzams" msgid "errors.webhooks.invalid-uri" msgstr "URL neiztur pārbaudi." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Pēdējā piegāde nebija veiksmīga." @@ -3068,6 +3069,7 @@ msgstr "Rādīt mijiedarbības pēc klikšķa" msgid "viewer.header.sitemap" msgstr "Vietnes karte" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Pēdējā piegāde bija veiksmīga." -- Gitee From cd06bb13ba7984565a533aecc9df6169d4d63514 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:54:47 +0000 Subject: [PATCH 0382/1266] :globe_with_meridians: Add translations for: Dutch. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/ --- frontend/translations/nl.po | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/frontend/translations/nl.po b/frontend/translations/nl.po index 209a77791..bfbd1bdab 100644 --- a/frontend/translations/nl.po +++ b/frontend/translations/nl.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-12 19:02+0000\n" -"Last-Translator: Stephan Paternotte \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Dutch \n" "Language: nl\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -1012,6 +1012,7 @@ msgstr "Verbindingsfout, URL niet bereikbaar" msgid "errors.webhooks.invalid-uri" msgstr "URL komt niet door de validatie." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Laatste levering is niet gelukt." @@ -1068,6 +1069,7 @@ msgid "feedback.title" msgstr "E-mail" #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-go-to" msgstr "Ga naar X" @@ -1076,6 +1078,7 @@ msgid "feedback.twitter-subtitle1" msgstr "Hier om te helpen met je technische vragen." #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-title" msgstr "X-ondersteuningsaccount" @@ -3131,6 +3134,7 @@ msgstr "Interacties tonen bij aanklikken" msgid "viewer.header.sitemap" msgstr "Sitemap" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "De laatste levering was succesvol." -- Gitee From 3068721fc3ba1d1d63f4dc0936cd00d6ff5725f6 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:53:40 +0000 Subject: [PATCH 0383/1266] :globe_with_meridians: Add translations for: Hausa. Currently translated at 96.1% (1309 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ha/ --- frontend/translations/ha.po | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/frontend/translations/ha.po b/frontend/translations/ha.po index c713efc84..502e33c68 100644 --- a/frontend/translations/ha.po +++ b/frontend/translations/ha.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-01-02 16:16+0000\n" -"Last-Translator: Alejandro Alonso \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Hausa \n" "Language: ha\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" msgid "shortcut-subsection.navigation-dashboard" msgstr "shawagi" @@ -659,6 +659,7 @@ msgstr "sake sunan kungiyar" msgid "auth.create-demo-profile" msgstr "ka na son gwadawa ne kawai?" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Sakon karshe ya isa." @@ -2387,6 +2388,7 @@ msgid "workspace.options.shadow-options.offsetx" msgstr "X" #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-go-to" msgstr "je ka tiwita" @@ -2933,6 +2935,7 @@ msgid "workspace.undo.entry.single.media" msgstr "kadarar zanen hotuna" #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-title" msgstr "wurin karvar qorafin tiwita" @@ -3735,6 +3738,7 @@ msgstr "fadi" msgid "shortcuts.letter-spacing-dec" msgstr "rage filin harafin" +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "saqon qarshe bai je ba." -- Gitee From 8cfc669d9d324141d429a04646b10a901e362501 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:54:35 +0000 Subject: [PATCH 0384/1266] :globe_with_meridians: Add translations for: Malay. Currently translated at 52.0% (709 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ms/ --- frontend/translations/ms.po | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/frontend/translations/ms.po b/frontend/translations/ms.po index 2abe1f136..44a00748f 100644 --- a/frontend/translations/ms.po +++ b/frontend/translations/ms.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-10 15:02+0000\n" -"Last-Translator: Revenant \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Malay \n" "Language: ms\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.create-demo-account" @@ -704,6 +704,7 @@ msgstr "Ralat sambungan, URL tidak dapat dicapai" msgid "errors.webhooks.invalid-uri" msgstr "URL tidak lulus pengesahan." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Penghantaran terakhir tidak berjaya." @@ -749,6 +750,7 @@ msgid "feedback.title" msgstr "E-mel" #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-go-to" msgstr "Pergi ke Twitter" @@ -757,6 +759,7 @@ msgid "feedback.twitter-subtitle1" msgstr "Kami di sini untuk membantu dengan pertanyaan teknikal anda." #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-title" msgstr "Akaun sokongan Twitter" -- Gitee From aa56c293ca9df520ca504ed699300a7a457d59d6 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:54:10 +0000 Subject: [PATCH 0385/1266] :globe_with_meridians: Add translations for: Igbo. Currently translated at 40.0% (546 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ig/ --- frontend/translations/ig.po | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/frontend/translations/ig.po b/frontend/translations/ig.po index a3bc19749..2bbc09546 100644 --- a/frontend/translations/ig.po +++ b/frontend/translations/ig.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-14 08:02+0000\n" -"Last-Translator: Alejandro Alonso \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Igbo " "\n" "Language: ig\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" @@ -1061,6 +1061,7 @@ msgid "feedback.title" msgstr "Ozi- n" #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-go-to" msgstr "Gaa na Twita" -- Gitee From d3f8abb9aaaa2d4d0b42d615d6b1391a83917967 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Fri, 9 Feb 2024 16:33:44 +0000 Subject: [PATCH 0386/1266] :sparkles: Update translations --- frontend/translations/af.po | 551 ++- frontend/translations/ar.po | 2255 +++++----- frontend/translations/cs.po | 1173 ++--- frontend/translations/de.po | 884 ++-- frontend/translations/en.po | 411 +- frontend/translations/es.po | 389 +- frontend/translations/es_419.po | 343 +- frontend/translations/fr.po | 1285 +++--- frontend/translations/ha.po | 7111 +++++++++++++++---------------- frontend/translations/he.po | 462 +- frontend/translations/hr.po | 1 - frontend/translations/id.po | 249 +- frontend/translations/ig.po | 2098 +++++++++ frontend/translations/lv.po | 566 +-- frontend/translations/ms.po | 2476 ++++++++++- frontend/translations/nl.po | 420 +- frontend/translations/pt_PT.po | 424 +- frontend/translations/ro.po | 88 +- frontend/translations/ru.po | 50 +- frontend/translations/tr.po | 1451 ++++--- frontend/translations/yo.po | 4646 ++++++++++++++++++++ frontend/translations/zh_CN.po | 1069 +++-- 22 files changed, 19056 insertions(+), 9346 deletions(-) create mode 100644 frontend/translations/ig.po create mode 100644 frontend/translations/yo.po diff --git a/frontend/translations/af.po b/frontend/translations/af.po index f037855e1..14d5e8519 100644 --- a/frontend/translations/af.po +++ b/frontend/translations/af.po @@ -2,147 +2,78 @@ msgid "" msgstr "" "PO-Revision-Date: 2023-10-13 18:01+0000\n" "Last-Translator: Hugo Vermaak \n" -"Language-Team: Afrikaans \n" +"Language-Team: Afrikaans " +"\n" "Language: af\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.1-dev\n" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "30 dae" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.add-shared" -msgstr "Voeg by as Gedeelde Biblioteek" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-not-expire" -msgstr "Die token het nie 'n verval datum nie" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-gitlab-submit" -msgstr "GitLab" - -msgid "common.share-link.placeholder" -msgstr "Deelbare skakel sal hier verskyn" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-title" -msgstr "Wagwoord vergeet?" - -msgid "common.share-link.current-tag" -msgstr "(huidige)" - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.invalid-token-error" -msgstr "Die hersteltoken is ongeldig." - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Wonderlik om jou weer te sien!" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "Genereer nuwe token" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "auth.notifications.team-invitation-accepted" -msgstr "Het suksesvol by die span aangesluit" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.title" -msgstr "Span saam!" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "180 dae" - -msgid "dashboard.export-frames" -msgstr "Voer borde as PDF uit" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-profile" -msgstr "Wil jy dit net probeer?" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-submit" -msgstr "Herstel Wagwoord" - -#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs -msgid "dashboard.copy-suffix" -msgstr "(kopieer)" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "Die naam word vereis" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.create-new-team" -msgstr "Skep 'n nuwe span" - -msgid "common.share-link.destroy-link" -msgstr "Vernietig skakel" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.copied-success" -msgstr "Token gekopieer" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.info" -msgstr "Gaan stap deur Penpot en leer sy hoofkenmerke ken." - #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" msgstr "Reeds 'n rekening?" -msgid "common.share-link.view-all" -msgstr "Kies Alles" - #: src/app/main/ui/auth/register.cljs msgid "auth.check-your-email" msgstr "" "Gaan jou e-pos na en klik op die skakel om te verifieer en Penpot te begin " "gebruik." -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "...handelsmerk, illustrasies, bemarkingsstukke, ens." +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.confirm-password" +msgstr "Bevestig wagwoord" -msgid "auth.terms-of-service" -msgstr "Diensbepalings" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-account" +msgstr "Skep demo rekening" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-profile" +msgstr "Wil jy dit net probeer?" #: src/app/main/ui/auth/register.cljs msgid "auth.demo-warning" msgstr "" -"Dit is 'n DEMO-diens, MOENIE vir werklike werk gebruik nie, die projekte sal " -"periodiek uitgevee word." +"Dit is 'n DEMO-diens, MOENIE vir werklike werk gebruik nie, die projekte " +"sal periodiek uitgevee word." -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-90-days" -msgstr "90 dae" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.email" +msgstr "E-pos" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.forgot-password" +msgstr "Wagwoord vergeet?" #: src/app/main/ui/auth/register.cljs -msgid "auth.register-title" -msgstr "Skep 'n rekening" +msgid "auth.fullname" +msgstr "Volle naam" -#: src/app/main/ui/export.cljs -msgid "dashboard.export-frames.title" -msgstr "Voer as PDF uit" +#: src/app/main/ui/auth/register.cljs +msgid "auth.login-here" +msgstr "Meld hier aan" -#: src/app/main/ui/auth.cljs -msgid "auth.sidebar-tagline" -msgstr "Die oopbron-oplossing vir ontwerp en prototipering." +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-submit" +msgstr "Meld aan" -msgid "common.share-link.get-link" -msgstr "Kry skakel" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-title" +msgstr "Wonderlik om jou weer te sien!" #: src/app/main/ui/auth/login.cljs -msgid "auth.register" -msgstr "Nog nie 'n rekening nie?" +msgid "auth.login-with-github-submit" +msgstr "GitHub" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-gitlab-submit" +msgstr "GitLab" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-google-submit" +msgstr "Google" #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-ldap-submit" @@ -152,162 +83,177 @@ msgstr "LDAP" msgid "auth.login-with-oidc-submit" msgstr "OpenID" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "Het verval op %s" +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "Die naam moet 'n ander karakter as spasie bevat." -msgid "dashboard.export-multi" -msgstr "Voer %s Penpot lêers uit" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "Die naam moet hoogstens 250 karakters bevat." -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-not-empty" -msgstr "Wagwoord moet 'n ander karakter as spasie bevat." +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.new-password" +msgstr "Tik 'n nuwe wagwoord in" -msgid "common.unpublish" -msgstr "Depubliseer" +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.invalid-token-error" +msgstr "Die hersteltoken is ongeldig." -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-60-days" -msgstr "60 dae" +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.password-changed-successfully" +msgstr "Wagwoord suksesvol verander" -msgid "common.share-link.confirm-deletion-link-description" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.profile-not-verified" msgstr "" -"Is jy seker jy wil hierdie skakel verwyder? As jy dit doen, is dit nie meer " -"vir enigiemand beskikbaar nie" +"Profiel is nie geverifieer nie, verifieer asseblief profiel voordat jy " +"voortgaan." -msgid "dashboard.download-binary-file" -msgstr "Laai Penpot-lêer (.penpot) af" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.recovery-token-sent" +msgstr "Wagwoordherwinningskakel na jou inkassie gestuur." -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.confirm-password" -msgstr "Bevestig wagwoord" +#: src/app/main/ui/auth/verify_token.cljs +msgid "auth.notifications.team-invitation-accepted" +msgstr "Het suksesvol by die span aangesluit" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.password" +msgstr "Wagwoord" #: src/app/main/ui/auth/register.cljs -msgid "auth.fullname" -msgstr "Volle naam" +msgid "auth.password-length-hint" +msgstr "Ten minste 8 karakters" -msgid "common.share-link.permissions-hint" -msgstr "Enigiemand met skakel sal toegang hê" +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "Wagwoord moet 'n ander karakter as spasie bevat." -msgid "common.share-link.permissions-can-comment" -msgstr "Kan kommentaar lewer" +msgid "auth.privacy-policy" +msgstr "Privaatheidsbeleid" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-expire" -msgstr "Die token sal verval op %s" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-submit" +msgstr "Herstel Wagwoord" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.management" -msgstr "Spanbestuur" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-subtitle" +msgstr "Ons sal vir jou 'n e-pos stuur met instruksies" -msgid "dashboard.download-standard-file" -msgstr "Laai standaardlêer af (.svg + .json)" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-title" +msgstr "Wagwoord vergeet?" -msgid "common.share-link.page-shared" -msgid_plural "common.share-link.page-shared" -msgstr[0] "bladsy gedeel" -msgstr[1] "%s bladsye gedeel" +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.recovery-submit" +msgstr "Verander jou wagwoord" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.register" +msgstr "Nog nie 'n rekening nie?" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.register-submit" +msgstr "Skep 'n rekening" #: src/app/main/ui/auth/register.cljs msgid "auth.register-subtitle" msgstr "Dit is gratis, dit is oopbron" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-submit" -msgstr "Meld aan" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.default-team-name" -msgstr "Jou Penpot" +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-title" +msgstr "Skep 'n rekening" -msgid "common.share-link.permissions-can-inspect" -msgstr "Kan kode inspekteer" +#: src/app/main/ui/auth.cljs +msgid "auth.sidebar-tagline" +msgstr "Die oopbron-oplossing vir ontwerp en prototipering." -msgid "common.share-link.team-members" -msgstr "Slegs spanlede" +msgid "auth.terms-of-service" +msgstr "Diensbepalings" #: src/app/main/ui/auth/register.cljs msgid "auth.terms-privacy-agreement" msgstr "" "Wanneer jy 'n nuwe rekening skep, stem jy in tot ons diensbepalings en " -"privaatheidsbeleid." - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.new-password" -msgstr "Tik 'n nuwe wagwoord in" - -msgid "common.share-link.title" -msgstr "Deel prototipes" - -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.duplicate" -msgstr "Dupliseer" +"privaatheidsbeleid." #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "Ons het 'n verifikasie-e-pos aan gestuur" -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.profile-not-verified" +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...handelsmerk, illustrasies, bemarkingsstukke, ens." + +msgid "common.publish" +msgstr "Publiseer" + +msgid "common.share-link.all-users" +msgstr "Alle Penpot-gebruikers" + +msgid "common.share-link.confirm-deletion-link-description" msgstr "" -"Profiel is nie geverifieer nie, verifieer asseblief profiel voordat jy " -"voortgaan." +"Is jy seker jy wil hierdie skakel verwyder? As jy dit doen, is dit nie meer " +"vir enigiemand beskikbaar nie" -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-subtitle" -msgstr "Ons sal vir jou 'n e-pos stuur met instruksies" +msgid "common.share-link.current-tag" +msgstr "(huidige)" -#: src/app/main/ui/auth/login.cljs -msgid "auth.forgot-password" -msgstr "Wagwoord vergeet?" +msgid "common.share-link.destroy-link" +msgstr "Vernietig skakel" -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.recovery-token-sent" -msgstr "Wagwoordherwinningskakel na jou inkassie gestuur." +msgid "common.share-link.get-link" +msgstr "Kry skakel" -msgid "common.publish" -msgstr "Publiseer" +msgid "common.share-link.link-copied-success" +msgstr "Skakel suksesvol gekopieer" -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.recovery-submit" -msgstr "Verander jou wagwoord" +msgid "common.share-link.manage-ops" +msgstr "Bestuur toestemmings" -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.change-email" -msgstr "Verander e-pos" +msgid "common.share-link.page-shared" +msgid_plural "common.share-link.page-shared" +msgstr[0] "bladsy gedeel" +msgstr[1] "%s bladsye gedeel" -msgid "auth.privacy-policy" -msgstr "Privaatheidsbeleid" +msgid "common.share-link.permissions-can-comment" +msgstr "Kan kommentaar lewer" -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.password-changed-successfully" -msgstr "Wagwoord suksesvol verander" +msgid "common.share-link.permissions-can-inspect" +msgstr "Kan kode inspekteer" -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "Die naam moet 'n ander karakter as spasie bevat." +msgid "common.share-link.permissions-hint" +msgstr "Enigiemand met skakel sal toegang hê" msgid "common.share-link.permissions-pages" msgstr "Bladsye gedeel" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-account" -msgstr "Skep demo rekening" +msgid "common.share-link.placeholder" +msgstr "Deelbare skakel sal hier verskyn" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.title" -msgstr "Koppelvlak Deurloop" +msgid "common.share-link.team-members" +msgstr "Slegs spanlede" -msgid "common.share-link.manage-ops" -msgstr "Bestuur toestemmings" +msgid "common.share-link.title" +msgstr "Deel prototipes" + +msgid "common.share-link.view-all" +msgstr "Kies Alles" + +msgid "common.unpublish" +msgstr "Depubliseer" #: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.start" -msgstr "Begin die tutoriaal" +msgid "dasboard.team-hero.management" +msgstr "Spanbestuur" -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-length-hint" -msgstr "Ten minste 8 karakters" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.text" +msgstr "Penpot is bedoel vir spanne. Nooi lede om saam te werk aan projekte en lêers" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.title" +msgstr "Span saam!" #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.tutorial-hero.info" @@ -315,99 +261,152 @@ msgstr "" "Leer die basiese beginsels by Penpot terwyl jy pret het met hierdie " "praktiese tutoriaal." -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.no-access-tokens" -msgstr "Jy het tot dusver geen tokens nie." +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.start" +msgstr "Begin die tutoriaal" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"Persoonlike toegangtokens funksioneer soos 'n alternatief vir ons aanmeld-/" -"wagwoord-verifikasiestelsel en kan gebruik word om 'n toepassing toe te laat " -"om toegang tot die interne Penpot API te verkry" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.info" +msgstr "Gaan stap deur Penpot en leer sy hoofkenmerke ken." #: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.text" -msgstr "" -"Penpot is bedoel vir spanne. Nooi lede om saam te werk aan projekte en lêers" +msgid "dasboard.walkthrough-hero.start" +msgstr "Begin die toer" -msgid "common.share-link.all-users" -msgstr "Alle Penpot-gebruikers" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.title" +msgstr "Koppelvlak Deurloop" #: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "Persoonlike toegangstokens" +msgid "dashboard.access-tokens.copied-success" +msgstr "Token gekopieer" #: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expires-on" -msgstr "Verval op %s" +msgid "dashboard.access-tokens.create" +msgstr "Genereer nuwe token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "Toegangstoken is suksesvol geskep." #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.empty.add-one" msgstr "Druk die knoppie \"Genereer nuwe token\" om een te genereer." -#: src/app/main/ui/dashboard/grid.cljs -#, markdown -msgid "dashboard.empty-placeholder-drafts" -msgstr "" -"Lêers wat by biblioteke gevoeg is, sal hier verskyn. Probeer om jou lêers te " -"deel of voeg by vanaf ons [Biblioteke en sjablone](https://penpot.app/" -"libraries-templates.html)." +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "Jy het tot dusver geen tokens nie." -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-github-submit" -msgstr "GitHub" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "Die naam word vereis" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-google-submit" -msgstr "Google" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "180 dae" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.delete-team" -msgstr "Verwyder span" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "30 dae" #: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "Toegangstoken is suksesvol geskep." +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "60 dae" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "90 dae" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.expiration-never" msgstr "Nooit" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.password" -msgstr "Wagwoord" - -msgid "common.share-link.link-copied-success" -msgstr "Skakel suksesvol gekopieer" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.email" -msgstr "E-pos" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "Het verval op %s" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.register-submit" -msgstr "Skep 'n rekening" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "Verval op %s" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.no-expiration" msgstr "Geen verval datum nie" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "Die naam moet hoogstens 250 karakters bevat." +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "Persoonlike toegangstokens" -msgid "dashboard.export-binary-multi" -msgstr "Laai %s Penpot lêers (.penpot) af" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"Persoonlike toegangtokens funksioneer soos 'n alternatief vir ons " +"aanmeld-/wagwoord-verifikasiestelsel en kan gebruik word om 'n toepassing " +"toe te laat om toegang tot die interne Penpot API te verkry" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.start" -msgstr "Begin die toer" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "Die token sal verval op %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "Die token het nie 'n verval datum nie" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.add-shared" +msgstr "Voeg by as Gedeelde Biblioteek" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.change-email" +msgstr "Verander e-pos" + +#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs +msgid "dashboard.copy-suffix" +msgstr "(kopieer)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.create-new-team" +msgstr "Skep 'n nuwe span" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.default-team-name" +msgstr "Jou Penpot" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.delete-team" +msgstr "Verwyder span" + +msgid "dashboard.download-binary-file" +msgstr "Laai Penpot-lêer (.penpot) af" + +msgid "dashboard.download-standard-file" +msgstr "Laai standaardlêer af (.svg + .json)" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate" +msgstr "Dupliseer" #: src/app/main/ui/dashboard/file_menu.cljs msgid "dashboard.duplicate-multi" msgstr "Dupliseer %s lêers" -#: src/app/main/ui/auth/register.cljs -msgid "auth.login-here" -msgstr "Meld hier aan" +#: src/app/main/ui/dashboard/grid.cljs +#, markdown +msgid "dashboard.empty-placeholder-drafts" +msgstr "" +"Lêers wat by biblioteke gevoeg is, sal hier verskyn. Probeer om jou lêers " +"te deel of voeg by vanaf ons [Biblioteke en " +"sjablone](https://penpot.app/libraries-templates.html)." + +msgid "dashboard.export-binary-multi" +msgstr "Laai %s Penpot lêers (.penpot) af" + +msgid "dashboard.export-frames" +msgstr "Voer borde as PDF uit" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-frames.title" +msgstr "Voer as PDF uit" + +msgid "dashboard.export-multi" +msgstr "Voer %s Penpot lêers uit" diff --git a/frontend/translations/ar.po b/frontend/translations/ar.po index 9bc152ac5..400b28221 100644 --- a/frontend/translations/ar.po +++ b/frontend/translations/ar.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-01-02 16:16+0000\n" "Last-Translator: Alejandro Alonso \n" -"Language-Team: Arabic \n" +"Language-Team: Arabic " +"\n" "Language: ar\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -157,8 +157,7 @@ msgstr "شروط الخدمة" #: src/app/main/ui/auth/register.cljs msgid "auth.terms-privacy-agreement" -msgstr "" -"عند إنشاء حساب جديد ، فإنك توافق على شروط الخدمة وسياسة الخصوصية الخاصة بنا." +msgstr "عند إنشاء حساب جديد ، فإنك توافق على شروط الخدمة وسياسة الخصوصية الخاصة بنا." #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" @@ -2258,6 +2257,58 @@ msgstr "أداة انتقاء اللون" msgid "shortcuts.open-dashboard" msgstr "إذهب إلى لوحة المعلومات" +msgid "shortcuts.toggle-layers" +msgstr "تبديل الطبقات" + +msgid "shortcuts.toggle-layout-flex" +msgstr "أضف\\أزل ثني التخطيط" + +msgid "shortcuts.toggle-lock" +msgstr "قفل\\فتح" + +msgid "shortcuts.toggle-lock-size" +msgstr "قفل النسب" + +msgid "shortcuts.toggle-rules" +msgstr "إظهار\\إخفاء المسطرة" + +msgid "shortcuts.toggle-textpalette" +msgstr "تبديل لوحة النص" + +msgid "shortcuts.toggle-visibility" +msgstr "أظهر\\أخف" + +msgid "shortcuts.toggle-zoom-style" +msgstr "تبديل أسلوب التكبير" + +msgid "shortcuts.underline" +msgstr "الخط التحتي" + +msgid "shortcuts.undo" +msgstr "الغاء" + +msgid "shortcuts.ungroup" +msgstr "فك التجميع" + +msgid "shortcuts.unmask" +msgstr "كشف القناع" + +msgid "shortcuts.v-distribute" +msgstr "النشر عموديا" + +msgid "shortcuts.zoom-lense-decrease" +msgstr "تنقيص عدسة التكبير" + +msgid "shortcuts.zoom-lense-increase" +msgstr "زيادة عدسة التكبير" + +msgid "shortcuts.zoom-selected" +msgstr "كبر المحدد" + +#: src/app/main/ui/dashboard/team.cljs +msgid "team.webhooks.max-length" +msgstr "يجب الا يزيد اسم الويبهوك على 2048 حرفا" + #: src/app/main/ui/dashboard/files.cljs msgid "title.dashboard.files" msgstr "%s - Penpotعنوان ملفات لوحة القيادة" @@ -2286,6 +2337,10 @@ msgstr "المكاتب المقسمة - %s - Penpot" msgid "title.default" msgstr "Penpot - صمم حرية الفرق" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "رموز الوصول للحساب" + #: src/app/main/ui/settings/feedback.cljs msgid "title.settings.feedback" msgstr "جواب الرد - Penpot" @@ -2302,6 +2357,10 @@ msgstr "كلمة المرور - Penpot" msgid "title.settings.profile" msgstr "واجهة الحساب - Penpot" +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-invitations" +msgstr "الدعوات - %s - Penpot" + #: src/app/main/ui/dashboard/team.cljs msgid "title.team-members" msgstr "أعضاء الفريق - %s - Penpot" @@ -2310,6 +2369,9 @@ msgstr "أعضاء الفريق - %s - Penpot" msgid "title.team-settings" msgstr "إعدادات - %s - Penpot" +msgid "title.team-webhooks" +msgstr "خطافات الويب - %s - Penpot" + #: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs msgid "title.viewer" msgstr "%s -أسلوب العرض - Penpot" @@ -2318,6 +2380,15 @@ msgstr "%s -أسلوب العرض - Penpot" msgid "title.workspace" msgstr "%s -مساحة العمل Penpot" +msgid "viewer.breaking-change.description" +msgstr "" +"وصف كسر التغييرThis shareable link is no longer valid. Create a new one or " +"ask the owner for a new one.هذا الرابط القابل للمشاركة لم يعد صالحا.صمم " +"جديدا أو اسأل مالكه للجديد" + +msgid "viewer.breaking-change.message" +msgstr "آسف" + #: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs msgid "viewer.empty-state" msgstr "No boards found on the page." @@ -2326,6 +2397,9 @@ msgstr "No boards found on the page." msgid "viewer.frame-not-found" msgstr "لم يعثر على البورد ." +msgid "viewer.header.comments-section" +msgstr "التعليقات (%s)" + #: src/app/main/ui/viewer/header.cljs msgid "viewer.header.dont-show-interactions" msgstr "لا تطهر التفاعلات" @@ -2334,10 +2408,16 @@ msgstr "لا تطهر التفاعلات" msgid "viewer.header.fullscreen" msgstr "تكبير الشاشة" +msgid "viewer.header.inspect-section" +msgstr "التفحص (%s)" + #: src/app/main/ui/viewer/header.cljs msgid "viewer.header.interactions" msgstr "التفاعلات" +msgid "viewer.header.interactions-section" +msgstr "التفاعلات (%s)" + #: src/app/main/ui/viewer/header.cljs msgid "viewer.header.share.copy-link" msgstr "نسخ الرابط" @@ -2354,6 +2434,9 @@ msgstr "أطهر التفاعلات بالنقر" msgid "viewer.header.sitemap" msgstr "خريطة الموقع" +msgid "webhooks.last-delivery.success" +msgstr "محاذاة المركز الأفقي" + #: src/app/main/ui/workspace/sidebar/align.cljs msgid "workspace.align.hcenter" msgstr "محاذاة المركز الأفقي (%s)" @@ -2423,6 +2506,9 @@ msgstr "امسح" msgid "workspace.assets.duplicate" msgstr "انسخ" +msgid "workspace.assets.duplicate-main" +msgstr "انسخ الأصل" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.edit" @@ -2445,10 +2531,16 @@ msgstr "اسم المجموعة" msgid "workspace.assets.libraries" msgstr "المكتبات" +msgid "workspace.assets.local-library" +msgstr "المكتبة المحلية" + #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.not-found" msgstr "الأصل غير موجود" +msgid "workspace.assets.open-library" +msgstr "افتح ملف المكتب" + #: src/app/main/ui/workspace/sidebar/sitemap.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs @@ -2473,6 +2565,10 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "مكتبة مشتركة" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" @@ -2508,6 +2604,9 @@ msgstr "طول الخط" msgid "workspace.assets.typography.sample" msgstr "أسلوب خط النص" +msgid "workspace.assets.typography.text-styles" +msgstr "أسلوب خط النص" + #: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs msgid "workspace.assets.typography.text-transform" msgstr "تحويل النص" @@ -2516,6 +2615,18 @@ msgstr "تحويل النص" msgid "workspace.assets.ungroup" msgstr "فك التجميع" +msgid "workspace.focus.focus-mode" +msgstr "وضع التركيز" + +msgid "workspace.focus.focus-off" +msgstr "تعطيل التركيز" + +msgid "workspace.focus.focus-on" +msgstr "تشغيل التركيز" + +msgid "workspace.focus.selection" +msgstr "تحديد" + #: src/app/main/data/workspace/libraries.cljs, #: src/app/main/ui/components/color_bullet.cljs msgid "workspace.gradients.linear" @@ -2530,38 +2641,110 @@ msgstr "الانحدار الشعاعي" msgid "workspace.header.menu.disable-dynamic-alignment" msgstr "إبطال المحاذاة الدينماكية" +msgid "workspace.header.menu.disable-scale-content" +msgstr "Disable proportional scale" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-scale-text" msgstr "إبطال المقياس النسبي" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-guides" +msgstr "إبطال الفرقعة للخ\\وط الإرشادية" + +msgid "workspace.header.menu.disable-snap-pixel-grid" +msgstr "إبطال الفرقعة للبكسل" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-dynamic-alignment" msgstr "تككين المحاذاة الدينماكية" +msgid "workspace.header.menu.enable-scale-content" +msgstr "تمكين المقياس النسبي" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-scale-text" msgstr "تمكين نص المقياس" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-guides" +msgstr "الفرقعة للخطوط الإرشادية" + +msgid "workspace.header.menu.enable-snap-pixel-grid" +msgstr "تمكين الفرقعة للبكسل" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-artboard-names" +msgstr "إخفاء أسماء البورد" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "إخفاء لون اللوحة" +msgid "workspace.header.menu.hide-pixel-grid" +msgstr "إخفاء تشبيك اللوحة" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-rules" msgstr "إخفاء المسطرات" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-textpalette" +msgstr "إخفاء لوحة أسلوب خط" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.edit" +msgstr "التحرير" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.file" +msgstr "الملف" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.help-info" +msgstr "المساعدة و المعلومة" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.preferences" +msgstr "التفضيلات" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.view" +msgstr "المنظر" + +msgid "workspace.header.menu.redo" +msgstr "إعادة" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.select-all" msgstr "حدد الجميع" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-artboard-names" +msgstr "أظهر أسماء البورد" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "أظهر لون اللوحة" +msgid "workspace.header.menu.show-pixel-grid" +msgstr "Show pixel grid" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-rules" msgstr "أظهر المسطرات" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-textpalette" +msgstr "أظهر لوخة أسلوب الخط" + +msgid "workspace.header.menu.undo" +msgstr "الإلغاء" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.reset-zoom" +msgstr "إعادة ضبط" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.save-error" msgstr "خطأ في حفظ الملف" @@ -2582,6 +2765,33 @@ msgstr "تغييرات غير محفوظة" msgid "workspace.header.viewer" msgstr "وضع العرض (%s)" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "تكبير" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fill" +msgstr "مقياس الملأ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fit" +msgstr "تقليص المقياس للتناسب" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fit-all" +msgstr "التكبير لتناسب الجميع" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-full-screen" +msgstr "تكبير الشاشة" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-selected" +msgstr "تكبير" + +msgid "workspace.layout_grid.editor.title" +msgstr "تحرير التشبيك" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "الإضافة" @@ -2590,16 +2800,36 @@ msgstr "الإضافة" msgid "workspace.libraries.colors" msgstr "%s الألوان" +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "لا يوجد أنماط اللون في مكتبتك" + +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "لا يوجد أنماط الكتابة في مكتبتك" + #: src/app/main/ui/workspace/colorpicker/libraries.cljs, #: src/app/main/ui/workspace/colorpalette.cljs msgid "workspace.libraries.colors.file-library" msgstr "مكتبة الملفات" +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.hsv" +msgstr "HSV" + #: src/app/main/ui/workspace/colorpicker/libraries.cljs, #: src/app/main/ui/workspace/colorpalette.cljs msgid "workspace.libraries.colors.recent-colors" msgstr "الألوان المؤخرة" +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgb-complementary" +msgstr "RGB مكملات" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgba" +msgstr "RGBA" + #: src/app/main/ui/workspace/colorpicker.cljs msgid "workspace.libraries.colors.save-color" msgstr "حفظ أسلوب اللون" @@ -2628,6 +2858,10 @@ msgstr "المكتبات" msgid "workspace.libraries.library" msgstr "المكتبة" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library-updates" +msgstr "تحديث المكتبة" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "لا يوجد مكتبات مشتركة تحتاج إلى تحديث" @@ -2664,10 +2898,18 @@ msgstr "%s الكتابات" msgid "workspace.libraries.update" msgstr "التحديث" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "رؤية جميع التغييرات" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.updates" msgstr "التحديثات" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.add-interaction" +msgstr "انقر على زر +لإضافة التفاعلات" + #: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs msgid "workspace.options.blur-options.title" msgstr "الطمس" @@ -2684,17 +2926,35 @@ msgstr "تطميس المحدد" msgid "workspace.options.canvas-background" msgstr "خلفية اللوحة القماشية" +msgid "workspace.options.clip-content" +msgstr "محتوى المقطع" + #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs msgid "workspace.options.component" msgstr "العنصر" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints" -msgstr "قيود" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.bottom" -msgstr "أسفل" +msgid "workspace.options.component.annotation" +msgstr "حاشية" + +msgid "workspace.options.component.copy" +msgstr "النسخ" + +msgid "workspace.options.component.create-annotation" +msgstr "إنشاء حاشية" + +msgid "workspace.options.component.edit-annotation" +msgstr "تحرير حاشية" + +msgid "workspace.options.component.main" +msgstr "أصل" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints" +msgstr "قيود" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.bottom" +msgstr "أسفل" #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints.center" @@ -2737,19 +2997,47 @@ msgstr "تصميم" msgid "workspace.options.export" msgstr "تصدير" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export-multiple" +msgstr "تحديد المصدر" + #: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs msgid "workspace.options.export.suffix" msgstr "لاحقة" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-complete" +msgstr "تم التصدير" + #: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, #: src/app/main/ui/inspect/exports.cljs msgid "workspace.options.exporting-object" msgstr "جاري التصدير…" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object-error" +msgstr "Export failed" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object-slow" +msgstr "التصدير بطيء بشكل غير متوقع" + #: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs msgid "workspace.options.fill" msgstr "الملأ" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.add-flow-start" +msgstr "إضافة المخطط" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-start" +msgstr "إضافة المخطط" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-starts" +msgstr "جاري التخطيط" + #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.auto" msgstr "تلقائي" @@ -2758,6 +3046,13 @@ msgstr "تلقائي" msgid "workspace.options.grid.column" msgstr "أعمدة" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.grid-title" +msgstr "تشبيك" + +msgid "workspace.options.grid.params.color" +msgstr "لون" + #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.params.columns" msgstr "أعمدة" @@ -2834,1477 +3129,1181 @@ msgstr "مربع" msgid "workspace.options.group-fill" msgstr "ملأ المجموعة" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.color" -msgstr "اللون" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.group-stroke" +msgstr "ضرب المجموعة" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.color-burn" -msgstr "احتراق اللون" +msgid "workspace.options.height" +msgstr "طول" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.color-dodge" -msgstr "انقاص كثافة اللون" +msgid "workspace.options.inspect" +msgstr "Inspectفحص" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.darken" -msgstr "أغمق" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-action" +msgstr "فعل" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.difference" -msgstr "الفارق" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-after-delay" +msgstr "بعد التأخير" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.there-are-updates" -msgstr "يوجد تحديثات في المكتبة المشتركة" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation" +msgstr "الرسومات المتحركة" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.update" -msgstr "تحديث" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-dissolve" +msgstr "تذوب" -msgid "workspace.viewport.click-to-close-path" -msgstr "انقر لتغلق المسار" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-none" +msgstr "لا شيء" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-out" -msgstr "خارج" +msgid "workspace.options.interaction-animation-push" +msgstr "دفع" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.move" -msgstr "تحريك (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-slide" +msgstr "انزلاق" -#: src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.empty-palette" -msgstr "لا يوجد أنماط اللون في مكتبتك" +msgid "workspace.options.interaction-auto" +msgstr "تلقائي" -msgid "workspace.options.component.copy" -msgstr "النسخ" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-background" +msgstr "إضافة تراكب الخلفية" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interactions" -msgstr "التفاعلات" +msgid "workspace.options.interaction-close-outside" +msgstr "عطل إذا نقر في الخارج" -msgid "workspace.undo.entry.multiple.circle" -msgstr "دوائر" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay" +msgstr "إغلاق التراكب" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-action" -msgstr "فعل" +msgid "workspace.options.interaction-close-overlay-dest" +msgstr "إغلاق التراكب: %s" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-center" -msgstr "المركز السفلي" +msgid "workspace.options.interaction-delay" +msgstr "تأخير" -msgid "workspace.shape.menu.transform-to-path" -msgstr "تحويل الى المسار" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-destination" +msgstr "وجهة" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-push" -msgstr "دفع" +msgid "workspace.options.interaction-duration" +msgstr "مدة" -msgid "workspace.options.inspect" -msgstr "Inspectفحص" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing" +msgstr "تخفيف" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-center" -msgstr "المركز العلوي" +msgid "workspace.options.interaction-easing-ease" +msgstr "خفف" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.multiply" -msgstr "تضاعف" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in" +msgstr "خفف داخل" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.letter-spacing" -msgstr "تباعد الحروف" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in-out" +msgstr "خفف داخل و خارج" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.direction-rtl" -msgstr "RTL" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-out" +msgstr "خفف خارج" -msgid "workspace.options.component.create-annotation" -msgstr "إنشاء حاشية" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-linear" +msgstr "خطي" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-auto-width" -msgstr "العرض التلقائي" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-in" +msgstr "داخل" -msgid "workspace.options.shadow-options.color" -msgstr "لون الظل" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-enter" +msgstr "إدخال الفأرة" -msgid "viewer.header.inspect-section" -msgstr "التفحص (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-leave" +msgstr "إخراج الفأرة" -msgid "workspace.shape.menu.flatten" -msgstr "تسطيح" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-ms" +msgstr "القوائم" -msgid "workspace.header.menu.hide-pixel-grid" -msgstr "إخفاء تشبيك اللوحة" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to" +msgstr "الإنتقال الى" -msgid "workspace.undo.entry.multiple.page" -msgstr "صفحات" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to-dest" +msgstr "انتقال الى: %s" -msgid "shortcuts.ungroup" -msgstr "فك التجميع" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-none" +msgstr "(غير مهيء)" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.empty" -msgstr "لا يوجد تغييرات في التاريخ الى الآن" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-offset-effect" +msgstr "تأثير الإزاحة" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin-simple" -msgstr "هامش بسيط" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-on-click" +msgstr "بعد النقر" -msgid "workspace.undo.entry.multiple.rect" -msgstr "مستطيلات" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay" +msgstr "فتح التراكب" -msgid "shortcuts.zoom-selected" -msgstr "كبر المحدد" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay-dest" +msgstr "فتح التراكب: %s" -msgid "workspace.options.grid.params.color" -msgstr "لون" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-url" +msgstr "رابط مفتوح" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.group" -msgstr "مجموعة" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-out" +msgstr "خارج" -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs -msgid "workspace.options.size-presets" -msgstr "الإعدادات المسبقة للحجم" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-center" +msgstr "المركز السفلي" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin" -msgstr "هامش" - -msgid "workspace.options.opacity" -msgstr "العتامة" - -msgid "workspace.options.component.edit-annotation" -msgstr "تحرير حاشية" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-left" +msgstr "اأسفل اليسار" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.file" -msgstr "الملف" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-right" +msgstr "أسفل اليمين" -msgid "workspace.undo.entry.multiple.media" -msgstr "الأصول الرسومية" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-center" +msgstr "مركز" -msgid "workspace.options.show-in-viewer" -msgstr "أظهر في وضع العرض" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-manual" +msgstr "يدوي" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.lowercase" -msgstr "أحرف صغيرة" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-center" +msgstr "المركز العلوي" -msgid "workspace.undo.entry.multiple.group" -msgstr "مجموعات" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-left" +msgstr "أعلى اليسار" -msgid "workspace.shape.menu.create-multiple-components" -msgstr "إنشاء عناصر جديدة" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-right" +msgstr "أعلى اليمين" -msgid "webhooks.last-delivery.success" -msgstr "محاذاة المركز الأفقي" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-position" +msgstr "موضع" -msgid "workspace.options.stroke-width" -msgstr "عرض الضرب" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-preserve-scroll" +msgstr "حفظ موضع التمرير" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-out" -msgstr "خفف خارج" +msgid "workspace.options.interaction-prev-screen" +msgstr "الشاشة السابقة" -msgid "workspace.options.x" -msgstr "X محور" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-relative-to" +msgstr "بالنسبة الى" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-self" msgstr "الذات" -msgid "workspace.shape.menu.path" -msgstr "طريق" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.offsety" -msgstr "Y" - -msgid "workspace.focus.focus-mode" -msgstr "وضع التركيز" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay" +msgstr "تبديل التراكب" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-ms" -msgstr "القوائم" +msgid "workspace.options.interaction-toggle-overlay-dest" +msgstr "تبديل التراكب: %s" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.right" -msgstr "يمين" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-trigger" +msgstr "مشغل" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.ellipse" -msgstr "الشكل البيضاوي (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-url" +msgstr "الرابط المفتوح" -msgid "workspace.sidebar.layers.groups" -msgstr "مجموعات" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-hovering" +msgstr "حين التحوم" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "مستطيل" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-pressing" +msgstr "حين الضغط" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-left" -msgstr "أعلى اليسار" +msgid "workspace.options.interactions" +msgstr "التفاعلات" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.color-palette" -msgstr "لوحة اللون (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color" +msgstr "اللون" -msgid "workspace.undo.entry.multiple.frame" -msgstr "لوحة" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color-burn" +msgstr "احتراق اللون" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-min-h" -msgstr "الحد الأدنى للطول" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color-dodge" +msgstr "انقاص كثافة اللون" -msgid "workspace.path.actions.add-node" -msgstr "أضف العقدة (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.darken" +msgstr "أغمق" -msgid "workspace.options.component.main" -msgstr "أصل" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.difference" +msgstr "الفارق" -msgid "workspace.undo.entry.single.frame" -msgstr "لوحة" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.exclusion" +msgstr "الإستبعاد" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow-starts" -msgstr "جاري التخطيط" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.hard-light" +msgstr "ضوء الثابت" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-position" -msgstr "موضع" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.hue" +msgstr "مسحة" -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.more-colors" -msgstr "المزيد من الألوان" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.lighten" +msgstr "تفتيح" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-bottom" -msgstr "محاذاة الأسفل" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.luminosity" +msgstr "لمعان" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.new" -msgstr "جديد %s" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.multiply" +msgstr "تضاعف" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.create-artboard-from-selection" -msgstr "تحديد محتوى اللوحة" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.normal" +msgstr "عادي" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-top-right" -msgstr "أعلى اليمين" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.overlay" +msgstr "تراكب" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-in" -msgstr "داخل" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.saturation" +msgstr "التشبع" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay" -msgstr "تبديل التراكب" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.screen" +msgstr "شاشة" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow" -msgstr "سهم المثلث" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.soft-light" +msgstr "ضوء خافت" -msgid "workspace.undo.entry.multiple.curve" -msgstr "منحنيات" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title" +msgstr "طبقة" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-guides" -msgstr "إبطال الفرقعة للخ\\وط الإرشادية" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title.group" +msgstr "طبقات المجموعة" -msgid "workspace.path.actions.snap-nodes" -msgstr "كسر العقد (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title.multiple" +msgstr "الطبقات المحددة" -msgid "workspace.undo.entry.multiple.multiple" -msgstr "أشياء" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.advanced-ops" +msgstr "خيارات متقدمة" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-slide" -msgstr "انزلاق" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-max-h" +msgstr "أقصى ارتفاع" #: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-min-w" -msgstr "الحد الأدنى للعرض" +msgid "workspace.options.layout-item.layout-item-max-w" +msgstr "أقصى عرض" #: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs msgid "workspace.options.layout-item.layout-item-min-h" msgstr "الحد الأدنو للارتفاع" -msgid "workspace.sidebar.layers.masks" -msgstr "قناعات" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-min-w" +msgstr "الحد الأدنى للعرض" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.screen" -msgstr "شاشة" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-max-h" +msgstr "أقصى ارتفاع" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "رؤية جميع التغييرات" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-max-w" +msgstr "أقصى عرض" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.inner-shadow" -msgstr "التظليل الداخلي" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-min-h" +msgstr "الحد الأدنى للطول" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.frame" -msgstr "لوحة (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-min-w" +msgstr "الحد الأدنى للعرض" -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "لا يوجد أنماط الكتابة في مكتبتك" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.bottom" +msgstr "أسفل" -#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.paste" -msgstr "معجون" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column" +msgstr "عمود" -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.selection-fill" -msgstr "اختر نوع الملأ" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column-reverse" +msgstr "العموج العكسي" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-middle" -msgstr "محاذاة الوسط" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row" +msgstr "الصف" -msgid "viewer.breaking-change.description" -msgstr "" -"وصف كسر التغييرThis shareable link is no longer valid. Create a new one or " -"ask the owner for a new one.هذا الرابط القابل للمشاركة لم يعد صالحا.صمم " -"جديدا أو اسأل مالكه للجديد" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row-reverse" +msgstr "الصف العكسي" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-background" -msgstr "إضافة تراكب الخلفية" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.gap" +msgstr "فجوة" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.unknown" -msgstr "انتهت العملية %s" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.left" +msgstr "شمال" -msgid "shortcuts.zoom-lense-increase" -msgstr "زيادة عدسة التكبير" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin" +msgstr "هامش" -msgid "workspace.shape.menu.add-grid" -msgstr "إضافة تخطيط التشبيك" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin-all" +msgstr "جميع النواحي" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-complete" -msgstr "تم التصدير" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin-simple" +msgstr "هامش بسيط" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-delay" -msgstr "تأخير" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.packed" +msgstr "معباة" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.luminosity" -msgstr "لمعان" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding" +msgstr "حشوة" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flip-vertical" -msgstr "التوجيه الرئسي" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-all" +msgstr "جميع النواحي" -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.position" -msgstr "الموضع" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-simple" +msgstr "حشوة بسيطة" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square" -msgstr "مربع" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.right" +msgstr "يمين" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-justify" -msgstr "تعديل (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-around" +msgstr "التباعد حول" #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.space-between" msgstr "التباعد بين" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.uppercase" -msgstr "الأحرف الكبيرة" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom" -msgstr "تكبير" - -msgid "workspace.options.component.annotation" -msgstr "حاشية" - -msgid "shortcuts.toggle-layers" -msgstr "تبديل الطبقات" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-preserve-scroll" -msgstr "حفظ موضع التمرير" - -msgid "workspace.undo.entry.single.typography" -msgstr "أصل الكتابة" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.top" +msgstr "أعلى" #: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.selection-color" -msgstr "الألوان المختارة" +msgid "workspace.options.more-colors" +msgstr "المزيد من الألوان" #: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs msgid "workspace.options.more-lib-colors" msgstr "المزيد من ألوان المكتبة" -msgid "workspace.header.menu.disable-snap-pixel-grid" -msgstr "إبطال الفرقعة للبكسل" +msgid "workspace.options.opacity" +msgstr "العتامة" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in" -msgstr "خفف داخل" +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.position" +msgstr "الموضع" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.solid" -msgstr "صلب" +#: src/app/main/ui/workspace/sidebar/options.cljs +msgid "workspace.options.prototype" +msgstr "النموذج المبدئي" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.delete" -msgstr "محذوف %s" +msgid "workspace.options.radius" +msgstr "نصف القطر" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.top" -msgstr "أعلى" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-bottom-left" +msgstr "أسفل اليسار" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-bottom-right" +msgstr "أسفل اليمين" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-top-left" +msgstr "أعلى الشمال" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-top-right" +msgstr "أعلى اليمين" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius.all-corners" +msgstr "كل الزوايا" #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.radius.single-corners" msgstr "زوايا مستقلة" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.dotted" -msgstr "منقط" +msgid "workspace.options.recent-fonts" +msgstr "مؤخر" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-artboard-names" -msgstr "إخفاء أسماء البورد" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.retry" +msgstr "أعد المحاولة" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.backward" -msgstr "أرسل الى الخلف" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.rotation" +msgstr "دوران" + +msgid "workspace.options.search-font" +msgstr "البخث عن نوع الخط" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.select-a-shape" msgstr "اختر الشكل أو اللوحة لجر الإتصال الى لوحة أو شكل آخر" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke" -msgstr "ضرب" +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.selection-color" +msgstr "الألوان المختارة" -msgid "workspace.layout_grid.editor.title" -msgstr "تحرير التشبيك" +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.selection-fill" +msgstr "اختر نوع الملأ" -msgid "workspace.undo.entry.single.page" -msgstr "صفحة" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.selection-stroke" +msgstr "ضرب الإختيار" -#: src/app/main/ui/dashboard/team.cljs -msgid "team.webhooks.max-length" -msgstr "يجب الا يزيد اسم الويبهوك على 2048 حرفا" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.blur" +msgstr "تطميس" -msgid "workspace.sidebar.layers.images" -msgstr "صور" +msgid "workspace.options.shadow-options.color" +msgstr "لون الظل" -msgid "workspace.header.menu.show-pixel-grid" -msgstr "Show pixel grid" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.drop-shadow" +msgstr "إسقاط الظل" -msgid "workspace.header.menu.undo" -msgstr "الإلغاء" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.inner-shadow" +msgstr "التظليل الداخلي" -msgid "workspace.undo.entry.single.color" -msgstr "أصل اللون" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsetx" +msgstr "X" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.line-height" -msgstr "ارتفاع الخط" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsety" +msgstr "Y" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.ungroup" -msgstr "فك التجميع" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.spread" +msgstr "الانتشار" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-auto-height" -msgstr "الإرتفاع التلقائي" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title" +msgstr "الظل" -msgid "workspace.focus.focus-on" -msgstr "تشغيل التركيز" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title.group" +msgstr "ظل المجموعة" -msgid "viewer.header.comments-section" -msgstr "التعليقات (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title.multiple" +msgstr "ظلال الإختيار" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.unlock" -msgstr "الغاء القفل" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-bottom-right" -msgstr "أسفل اليمين" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay" -msgstr "فتح التراكب" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-dissolve" -msgstr "تذوب" +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.show-fill-on-export" +msgstr "أظهر في المصدر" -msgid "workspace.undo.entry.single.rect" -msgstr "مستطيل" +msgid "workspace.options.show-in-viewer" +msgstr "أظهر في وضع العرض" -msgid "shortcuts.toggle-visibility" -msgstr "أظهر\\أخف" +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.size" +msgstr "مقاس" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-full-screen" -msgstr "تكبير الشاشة" +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs +msgid "workspace.options.size-presets" +msgstr "الإعدادات المسبقة للحجم" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.cut" -msgstr "قطع" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke" +msgstr "ضرب" -msgid "workspace.header.menu.disable-scale-content" -msgstr "Disable proportional scale" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker" +msgstr "معلم الدائرة" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-object-slow" -msgstr "التصدير بطيء بشكل غير متوقع" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "الدائرة" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.lock" -msgstr "إغلاق" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker" +msgstr "معلم الماس" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.modify" -msgstr "معدل %s" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "الماس" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin-all" -msgstr "جميع النواحي" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow" +msgstr "سهم الخط" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.strikethrough" -msgstr "الإضراب من خلال(%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "سهم" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.reset-overrides" -msgstr "إعادة ضبط التجاوزات" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.none" +msgstr "لا شيء" -msgid "workspace.undo.entry.multiple.typography" -msgstr "أصول الكتابة" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.round" +msgstr "دائري" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-center" -msgstr "محاذاة المركز (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square" +msgstr "مربع" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.text-palette" -msgstr "الكتابات (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker" +msgstr "معلم المربع" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.titlecase" -msgstr "Title case" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "مستطيل" -msgid "workspace.sidebar.layers.frames" -msgstr "لوحات" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow" +msgstr "سهم المثلث" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fit" -msgstr "تقليص المقياس للتناسب" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "المثلث" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-object-error" -msgstr "Export failed" +msgid "workspace.options.stroke-color" +msgstr "لون الضرب" -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.hsv" -msgstr "HSV" +msgid "workspace.options.stroke-width" +msgstr "عرض الضرب" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.delete-flow-start" -msgstr "حذف المخطط" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.center" +msgstr "مركز" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-left" -msgstr "اأسفل اليسار" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.dashed" +msgstr "متقطع" #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "الماس" +msgid "workspace.options.stroke.dotted" +msgstr "منقط" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-offset-effect" -msgstr "تأثير الإزاحة" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.inner" +msgstr "داخل" #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke.mixed" msgstr "مختلط" -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgba" -msgstr "RGBA" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row" -msgstr "الصف" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to" -msgstr "الإنتقال الى" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.outer" +msgstr "خارج" #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.inner" -msgstr "داخل" +msgid "workspace.options.stroke.solid" +msgstr "صلب" #: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.underline" -msgstr "تسطير (%s)" +msgid "workspace.options.text-options.align-bottom" +msgstr "محاذاة الأسفل" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay-dest" -msgstr "إغلاق التراكب: %s" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-middle" +msgstr "محاذاة الوسط" -msgid "workspace.header.menu.redo" -msgstr "إعادة" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-top" +msgstr "محاذاة أعلى" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.detach-instance" -msgstr "فصل المثال" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.direction-ltr" +msgstr "LTR" #: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-right" -msgstr "محاذاة اليمين (%s)" +msgid "workspace.options.text-options.direction-rtl" +msgstr "RTL" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-textpalette" -msgstr "أظهر لوخة أسلوب الخط" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-auto-height" +msgstr "الإرتفاع التلقائي" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flip-horizontal" -msgstr "Flip horizontal" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-auto-width" +msgstr "العرض التلقائي" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.hard-light" -msgstr "ضوء الثابت" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-fixed" +msgstr "مثبت" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-max-w" -msgstr "أقصى عرض" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.letter-spacing" +msgstr "تباعد الحروف" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column-reverse" -msgstr "العموج العكسي" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.line-height" +msgstr "ارتفاع الخط" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.front" -msgstr "النقل الى الأمام" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.lowercase" +msgstr "أحرف صغيرة" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-center" -msgstr "مركز" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.none" +msgstr "لا شيء" -msgid "workspace.undo.entry.single.multiple" -msgstr "عنصر" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.strikethrough" +msgstr "الإضراب من خلال(%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.add-interaction" -msgstr "انقر على زر +لإضافة التفاعلات" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-center" +msgstr "محاذاة المركز (%s)" -msgid "workspace.shape.menu.difference" -msgstr "الفارق" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-justify" +msgstr "تعديل (%s)" -msgid "workspace.assets.duplicate-main" -msgstr "انسخ الأصل" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-left" +msgstr "محاذاة (%s)" -msgid "workspace.undo.entry.multiple.path" -msgstr "مسارات" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-right" +msgstr "محاذاة اليمين (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-right" -msgstr "أسفل اليمين" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title" +msgstr "نص" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show-main" -msgstr "أظهر المكون الرئيسي" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title-group" +msgstr "نص للمجموعة" -msgid "shortcuts.v-distribute" -msgstr "النشر عموديا" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title-selection" +msgstr "نص الإختيار" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.grid-title" -msgstr "تشبيك" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.titlecase" +msgstr "Title case" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.offsetx" -msgstr "X" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.underline" +msgstr "تسطير (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.none" -msgstr "لا شيء" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.uppercase" +msgstr "الأحرف الكبيرة" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.exclusion" -msgstr "الإستبعاد" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.use-play-button" +msgstr "استعمل زر التشغيل أعلاه لتشغيل منظر النموذج المبدئي." -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.title" -msgstr "تاريخ" +msgid "workspace.options.width" +msgstr "عرض" -msgid "workspace.options.recent-fonts" -msgstr "مؤخر" +msgid "workspace.options.x" +msgstr "X محور" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-textpalette" -msgstr "إخفاء لوحة أسلوب خط" +msgid "workspace.options.y" +msgstr "Y محور" -msgid "workspace.undo.entry.single.component" -msgstr "component" +msgid "workspace.path.actions.add-node" +msgstr "أضف العقدة (%s)" -msgid "workspace.assets.local-library" -msgstr "المكتبة المحلية" +msgid "workspace.path.actions.delete-node" +msgstr "احذف العقدة (%s)" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.unmask" -msgstr "كشف القناع" +msgid "workspace.path.actions.draw-nodes" +msgstr "جر العقدة (%s)" -msgid "shortcuts.toggle-textpalette" -msgstr "تبديل لوحة النص" +msgid "workspace.path.actions.join-nodes" +msgstr "صل العقد (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-top" -msgstr "محاذاة أعلى" +msgid "workspace.path.actions.make-corner" +msgstr "الى الزاوية (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-pressing" -msgstr "حين الضغط" +msgid "workspace.path.actions.make-curve" +msgstr "الى المنحنى (%s)" -msgid "workspace.sidebar.collapse" -msgstr "انهيار الشريط الجانبي" +msgid "workspace.path.actions.merge-nodes" +msgstr "دمج العقد (%s)" -msgid "workspace.options.height" -msgstr "طول" +msgid "workspace.path.actions.move-nodes" +msgstr "نقل العقد (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.update-main" -msgstr "تحديث العنصر الرئيسي" +msgid "workspace.path.actions.separate-nodes" +msgstr "فصل العقد (%s)" -msgid "shortcuts.toggle-rules" -msgstr "إظهار\\إخفاء المسطرة" +msgid "workspace.path.actions.snap-nodes" +msgstr "كسر العقد (%s)" #: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flow-start" -msgstr "بداية المخطط" +msgid "workspace.shape.menu.add-flex" +msgstr "إضافة تخطيط الثني" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.remove-flex" -msgstr "إزالة تخطيط المنحنى" +msgid "workspace.shape.menu.add-grid" +msgstr "إضافة تخطيط التشبيك" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow-start" -msgstr "إضافة المخطط" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.back" +msgstr "أرسل الى الخلف" -msgid "workspace.sidebar.layers.components" -msgstr "العناصر" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.backward" +msgstr "أرسل الى الخلف" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease" -msgstr "خفف" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.copy" +msgstr "انسخ" -#: src/app/main/ui/workspace/sidebar/options/menus/svg_attrs.cljs, src/app/main/ui/inspect/attributes/svg.cljs -msgid "workspace.sidebar.options.svg-attrs.title" -msgstr "السمات المستوردةSVG" +msgid "workspace.shape.menu.create-annotation" +msgstr "إنشاء تعليق توضيحي" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.comments" -msgstr "تعليقات (%s)" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.create-artboard-from-selection" +msgstr "تحديد محتوى اللوحة" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-none" -msgstr "لا شيء" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.create-component" +msgstr "إنشاء نعصر" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.lighten" -msgstr "تفتيح" +msgid "workspace.shape.menu.create-multiple-components" +msgstr "إنشاء عناصر جديدة" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "workspace.options.export-multiple" -msgstr "تحديد المصدر" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.cut" +msgstr "قطع" #: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.hide" -msgstr "إخفاء" +msgid "workspace.shape.menu.delete" +msgstr "حذف" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.retry" -msgstr "أعد المحاولة" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete-flow-start" +msgstr "حذف المخطط" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-relative-to" -msgstr "بالنسبة الى" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.detach-instance" +msgstr "فصل المثال" #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.update-components-in-bulk" -msgstr "تحديث العناصر الرئيسية" +msgid "workspace.shape.menu.detach-instances-in-bulk" +msgstr "فصل الامثلة" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.sidebar.history" -msgstr "التاريخ (%s)" +msgid "workspace.shape.menu.difference" +msgstr "الفارق" -msgid "workspace.options.clip-content" -msgstr "محتوى المقطع" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.duplicate" +msgstr "ينسخ" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.path" -msgstr "مسار (%s)" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.edit" +msgstr "تحرير" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius.all-corners" -msgstr "كل الزوايا" +msgid "workspace.shape.menu.exclude" +msgstr "استبعاد" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-right" -msgstr "أعلى اليمين" +msgid "workspace.shape.menu.flatten" +msgstr "تسطيح" #: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.select-layer" -msgstr "اختيار الطبقة" - -msgid "workspace.undo.entry.single.image" -msgstr "صورة" +msgid "workspace.shape.menu.flip-horizontal" +msgstr "Flip horizontal" -msgid "workspace.shape.menu.intersection" -msgstr "التفاعلات" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flip-vertical" +msgstr "التوجيه الرئسي" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-trigger" -msgstr "مشغل" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flow-start" +msgstr "بداية المخطط" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.shortcuts" -msgstr "الإختصار (%s)" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.forward" +msgstr "النقل الى الأمام" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding" -msgstr "حشوة" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.front" +msgstr "النقل الى الأمام" -msgid "title.team-webhooks" -msgstr "خطافات الويب - %s - Penpot" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.go-main" +msgstr "انتقل الى ملف العنصر الأصلي" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library-updates" -msgstr "تحديث المكتبة" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.group" +msgstr "مجموعة" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.none" -msgstr "لا شيء" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.hide" +msgstr "إخفاء" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-none" -msgstr "(غير مهيء)" +msgid "workspace.shape.menu.hide-ui" +msgstr "أظهر أو إخف UI" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing" -msgstr "تخفيف" +msgid "workspace.shape.menu.intersection" +msgstr "التفاعلات" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "المثلث" - -msgid "workspace.path.actions.draw-nodes" -msgstr "جر العقدة (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row-reverse" -msgstr "الصف العكسي" - -msgid "workspace.undo.entry.single.media" -msgstr "أصل الرسومات" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.packed" -msgstr "معباة" - -msgid "workspace.header.menu.enable-snap-pixel-grid" -msgstr "تمكين الفرقعة للبكسل" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-enter" -msgstr "إدخال الفأرة" - -msgid "workspace.undo.entry.single.circle" -msgstr "دائرة" - -msgid "viewer.header.interactions-section" -msgstr "التفاعلات (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title.group" -msgstr "ظل المجموعة" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title.group" -msgstr "طبقات المجموعة" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.reset-zoom" -msgstr "إعادة ضبط" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.assets" -msgstr "أصول" - -msgid "workspace.assets.open-library" -msgstr "افتح ملف المكتب" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.lock" +msgstr "إغلاق" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title-selection" -msgstr "نص الإختيار" +#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.mask" +msgstr "قناع" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "مكتبة مشتركة" +#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.paste" +msgstr "معجون" -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.size" -msgstr "مقاس" +msgid "workspace.shape.menu.path" +msgstr "طريق" -msgid "workspace.undo.entry.multiple.component" -msgstr "عناصر" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-flex" +msgstr "إزالة تخطيط المنحنى" -msgid "workspace.focus.selection" -msgstr "تحديد" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.reset-overrides" +msgstr "إعادة ضبط التجاوزات" -msgid "workspace.path.actions.merge-nodes" -msgstr "دمج العقد (%s)" +msgid "workspace.shape.menu.restore-main" +msgstr "استعادة العنصر الرئيسي" #: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.create-component" -msgstr "إنشاء نعصر" +msgid "workspace.shape.menu.select-layer" +msgstr "اختيار الطبقة" -msgid "workspace.undo.entry.multiple.color" -msgstr "أصول اللون" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show" +msgstr "العرض" -msgid "workspace.header.menu.enable-scale-content" -msgstr "تمكين المقياس النسبي" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-in-assets" +msgstr "العرض في لوحة الاصول" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.group-stroke" -msgstr "ضرب المجموعة" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-main" +msgstr "أظهر المكون الرئيسي" -msgid "workspace.shape.menu.union" -msgstr "اتحاد" +msgid "workspace.shape.menu.thumbnail-remove" +msgstr "أطهر الصورة المصغرة" msgid "workspace.shape.menu.thumbnail-set" msgstr "تعيين كصورة مصغرة" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fill" -msgstr "مقياس الملأ" - -msgid "workspace.sidebar.layers.texts" -msgstr "نصوص" +msgid "workspace.shape.menu.transform-to-path" +msgstr "تحويل الى المسار" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-left" -msgstr "محاذاة (%s)" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.ungroup" +msgstr "فك التجميع" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.dismiss" -msgstr "رفض" +msgid "workspace.shape.menu.union" +msgstr "اتحاد" #: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.duplicate" -msgstr "ينسخ" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "مزيد من المعلومات" +msgid "workspace.shape.menu.unlock" +msgstr "الغاء القفل" #: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.forward" -msgstr "النقل الى الأمام" +msgid "workspace.shape.menu.unmask" +msgstr "كشف القناع" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-hovering" -msgstr "حين التحوم" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.update-components-in-bulk" +msgstr "تحديث العناصر الرئيسية" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show" -msgstr "العرض" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.update-main" +msgstr "تحديث العنصر الرئيسي" -msgid "workspace.shape.menu.hide-ui" -msgstr "أظهر أو إخف UI" +msgid "workspace.sidebar.collapse" +msgstr "انهيار الشريط الجانبي" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.center" -msgstr "مركز" +msgid "workspace.sidebar.expand" +msgstr "توسيع الشريط الجانبي" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-manual" -msgstr "يدوي" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.sidebar.history" +msgstr "التاريخ (%s)" #: src/app/main/ui/workspace/left_toolbar.cljs msgid "workspace.sidebar.layers" msgstr "الطبقات" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-leave" -msgstr "إخراج الفأرة" - -msgid "workspace.assets.typography.text-styles" -msgstr "أسلوب خط النص" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker" -msgstr "معلم الدائرة" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-min-w" -msgstr "الحد الأدنى للعرض" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.gap" -msgstr "فجوة" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker" -msgstr "معلم المربع" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column" -msgstr "عمود" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation" -msgstr "الرسومات المتحركة" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.drop-shadow" -msgstr "إسقاط الظل" - -msgid "workspace.undo.entry.single.curve" -msgstr "منحنى" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.overlay" -msgstr "تراكب" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in-out" -msgstr "خفف داخل و خارج" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-guides" -msgstr "الفرقعة للخطوط الإرشادية" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-linear" -msgstr "خطي" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-on-click" -msgstr "بعد النقر" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to-dest" -msgstr "انتقال الى: %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.spread" -msgstr "الانتشار" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.bottom" -msgstr "أسفل" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-duration" -msgstr "مدة" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.advanced-ops" -msgstr "خيارات متقدمة" - -msgid "shortcuts.toggle-zoom-style" -msgstr "تبديل أسلوب التكبير" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-outside" -msgstr "عطل إذا نقر في الخارج" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.blur" -msgstr "تطميس" - -msgid "workspace.path.actions.separate-nodes" -msgstr "فصل العقد (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.selection-stroke" -msgstr "ضرب الإختيار" - -#: src/app/main/ui/workspace/sidebar/options.cljs -msgid "workspace.options.prototype" -msgstr "النموذج المبدئي" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.use-play-button" -msgstr "استعمل زر التشغيل أعلاه لتشغيل منظر النموذج المبدئي." - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.hue" -msgstr "مسحة" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-artboard-names" -msgstr "أظهر أسماء البورد" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.dashed" -msgstr "متقطع" +msgid "workspace.sidebar.layers.components" +msgstr "العناصر" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.left" -msgstr "شمال" +msgid "workspace.sidebar.layers.frames" +msgstr "لوحات" -msgid "workspace.shape.menu.thumbnail-remove" -msgstr "أطهر الصورة المصغرة" +msgid "workspace.sidebar.layers.groups" +msgstr "مجموعات" -msgid "shortcuts.toggle-layout-flex" -msgstr "أضف\\أزل ثني التخطيط" +msgid "workspace.sidebar.layers.images" +msgstr "صور" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.space-around" -msgstr "التباعد حول" +msgid "workspace.sidebar.layers.masks" +msgstr "قناعات" -msgid "workspace.options.width" -msgstr "عرض" +msgid "workspace.sidebar.layers.shapes" +msgstr "بسومات" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.rect" -msgstr "مستطيل (%s)" +msgid "workspace.sidebar.layers.texts" +msgstr "نصوص" -msgid "workspace.undo.entry.single.group" -msgstr "مجموعة" +#: src/app/main/ui/workspace/sidebar/options/menus/svg_attrs.cljs, src/app/main/ui/inspect/attributes/svg.cljs +msgid "workspace.sidebar.options.svg-attrs.title" +msgstr "السمات المستوردةSVG" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-max-w" -msgstr "أقصى عرض" +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "workspace.sidebar.sitemap" +msgstr "صفحات" #: src/app/main/ui/workspace/header.cljs msgid "workspace.sitemap" msgstr "خريطة الموقع" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-bottom-left" -msgstr "أسفل اليسار" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay" -msgstr "إغلاق التراكب" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker" -msgstr "معلم الماس" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.soft-light" -msgstr "ضوء خافت" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding-simple" -msgstr "حشوة بسيطة" - -msgid "workspace.shape.menu.create-annotation" -msgstr "إنشاء تعليق توضيحي" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-selected" -msgstr "تكبير" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay-dest" -msgstr "فتح التراكب: %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-url" -msgstr "رابط مفتوح" - -msgid "workspace.path.actions.delete-node" -msgstr "احذف العقدة (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-destination" -msgstr "وجهة" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.go-main" -msgstr "انتقل الى ملف العنصر الأصلي" - -msgid "shortcuts.undo" -msgstr "الغاء" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "سهم" - -msgid "workspace.path.actions.make-curve" -msgstr "الى المنحنى (%s)" - -msgid "workspace.options.search-font" -msgstr "البخث عن نوع الخط" - -msgid "workspace.path.actions.move-nodes" -msgstr "نقل العقد (%s)" - -msgid "workspace.path.actions.join-nodes" -msgstr "صل العقد (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-url" -msgstr "الرابط المفتوح" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.move" -msgstr "المكونات المعدلة" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title.multiple" -msgstr "الطبقات المحددة" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.direction-ltr" -msgstr "LTR" - -#: src/app/main/ui/dashboard/team.cljs -msgid "title.team-invitations" -msgstr "الدعوات - %s - Penpot" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.delete" -msgstr "حذف" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show-in-assets" -msgstr "العرض في لوحة الاصول" - -msgid "workspace.undo.entry.multiple.shape" -msgstr "أشكال" - -msgid "workspace.options.interaction-auto" -msgstr "تلقائي" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title.multiple" -msgstr "ظلال الإختيار" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-prev-screen" -msgstr "الشاشة السابقة" - #: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.text" -msgstr "نص (%s)" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.copy" -msgstr "انسخ" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.curve" -msgstr "منحنى (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding-all" -msgstr "جميع النواحي" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title" -msgstr "نص" - -msgid "shortcuts.underline" -msgstr "الخط التحتي" - -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgb-complementary" -msgstr "RGB مكملات" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.edit" -msgstr "التحرير" +msgid "workspace.toolbar.assets" +msgstr "أصول" -msgid "shortcuts.unmask" -msgstr "كشف القناع" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.color-palette" +msgstr "لوحة اللون (%s)" -msgid "workspace.options.y" -msgstr "Y محور" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.comments" +msgstr "تعليقات (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.round" -msgstr "دائري" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.curve" +msgstr "منحنى (%s)" -msgid "shortcuts.toggle-lock" -msgstr "قفل\\فتح" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.ellipse" +msgstr "الشكل البيضاوي (%s)" -msgid "viewer.breaking-change.message" -msgstr "آسف" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.frame" +msgstr "لوحة (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title" -msgstr "طبقة" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.image" +msgstr "صورة (%s)" -msgid "workspace.undo.entry.multiple.text" -msgstr "نصوص" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.move" +msgstr "تحريك (%s)" -msgid "workspace.sidebar.layers.shapes" -msgstr "بسومات" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.path" +msgstr "مسار (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.add-flow-start" -msgstr "إضافة المخطط" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.rect" +msgstr "مستطيل (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.show-fill-on-export" -msgstr "أظهر في المصدر" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.shortcuts" +msgstr "الإختصار (%s)" -msgid "shortcuts.toggle-lock-size" -msgstr "قفل النسب" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text" +msgstr "نص (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-max-h" -msgstr "أقصى ارتفاع" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text-palette" +msgstr "الكتابات (%s)" -msgid "workspace.shape.menu.restore-main" -msgstr "استعادة العنصر الرئيسي" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.empty" +msgstr "لا يوجد تغييرات في التاريخ الى الآن" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.saturation" -msgstr "التشبع" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.delete" +msgstr "محذوف %s" -msgid "workspace.sidebar.expand" -msgstr "توسيع الشريط الجانبي" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.modify" +msgstr "معدل %s" -#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.mask" -msgstr "قناع" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.move" +msgstr "المكونات المعدلة" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay-dest" -msgstr "تبديل التراكب: %s" +msgid "workspace.undo.entry.multiple.circle" +msgstr "دوائر" -msgid "workspace.path.actions.make-corner" -msgstr "الى الزاوية (%s)" +msgid "workspace.undo.entry.multiple.color" +msgstr "أصول اللون" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "الدائرة" +msgid "workspace.undo.entry.multiple.component" +msgstr "عناصر" -msgid "workspace.options.stroke-color" -msgstr "لون الضرب" +msgid "workspace.undo.entry.multiple.curve" +msgstr "منحنيات" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.outer" -msgstr "خارج" +msgid "workspace.undo.entry.multiple.frame" +msgstr "لوحة" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-top-left" -msgstr "أعلى الشمال" +msgid "workspace.undo.entry.multiple.group" +msgstr "مجموعات" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.normal" -msgstr "عادي" +msgid "workspace.undo.entry.multiple.media" +msgstr "الأصول الرسومية" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.preferences" -msgstr "التفضيلات" +msgid "workspace.undo.entry.multiple.multiple" +msgstr "أشياء" -msgid "workspace.shape.menu.exclude" -msgstr "استبعاد" +msgid "workspace.undo.entry.multiple.page" +msgstr "صفحات" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.rotation" -msgstr "دوران" +msgid "workspace.undo.entry.multiple.path" +msgstr "مسارات" -msgid "shortcuts.zoom-lense-decrease" -msgstr "تنقيص عدسة التكبير" +msgid "workspace.undo.entry.multiple.rect" +msgstr "مستطيلات" -msgid "workspace.undo.entry.single.shape" -msgstr "شكل" +msgid "workspace.undo.entry.multiple.shape" +msgstr "أشكال" -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "workspace.sidebar.sitemap" -msgstr "صفحات" +msgid "workspace.undo.entry.multiple.text" +msgstr "نصوص" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.view" -msgstr "المنظر" +msgid "workspace.undo.entry.multiple.typography" +msgstr "أصول الكتابة" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.detach-instances-in-bulk" -msgstr "فصل الامثلة" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.new" +msgstr "جديد %s" -msgid "workspace.focus.focus-off" -msgstr "تعطيل التركيز" +msgid "workspace.undo.entry.single.circle" +msgstr "دائرة" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "title.settings.access-tokens" -msgstr "رموز الوصول للحساب" +msgid "workspace.undo.entry.single.color" +msgstr "أصل اللون" -msgid "workspace.options.radius" -msgstr "نصف القطر" +msgid "workspace.undo.entry.single.component" +msgstr "component" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.back" -msgstr "أرسل الى الخلف" +msgid "workspace.undo.entry.single.curve" +msgstr "منحنى" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow" -msgstr "سهم الخط" +msgid "workspace.undo.entry.single.frame" +msgstr "لوحة" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.edit" -msgstr "تحرير" +msgid "workspace.undo.entry.single.group" +msgstr "مجموعة" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fit-all" -msgstr "التكبير لتناسب الجميع" +msgid "workspace.undo.entry.single.image" +msgstr "صورة" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-after-delay" -msgstr "بعد التأخير" +msgid "workspace.undo.entry.single.media" +msgstr "أصل الرسومات" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-max-h" -msgstr "أقصى ارتفاع" +msgid "workspace.undo.entry.single.multiple" +msgstr "عنصر" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title" -msgstr "الظل" +msgid "workspace.undo.entry.single.page" +msgstr "صفحة" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.help-info" -msgstr "المساعدة و المعلومة" +msgid "workspace.undo.entry.single.path" +msgstr "مسار" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title-group" -msgstr "نص للمجموعة" +msgid "workspace.undo.entry.single.rect" +msgstr "مستطيل" + +msgid "workspace.undo.entry.single.shape" +msgstr "شكل" msgid "workspace.undo.entry.single.text" msgstr "نص" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-fixed" -msgstr "مثبت" +msgid "workspace.undo.entry.single.typography" +msgstr "أصل الكتابة" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.image" -msgstr "صورة (%s)" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.unknown" +msgstr "انتهت العملية %s" -msgid "workspace.undo.entry.single.path" -msgstr "مسار" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.title" +msgstr "تاريخ" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.add-flex" -msgstr "إضافة تخطيط الثني" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.dismiss" +msgstr "رفض" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "مزيد من المعلومات" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.there-are-updates" +msgstr "يوجد تحديثات في المكتبة المشتركة" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.update" +msgstr "تحديث" + +msgid "workspace.viewport.click-to-close-path" +msgstr "انقر لتغلق المسار" diff --git a/frontend/translations/cs.po b/frontend/translations/cs.po index b2f2225f4..d0b667449 100644 --- a/frontend/translations/cs.po +++ b/frontend/translations/cs.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-01-23 15:02+0000\n" "Last-Translator: \"Amerey.eu\" \n" -"Language-Team: Czech \n" +"Language-Team: Czech " +"\n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -84,6 +84,14 @@ msgstr "LDAP" msgid "auth.login-with-oidc-submit" msgstr "OpenID" +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "Název musí obsahovat jiný znak než mezeru." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "Název musí obsahovat maximálně 250 znaků." + #: src/app/main/ui/auth/recovery.cljs msgid "auth.new-password" msgstr "Zadejte nové heslo" @@ -116,6 +124,10 @@ msgstr "Heslo" msgid "auth.password-length-hint" msgstr "Minimálně 8 znaků" +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "Heslo musí obsahovat jiný znak než mezeru." + msgid "auth.privacy-policy" msgstr "Zásady ochrany osobních údajů" @@ -164,10 +176,21 @@ msgstr "" "Vytvořením nového účtu souhlasíte s všeobecnými podmínkami poskytování " "služeb a zásadami ochrany osobních údajů." +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Při vytváření nového účtu souhlasíte s našimi [smluvními podmínkami](%s) a " +"[zásadami ochrany soukromí](%s)." + #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "Ověřovací e-mail jsme odeslali na adresu" +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...branding, ilustrace, marketing atd." + msgid "common.publish" msgstr "Zveřejnit" @@ -265,6 +288,83 @@ msgstr "Začít prohlídku" msgid "dasboard.walkthrough-hero.title" msgstr "Průvodce rozhraním" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.copied-success" +msgstr "Zkopírovaný token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "Generovat nový token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "Přístupový token byl úspěšně vytvořen." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "" +"Pro vygenerování nového tokenu stiskněte tlačítko \"Vygenerovat nový " +"token\"." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "Zatím nemáte žádné tokeny." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "Jméno je povinné" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "180 dní" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "30 dní" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "60 dní" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "90 dní" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "Nikdy" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "Platnost vypršela %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "Platnost vyprší %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.no-expiration" +msgstr "Žádné datum vypršení platnosti" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "Osobní přístupové tokeny" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"Osobní přístupové tokeny fungují jako alternativa k našemu systému " +"ověřování přihlašovacích údajů/hesel a lze je použít k tomu, aby aplikaci " +"umožnily přístup k internímu rozhraní Penpot API" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "Platnost tokenu vyprší %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "Token nemá žádné datum vypršení platnosti" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "dashboard.add-shared" @@ -756,6 +856,9 @@ msgstr "Písmo %s se nepodařilo načíst" msgid "errors.bad-font-plural" msgstr "Písma %s se nepodařilo načíst" +msgid "errors.cannot-upload" +msgstr "Nelze nahrát soubor médií." + #: src/app/main/data/workspace.cljs msgid "errors.clipboard-not-implemented" msgstr "Váš prohlížeč tuto operaci nedokáže provést" @@ -794,13 +897,20 @@ msgstr "E-mail «%s» byl nahlášen jako spam nebo byl trvale nedostupný." #: src/app/main/errors.cljs msgid "errors.feature-mismatch" msgstr "" -"Vypadá to, že otevíráte soubor, který má povolenou funkci '%s', ale aktuální " -"verze penpotu ji nepodporuje nebo je deaktivovaná." +"Vypadá to, že otevíráte soubor, který má povolenou funkci '%s', ale " +"aktuální verze penpotu ji nepodporuje nebo je deaktivovaná." #: src/app/main/errors.cljs msgid "errors.feature-not-supported" msgstr "Funkce '%s' není podporována." +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Zdá se, že existuje nesoulad mezi povolenými funkcemi a funkcemi souboru, " +"který se pokoušíte otevřít. Před otevřením souboru je třeba provést migraci " +"pro '%s'." + #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -851,6 +961,9 @@ msgstr "Potvrzovací heslo se musí shodovat" msgid "errors.password-too-short" msgstr "Heslo by mělo mít nejméně 8 znaků" +msgid "errors.paste-data-validation" +msgstr "Neplatná data ve schránce" + msgid "errors.profile-blocked" msgstr "Profil je zablokován" @@ -864,6 +977,10 @@ msgstr "Váš profil má ztlumené e-maily (zprávy o spamu nebo vysoká nedoru msgid "errors.registration-disabled" msgstr "Registrace je momentálně zakázána." +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Zjištěna nekompatibilní funkce '%s'" + msgid "errors.team-leave.insufficient-members" msgstr "" "Nedostatečný počet členů pro opuštění týmu, pravděpodobně jste chtěli tým " @@ -885,6 +1002,13 @@ msgstr "Došlo k neočekávané chybě." msgid "errors.unexpected-token" msgstr "Neznámý token" +msgid "errors.validation" +msgstr "Chyba ověření" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Soubor má nekompatibilní číslo verze" + msgid "errors.webhooks.connection" msgstr "Chyba připojení, adresa URL není dostupná" @@ -1118,6 +1242,9 @@ msgstr "Žádná" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "První písmena velká" +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Nenastaveno" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Velká písmena" @@ -1186,6 +1313,10 @@ msgstr "Zkratky" msgid "labels.accept" msgstr "Přijmout" +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "Přístupové tokeny" + msgid "labels.active" msgstr "Aktivní" @@ -1289,6 +1420,9 @@ msgstr "Smazat pozvánku" msgid "labels.delete-multi-files" msgstr "Smazat soubory %s" +msgid "labels.discard" +msgstr "Zahodit" + #: src/app/main/ui/dashboard/projects.cljs, #: src/app/main/ui/dashboard/sidebar.cljs, #: src/app/main/ui/dashboard/files.cljs, @@ -1520,6 +1654,9 @@ msgstr "Role" msgid "labels.save" msgstr "Uložit" +msgid "labels.search" +msgstr "Hledat" + msgid "labels.search-font" msgstr "Hledat písmo" @@ -1544,6 +1681,9 @@ msgstr "Služba je nedostupná" msgid "labels.settings" msgstr "Nastavení" +msgid "labels.share" +msgstr "Sdílet" + msgid "labels.share-prototype" msgstr "Sdílet prototyp" @@ -1613,10 +1753,34 @@ msgstr "(vy)" msgid "labels.your-account" msgstr "Váš účet" +msgid "media.choose-image" +msgstr "Vyberte obrázek" + +msgid "media.gradient" +msgstr "Přechod" + +msgid "media.image" +msgstr "Obrázek" + +msgid "media.linear" +msgstr "Lineární" + #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Načítání obrázku…" +msgid "media.radial" +msgstr "Radiální" + +msgid "media.solid" +msgstr "Plná" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Vaše knihovna je prázdná. Po přidání jako sdílená knihovna budou položky, " +"které vytvoříte, k dispozici pro použití se zbytkem vašich souborů. Opravdu " +"ji chcete publikovat?" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -1660,6 +1824,30 @@ msgstr "Změnit e-mail" msgid "modals.change-email.title" msgstr "Změňte svůj e-mail" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.copy-token" +msgstr "Kopírovat token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.expiration-date.label" +msgstr "Datum vypršení platnosti" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "Jméno" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.placeholder" +msgstr "Název může pomoci zjistit, k čemu token slouží" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "Vytvořit token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "Vygenerujte přístupový token" + msgid "modals.create-webhook.submit-label" msgstr "Vytvořit webhook" @@ -1672,6 +1860,18 @@ msgstr "Adresa URL datové části" msgid "modals.create-webhook.url.placeholder" msgstr "https://example.com/postreceive" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "Smazat token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.message" +msgstr "Opravdu chcete tento token smazat?" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "Smazat token" + #: src/app/main/ui/settings/delete_account.cljs msgid "modals.delete-account.cancel" msgstr "Zrušit a ponechat si můj účet" @@ -1702,6 +1902,12 @@ msgstr "" msgid "modals.delete-comment-thread.title" msgstr "Smazat konverzaci" +msgid "modals.delete-component-annotation.message" +msgstr "Opravdu chcete smazat tuto anotaci?" + +msgid "modals.delete-component-annotation.title" +msgstr "Smazat anotaci" + #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-file-confirm.accept" msgstr "Smazat soubor" @@ -1768,6 +1974,20 @@ msgstr[0] "Smazat soubor" msgstr[1] "Smazat soubory" msgstr[2] "Smazat soubory" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "Není aktivován v žádném souboru." +msgstr[1] "Nejsou aktivovány v žádném souboru." +msgstr[2] "Nejsou aktivovány v žádném souboru." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.scd-message" +msgid_plural "modals.delete-shared-confirm.activated.scd-message" +msgstr[0] "Tato knihovna je aktivována zde: " +msgstr[1] "Tyto knihovny jsou aktivovány zde: " +msgstr[2] "Tyto knihovny jsou aktivovány zde: " + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-shared-confirm.message" @@ -1810,6 +2030,19 @@ msgstr "Opravdu chcete tohoto člena smazat z týmu?" msgid "modals.delete-team-member-confirm.title" msgstr "Smazat člena týmu" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "" +"Aktiva, která již byla v tomto souboru použita, tam zůstanou (nebude " +"porušen žádný návrh)." +msgstr[1] "" +"Aktiva, která již byla v těchto souborech použita, tam zůstanou (nebude " +"porušen žádný návrh)." +msgstr[2] "" +"Aktiva, která již byla v těchto souborech použita, tam zůstanou (nebude " +"porušen žádný návrh)." + msgid "modals.delete-webhook.accept" msgstr "Smazat webhook" @@ -1910,6 +2143,15 @@ msgstr "" msgid "modals.promote-owner-confirm.title" msgstr "Nový majitel týmu" +msgid "modals.publish-empty-library.accept" +msgstr "Publikovat" + +msgid "modals.publish-empty-library.message" +msgstr "Vaše knihovna je prázdná. Opravdu to chcete publikovat?" + +msgid "modals.publish-empty-library.title" +msgstr "Publikovat prázdnou knihovnu" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.remove-shared-confirm.accept" @@ -1986,6 +2228,10 @@ msgstr "" msgid "modals.update-remote-component.message" msgstr "Aktualizovat komponentu ve sdílené knihovně" +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "K dispozici je nová verze, obnovte prosím stránku" + #: src/app/main/ui/dashboard/team.cljs msgid "notifications.invitation-email-sent" msgstr "Pozvánka byla úspěšně odeslána" @@ -2071,15 +2317,36 @@ msgstr "Průvodce přispíváním" msgid "onboarding-v2.welcome.title" msgstr "Vítejte v Penpot!" +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Pokračujte ve vytváření týmu" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Pokračovat bez týmu" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Vytvořte tým a pozvěte" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Vytvořte tým a odešlete pozvánky" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Budete moci pozvat později" + msgid "onboarding.choice.team-up.create-team-desc" msgstr "Po pojmenování svého týmu budete moci pozvat lidi, aby se přidali." msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "Zadejte název týmu" -msgid "onboarding.choice.team-up.invite-members" -msgstr "Pozvat členy" - +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Vytvořte tým" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Vytvořte tým bez pozvánek" + +msgid "onboarding.choice.team-up.invite-members" +msgstr "Pozvat členy" + msgid "onboarding.choice.team-up.invite-members-info" msgstr "" "Nezapomeňte zahrnout všechny. Vývojáře, designéry, manažéry... rozmanitost " @@ -2088,6 +2355,12 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Pozvat s rolí:" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Začněte bez týmu" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Později budete moci vytvořit tým." + msgid "onboarding.newsletter.accept" msgstr "Ano, přihlásit se k odběru" @@ -2136,6 +2409,176 @@ msgstr "Penpot" msgid "profile.recovery.go-to-login" msgstr "Přejít na přihlášení" +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "S jakým designovým nástrojem máte více zkušeností?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "Hodně" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canva" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "Jak byste nejlépe popsali své zkušenosti s prací na..." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Designer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Vývojář" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "Zjistěte více o Penpot" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Zakladatel / viceprezident" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Jsem freelancer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Získejte kód z mého týmového projektu " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... design rozhraní, vizuální aktiva, návrhové systémy atd." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "InVision" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Zanechte zpětnou vazbu pro můj týmový projekt" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "Pusťme se do toho!" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Produktový nebo projektový manažer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Marketing" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "Více než 50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Další" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Žádný" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Jiné (upřesněte)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "Pracuji na osobním projektu" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "Předchozí" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Jak plánujete používat Penpot?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Jaká je vaše role?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Vyberte možnost" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Sketch" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Nějaké" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Start" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Začněte pracovat na mém projektu" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Student nebo učitel" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "Jaká je velikost vašeho týmu?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Vyzkoušejte Penpot, abyste zjistili, zda je vhodný pro tým " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Před použitím Penpot on-premise si to vyzkoušejte" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "... drátové modely, cesty a toky uživatelů, navigační stromy atd." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Práce v konceptech" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Vaše zpětná vazba nám pomůže porozumět vašim zvykům a preferencím, abychom " +"mohli i nadále dělat Penpot užitečným nástrojem." + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Odpojit" + #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, @@ -2507,6 +2950,9 @@ msgstr "Vybrat vše" msgid "shortcuts.select-next" msgstr "Vybrat další vrstvu" +msgid "shortcuts.select-parent-layer" +msgstr "Vybrat nadřazenou vrstvu" + msgid "shortcuts.select-prev" msgstr "Vybrat předchozí vrstvu" @@ -2534,6 +2980,18 @@ msgstr "Začít měření" msgid "shortcuts.stop-measure" msgstr "Zastavit měření" +msgid "shortcuts.text-align-center" +msgstr "Zarovnat na střed" + +msgid "shortcuts.text-align-justify" +msgstr "Zarovnat do bloku" + +msgid "shortcuts.text-align-left" +msgstr "Zarovnat vlevo" + +msgid "shortcuts.text-align-right" +msgstr "Zarovnat vpravo" + msgid "shortcuts.thumbnail-set" msgstr "Nastavit náhledy" @@ -2607,6 +3065,10 @@ msgstr "Zvětšení zoomu" msgid "shortcuts.zoom-selected" msgstr "Přiblížit na vybrané" +#: src/app/main/ui/dashboard/team.cljs +msgid "team.webhooks.max-length" +msgstr "Název webhooku musí obsahovat maximálně 2048 znaků." + #: src/app/main/ui/dashboard/files.cljs msgid "title.dashboard.files" msgstr "%s - Penpot" @@ -2635,6 +3097,10 @@ msgstr "Sdílené knihovny - %s - Penpot" msgid "title.default" msgstr "Penpot – Svoboda designu pro týmy" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "Profil – Přístupové tokeny" + #: src/app/main/ui/settings/feedback.cljs msgid "title.settings.feedback" msgstr "Poskytněte zpětnou vazbu – Penpot" @@ -2831,6 +3297,9 @@ msgstr "místní knihovna" msgid "workspace.assets.not-found" msgstr "Nebyly nalezeny žádné podklady" +msgid "workspace.assets.open-library" +msgstr "Otevřete soubor knihovny" + #: src/app/main/ui/workspace/sidebar/sitemap.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs @@ -2852,6 +3321,10 @@ msgstr[0] "%s položka vybrána" msgstr[1] "Počet vybraných položek: %s" msgstr[2] "Počet vybraných položek: %s" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "Sdílená knihovna" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" @@ -3048,6 +3521,10 @@ msgstr "Neuložené změny" msgid "workspace.header.viewer" msgstr "Režim zobrazení (%s)" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "Přiblížení" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.zoom-fill" msgstr "Výplň – přizpůsobit, aby vyplnil" @@ -3068,6 +3545,21 @@ msgstr "Celá obrazovka" msgid "workspace.header.zoom-selected" msgstr "Přiblížit na vybrané" +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Upravit mřížku" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Odejít" + +msgid "workspace.layout_grid.editor.title" +msgstr "Úprava mřížky" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Hotovo" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Lokalizovat" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Přidat" @@ -3076,6 +3568,14 @@ msgstr "Přidat" msgid "workspace.libraries.colors" msgstr "barvy %s" +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "Ve vaší knihovně zatím nejsou žádné barevné styly" + +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "Ve vaší knihovně zatím nejsou žádné typografické styly" + #: src/app/main/ui/workspace/colorpicker/libraries.cljs, #: src/app/main/ui/workspace/colorpalette.cljs msgid "workspace.libraries.colors.file-library" @@ -3126,6 +3626,10 @@ msgstr "KNIHOVNY" msgid "workspace.libraries.library" msgstr "KNIHOVNA" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library-updates" +msgstr "AKTUALIZACE KNIHOVNY" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "Neexistují žádné sdílené knihovny, které by potřebovaly aktualizaci" @@ -3162,6 +3666,10 @@ msgstr "%s typografie" msgid "workspace.libraries.update" msgstr "Aktualizace" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "zobrazit všechny změny" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.updates" msgstr "AKTUALIZACE" @@ -3193,11 +3701,32 @@ msgstr "Oříznout obsah" msgid "workspace.options.component" msgstr "Komponent" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints" -msgstr "Omezení" +msgid "workspace.options.component.annotation" +msgstr "Anotace" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.component.copy" +msgstr "Kopírovat" + +msgid "workspace.options.component.create-annotation" +msgstr "Vytvořte anotaci" + +msgid "workspace.options.component.edit-annotation" +msgstr "Upravit anotaci" + +msgid "workspace.options.component.main" +msgstr "Hlavní" + +msgid "workspace.options.component.swap" +msgstr "Vyměnit komponent" + +msgid "workspace.options.component.swap.empty" +msgstr "V této knihovně zatím nejsou žádné položky" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints" +msgstr "Omezení" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints.bottom" msgstr "Dole" @@ -3287,6 +3816,10 @@ msgstr "Výplň" msgid "workspace.options.flows.add-flow-start" msgstr "Přidat počáteční bod" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Flow" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "Začátek" @@ -3390,6 +3923,9 @@ msgstr "Výplň skupiny" msgid "workspace.options.group-stroke" msgstr "Ohraničení skupiny" +msgid "workspace.options.guides.title" +msgstr "Vodítka" + msgid "workspace.options.height" msgstr "Výška" @@ -3936,14 +4472,26 @@ msgstr "Tah" msgid "workspace.options.stroke-cap.circle-marker" msgstr "Zakončení - kruh" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Kruh" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "Zakončení - diamant" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Diamant" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "Zakončení - šipka" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Šipka" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "Žádné" @@ -3960,10 +4508,18 @@ msgstr "Čtvercové" msgid "workspace.options.stroke-cap.square-marker" msgstr "Zakončení - čtverec" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Obdélník" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "Zakončení - trojúhelník" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Trojúhelník" + msgid "workspace.options.stroke-color" msgstr "Barva tahu" @@ -4138,6 +4694,9 @@ msgstr "Přichytit uzly (%s)" msgid "workspace.shape.menu.add-flex" msgstr "Přidat flexibilní rozložení" +msgid "workspace.shape.menu.add-grid" +msgstr "Přidat rozvržení mřížky" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.back" msgstr "Poslat na konec" @@ -4150,6 +4709,9 @@ msgstr "Poslat dozadu" msgid "workspace.shape.menu.copy" msgstr "Kopírovat" +msgid "workspace.shape.menu.create-annotation" +msgstr "Vytvořit anotaci" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.create-artboard-from-selection" msgstr "Výběr na tabuli" @@ -4158,6 +4720,9 @@ msgstr "Výběr na tabuli" msgid "workspace.shape.menu.create-component" msgstr "Vytvořit komponent" +msgid "workspace.shape.menu.create-multiple-components" +msgstr "Vytvořte více komponent" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.cut" msgstr "Vyjmout" @@ -4425,6 +4990,13 @@ msgstr "Text (%s)" msgid "workspace.toolbar.text-palette" msgstr "Typografie (%s)" +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**Režim kontroly** (Pouze zobrazení)" + +msgid "workspace.top-bar.read-only.done" +msgstr "Hotovo" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Zatím nedošlo k žádným změnám v historii" @@ -4544,6 +5116,10 @@ msgstr "Historie" msgid "workspace.updates.dismiss" msgstr "Zrušit" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "Více informací" + #: src/app/main/data/workspace/libraries.cljs msgid "workspace.updates.there-are-updates" msgstr "Ve sdílených knihovnách jsou aktualizace" @@ -4554,578 +5130,3 @@ msgstr "Aktualizace" msgid "workspace.viewport.click-to-close-path" msgstr "Kliknutím zavřete cestu" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-never" -msgstr "Nikdy" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "Platnost vypršela %s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.no-expiration" -msgstr "Žádné datum vypršení platnosti" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Soubor má nekompatibilní číslo verze" - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Zjištěna nekompatibilní funkce '%s'" - -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Nenastaveno" - -msgid "labels.discard" -msgstr "Zahodit" - -msgid "labels.share" -msgstr "Sdílet" - -msgid "labels.search" -msgstr "Hledat" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.submit-label" -msgstr "Vytvořit token" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.scd-message" -msgid_plural "modals.delete-shared-confirm.activated.scd-message" -msgstr[0] "Tato knihovna je aktivována zde: " -msgstr[1] "Tyto knihovny jsou aktivovány zde: " -msgstr[2] "Tyto knihovny jsou aktivovány zde: " - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Vytvořte tým a odešlete pozvánky" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Vytvořte tým bez pozvánek" - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Vytvořte tým" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Budete moci pozvat později" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "31-50" - -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Pokračujte ve vytváření týmu" - -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Začněte bez týmu" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Později budete moci vytvořit tým." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Canva" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Odpojit" - -#: src/app/main/ui/dashboard/team.cljs -msgid "team.webhooks.max-length" -msgstr "Název webhooku musí obsahovat maximálně 2048 znaků." - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom" -msgstr "Přiblížení" - -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Upravit mřížku" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Odejít" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library-updates" -msgstr "AKTUALIZACE KNIHOVNY" - -msgid "workspace.options.component.swap" -msgstr "Vyměnit komponent" - -msgid "workspace.options.component.swap.empty" -msgstr "V této knihovně zatím nejsou žádné položky" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Flow" - -msgid "workspace.top-bar.read-only.done" -msgstr "Hotovo" - -msgid "media.image" -msgstr "Obrázek" - -msgid "media.solid" -msgstr "Plná" - -msgid "media.linear" -msgstr "Lineární" - -msgid "media.radial" -msgstr "Radiální" - -msgid "media.gradient" -msgstr "Přechod" - -msgid "media.choose-image" -msgstr "Vyberte obrázek" - -msgid "workspace.options.guides.title" -msgstr "Vodítka" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Při vytváření nového účtu souhlasíte s našimi [smluvními podmínkami](%s) a [" -"zásadami ochrany soukromí](%s)." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.copied-success" -msgstr "Zkopírovaný token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"Osobní přístupové tokeny fungují jako alternativa k našemu systému ověřování " -"přihlašovacích údajů/hesel a lze je použít k tomu, aby aplikaci umožnily " -"přístup k internímu rozhraní Penpot API" - -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Zdá se, že existuje nesoulad mezi povolenými funkcemi a funkcemi souboru, " -"který se pokoušíte otevřít. Před otevřením souboru je třeba provést migraci " -"pro '%s'." - -msgid "errors.validation" -msgstr "Chyba ověření" - -msgid "errors.paste-data-validation" -msgstr "Neplatná data ve schránce" - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Pokračovat bez týmu" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Vytvořte tým a pozvěte" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Adobe XD" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "Vývojář" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Figma" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "InVision" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "Zanechte zpětnou vazbu pro můj týmový projekt" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "Další" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "Jiné (upřesněte)" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "Pracuji na osobním projektu" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "Předchozí" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "Jak plánujete používat Penpot?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "Jaká je vaše role?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "Vyberte možnost" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "Jaká je velikost vašeho týmu?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "Vyzkoušejte Penpot, abyste zjistili, zda je vhodný pro tým " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"Vaše zpětná vazba nám pomůže porozumět vašim zvykům a preferencím, abychom " -"mohli i nadále dělat Penpot užitečným nástrojem." - -msgid "shortcuts.text-align-center" -msgstr "Zarovnat na střed" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Lokalizovat" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Hotovo" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "zobrazit všechny změny" - -msgid "workspace.options.component.annotation" -msgstr "Anotace" - -msgid "workspace.shape.menu.create-multiple-components" -msgstr "Vytvořte více komponent" - -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Režim kontroly** (Pouze zobrazení)" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Vaše knihovna je prázdná. Po přidání jako sdílená knihovna budou položky, " -"které vytvoříte, k dispozici pro použití se zbytkem vašich souborů. Opravdu " -"ji chcete publikovat?" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.copy-token" -msgstr "Kopírovat token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.label" -msgstr "Jméno" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.placeholder" -msgstr "Název může pomoci zjistit, k čemu token slouží" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.message" -msgstr "Opravdu chcete tento token smazat?" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.title" -msgstr "Smazat token" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "" -"Aktiva, která již byla v tomto souboru použita, tam zůstanou (nebude porušen " -"žádný návrh)." -msgstr[1] "" -"Aktiva, která již byla v těchto souborech použita, tam zůstanou (nebude " -"porušen žádný návrh)." -msgstr[2] "" -"Aktiva, která již byla v těchto souborech použita, tam zůstanou (nebude " -"porušen žádný návrh)." - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "Název musí obsahovat maximálně 250 znaků." - -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "Název musí obsahovat jiný znak než mezeru." - -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-not-empty" -msgstr "Heslo musí obsahovat jiný znak než mezeru." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.no-access-tokens" -msgstr "Zatím nemáte žádné tokeny." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "Přístupový token byl úspěšně vytvořen." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expires-on" -msgstr "Platnost vyprší %s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-60-days" -msgstr "60 dní" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "30 dní" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "180 dní" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-90-days" -msgstr "90 dní" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "Jméno je povinné" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-expire" -msgstr "Platnost tokenu vyprší %s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-not-expire" -msgstr "Token nemá žádné datum vypršení platnosti" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.access-tokens" -msgstr "Přístupové tokeny" - -msgid "workspace.options.component.edit-annotation" -msgstr "Upravit anotaci" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "Začněte pracovat na mém projektu" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "Žádný" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "... drátové modely, cesty a toky uživatelů, navigační stromy atd." - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.no-files-message" -msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "Není aktivován v žádném souboru." -msgstr[1] "Nejsou aktivovány v žádném souboru." -msgstr[2] "Nejsou aktivovány v žádném souboru." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "Generovat nový token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "" -"Pro vygenerování nového tokenu stiskněte tlačítko \"Vygenerovat nový token\"." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "Osobní přístupové tokeny" - -msgid "errors.cannot-upload" -msgstr "Nelze nahrát soubor médií." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.expiration-date.label" -msgstr "Datum vypršení platnosti" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.accept" -msgstr "Smazat token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.title" -msgstr "Vygenerujte přístupový token" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "Designer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Zakladatel / viceprezident" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "Pusťme se do toho!" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "Jsem freelancer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "Produktový nebo projektový manažer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Marketing" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "Více než 50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Sketch" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "Start" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "Před použitím Penpot on-premise si to vyzkoušejte" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "Práce v konceptech" - -msgid "shortcuts.select-parent-layer" -msgstr "Vybrat nadřazenou vrstvu" - -msgid "workspace.options.component.copy" -msgstr "Kopírovat" - -msgid "workspace.options.component.main" -msgstr "Hlavní" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Kruh" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Diamant" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Šipka" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Obdélník" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Trojúhelník" - -msgid "workspace.shape.menu.add-grid" -msgstr "Přidat rozvržení mřížky" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "Více informací" - -msgid "modals.delete-component-annotation.message" -msgstr "Opravdu chcete smazat tuto anotaci?" - -msgid "modals.delete-component-annotation.title" -msgstr "Smazat anotaci" - -msgid "modals.publish-empty-library.title" -msgstr "Publikovat prázdnou knihovnu" - -msgid "modals.publish-empty-library.accept" -msgstr "Publikovat" - -msgid "modals.publish-empty-library.message" -msgstr "Vaše knihovna je prázdná. Opravdu to chcete publikovat?" - -msgid "shortcuts.text-align-justify" -msgstr "Zarovnat do bloku" - -msgid "shortcuts.text-align-left" -msgstr "Zarovnat vlevo" - -msgid "shortcuts.text-align-right" -msgstr "Zarovnat vpravo" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "title.settings.access-tokens" -msgstr "Profil – Přístupové tokeny" - -msgid "workspace.assets.open-library" -msgstr "Otevřete soubor knihovny" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "Sdílená knihovna" - -#: src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.empty-palette" -msgstr "Ve vaší knihovně zatím nejsou žádné barevné styly" - -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "Ve vaší knihovně zatím nejsou žádné typografické styly" - -msgid "workspace.options.component.create-annotation" -msgstr "Vytvořte anotaci" - -msgid "workspace.shape.menu.create-annotation" -msgstr "Vytvořit anotaci" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "Jak byste nejlépe popsali své zkušenosti s prací na..." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "Zjistěte více o Penpot" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "Získejte kód z mého týmového projektu " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "...branding, ilustrace, marketing atd." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "Hodně" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "... design rozhraní, vizuální aktiva, návrhové systémy atd." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.some" -msgstr "Nějaké" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "S jakým designovým nástrojem máte více zkušeností?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "11-30" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "Student nebo učitel" - -msgid "workspace.layout_grid.editor.title" -msgstr "Úprava mřížky" - -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "K dispozici je nová verze, obnovte prosím stránku" diff --git a/frontend/translations/de.po b/frontend/translations/de.po index fe563da32..84195a044 100644 --- a/frontend/translations/de.po +++ b/frontend/translations/de.po @@ -1,15 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-01-23 15:01+0000\n" +"PO-Revision-Date: 2024-03-22 16:01+0000\n" "Last-Translator: Stas Haas \n" -"Language-Team: German \n" +"Language-Team: German " +"\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -178,10 +178,21 @@ msgstr "" "Wenn Sie ein neues Konto erstellen, stimmen Sie unseren Nutzungsbedingungen " "und Datenschutzrichtlinien zu." +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Wenn Sie ein neues Konto erstellen, stimmen Sie unseren " +"[Nutzungsbedingungen](%s) und [Datenschutzrichtlinien](%s) zu." + #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "Wir haben eine Bestätigungs-E-Mail gesendet an" +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...Branding, Illustrationen, Marketingmaterialien, usw." + msgid "common.publish" msgstr "Veröffentlichen" @@ -536,6 +547,11 @@ msgstr "Dateien importieren" msgid "dashboard.import.analyze-error" msgstr "Huch! Wir konnten diese Datei nicht importieren" +msgid "dashboard.import.analyze-error.components-v2" +msgstr "" +"Datei mit Komponenten v2 aktiviert, aber dieses Team unterstützt es noch " +"nicht." + msgid "dashboard.import.import-error" msgstr "" "Beim Importieren der Datei ist ein Fehler aufgetreten. Die Datei wurde " @@ -911,6 +927,13 @@ msgstr "" msgid "errors.feature-not-supported" msgstr "Die Funktion '%s' wird nicht unterstützt." +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Es scheint eine Nichtübereinstimmung zwischen den aktivierten Funktionen " +"und den Funktionen der Datei zu geben. Die Migrationen für '%s' müssen " +"durchgeführt werden, bevor die Datei geöffnet werden kann." + #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -963,6 +986,9 @@ msgstr "Bestätigungspasswort muss übereinstimmen" msgid "errors.password-too-short" msgstr "Das Passwort sollte mindestens 8 Zeichen lang sein" +msgid "errors.paste-data-validation" +msgstr "Ungültige Daten in der Zwischenablage" + msgid "errors.profile-blocked" msgstr "Das Profil ist gesperrt" @@ -978,6 +1004,10 @@ msgstr "" msgid "errors.registration-disabled" msgstr "Die Registrierung ist derzeit deaktiviert." +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Inkompatible Funktion '%s' erkannt" + msgid "errors.team-leave.insufficient-members" msgstr "" "Nicht genügend Mitglieder, um das Team zu verlassen, wahrscheinlich wollen " @@ -1001,6 +1031,13 @@ msgstr "Ein unerwarteter Fehler ist aufgetreten." msgid "errors.unexpected-token" msgstr "Unbekannter Token" +msgid "errors.validation" +msgstr "Validierungsfehler" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Die Datei hat eine inkompatible Versionsnummer" + msgid "errors.webhooks.connection" msgstr "Verbindungsfehler, URL ist nicht erreichbar" @@ -1235,6 +1272,9 @@ msgstr "Keine" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "Kapitälchen" +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Nicht gesetzt" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Großbuchstaben" @@ -1646,6 +1686,9 @@ msgstr "Rolle" msgid "labels.save" msgstr "Speichern" +msgid "labels.search" +msgstr "Suchen" + msgid "labels.search-font" msgstr "Schriftart suchen" @@ -1670,6 +1713,9 @@ msgstr "Service nicht verfügbar" msgid "labels.settings" msgstr "Einstellungen" +msgid "labels.share" +msgstr "Teilen" + #: src/app/main/ui/viewer/header.cljs, src/app/main/ui/viewer/header.cljs msgid "labels.share-prototype" msgstr "Prototyp teilen" @@ -1740,10 +1786,34 @@ msgstr "(Sie)" msgid "labels.your-account" msgstr "Ihr Konto" +msgid "media.choose-image" +msgstr "Bild auswählen" + +msgid "media.gradient" +msgstr "Verlauf" + +msgid "media.image" +msgstr "Bild" + +msgid "media.linear" +msgstr "Linear" + #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Bild laden…" +msgid "media.radial" +msgstr "Radial" + +msgid "media.solid" +msgstr "Einfarbig" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Ihre Bibliothek ist leer. Sobald es als Geteilte Bibliothek hinzugefügt " +"wurde, können die von Ihnen erstellten Assets in den übrigen Dateien " +"verwendet werden. Sind Sie sicher, dass Sie es veröffentlichen möchten?" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -1940,6 +2010,12 @@ msgid_plural "modals.delete-shared-confirm.accept" msgstr[0] "Datei löschen" msgstr[1] "Dateien löschen" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "Es ist in keiner Datei aktiviert." +msgstr[1] "Sie sind in keiner Datei aktiviert." + #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-shared-confirm.activated.scd-message" msgid_plural "modals.delete-shared-confirm.activated.scd-message" @@ -1986,6 +2062,16 @@ msgstr "Sind Sie sicher, dass Sie dieses Mitglied aus dem Team löschen möchten msgid "modals.delete-team-member-confirm.title" msgstr "Teammitglied löschen" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "" +"Assets, die bereits in dieser Datei verwendet wurden, bleiben dort erhalten " +"(das Design bleibt erhalten)." +msgstr[1] "" +"Assets, die bereits in diesen Dateien verwendet wurden, bleiben dort " +"erhalten (das Design bleibt erhalten)." + msgid "modals.delete-webhook.accept" msgstr "Webhook löschen" @@ -2258,7 +2344,7 @@ msgstr "" "Gegenwart und Zukunft mit der gesamten Community und dem Penpot-Kernteam." msgid "onboarding-v2.welcome.desc2.title" -msgstr "In der Community mitmachen" +msgstr "Mitwirkung in der Community" msgid "onboarding-v2.welcome.desc3" msgstr "" @@ -2271,12 +2357,33 @@ msgstr "Leitfaden für Mitwirkende" msgid "onboarding-v2.welcome.title" msgstr "Willkommen bei Penpot!" +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Mit der Erstellung eines Teams fortsetzen" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Ohne Team fortsetzen" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Team erstellen & einladen" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Team erstellen und Einladungen versenden" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Sie können später einladen" + msgid "onboarding.choice.team-up.create-team-desc" msgstr "Nach der Bennenung Ihres Teams, können Sie andere Personen einladen." msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "Geben Sie den Namen des Teams ein" +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Team erstellen" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Team ohne Einladungen erstellen" + msgid "onboarding.choice.team-up.invite-members" msgstr "Mitglieder einladen" @@ -2288,6 +2395,12 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Einladen mit der Rolle:" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Ohne Team starten" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Sie können später ein Team erstellen." + msgid "onboarding.newsletter.accept" msgstr "Ja, abonnieren" @@ -2339,102 +2452,269 @@ msgid "profile.recovery.go-to-login" msgstr "Zur Anmeldung" #: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "Los geht's!" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "settings.multiple" -msgstr "Mehrere" +msgid "question.design-tool-more-experienced-with" +msgstr "Mit welchem Design-Tool haben Sie mehr Erfahrung?" -# SECTIONS -msgid "shortcut-section.basics" -msgstr "Grundlagen" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" -msgid "shortcut-section.dashboard" -msgstr "Dashboard" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" -msgid "shortcut-section.viewer" -msgstr "Ansicht" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" -msgid "shortcut-section.workspace" -msgstr "Arbeitsbereich" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "Viel" -# SUBSECTIONS -msgid "shortcut-subsection.alignment" -msgstr "Ausrichtung" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" -msgid "shortcut-subsection.edit" -msgstr "Bearbeiten" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canva" -msgid "shortcut-subsection.general-dashboard" -msgstr "Allgemein" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "Wie würden Sie Ihre Erfahrungen bei der Arbeit an … am besten beschreiben?" -msgid "shortcut-subsection.general-viewer" -msgstr "Allgemein" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Designer" -msgid "shortcut-subsection.main-menu" -msgstr "Hauptmenü" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Developer" -msgid "shortcut-subsection.modify-layers" -msgstr "Ändern von Ebenen" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "Mehr über Penpot erfahren" -msgid "shortcut-subsection.navigation-dashboard" -msgstr "Navigation" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" -msgid "shortcut-subsection.navigation-viewer" -msgstr "Navigation" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Gründer/VP" -msgid "shortcut-subsection.navigation-workspace" -msgstr "Navigation" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Ich bin ein Freelancer" -msgid "shortcut-subsection.panels" -msgstr "Paneele" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Code aus meinem Teamprojekt erhalten " -msgid "shortcut-subsection.path-editor" -msgstr "Pfade" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... Interface-Design, visuelle Assets, Designsysteme usw." -msgid "shortcut-subsection.shape" -msgstr "Formen" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "InVision" -msgid "shortcut-subsection.text-editor" -msgstr "Texte" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Feedback für mein Team-Projekt hinterlassen" -msgid "shortcut-subsection.tools" -msgstr "Werkzeuge" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "Los geht's!" -msgid "shortcut-subsection.zoom-viewer" -msgstr "Zoom" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Produkt- oder Projektmanager" -msgid "shortcut-subsection.zoom-workspace" -msgstr "Zoom" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Marketing" -msgid "shortcuts.add-comment" -msgstr "Kommentare" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "Mehr als 50" -msgid "shortcuts.add-node" -msgstr "Punkt hinzufügen" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Weiter" -msgid "shortcuts.align-bottom" -msgstr "Unten ausrichten" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Keine" -msgid "shortcuts.align-center" -msgstr "Zentrieren" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Sonstiges (bitte angeben)" -msgid "shortcuts.align-hcenter" -msgstr "Horizontal zentrieren" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "Ich arbeite an einem persönlichen Projekt" -msgid "shortcuts.align-justify" -msgstr "Blocksatz" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "Zurück" -msgid "shortcuts.align-left" -msgstr "Linksbündig ausrichten" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Wie wollen Sie Penpot nutzen?" -msgid "shortcuts.align-right" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Was ist Ihre Rolle?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Wählen Sie eine Option" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Sketch" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Einige" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Start" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Mit der Arbeit an meinem Projekt beginnen" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Schüler oder Lehrer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "Wie groß ist Ihr Team?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Testen Sie Penpot, um zu sehen, ob es für das Team geeignet ist " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Testen Sie Penpot, bevor Sie es auf einem eigenen Server verwenden" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "... Wireframes, User Journeys & Flows, Navigationsbäume usw." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Arbeiten an Konzeptideen" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Ihr Feedback wird uns helfen, Ihre Gewohnheiten und Vorlieben zu verstehen, " +"damit wir Penpot weiterhin zu einem nützlichen und angenehmen Werkzeug " +"machen können." + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Trennen" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "settings.multiple" +msgstr "Mehrere" + +# SECTIONS +msgid "shortcut-section.basics" +msgstr "Grundlagen" + +msgid "shortcut-section.dashboard" +msgstr "Dashboard" + +msgid "shortcut-section.viewer" +msgstr "Ansicht" + +msgid "shortcut-section.workspace" +msgstr "Arbeitsbereich" + +# SUBSECTIONS +msgid "shortcut-subsection.alignment" +msgstr "Ausrichtung" + +msgid "shortcut-subsection.edit" +msgstr "Bearbeiten" + +msgid "shortcut-subsection.general-dashboard" +msgstr "Allgemein" + +msgid "shortcut-subsection.general-viewer" +msgstr "Allgemein" + +msgid "shortcut-subsection.main-menu" +msgstr "Hauptmenü" + +msgid "shortcut-subsection.modify-layers" +msgstr "Ändern von Ebenen" + +msgid "shortcut-subsection.navigation-dashboard" +msgstr "Navigation" + +msgid "shortcut-subsection.navigation-viewer" +msgstr "Navigation" + +msgid "shortcut-subsection.navigation-workspace" +msgstr "Navigation" + +msgid "shortcut-subsection.panels" +msgstr "Paneele" + +msgid "shortcut-subsection.path-editor" +msgstr "Pfade" + +msgid "shortcut-subsection.shape" +msgstr "Formen" + +msgid "shortcut-subsection.text-editor" +msgstr "Texte" + +msgid "shortcut-subsection.tools" +msgstr "Werkzeuge" + +msgid "shortcut-subsection.zoom-viewer" +msgstr "Zoom" + +msgid "shortcut-subsection.zoom-workspace" +msgstr "Zoom" + +msgid "shortcuts.add-comment" +msgstr "Kommentare" + +msgid "shortcuts.add-node" +msgstr "Punkt hinzufügen" + +msgid "shortcuts.align-bottom" +msgstr "Unten ausrichten" + +msgid "shortcuts.align-center" +msgstr "Zentrieren" + +msgid "shortcuts.align-hcenter" +msgstr "Horizontal zentrieren" + +msgid "shortcuts.align-justify" +msgstr "Blocksatz" + +msgid "shortcuts.align-left" +msgstr "Linksbündig ausrichten" + +msgid "shortcuts.align-right" msgstr "Rechtsbündig ausrichten" msgid "shortcuts.align-top" @@ -2798,6 +3078,9 @@ msgstr "Lineale ein-/ausblenden" msgid "shortcuts.toggle-textpalette" msgstr "Textpalette ein-/ausblenden" +msgid "shortcuts.toggle-theme" +msgstr "Theme ändern" + msgid "shortcuts.toggle-visibility" msgstr "Elemente ein-/ausblenden" @@ -3085,6 +3368,10 @@ msgid_plural "workspace.assets.selected-count" msgstr[0] "%s Element ausgewählt" msgstr[1] "%s Elemente ausgewählt" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "Geteilte Bibliothek" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" @@ -3131,6 +3418,45 @@ msgstr "Texttransformation" msgid "workspace.assets.ungroup" msgstr "Gruppierung aufheben" +msgid "workspace.context-menu.grid-cells.area" +msgstr "Bereich erstellen" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Board erstellen" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Zellen zusammenführen" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "1 Spalte rechts einfügen" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "1 Spalte links einfügen" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Spalte löschen" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Spalte und Formen löschen" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Spalte duplizieren" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "1 Zeile unterhalb einfügen" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "1 Zeile oberhalb einfügen" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Zeile löschen" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Zeile und Formen löschen" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Zeile duplizieren" + msgid "workspace.focus.focus-mode" msgstr "Fokus-Modus" @@ -3254,6 +3580,12 @@ msgstr "Lineale einblenden" msgid "workspace.header.menu.show-textpalette" msgstr "Schriftartenpalette anzeigen" +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Zum dunklen Theme wechseln" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "Zum hellen Theme wechseln" + msgid "workspace.header.menu.undo" msgstr "Rückgängig" @@ -3305,6 +3637,21 @@ msgstr "Vollbild" msgid "workspace.header.zoom-selected" msgstr "Zur Auswahl zoomen" +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Grid bearbeiten" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Beenden" + +msgid "workspace.layout_grid.editor.title" +msgstr "Raster bearbeiten" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Fertig" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Lokalisieren" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Hinzufügen" @@ -3375,6 +3722,10 @@ msgstr "BIBLIOTHEK" msgid "workspace.libraries.library-updates" msgstr "AKTUALISIERUNGEN DER BIBLIOTHEK" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Laden…" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "" @@ -3451,12 +3802,24 @@ msgstr "Komponente" msgid "workspace.options.component.annotation" msgstr "Anmerkung" +msgid "workspace.options.component.copy" +msgstr "Kopie" + msgid "workspace.options.component.create-annotation" msgstr "Eine Anmerkung erstellen" msgid "workspace.options.component.edit-annotation" msgstr "Eine Anmerkung bearbeiten" +msgid "workspace.options.component.main" +msgstr "Hauptkomponente" + +msgid "workspace.options.component.swap" +msgstr "Komponente austauschen" + +msgid "workspace.options.component.swap.empty" +msgstr "Es gibt noch keine Assets in dieser Bibliothek" + #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Beschränkungen" @@ -3550,6 +3913,10 @@ msgstr "Fläche" msgid "workspace.options.flows.add-flow-start" msgstr "Flow-Startpunkt hinzufügen" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Flow" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "Flow-Startpunkt" @@ -3653,6 +4020,9 @@ msgstr "Gruppe füllen" msgid "workspace.options.group-stroke" msgstr "Gruppe einrahmen" +msgid "workspace.options.guides.title" +msgstr "Hilfslinien" + msgid "workspace.options.height" msgstr "Höhe" @@ -4201,14 +4571,26 @@ msgstr "Rahmen" msgid "workspace.options.stroke-cap.circle-marker" msgstr "Punkt" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Kreis" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "Diamant-Marker" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Diamant" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "Pfeil" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Pfeil" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "Keine" @@ -4225,10 +4607,18 @@ msgstr "Rechteckig" msgid "workspace.options.stroke-cap.square-marker" msgstr "Quadrat" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Rechteck" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "Dreieckiger Pfeil" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Dreieck" + msgid "workspace.options.stroke-color" msgstr "Konturfarbe" @@ -4701,6 +5091,13 @@ msgstr "Text (%s)" msgid "workspace.toolbar.text-palette" msgstr "Typografien (%s)" +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**Inspektionsmodus** (nur Ansicht)" + +msgid "workspace.top-bar.read-only.done" +msgstr "Fertig" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Es gibt bisher keine Änderungen im Verlauf" @@ -4834,344 +5231,3 @@ msgstr "Aktualisieren" msgid "workspace.viewport.click-to-close-path" msgstr "Klicken Sie, um den Pfad zu schließen" - -msgid "workspace.options.component.copy" -msgstr "Kopieren" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "Developer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "Produkt- oder Projektmanager" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Marketing" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "Ich arbeite an einem persönlichen Projekt" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Rechteck" - -msgid "workspace.options.component.main" -msgstr "Main" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "Ich bin ein Freelancer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Figma" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "...Branding, Illustrationen, Marketingmaterialien, usw." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.some" -msgstr "Einige" - -msgid "workspace.layout_grid.editor.title" -msgstr "Raster bearbeiten" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "Mehr als 50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "Weiter" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "Wie groß ist Ihr Team?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "... Wireframes, User Journeys & Flows, Navigationsbäume usw." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "Viel" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "Start" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Diamant" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "Wie wollen Sie Penpot nutzen?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "Wählen Sie eine Option" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "Designer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "Keine" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Adobe XD" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Trennen" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Sketch" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Dreieck" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.no-files-message" -msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "Es ist in keiner Datei aktiviert." -msgstr[1] "Sie sind in keiner Datei aktiviert." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "Sonstiges (bitte angeben)" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "Testen Sie Penpot, um zu sehen, ob es für das Team geeignet ist " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "Schüler oder Lehrer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "Feedback für mein Team-Projekt hinterlassen" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "31-50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "InVision" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Canva" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "Mehr über Penpot erfahren" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "Zurück" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "Mit der Arbeit an meinem Projekt beginnen" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Pfeil" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "Mit welchem Design-Tool haben Sie mehr Erfahrung?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "Was ist Ihre Rolle?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Gründer/VP" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Kreis" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "11-30" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "... Interface-Design, visuelle Assets, Designsysteme usw." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "Arbeiten an Konzeptideen" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"Ihr Feedback wird uns helfen, Ihre Gewohnheiten und Vorlieben zu verstehen, " -"damit wir Penpot weiterhin zu einem nützlichen und angenehmen Werkzeug " -"machen können." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "" -"Wie würden Sie Ihre Erfahrungen bei der Arbeit an … am besten beschreiben?" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "Geteilte Bibliothek" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "Testen Sie Penpot, bevor Sie es auf einem eigenen Server verwenden" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "Code aus meinem Teamprojekt erhalten " - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "" -"Assets, die bereits in dieser Datei verwendet wurden, bleiben dort erhalten (" -"das Design bleibt erhalten)." -msgstr[1] "" -"Assets, die bereits in diesen Dateien verwendet wurden, bleiben dort " -"erhalten (das Design bleibt erhalten)." - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Ihre Bibliothek ist leer. Sobald es als Geteilte Bibliothek hinzugefügt " -"wurde, können die von Ihnen erstellten Assets in den übrigen Dateien " -"verwendet werden. Sind Sie sicher, dass Sie es veröffentlichen möchten?" - -msgid "media.radial" -msgstr "Radial" - -msgid "workspace.top-bar.read-only.done" -msgstr "Fertig" - -msgid "media.image" -msgstr "Bild" - -msgid "media.linear" -msgstr "Linear" - -msgid "media.gradient" -msgstr "Verlauf" - -msgid "media.solid" -msgstr "Einfarbig" - -msgid "media.choose-image" -msgstr "Bild auswählen" - -msgid "workspace.options.guides.title" -msgstr "Hilfslinien" - -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Inspektionsmodus** (nur Ansicht)" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Die Datei hat eine inkompatible Versionsnummer" - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Inkompatible Funktion '%s' erkannt" - -msgid "errors.validation" -msgstr "Validierungsfehler" - -msgid "errors.paste-data-validation" -msgstr "Ungültige Daten in der Zwischenablage" - -msgid "labels.search" -msgstr "Suchen" - -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Ohne Team starten" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Sie können später ein Team erstellen." - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Ohne Team fortsetzen" - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Team erstellen und Einladungen versenden" - -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Mit der Erstellung eines Teams fortsetzen" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Team ohne Einladungen erstellen" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Team erstellen & einladen" - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Team erstellen" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Sie können später einladen" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Fertig" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Beenden" - -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Grid bearbeiten" - -msgid "workspace.options.component.swap" -msgstr "Komponente austauschen" - -msgid "workspace.options.component.swap.empty" -msgstr "Es gibt noch keine Assets in dieser Bibliothek" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Wenn Sie ein neues Konto erstellen, stimmen Sie unseren " -"[Nutzungsbedingungen](%s) und [Datenschutzrichtlinien](%s) zu." - -msgid "labels.share" -msgstr "Teilen" - -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Nicht gesetzt" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Lokalisieren" - -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Es scheint eine Nichtübereinstimmung zwischen den aktivierten Funktionen und " -"den Funktionen der Datei zu geben. Die Migrationen für '%s' müssen " -"durchgeführt werden, bevor die Datei geöffnet werden kann." - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Flow" diff --git a/frontend/translations/en.po b/frontend/translations/en.po index 747704c55..1dffa2c85 100644 --- a/frontend/translations/en.po +++ b/frontend/translations/en.po @@ -49,6 +49,10 @@ msgstr "Forgot password?" msgid "auth.fullname" msgstr "Full Name" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "Log into my account" + #: src/app/main/ui/auth/register.cljs msgid "auth.login-here" msgstr "Login here" @@ -57,10 +61,6 @@ msgstr "Login here" msgid "auth.login-submit" msgstr "Login" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-account-title" -msgstr "Log into my account" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-tagline" msgstr "Penpot is the free open-source design tool for Design and Code collaboration" @@ -171,15 +171,17 @@ msgstr "The open-source solution for design and prototyping." msgid "auth.terms-of-service" msgstr "Terms of service" +msgid "auth.terms-privacy-agreement" +msgstr "" +"When creating a new account, you agree to ourf terms of service and privacy " +"policy." + #: src/app/main/ui/auth/register.cljs #, markdown msgid "auth.terms-privacy-agreement-md" msgstr "" -"When creating a new account, you agree to our [terms of service](%s) and [privacy policy](%s)." - -msgid "auth.terms-privacy-agreement" -msgstr "" -"When creating a new account, you agree to ourf terms of service and privacy policy." +"When creating a new account, you agree to our [terms of service](%s) and " +"[privacy policy](%s)." #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" @@ -838,6 +840,10 @@ msgstr "Ok" msgid "ds.confirm-title" msgstr "Are you sure?" +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "Auth provider not allowed for this profile" + #: src/app/main/ui/auth/login.cljs msgid "errors.auth-provider-not-configured" msgstr "Authentication provider not configured." @@ -869,6 +875,10 @@ msgstr "Email already validated." msgid "errors.email-as-password" msgstr "You can't use your email as password" +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "Domain not allowed" + #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.email-has-permanent-bounces" msgstr "The email «%s» has many permanent bounce reports." @@ -887,28 +897,19 @@ msgstr "The email «%s» has been reported as spam or permanently bounce." #: src/app/main/errors.cljs msgid "errors.feature-mismatch" msgstr "" -"Looks like you are opening a file that has the feature '%s' enabled but " -"the current penpot version does not supports it or has it disabled." +"Looks like you are opening a file that has the feature '%s' enabled but the " +"current penpot version does not supports it or has it disabled." #: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "" -"File has an incompatible version number" +msgid "errors.feature-not-supported" +msgstr "Feature '%s' is not supported." #: src/app/main/errors.cljs msgid "errors.file-feature-mismatch" msgstr "" "It seems that there is a mismatch between the enabled features and the " -"features of the file you are trying to open. Migrations for '%s' need " -"to be applied before the file can be opened." - -#: src/app/main/errors.cljs -msgid "errors.feature-not-supported" -msgstr "Feature '%s' is not supported." - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Detected incompatible feature '%s'" +"features of the file you are trying to open. Migrations for '%s' need to be " +"applied before the file can be opened." #: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -957,6 +958,9 @@ msgstr "Confirmation password must match" msgid "errors.password-too-short" msgstr "Password should at least be 8 characters" +msgid "errors.paste-data-validation" +msgstr "Invalid data in clipboard" + msgid "errors.profile-blocked" msgstr "The profile is blocked" @@ -968,13 +972,9 @@ msgstr "Your profile has emails muted (spam reports or high bounces)." msgid "errors.registration-disabled" msgstr "The registration is currently disabled." -#: src/app/main/data/users.cljs -msgid "errors.auth-provider-not-allowed" -msgstr "Auth provider not allowed for this profile" - -#: src/app/main/data/users.cljs -msgid "errors.email-domain-not-allowed" -msgstr "Domain not allowed" +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Detected incompatible feature '%s'" msgid "errors.team-leave.insufficient-members" msgstr "Insufficient members to leave team, you probably want to delete it." @@ -993,6 +993,13 @@ msgstr "An unexpected error occurred." msgid "errors.unexpected-token" msgstr "Unknown token" +msgid "errors.validation" +msgstr "Validation Error" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "File has an incompatible version number" + msgid "errors.webhooks.connection" msgstr "Connection error, URL not reacheable" @@ -1022,13 +1029,6 @@ msgstr "Email or password is incorrect." msgid "errors.wrong-old-password" msgstr "Old password is incorrect" -msgid "errors.validation" -msgstr "Validation Error" - -msgid "errors.paste-data-validation" -msgstr "Invalid data in clipboard" - - #: src/app/main/ui/settings/feedback.cljs msgid "feedback.description" msgstr "Description" @@ -1232,12 +1232,12 @@ msgstr "Lower Case" msgid "inspect.attributes.typography.text-transform.none" msgstr "None" -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Unset" - msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "Title Case" +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Unset" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Upper Case" @@ -1626,6 +1626,9 @@ msgstr "Role" msgid "labels.save" msgstr "Save" +msgid "labels.search" +msgstr "Search" + msgid "labels.search-font" msgstr "Search font" @@ -1649,12 +1652,12 @@ msgstr "Service Unavailable" msgid "labels.settings" msgstr "Settings" -msgid "labels.share-prototype" -msgstr "Share prototype" - msgid "labels.share" msgstr "Share" +msgid "labels.share-prototype" +msgstr "Share prototype" + #: src/app/main/ui/dashboard/sidebar.cljs msgid "labels.shared-libraries" msgstr "Libraries" @@ -1721,13 +1724,34 @@ msgstr "(you)" msgid "labels.your-account" msgstr "Your account" -msgid "labels.search" -msgstr "Search" +msgid "media.choose-image" +msgstr "Choose image" + +msgid "media.gradient" +msgstr "Gradient" + +msgid "media.image" +msgstr "Image" + +msgid "media.image.short" +msgstr "img" + +msgid "media.keep-aspect-ratio" +msgstr "Keep aspect ratio" + +msgid "media.linear" +msgstr "Linear" #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Loading image…" +msgid "media.radial" +msgstr "Radial" + +msgid "media.solid" +msgstr "Solid" + msgid "modals.add-shared-confirm-empty.hint" msgstr "" "Your library is empty. Once added as Shared Library, the assets you create " @@ -2058,6 +2082,21 @@ msgstr "Are you sure you want to leave this team?" msgid "modals.leave-confirm.title" msgstr "Leaving team" +msgid "modals.move-shared-confirm.accept" +msgid_plural "modals.move-shared-confirm.accept" +msgstr[0] "Move" +msgstr[1] "Move" + +msgid "modals.move-shared-confirm.message" +msgid_plural "modals.move-shared-confirm.message" +msgstr[0] "Are you sure you want to move this library?" +msgstr[1] "Are you sure you want to move these libraries?" + +msgid "modals.move-shared-confirm.title" +msgid_plural "modals.move-shared-confirm.title" +msgstr[0] "Move library" +msgstr[1] "Move libraries" + #: src/app/main/ui/workspace/nudge.cljs msgid "modals.nudge-title" msgstr "Nudge amount" @@ -2115,33 +2154,18 @@ msgid_plural "modals.unpublish-shared-confirm.accept" msgstr[0] "Unpublish" msgstr[1] "Unpublish" -msgid "modals.move-shared-confirm.accept" -msgid_plural "modals.move-shared-confirm.accept" -msgstr[0] "Move" -msgstr[1] "Move" - #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.message" msgid_plural "modals.unpublish-shared-confirm.message" msgstr[0] "Are you sure you want to unpublish this library?" msgstr[1] "Are you sure you want to unpublish these libraries?" -msgid "modals.move-shared-confirm.message" -msgid_plural "modals.move-shared-confirm.message" -msgstr[0] "Are you sure you want to move this library?" -msgstr[1] "Are you sure you want to move these libraries?" - #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.title" msgid_plural "modals.unpublish-shared-confirm.title" msgstr[0] "Unpublish library" msgstr[1] "Unpublish libraries" -msgid "modals.move-shared-confirm.title" -msgid_plural "modals.move-shared-confirm.title" -msgstr[0] "Move library" -msgstr[1] "Move libraries" - #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs msgid "modals.update-remote-component-in-bulk.hint" msgstr "" @@ -2260,38 +2284,32 @@ msgstr "Contributing guide" msgid "onboarding-v2.welcome.title" msgstr "Welcome to Penpot!" -msgid "onboarding.choice.team-up.create-team-desc" -msgstr "After naming your team, you will be able to invite people to join." - -msgid "onboarding.choice.team-up.create-team-placeholder" -msgstr "Enter the name of the team" - msgid "onboarding.choice.team-up.continue-creating-team" msgstr "Continue creating team" -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Start without a team" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "You will be able to create a team later." - msgid "onboarding.choice.team-up.continue-without-a-team" msgstr "Continue without team" +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Create team & invite" + msgid "onboarding.choice.team-up.create-team-and-send-invites" msgstr "Create team and send invites" -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Create team without inviting" +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "You'll be able to invite later" -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Create team & invite" +msgid "onboarding.choice.team-up.create-team-desc" +msgstr "After naming your team, you will be able to invite people to join." + +msgid "onboarding.choice.team-up.create-team-placeholder" +msgstr "Enter the name of the team" msgid "onboarding.choice.team-up.create-team-without-invite" msgstr "Create team" -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "You'll be able to invite later" +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Create team without inviting" msgid "onboarding.choice.team-up.invite-members" msgstr "Invite members" @@ -2304,6 +2322,12 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Invite with the role:" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Start without a team" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "You will be able to create a team later." + msgid "onboarding.newsletter.accept" msgstr "Yes, subscribe" @@ -2321,9 +2345,6 @@ msgstr "Want to receive Penpot news?" msgid "onboarding.team-modal.create-team" msgstr "Create a team" -msgid "onboarding.team-modal.team-definition" -msgstr "What's a team?" - msgid "onboarding.team-modal.create-team-desc" msgstr "" "A team allows you to collaborate with other Penpot users working in the " @@ -2344,6 +2365,9 @@ msgstr "Unlimited members" msgid "onboarding.team-modal.create-team-feature-5" msgstr "100% free!" +msgid "onboarding.team-modal.team-definition" +msgstr "What's a team?" + msgid "onboarding.templates.subtitle" msgstr "Here are some templates." @@ -2892,6 +2916,9 @@ msgstr "Redo" msgid "shortcuts.reset-zoom" msgstr "Reset zoom" +msgid "shortcuts.scale" +msgstr "Scale" + msgid "shortcuts.search-placeholder" msgstr "Search shortcuts" @@ -2977,6 +3004,9 @@ msgstr "Toggle layers" msgid "shortcuts.toggle-layout-flex" msgstr "Add / Remove flex layout" +msgid "shortcuts.toggle-layout-grid" +msgstr "Add/remove grid layout" + msgid "shortcuts.toggle-lock" msgstr "Lock / Unlock" @@ -2986,9 +3016,6 @@ msgstr "Lock proportions" msgid "shortcuts.toggle-rulers" msgstr "Show / Hide rulers" -msgid "shortcuts.scale" -msgstr "Scale" - msgid "shortcuts.toggle-snap-guides" msgstr "Snap to guides" @@ -3031,9 +3058,6 @@ msgstr "Zoom lense increase" msgid "shortcuts.zoom-selected" msgstr "Zoom to selected" -msgid "shortcuts.toggle-layout-grid" -msgstr "Add/remove grid layout" - #: src/app/main/ui/dashboard/team.cljs msgid "team.webhooks.max-length" msgstr "The webhook name must contain at most 2048 characters." @@ -3236,6 +3260,10 @@ msgstr "Duplicate main" msgid "workspace.assets.edit" msgstr "Edit" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.filter" +msgstr "Filter" + #: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.graphics" msgstr "Graphics" @@ -3274,14 +3302,6 @@ msgstr "Rename group" msgid "workspace.assets.search" msgstr "Search assets" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.filter" -msgstr "Filter" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.sort" -msgstr "Sort" - #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.selected-count" msgid_plural "workspace.assets.selected-count" @@ -3292,6 +3312,16 @@ msgstr[1] "%s items selected" msgid "workspace.assets.shared-library" msgstr "Shared library" +#: src/app/main/ui/workspace/sidebar/assets/common.cljs +msgid "workspace.assets.sidebar.components" +msgid_plural "workspace.assets.sidebar.components" +msgstr[0] "1 component" +msgstr[1] "%s components" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "Sort" + #: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" msgstr "Typographies" @@ -3335,6 +3365,45 @@ msgstr "Text Transform" msgid "workspace.assets.ungroup" msgstr "Ungroup" +msgid "workspace.context-menu.grid-cells.area" +msgstr "Create area" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Create board" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Merge cells" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Add 1 column to the right" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Add 1 column to the left" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Delete column" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Delete column and shapes" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Duplicate column" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Add 1 row below" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Add 1 row above" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Delete row" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Delete row and shapes" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Duplicate row" + msgid "workspace.focus.focus-mode" msgstr "Focus mode" @@ -3370,13 +3439,13 @@ msgstr "Disable scale text" msgid "workspace.header.menu.disable-snap-guides" msgstr "Disable snap to guides" +msgid "workspace.header.menu.disable-snap-pixel-grid" +msgstr "Disable snap to pixel" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-snap-ruler-guides" msgstr "Disable snap to ruler guides" -msgid "workspace.header.menu.disable-snap-pixel-grid" -msgstr "Disable snap to pixel" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-dynamic-alignment" msgstr "Enable dynamic alignment" @@ -3392,13 +3461,13 @@ msgstr "Enable scale text" msgid "workspace.header.menu.enable-snap-guides" msgstr "Snap to guides" +msgid "workspace.header.menu.enable-snap-pixel-grid" +msgstr "Enable snap to pixel" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-ruler-guides" msgstr "Snap to ruler guides" -msgid "workspace.header.menu.enable-snap-pixel-grid" -msgstr "Enable snap to pixel" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-artboard-names" msgstr "Hide board names" @@ -3472,14 +3541,14 @@ msgstr "Show rulers" msgid "workspace.header.menu.show-textpalette" msgstr "Show fonts palette" -msgid "workspace.header.menu.undo" -msgstr "Undo" +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Switch to dark theme" msgid "workspace.header.menu.toggle-light-theme" msgstr "Switch to light theme" -msgid "workspace.header.menu.toggle-dark-theme" -msgstr "Switch to dark theme" +msgid "workspace.header.menu.undo" +msgstr "Undo" #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.reset-zoom" @@ -3529,18 +3598,6 @@ msgstr "Full screen" msgid "workspace.header.zoom-selected" msgstr "Zoom to selected" -msgid "workspace.layout_grid.editor.title" -msgstr "Editing grid" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Locate" - -msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" -msgstr "Locate grid layout" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Done" - msgid "workspace.layout_grid.editor.options.edit-grid" msgstr "Edit grid" @@ -3550,6 +3607,18 @@ msgstr "Exit" msgid "workspace.layout_grid.editor.padding.expand" msgstr "Show 4 sided padding options" +msgid "workspace.layout_grid.editor.title" +msgstr "Editing grid" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Done" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Locate" + +msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" +msgstr "Locate grid layout" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Add" @@ -3618,6 +3687,10 @@ msgstr "LIBRARY" msgid "workspace.libraries.library-updates" msgstr "LIBRARY UPDATES" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Loading…" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "There are no Shared Libraries that need update" @@ -3642,14 +3715,6 @@ msgstr "SHARED LIBRARIES" msgid "workspace.libraries.shared-library-btn" msgstr "Connect library" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.unlink-library-btn" -msgstr "Disconnect library" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.loading" -msgstr "Loading…" - #: src/app/main/ui/workspace/sidebar/options/menus/text.cljs msgid "workspace.libraries.text.multiple-typography" msgstr "Multiple typographies" @@ -3662,6 +3727,10 @@ msgstr "Unlink all typographies" msgid "workspace.libraries.typography" msgstr "%s typographies" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.unlink-library-btn" +msgstr "Disconnect library" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.update" msgstr "Update" @@ -3722,12 +3791,6 @@ msgstr "Swap component" msgid "workspace.options.component.swap.empty" msgstr "There are no assets in this library yet" -#: src/app/main/ui/workspace/sidebar/assets/common.cljs -msgid "workspace.assets.sidebar.components" -msgid_plural "workspace.assets.sidebar.components" -msgstr[0] "1 component" -msgstr[1] "%s components" - #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Constraints" @@ -3921,6 +3984,9 @@ msgstr "Group fill" msgid "workspace.options.group-stroke" msgstr "Group stroke" +msgid "workspace.options.guides.title" +msgstr "Guides" + msgid "workspace.options.height" msgstr "Height" @@ -4969,6 +5035,13 @@ msgstr "Text (%s)" msgid "workspace.toolbar.text-palette" msgstr "Typographies (%s)" +msgid "workspace.top-bar.read-only.done" +msgstr "Done" + +#, markdown +msgid "workspace.top-bar.view-only" +msgstr "**Inspecting code** (View Only)" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "There are no history changes so far" @@ -5102,77 +5175,3 @@ msgstr "Update" msgid "workspace.viewport.click-to-close-path" msgstr "Click to close the path" - -#, markdown -msgid "workspace.top-bar.view-only" -msgstr "**Inspecting code** (View Only)" - -msgid "workspace.top-bar.read-only.done" -msgstr "Done" - -msgid "media.image" -msgstr "Image" - -msgid "media.image.short" -msgstr "img" - -msgid "media.solid" -msgstr "Solid" - -msgid "media.linear" -msgstr "Linear" - -msgid "media.radial" -msgstr "Radial" - -msgid "media.gradient" -msgstr "Gradient" - -msgid "media.choose-image" -msgstr "Choose image" - -msgid "media.keep-aspect-ratio" -msgstr "Keep aspect ratio" - -msgid "workspace.options.guides.title" -msgstr "Guides" - -msgid "workspace.context-menu.grid-track.column.duplicate" -msgstr "Duplicate column" - -msgid "workspace.context-menu.grid-track.column.add-before" -msgstr "Add 1 column to the left" - -msgid "workspace.context-menu.grid-track.column.add-after" -msgstr "Add 1 column to the right" - -msgid "workspace.context-menu.grid-track.column.delete" -msgstr "Delete column" - -msgid "workspace.context-menu.grid-track.column.delete-shapes" -msgstr "Delete column and shapes" - -msgid "workspace.context-menu.grid-track.row.duplicate" -msgstr "Duplicate row" - -msgid "workspace.context-menu.grid-track.row.add-before" -msgstr "Add 1 row above" - -msgid "workspace.context-menu.grid-track.row.add-after" -msgstr "Add 1 row below" - -msgid "workspace.context-menu.grid-track.row.delete" -msgstr "Delete row" - -msgid "workspace.context-menu.grid-track.row.delete-shapes" -msgstr "Delete row and shapes" - -msgid "workspace.context-menu.grid-cells.merge" -msgstr "Merge cells" - -msgid "workspace.context-menu.grid-cells.area" -msgstr "Create area" - -msgid "workspace.context-menu.grid-cells.create-board" -msgstr "Create board" - diff --git a/frontend/translations/es.po b/frontend/translations/es.po index 9c52e4a47..ff0bc53de 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-01-25 12:01+0000\n" "Last-Translator: Yessenia Villarte Vaca \n" -"Language-Team: Spanish \n" +"Language-Team: Spanish " +"\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -52,6 +52,10 @@ msgstr "¿Olvidaste tu contraseña?" msgid "auth.fullname" msgstr "Nombre completo" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "Entrar en mi cuenta" + #: src/app/main/ui/auth/register.cljs msgid "auth.login-here" msgstr "Inicia sesión aquí" @@ -60,13 +64,11 @@ msgstr "Inicia sesión aquí" msgid "auth.login-submit" msgstr "Entrar" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-account-title" -msgstr "Entrar en mi cuenta" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-tagline" -msgstr "Penpot es la herramienta de diseño libre y open-source para la colaboración entre Diseño y Código" +msgstr "" +"Penpot es la herramienta de diseño libre y open-source para la colaboración " +"entre Diseño y Código" #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" @@ -176,15 +178,17 @@ msgstr "La solución de código abierto para diseñar y prototipar." msgid "auth.terms-of-service" msgstr "Términos de servicio" +msgid "auth.terms-privacy-agreement" +msgstr "" +"Al crear una nueva cuenta, aceptas nuestros [términos de servicio](%s) y " +"[política de privacidad](%s)." + #: src/app/main/ui/auth/register.cljs #, markdown msgid "auth.terms-privacy-agreement-md" msgstr "" -"Al crear una nueva cuenta, aceptas nuestros [términos de servicio](%s) y [política de privacidad](%s)." - -msgid "auth.terms-privacy-agreement" -msgstr "" -"Al crear una nueva cuenta, aceptas nuestros [términos de servicio](%s) y [política de privacidad](%s)." +"Al crear una nueva cuenta, aceptas nuestros [términos de servicio](%s) y " +"[política de privacidad](%s)." #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" @@ -547,7 +551,9 @@ msgid "dashboard.import.analyze-error" msgstr "¡Vaya! No hemos podido importar el fichero" msgid "dashboard.import.analyze-error.components-v2" -msgstr "Fichero exportado con componentes-v2 pero el equipo actual no lo soporta aún." +msgstr "" +"Fichero exportado con componentes-v2 pero el equipo actual no lo soporta " +"aún." msgid "dashboard.import.import-error" msgstr "Hubo un problema importando el fichero. No ha podido ser importado." @@ -857,6 +863,10 @@ msgstr "Ok" msgid "ds.confirm-title" msgstr "¿Está Seguro?" +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "El proveedor de autenticación no permitido para este perfil de usuario" + #: src/app/main/ui/auth/login.cljs msgid "errors.auth-provider-not-configured" msgstr "Proveedor de autenticación no configurado." @@ -889,6 +899,10 @@ msgstr "Este correo ya está validado." msgid "errors.email-as-password" msgstr "No puedes usar tu correo electrónico como contraseña" +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "Dominio no permitido" + #: src/app/main/ui/auth/register.cljs, #: src/app/main/ui/auth/recovery_request.cljs, #: src/app/main/ui/settings/change_email.cljs, @@ -913,6 +927,10 @@ msgstr "" "Parece que está abriendo un archivo que tiene la función '%s' habilitada, " "pero la versión actual de penpot no la admite o la tiene deshabilitada." +#: src/app/main/errors.cljs +msgid "errors.feature-not-supported" +msgstr "Caracteristica no soportada: '%s'." + #: src/app/main/errors.cljs msgid "errors.file-feature-mismatch" msgstr "" @@ -920,10 +938,6 @@ msgstr "" "del fichero que se esta intentando abrir. Falta aplicar migraciones para " "'%s' antes de poder abrir el fichero." -#: src/app/main/errors.cljs -msgid "errors.feature-not-supported" -msgstr "Caracteristica no soportada: '%s'." - #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -991,14 +1005,6 @@ msgstr "" msgid "errors.registration-disabled" msgstr "El registro está actualmente desactivado." -#: src/app/main/data/users.cljs -msgid "errors.auth-provider-not-allowed" -msgstr "El proveedor de autenticación no permitido para este perfil de usuario" - -#: src/app/main/data/users.cljs -msgid "errors.email-domain-not-allowed" -msgstr "Dominio no permitido" - msgid "errors.team-leave.insufficient-members" msgstr "" "No hay miembros suficientes para salir del equipo, probablemente quieras " @@ -1253,12 +1259,12 @@ msgstr "Minúsculas" msgid "inspect.attributes.typography.text-transform.none" msgstr "Ninguna" -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Sin asignar" - msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "Primera en mayúscula" +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Sin asignar" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Mayúsculas" @@ -1659,6 +1665,9 @@ msgstr "Rol" msgid "labels.save" msgstr "Guardar" +msgid "labels.search" +msgstr "Buscar" + msgid "labels.search-font" msgstr "Buscar fuente" @@ -1683,13 +1692,13 @@ msgstr "El servicio no está disponible" msgid "labels.settings" msgstr "Configuración" +msgid "labels.share" +msgstr "Compartir" + #: src/app/main/ui/viewer/header.cljs, src/app/main/ui/viewer/header.cljs msgid "labels.share-prototype" msgstr "Compartir prototipo" -msgid "labels.share" -msgstr "Compartir" - #: src/app/main/ui/dashboard/sidebar.cljs msgid "labels.shared-libraries" msgstr "Bibliotecas" @@ -1756,13 +1765,34 @@ msgstr "(tú)" msgid "labels.your-account" msgstr "Tu cuenta" -msgid "labels.search" -msgstr "Buscar" +msgid "media.choose-image" +msgstr "Elegir imagen" + +msgid "media.gradient" +msgstr "Gradiente" + +msgid "media.image" +msgstr "Imagen" + +msgid "media.image.short" +msgstr "img" + +msgid "media.keep-aspect-ratio" +msgstr "Mantener la proporción" + +msgid "media.linear" +msgstr "Linear" #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Cargando imagen…" +msgid "media.radial" +msgstr "Radial" + +msgid "media.solid" +msgstr "Sólido" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -2090,6 +2120,21 @@ msgstr "¿Seguro que quieres abandonar este equipo?" msgid "modals.leave-confirm.title" msgstr "Abandonando el equipo" +msgid "modals.move-shared-confirm.accept" +msgid_plural "modals.move-shared-confirm.accept" +msgstr[0] "Mover" +msgstr[1] "Mover" + +msgid "modals.move-shared-confirm.message" +msgid_plural "modals.move-shared-confirm.message" +msgstr[0] "¿Seguro que quieres mover esta biblioteca?" +msgstr[1] "¿Seguro que quieres mover estas bibliotecas?" + +msgid "modals.move-shared-confirm.title" +msgid_plural "modals.move-shared-confirm.title" +msgstr[0] "Mover biblioteca" +msgstr[1] "Mover bibliotecas" + #: src/app/main/ui/workspace/nudge.cljs msgid "modals.nudge-title" msgstr "Desplazamiento" @@ -2150,33 +2195,18 @@ msgid_plural "modals.unpublish-shared-confirm.accept" msgstr[0] "Despublicar" msgstr[1] "Despublicar" -msgid "modals.move-shared-confirm.accept" -msgid_plural "modals.move-shared-confirm.accept" -msgstr[0] "Mover" -msgstr[1] "Mover" - #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.message" msgid_plural "modals.unpublish-shared-confirm.message" msgstr[0] "¿Seguro que quieres despublicar esta biblioteca?" msgstr[1] "¿Seguro que quieres despublicar estas bibliotecas?" -msgid "modals.move-shared-confirm.message" -msgid_plural "modals.move-shared-confirm.message" -msgstr[0] "¿Seguro que quieres mover esta biblioteca?" -msgstr[1] "¿Seguro que quieres mover estas bibliotecas?" - #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.title" msgid_plural "modals.unpublish-shared-confirm.title" msgstr[0] "Despublicar biblioteca" msgstr[1] "Despublicar bibliotecas" -msgid "modals.move-shared-confirm.title" -msgid_plural "modals.move-shared-confirm.title" -msgstr[0] "Mover biblioteca" -msgstr[1] "Mover bibliotecas" - #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, #: src/app/main/ui/workspace/context_menu.cljs msgid "modals.update-remote-component-in-bulk.hint" @@ -2301,38 +2331,32 @@ msgstr "Guía de contribución" msgid "onboarding-v2.welcome.title" msgstr "¡Te damos la bienvenida a Penpot!" -msgid "onboarding.choice.team-up.create-team-desc" -msgstr "Tras nombrar tu equipo podrás invitar a personas para que se unan." - -msgid "onboarding.choice.team-up.create-team-placeholder" -msgstr "Introduce el nombre del equipo" - msgid "onboarding.choice.team-up.continue-creating-team" msgstr "Continuar creando equipo" -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Comenzar sin equipo" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Podrás crear un equipo después." - msgid "onboarding.choice.team-up.continue-without-a-team" msgstr "Seguir sin equipo" +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Crear equipo e invitar" + msgid "onboarding.choice.team-up.create-team-and-send-invites" msgstr "Crear equipo y enviar invitaciones" -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Crear equipo sin invitar" +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Podrás enviar invitaciones después" -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Crear equipo e invitar" +msgid "onboarding.choice.team-up.create-team-desc" +msgstr "Tras nombrar tu equipo podrás invitar a personas para que se unan." + +msgid "onboarding.choice.team-up.create-team-placeholder" +msgstr "Introduce el nombre del equipo" msgid "onboarding.choice.team-up.create-team-without-invite" msgstr "Crear equipo" -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Podrás enviar invitaciones después" +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Crear equipo sin invitar" msgid "onboarding.choice.team-up.invite-members" msgstr "Invitar integrantes" @@ -2345,6 +2369,12 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Invitar con el rol:" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Comenzar sin equipo" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Podrás crear un equipo después." + msgid "onboarding.newsletter.accept" msgstr "Si, suscribirme" @@ -2362,9 +2392,6 @@ msgstr "¿Quieres recibir noticias sobre Penpot?" msgid "onboarding.team-modal.create-team" msgstr "Crea un equipo" -msgid "onboarding.team-modal.team-definition" -msgstr "¿Qué es un equipo?" - msgid "onboarding.team-modal.create-team-desc" msgstr "" "Un equipo permite colaborar en Penpot trabajando en los mismos archivos y " @@ -2385,6 +2412,9 @@ msgstr "Sin límite de integrantes" msgid "onboarding.team-modal.create-team-feature-5" msgstr "¡100% gratis!" +msgid "onboarding.team-modal.team-definition" +msgstr "¿Qué es un equipo?" + msgid "onboarding.templates.subtitle" msgstr "Aquí tienes algunas plantillas." @@ -2938,6 +2968,9 @@ msgstr "Rehacer" msgid "shortcuts.reset-zoom" msgstr "Reiniciar zoom" +msgid "shortcuts.scale" +msgstr "Escalado" + msgid "shortcuts.search-placeholder" msgstr "Buscar atajos" @@ -3023,6 +3056,9 @@ msgstr "Mostrar/ocultar capas" msgid "shortcuts.toggle-layout-flex" msgstr "Añadir/eliminar flex layout" +msgid "shortcuts.toggle-layout-grid" +msgstr "Añadir/eliminar grid layout" + msgid "shortcuts.toggle-lock" msgstr "Bloquear/Desbloquear" @@ -3032,9 +3068,6 @@ msgstr "Bloquear/Desbloquear proporciones" msgid "shortcuts.toggle-rulers" msgstr "Mostrar/ocultar reglas" -msgid "shortcuts.scale" -msgstr "Escalado" - msgid "shortcuts.toggle-snap-guides" msgstr "Alinear a las guías" @@ -3077,9 +3110,6 @@ msgstr "Incrementar zoom a objetivo" msgid "shortcuts.zoom-selected" msgstr "Zoom a selección" -msgid "shortcuts.toggle-layout-grid" -msgstr "Añadir/eliminar grid layout" - #: src/app/main/ui/dashboard/team.cljs msgid "team.webhooks.max-length" msgstr "El nombre del webhook debe contener como máximo 2048 caracteres." @@ -3290,6 +3320,10 @@ msgstr "Duplicar principal" msgid "workspace.assets.edit" msgstr "Editar" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.filter" +msgstr "Filtrar" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.graphics" @@ -3331,14 +3365,6 @@ msgstr "Renombrar grupo" msgid "workspace.assets.search" msgstr "Buscar recursos" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.filter" -msgstr "Filtrar" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.sort" -msgstr "Ordenar" - #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.selected-count" msgid_plural "workspace.assets.selected-count" @@ -3349,6 +3375,16 @@ msgstr[1] "%s elementos seleccionados" msgid "workspace.assets.shared-library" msgstr "Biblioteca compartida" +#: src/app/main/ui/workspace/sidebar/assets/common.cljs +msgid "workspace.assets.sidebar.components" +msgid_plural "workspace.assets.sidebar.components" +msgstr[0] "1 componente" +msgstr[1] "%s componentes" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "Ordenar" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" @@ -3395,6 +3431,45 @@ msgstr "Transformar texto" msgid "workspace.assets.ungroup" msgstr "Desagrupar" +msgid "workspace.context-menu.grid-cells.area" +msgstr "Crear area" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Crear tablero" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Fusionar celdas" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Añadir 1 columna a la derecha" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Añadir 1 columna a la izquierda" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Borrar columna" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Borrar columna con el contenido" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Duplicar columna" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Añadir 1 fila debajo" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Añadir 1 fila encima" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Borrar fila" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Borrar fila con el contenido" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Duplicar fila" + msgid "workspace.focus.focus-mode" msgstr "Modo foco" @@ -3432,13 +3507,13 @@ msgstr "Desactivar escalar texto" msgid "workspace.header.menu.disable-snap-guides" msgstr "Desactivar alinear a las guias" +msgid "workspace.header.menu.disable-snap-pixel-grid" +msgstr "Desactivar ajuste al pixel" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-snap-ruler-guides" msgstr "Desactivar alinear a las guias de reglas" -msgid "workspace.header.menu.disable-snap-pixel-grid" -msgstr "Desactivar ajuste al pixel" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-dynamic-alignment" msgstr "Activar alineamiento dinámico" @@ -3454,13 +3529,13 @@ msgstr "Activar escalar texto" msgid "workspace.header.menu.enable-snap-guides" msgstr "Alinear a las guias" +msgid "workspace.header.menu.enable-snap-pixel-grid" +msgstr "Activar ajuste al pixel" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-ruler-guides" msgstr "Alinear a las guias de reglas" -msgid "workspace.header.menu.enable-snap-pixel-grid" -msgstr "Activar ajuste al pixel" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-artboard-names" msgstr "Ocultar nombres de tableros" @@ -3534,14 +3609,14 @@ msgstr "Mostrar reglas" msgid "workspace.header.menu.show-textpalette" msgstr "Mostrar paleta de textos" -msgid "workspace.header.menu.undo" -msgstr "Deshacer" +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Cambiar a tema oscuro" msgid "workspace.header.menu.toggle-light-theme" msgstr "Cambiar a tema claro" -msgid "workspace.header.menu.toggle-dark-theme" -msgstr "Cambiar a tema oscuro" +msgid "workspace.header.menu.undo" +msgstr "Deshacer" #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.reset-zoom" @@ -3591,18 +3666,6 @@ msgstr "Pantalla completa" msgid "workspace.header.zoom-selected" msgstr "Zoom a selección" -msgid "workspace.layout_grid.editor.title" -msgstr "Editando rejilla" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Mostrar" - -msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" -msgstr "Mostrar grid layout" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Hecho" - msgid "workspace.layout_grid.editor.options.edit-grid" msgstr "Editar rejilla" @@ -3612,6 +3675,18 @@ msgstr "Salir" msgid "workspace.layout_grid.editor.padding.expand" msgstr "Mostrar el padding a 4 lados" +msgid "workspace.layout_grid.editor.title" +msgstr "Editando rejilla" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Hecho" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Mostrar" + +msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" +msgstr "Mostrar grid layout" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Añadir" @@ -3706,10 +3781,6 @@ msgstr "BIBLIOTECAS COMPARTIDAS" msgid "workspace.libraries.shared-library-btn" msgstr "Conectar biblioteca" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.unlink-library-btn" -msgstr "Desconectar biblioteca" - #: src/app/main/ui/workspace/sidebar/options/menus/text.cljs msgid "workspace.libraries.text.multiple-typography" msgstr "Varias tipografías" @@ -3722,11 +3793,9 @@ msgstr "Desvincular todas las tipografías" msgid "workspace.libraries.typography" msgstr "%s tipografías" -#: src/app/main/ui/workspace/sidebar/assets/common.cljs -msgid "workspace.assets.sidebar.components" -msgid_plural "workspace.assets.sidebar.components" -msgstr[0] "1 componente" -msgstr[1] "%s componentes" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.unlink-library-btn" +msgstr "Desconectar biblioteca" #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.update" @@ -3877,14 +3946,14 @@ msgstr "Relleno" msgid "workspace.options.flows.add-flow-start" msgstr "Añadir inicio de flujo" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow-start" -msgstr "Inicio de flujo" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow" msgstr "Flujo" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-start" +msgstr "Inicio de flujo" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-starts" msgstr "Inicios de flujo" @@ -3984,6 +4053,9 @@ msgstr "Relleno de grupo" msgid "workspace.options.group-stroke" msgstr "Borde de grupo" +msgid "workspace.options.guides.title" +msgstr "Guías" + msgid "workspace.options.height" msgstr "Altura" @@ -5054,6 +5126,13 @@ msgstr "Texto (%s)" msgid "workspace.toolbar.text-palette" msgstr "Tipografías (%s)" +msgid "workspace.top-bar.read-only.done" +msgstr "Hecho" + +#, markdown +msgid "workspace.top-bar.view-only" +msgstr "**Inspeccionando código** (View only)" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Todavía no hay cambios en el histórico" @@ -5187,77 +5266,3 @@ msgstr "Actualizar" msgid "workspace.viewport.click-to-close-path" msgstr "Pulsar para cerrar la ruta" - -#, markdown -msgid "workspace.top-bar.view-only" -msgstr "**Inspeccionando código** (View only)" - -msgid "workspace.top-bar.read-only.done" -msgstr "Hecho" - -msgid "media.image" -msgstr "Imagen" - -msgid "media.image.short" -msgstr "img" - -msgid "media.solid" -msgstr "Sólido" - -msgid "media.linear" -msgstr "Linear" - -msgid "media.radial" -msgstr "Radial" - -msgid "media.gradient" -msgstr "Gradiente" - -msgid "media.choose-image" -msgstr "Elegir imagen" - -msgid "media.keep-aspect-ratio" -msgstr "Mantener la proporción" - -msgid "workspace.options.guides.title" -msgstr "Guías" - -msgid "workspace.context-menu.grid-track.column.duplicate" -msgstr "Duplicar columna" - -msgid "workspace.context-menu.grid-track.column.add-before" -msgstr "Añadir 1 columna a la izquierda" - -msgid "workspace.context-menu.grid-track.column.add-after" -msgstr "Añadir 1 columna a la derecha" - -msgid "workspace.context-menu.grid-track.column.delete" -msgstr "Borrar columna" - -msgid "workspace.context-menu.grid-track.column.delete-shapes" -msgstr "Borrar columna con el contenido" - -msgid "workspace.context-menu.grid-track.row.duplicate" -msgstr "Duplicar fila" - -msgid "workspace.context-menu.grid-track.row.add-before" -msgstr "Añadir 1 fila encima" - -msgid "workspace.context-menu.grid-track.row.add-after" -msgstr "Añadir 1 fila debajo" - -msgid "workspace.context-menu.grid-track.row.delete" -msgstr "Borrar fila" - -msgid "workspace.context-menu.grid-track.row.delete-shapes" -msgstr "Borrar fila con el contenido" - -msgid "workspace.context-menu.grid-cells.merge" -msgstr "Fusionar celdas" - -msgid "workspace.context-menu.grid-cells.area" -msgstr "Crear area" - -msgid "workspace.context-menu.grid-cells.create-board" -msgstr "Crear tablero" - diff --git a/frontend/translations/es_419.po b/frontend/translations/es_419.po index 725523935..bc62bb5a1 100644 --- a/frontend/translations/es_419.po +++ b/frontend/translations/es_419.po @@ -2,15 +2,25 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-02-02 13:01+0000\n" "Last-Translator: Yessenia Villarte Vaca \n" -"Language-Team: Spanish (Latin America) \n" +"Language-Team: Spanish (Latin America) " +"\n" "Language: es_419\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.4-dev\n" +#: src/app/main/ui/auth/register.cljs +msgid "auth.already-have-account" +msgstr "¿Ya tienes una cuenta?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.check-your-email" +msgstr "" +"Revise su correo electrónico y haga clic en el enlace para verificar y " +"comenzar a usar Penpot." + #: src/app/main/ui/auth/recovery.cljs msgid "auth.confirm-password" msgstr "Confirmar Contraseña" @@ -23,6 +33,12 @@ msgstr "Crear cuenta demo" msgid "auth.create-demo-profile" msgstr "¿Solo quieres probarlo?" +#: src/app/main/ui/auth/register.cljs +msgid "auth.demo-warning" +msgstr "" +"Este es un servicio DEMO, NO LO UTILICE para trabajos reales, los proyectos " +"se borrarán periódicamente." + #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs msgid "auth.email" msgstr "Correo electrónico" @@ -31,6 +47,10 @@ msgstr "Correo electrónico" msgid "auth.forgot-password" msgstr "¿Has olvidado tu contraseña?" +#: src/app/main/ui/auth/register.cljs +msgid "auth.fullname" +msgstr "Nombre completo" + #: src/app/main/ui/auth/register.cljs msgid "auth.login-here" msgstr "Inicie sesión aquí" @@ -39,6 +59,10 @@ msgstr "Inicie sesión aquí" msgid "auth.login-submit" msgstr "Iniciar sesión" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-title" +msgstr "¡Qué bueno verte de nuevo!" + #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -47,6 +71,10 @@ msgstr "GitHub" msgid "auth.login-with-gitlab-submit" msgstr "GitLab" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-google-submit" +msgstr "Google" + #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-ldap-submit" msgstr "LDAP" @@ -55,6 +83,14 @@ msgstr "LDAP" msgid "auth.login-with-oidc-submit" msgstr "Open ID" +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "El nombre debe contener algún carácter distinto al del espacio." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "El nombre debe contener como máximo 250 caracteres." + #: src/app/main/ui/auth/recovery.cljs msgid "auth.new-password" msgstr "Escribe una nueva contraseña" @@ -71,6 +107,16 @@ msgstr "Contraseña cambiada correctamente" msgid "auth.notifications.profile-not-verified" msgstr "El perfil no está verificado, verifique el perfil antes de continuar." +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.recovery-token-sent" +msgstr "" +"El enlace de recuperación de contraseña ha sido enviado a su bandeja de " +"entrada de su correo electrónico." + +#: src/app/main/ui/auth/verify_token.cljs +msgid "auth.notifications.team-invitation-accepted" +msgstr "Se unió al equipo con éxito" + #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.password" msgstr "Contraseña" @@ -90,6 +136,10 @@ msgstr "Política de privacidad" msgid "auth.recovery-request-submit" msgstr "Recuperar contraseña" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-subtitle" +msgstr "Le enviaremos un correo electrónico con instrucciones" + #: src/app/main/ui/auth/recovery_request.cljs msgid "auth.recovery-request-title" msgstr "¿Has olvidado tu contraseña?" @@ -106,15 +156,33 @@ msgstr "¿No tienes cuenta aún?" msgid "auth.register-submit" msgstr "Crea una cuenta" +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-subtitle" +msgstr "Es gratis, es de código abierto" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-title" +msgstr "Crea una cuenta" + #: src/app/main/ui/auth.cljs msgid "auth.sidebar-tagline" msgstr "La solución de código abierto para diseño y creación de prototipos." +msgid "auth.terms-of-service" +msgstr "Términos de servicio" + msgid "auth.terms-privacy-agreement" msgstr "" "Al crear una nueva cuenta, acepta nuestros términos de servicio y política " "de privacidad." +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Al crear una nueva cuenta, acepta nuestros [terms of service](%s) y nuestra " +"[privacy policy](%s)." + #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "Hemos enviado un correo electrónico de verificación" @@ -129,6 +197,11 @@ msgstr "Publicar" msgid "common.share-link.all-users" msgstr "Todos los usuarios de Penpot" +msgid "common.share-link.confirm-deletion-link-description" +msgstr "" +"¿Estás seguro de que deseas eliminar este enlace? Si lo haces ya no estará " +"disponible para nadie" + msgid "common.share-link.current-tag" msgstr "(actual)" @@ -138,6 +211,12 @@ msgstr "Borrar enlace" msgid "common.share-link.get-link" msgstr "Conseguir enlace" +msgid "common.share-link.link-copied-success" +msgstr "Enlace copiado exitosamente" + +msgid "common.share-link.manage-ops" +msgstr "Administrar permisos" + msgid "common.share-link.page-shared" msgid_plural "common.share-link.page-shared" msgstr[0] "1 página compartida" @@ -155,17 +234,53 @@ msgstr "Cualquier persona con enlace tendrá acceso" msgid "common.share-link.permissions-pages" msgstr "Páginas compartidas" +msgid "common.share-link.placeholder" +msgstr "El enlace para compartir aparecerá aquí" + +msgid "common.share-link.team-members" +msgstr "Solo miembros del equipo" + +msgid "common.share-link.title" +msgstr "Compartir prototipos" + msgid "common.share-link.view-all" msgstr "Seleccionar todo" +msgid "common.unpublish" +msgstr "Despublicar" + #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.team-hero.management" msgstr "Gestión de equipos" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.text" +msgstr "" +"Penpot está destinado a equipos. Invite a miembros a trabajar juntos en " +"proyectos y archivos" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.title" +msgstr "¡En equipo!" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.info" +msgstr "" +"Aprenda los conceptos básicos en Penpot mientras se divierte con este " +"tutorial práctico." + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.start" +msgstr "Iniciar el tutorial" + #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.tutorial-hero.title" msgstr "Tutorial práctico" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.info" +msgstr "Date un paseo por Penpot y conoce sus principales características." + #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.walkthrough-hero.start" msgstr "Iniciar el recorrido" @@ -178,14 +293,26 @@ msgstr "Tutorial de la interfaz" msgid "dashboard.access-tokens.copied-success" msgstr "Token copiado" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "Generar nuevo token" + #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.create.success" msgstr "Token de acceso creado correctamente." +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "Presione el botón \"Generar nuevo token\" para generar uno." + #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.empty.no-access-tokens" msgstr "No tienes tokens hasta el momento." +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "El nombre es requerido" + #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.expiration-180-days" msgstr "180 días" @@ -206,6 +333,10 @@ msgstr "90 días" msgid "dashboard.access-tokens.expiration-never" msgstr "Nunca" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "Expirado el %s" + #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.expires-on" msgstr "Vence el %s" @@ -214,6 +345,17 @@ msgstr "Vence el %s" msgid "dashboard.access-tokens.no-expiration" msgstr "Sin fecha de vencimiento" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "Tokens de acceso personal" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"Los tokens de acceso personal funcionan como una alternativa a nuestro " +"sistema de autenticación de inicio de sesión/contraseña y pueden usarse " +"para permitir que una aplicación acceda a la API interna de Penpot" + #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.token-will-expire" msgstr "El token caducará el %s" @@ -230,6 +372,14 @@ msgstr "Agregar como biblioteca compartida" msgid "dashboard.change-email" msgstr "Cambiar el correo electrónico" +#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs +msgid "dashboard.copy-suffix" +msgstr "(copiar)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.create-new-team" +msgstr "Crear nuevo equipo" + #: src/app/main/ui/dashboard/sidebar.cljs msgid "dashboard.default-team-name" msgstr "Tu Penpot" @@ -263,164 +413,6 @@ msgstr "" msgid "dashboard.export-binary-multi" msgstr "Descargar %s archivos Penpot (.penpot)" -#: src/app/main/ui/auth/register.cljs -msgid "auth.already-have-account" -msgstr "¿Ya tienes una cuenta?" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.check-your-email" -msgstr "" -"Revise su correo electrónico y haga clic en el enlace para verificar y " -"comenzar a usar Penpot." - -#: src/app/main/ui/auth/register.cljs -msgid "auth.demo-warning" -msgstr "" -"Este es un servicio DEMO, NO LO UTILICE para trabajos reales, los proyectos " -"se borrarán periódicamente." - -#: src/app/main/ui/auth/register.cljs -msgid "auth.fullname" -msgstr "Nombre completo" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "¡Qué bueno verte de nuevo!" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-google-submit" -msgstr "Google" - -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "El nombre debe contener algún carácter distinto al del espacio." - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "El nombre debe contener como máximo 250 caracteres." - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.recovery-token-sent" -msgstr "" -"El enlace de recuperación de contraseña ha sido enviado a su bandeja de " -"entrada de su correo electrónico." - -#: src/app/main/ui/auth/verify_token.cljs -msgid "auth.notifications.team-invitation-accepted" -msgstr "Se unió al equipo con éxito" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-subtitle" -msgstr "Le enviaremos un correo electrónico con instrucciones" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-subtitle" -msgstr "Es gratis, es de código abierto" - -msgid "auth.terms-of-service" -msgstr "Términos de servicio" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Al crear una nueva cuenta, acepta nuestros [terms of service](%s) y nuestra [" -"privacy policy](%s)." - -msgid "common.share-link.confirm-deletion-link-description" -msgstr "" -"¿Estás seguro de que deseas eliminar este enlace? Si lo haces ya no estará " -"disponible para nadie" - -msgid "common.share-link.link-copied-success" -msgstr "Enlace copiado exitosamente" - -msgid "common.share-link.manage-ops" -msgstr "Administrar permisos" - -msgid "common.share-link.placeholder" -msgstr "El enlace para compartir aparecerá aquí" - -msgid "common.share-link.team-members" -msgstr "Solo miembros del equipo" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-title" -msgstr "Crea una cuenta" - -msgid "common.share-link.title" -msgstr "Compartir prototipos" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.text" -msgstr "" -"Penpot está destinado a equipos. Invite a miembros a trabajar juntos en " -"proyectos y archivos" - -msgid "common.unpublish" -msgstr "Despublicar" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.title" -msgstr "¡En equipo!" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.info" -msgstr "" -"Aprenda los conceptos básicos en Penpot mientras se divierte con este " -"tutorial práctico." - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.start" -msgstr "Iniciar el tutorial" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.info" -msgstr "Date un paseo por Penpot y conoce sus principales características." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "Presione el botón \"Generar nuevo token\" para generar uno." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "Generar nuevo token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "El nombre es requerido" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "Expirado el %s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "Tokens de acceso personal" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"Los tokens de acceso personal funcionan como una alternativa a nuestro " -"sistema de autenticación de inicio de sesión/contraseña y pueden usarse para " -"permitir que una aplicación acceda a la API interna de Penpot" - -#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs -msgid "dashboard.copy-suffix" -msgstr "(copiar)" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.create-new-team" -msgstr "Crear nuevo equipo" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to-link" -msgstr "Información sobre cómo configurar las exportaciones en Penpot." - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.no-elements" -msgstr "No hay elementos con configuración de exportación." - msgid "dashboard.export-frames" msgstr "Exportar tableros como PDF" @@ -445,20 +437,28 @@ msgstr "" "Puede agregar configuraciones de exportación a elementos desde las " "propiedades de diseño (en la parte inferior de la barra lateral derecha)." -msgid "dashboard.export-standard-multi" -msgstr "Descargar %s archivos estándar (.svg + .json)" +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to-link" +msgstr "Información sobre cómo configurar las exportaciones en Penpot." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.no-elements" +msgstr "No hay elementos con configuración de exportación." #: src/app/main/ui/export.cljs msgid "dashboard.export-shapes.title" msgstr "Selección de exportación" +msgid "dashboard.export-standard-multi" +msgstr "Descargar %s archivos estándar (.svg + .json)" + msgid "dashboard.export.detail" msgstr "* Puede incluir componentes, gráficos, colores y/o tipografías." msgid "dashboard.export.explain" msgstr "" -"Uno o más archivos que desea exportar utilizan bibliotecas compartidas. ¿Qué " -"quiere hacer con sus activos*?" +"Uno o más archivos que desea exportar utilizan bibliotecas compartidas. " +"¿Qué quiere hacer con sus activos*?" msgid "dashboard.export.options.all.message" msgstr "" @@ -504,6 +504,12 @@ msgstr "dejar el equipo" msgid "dashboard.libraries-and-templates" msgstr "Bibliotecas y plantillas" +msgid "dashboard.libraries-and-templates.explore" +msgstr "Explore más de ellos y sepa cómo contribuir" + +msgid "dashboard.libraries-and-templates.import-error" +msgstr "Hubo un problema al importar la plantilla. La plantilla no fue importada." + #: src/app/main/ui/dashboard/libraries.cljs msgid "dashboard.libraries-title" msgstr "Bibliotecas" @@ -512,13 +518,6 @@ msgstr "Bibliotecas" msgid "dashboard.loading-files" msgstr "cargando tus archivos…" -msgid "dashboard.libraries-and-templates.explore" -msgstr "Explore más de ellos y sepa cómo contribuir" - -msgid "dashboard.libraries-and-templates.import-error" -msgstr "" -"Hubo un problema al importar la plantilla. La plantilla no fue importada." - msgid "dashboard.loading-fonts" msgstr "cargando tus fuentes…" diff --git a/frontend/translations/fr.po b/frontend/translations/fr.po index 87d06e573..b978a7da3 100644 --- a/frontend/translations/fr.po +++ b/frontend/translations/fr.po @@ -1,15 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-11-16 18:03+0000\n" -"Last-Translator: Swapnil C \n" -"Language-Team: French \n" +"PO-Revision-Date: 2024-02-24 15:02+0000\n" +"Last-Translator: Louis Chance \n" +"Language-Team: French " +"\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" -"X-Generator: Weblate 5.2\n" +"X-Generator: Weblate 5.5-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -180,6 +180,10 @@ msgstr "" msgid "auth.verification-email-sent" msgstr "Nous avons envoyé un e-mail de vérification à" +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...image de marque, illustrations, supports marketing, etc." + msgid "common.publish" msgstr "Publier" @@ -908,6 +912,13 @@ msgstr "" msgid "errors.feature-not-supported" msgstr "La fonctionnalité '%s' n'est pas prise en charge." +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Il semble y avoir une incompatibilité entre les fonctionnalités actives et " +"celles du fichier que tentez d'ouvrir. Vous devez activer les migrations " +"pour '%s' avant de pouvoir ouvrir le fichier." + #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -977,6 +988,10 @@ msgstr "" msgid "errors.registration-disabled" msgstr "L’enregistrement est actuellement désactivé." +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Fonctionnalité incompatible détectée '%s'" + msgid "errors.team-leave.insufficient-members" msgstr "" "Il n'y a pas assez de membres pour quitter l'équipe, vous voulez " @@ -1000,6 +1015,10 @@ msgstr "Une erreur inattendue s’est produite." msgid "errors.unexpected-token" msgstr "Jeton inconnu" +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Le numéro de version du fichier est incompatible" + msgid "errors.webhooks.connection" msgstr "Erreur de connexion, URL inaccessible" @@ -1739,6 +1758,12 @@ msgstr "Votre compte" msgid "media.loading" msgstr "Chargement de l’image…" +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Votre bibliothèque est vide. Une fois ajoutées comme Bibliothèque Partagée, " +"les ressources que vous créez seront utilisables dans vos autres fichiers. " +"Voulez-vous vraiment les publier ?" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -2171,6 +2196,10 @@ msgstr "" msgid "modals.update-remote-component.message" msgstr "Actualiser le composant d’une bibliothèque" +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "Une nouvelle version est disponible, merci de rafraîchir la page" + #: src/app/main/ui/dashboard/team.cljs msgid "notifications.invitation-email-sent" msgstr "E‑mail d'invitation envoyé avec succès" @@ -2267,7 +2296,7 @@ msgid "onboarding-v2.welcome.desc3.title" msgstr "Guide du contributeur" msgid "onboarding-v2.welcome.title" -msgstr "Bienvenu sur Penpot !" +msgstr "Bienvenue sur Penpot !" msgid "onboarding.choice.team-up.create-team-desc" msgstr "" @@ -2336,6 +2365,178 @@ msgstr "Penpot" msgid "profile.recovery.go-to-login" msgstr "Aller à la page de connexion" +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "Quel est l'outil de design avec lequel vous avez plus d'expérience?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "Beaucoup" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canevas" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "Comment décririez-vous votre expérience de travail sur..." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Designer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Développeur" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "En découvrir plus à propos de Penpot" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Fondateur/Direction" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Je suis freelance" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Obtenir le code du projet de mon équipe " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... design d'interface, éléments visuels, systèmes de conception, etc." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "InVision" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Laisser un commentaire sur mon projet d'équipe" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "C'est parti !" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Gestionnaire de produit ou de projet" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Marketing" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "Plus que 50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Suivant" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Aucune" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Autres (préciser)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "Je travaille sur un projet personnel" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "Précédent" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Comment comptez-vous utiliser Penpot ?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Quel est votre rôle ?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Sélectionnez une option" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Sketch" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Un peu" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Commencer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Commencer à travailler sur mon projet" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Étudiant ou enseignant" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "Quelle est la taille de votre équipe ?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Tester Penpot pour voir si ça convient à mon équipe " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Essayer Penpot avant de l'utiliser en local" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "" +"... wireframes, parcours et flux utilisateurs, arborescence de navigation, " +"etc." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Travailler sur des idées de concept" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Vos retours nous aideront à comprendre vos habitudes et préférences afin " +"que nous puissions continuer à améliorer Penpot." + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Détacher" + #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, @@ -2813,6 +3014,12 @@ msgstr "Démasquer" msgid "shortcuts.v-distribute" msgstr "Distribuer verticalement" +msgid "shortcuts.zoom-lense-decrease" +msgstr "Diminuer le zoom" + +msgid "shortcuts.zoom-lense-increase" +msgstr "Augmenter le zoom" + msgid "shortcuts.zoom-selected" msgstr "Zoomer sur la sélection" @@ -2848,6 +3055,10 @@ msgstr "Bibliothèques Partagées - %s - Penpot" msgid "title.default" msgstr "Penpot - Liberté de conception pour les équipes" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "Profil - Jetons d'accès" + #: src/app/main/ui/settings/feedback.cljs msgid "title.settings.feedback" msgstr "Donnez votre avis - Penpot" @@ -2876,6 +3087,9 @@ msgstr "Membres - %s - Penpot" msgid "title.team-settings" msgstr "Configuration - %s - Penpot" +msgid "title.team-webhooks" +msgstr "Webhooks - %s - Penpot" + #: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs msgid "title.viewer" msgstr "%s - Mode spectateur - Penpot" @@ -2911,6 +3125,9 @@ msgstr "Ne pas afficher les interactions" msgid "viewer.header.fullscreen" msgstr "Plein écran" +msgid "viewer.header.inspect-section" +msgstr "Inspecter (%s)" + #: src/app/main/ui/viewer/header.cljs msgid "viewer.header.interactions" msgstr "Interactions" @@ -2934,6 +3151,9 @@ msgstr "Afficher les interactions au clic" msgid "viewer.header.sitemap" msgstr "Plan du site" +msgid "webhooks.last-delivery.success" +msgstr "Le dernier envoi a réussi." + #: src/app/main/ui/workspace/sidebar/align.cljs msgid "workspace.align.hcenter" msgstr "Aligner horizontalement au centre (%s)" @@ -3005,6 +3225,9 @@ msgstr "Supprimer" msgid "workspace.assets.duplicate" msgstr "Dupliquer" +msgid "workspace.assets.duplicate-main" +msgstr "Dupliquer le principal" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.edit" @@ -3034,6 +3257,9 @@ msgstr "Bibliothèque locale" msgid "workspace.assets.not-found" msgstr "Aucune ressource trouvée" +msgid "workspace.assets.open-library" +msgstr "Ouvrir le fichier de la bibliothèque" + #: src/app/main/ui/workspace/sidebar/sitemap.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs @@ -3054,6 +3280,10 @@ msgid_plural "workspace.assets.selected-count" msgstr[0] "%s élément sélectionné" msgstr[1] "%s éléments sélectionnés" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "Bibliothèque partagée" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" @@ -3089,6 +3319,9 @@ msgstr "Interlignage" msgid "workspace.assets.typography.sample" msgstr "Ag" +msgid "workspace.assets.typography.text-styles" +msgstr "Styles de texte" + #: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs msgid "workspace.assets.typography.text-transform" msgstr "Transformer le texte" @@ -3123,6 +3356,9 @@ msgstr "Dégradé radial" msgid "workspace.header.menu.disable-dynamic-alignment" msgstr "Désactiver l’alignement dynamique" +msgid "workspace.header.menu.disable-scale-content" +msgstr "Désactiver l'échelle proportionnelle" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-scale-text" msgstr "Désactiver la mise à l'échelle du texte" @@ -3138,6 +3374,9 @@ msgstr "Désactiver l’accrochage au pixel" msgid "workspace.header.menu.enable-dynamic-alignment" msgstr "Activer l’alignement dynamique" +msgid "workspace.header.menu.enable-scale-content" +msgstr "Activer l'échelle proportionnelle" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-scale-text" msgstr "Activer le redimensionnement du texte" @@ -3188,6 +3427,9 @@ msgstr "Préférences" msgid "workspace.header.menu.option.view" msgstr "Vue" +msgid "workspace.header.menu.redo" +msgstr "Répéter" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.select-all" msgstr "Tout sélectionner" @@ -3211,6 +3453,9 @@ msgstr "Montrer les règles" msgid "workspace.header.menu.show-textpalette" msgstr "Afficher la palette des polices" +msgid "workspace.header.menu.undo" +msgstr "Annuler" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.reset-zoom" msgstr "Réinitialiser" @@ -3235,6 +3480,10 @@ msgstr "Modifications non sauvegardées" msgid "workspace.header.viewer" msgstr "Mode spectateur (%s)" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "Zoom" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.zoom-fill" msgstr "Remplir l’écran" @@ -3255,6 +3504,9 @@ msgstr "Plein écran" msgid "workspace.header.zoom-selected" msgstr "Zoomer sur la sélection" +msgid "workspace.layout_grid.editor.title" +msgstr "Édition de la grille" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Ajouter" @@ -3263,19 +3515,35 @@ msgstr "Ajouter" msgid "workspace.libraries.colors" msgstr "%s couleurs" +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "Il n'y a pas encore de styles de couleur dans votre bibliothèque" + +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "Il n'y a pas encore de styles typographiques dans votre bibliothèque" + #: src/app/main/ui/workspace/colorpicker/libraries.cljs, #: src/app/main/ui/workspace/colorpalette.cljs msgid "workspace.libraries.colors.file-library" msgstr "Bibliothèque du fichier" +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.hsv" +msgstr "HSV" + #: src/app/main/ui/workspace/colorpicker/libraries.cljs, #: src/app/main/ui/workspace/colorpalette.cljs msgid "workspace.libraries.colors.recent-colors" msgstr "Couleurs récentes" #: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgba" -msgstr "RVBA" +msgid "workspace.libraries.colors.rgb-complementary" +msgstr "Complémentaire en RVB" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgba" +msgstr "RVBA" #: src/app/main/ui/workspace/colorpicker.cljs msgid "workspace.libraries.colors.save-color" @@ -3305,6 +3573,10 @@ msgstr "BIBLIOTHÈQUES" msgid "workspace.libraries.library" msgstr "BIBLIOTHÈQUE" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library-updates" +msgstr "MISES À JOUR DE LA BIBLIOTHÈQUE" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "Aucune Bibliothèque Partagée n’a besoin d’être mise à jour" @@ -3341,6 +3613,10 @@ msgstr "%s typographies" msgid "workspace.libraries.update" msgstr "Actualiser" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "Voir tous les changements" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.updates" msgstr "MISES À JOUR" @@ -3365,10 +3641,28 @@ msgstr "Flou de sélection" msgid "workspace.options.canvas-background" msgstr "Couleur de fond du canvas" +msgid "workspace.options.clip-content" +msgstr "Tronquer le contenu" + #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs msgid "workspace.options.component" msgstr "Composant" +msgid "workspace.options.component.annotation" +msgstr "Note" + +msgid "workspace.options.component.copy" +msgstr "Copier" + +msgid "workspace.options.component.create-annotation" +msgstr "Créer une note" + +msgid "workspace.options.component.edit-annotation" +msgstr "Éditer une note" + +msgid "workspace.options.component.main" +msgstr "Principal" + #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Contraintes" @@ -3422,6 +3716,12 @@ msgstr "Export" msgid "workspace.options.export-multiple" msgstr "Exporter la sélection" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export-object" +msgid_plural "workspace.options.export-object" +msgstr[0] "Exporter 1 élément" +msgstr[1] "Exporter %s éléments" + #: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs msgid "workspace.options.export.suffix" msgstr "Suffixe" @@ -3455,6 +3755,10 @@ msgstr "Indiquer le début du flux" msgid "workspace.options.flows.flow-start" msgstr "Début du flux" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-starts" +msgstr "Départs des flux" + #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.auto" msgstr "Automatique" @@ -3553,26 +3857,136 @@ msgstr "Contour de groupe" msgid "workspace.options.height" msgstr "Hauteur" +msgid "workspace.options.inspect" +msgstr "Inspecter" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-action" msgstr "Action" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-after-delay" +msgstr "Après un délai" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation" +msgstr "Animation" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-dissolve" +msgstr "Dissolution" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-animation-none" msgstr "Aucune" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-push" +msgstr "Pousser" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-slide" +msgstr "Glissement" + +msgid "workspace.options.interaction-auto" +msgstr "automatique" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-background" +msgstr "Ajouter une superposition d'arrière-plan" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-close-outside" msgstr "Fermer en cliquant a l'extérieur" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay" +msgstr "Fermer la superposition" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay-dest" +msgstr "Fermer la superposition : %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-delay" +msgstr "Délai" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-destination" +msgstr "Destination" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-duration" msgstr "Durée" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing" +msgstr "Easing" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease" +msgstr "Ease" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in" +msgstr "Ease in" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in-out" +msgstr "Ease in out" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-out" +msgstr "Ease out" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-linear" +msgstr "Linéaire" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-in" +msgstr "Dans" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-enter" +msgstr "Entrée de la souris" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-leave" +msgstr "Sortie de la souris" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-ms" +msgstr "ms" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to" +msgstr "Naviguer vers" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to-dest" +msgstr "Naviguer vers : %s" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-none" msgstr "(non définie)" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-offset-effect" +msgstr "Effet de décalage" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-on-click" +msgstr "Au clic" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay" +msgstr "Ouvrir la superposition" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay-dest" +msgstr "Ouvrir la superposition : %s" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-open-url" msgstr "Ouvrir l'URL" @@ -3581,6 +3995,10 @@ msgstr "Ouvrir l'URL" msgid "workspace.options.interaction-out" msgstr "Sortie" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-center" +msgstr "Centré en bas" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-pos-bottom-left" msgstr "En bas à gauche" @@ -3593,6 +4011,10 @@ msgstr "En bas à droite" msgid "workspace.options.interaction-pos-center" msgstr "Au centre" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-manual" +msgstr "Manuel" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-pos-top-center" msgstr "Centrer en haut" @@ -3605,6 +4027,10 @@ msgstr "En haut à gauche" msgid "workspace.options.interaction-pos-top-right" msgstr "En haut à droite" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-position" +msgstr "Position" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-preserve-scroll" msgstr "Conserver la position du défilement" @@ -3613,6 +4039,22 @@ msgstr "Conserver la position du défilement" msgid "workspace.options.interaction-prev-screen" msgstr "Écran précédent" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-relative-to" +msgstr "Relatif à" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-self" +msgstr "soi" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay" +msgstr "Activer/désactiver la superposition" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay-dest" +msgstr "Activer/désactiver la superposition : %s" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-trigger" msgstr "Déclencheur" @@ -3621,6 +4063,18 @@ msgstr "Déclencheur" msgid "workspace.options.interaction-url" msgstr "URL" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-hovering" +msgstr "En survolant" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-pressing" +msgstr "En appuyant" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interactions" +msgstr "Interactions" + #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs msgid "workspace.options.layer-options.blend-mode.color" msgstr "Couleur" @@ -3737,6 +4191,26 @@ msgstr "Largeur minimale" msgid "workspace.options.layout.bottom" msgstr "En bas" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column" +msgstr "Colonne" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column-reverse" +msgstr "Colonne inversée" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row" +msgstr "Ligne" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row-reverse" +msgstr "Ligne inversée" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.gap" +msgstr "Gap" + #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.left" msgstr "A gauche" @@ -3753,14 +4227,34 @@ msgstr "Tous les côtés" msgid "workspace.options.layout.margin-simple" msgstr "Une marge simple" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.packed" +msgstr "compacté" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding" +msgstr "Marge intérieure" + #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.padding-all" msgstr "Tous les côtés" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-simple" +msgstr "Marge intérieure simple" + #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.right" msgstr "À droite" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-around" +msgstr "espace autour" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-between" +msgstr "espace entre" + #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.top" msgstr "En haut" @@ -3769,6 +4263,13 @@ msgstr "En haut" msgid "workspace.options.more-colors" msgstr "Plus de couleurs" +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.more-lib-colors" +msgstr "Plus de couleurs de la bibliothèque" + +msgid "workspace.options.opacity" +msgstr "Opacité" + #: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.position" @@ -3805,6 +4306,9 @@ msgstr "Tous les coins" msgid "workspace.options.radius.single-corners" msgstr "Coins individuels" +msgid "workspace.options.recent-fonts" +msgstr "Récentes" + #: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs msgid "workspace.options.retry" msgstr "Réessayer" @@ -3813,6 +4317,9 @@ msgstr "Réessayer" msgid "workspace.options.rotation" msgstr "Rotation" +msgid "workspace.options.search-font" +msgstr "Rechercher une police" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.select-a-shape" msgstr "" @@ -3870,6 +4377,13 @@ msgstr "Ombre de groupe" msgid "workspace.options.shadow-options.title.multiple" msgstr "Ombres de la sélection" +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.show-fill-on-export" +msgstr "Afficher à l'export" + +msgid "workspace.options.show-in-viewer" +msgstr "Montrer en mode spectateur" + #: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.size" @@ -3884,8 +4398,62 @@ msgid "workspace.options.stroke" msgstr "Bordure" #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.none" -msgstr "Aucune" +msgid "workspace.options.stroke-cap.circle-marker" +msgstr "Marqueur cercle" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Cercle" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker" +msgstr "Marqueur diamant" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Diamant" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow" +msgstr "Flèche de ligne" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Flèche" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.none" +msgstr "Aucune" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.round" +msgstr "Rond" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square" +msgstr "Carré" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker" +msgstr "Marqueur carré" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Rectangle" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow" +msgstr "Flèche triangle" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Triangle" + +msgid "workspace.options.stroke-color" +msgstr "Couleur du tracé" + +msgid "workspace.options.stroke-width" +msgstr "Largeur du tracé" #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke.center" @@ -4053,6 +4621,13 @@ msgstr "Dissocier les nœuds (%s)" msgid "workspace.path.actions.snap-nodes" msgstr "Aligner les nœuds (%s)" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.add-flex" +msgstr "Ajouter flex layout" + +msgid "workspace.shape.menu.add-grid" +msgstr "Ajouter grid layout" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.back" msgstr "Envoyer au fond" @@ -4065,6 +4640,9 @@ msgstr "Éloigner" msgid "workspace.shape.menu.copy" msgstr "Copier" +msgid "workspace.shape.menu.create-annotation" +msgstr "Créer une note" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.create-artboard-from-selection" msgstr "Créer un plan de travail depuis la sélection" @@ -4073,6 +4651,9 @@ msgstr "Créer un plan de travail depuis la sélection" msgid "workspace.shape.menu.create-component" msgstr "Créer un composant" +msgid "workspace.shape.menu.create-multiple-components" +msgstr "Créer plusieurs composants" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.cut" msgstr "Couper" @@ -4081,6 +4662,10 @@ msgstr "Couper" msgid "workspace.shape.menu.delete" msgstr "Supprimer" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete-flow-start" +msgstr "Supprimer le départ du flux" + #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, #: src/app/main/ui/workspace/context_menu.cljs, #: src/app/main/ui/workspace/context_menu.cljs @@ -4116,6 +4701,10 @@ msgstr "Retourner horizontalement" msgid "workspace.shape.menu.flip-vertical" msgstr "Retourner verticalement" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flow-start" +msgstr "Départ du flux" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.forward" msgstr "Avancer" @@ -4140,6 +4729,9 @@ msgstr "Masquer" msgid "workspace.shape.menu.hide-ui" msgstr "Montrer/Masquer l'interface" +msgid "workspace.shape.menu.intersection" +msgstr "Intersection" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.lock" msgstr "Bloquer" @@ -4157,21 +4749,42 @@ msgstr "Coller" msgid "workspace.shape.menu.path" msgstr "Chemin" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-flex" +msgstr "Retirer flex layout" + #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, #: src/app/main/ui/workspace/context_menu.cljs, #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.reset-overrides" msgstr "Annuler les modifications" +msgid "workspace.shape.menu.restore-main" +msgstr "Rétablir le composant principal" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.select-layer" +msgstr "Sélectionner le calque" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.show" msgstr "Montrer" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-in-assets" +msgstr "Afficher dans le panneau des ressources" + #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.show-main" msgstr "Afficher le composant principal" +msgid "workspace.shape.menu.thumbnail-remove" +msgstr "Retirer la miniature" + +msgid "workspace.shape.menu.thumbnail-set" +msgstr "Définir comme miniature" + msgid "workspace.shape.menu.transform-to-path" msgstr "Transformer en chemin" @@ -4190,12 +4803,22 @@ msgstr "Débloquer" msgid "workspace.shape.menu.unmask" msgstr "Supprimer le masque" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.update-components-in-bulk" +msgstr "Mettre à jour les composants" + #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, #: src/app/main/ui/workspace/context_menu.cljs, #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.update-main" msgstr "Actualiser le composant principal" +msgid "workspace.sidebar.collapse" +msgstr "Réduire la barre latérale" + +msgid "workspace.sidebar.expand" +msgstr "Ouvrir la barre latérale" + #: src/app/main/ui/workspace/left_toolbar.cljs msgid "workspace.sidebar.history" msgstr "Historique (%s)" @@ -4204,6 +4827,12 @@ msgstr "Historique (%s)" msgid "workspace.sidebar.layers" msgstr "Calques" +msgid "workspace.sidebar.layers.components" +msgstr "Composants" + +msgid "workspace.sidebar.layers.frames" +msgstr "Plans de travail" + msgid "workspace.sidebar.layers.groups" msgstr "Groupes" @@ -4213,6 +4842,9 @@ msgstr "Images" msgid "workspace.sidebar.layers.masks" msgstr "Les masques" +msgid "workspace.sidebar.layers.search" +msgstr "Rechercher des calques" + msgid "workspace.sidebar.layers.shapes" msgstr "Formes" @@ -4280,6 +4912,10 @@ msgstr "Raccourcis (%s)" msgid "workspace.toolbar.text" msgstr "Texte (%s)" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text-palette" +msgstr "Polices (%s)" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Il n’y a aucun changement dans l’historique pour l’instant" @@ -4399,6 +5035,10 @@ msgstr "Historique" msgid "workspace.updates.dismiss" msgstr "Ignorer" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "Plus d'information" + #: src/app/main/data/workspace/libraries.cljs msgid "workspace.updates.there-are-updates" msgstr "Il y a des mises à jour dans les Bibliothèques Partagées" @@ -4409,628 +5049,3 @@ msgstr "Actualiser" msgid "workspace.viewport.click-to-close-path" msgstr "Cliquez pour fermer le chemin" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "Développeur" - -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "Une nouvelle version est disponible, merci de rafraîchir la page" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Figma" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "Beaucoup" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "Comment décririez-vous votre expérience de travail sur..." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Adobe XD" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "31-50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Canevas" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "En découvrir plus à propos de Penpot" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "Quel est l'outil de design avec lequel vous avez plus d'expérience?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "11-30" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "Je travaille sur un projet personnel" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "Quelle est la taille de votre équipe ?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "Comment comptez-vous utiliser Penpot ?" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "Bibliothèque partagée" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "Autres (préciser)" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "Étudiant ou enseignant" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "Essayer Penpot avant de l'utiliser en local" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "Travailler sur des idées de concept" - -#: src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.empty-palette" -msgstr "Il n'y a pas encore de styles de couleur dans votre bibliothèque" - -msgid "workspace.options.component.copy" -msgstr "Copier" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interactions" -msgstr "Interactions" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-center" -msgstr "Centré en bas" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"Vos retours nous aideront à comprendre vos habitudes et préférences afin que " -"nous puissions continuer à améliorer Penpot." - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-push" -msgstr "Pousser" - -msgid "workspace.options.inspect" -msgstr "Inspecter" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "Gestionnaire de produit ou de projet" - -msgid "workspace.options.component.create-annotation" -msgstr "Créer une note" - -msgid "viewer.header.inspect-section" -msgstr "Inspecter (%s)" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Marketing" - -msgid "workspace.options.opacity" -msgstr "Opacité" - -msgid "workspace.options.component.edit-annotation" -msgstr "Éditer une note" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "Obtenir le code du projet de mon équipe " - -msgid "workspace.options.show-in-viewer" -msgstr "Montrer en mode spectateur" - -msgid "workspace.shape.menu.create-multiple-components" -msgstr "Créer plusieurs composants" - -msgid "webhooks.last-delivery.success" -msgstr "Le dernier envoi a réussi." - -msgid "workspace.options.stroke-width" -msgstr "Largeur du tracé" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-out" -msgstr "Ease out" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-self" -msgstr "soi" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-ms" -msgstr "ms" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Rectangle" - -msgid "workspace.options.component.main" -msgstr "Principal" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow-starts" -msgstr "Départs des flux" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-position" -msgstr "Position" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "Je suis freelance" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-in" -msgstr "Dans" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay" -msgstr "Activer/désactiver la superposition" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow" -msgstr "Flèche triangle" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-slide" -msgstr "Glissement" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "Voir tous les changements" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "...image de marque, illustrations, supports marketing, etc." - -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "Il n'y a pas encore de styles typographiques dans votre bibliothèque" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-background" -msgstr "Ajouter une superposition d'arrière-plan" - -msgid "workspace.sidebar.layers.search" -msgstr "Rechercher des calques" - -msgid "shortcuts.zoom-lense-increase" -msgstr "Augmenter le zoom" - -msgid "workspace.shape.menu.add-grid" -msgstr "Ajouter grid layout" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-delay" -msgstr "Délai" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square" -msgstr "Carré" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.space-between" -msgstr "espace entre" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom" -msgstr "Zoom" - -msgid "workspace.options.component.annotation" -msgstr "Note" - -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.more-lib-colors" -msgstr "Plus de couleurs de la bibliothèque" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in" -msgstr "Ease in" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.some" -msgstr "Un peu" - -msgid "workspace.layout_grid.editor.title" -msgstr "Édition de la grille" - -msgid "workspace.header.menu.undo" -msgstr "Annuler" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "Plus que 50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "Suivant" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay" -msgstr "Ouvrir la superposition" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-dissolve" -msgstr "Dissolution" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "" -"... wireframes, parcours et flux utilisateurs, arborescence de navigation, " -"etc." - -msgid "workspace.header.menu.disable-scale-content" -msgstr "Désactiver l'échelle proportionnelle" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "Commencer" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.text-palette" -msgstr "Polices (%s)" - -msgid "workspace.sidebar.layers.frames" -msgstr "Plans de travail" - -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.hsv" -msgstr "HSV" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.delete-flow-start" -msgstr "Supprimer le départ du flux" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Diamant" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-offset-effect" -msgstr "Effet de décalage" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row" -msgstr "Ligne" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to" -msgstr "Naviguer vers" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay-dest" -msgstr "Fermer la superposition : %s" - -msgid "workspace.header.menu.redo" -msgstr "Répéter" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column-reverse" -msgstr "Colonne inversée" - -msgid "workspace.assets.duplicate-main" -msgstr "Dupliquer le principal" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "Sélectionnez une option" - -msgid "workspace.options.recent-fonts" -msgstr "Récentes" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-pressing" -msgstr "En appuyant" - -msgid "workspace.sidebar.collapse" -msgstr "Réduire la barre latérale" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "Designer" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flow-start" -msgstr "Départ du flux" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "Aucune" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "C'est parti !" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.remove-flex" -msgstr "Retirer flex layout" - -msgid "workspace.sidebar.layers.components" -msgstr "Composants" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease" -msgstr "Ease" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Détacher" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Sketch" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-relative-to" -msgstr "Relatif à" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.update-components-in-bulk" -msgstr "Mettre à jour les composants" - -msgid "workspace.options.clip-content" -msgstr "Tronquer le contenu" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.select-layer" -msgstr "Sélectionner le calque" - -msgid "workspace.shape.menu.intersection" -msgstr "Intersection" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding" -msgstr "Marge intérieure" - -msgid "title.team-webhooks" -msgstr "Webhooks - %s - Penpot" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library-updates" -msgstr "MISES À JOUR DE LA BIBLIOTHÈQUE" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing" -msgstr "Easing" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Triangle" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row-reverse" -msgstr "Ligne inversée" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "workspace.options.export-object" -msgid_plural "workspace.options.export-object" -msgstr[0] "Exporter 1 élément" -msgstr[1] "Exporter %s éléments" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.packed" -msgstr "compacté" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-enter" -msgstr "Entrée de la souris" - -msgid "workspace.assets.open-library" -msgstr "Ouvrir le fichier de la bibliothèque" - -msgid "workspace.header.menu.enable-scale-content" -msgstr "Activer l'échelle proportionnelle" - -msgid "workspace.shape.menu.thumbnail-set" -msgstr "Définir comme miniature" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "Plus d'information" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-hovering" -msgstr "En survolant" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-manual" -msgstr "Manuel" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-leave" -msgstr "Sortie de la souris" - -msgid "workspace.assets.typography.text-styles" -msgstr "Styles de texte" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker" -msgstr "Marqueur cercle" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.gap" -msgstr "Gap" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker" -msgstr "Marqueur carré" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column" -msgstr "Colonne" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation" -msgstr "Animation" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "Tester Penpot pour voir si ça convient à mon équipe " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "Laisser un commentaire sur mon projet d'équipe" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in-out" -msgstr "Ease in out" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-linear" -msgstr "Linéaire" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-on-click" -msgstr "Au clic" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to-dest" -msgstr "Naviguer vers : %s" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "InVision" - -msgid "workspace.shape.menu.thumbnail-remove" -msgstr "Retirer la miniature" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.space-around" -msgstr "espace autour" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "Précédent" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay" -msgstr "Fermer la superposition" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker" -msgstr "Marqueur diamant" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding-simple" -msgstr "Marge intérieure simple" - -msgid "workspace.shape.menu.create-annotation" -msgstr "Créer une note" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay-dest" -msgstr "Ouvrir la superposition : %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-destination" -msgstr "Destination" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "Commencer à travailler sur mon projet" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Flèche" - -msgid "workspace.options.search-font" -msgstr "Rechercher une police" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "Quel est votre rôle ?" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show-in-assets" -msgstr "Afficher dans le panneau des ressources" - -msgid "workspace.options.interaction-auto" -msgstr "automatique" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Votre bibliothèque est vide. Une fois ajoutées comme Bibliothèque Partagée, " -"les ressources que vous créez seront utilisables dans vos autres fichiers. " -"Voulez-vous vraiment les publier ?" - -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgb-complementary" -msgstr "Complémentaire en RVB" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.round" -msgstr "Rond" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Fondateur/Direction" - -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.show-fill-on-export" -msgstr "Afficher à l'export" - -msgid "workspace.shape.menu.restore-main" -msgstr "Rétablir le composant principal" - -msgid "workspace.sidebar.expand" -msgstr "Ouvrir la barre latérale" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay-dest" -msgstr "Activer/désactiver la superposition : %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Cercle" - -msgid "workspace.options.stroke-color" -msgstr "Couleur du tracé" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "... design d'interface, éléments visuels, systèmes de conception, etc." - -msgid "shortcuts.zoom-lense-decrease" -msgstr "Diminuer le zoom" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "title.settings.access-tokens" -msgstr "Profil - Jetons d'accès" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow" -msgstr "Flèche de ligne" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-after-delay" -msgstr "Après un délai" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.add-flex" -msgstr "Ajouter flex layout" diff --git a/frontend/translations/ha.po b/frontend/translations/ha.po index 27661a3aa..f276a92b7 100644 --- a/frontend/translations/ha.po +++ b/frontend/translations/ha.po @@ -2,4883 +2,4880 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-01-02 16:16+0000\n" "Last-Translator: Alejandro Alonso \n" -"Language-Team: Hausa \n" +"Language-Team: Hausa " +"\n" "Language: ha\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.4-dev\n" -msgid "shortcut-subsection.navigation-dashboard" -msgstr "shawagi" - -msgid "shortcuts.insert-image" -msgstr "sa hoto" - -msgid "shortcuts.bold" -msgstr "fito da shi barobaro" - -msgid "shortcuts.open-viewer" -msgstr "tafi sashin da masu kallo suke hulda" - -msgid "onboarding-v2.before-start.title" -msgstr "kafin ka fara" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-out" -msgstr "fita" +#: src/app/main/ui/auth/register.cljs +msgid "auth.already-have-account" +msgstr "ka na da taska?" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.create-group-hint" +#: src/app/main/ui/auth/register.cljs +msgid "auth.check-your-email" msgstr "" -"abubuwanka za a samu su suna nan take kamar \"sunan kungiya/ sunan abubuwan\"" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.use-default" -msgstr "yi amfani da tsoho" - -#, permanent -msgid "inspect.attributes.stroke.alignment.outer" -msgstr "daga waje" - -#: src/app/main/ui/comments.cljs -msgid "labels.edit" -msgstr "gyara" - -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.height" -msgstr "tsawo" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography" -msgstr "tsara rubutu" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "jaraba kafin ka yi aiki da fenfot" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.title" -msgstr "cire memban tawaga" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.move" -msgstr "motsa (%s)" - -msgid "shortcuts.make-curve" -msgstr "kirkiri lankwasa" - -msgid "shortcuts.snap-nodes" -msgstr "yanke kauri" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "yin aikin kan tunani mai kyau" - -#: src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.empty-palette" -msgstr "Babu salon kaloli a ma'ajiya yanzu" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.title" -msgid_plural "modals.delete-shared-confirm.title" -msgstr[0] "goge kundi" -msgstr[1] "goge kundaye" +"bincika taskarka ta imel,ka danna alamar mahaxa domin tabbatarwa,sannan ka " +"fara amfani da fenfot." -msgid "dashboard.fonts.empty-placeholder" -msgstr "fonts da ka xora nan za ya bayyana." +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.confirm-password" +msgstr "tabbatar da kalmar buxewa" -# SUBSECTIONS -msgid "shortcut-subsection.alignment" -msgstr "kwaskwarima" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-account" +msgstr "qirqiri taskar gwaji" -msgid "errors.webhooks.unexpected" -msgstr "matsalar da ba zata ba lokacin farfaxowa" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-profile" +msgstr "ka na son gwadawa ne kawai?" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "kwanaki 30" +#: src/app/main/ui/auth/register.cljs +msgid "auth.demo-warning" +msgstr "" +"wannan aikin gwaji ne kawai,kar ka yi amfani da shi a aikin gaske,lokaci " +"zuwa lokaci za ya ringa vacewa ne." -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "settings.multiple" -msgstr "gauraya" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.email" +msgstr "imel" -#: src/app/main/ui/dashboard/team.cljs -msgid "errors.member-is-muted" -msgstr "bayanan da ka nema imel din su ya suma (bayanan matsaloli)." +#: src/app/main/ui/auth/login.cljs +msgid "auth.forgot-password" +msgstr "ka manta lambar tsaro?" -msgid "workspace.options.component.copy" -msgstr "Kwafa" +#: src/app/main/ui/auth/register.cljs +msgid "auth.fullname" +msgstr "cikakken suna" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.column" -msgstr "shafi" +#: src/app/main/ui/auth/register.cljs +msgid "auth.login-here" +msgstr "shiga nan" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.add-shared" -msgstr "tura tamkar fenfot" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-submit" +msgstr "shiga ciki" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interactions" -msgstr "yayin hulda" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-title" +msgstr "na ji daxin sake haxuwa da kai!" #: src/app/main/ui/auth/login.cljs -msgid "errors.auth-provider-not-configured" -msgstr "manhajar tantancewar ba ta tsaru ba." +msgid "auth.login-with-github-submit" +msgstr "matattarar manazarta" -msgid "workspace.undo.entry.multiple.circle" -msgstr "da'ira" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-gitlab-submit" +msgstr "wurin nazari" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.message" -msgstr "ka tabbata kana son goge wannan alamar?" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-google-submit" +msgstr "Gugul" -#: src/app/main/ui/static.cljs -msgid "labels.bad-gateway.desc-message" -msgstr "" -"ka jinkirta kaxan sannan ka qara gwadawa; mu na aiki daidai domin tattala " -"aikinmu." +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-ldap-submit" +msgstr "LDAP" -#: src/app/main/ui/inspect/attributes/fill.cljs -msgid "inspect.attributes.fill" -msgstr "cika" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-oidc-submit" +msgstr "shaidar buxewa" -#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs -msgid "media.loading" -msgstr "xora hoto …" +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "dole suna ya qumshi waxansu alamimon rubutu, sannan tazara." -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.access-tokens" -msgstr "lambobi masu xauke da bayani" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "suna dole ya qunshi alamomin rubutu 250." -msgid "shortcuts.open-color-picker" -msgstr "abin daukan kala" +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.new-password" +msgstr "sanya sabuwar lambar tsaro" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-action" -msgstr "aiki" +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.invalid-token-error" +msgstr "lambar tsaron da ka sanya ba daidai ba ce." -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-not-expire" -msgstr "lambar tsaron ba ta da lokacin daina aiki" +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.password-changed-successfully" +msgstr "ka canza lambar tsaro" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-object" -msgstr "Ana fitarwa" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.profile-not-verified" +msgstr "ba a tantance bayananka ba,sai an tantance a ci gaba." -#: src/app/main/ui/workspace/header.cljs -msgid "label.shortcuts" -msgstr "yanke" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.recovery-token-sent" +msgstr "an aika maka da saqon matakan da za a bi domin dawo da lambar tsaronka." -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.colors" -msgstr "%s kala" +#: src/app/main/ui/auth/verify_token.cljs +msgid "auth.notifications.team-invitation-accepted" +msgstr "ka zama dan tawaga" -msgid "shortcuts.delete" -msgstr "goge" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.password" +msgstr "lambar tsaro" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-center" -msgstr "kasa tsakiya" +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-length-hint" +msgstr "aqalla a sami alamoni 8" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.in-this-file" -msgstr "Ma'adana a wanna fiyal" +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "dole lambar tsaro ta qunshi wasu alamomi, sannan tazara." -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-gitlab-submit" -msgstr "wurin nazari" +msgid "auth.privacy-policy" +msgstr "matakan kaxaita" -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-info" -msgstr "bayanin tawaga" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-submit" +msgstr "gano lambar tsaro" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.top" -msgstr "sama" +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-subtitle" +msgstr "za mu aika maka da saqon qa'idoji ta imel" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"bayaninka za ya sanya mu fahimci kwarewarka da xabi'unka ta haka ne za mu " -"mayar maka da fenfot kayan aikin da ka ke jin daxin aiki da shi." +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-title" +msgstr "an manta lambar tsaro?" -msgid "shortcuts.move-unit-down" -msgstr "Matsa da sashin kasa" +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.recovery-submit" +msgstr "canza lambar tsaro" -msgid "common.share-link.placeholder" -msgstr "hanya mai kyau za ta bayyana a nan" +#: src/app/main/ui/auth/login.cljs +msgid "auth.register" +msgstr "ba ka da kunxi har yanzu?" -msgid "dashboard.import.import-message" -msgid_plural "dashboard.import.import-message" -msgstr[0] "an shigar kundi 1." -msgstr[1] "%s kundaye sun shiga." +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.register-submit" +msgstr "qirqiri kundi" -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.hleft" -msgstr "Daidaita hagu (%s)" +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-subtitle" +msgstr "kyauta ne,an buxe hanyar samu" -msgid "labels.accept" -msgstr "karva" +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-title" +msgstr "qirqiri sabon kundi" -msgid "workspace.shape.menu.transform-to-path" -msgstr "sauya zuwa hanya" +#: src/app/main/ui/auth.cljs +msgid "auth.sidebar-tagline" +msgstr "samun hanyar magance matsalar zane-zane." -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-title" -msgstr "an manta lambar tsaro?" +msgid "auth.terms-of-service" +msgstr "dokokin aiki" -msgid "shortcut-subsection.edit" -msgstr "Tace" +msgid "auth.terms-privacy-agreement" +msgstr "" +"lokacin qirqirar kundi, sai ka amincewa da yanayi aikin da " +"qa'idojinmuqa'idoji." -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.auto" -msgstr "da kanshi" +#: src/app/main/ui/auth/register.cljs +msgid "auth.verification-email-sent" +msgstr "mun aika maka da saqon tantancewa ta imel" -msgid "shortcuts.draw-rect" -msgstr "Ractangula" +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...branding, illustrations, marketing pieces, etc." -msgid "onboarding.choice.team-up.invite-members-info" -msgstr "" -"ka tuna da kowa. masu qirqira, masu tsarawa, shuwagabanniS... daban-daban ya " -"qara :)" +msgid "common.publish" +msgstr "wallafawa" -msgid "modals.invite-member.repeated-invitation" -msgstr "" -"waxansu imel daga membobin qungiyar na yanzu. ba za a aikawa da gayyatarsu " -"ba ." +msgid "common.share-link.all-users" +msgstr "duk fenfot" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-push" -msgstr "Tura" +msgid "common.share-link.confirm-deletion-link-description" +msgstr "ka tabbata ka na son rufe wannan hanyar? idan ka rufe ba mai iya sake bi" -#: src/app/main/ui/settings/delete_account.cljs -msgid "notifications.profile-deletion-not-allowed" -msgstr "ba za ka iya goge kundin ba. ka jira umarnin tawaga ka fin ka ci gaba." +msgid "common.share-link.current-tag" +msgstr "(yanzu)" -msgid "workspace.options.inspect" -msgstr "Duba" +msgid "common.share-link.destroy-link" +msgstr "tarwatsa hanya" -msgid "inspect.attributes.typography.text-decoration.strikethrough" -msgstr "zana layi tsakiyar rubutu" +msgid "common.share-link.get-link" +msgstr "samun hanya" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-center" -msgstr "sama tsakiya" +msgid "common.share-link.link-copied-success" +msgstr "an samo kwafi" -msgid "shortcuts.move-nodes" -msgstr "matsa a hade" +msgid "common.share-link.manage-ops" +msgstr "amincewar shugaba" -#: src/app/main/ui/settings.cljs -msgid "dashboard.your-account-title" -msgstr "gidanka" +msgid "common.share-link.page-shared" +msgid_plural "common.share-link.page-shared" +msgstr[0] "tura shafi 1" +msgstr[1] "%s an tura shafi" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.search-placeholder" -msgstr "nema …" +msgid "common.share-link.permissions-can-comment" +msgstr "sharhi" -msgid "shortcuts.redo" -msgstr "gyara" +msgid "common.share-link.permissions-can-inspect" +msgstr "iya bincka lamba" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.multiply" -msgstr "sau" +msgid "common.share-link.permissions-hint" +msgstr "duk wanda ya mallaki mataki,za ya iya shiga" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.left" -msgstr "Hagu" +msgid "common.share-link.permissions-pages" +msgstr "tura shafuka" -msgid "dashboard.webhooks.active" -msgstr "ya na amfani" +msgid "common.share-link.placeholder" +msgstr "hanya mai kyau za ta bayyana a nan" -msgid "common.share-link.current-tag" -msgstr "(yanzu)" +msgid "common.share-link.team-members" +msgstr "memba kaxai" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs -msgid "errors.email-invalid" -msgstr "sanya imel mai amfani" +msgid "common.share-link.title" +msgstr "fenfot" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.stretch" -msgstr "mikewa" +msgid "common.share-link.view-all" +msgstr "zavi duka" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.letter-spacing" -msgstr "tazarar harafi" +msgid "common.unpublish" +msgstr "maras wallafa" -msgid "shortcuts.bring-backward" -msgstr "komawa baya" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.management" +msgstr "shuwagabannin tawaga" -msgid "shortcuts.show-shortcuts" -msgstr "nuna / boye yanken" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.text" +msgstr "fenfot ta menbobin tawaga ce. kirawo kowa domin yin aiki tarekundaye" #: src/app/main/ui/dashboard/projects.cljs -msgid "dashboard.new-project" -msgstr "+ sabon aiki" +msgid "dasboard.team-hero.title" +msgstr "haxin guiwa!" -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.invalid-token-error" -msgstr "lambar tsaron da ka sanya ba daidai ba ce." +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.info" +msgstr "ka san dokokin fenfot lokacin da ka ke tare da masoya koyarwa." -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "ma su qirqira" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.start" +msgstr "fara jagoranci" -msgid "labels.show-comments-list" -msgstr "jerin ire-iren yabo" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.title" +msgstr "jagoranci" -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.dont-show-interactions" -msgstr "Karka/ki nuna hulda" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.info" +msgstr "bincika manhaja domin sanin manyan sassanta." -msgid "dashboard.export.options.detach.message" -msgstr "" -"manhajar tura kundi ba ta shiga cikin fitarwa, wani amfaniqarawa a taska. " +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.start" +msgstr "fara koyarwa" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "na ji daxin sake haxuwa da kai!" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.title" +msgstr "ma'aunin karvuwar aiki" -msgid "shortcut-subsection.shape" -msgstr "Siffa" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.copied-success" +msgstr "kwafar lambar tsaro" -#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs -msgid "title.viewer" -msgstr "%s - duba kumburi - Mazubin biruka" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "samo sabuwar lambar tsaro" -msgid "dashboard.export.options.merge.title" -msgstr "tura taska ya qunshi bayanan da ke cikin kundin taskoki" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "ka sami lambar tsaron da aka yi." -#: src/app/main/ui/dashboard/team.cljs -msgid "title.team-members" -msgstr "Yan kungiya - %s - Mazubin biruka" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "" +"danna maddanin qasa\"danna qasa\n" +"emo sabuwar lambar tsaro\" samar da wani." -msgid "shortcuts.align-justify" -msgstr "Tabbataccan tsari" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "ba ka da wasu lambobin tsaro yanzu." -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.direction-rtl" -msgstr "RTL" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "ana buqatar suna" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "shugaban aiki" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "kwanaki 180" -msgid "workspace.options.component.create-annotation" -msgstr "Kirkiri sharhin rubuta" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "kwanaki 30" -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.rotation" -msgstr "jujjuyawa" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "kwanaki 60" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to-other-team" -msgstr "tura ma sauran tawaga" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "kwanaki 90" -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.num-of-members" -msgstr "%s memba" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "bai yiwuwa" -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.admin" -msgstr "shugaba" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "gama aiki kan %s" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-auto-width" -msgstr "sarrafaffen fadi" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "gama aiki kan %s" -msgid "errors.team-leave.member-does-not-exists" -msgstr "mamban da ka ke son sanyawa ba ya a ciki." +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.no-expiration" +msgstr "ba lokacin daina amfani" -msgid "workspace.options.shadow-options.color" -msgstr "inuwar kala" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "mallakar lambobin shiga na sirri" -#, markdown -msgid "dashboard.fonts.warning-text" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" msgstr "" -"matsalolin lasisi daga sama zuwa qasa magwajin da ke aiki iri-iri. domin " -"bincikawa za ka iya amfani da aikin ma'aunin sama da qasa [shi ne " -"haka](https://ma'aunin sama da qasa.matattarar bayanai.app/). bugu da qari, " -"mun aminta da amfani da [taransifota](https://taransifota.org/) domin samo " -"webfonts da adana kurakurai. " +"lambarka ta shiga na a matsayin zabin hanyar shiga/lambar tsaronmuza a iya " +"amfani tsarin tantancewa,domin shiga manhajar cikin fenfot API" #: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "samo sabuwar lambar tsaro" +msgid "dashboard.access-tokens.token-will-expire" +msgstr "lambar tsaron za ta gama aiki %s" -#: src/app/main/ui/dashboard/team.cljs -msgid "notifications.invitation-email-sent" -msgstr "an aika da saqon" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "lambar tsaron ba ta da lokacin daina aiki" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.add-shared" +msgstr "tura tamkar fenfot" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.change-email" +msgstr "canza imel" + +#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs +msgid "dashboard.copy-suffix" +msgstr "(kwafi)" #: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.select-member-to-promote" -msgstr "zavi memba domin havakawa" +msgid "dashboard.create-new-team" +msgstr "yi sabuwar tawaga" -msgid "shortcuts.draw-text" -msgstr "rubutaccan sako" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.default-team-name" +msgstr "manhajar fenfot" -msgid "viewer.header.inspect-section" -msgstr "Duba (%s)" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.delete-team" +msgstr "goge tawaga" -msgid "workspace.shape.menu.flatten" -msgstr "mikad da abu" +msgid "dashboard.download-binary-file" +msgstr "sauke manhajar fenfot(.manhajar fenfot)" -msgid "shortcuts.delete-node" -msgstr "fita da ga cikin net wok" +msgid "dashboard.download-standard-file" +msgstr "sauke cikakken kundi(.svg + .json)" -msgid "onboarding-v2.before-start.desc3" -msgstr "za ka iya kallon koyarwarmu da mutanenmu ke yi." +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate" +msgstr "kwafi" -msgid "workspace.header.menu.hide-pixel-grid" -msgstr "boye pixel akwati" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate-multi" +msgstr "kwafi %s kundaye" -#: src/app/main/ui/auth/verify_token.cljs -msgid "auth.notifications.team-invitation-accepted" -msgstr "ka zama dan tawaga" +#: src/app/main/ui/dashboard/grid.cljs +#, markdown +msgid "dashboard.empty-placeholder-drafts" +msgstr "" +"nan za a sami kundayen da aka sanya a taska. gwada sanya na ka kundin \"a " +"taskirarmumaginar kundi](https://manhajar fenfot/taskokin maginar " +"kundaye.html)." -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.feedback-sent" -msgstr "aika bayani" +msgid "dashboard.export-binary-multi" +msgstr "sauke %s kundayen manhajar fenfot(.penpot)" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.title" -msgstr "haxin guiwa!" +msgid "dashboard.export-frames" +msgstr "Allon fitarwa na PDF" -msgid "workspace.undo.entry.multiple.page" -msgstr "shafi" +#: src/app/main/ui/export.cljs +msgid "dashboard.export-frames.title" +msgstr "Fitarwa a PDF" -msgid "shortcuts.ungroup" -msgstr "Fita daka rukuni" +msgid "dashboard.export-multi" +msgstr "fitar da fenfot %s kundaye" -#: src/app/main/ui/static.cljs -msgid "labels.bad-gateway.main-message" -msgstr "akwai matsala" +#: src/app/main/ui/export.cljs +msgid "dashboard.export-multiple.selected" +msgstr "%s of %s tubullan da aka zava" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.hint" +#: src/app/main/ui/workspace/header.cljs +msgid "dashboard.export-shapes" +msgstr "Fitarwa" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to" msgstr "" -"idan ba ka cire taskar shirye-shirye ba, kundin taskar na wannan kundin zai " -"tsaya kasancewar za ka iya amfani da shi a cikin kundayenka." +"za ka iya daidaita kayan zanenka ta hanyar (amfani da madannin qasa sashen " +"dama)." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to-link" +msgstr "bayanin yadda ake fitarwa daga fenfot" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.no-elements" +msgstr "ba wasu abubuwan da ake daidaitawa wajen tsara fitarwa." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.title" +msgstr "Fitar da zavi" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.empty" -msgstr "babu labaran da su ka canja a yanzu" +msgid "dashboard.export-standard-multi" +msgstr "Sauke %s cikakken kundi (.svg + .json)" -msgid "dashboard.libraries-and-templates" -msgstr "taska da shaidar kamfanoni" +msgid "dashboard.export.detail" +msgstr "*akwai sassan,hotuna,launuka,da/kozane-zane." -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin-simple" -msgstr "Samfarin gefe" +msgid "dashboard.export.explain" +msgstr "za ka iya fitar da kundi daya ko fiye ta hanyar tura taska. \"me \"*?" -msgid "workspace.undo.entry.multiple.rect" -msgstr "rectangles" +msgid "dashboard.export.options.all.message" +msgstr "manhajar tura kundi ta kunshi fitarwa, tattali mahaxarsu." -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "akwai sabon yayi, fatan za a sabunta fage" +msgid "dashboard.export.options.all.title" +msgstr "fitar da manhajar tura kundi" -msgid "shortcuts.go-to-drafts" -msgstr "ta fi rumbu" +msgid "dashboard.export.options.detach.message" +msgstr "manhajar tura kundi ba ta shiga cikin fitarwa, wani amfaniqarawa a taska. " -msgid "onboarding.welcome.alt" -msgstr "fenfot" +msgid "dashboard.export.options.detach.title" +msgstr "lura da bayanan da ke cikin manhajar tura kundi" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.bottom" -msgstr "Kasa" +msgid "dashboard.export.options.merge.message" +msgstr "" +"za ka iya fitar da kundi tare da haxe muhimman abubuwa, na waje a " +"kunditaskira." -msgid "shortcuts.zoom-selected" -msgstr "Zuko wanda aka zaba" +msgid "dashboard.export.options.merge.title" +msgstr "tura taska ya qunshi bayanan da ke cikin kundin taskoki" -msgid "modals.delete-component-annotation.message" -msgstr "ka tabbata kana son goge wannan bayanin?" +msgid "dashboard.export.title" +msgstr "fitar da kundayr" -msgid "inspect.attributes.stroke.style.none" -msgstr "babu" +msgid "dashboard.fonts.deleted-placeholder" +msgstr "rashin font" -msgid "errors.auth.unable-to-login" -msgstr "lokacin ya qare ko ba a tantance ka ba." +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.dismiss-all" +msgstr "goge duka" -msgid "workspace.options.grid.params.color" -msgstr "Kala" +msgid "dashboard.fonts.empty-placeholder" +msgstr "fonts da ka xora nan za ya bayyana." -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.top" -msgstr "sama" +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.fonts-added" +msgid_plural "dashboard.fonts.fonts-added" +msgstr[0] "an qara font 1" +msgstr[1] "%s an qara fonts da yawa" -msgid "shortcuts.add-node" -msgstr "kara Girma" +#, markdown +msgid "dashboard.fonts.hero-text1" +msgstr "" +"duk wani adireshi da ka xora a nan dangin font ne a wannan tawagar za a " +"sami kundayen da ke xauke da kayan rubutu. Da fontfont iri daya ne ake " +"kasawa**gwaurayen font**. Za ka iya xora font ta waxannan hanyoyin: **TTF, " +"OTF and WOFF** (xaya kawai ake buqata)." -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.group" -msgstr "rukuni" +#, markdown +msgid "dashboard.fonts.hero-text2" +msgstr "" +"za ka iya xora fonts dinka ne domin ka sami dammar amfani da fenfot. gano " +"akwai qarin abubuwan das u ka dace da dokokin " +"fpntaiki](https://fenfot.app/dokoki.html). Za ka so bayani game " +"da[ffonts](https://www.rubutu.com/faq)." -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.accept" -msgid_plural "modals.delete-shared-confirm.accept" -msgstr[0] "goge kundi" -msgstr[1] "goge kundaye" +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.upload-all" +msgstr "xora duka" -#: src/app/main/ui/inspect/attributes/stroke.cljs -msgid "inspect.attributes.stroke" -msgstr "yankewa" +#, markdown +msgid "dashboard.fonts.warning-text" +msgstr "" +"matsalolin lasisi daga sama zuwa qasa magwajin da ke aiki iri-iri. domin " +"bincikawa za ka iya amfani da aikin ma'aunin sama da qasa [shi ne " +"haka](https://ma'aunin sama da qasa.matattarar bayanai.app/). bugu da qari, " +"mun aminta da amfani da [taransifota](https://taransifota.org/) domin samo " +"webfonts da adana kurakurai. " -msgid "onboarding.team-modal.create-team-feature-5" -msgstr "100% kyauta!" +msgid "dashboard.import" +msgstr "shigo da kundin fenfot" -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs -msgid "workspace.options.size-presets" -msgstr "yanayin girman yanayin" +msgid "dashboard.import.analyze-error" +msgstr "kash! mun gaza shigo da kundinka" -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.sitemap" -msgstr "taswirar wuri" +msgid "dashboard.import.import-error" +msgstr "akwi matsala a kundin. ba a shio da kundin ba." -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs -msgid "labels.no-comments-available" -msgstr "an dakatar da kai duka! Alamar sabon sharhi za ta fito nan." +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "an shigar kundi 1." +msgstr[1] "%s kundaye sun shiga." -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.feedback-disabled" -msgstr "kasa samun bayani" +msgid "dashboard.import.import-warning" +msgstr "wasu kundayen na dauke da abubuwan da ba su da amfani." -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.accept" -msgid_plural "modals.unpublish-shared-confirm.accept" -msgstr[0] "maras wallafa" -msgstr[1] "maras wallafa" +msgid "dashboard.import.progress.process-colors" +msgstr "aikin rini" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "kasuwanci" +msgid "dashboard.import.progress.process-components" +msgstr "aikin sassa" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.update" -msgstr "Sabuntawa" +msgid "dashboard.import.progress.process-media" +msgstr "kammala aiki" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin" -msgstr "gefe" +msgid "dashboard.import.progress.process-page" +msgstr "fejin kasuwar duniya: %s" -msgid "shortcuts.align-hcenter" -msgstr "tsarin tsakiya ko ina" +msgid "dashboard.import.progress.process-typographies" +msgstr "kula da rubutu" -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.show-all-comments" -msgstr "fito da yabo" +msgid "dashboard.import.progress.upload-data" +msgstr "xora bayani akan sabis (%s/%s)" -#: src/app/main/ui/settings.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.logout" -msgstr "fita" +msgid "dashboard.import.progress.upload-media" +msgstr "xora kundaye: %s" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "kwanaki 180" +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.invite-profile" +msgstr "neman mutane" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.color-burn" -msgstr "kala konanniya" +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.leave-team" +msgstr "fita tawaga" -msgid "workspace.options.opacity" -msgstr "dishi dishi" +msgid "dashboard.libraries-and-templates" +msgstr "taska da shaidar kamfanoni" -msgid "shortcuts.prev-frame" -msgstr "allon da ya gabata" +msgid "dashboard.libraries-and-templates.explore" +msgstr "bincika su da kyau kasan ta yadda za ka bayar da gudunmawa" -msgid "workspace.options.component.edit-annotation" -msgstr "Tace sharhin rubutu" +msgid "dashboard.libraries-and-templates.import-error" +msgstr "akwai matsala wurin shigo da fejin talla. fejin tallar ba ya xauko." -msgid "dashboard.import.progress.upload-data" -msgstr "xora bayani akan sabis (%s/%s)" +#: src/app/main/ui/dashboard/libraries.cljs +msgid "dashboard.libraries-title" +msgstr "taskoki" -msgid "shortcuts.draw-curve" -msgstr "Ratse" +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.loading-files" +msgstr "aikin dora kundaye …" -#: src/app/main/ui/workspace/comments.cljs -msgid "labels.all" -msgstr "duk" +msgid "dashboard.loading-fonts" +msgstr "xora abin adonka …" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.file" -msgstr "fayil" +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to" +msgstr "tura a" -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.hsla" -msgstr "HSLA" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-multi" +msgstr "tura %s kundaye a" -#: src/app/main/ui/auth/register.cljs -msgid "errors.registration-disabled" -msgstr "rigitar ba ta yi ba." +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-other-team" +msgstr "tura ma sauran tawaga" -msgid "workspace.undo.entry.multiple.media" -msgstr "kadarar zane" +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/files.cljs +msgid "dashboard.new-file" +msgstr "+ sabon kundi" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "sami lambar kowane aiki " +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-file-prefix" +msgstr "sabon kundi" -msgid "workspace.options.show-in-viewer" -msgstr "fito da kaurin sosai" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.new-project" +msgstr "+ sabon aiki" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.lowercase" -msgstr "yanayin kasa" +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-project-prefix" +msgstr "sabon aiki" -#: src/app/main/ui/settings/password.cljs -msgid "errors.password-invalid-confirmation" -msgstr "tabbata labar tsaro ta yi daidai" +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.no-matches-for" +msgstr "ba wanda ya yi daidai da “%s“" -msgid "workspace.undo.entry.multiple.group" -msgstr "rukunis" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.no-projects-placeholder" +msgstr "nan za a ga bayanin aiki" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.updates" -msgstr "sabuntawa" +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-changed-successfully" +msgstr "ka zamanantar da adireshinka na imel" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-verified-successfully" +msgstr "an tantance adireshinka na imel" -msgid "dashboard.export-frames" -msgstr "Allon fitarwa na PDF" +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.notifications.password-saved" +msgstr "an tsare maka shaidar tsaro!" -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "modals.delete-page.title" -msgstr "goge shafi" +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.num-of-members" +msgstr "%s memba" -#: src/app/main/ui/static.cljs -msgid "labels.service-unavailable.main-message" -msgstr "ba sabis" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.open-in-new-tab" +msgstr "buxe kundi a sabon wurin buxewa" -msgid "shortcuts.opacity-2" -msgstr "Saita dishi dishi zuwa kashi 20" +msgid "dashboard.options" +msgstr "zavi" -msgid "workspace.shape.menu.create-multiple-components" -msgstr "kirkiri abubuwa da yawa" +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.password-change" +msgstr "sauya lambar tsaro" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.rename-group" -msgstr "sake sunan kungiyar" +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.pin-unpin" +msgstr "rufewa/buxewa" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-profile" -msgstr "ka na son gwadawa ne kawai?" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.projects-title" +msgstr "aiki" -msgid "webhooks.last-delivery.success" -msgstr "Sakon karshe ya isa." +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.remove-account" +msgstr "ka na son cire taskarka?" -msgid "shortcuts.bool-intersection" -msgstr "ma'aunin abubuwa daban daban" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.remove-shared" +msgstr "cire matattarar kundate" -msgid "workspace.options.stroke-width" -msgstr "gigciye fadin" +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.save-settings" +msgstr "wurin ajiyar saiti" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-out" -msgstr "sauki waje" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.search-placeholder" +msgstr "nema …" -#: src/app/main/ui/static.cljs -msgid "labels.not-found.desc-message" -msgstr "babu wannan fagen, ko ba ka da izinin shiga." +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.searching-for" +msgstr "neman “%s“…" -msgid "workspace.options.x" -msgstr "X layi" +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-language" +msgstr "zavavven harshen UI" -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.members" -msgstr "mambobi" +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-theme" +msgstr "zaven batu" -#: src/app/main/ui/auth/verify_token.cljs -msgid "dashboard.notifications.email-verified-successfully" -msgstr "an tantance adireshinka na imel" +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.show-all-files" +msgstr "duk kundaye" -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.show-interactions" -msgstr "Nuna hulda" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-delete-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "an goge kundinka" +msgstr[1] "an goge kundayenka" -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.hint" -msgstr "" -"idan ka canza wurin mallaka, ba za ka iya sauya matsayin shugaba ba, gazawar " -"wasu dokokin wannan tawaagar. " +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-delete-project" +msgstr "ka goge aikinka" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-self" -msgstr "kai/ni" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-duplicate-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "an kwafi kundinka" +msgstr[1] "an kwafi kundayenka" -msgid "errors.webhooks.invalid-uri" -msgstr "URL bai gyaru ba." +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-duplicate-project" +msgstr "an kwafi aikinka" -msgid "modals.create-webhook.url.placeholder" -msgstr "https://misali.com/postreceive" +#: src/app/main/ui/dashboard/grid.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-file" +msgstr "an tura aikinka" -msgid "shortcuts.draw-nodes" -msgstr "samar da hanya" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-files" +msgstr "an tura kundayenka" -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.you" -msgstr "(kai)" +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-move-project" +msgstr "an tura aikinka" -msgid "dashboard.options" -msgstr "zavi" +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-info" +msgstr "bayanin tawaga" -msgid "workspace.shape.menu.path" -msgstr "hanya" +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-members" +msgstr "mambobin tawaga" -msgid "onboarding.templates.title" -msgstr "fara tsarawa" +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-projects" +msgstr "aiyukan tawaga" -msgid "labels.go-back" -msgstr "koma baya" +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.theme-change" +msgstr "batun UI" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.message" -msgid_plural "modals.unpublish-shared-confirm.message" -msgstr[0] "ka tabbata ka na son rufe taskar nan?" -msgstr[1] "ka tabbata ka na son rufe taskokin nan?" +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.title-search" +msgstr "neman sakamako" -#: src/app/main/ui/settings/password.cljs -msgid "errors.wrong-old-password" -msgstr "tsohuwar lambar tsaro ba daidai ba ce" +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.type-something" +msgstr "rubuta neman sakamako" #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "dashboard.unpublish-shared" msgstr "wallafa taska" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "ina aikin kaina" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.offsety" -msgstr "Y" +#: src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs +msgid "dashboard.update-settings" +msgstr "zamanartarwa wurin gyara" -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.size" -msgstr "wurin daxa girma" +msgid "dashboard.webhooks.active" +msgstr "ya na amfani" -#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs -msgid "viewer.frame-not-found" -msgstr "Ba'a sami allon ba." +msgid "dashboard.webhooks.active.explain" +msgstr "idan an sami sauyi a nan ake kawo shi" -msgid "workspace.focus.focus-mode" -msgstr "tsarin maida hankali" +msgid "dashboard.webhooks.content-type" +msgstr "irin ra'ayi" -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-submit" -msgstr "gano lambar tsaro" +msgid "dashboard.webhooks.create" +msgstr "yin webhook" -msgid "shortcuts.cut" -msgstr "cire" +msgid "dashboard.webhooks.create.success" +msgstr "an gina Webhook." -#: src/app/main/ui/confirm.cljs -msgid "ds.component-subtitle" -msgstr "zamanantar da sassa:" +msgid "dashboard.webhooks.description" +msgstr "" +"Webhooks hanyar sanar da manhajoji da addireshi intanet idan wani ya faru a " +"Penpot. za a tura maka da saqon talla URLs ka samar da." -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.delete" -msgstr "goge" +msgid "dashboard.webhooks.empty.add-one" +msgstr "danna qasa \"sanya webhook\" qara xaya." -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs -msgid "workspace.options.component" -msgstr "Bangarori" +msgid "dashboard.webhooks.empty.no-webhooks" +msgstr "ba a gina wani webhooks ba." -#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs -msgid "dashboard.copy-suffix" -msgstr "(kwafi)" +msgid "dashboard.webhooks.update.success" +msgstr "sabunta Webhook." -msgid "labels.export" -msgstr "fitarwa" +#: src/app/main/ui/settings.cljs +msgid "dashboard.your-account-title" +msgstr "gidanka" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-ms" -msgstr "ms" +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-email" +msgstr "imel" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.right" -msgstr "dama" +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-name" +msgstr "sunanka" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.cancel" -msgstr "soke" +#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.your-penpot" +msgstr "fenfot na ka" -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.save-color" -msgstr "Adana salon kala" +#: src/app/main/ui/alert.cljs +msgid "ds.alert-ok" +msgstr "haka" -msgid "shortcuts.opacity-8" -msgstr "seta dishi dishin zuwa kashi 8o" +#: src/app/main/ui/alert.cljs +msgid "ds.alert-title" +msgstr "natsu" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.ellipse" -msgstr "siffar kwai (%s)" +#: src/app/main/ui/confirm.cljs +msgid "ds.component-subtitle" +msgstr "zamanantar da sassa:" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.search" -msgstr "nemo kadarar" +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-cancel" +msgstr "goge" -msgid "shortcuts.or" -msgstr " ko " +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-ok" +msgstr "haka" -msgid "shortcuts.opacity-5" -msgstr "Saita dishi dishi zuwa kashi 50" +#: src/app/main/ui/confirm.cljs, src/app/main/ui/confirm.cljs +msgid "ds.confirm-title" +msgstr "ka tabbata?" -msgid "onboarding-v2.newsletter.desc" -msgstr "" -"domin jin daxin fenfot , sai ka biya kuxi domin labarai da ci gaban da ake " -"samu." +#: src/app/main/ui/auth/login.cljs +msgid "errors.auth-provider-not-configured" +msgstr "manhajar tantancewar ba ta tsaru ba." -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.nudge-title" -msgstr "adadin jan hankali" +msgid "errors.auth.unable-to-login" +msgstr "lokacin ya qare ko ba a tantance ka ba." -msgid "workspace.sidebar.layers.groups" -msgstr "rukuni" +msgid "errors.bad-font" +msgstr "ba za a iya xora fonts %s ba" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Rectangle" +msgid "errors.bad-font-plural" +msgstr "ba za a iya xora fonts %s ba" -#: src/app/main/ui/settings/password.cljs -msgid "labels.new-password" -msgstr "sabuwar lambar tsaro" +msgid "errors.cannot-upload" +msgstr "kasa xora xan aiken kundi." -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "ana buqatar suna" +#: src/app/main/data/workspace.cljs +msgid "errors.clipboard-not-implemented" +msgstr "manhajar binciken nan ba ta iya yin wannan aikin" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-left" -msgstr "sama hagu" +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs +msgid "errors.email-already-exists" +msgstr "an yi amfani da imel" -msgid "shortcut-section.dashboard" -msgstr "allon kallo" +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.email-already-validated" +msgstr "an farfaxo da imel." -msgid "dashboard.webhooks.active.explain" -msgstr "idan an sami sauyi a nan ake kawo shi" +msgid "errors.email-as-password" +msgstr "ba za ka iya amfani da imel ba a matsayin lambar tsaro ba" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.create-new-team" -msgstr "yi sabuwar tawaga" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.email-has-permanent-bounces" +msgstr "imel «%s» na da bayanan matsaloli na dindindin." -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.color-palette" -msgstr "farantin kala (%s)" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs +msgid "errors.email-invalid" +msgstr "sanya imel mai amfani" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.scd-message" -msgid_plural "modals.delete-shared-confirm.activated.scd-message" -msgstr[0] "za a iya buxe wannan taskirar a nan: " -msgstr[1] "za a iya buxe taskirorin nan a nan: " +#: src/app/main/ui/settings/change_email.cljs +msgid "errors.email-invalid-confirmation" +msgstr "tabbata imel xinka ya yi daidai" -msgid "shortcuts.move-fast-left" -msgstr "Matsa hagu da sauri" +msgid "errors.email-spam-or-permanent-bounces" +msgstr "saqonni marasa amfani na imel «%s»." -msgid "workspace.undo.entry.multiple.frame" -msgstr "allo" +#: src/app/main/errors.cljs +msgid "errors.feature-mismatch" +msgstr "" +"tamkar ka buxe wani kundi da ke da muhimmanci '%s' bayar da dama qarin da " +"ka yi ma fenfot xinka bai karbu ba ko ba zai yi aiki ba." -#: src/app/main/ui/settings/profile.cljs -msgid "labels.update" -msgstr "sabunta" +#: src/app/main/errors.cljs +msgid "errors.feature-not-supported" +msgstr "sassa '%s' ba za su yi aiki ba." -msgid "labels.num-of-frames" -msgid_plural "labels.num-of-frames" -msgstr[0] "allo 1" -msgstr[1] "alluna %s" +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.generic" +msgstr "wata matsala ta faru." -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-min-h" -msgstr "tsaho mafi kankanta" +#: src/app/main/ui/components/color_input.cljs +msgid "errors.invalid-color" +msgstr "launin bai yi ba" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.message" -msgstr "qara “%s” xakin ajiya" +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.invite-invalid" +msgstr "gaiyar ba ta yi ba" -#: src/app/main/ui/dashboard/grid.cljs -msgid "dashboard.loading-files" -msgstr "aikin dora kundaye …" +msgid "errors.invite-invalid.info" +msgstr "za a iya soke gayyata ko ta ki aiki." -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component-in-bulk.hint" -msgstr "" -"ka kusa sabunta taskar ajiyar shir-shirye. zai iya shafar sauran kundayen da " -"ke amfani da ita." +#: src/app/main/ui/auth/login.cljs +msgid "errors.ldap-disabled" +msgstr "LDAP ya gaza tantancewa." -msgid "workspace.path.actions.add-node" -msgstr "kara kauri (%s)" +#: src/app/main/errors.cljs +msgid "errors.max-quote-reached" +msgstr "kammala adadin '%s' madogara. gyara." -msgid "workspace.options.component.main" -msgstr "Ainahin" +#: src/app/main/data/workspace/persistence.cljs +msgid "errors.media-too-large" +msgstr "hoton da za ka sanya ya yi girma." -#: src/app/main/ui/workspace/sidebar/options.cljs -msgid "workspace.options.design" -msgstr "zane" +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "errors.media-type-mismatch" +msgstr "hoton da aka sanya bai yi daidai da kundin da ake son faxaxawa ba." -#: src/app/main/ui/dashboard/projects.cljs -msgid "dashboard.projects-title" -msgstr "aiki" +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "errors.media-type-not-allowed" +msgstr "wannan hoton ba ya aiki." -msgid "workspace.undo.entry.single.frame" -msgstr "allo" +#: src/app/main/ui/dashboard/team.cljs +msgid "errors.member-is-muted" +msgstr "bayanan da ka nema imel din su ya suma (bayanan matsaloli)." -msgid "shortcuts.flip-vertical" -msgstr "kifa ta tsaye" +#: src/app/main/ui/settings/password.cljs +msgid "errors.password-invalid-confirmation" +msgstr "tabbata labar tsaro ta yi daidai" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow-starts" -msgstr "gudun farko" +#: src/app/main/ui/settings/password.cljs +msgid "errors.password-too-short" +msgstr "lambar tsaro dole ta kai yawan alamu 8" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-position" -msgstr "Mataki" +msgid "errors.profile-blocked" +msgstr "bayanan a rufe suke" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-dynamic-alignment" -msgstr "bada damar daidaitawa mai canjawa" +#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.profile-is-muted" +msgstr "bayananka su na da imel maras motsi (baiyana matsaloli)." -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.more-colors" -msgstr "kaloli masu yawa" +#: src/app/main/ui/auth/register.cljs +msgid "errors.registration-disabled" +msgstr "rigitar ba ta yi ba." -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.accept" -msgstr "goge kundi" +msgid "errors.team-leave.insufficient-members" +msgstr "ba sauran masu fita daga tawaga, ba bu tabbacin gogewa." -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "ni mai zaman kansa ne" +msgid "errors.team-leave.member-does-not-exists" +msgstr "mamban da ka ke son sanyawa ba ya a ciki." -msgid "shortcuts.paste" -msgstr "manna" +msgid "errors.team-leave.owner-cant-leave" +msgstr "mai abu ba ya barin tawaga, dole adubi matsayin mai abu." -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-bottom" -msgstr "jerin kasa" +#: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "errors.unexpected-error" +msgstr "afkuwar kuskuren da ba a zata ba." -msgid "labels.fonts" -msgstr "Font" +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.unexpected-token" +msgstr "tukuicin da ba a san da shi ba" -msgid "shortcuts.not-found" -msgstr "babu gajeriyar hanya" +msgid "errors.webhooks.connection" +msgstr "hadin bai yi ba, ba a iya samun URL" -msgid "common.share-link.destroy-link" -msgstr "tarwatsa hanya" +msgid "errors.webhooks.invalid-uri" +msgstr "URL bai gyaru ba." -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-close-confirm.hint" -msgstr "" -"ka tabbata memban tawaga kaxai, za ya iya goge tawaga tare da aikinta da " -"kundaye." +msgid "errors.webhooks.last-delivery" +msgstr "saqon qarshe bai je ba." -#: src/app/main/ui/settings/password.cljs -msgid "labels.old-password" -msgstr "tsohuwar lambar tsaro" +msgid "errors.webhooks.ssl-validation" +msgstr "kuskure kan farfaxo da SSL." -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.new" -msgstr "sabo %s" +msgid "errors.webhooks.timeout" +msgstr "dakatarwa" -msgid "onboarding-v2.welcome.desc3.title" -msgstr "gudunmawar jagora" +msgid "errors.webhooks.unexpected" +msgstr "matsalar da ba zata ba lokacin farfaxowa" -msgid "shortcuts.toggle-assets" -msgstr "Danna kadara" +msgid "errors.webhooks.unexpected-status" +msgstr "matsayin da ba zato %s" -msgid "onboarding-v2.newsletter.updates" -msgstr "" -"aiko man da sabbin abubuwan da aka yi (sabbib fasali, fitowa, gyara...)." +#: src/app/main/ui/auth/login.cljs +msgid "errors.wrong-credentials" +msgstr "kuskuren imel ko lambar tsaro." -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.create-artboard-from-selection" -msgstr "zababban allo" +#: src/app/main/ui/settings/password.cljs +msgid "errors.wrong-old-password" +msgstr "tsohuwar lambar tsaro ba daidai ba ce" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.description" +msgstr "bayani" -msgid "onboarding.newsletter.title" -msgstr "ka buqatar labaran fenfot?" +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-go-to" +msgstr "je ka taskar fenfot" -msgid "errors.team-leave.insufficient-members" -msgstr "ba sauran masu fita daga tawaga, ba bu tabbacin gogewa." +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-subtitle1" +msgstr "" +"mun yi farin ciki da samunka a nan. idan ka na da buqatar taimako sai ka " +"tuntuvi na gaba da kai matsayi." -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.copied-success" -msgstr "kwafar lambar tsaro" +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-title" +msgstr "dangin fenfot" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.fix-when-scrolling" -msgstr "gyara nemowa" +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subject" +msgstr "shugabanci" #: src/app/main/ui/settings/feedback.cljs -msgid "feedback.description" -msgstr "bayani" +msgid "feedback.subtitle" +msgstr "" +"bayyana dalilin imel dinka, faiyace idan akwai matsala, an shawarwari ko " +"hasashe. tawaga ko mamba za a kula da kai." -msgid "labels.installed-fonts" -msgstr "sanya fenfot" +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.title" +msgstr "imel" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-top-right" -msgstr "saman dama" +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-go-to" +msgstr "je ka tiwita" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-in" -msgstr "ciki" +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-subtitle1" +msgstr "tambayoyin da ke buqatar amsa." -msgid "modals.publish-empty-library.title" -msgstr "wallafa taska maras komai" +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-title" +msgstr "wurin karvar qorafin tiwita" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay" -msgstr "Juya mai murfi" +#: src/app/main/ui/settings/password.cljs +msgid "generic.error" +msgstr "afkuwar matsala" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.info" -msgstr "bincika manhaja domin sanin manyan sassanta." +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur" +msgstr "xige-xige" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Figma" +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur.value" +msgstr "muhimmanci" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow" -msgstr "Triangle mashi" +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hex" +msgstr "HEX" -msgid "modals.leave-and-reassign.forbidden" -msgstr "" -"ba za ku iya bari ba idan ba wani memba da zai ingata wa mai shi. ku na iya " -"goge tawaga." +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hsla" +msgstr "HSLA" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-scale-text" -msgstr "kashe sikelin rubutu" +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.rgba" +msgstr "RGBA" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.rows" -msgstr "jere" +#: src/app/main/ui/inspect/attributes/fill.cljs +msgid "inspect.attributes.fill" +msgstr "cika" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.tutorials" -msgstr "koyarwa" +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.download" +msgstr "sauke hanyar hoto" -msgid "workspace.undo.entry.multiple.curve" -msgstr "kwana" +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.height" +msgstr "tsawo" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-guides" -msgstr "kashe tsinkewa zuwa mai jagora" +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.width" +msgstr "faxi" -#: src/app/main/ui/auth/register.cljs -msgid "auth.already-have-account" -msgstr "ka na da taska?" +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout" +msgstr "shiri" -msgid "dashboard.import.progress.process-typographies" -msgstr "kula da rubutu" +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.height" +msgstr "tsawo" -msgid "shortcuts.opacity-1" -msgstr "saita dishi dishi zuwa kashi 10" +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.left" +msgstr "hagu" -msgid "workspace.path.actions.snap-nodes" -msgstr "tsinke kauri (%s)" +#: src/app/main/ui/inspect/attributes/layout.cljs, src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.radius" +msgstr "tsakiya" -msgid "shortcuts.bring-front" -msgstr "kawo zuwa gaba" +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.rotation" +msgstr "jujjuyawa" -#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.typography" -msgstr "rubutun rubutu" +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.top" +msgstr "sama" -msgid "common.share-link.view-all" -msgstr "zavi duka" +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.width" +msgstr "fadi" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.give-feedback" -msgstr "bada bayani" +#: src/app/main/ui/inspect/attributes/shadow.cljs +msgid "inspect.attributes.shadow" +msgstr "inuwa" -msgid "shortcuts.bool-exclude" -msgstr "kebentaccan ma'auni" +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.size" +msgstr "wurin daxa girma" -msgid "workspace.undo.entry.multiple.multiple" -msgstr "abu" +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke" +msgstr "yankewa" -msgid "dashboard.export-standard-multi" -msgstr "Sauke %s cikakken kundi (.svg + .json)" +#, permanent +msgid "inspect.attributes.stroke.alignment.center" +msgstr "tsakiya" -#: src/app/main/data/workspace/persistence.cljs -msgid "errors.media-too-large" -msgstr "hoton da za ka sanya ya yi girma." +#, permanent +msgid "inspect.attributes.stroke.alignment.inner" +msgstr "daga ciki" -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.invitations" -msgstr "gayyata" +#, permanent +msgid "inspect.attributes.stroke.alignment.outer" +msgstr "daga waje" -msgid "shortcut-subsection.navigation-viewer" -msgstr "shawagi" +msgid "inspect.attributes.stroke.style.dotted" +msgstr "xige-xige" -#: src/app/main/ui/auth/register.cljs -msgid "auth.check-your-email" -msgstr "" -"bincika taskarka ta imel,ka danna alamar mahaxa domin tabbatarwa,sannan ka " -"fara amfani da fenfot." +msgid "inspect.attributes.stroke.style.mixed" +msgstr "gauraya" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-slide" -msgstr "Ja" +msgid "inspect.attributes.stroke.style.none" +msgstr "babu" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-min-w" -msgstr "fadi mafi kankanta" +msgid "inspect.attributes.stroke.style.solid" +msgstr "tauri" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-min-h" -msgstr "tsawo mafi kankanta" +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke.width" +msgstr "fadi" -msgid "workspace.sidebar.layers.masks" -msgstr "takunkumi" +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography" +msgstr "tsara rubutu" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.screen" -msgstr "allo" +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-family" +msgstr "gidan salo" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "Aga duka canjin" +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-size" +msgstr "girman salo" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.inner-shadow" -msgstr "Inuwar ciki" +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-style" +msgstr "tsarin salo" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.frame" -msgstr "allo (%s)" +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-weight" +msgstr "kaurin salon" -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "...branding, illustrations, marketing pieces, etc." +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.letter-spacing" +msgstr "tazarar harafi" -msgid "onboarding.team-modal.create-team-feature-4" -msgstr "Unlimited members" +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.line-height" +msgstr "tsawon layi" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs -msgid "workspace.options.export.suffix" -msgstr "Kari na bayan baki" +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-decoration" +msgstr "kwalliyar rubutu" -msgid "errors.webhooks.connection" -msgstr "hadin bai yi ba, ba a iya samun URL" +msgid "inspect.attributes.typography.text-decoration.none" +msgstr "babu" -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.confirm-email" -msgstr "tantance sabon imel" +msgid "inspect.attributes.typography.text-decoration.strikethrough" +msgstr "zana layi tsakiyar rubutu" -msgid "auth.terms-of-service" -msgstr "dokokin aiki" +msgid "inspect.attributes.typography.text-decoration.underline" +msgstr "jan layi" -msgid "dashboard.export.options.all.message" -msgstr "manhajar tura kundi ta kunshi fitarwa, tattali mahaxarsu." +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-transform" +msgstr "masarrafin rubu,manya ko qanana" -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.group-fill" -msgstr "Cika rukuni" +msgid "inspect.attributes.typography.text-transform.lowercase" +msgstr "qananan baqaqe" -msgid "shortcuts.stop-measure" -msgstr "dena aunawa" +msgid "inspect.attributes.typography.text-transform.none" +msgstr "babu" -#: src/app/main/ui/comments.cljs -msgid "labels.write-new-comment" -msgstr "rubuta s abon yabo" +msgid "inspect.attributes.typography.text-transform.titlecase" +msgstr "yadda ake rubuta batu" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-subtitle1" -msgstr "" -"mun yi farin ciki da samunka a nan. idan ka na da buqatar taimako sai ka " -"tuntuvi na gaba da kai matsayi." +msgid "inspect.attributes.typography.text-transform.uppercase" +msgstr "manyan baqaqe" -msgid "dashboard.libraries-and-templates.explore" -msgstr "bincika su da kyau kasan ta yadda za ka bayar da gudunmawa" +msgid "inspect.empty.help" +msgstr "domin neman qarin bayani game da fenfot a tuntubi sashen agaji" -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "Babu rubutun rubutu a ma'ajiya yanzu" +msgid "inspect.empty.more-info" +msgstr "qarin bayani a fagen lura" -#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.paste" -msgstr "manna" +msgid "inspect.empty.select" +msgstr "zabar zubi, hukumar masu sa ido akan bangarorinsu da lambobinsu" -msgid "labels.edit-file" -msgstr "gyara kundi" +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code" +msgstr "lamba" -msgid "onboarding.templates.subtitle" -msgstr "ga wasu hotunan talla nan." +msgid "inspect.tabs.code.selected.circle" +msgstr "da'ira" -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.selection-fill" -msgstr "cika zabi" +msgid "inspect.tabs.code.selected.component" +msgstr "bangare" msgid "inspect.tabs.code.selected.curve" msgstr "lankwasa" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.unsaved" -msgstr "Canja canjan da ba'a adana ba" +msgid "inspect.tabs.code.selected.frame" +msgstr "hukuma" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-middle" -msgstr "jerin tsakiya" +msgid "inspect.tabs.code.selected.group" +msgstr "qungiya" -msgid "viewer.breaking-change.description" -msgstr "" -"Wannan mahadar da aka raba yanxu batada ingaci. Ka/ki kirkiri wata ko ka/ki " -"tamayi maishi a baka/ki sabuwa." +msgid "inspect.tabs.code.selected.image" +msgstr "hoto" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.color-dodge" -msgstr "kala gudajjiya" +msgid "inspect.tabs.code.selected.mask" +msgstr "marfi" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.saving" -msgstr "Adanawa" +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code.selected.multiple" +msgstr "%s zavavve" -msgid "shortcuts.next-frame" -msgstr "wani tsari" +msgid "inspect.tabs.code.selected.path" +msgstr "hanya" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library" -msgstr "ma'adana" +msgid "inspect.tabs.code.selected.rect" +msgstr "rektangul" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-background" -msgstr "kara mai rufin bayan" +msgid "inspect.tabs.code.selected.svg-raw" +msgstr "SVG" -msgid "workspace.sidebar.layers.search" -msgstr "nemo shimfida" +msgid "inspect.tabs.code.selected.text" +msgstr "rubutu" -msgid "inspect.attributes.stroke.style.solid" -msgstr "tauri" +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.info" +msgstr "bayani" -#: src/app/main/ui/auth/register.cljs -msgid "auth.demo-warning" -msgstr "" -"wannan aikin gwaji ne kawai,kar ka yi amfani da shi a aikin gaske,lokaci " -"zuwa lokaci za ya ringa vacewa ne." +#: src/app/main/ui/workspace/header.cljs +msgid "label.shortcuts" +msgstr "yanke" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-90-days" -msgstr "kwanaki 90" +msgid "labels.accept" +msgstr "karva" -#: src/app/main/ui/dashboard/search.cljs -msgid "title.dashboard.search" -msgstr "nema - %s - Mazubin biruka" +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "lambobi masu xauke da bayani" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.unknown" -msgstr "yanayi fiye da %s" +msgid "labels.active" +msgstr "mai amfani" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.accept" -msgstr "goge tawaga" +msgid "labels.add-custom-font" +msgstr "inganta font" -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.height" -msgstr "tsawo" +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.admin" +msgstr "shugaba" -msgid "shortcuts.zoom-lense-increase" -msgstr "Zuko karuwar ido" +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.all" +msgstr "duk" -msgid "workspace.shape.menu.add-grid" -msgstr "kara akwatin tsari" +msgid "labels.and" +msgstr "da" -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.interactions" -msgstr "Hulda" +msgid "labels.back" +msgstr "baya" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/inspect/attributes/text.cljs, src/app/main/ui/inspect/attributes/text.cljs -msgid "workspace.assets.typography.sample" -msgstr "Ag" +#: src/app/main/ui/static.cljs +msgid "labels.bad-gateway.desc-message" +msgstr "" +"ka jinkirta kaxan sannan ka qara gwadawa; mu na aiki daidai domin tattala " +"aikinmu." -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.dismiss-all" -msgstr "goge duka" +#: src/app/main/ui/static.cljs +msgid "labels.bad-gateway.main-message" +msgstr "akwai matsala" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "" -"duk aikin da aka yi a wannan kundin, nan za a same shi (ba zanen da za a " -"iya tsinkawa)." -msgstr[1] "" -"duk aikin da aka yi a waxancan kundayen, can za a same su (ba zane da za iya " -"tsinkawa)." +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.cancel" +msgstr "sokewa" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-complete" -msgstr "An gama fitarwa" +msgid "labels.close" +msgstr "rufewa" -msgid "labels.continue-with-penpot" -msgstr "za ka iya ci gaba a idanka na fenfot" +#: src/app/main/ui/dashboard/comments.cljs +msgid "labels.comments" +msgstr "yabo" -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-size" -msgstr "girman salo" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.community" +msgstr "matattara" -msgid "shortcuts.hide-ui" -msgstr "fito / boye UI" +#: src/app/main/ui/settings/password.cljs +msgid "labels.confirm-password" +msgstr "tabbatar da lambar tsaro" -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-title" -msgstr "qirqiri sabon kundi" +msgid "labels.continue" +msgstr "ci gaba" -#: src/app/main/ui/dashboard/libraries.cljs -msgid "dashboard.libraries-title" -msgstr "taskoki" +msgid "labels.continue-with" +msgstr "ci gaba da" -msgid "inspect.tabs.code.selected.rect" -msgstr "rektangul" +msgid "labels.continue-with-penpot" +msgstr "za ka iya ci gaba a idanka na fenfot" -#: src/app/main/ui/export.cljs -msgid "dashboard.export-frames.title" -msgstr "Fitarwa a PDF" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.copy-invitation-link" +msgstr "kwafar hanya" #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "labels.create" msgstr "yi" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-delay" -msgstr "jinkiri" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-multiple.selected" -msgstr "%s of %s tubullan da aka zava" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-confirm.accept" -msgstr "barin tawaga" - -#: src/app/main/ui/components/color_input.cljs -msgid "errors.invalid-color" -msgstr "launin bai yi ba" - -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.small-nudge" -msgstr "qaramin jan hankali" - -msgid "shortcuts.duplicate" -msgstr "maimaita" +#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team" +msgstr "yi sabuwar tawaga" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.saved" -msgstr "An adana" +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team.placeholder" +msgstr "shigar da sabon sunan tawaga" -msgid "shortcuts.create-new-project" -msgstr "samar da sabo abu" +msgid "labels.custom-fonts" +msgstr "kwalliya da fenfot" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.luminosity" -msgstr "warewa" +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.dashboard" +msgstr "dashbod" -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.share.copy-link" -msgstr "Kwafi mahada" +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete" +msgstr "goge" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.color" -msgstr "kala" +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment" +msgstr "goge yabo" -msgid "onboarding.team-modal.create-team-feature-1" -msgstr "aiyuka da kundaye da yawa" +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment-thread" +msgstr "goge rubutu" -#: src/app/main/ui/workspace/sidebar/shortcuts.cljs -msgid "shortcuts.title" -msgstr "allon harufa yanke" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.delete-invitation" +msgstr "goge gayyata" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flip-vertical" -msgstr "kifa ta kwance" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete-multi-files" +msgstr "goge %s kundaye" -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.position" -msgstr "matsayi" +msgid "labels.discard" +msgstr "vatar" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square" -msgstr "murabba'i" +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.drafts" +msgstr "adana" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-justify" -msgstr "tabbatarwa (%s)" +#: src/app/main/ui/comments.cljs +msgid "labels.edit" +msgstr "gyara" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.space-between" -msgstr "sarari tsakani" +msgid "labels.edit-file" +msgstr "gyara kundi" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.open-in-new-tab" -msgstr "buxe kundi a sabon wurin buxewa" +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.editor" +msgstr "maigyara" -#: src/app/main/ui/auth.cljs -msgid "auth.sidebar-tagline" -msgstr "samun hanyar magance matsalar zane-zane." +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.expired-invitation" +msgstr "daina aiki" -#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs -msgid "labels.create-team" -msgstr "yi sabuwar tawaga" +msgid "labels.export" +msgstr "fitarwa" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.uppercase" -msgstr "yanayin sama" +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-disabled" +msgstr "kasa samun bayani" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.assets" -msgstr "kadara" +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-sent" +msgstr "aika bayani" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom" -msgstr "Zuko" +msgid "labels.font-family" +msgstr "ire-iren font" -#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.edit" -msgstr "tace" +msgid "labels.font-providers" +msgstr "ma su fenfot" -msgid "dashboard.import.import-error" -msgstr "akwi matsala a kundin. ba a shio da kundin ba." +msgid "labels.font-variants" +msgstr "salo" -msgid "onboarding-v2.newsletter.privacy1" -msgstr "mu na kula da sirri, a nan za ka karanta na mu " +msgid "labels.fonts" +msgstr "Font" -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.success-move-project" -msgstr "an tura aikinka" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.github-repo" +msgstr "taskar rubuce-rubuce" -msgid "workspace.options.component.annotation" -msgstr "Yin sharhin rubutu" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.give-feedback" +msgstr "bada bayani" -msgid "shortcuts.toggle-layers" -msgstr "Danna shimfida" +msgid "labels.go-back" +msgstr "koma baya" -msgid "labels.uploading" -msgstr "ana dorawa…" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.help-center" +msgstr "sashen taimako" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-preserve-scroll" -msgstr "adana komawa sama da kasa" +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.hide-resolved-comments" +msgstr "voye saqon da aka buxa" -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.accept" -msgstr "goge memba" +msgid "labels.inactive" +msgstr "maras amfani" -msgid "workspace.undo.entry.single.typography" -msgstr "rubutun rubuta kadara" +msgid "labels.installed-fonts" +msgstr "sanya fenfot" -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.selection-color" -msgstr "zababbabbin kaloli" +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.desc-message" +msgstr "" +"an sami matsala. sake gwadawa idan matsalar ba ta kauce ba, tuntubi sashen " +"taimako." -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.more-lib-colors" -msgstr "Ma'ajiyar kaloli masu yawa" +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.main-message" +msgstr "kuskuren ciki" -msgid "inspect.tabs.code.selected.image" -msgstr "hoto" +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.invitations" +msgstr "gayyata" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.create-group" -msgstr "kirkiri rukuni" +#: src/app/main/ui/settings/options.cljs +msgid "labels.language" +msgstr "harshe" -msgid "modals.delete-webhook.accept" -msgstr "goge webhook" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.libraries-and-templates" +msgstr "taskoki & allunan talla" -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.invite-member-confirm.accept" -msgstr "aika saqon" +msgid "labels.log-or-sign" +msgstr "yi ko shiga" + +#: src/app/main/ui/settings.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.logout" +msgstr "fita" #: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs msgid "labels.member" msgstr "mamba" -msgid "onboarding.newsletter.policy" -msgstr "dokoki." +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.members" +msgstr "mambobi" -#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs -msgid "errors.email-already-exists" -msgstr "an yi amfani da imel" +#: src/app/main/ui/settings/password.cljs +msgid "labels.new-password" +msgstr "sabuwar lambar tsaro" -#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs -msgid "errors.media-type-not-allowed" -msgstr "wannan hoton ba ya aiki." +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs +msgid "labels.no-comments-available" +msgstr "an dakatar da kai duka! Alamar sabon sharhi za ta fito nan." -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.text-transform" -msgstr "masarrafin rubu,manya ko qanana" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.no-invitations" +msgstr "ba saqon da ba a buxa ba." -msgid "dashboard.webhooks.create" -msgstr "yin webhook" +#: src/app/main/ui/dashboard/team.cljs +#, markdown +msgid "labels.no-invitations-hint" +msgstr "danna **gayyato mutane** wurin da ake nemo mutane a wannan tawaga." -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.bottom" -msgstr "Kasa" +#: src/app/main/ui/static.cljs +msgid "labels.not-found.desc-message" +msgstr "babu wannan fagen, ko ba ka da izinin shiga." -msgid "common.share-link.get-link" -msgstr "samun hanya" +#: src/app/main/ui/static.cljs +msgid "labels.not-found.main-message" +msgstr "alama!" -msgid "shortcuts.open-comments" -msgstr "tafi inda 'yan kallo za su bayyana ra'ayi" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.num-of-files" +msgid_plural "labels.num-of-files" +msgstr[0] "kundi 1" +msgstr[1] "kundaye %s" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.subtitle" -msgstr "" -"bayyana dalilin imel dinka, faiyace idan akwai matsala, an shawarwari ko " -"hasashe. tawaga ko mamba za a kula da kai." +msgid "labels.num-of-frames" +msgid_plural "labels.num-of-frames" +msgstr[0] "allo 1" +msgstr[1] "alluna %s" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-multi-confirm.title" -msgstr "gogewa %s kundaye" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.num-of-projects" +msgid_plural "labels.num-of-projects" +msgstr[0] "aiki" +msgstr[1] "aiyuka %s" -msgid "workspace.header.menu.disable-snap-pixel-grid" -msgstr "kashe tsinkewa zuwa pixel" +#: src/app/main/ui/settings/password.cljs +msgid "labels.old-password" +msgstr "tsohuwar lambar tsaro" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in" -msgstr "sauki ciki" +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.only-yours" +msgstr "naka kawai" -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-family" -msgstr "gidan salo" +msgid "labels.or" +msgstr "ko" -#: src/app/main/ui/auth/login.cljs -msgid "auth.register" -msgstr "ba ka da kunxi har yanzu?" +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.owner" +msgstr "mai" #: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs msgid "labels.password" msgstr "lambar tsaro" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.pending-invitation" +msgstr "tukuna" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.profile" +msgstr "kundi" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.projects" +msgstr "aiyuka" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.release-notes" +msgstr "bayar da bayani" + +#: src/app/main/ui/workspace.cljs +msgid "labels.reload-file" +msgstr "qara dora kundi" + #: src/app/main/ui/workspace/libraries.cljs, src/app/main/ui/dashboard/team.cljs msgid "labels.remove" msgstr "cire" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.solid" -msgstr "mai tauri" - -#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.generic" -msgstr "wata matsala ta faru." +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.remove-member" +msgstr "cire mamba" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.some" -msgstr "wasu" +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.rename" +msgstr "sake suna" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.there-are-updates" -msgstr "a kwai na zamani a rababban ma'ajiya" +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.rename-team" +msgstr "sake suna tawaga" -#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.leave-team" -msgstr "fita tawaga" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.resend-invitation" +msgstr "sake aika saqon gayyata" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.delete" -msgstr "gogagge %s" +#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs +msgid "labels.retry" +msgstr "sake gwadawa" -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.line-height" -msgstr "tsawon layi" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.role" +msgstr "matsayi" -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.code" -msgstr "lamba" +msgid "labels.save" +msgstr "ajiye" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.top" -msgstr "sama" +msgid "labels.search-font" +msgstr "neman font" -msgid "shortcuts.bring-back" -msgstr "tura zuwa baya" +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.send" +msgstr "aika" -msgid "shortcuts.text-align-justify" -msgstr "jera da inganci" +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.sending" +msgstr "aikawa…" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius.single-corners" -msgstr "kwanar da take cin gashin kanta" +#: src/app/main/ui/static.cljs +msgid "labels.service-unavailable.desc-message" +msgstr "mu na cikin kula a tsarinka." -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.unexpected-token" -msgstr "tukuicin da ba a san da shi ba" +#: src/app/main/ui/static.cljs +msgid "labels.service-unavailable.main-message" +msgstr "ba sabis" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.dotted" -msgstr "digo digo" +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.settings" +msgstr "gyara" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-artboard-names" -msgstr "Boye allom suna" +msgid "labels.share-prototype" +msgstr "tura manhajar rubutu" -msgid "dashboard.export.options.merge.message" -msgstr "" -"za ka iya fitar da kundi tare da haxe muhimman abubuwa, na waje a " -"kunditaskira." +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.shared-libraries" +msgstr "taskoki" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.backward" -msgstr "tura zuwa baya" +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-all-comments" +msgstr "fito da yabo" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-ldap-submit" -msgstr "LDAP" +msgid "labels.show-comments-list" +msgstr "jerin ire-iren yabo" -msgid "onboarding-v2.newsletter.privacy2" -msgstr "" -"za mu aika maka da imel mai amfani. za ka iya biya a kowane lokaci za ka iya " -"ta kowace hanyar biyanmu." +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-your-comments" +msgstr "bayyana na ka ra’ayin" #: src/app/main/ui/dashboard/team.cljs -msgid "labels.copy-invitation-link" -msgstr "kwafar hanya" +msgid "labels.status" +msgstr "daraja" -#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.rename" -msgstr "sake suna" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.tutorials" +msgstr "koyarwa" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.select-a-shape" -msgstr "zabi surar allo, ko rukuni ta hadu da daya allon." +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.unpublish-multi-files" +msgstr "kundayen da ba a wallafa ba %s" -msgid "onboarding.newsletter.accept" -msgstr "haka, za a biya" +#: src/app/main/ui/settings/profile.cljs +msgid "labels.update" +msgstr "sabunta" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke" -msgstr "gigciye" +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.update-team" +msgstr "sabunta tawaga" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.leftright" -msgstr "hagu & dama" +msgid "labels.upload" +msgstr "xorawa" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-rules" -msgstr "Nuna ma'auni" +msgid "labels.upload-custom-fonts" +msgstr "Upload custom fonts" -msgid "shortcuts.toggle-focus-mode" -msgstr "Danna yanayin maida hankali" +msgid "labels.uploading" +msgstr "ana dorawa…" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "workspace.options.export" -msgstr "fitarwa" +msgid "labels.view-only" +msgstr "gani kaxai" -msgid "workspace.layout_grid.editor.title" -msgstr "tace akwati" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.viewer" +msgstr "ma su kallo" -msgid "workspace.undo.entry.single.page" -msgstr "shafi" +msgid "labels.webhooks" +msgstr "Webhooks" -msgid "dashboard.export.explain" -msgstr "za ka iya fitar da kundi daya ko fiye ta hanyar tura taska. \"me \"*?" +#: src/app/main/ui/comments.cljs +msgid "labels.write-new-comment" +msgstr "rubuta s abon yabo" -msgid "shortcuts.open-interactions" -msgstr "tafi sashin da masu kallo suke hulda" +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.you" +msgstr "(kai)" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-multi-confirm.message" -msgstr "ka tabbata kana son goge %s kundaye?" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.your-account" +msgstr "fagenka" -#: src/app/main/ui/dashboard/team.cljs -msgid "team.webhooks.max-length" -msgstr "Sunan shafin yanar gizon zai kunshi a mafi yawa haruffa 2048." +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "media.loading" +msgstr "xora hoto …" -msgid "shortcuts.show-pixel-grid" -msgstr "nuna / boye akwatin pixel" +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"xakin ba komai. wurin ajiyar tawaga, turken da ka yi za ya yi aiki a sauran " +"kundaye. ka tabbata kai ne ka ke son wallafa shi?" -msgid "modals.delete-font.title" -msgstr "goge font" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.accept" +msgstr "qara yin wurin ajiyar tawaga" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-oidc-submit" -msgstr "shaidar buxewa" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.hint" +msgstr "" +"idan ka aje a wurin ajiyar tawaga, turken kundin xakin ajiyar za ya kasance " +"za a iya amfani da shi a sauran kundaye." -msgid "inspect.attributes.typography.text-decoration.underline" -msgstr "jan layi" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.message" +msgstr "qara “%s” xakin ajiya" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "gama aiki kan %s" +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.big-nudge" +msgstr "jan hankali" -#, markdown -msgid "dashboard.fonts.hero-text2" +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.confirm-email" +msgstr "tantance sabon imel" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.info" msgstr "" -"za ka iya xora fonts dinka ne domin ka sami dammar amfani da fenfot. gano " -"akwai qarin abubuwan das u ka dace da dokokin fpntaiki](https://fenfot.app/" -"dokoki.html). Za ka so bayani game da[ffonts](https://www.rubutu.com/faq)." +"za mu aika maka da imel ta wannan imel xin “%s” domin tantance " +"shaidarka." -msgid "workspace.sidebar.layers.images" -msgstr "hoto" +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.new-email" +msgstr "sabon imel" -msgid "dashboard.webhooks.content-type" -msgstr "irin ra'ayi" +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.submit" +msgstr "sake imel" -msgid "workspace.header.menu.show-pixel-grid" -msgstr "Nuna akwatin pixel" +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.title" +msgstr "sake imel xinka" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.copy-token" +msgstr "kwafar kyauta" #: src/app/main/ui/settings/access-tokens.cljs msgid "modals.create-access-token.expiration-date.label" msgstr "lokacin daina aiki" -msgid "shortcuts.h-distribute" -msgstr "raba ta tsaye" - -msgid "workspace.header.menu.undo" -msgstr "Cire" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "fiye da 50" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "suna" -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.show-interactions-on-click" -msgstr "Nuna hulda da an danna" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.placeholder" +msgstr "sunan zai iya taimakawa wajen sanin menene alama" -#: src/app/main/ui/workspace/colorpicker/libraries.cljs, src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.file-library" -msgstr "F" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "yi sabuwar alama" -msgid "dashboard.export-multi" -msgstr "fitar da fenfot %s kundaye" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "samar da alamar shiga" -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.email-already-validated" -msgstr "an farfaxo da imel." +msgid "modals.create-webhook.submit-label" +msgstr "qirqirar webhook" -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-weight" -msgstr "kaurin salon" +msgid "modals.create-webhook.title" +msgstr "qirqirar webhook" -msgid "shortcuts.artboard-selection" -msgstr "kirkiri allo daga zabi" +msgid "modals.create-webhook.url.label" +msgstr "farashin URL" -#: src/app/main/ui/dashboard/grid.cljs -msgid "dashboard.show-all-files" -msgstr "duk kundaye" +msgid "modals.create-webhook.url.placeholder" +msgstr "https://misali.com/postreceive" -msgid "errors.team-leave.owner-cant-leave" -msgstr "mai abu ba ya barin tawaga, dole adubi matsayin mai abu." +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "goge alama" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.left" -msgstr "Hagu" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.message" +msgstr "ka tabbata kana son goge wannan alamar?" -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.select-ui-language" -msgstr "zavavven harshen UI" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "goge alama" -msgid "workspace.undo.entry.single.color" -msgstr "kalar kadara" +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.cancel" +msgstr "ajiye asusu da soke shi" -#: src/app/main/data/workspace.cljs -msgid "errors.clipboard-not-implemented" -msgstr "manhajar binciken nan ba ta iya yin wannan aikin" +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.confirm" +msgstr "haka, goge asusu" -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-not-empty" -msgstr "dole lambar tsaro ta qunshi wasu alamomi, sannan tazara." +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.info" +msgstr "idan ka cire asusunka za ka iya rasa aikin da ka kammala." -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.line-height" -msgstr "tsahon layi" +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.title" +msgstr "ka tabbata ka na son goge asusunka?" -#: src/app/main/ui/confirm.cljs, src/app/main/ui/confirm.cljs -msgid "ds.confirm-title" -msgstr "ka tabbata?" +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.accept" +msgstr "goge fira" -msgid "labels.search-font" -msgstr "neman font" +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.message" +msgstr "ka tabbata ka na son goge fira? duk sharhi a nan za a goge matsaloli." -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.ungroup" -msgstr "raba rukunin" +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.title" +msgstr "goge tattaunawa" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "na gaba" +msgid "modals.delete-component-annotation.message" +msgstr "ka tabbata kana son goge wannan bayanin?" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-auto-height" -msgstr "sarrafaffan tsaho" +msgid "modals.delete-component-annotation.title" +msgstr "goge bayani" -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.profile" -msgstr "kundi" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.accept" +msgstr "goge kundi" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "bayyana yawan tawagarka?" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.message" +msgstr "ka tabbata kana son goge wannan kundin?" -msgid "workspace.focus.focus-on" -msgstr "maida hankali" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.title" +msgstr "goge kundi" -msgid "inspect.tabs.code.selected.frame" -msgstr "hukuma" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.accept" +msgstr "goge kundaye" -msgid "viewer.header.comments-section" -msgstr "Bayyana ra'ayi(%s)" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.message" +msgstr "ka tabbata kana son goge %s kundaye?" -msgid "labels.webhooks" -msgstr "Webhooks" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.title" +msgstr "gogewa %s kundaye" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.unlock" -msgstr "bude" +msgid "modals.delete-font-variant.message" +msgstr "" +"ka tabbata kana son goge wannan salon font din? ba zai xoru ba idan an yi " +"amfani da shi a kundi." -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-bottom-right" -msgstr "kasan dama" +msgid "modals.delete-font-variant.title" +msgstr "goge salon font" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay" -msgstr "bude mai rufi" +msgid "modals.delete-font.message" +msgstr "" +"ka tabbata kana son goge wannan font xin ? ba zai yi aiki ba idan an yi " +"amfani da shi a kundi." -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-dissolve" -msgstr "narkewa" +msgid "modals.delete-font.title" +msgstr "goge font" -msgid "onboarding-v2.newsletter.news" -msgstr "aiko man da bayanin fenfot (rubutun blog, bidiyon koyarwa, kallo...)." +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.body" +msgstr "ka tabbata kana son goge wannan shafin?" -msgid "common.unpublish" -msgstr "maras wallafa" +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.title" +msgstr "goge shafi" -msgid "workspace.undo.entry.single.rect" -msgstr "rectangle" +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.accept" +msgstr "goge aiki" -msgid "shortcuts.toggle-visibility" -msgstr "Nuna/boye" +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.message" +msgstr "ka tabbata kana son goge wannan aikin?" -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.settings" -msgstr "gyara" +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.title" +msgstr "goge aikin" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-full-screen" -msgstr "Cika allon" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.accept" +msgid_plural "modals.delete-shared-confirm.accept" +msgstr[0] "goge kundi" +msgstr[1] "goge kundaye" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.cut" -msgstr "cire" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "ba zai yi aiki a kowane kundi ba." +msgstr[1] "ba za su yi aiki a kowane kundi ba." -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "... jagora, yawan amfani da shiga, leqe-leqe, dss." +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.scd-message" +msgid_plural "modals.delete-shared-confirm.activated.scd-message" +msgstr[0] "za a iya buxe wannan taskirar a nan: " +msgstr[1] "za a iya buxe taskirorin nan a nan: " -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-60-days" -msgstr "kwanaki 60" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.message" +msgid_plural "modals.delete-shared-confirm.message" +msgstr[0] "ka tabbata kana son goge wannan kundin?" +msgstr[1] "ka tabbata kana son goge waxannan kundayen?" -msgid "shortcut-section.viewer" -msgstr "Dankallo" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.title" +msgid_plural "modals.delete-shared-confirm.title" +msgstr[0] "goge kundi" +msgstr[1] "goge kundaye" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.unpublish-multi-files" -msgstr "kundayen da ba a wallafa ba %s" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.accept" +msgstr "goge tawaga" -msgid "common.share-link.confirm-deletion-link-description" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.message" msgstr "" -"ka tabbata ka na son rufe wannan hanyar? idan ka rufe ba mai iya sake bi" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.accept" -msgstr "goge aiki" +"ka tabbata kana son goge wannan tawagar? Duk aiyukanka na kundayen da suka " +"danganci tawagar za su yi gogewar dindindin." -#: src/app/main/ui/settings/password.cljs -msgid "generic.error" -msgstr "afkuwar matsala" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.title" +msgstr "gogewar tawaga" -msgid "workspace.header.menu.disable-scale-content" -msgstr "kashe sikelin rabo" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.accept" +msgstr "goge memba" -msgid "dashboard.export.options.detach.title" -msgstr "lura da bayanan da ke cikin manhajar tura kundi" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.message" +msgstr "ka tabbata kana son cire wannan memban a wannan tawaar?" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-object-slow" -msgstr "Fitarwa ba tsammani ta sami tsaiko" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.title" +msgstr "cire memban tawaga" -#: src/app/main/ui/workspace/header.cljs -msgid "dashboard.export-shapes" -msgstr "Fitarwa" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "" +"duk aikin da aka yi a wannan kundin, nan za a same shi (ba zanen da za a " +"iya tsinkawa)." +msgstr[1] "" +"duk aikin da aka yi a waxancan kundayen, can za a same su (ba zane da za " +"iya tsinkawa)." -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.lock" -msgstr "kulle" +msgid "modals.delete-webhook.accept" +msgstr "goge webhook" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.help-center" -msgstr "sashen taimako" +msgid "modals.delete-webhook.message" +msgstr "ka tabbata ka na son goge webhook?" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.modify" -msgstr "gyaggyarawa %s" +msgid "modals.delete-webhook.title" +msgstr "gogewa webhook" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "da yawa" +msgid "modals.edit-webhook.submit-label" +msgstr "gyara webhook" -msgid "dashboard.download-binary-file" -msgstr "sauke manhajar fenfot(.manhajar fenfot)" +msgid "modals.edit-webhook.title" +msgstr "gyara webhook" -msgid "dashboard.fonts.deleted-placeholder" -msgstr "rashin font" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-member-confirm.accept" +msgstr "aika saqon" -msgid "shortcuts.opacity-6" -msgstr "Saita dishi dishi zuwa kashi 60" +msgid "modals.invite-member.emails" +msgstr "imel, rabawar waqafi" -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.hex" -msgstr "HEX" +msgid "modals.invite-member.repeated-invitation" +msgstr "" +"waxansu imel daga membobin qungiyar na yanzu. ba za a aikawa da gayyatarsu " +"ba ." #: src/app/main/ui/dashboard/team.cljs -msgid "labels.expired-invitation" -msgstr "daina aiki" +msgid "modals.invite-team-member.title" +msgstr "gayyato membobi zuwa ga tawaga" -msgid "onboarding.team-modal.create-team-desc" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.hint" msgstr "" -"tawaga na ba ka damar haduwa da masu amfani da fenfot domin yi aiki daya " -"akan kundaye." +"ka tabbata memban tawaga kaxai, za ya iya goge tawaga tare da aikinta da " +"kundaye." -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.email-has-permanent-bounces" -msgstr "imel «%s» na da bayanan matsaloli na dindindin." +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.message" +msgstr "ka tabbata ka na son fita daga %s tawaga?" -msgid "errors.webhooks.unexpected-status" -msgstr "matsayin da ba zato %s" +msgid "modals.leave-and-reassign.forbidden" +msgstr "" +"ba za ku iya bari ba idan ba wani memba da zai ingata wa mai shi. ku na iya " +"goge tawaga." -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.typography" -msgstr "%s Rubutun rubutu" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.hint1" +msgstr "" +"kai ne mai wannan tawagar. zabi wani memba da za ya iya inganta wa mai shi " +"kafin ka fita." -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.your-email" -msgstr "imel" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.promote-and-leave" +msgstr "inganta sannan ka bari" -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.title" -msgstr "goge tattaunawa" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.select-member-to-promote" +msgstr "zavi memba domin havakawa" -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.big-nudge" -msgstr "jan hankali" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.title" +msgstr "kafin ka fita" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.accept" +msgstr "barin tawaga" #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.leave-confirm.message" msgstr "ka tabbata ka na son barin wannan tawagar?" -msgid "dashboard.webhooks.empty.no-webhooks" -msgstr "ba a gina wani webhooks ba." - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.invite-team-member.title" -msgstr "gayyato membobi zuwa ga tawaga" - -msgid "shortcut-section.workspace" -msgstr "fagen aiki" - #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.leave-confirm.title" msgstr "barin tawaga" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "fara" +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.nudge-title" +msgstr "adadin jan hankali" #: src/app/main/ui/dashboard/team.cljs -msgid "labels.resend-invitation" -msgstr "sake aika saqon gayyata" +msgid "modals.promote-owner-confirm.accept" +msgstr "canza wurin mallaka" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.difference" -msgstr "banbanci" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.hint" +msgstr "" +"idan ka canza wurin mallaka, ba za ka iya sauya matsayin shugaba ba, " +"gazawar wasu dokokin wannan tawaagar. " -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.hide-resolved-comments" -msgstr "voye saqon da aka buxa" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.message" +msgstr "kai ke da wannan tawagar yanzu. ka tabbata kana son yin %s sabon mai tawaga?" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin-all" -msgstr "gefen duka" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.title" +msgstr "mallakar tawaga" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.github-repo" -msgstr "taskar rubuce-rubuce" +msgid "modals.publish-empty-library.accept" +msgstr "wallafa" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.strikethrough" -msgstr "gigciye ta cikinsa (%s)" +msgid "modals.publish-empty-library.message" +msgstr "ba komai a taskarka. ka na son wallafa ta?" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.darken" -msgstr "kara masa duhu" +msgid "modals.publish-empty-library.title" +msgstr "wallafa taska maras komai" -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.confirm-password" -msgstr "tabbatar da kalmar buxewa" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.accept" +msgstr "cire taskar shiye-shirye" -msgid "shortcuts.open-workspace" -msgstr "tafi fagen aiki" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.hint" +msgstr "" +"idan ba ka cire taskar shirye-shirye ba, kundin taskar na wannan kundin zai " +"tsaya kasancewar za ka iya amfani da shi a cikin kundayenka." -msgid "labels.and" -msgstr "da" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.message" +msgstr "cire “%s” a taskar shirye-shirye" -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.top" -msgstr "sama" +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.small-nudge" +msgstr "qaramin jan hankali" -msgid "shortcut-subsection.main-menu" -msgstr "Babbar kumshiya" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.accept" +msgid_plural "modals.unpublish-shared-confirm.accept" +msgstr[0] "maras wallafa" +msgstr[1] "maras wallafa" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.message" +msgid_plural "modals.unpublish-shared-confirm.message" +msgstr[0] "ka tabbata ka na son rufe taskar nan?" +msgstr[1] "ka tabbata ka na son rufe taskokin nan?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.title" +msgid_plural "modals.unpublish-shared-confirm.title" +msgstr[0] "rufe taska" +msgstr[1] "rufe taskoki" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.hint" +msgstr "" +"ka kusa sabunta taskar ajiyar shir-shirye. zai iya shafar sauran kundayen " +"da ke amfani da ita." + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.accept" +msgstr "sabunta" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.cancel" +msgstr "soke" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.hint" +msgstr "" +"ka kusa sabunta sashe a babbar taska. wannan za ya iya aiki a sauran " +"kundayen da ke amfani da ita." -#: src/app/main/ui/auth/register.cljs -msgid "auth.fullname" -msgstr "cikakken suna" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.message" +msgstr "sabunta sashe a babbar taska" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.reset-overrides" -msgstr "sake saita sokewa" +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "akwai sabon yayi, fatan za a sabunta fage" -msgid "common.share-link.permissions-hint" -msgstr "duk wanda ya mallaki mataki,za ya iya shiga" +#: src/app/main/ui/dashboard/team.cljs +msgid "notifications.invitation-email-sent" +msgstr "an aika da saqon" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.accept" -msgstr "cire taskar shiye-shirye" +#: src/app/main/ui/dashboard/team.cljs +msgid "notifications.invitation-link-copied" +msgstr "kwafar hanyar gayya" -msgid "workspace.undo.entry.multiple.typography" -msgstr "rubutun rubuta kadara" +#: src/app/main/ui/settings/delete_account.cljs +msgid "notifications.profile-deletion-not-allowed" +msgstr "ba za ka iya goge kundin ba. ka jira umarnin tawaga ka fin ka ci gaba." -msgid "shortcuts.align-center" -msgstr "tsarin tsakiya" +#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs +msgid "notifications.profile-saved" +msgstr "an ajiye bayanai!" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-center" -msgstr "jerin tsakiya (%s)" +#: src/app/main/ui/settings/change_email.cljs +msgid "notifications.validation-email-sent" +msgstr "an aika da imel din tantancewa %s. bincika imel xinka!" -msgid "dashboard.webhooks.description" +msgid "onboarding-v2.before-start.desc1" msgstr "" -"Webhooks hanyar sanar da manhajoji da addireshi intanet idan wani ya faru a " -"Penpot. za a tura maka da saqon talla URLs ka samar da." - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.text-palette" -msgstr "rubutub rubutu (%s)" +"ya kamata kasan akwai kayayyaki da yawa da za su iya taimaka maka ka sami " +"damar fara aiki da fenfot, kamar jagoran mai amfani tasharmu ta youtub." -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.titlecase" -msgstr "yanayin lakani" +msgid "onboarding-v2.before-start.desc2" +msgstr "" +"cikakken bayanin yadda za a yi amfani da fenfot. daga rubutu zuwa tsara ko " +"rarraba iri." -msgid "workspace.sidebar.layers.frames" -msgstr "allo" +msgid "onboarding-v2.before-start.desc2.title" +msgstr "xanjagora" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fit" -msgstr "dace - ja sikeli ya dace da shi" +msgid "onboarding-v2.before-start.desc3" +msgstr "za ka iya kallon koyarwarmu da mutanenmu ke yi." -#: src/app/main/ui/dashboard/files.cljs -msgid "title.dashboard.files" -msgstr "%s - Tukunyar aje biro" +msgid "onboarding-v2.before-start.desc3.title" +msgstr "koyarwa ta hoto mai motsi" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-object-error" -msgstr "An gaza fitarwa" +msgid "onboarding-v2.before-start.title" +msgstr "kafin ka fara" -#: src/app/main/ui/alert.cljs -msgid "ds.alert-ok" -msgstr "haka" +msgid "onboarding-v2.newsletter.desc" +msgstr "" +"domin jin daxin fenfot , sai ka biya kuxi domin labarai da ci gaban da ake " +"samu." -msgid "shortcuts.escape" -msgstr "kubuta" +msgid "onboarding-v2.newsletter.news" +msgstr "aiko man da bayanin fenfot (rubutun blog, bidiyon koyarwa, kallo...)." -msgid "shortcuts.copy" -msgstr "kwafi" +msgid "onboarding-v2.newsletter.privacy1" +msgstr "mu na kula da sirri, a nan za ka karanta na mu " -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.hsv" -msgstr "HSV" +msgid "onboarding-v2.newsletter.privacy2" +msgstr "" +"za mu aika maka da imel mai amfani. za ka iya biya a kowane lokaci za ka " +"iya ta kowace hanyar biyanmu." -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.delete-flow-start" -msgstr "goge kwararar farko" +msgid "onboarding-v2.newsletter.updates" +msgstr "aiko man da sabbin abubuwan da aka yi (sabbib fasali, fitowa, gyara...)." -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-left" -msgstr "kasa hagu" +msgid "onboarding-v2.welcome.desc1" +msgstr "" +"fenfot ne ke yin kelaidos kamar yadda mutane ke yi, mutane na taimakon " +"junansu. kowa za ya iya hada hannu da:" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "mai daraja" +msgid "onboarding-v2.welcome.desc2" +msgstr "" +"wurin da kowa zai iya koyo, fahimtar ta juna a kan fenfot, kasancewarta " +"manyan tawagar fenfot da sauran mutane." -msgid "dashboard.export.detail" -msgstr "*akwai sassan,hotuna,launuka,da/kozane-zane." +msgid "onboarding-v2.welcome.desc2.title" +msgstr "hulxa da kai cikin mutane" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.hint" +msgid "onboarding-v2.welcome.desc3" msgstr "" -"idan ka aje a wurin ajiyar tawaga, turken kundin xakin ajiyar za ya kasance " -"za a iya amfani da shi a sauran kundaye." +"wurin da za ka san yadda za ka hada-hannu da fassara, neman fasali, manyan " +"gudunmawa, magance matsala…" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-offset-effect" -msgstr "cire tasiri" +msgid "onboarding-v2.welcome.desc3.title" +msgstr "gudunmawar jagora" -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to" -msgstr "tura a" +msgid "onboarding-v2.welcome.title" +msgstr "barka da zuwa fenfot!" -msgid "modals.create-webhook.title" -msgstr "qirqirar webhook" +msgid "onboarding.choice.team-up.create-team-desc" +msgstr "bayan ka yi wa tawagarka suna, za ka iya gaiyato mutane ku hadu." -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.rgba" -msgstr "RGBA" +msgid "onboarding.choice.team-up.create-team-placeholder" +msgstr "sanya sunan tawaga" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.mixed" -msgstr "gauraya" +msgid "onboarding.choice.team-up.invite-members" +msgstr "gayyato mambobi" -msgid "shortcuts.detach-component" -msgstr "rarraba abubuwan da su ke a ware" +msgid "onboarding.choice.team-up.invite-members-info" +msgstr "" +"ka tuna da kowa. masu qirqira, masu tsarawa, shuwagabanniS... daban-daban " +"ya qara :)" -msgid "shortcuts.reset-zoom" -msgstr "zake zukowa" +msgid "onboarding.choice.team-up.roles" +msgstr "gayyata tare da bayar da matsayi:" -msgid "onboarding-v2.welcome.desc3" +msgid "onboarding.newsletter.accept" +msgstr "haka, za a biya" + +msgid "onboarding.newsletter.acceptance-message" msgstr "" -"wurin da za ka san yadda za ka hada-hannu da fassara, neman fasali, manyan " -"gudunmawa, magance matsala…" +"an aika maka da saqon buqatar biya, za mu aika maka da saqon imel tabbatar " +"da shi." -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.hright" -msgstr "Daidaita dama (%s)" +msgid "onboarding.newsletter.policy" +msgstr "dokoki." -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.status" -msgstr "daraja" +msgid "onboarding.newsletter.title" +msgstr "ka buqatar labaran fenfot?" -msgid "common.share-link.permissions-can-comment" -msgstr "sharhi" +msgid "onboarding.team-modal.create-team" +msgstr "yin tawaga" -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgba" -msgstr "RGBA" +msgid "onboarding.team-modal.create-team-desc" +msgstr "" +"tawaga na ba ka damar haduwa da masu amfani da fenfot domin yi aiki daya " +"akan kundaye." -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row" -msgstr "jerawa" +msgid "onboarding.team-modal.create-team-feature-1" +msgstr "aiyuka da kundaye da yawa" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to" -msgstr "kewayawa zuwa" +msgid "onboarding.team-modal.create-team-feature-2" +msgstr "ma su yin shiri dayawa lokaci xaya" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "ya kake tunanin aiki da fenfot?" +msgid "onboarding.team-modal.create-team-feature-3" +msgstr "aiyukan shugaba" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.inner" -msgstr "ciki" +msgid "onboarding.team-modal.create-team-feature-4" +msgstr "Unlimited members" -msgid "onboarding-v2.before-start.desc1" -msgstr "" -"ya kamata kasan akwai kayayyaki da yawa da za su iya taimaka maka ka sami " -"damar fara aiki da fenfot, kamar jagoran mai amfani tasharmu ta youtub." +msgid "onboarding.team-modal.create-team-feature-5" +msgstr "100% kyauta!" -msgid "shortcut-subsection.general-viewer" -msgstr "gamayya" +msgid "onboarding.templates.subtitle" +msgstr "ga wasu hotunan talla nan." -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-members" -msgstr "mambobin tawaga" +msgid "onboarding.templates.title" +msgstr "fara tsarawa" -#: src/app/main/data/dashboard.cljs -msgid "dashboard.new-file-prefix" -msgstr "sabon kundi" +msgid "onboarding.welcome.alt" +msgstr "fenfot" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-expire" -msgstr "lambar tsaron za ta gama aiki %s" +#: src/app/main/ui/auth/recovery.cljs +msgid "profile.recovery.go-to-login" +msgstr "je ka hanyar shiga" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.underline" -msgstr "ja layi (%s)" +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "wane kayan zane ka fi iya aiki da shi?" -msgid "onboarding.choice.team-up.create-team-desc" -msgstr "bayan ka yi wa tawagarka suna, za ka iya gaiyato mutane ku hadu." +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to" -msgstr "" -"za ka iya daidaita kayan zanenka ta hanyar (amfani da madannin qasa sashen " -"dama)." +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.accept" -msgstr "goge fira" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.success-duplicate-project" -msgstr "an kwafi aikinka" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "da yawa" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.cancel" -msgstr "sokewa" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay-dest" -msgstr "kulle mai rufi %s" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canva" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.accept" -msgstr "goge alama" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "ta ya za ka bayyana kwarewarka akai..." -#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.your-penpot" -msgstr "fenfot na ka" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "ma su tsarawa" -msgid "shortcuts.bring-forward" -msgstr "tura gaba" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "ma su qirqira" -msgid "workspace.header.menu.redo" -msgstr "sake" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "qara samun bayanin fenfot" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.detach-instance" -msgstr "raba yanayin abin" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" -msgid "shortcuts.opacity-9" -msgstr "Seta dish dishi zuwa 90" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "mawallafi/VP" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-right" -msgstr "jera dama (%s)" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "ni mai zaman kansa ne" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-textpalette" -msgstr "Nuna launukan tsarin rubutu" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "sami lambar kowane aiki " -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flip-horizontal" -msgstr "kifa ta tsaye" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... zane-zane, kayan kallo, tsarin qira, etc." -msgid "labels.continue" -msgstr "ci gaba" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "teburin aiki" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.hard-light" -msgstr "Haske mai muya" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "barin aikin tawaga" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-max-w" -msgstr "fadi mafi yawa" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "za mu fara!" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.management" -msgstr "shuwagabannin tawaga" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "shugaban aiki" -msgid "inspect.tabs.code.selected.component" -msgstr "bangare" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "kasuwanci" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column-reverse" -msgstr "sake shafi" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "fiye da 50" -msgid "dashboard.download-standard-file" -msgstr "sauke cikakken kundi(.svg + .json)" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "na gaba" -#: src/app/main/ui/static.cljs -msgid "labels.internal-error.desc-message" -msgstr "" -"an sami matsala. sake gwadawa idan matsalar ba ta kauce ba, tuntubi sashen " -"taimako." +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "babu" -msgid "labels.font-variants" -msgstr "salo" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "idan akwai qari (bayyana)" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.title" -msgstr "kafin ka fita" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "ina aikin kaina" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.front" -msgstr "kawo zuwa gaba" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "can baya" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-center" -msgstr "tsakiya" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "ya kake tunanin aiki da fenfot?" -#: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "errors.unexpected-error" -msgstr "afkuwar kuskuren da ba a zata ba." +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "mi ne ne matsayinka?" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.no-shared-libraries-available" -msgstr "Babu rababbun ma'adanai wanda aka samu" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "dauki wanda kake so" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.square" -msgstr "murabba'i" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "zana" -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.fullscreen" -msgstr "Cika fuskar" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "wasu" -msgid "workspace.undo.entry.single.multiple" -msgstr "wani abu" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "fara" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.role" -msgstr "matsayi" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "fara aiki na" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.add-interaction" -msgstr "Danna wannan madannin + domin saka hulda." +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "malami ko dalibi" -msgid "workspace.shape.menu.difference" -msgstr "bambanci" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "bayyana yawan tawagarka?" -msgid "workspace.assets.duplicate-main" -msgstr "maimaita ainihin" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "jaraba fenfot ka ga ko ta yi daidai da tawaga " -msgid "shortcuts.fit-all" -msgstr "fitar da abubuwan da zai dace da ko wane abu" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "jaraba kafin ka yi aiki da fenfot" -msgid "workspace.undo.entry.multiple.path" -msgstr "hanya" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "... jagora, yawan amfani da shiga, leqe-leqe, dss." -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-right" -msgstr "kasa dama" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "yin aikin kan tunani mai kyau" -#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.duplicate" -msgstr "maimaita" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"bayaninka za ya sanya mu fahimci kwarewarka da xabi'unka ta haka ne za mu " +"mayar maka da fenfot kayan aikin da ka ke jin daxin aiki da shi." -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show-main" -msgstr "nuna ainihin wurin" +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "cire" -msgid "onboarding-v2.before-start.desc2.title" -msgstr "xanjagora" +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "settings.multiple" +msgstr "gauraya" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "ta ya za ka bayyana kwarewarka akai..." +# SECTIONS +msgid "shortcut-section.basics" +msgstr "shikashikai" -msgid "shortcut-subsection.zoom-viewer" -msgstr "Zukowa" +msgid "shortcut-section.dashboard" +msgstr "allon kallo" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.remove-shared" -msgstr "cire matattarar kundate" +msgid "shortcut-section.viewer" +msgstr "Dankallo" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "dauki wanda kake so" +msgid "shortcut-section.workspace" +msgstr "fagen aiki" -msgid "shortcuts.v-distribute" -msgstr "Rarraba ta tsaye" +# SUBSECTIONS +msgid "shortcut-subsection.alignment" +msgstr "kwaskwarima" -msgid "common.share-link.page-shared" -msgid_plural "common.share-link.page-shared" -msgstr[0] "tura shafi 1" -msgstr[1] "%s an tura shafi" +msgid "shortcut-subsection.edit" +msgstr "Tace" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.grid-title" -msgstr "Akwati" +msgid "shortcut-subsection.general-dashboard" +msgstr "gamayya" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.offsetx" -msgstr "X" +msgid "shortcut-subsection.general-viewer" +msgstr "gamayya" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.twitter-go-to" -msgstr "je ka tiwita" +msgid "shortcut-subsection.main-menu" +msgstr "Babbar kumshiya" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.none" -msgstr "ba komai" +msgid "shortcut-subsection.modify-layers" +msgstr "gyara shimfida" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.exclusion" -msgstr "warewa" +msgid "shortcut-subsection.navigation-dashboard" +msgstr "shawagi" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.title" -msgstr "labari" +msgid "shortcut-subsection.navigation-viewer" +msgstr "shawagi" -msgid "workspace.options.recent-fonts" -msgstr "da dimi dimi" +msgid "shortcut-subsection.navigation-workspace" +msgstr "shawagi" -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.new-email" -msgstr "sabon imel" +msgid "shortcut-subsection.panels" +msgstr "allon sarrarfav naura" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.search-shared-libraries" -msgstr "Duba rabbaun ma'adanai" +msgid "shortcut-subsection.path-editor" +msgstr "Hanya" -msgid "shortcuts.text-align-left" -msgstr "jera hagu" +msgid "shortcut-subsection.shape" +msgstr "Siffa" -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-subtitle" -msgstr "kyauta ne,an buxe hanyar samu" +msgid "shortcut-subsection.text-editor" +msgstr "Rubutu" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-textpalette" -msgstr "boye launukan yanayin tsarin rubutu" +msgid "shortcut-subsection.tools" +msgstr "Kayan aiki" -msgid "labels.view-only" -msgstr "gani kaxai" +msgid "shortcut-subsection.zoom-viewer" +msgstr "Zukowa" -msgid "workspace.undo.entry.single.component" -msgstr "bangarori" +msgid "shortcut-subsection.zoom-workspace" +msgstr "Zukowa" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.row" -msgstr "layuka" +msgid "shortcuts.add-comment" +msgstr "Bayyana Ra'ayi" -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.upload-all" -msgstr "xora duka" +msgid "shortcuts.add-node" +msgstr "kara Girma" -msgid "inspect.attributes.typography.text-transform.none" -msgstr "babu" +msgid "shortcuts.align-bottom" +msgstr "tsarin kasa" -msgid "workspace.assets.local-library" -msgstr "dakin karatun gida" +msgid "shortcuts.align-center" +msgstr "tsarin tsakiya" -msgid "shortcuts.move-fast-right" -msgstr "matsa dama da sauri" +msgid "shortcuts.align-hcenter" +msgstr "tsarin tsakiya ko ina" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.unmask" -msgstr "bude takunkumi" +msgid "shortcuts.align-justify" +msgstr "Tabbataccan tsari" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-submit" -msgstr "shiga ciki" +msgid "shortcuts.align-left" +msgstr "tsarin hagu" -msgid "shortcuts.toggle-textpalette" -msgstr "Juya zuwa launukan rubutu" +msgid "shortcuts.align-right" +msgstr "tsarin dama" -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.update-team" -msgstr "sabunta tawaga" +msgid "shortcuts.align-top" +msgstr "tsarin sama" -#: src/app/main/ui/workspace/sidebar/options/page.cljs -msgid "workspace.options.canvas-background" -msgstr "bayan zane" +msgid "shortcuts.align-vcenter" +msgstr "tsarin tsakiya a tsaye" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-top" -msgstr "jerin sama" +msgid "shortcuts.artboard-selection" +msgstr "kirkiri allo daga zabi" -msgid "shortcuts.font-size-dec" -msgstr "rage girman rubutu" +msgid "shortcuts.bold" +msgstr "fito da shi barobaro" -msgid "dashboard.webhooks.empty.add-one" -msgstr "danna qasa \"sanya webhook\" qara xaya." +msgid "shortcuts.bool-difference" +msgstr "ma'auni mabanbanci" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.default-team-name" -msgstr "manhajar fenfot" +msgid "shortcuts.bool-exclude" +msgstr "kebentaccan ma'auni" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-pressing" -msgstr "yayin dannawa" +msgid "shortcuts.bool-intersection" +msgstr "ma'aunin abubuwa daban daban" -msgid "shortcuts.open-dashboard" -msgstr "tafi gaban allon" +msgid "shortcuts.bool-union" +msgstr "ma'auni hadaka" -#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.profile-is-muted" -msgstr "bayananka su na da imel maras motsi (baiyana matsaloli)." +msgid "shortcuts.bring-back" +msgstr "tura zuwa baya" -msgid "shortcuts.start-measure" -msgstr "fara aunawa" +msgid "shortcuts.bring-backward" +msgstr "komawa baya" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.center" -msgstr "Tsakiya" +msgid "shortcuts.bring-forward" +msgstr "tura gaba" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.submit-label" -msgstr "yi sabuwar alama" +msgid "shortcuts.bring-front" +msgstr "kawo zuwa gaba" -msgid "workspace.sidebar.collapse" -msgstr "ruguza a'ajiyar bayani" +msgid "shortcuts.clear-undo" +msgstr "goge sake" -msgid "common.share-link.permissions-can-inspect" -msgstr "iya bincka lamba" +msgid "shortcuts.copy" +msgstr "kwafi" -msgid "workspace.options.height" -msgstr "Tsawo" +msgid "shortcuts.create-component" +msgstr "samar da abubuwa iri- iri" -msgid "shortcuts.draw-ellipse" -msgstr "siffar kwai" +msgid "shortcuts.create-new-project" +msgstr "samar da sabo abu" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "ma su tsarawa" +msgid "shortcuts.cut" +msgstr "cire" -#, markdown -msgid "dashboard.fonts.hero-text1" -msgstr "" -"duk wani adireshi da ka xora a nan dangin font ne a wannan tawagar za a sami " -"kundayen da ke xauke da kayan rubutu. Da fontfont iri daya ne ake kasawa**" -"gwaurayen font**. Za ka iya xora font ta waxannan hanyoyin: **TTF, OTF and " -"WOFF** (xaya kawai ake buqata)." +msgid "shortcuts.decrease-zoom" +msgstr "fito da shi waje" -#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.drafts" -msgstr "adana" +msgid "shortcuts.delete" +msgstr "goge" -#: src/app/main/ui/dashboard/projects.cljs -msgid "title.dashboard.projects" -msgstr "tsare tsare - %s - Mazubin biruka" +msgid "shortcuts.delete-node" +msgstr "fita da ga cikin net wok" -#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs -msgid "labels.retry" -msgstr "sake gwadawa" +msgid "shortcuts.detach-component" +msgstr "rarraba abubuwan da su ke a ware" -msgid "modals.delete-webhook.title" -msgstr "gogewa webhook" +msgid "shortcuts.draw-curve" +msgstr "Ratse" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.update-main" -msgstr "sabunta ainihin wurin" +msgid "shortcuts.draw-ellipse" +msgstr "siffar kwai" -msgid "shortcuts.toggle-rules" -msgstr "Nuna / boye magwaji" +msgid "shortcuts.draw-frame" +msgstr "Allo" + +msgid "shortcuts.draw-nodes" +msgstr "samar da hanya" msgid "shortcuts.draw-path" msgstr "Hanya" -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.code.selected.multiple" -msgstr "%s zavavve" +msgid "shortcuts.draw-rect" +msgstr "Ractangula" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flow-start" -msgstr "fara malala" +msgid "shortcuts.draw-text" +msgstr "rubutaccan sako" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "babu" +msgid "shortcuts.duplicate" +msgstr "maimaita" -msgid "inspect.attributes.typography.text-transform.titlecase" -msgstr "yadda ake rubuta batu" +msgid "shortcuts.escape" +msgstr "kubuta" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "za mu fara!" +msgid "shortcuts.export-shapes" +msgstr "samar da sabbabbin abubuwa" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.remove-flex" -msgstr "cire sassaukan tsari" +msgid "shortcuts.fit-all" +msgstr "fitar da abubuwan da zai dace da ko wane abu" -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "modals.delete-page.body" -msgstr "ka tabbata kana son goge wannan shafin?" +msgid "shortcuts.flip-horizontal" +msgstr "kifa shi dai dai" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow-start" -msgstr "Gudun farko" +msgid "shortcuts.flip-vertical" +msgstr "kifa ta tsaye" -msgid "shortcuts.move" -msgstr "matsa" +msgid "shortcuts.font-size-dec" +msgstr "rage girman rubutu" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.message" -msgstr "ka tabbata kana son goge wannan kundin?" +msgid "shortcuts.font-size-inc" +msgstr "kara gaban yanayi" -msgid "shortcuts.opacity-3" -msgstr "Seta dashi dashi zuwa kashi 50" +msgid "shortcuts.go-to-drafts" +msgstr "ta fi rumbu" -msgid "common.share-link.team-members" -msgstr "memba kaxai" +msgid "shortcuts.go-to-libs" +msgstr "ta fi zuwa rabbabben ma'ajiya" -msgid "workspace.sidebar.layers.components" -msgstr "bangare" +msgid "shortcuts.go-to-search" +msgstr "gajeran sako" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease" -msgstr "sauki" +msgid "shortcuts.group" +msgstr "rukuni" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.placeholder" -msgstr "sunan zai iya taimakawa wajen sanin menene alama" +msgid "shortcuts.h-distribute" +msgstr "raba ta tsaye" -#: src/app/main/ui/settings/password.cljs -msgid "labels.confirm-password" -msgstr "tabbatar da lambar tsaro" +msgid "shortcuts.hide-ui" +msgstr "fito / boye UI" -#: src/app/main/ui/workspace/sidebar/options/menus/svg_attrs.cljs, src/app/main/ui/inspect/attributes/svg.cljs -msgid "workspace.sidebar.options.svg-attrs.title" -msgstr "shigo da shi SVG halaye" +msgid "shortcuts.increase-zoom" +msgstr "zuko ciki" -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to-link" -msgstr "bayanin yadda ake fitarwa daga fenfot" +msgid "shortcuts.insert-image" +msgstr "sa hoto" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.comments" -msgstr "ra'ayi (%s)" +msgid "shortcuts.italic" +msgstr "juya zuwa kwantaccen rubuyu" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-none" -msgstr "Babu" +msgid "shortcuts.join-nodes" +msgstr "hada abubuwan" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.columns" -msgstr "shafi" +msgid "shortcuts.letter-spacing-dec" +msgstr "rage filin harafin" -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.accept" -msgstr "canza wurin mallaka" +msgid "shortcuts.letter-spacing-inc" +msgstr "kara filin harafin" -msgid "workspace.viewport.click-to-close-path" -msgstr "latsa kusa da hanya" +msgid "shortcuts.line-height-dec" +msgstr "rage tsawon layi" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Adobe XD" +msgid "shortcuts.line-height-inc" +msgstr "kara tsawon layi" -msgid "labels.close" -msgstr "rufewa" +msgid "shortcuts.line-through" +msgstr "danna layin duk" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.lighten" -msgstr "kara masa haske" +msgid "shortcuts.make-corner" +msgstr "kirkiri kwana" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "workspace.options.export-multiple" -msgstr "Fitar da zababbun" +msgid "shortcuts.make-curve" +msgstr "kirkiri lankwasa" -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "cire" +msgid "shortcuts.mask" +msgstr "takunkumi" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.hide" -msgstr "boye" +msgid "shortcuts.merge-nodes" +msgstr "hada da kauri" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "zana" +msgid "shortcuts.move" +msgstr "matsa" -#: src/app/main/ui/settings/change_email.cljs -msgid "errors.email-invalid-confirmation" -msgstr "tabbata imel xinka ya yi daidai" +msgid "shortcuts.move-fast-down" +msgstr "Matsa kasa da sauri" -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.title" -msgstr "Fitar da zavi" +msgid "shortcuts.move-fast-left" +msgstr "Matsa hagu da sauri" -msgid "onboarding-v2.welcome.desc2.title" -msgstr "hulxa da kai cikin mutane" +msgid "shortcuts.move-fast-right" +msgstr "matsa dama da sauri" -msgid "dashboard.import.progress.process-page" -msgstr "fejin kasuwar duniya: %s" +msgid "shortcuts.move-fast-up" +msgstr "Matsa sama da sauri" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.set-default" -msgstr "saita a tsoho" +msgid "shortcuts.move-nodes" +msgstr "matsa a hade" -#: src/app/main/errors.cljs -msgid "errors.feature-mismatch" -msgstr "" -"tamkar ka buxe wani kundi da ke da muhimmanci '%s' bayar da dama qarin da ka " -"yi ma fenfot xinka bai karbu ba ko ba zai yi aiki ba." +msgid "shortcuts.move-unit-down" +msgstr "Matsa da sashin kasa" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.retry" -msgstr "sake" +msgid "shortcuts.move-unit-left" +msgstr "Matsa da sashin hagu" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-palette" -msgstr "nuna launukan kala" +msgid "shortcuts.move-unit-right" +msgstr "Matsa da sashin dama" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-relative-to" -msgstr "alaka zuwa" +msgid "shortcuts.move-unit-up" +msgstr "Matsa da sashin samu" -msgid "errors.webhooks.ssl-validation" -msgstr "kuskure kan farfaxo da SSL." +msgid "shortcuts.next-frame" +msgstr "wani tsari" -msgid "shortcuts.create-component" -msgstr "samar da abubuwa iri- iri" +msgid "shortcuts.not-found" +msgstr "babu gajeriyar hanya" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.update-components-in-bulk" -msgstr "sabunta ainihin wurin" +msgid "shortcuts.opacity-0" +msgstr "Saita dishi dishi zuwa kashi 100" -msgid "auth.terms-privacy-agreement" -msgstr "" -"lokacin qirqirar kundi, sai ka amincewa da yanayi aikin da " -"qa'idojinmuqa'idoji." +msgid "shortcuts.opacity-1" +msgstr "saita dishi dishi zuwa kashi 10" -msgid "modals.delete-font-variant.title" -msgstr "goge salon font" +msgid "shortcuts.opacity-2" +msgstr "Saita dishi dishi zuwa kashi 20" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.sidebar.history" -msgstr "labari (%s)" +msgid "shortcuts.opacity-3" +msgstr "Seta dashi dashi zuwa kashi 50" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.no-libraries-need-sync" -msgstr "Babu rabben ma'adanai da suke bukatar sabuntawa" +msgid "shortcuts.opacity-4" +msgstr "Saita dishi dishi zuwa kashi 40" -#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "workspace.options.blur-options.title" -msgstr "Dishi dishi" +msgid "shortcuts.opacity-5" +msgstr "Saita dishi dishi zuwa kashi 50" -msgid "dashboard.export.options.all.title" -msgstr "fitar da manhajar tura kundi" +msgid "shortcuts.opacity-6" +msgstr "Saita dishi dishi zuwa kashi 60" -msgid "workspace.options.clip-content" -msgstr "Matse abun ciki" +msgid "shortcuts.opacity-7" +msgstr "Saita dishi dishi zuwa kashi 70" -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.editor" -msgstr "maigyara" +msgid "shortcuts.opacity-8" +msgstr "seta dishi dishin zuwa kashi 8o" -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.new-password" -msgstr "sanya sabuwar lambar tsaro" +msgid "shortcuts.opacity-9" +msgstr "Seta dish dishi zuwa 90" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.path" -msgstr "hanya (%s)" +msgid "shortcuts.open-color-picker" +msgstr "abin daukan kala" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius.all-corners" -msgstr "duka kwanar" +msgid "shortcuts.open-comments" +msgstr "tafi inda 'yan kallo za su bayyana ra'ayi" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-right" -msgstr "sama dama" +msgid "shortcuts.open-dashboard" +msgstr "tafi gaban allon" -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.sending" -msgstr "aikawa…" +msgid "shortcuts.open-inspect" +msgstr "tafi sashin da 'yan kallo za su duba" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.select-layer" -msgstr "zabi shimfida" +msgid "shortcuts.open-interactions" +msgstr "tafi sashin da masu kallo suke hulda" -msgid "workspace.undo.entry.single.image" -msgstr "hoto" +msgid "shortcuts.open-viewer" +msgstr "tafi sashin da masu kallo suke hulda" -msgid "workspace.shape.menu.intersection" -msgstr "mahada" +msgid "shortcuts.open-workspace" +msgstr "tafi fagen aiki" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-trigger" -msgstr "Jawo" +msgid "shortcuts.or" +msgstr " ko " -#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/files.cljs -msgid "dashboard.new-file" -msgstr "+ sabon kundi" +msgid "shortcuts.paste" +msgstr "manna" -#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/auth.cljs -msgid "title.default" -msgstr "Mazubin biruka - Tsara yanci ga tawaga" +msgid "shortcuts.prev-frame" +msgstr "allon da ya gabata" -#: src/app/main/ui/alert.cljs -msgid "ds.alert-title" -msgstr "natsu" +msgid "shortcuts.redo" +msgstr "gyara" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.shortcuts" -msgstr "yanke (%s)" +msgid "shortcuts.reset-zoom" +msgstr "zake zukowa" -#: src/app/main/ui/inspect/attributes/shadow.cljs -msgid "inspect.attributes.shadow" -msgstr "inuwa" +msgid "shortcuts.search-placeholder" +msgstr "takaitaccen sako yanken" -msgid "common.share-link.title" -msgstr "fenfot" +msgid "shortcuts.select-all" +msgstr "zabi duka" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding" -msgstr "filla filla" +msgid "shortcuts.select-next" +msgstr "zabi wani shafi" -msgid "shortcuts.toggle-history" -msgstr "Danna tarihi" +msgid "shortcuts.select-parent-layer" +msgstr "zabi ainihin shafi" -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.select-ui-theme" -msgstr "zaven batu" +msgid "shortcuts.select-prev" +msgstr "zabi shafin da ya gabata" -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.duplicate" -msgstr "kwafi" +msgid "shortcuts.separate-nodes" +msgstr "raba kauri" -msgid "title.team-webhooks" -msgstr "gidan yanar gizo - %s - Mazubin biruka" +msgid "shortcuts.show-pixel-grid" +msgstr "nuna / boye akwatin pixel" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library-updates" -msgstr "sabunta ma'adana" +msgid "shortcuts.show-shortcuts" +msgstr "nuna / boye yanken" -#: src/app/main/ui/dashboard/team.cljs -#, markdown -msgid "labels.no-invitations-hint" -msgstr "danna **gayyato mutane** wurin da ake nemo mutane a wannan tawaga." +msgid "shortcuts.snap-nodes" +msgstr "yanke kauri" -msgid "inspect.tabs.code.selected.mask" -msgstr "marfi" +msgid "shortcuts.snap-pixel-grid" +msgstr "yanke zuwa ga akwatin pixel" -msgid "modals.edit-webhook.submit-label" -msgstr "gyara webhook" +msgid "shortcuts.start-editing" +msgstr "fara gyarawa" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.none" -msgstr "babu" +msgid "shortcuts.start-measure" +msgstr "fara aunawa" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-rules" -msgstr "boye ma'auni" +msgid "shortcuts.stop-measure" +msgstr "dena aunawa" -msgid "dashboard.webhooks.create.success" -msgstr "an gina Webhook." +msgid "shortcuts.text-align-center" +msgstr "jera tsakiya" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.go-to-edit" -msgstr "tafi zuwa salon dakin karatu don a tace" +msgid "shortcuts.text-align-justify" +msgstr "jera da inganci" -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.confirm" -msgstr "haka, goge asusu" +msgid "shortcuts.text-align-left" +msgstr "jera hagu" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.no-matches-for" -msgstr "Babu daidaituwa da aka samu na “%s“" +msgid "shortcuts.text-align-right" +msgstr "jera dama" -msgid "shortcuts.move-unit-right" -msgstr "Matsa da sashin dama" +msgid "shortcuts.thumbnail-set" +msgstr "saita babban yatsa" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.projects" -msgstr "aiyuka" +#: src/app/main/ui/workspace/sidebar/shortcuts.cljs +msgid "shortcuts.title" +msgstr "allon harufa yanke" -#: src/app/main/ui/auth/register.cljs -msgid "auth.verification-email-sent" -msgstr "mun aika maka da saqon tantancewa ta imel" +msgid "shortcuts.toggle-alignment" +msgstr "Danna a jere" -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.your-name" -msgstr "sunanka" +msgid "shortcuts.toggle-assets" +msgstr "Danna kadara" -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout" -msgstr "shiri" +msgid "shortcuts.toggle-colorpalette" +msgstr "Danna launukan kala" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-none" -msgstr "(ba'a saita ba )" +msgid "shortcuts.toggle-focus-mode" +msgstr "Danna yanayin maida hankali" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing" -msgstr "saukakawa" +msgid "shortcuts.toggle-fullscreen" +msgstr "Danna fuskar ta cika duka" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Triangle" +msgid "shortcuts.toggle-history" +msgstr "Danna tarihi" -msgid "workspace.path.actions.draw-nodes" -msgstr "zane da kauri (%s)" +msgid "shortcuts.toggle-layers" +msgstr "Danna shimfida" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-scale-text" -msgstr "bada damar sikelin rubutu" +msgid "shortcuts.toggle-layout-flex" +msgstr "Tara/fitar da lankwasashhiyar shimfida" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row-reverse" -msgstr "jera sauyin fasali" +msgid "shortcuts.toggle-lock" +msgstr "Rufe/bude" -msgid "errors.email-spam-or-permanent-bounces" -msgstr "saqonni marasa amfani na imel «%s»." +msgid "shortcuts.toggle-lock-size" +msgstr "Rufe rabo" -msgid "labels.add-custom-font" -msgstr "inganta font" +msgid "shortcuts.toggle-rules" +msgstr "Nuna / boye magwaji" -#: src/app/main/ui/dashboard/libraries.cljs -msgid "title.dashboard.shared-libraries" -msgstr "Rababban dakin karatu- %s - Mazubin biruka" +msgid "shortcuts.toggle-textpalette" +msgstr "Juya zuwa launukan rubutu" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "workspace.options.export-object" -msgid_plural "workspace.options.export-object" -msgstr[0] "Fitarwa 1 Sashi" -msgstr[1] "Fitarwa %s sashi-sashi" +msgid "shortcuts.toggle-visibility" +msgstr "Nuna/boye" -msgid "errors.bad-font" -msgstr "ba za a iya xora fonts %s ba" +msgid "shortcuts.toggle-zoom-style" +msgstr "Danna salon zukowa" -msgid "shortcuts.align-bottom" -msgstr "tsarin kasa" +msgid "shortcuts.underline" +msgstr "Danna ta layi a kasa" -msgid "shortcuts.align-top" -msgstr "tsarin sama" +msgid "shortcuts.undo" +msgstr "Cire" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.message" -msgstr "sabunta sashe a babbar taska" +msgid "shortcuts.ungroup" +msgstr "Fita daka rukuni" -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.profile-not-verified" -msgstr "ba a tantance bayananka ba,sai an tantance a ci gaba." +msgid "shortcuts.unmask" +msgstr "Cire takunkumi" -#: src/app/main/ui/inspect/attributes/layout.cljs, src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.radius" -msgstr "tsakiya" +msgid "shortcuts.v-distribute" +msgstr "Rarraba ta tsaye" -msgid "workspace.undo.entry.single.media" -msgstr "kadarar zanen hotuna" +msgid "shortcuts.zoom-lense-decrease" +msgstr "Zuko raguwar ido" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.twitter-title" -msgstr "wurin karvar qorafin tiwita" +msgid "shortcuts.zoom-lense-increase" +msgstr "Zuko karuwar ido" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.packed" -msgstr "cushe" +msgid "shortcuts.zoom-selected" +msgstr "Zuko wanda aka zaba" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.label" -msgstr "suna" +#: src/app/main/ui/dashboard/team.cljs +msgid "team.webhooks.max-length" +msgstr "Sunan shafin yanar gizon zai kunshi a mafi yawa haruffa 2048." -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-style" -msgstr "tsarin salo" +#: src/app/main/ui/dashboard/files.cljs +msgid "title.dashboard.files" +msgstr "%s - Tukunyar aje biro" -msgid "dashboard.import.analyze-error" -msgstr "kash! mun gaza shigo da kundinka" +#: src/app/main/ui/dashboard/fonts.cljs +msgid "title.dashboard.font-providers" +msgstr "samar da jerin harufa - %s - Mazubin biruka" -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-subtitle" -msgstr "za mu aika maka da saqon qa'idoji ta imel" +#: src/app/main/ui/dashboard/fonts.cljs +msgid "title.dashboard.fonts" +msgstr "jerin harufa - %s - Mazubin biruka" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.no-files-message" -msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "ba zai yi aiki a kowane kundi ba." -msgstr[1] "ba za su yi aiki a kowane kundi ba." +#: src/app/main/ui/dashboard/projects.cljs +msgid "title.dashboard.projects" +msgstr "tsare tsare - %s - Mazubin biruka" -#: src/app/main/ui/settings/password.cljs -msgid "title.settings.password" -msgstr "Nambobin sirri - Mazubin biruka" +#: src/app/main/ui/dashboard/search.cljs +msgid "title.dashboard.search" +msgstr "nema - %s - Mazubin biruka" -msgid "workspace.header.menu.enable-snap-pixel-grid" -msgstr "Bda damar tsinkewa zuwa akwatin pixel" +#: src/app/main/ui/dashboard/libraries.cljs +msgid "title.dashboard.shared-libraries" +msgstr "Rababban dakin karatu- %s - Mazubin biruka" -msgid "shortcuts.add-comment" -msgstr "Bayyana Ra'ayi" +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/auth.cljs +msgid "title.default" +msgstr "Mazubin biruka - Tsara yanci ga tawaga" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-enter" -msgstr "linzamin kwamfuter ya shiga" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "karin bayani - Shiga alama" -msgid "workspace.undo.entry.single.circle" -msgstr "da'ira" +#: src/app/main/ui/settings/feedback.cljs +msgid "title.settings.feedback" +msgstr "bada martani - Mazubin biruka" -msgid "labels.back" -msgstr "baya" +#: src/app/main/ui/settings/options.cljs +msgid "title.settings.options" +msgstr "Saiti - Mazubin biruka" -msgid "viewer.header.interactions-section" -msgstr "Hulda (%s)" +#: src/app/main/ui/settings/password.cljs +msgid "title.settings.password" +msgstr "Nambobin sirri - Mazubin biruka" -#: src/app/main/ui/auth/login.cljs -msgid "auth.forgot-password" -msgstr "ka manta lambar tsaro?" +#: src/app/main/ui/settings/profile.cljs +msgid "title.settings.profile" +msgstr "Karin bayani - Mazubin biruka" -msgid "shortcut-subsection.tools" -msgstr "Kayan aiki" +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-invitations" +msgstr "Gayyata - %s - Mazubin biruka" -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.recovery-token-sent" -msgstr "an aika maka da saqon matakan da za a bi domin dawo da lambar tsaronka." +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-members" +msgstr "Yan kungiya - %s - Mazubin biruka" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title.group" -msgstr "rukunin inuwa" +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-settings" +msgstr "Saiti - %s - Mazubin biruka" -msgid "modals.publish-empty-library.message" -msgstr "ba komai a taskarka. ka na son wallafa ta?" +msgid "title.team-webhooks" +msgstr "gidan yanar gizo - %s - Mazubin biruka" -#: src/app/main/ui/workspace/comments.cljs -msgid "labels.only-yours" -msgstr "naka kawai" +#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs +msgid "title.viewer" +msgstr "%s - duba kumburi - Mazubin biruka" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title.group" -msgstr "rukunin shafi" +#: src/app/main/ui/workspace.cljs +msgid "title.workspace" +msgstr "%s - Mazubin biruka" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.reset-zoom" -msgstr "Kara saitawa" +msgid "viewer.breaking-change.description" +msgstr "" +"Wannan mahadar da aka raba yanxu batada ingaci. Ka/ki kirkiri wata ko ka/ki " +"tamayi maishi a baka/ki sabuwa." -msgid "shortcuts.opacity-7" -msgstr "Saita dishi dishi zuwa kashi 70" +msgid "viewer.breaking-change.message" +msgstr "Sannu!" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.assets" -msgstr "kadara" +#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs +msgid "viewer.empty-state" +msgstr "Babu allon da aka samu a wannan fejin." -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.width" -msgstr "faxi" +#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs +msgid "viewer.frame-not-found" +msgstr "Ba'a sami allon ba." -msgid "shortcuts.snap-pixel-grid" -msgstr "yanke zuwa ga akwatin pixel" +msgid "viewer.header.comments-section" +msgstr "Bayyana ra'ayi(%s)" -#: src/app/main/ui/auth/login.cljs -msgid "errors.ldap-disabled" -msgstr "LDAP ya gaza tantancewa." +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.dont-show-interactions" +msgstr "Karka/ki nuna hulda" -msgid "workspace.assets.open-library" -msgstr "bude fiyal din dakin karatu" +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.fullscreen" +msgstr "Cika fuskar" -#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs -msgid "workspace.gradients.linear" -msgstr "a layi mikakke" +msgid "viewer.header.inspect-section" +msgstr "Duba (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title-selection" -msgstr "zababbun rubutu" +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.interactions" +msgstr "Hulda" -msgid "modals.delete-component-annotation.title" -msgstr "goge bayani" +msgid "viewer.header.interactions-section" +msgstr "Hulda (%s)" -msgid "shortcuts.select-parent-layer" -msgstr "zabi ainihin shafi" +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.share.copy-link" +msgstr "Kwafi mahada" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.promote-and-leave" -msgstr "inganta sannan ka bari" +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.show-interactions" +msgstr "Nuna hulda" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.libraries.text.multiple-typography" -msgstr "Rubutun rubutu dayawa" +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.show-interactions-on-click" +msgstr "Nuna hulda da an danna" -msgid "dashboard.import.progress.upload-media" -msgstr "xora kundaye: %s" +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.sitemap" +msgstr "taswirar wuri" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-multi-confirm.accept" -msgstr "goge kundaye" +msgid "webhooks.last-delivery.success" +msgstr "Sakon karshe ya isa." -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "rababben dakin karatu" +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hcenter" +msgstr "Daidaita tsakiya a kwance (%s)" -msgid "labels.share-prototype" -msgstr "tura manhajar rubutu" +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hdistribute" +msgstr "rarraba filin kwance (%s)" -msgid "shortcuts.export-shapes" -msgstr "samar da sabbabbin abubuwa" +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hleft" +msgstr "Daidaita hagu (%s)" -#: src/app/main/ui/dashboard/team.cljs -msgid "notifications.invitation-link-copied" -msgstr "kwafar hanyar gayya" +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hright" +msgstr "Daidaita dama (%s)" -#: src/app/main/ui/settings/password.cljs -msgid "dashboard.notifications.password-saved" -msgstr "an tsare maka shaidar tsaro!" +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vbottom" +msgstr "Daidaita kasa (%s)" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.group-name" -msgstr "sunan kungiya" +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vcenter" +msgstr "Daidaita a kwance tsakiya (%s)" -msgid "shortcuts.search-placeholder" -msgstr "takaitaccen sako yanken" +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vdistribute" +msgstr "rarraba filin tsaye (%s)" -msgid "inspect.tabs.code.selected.svg-raw" -msgstr "SVG" +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vtop" +msgstr "Daidaita sama(%s)" -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.size" -msgstr "girma" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.assets" +msgstr "kadara" -msgid "workspace.undo.entry.multiple.component" -msgstr "bangare" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.box-filter-all" +msgstr "duka kadara" -msgid "workspace.focus.selection" -msgstr "zaba" +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.colors" +msgstr "kala" -msgid "workspace.path.actions.merge-nodes" -msgstr "hade kauri (%s)" +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.components" +msgstr "Bangarori" -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.info" -msgstr "" -"za mu aika maka da imel ta wannan imel xin “%s” domin tantance shaidarka." +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.create-group" +msgstr "kirkiri rukuni" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.remove-member" -msgstr "cire mamba" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.create-group-hint" +msgstr "abubuwanka za a samu su suna nan take kamar \"sunan kungiya/ sunan abubuwan\"" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.create-component" -msgstr "kirkiri abubuwa" +#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.delete" +msgstr "goge" -msgid "common.publish" -msgstr "wallafawa" +#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.duplicate" +msgstr "maimaita" -msgid "shortcuts.select-next" -msgstr "zabi wani shafi" +msgid "workspace.assets.duplicate-main" +msgstr "maimaita ainihin" -msgid "workspace.undo.entry.multiple.color" -msgstr "kadarar kala" +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.edit" +msgstr "tace" -#: src/app/main/ui/settings/options.cljs -msgid "title.settings.options" -msgstr "Saiti - Mazubin biruka" +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.graphics" +msgstr "zane zane" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.no-invitations" -msgstr "ba saqon da ba a buxa ba." +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.group" +msgstr "rukuni" -msgid "workspace.header.menu.enable-scale-content" -msgstr "bada damar sikelin rabo" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.group-name" +msgstr "sunan kungiya" -msgid "modals.delete-font-variant.message" -msgstr "" -"ka tabbata kana son goge wannan salon font din? ba zai xoru ba idan an yi " -"amfani da shi a kundi." +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.libraries" +msgstr "dakunan karatu" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.group-stroke" -msgstr "Ja layi a rukuni" +msgid "workspace.assets.local-library" +msgstr "dakin karatun gida" -msgid "workspace.shape.menu.union" -msgstr "hadakan" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.not-found" +msgstr "ba'a samu kadara ba" -msgid "workspace.shape.menu.thumbnail-set" -msgstr "kara kamar girman babban yatsa" +msgid "workspace.assets.open-library" +msgstr "bude fiyal din dakin karatu" -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.recovery-submit" -msgstr "canza lambar tsaro" +#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.rename" +msgstr "sake suna" -#: src/app/main/ui/confirm.cljs -msgid "ds.confirm-cancel" -msgstr "goge" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.rename-group" +msgstr "sake sunan kungiyar" -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.download" -msgstr "sauke hanyar hoto" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.search" +msgstr "nemo kadarar" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fill" -msgstr "cike - cika sikeli" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.selected-count" +msgid_plural "workspace.assets.selected-count" +msgstr[0] "%s" +msgstr[1] "%s zababbun abubuwan" -msgid "errors.bad-font-plural" -msgstr "ba za a iya xora fonts %s ba" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "rababben dakin karatu" -msgid "inspect.empty.help" -msgstr "domin neman qarin bayani game da fenfot a tuntubi sashen agaji" +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.typography" +msgstr "rubutun rubutu" -msgid "workspace.sidebar.layers.texts" -msgstr "rubutu" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.font-id" +msgstr "tsarin haruffa" -#: src/app/main/ui/settings/profile.cljs -msgid "title.settings.profile" -msgstr "Karin bayani - Mazubin biruka" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.font-size" +msgstr "girma" -#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.delete" -msgstr "goge" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.font-variant-id" +msgstr "bambanci" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-left" -msgstr "jera hagu (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.go-to-edit" +msgstr "tafi zuwa salon dakin karatu don a tace" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.your-account" -msgstr "fagenka" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.letter-spacing" +msgstr "fili a tsakanin haruffa" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.dismiss" -msgstr "watsar" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.line-height" +msgstr "tsawon layi" -#: src/app/main/ui/settings/feedback.cljs -msgid "title.settings.feedback" -msgstr "bada martani - Mazubin biruka" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/inspect/attributes/text.cljs, src/app/main/ui/inspect/attributes/text.cljs +msgid "workspace.assets.typography.sample" +msgstr "Ag" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.duplicate" -msgstr "maimaita" +msgid "workspace.assets.typography.text-styles" +msgstr "salon rubutu" -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.change-email" -msgstr "canza imel" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.text-transform" +msgstr "canja rubutu" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.title" -msgstr "gogewar tawaga" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.ungroup" +msgstr "kashe daga kungiya" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "bayanai masu yawa" +msgid "workspace.focus.focus-mode" +msgstr "tsarin maida hankali" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.forward" -msgstr "kawo ta gaba" +msgid "workspace.focus.focus-off" +msgstr "karka maida hankali" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.title" -msgstr "imel" +msgid "workspace.focus.focus-on" +msgstr "maida hankali" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.font-size" -msgstr "girma" +msgid "workspace.focus.selection" +msgstr "zaba" -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.message" -msgstr "" -"kai ke da wannan tawagar yanzu. ka tabbata kana son yin %s sabon mai tawaga?" +#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs +msgid "workspace.gradients.linear" +msgstr "a layi mikakke" + +#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs +msgid "workspace.gradients.radial" +msgstr "a da'ira" #: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-palette" -msgstr "farantin launuka" +msgid "workspace.header.menu.disable-dynamic-alignment" +msgstr "kashe daidaitawa mai canjawa" -msgid "shortcuts.group" -msgstr "rukuni" +msgid "workspace.header.menu.disable-scale-content" +msgstr "kashe sikelin rabo" -msgid "auth.privacy-policy" -msgstr "matakan kaxaita" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-scale-text" +msgstr "kashe sikelin rubutu" -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.password-changed-successfully" -msgstr "ka canza lambar tsaro" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-guides" +msgstr "kashe tsinkewa zuwa mai jagora" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-hovering" -msgstr "yayin shawagi" +msgid "workspace.header.menu.disable-snap-pixel-grid" +msgstr "kashe tsinkewa zuwa pixel" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show" -msgstr "nuna" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-dynamic-alignment" +msgstr "bada damar daidaitawa mai canjawa" -msgid "workspace.shape.menu.hide-ui" -msgstr "nuna / boye UI" +msgid "workspace.header.menu.enable-scale-content" +msgstr "bada damar sikelin rabo" -msgid "shortcuts.move-fast-up" -msgstr "Matsa sama da sauri" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-scale-text" +msgstr "bada damar sikelin rubutu" -#: src/app/main/data/dashboard.cljs -msgid "dashboard.new-project-prefix" -msgstr "sabon aiki" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-guides" +msgstr "Tsinke zuwa mai jagora" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.center" -msgstr "tsakiya" +msgid "workspace.header.menu.enable-snap-pixel-grid" +msgstr "Bda damar tsinkewa zuwa akwatin pixel" -#: src/app/main/ui/dashboard/team.cljs -msgid "title.team-settings" -msgstr "Saiti - %s - Mazubin biruka" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-artboard-names" +msgstr "Boye allom suna" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-manual" -msgstr "Yi da kanka" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-palette" +msgstr "farantin launuka" -msgid "labels.save" -msgstr "ajiye" +msgid "workspace.header.menu.hide-pixel-grid" +msgstr "boye pixel akwati" -msgid "dashboard.import.progress.process-media" -msgstr "kammala aiki" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-rules" +msgstr "boye ma'auni" -#: src/app/main/ui/confirm.cljs -msgid "ds.confirm-ok" -msgstr "haka" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-textpalette" +msgstr "boye launukan yanayin tsarin rubutu" -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "dole suna ya qumshi waxansu alamimon rubutu, sannan tazara." +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.edit" +msgstr "Tace" -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.message" -msgstr "ka tabbata kana son goge wannan aikin?" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.file" +msgstr "fayil" -msgid "shortcuts.line-height-inc" -msgstr "kara tsawon layi" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.help-info" +msgstr "taimako & bayani" -msgid "onboarding-v2.before-start.desc2" -msgstr "" -"cikakken bayanin yadda za a yi amfani da fenfot. daga rubutu zuwa tsara ko " -"rarraba iri." +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.preferences" +msgstr "fifiko" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.sidebar.layers" -msgstr "shafi" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.view" +msgstr "gani" -msgid "shortcuts.select-all" +msgid "workspace.header.menu.redo" +msgstr "sake" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.select-all" msgstr "zabi duka" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.graphics" -msgstr "%s zane zane" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-artboard-names" +msgstr "Nuna sunayen allo" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-palette" +msgstr "nuna launukan kala" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-leave" -msgstr "linzamin kwamfutar ya fita" +msgid "workspace.header.menu.show-pixel-grid" +msgstr "Nuna akwatin pixel" -msgid "labels.log-or-sign" -msgstr "yi ko shiga" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-rules" +msgstr "Nuna ma'auni" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "idan akwai qari (bayyana)" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-textpalette" +msgstr "Nuna launukan tsarin rubutu" -msgid "workspace.assets.typography.text-styles" -msgstr "salon rubutu" +msgid "workspace.header.menu.undo" +msgstr "Cire" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker" -msgstr "da'irar kasuwa" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.reset-zoom" +msgstr "Kara saitawa" -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.searching-for" -msgstr "neman “%s“…" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.save-error" +msgstr "an samu kuskure wajen adanawa" -msgid "inspect.attributes.typography.text-decoration.none" -msgstr "babu" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.saved" +msgstr "An adana" -msgid "labels.discard" -msgstr "vatar" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.saving" +msgstr "Adanawa" -msgid "shortcuts.font-size-inc" -msgstr "kara gaban yanayi" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.unsaved" +msgstr "Canja canjan da ba'a adana ba" -msgid "common.share-link.permissions-pages" -msgstr "tura shafuka" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.viewer" +msgstr "yanayin kallo (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-min-w" -msgstr "fadi mafi kankanta" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "Zuko" -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.hcenter" -msgstr "Daidaita tsakiya a kwance (%s)" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fill" +msgstr "cike - cika sikeli" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.gap" -msgstr "Gibi" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fit" +msgstr "dace - ja sikeli ya dace da shi" -msgid "inspect.tabs.code.selected.group" -msgstr "qungiya" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fit-all" +msgstr "zuko yayi daidai da ko'ina" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker" -msgstr "murabba'in kasuwa" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-full-screen" +msgstr "Cika allon" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column" -msgstr "shafi" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-selected" +msgstr "zuko zababbe" -#: src/app/main/ui/comments.cljs -msgid "labels.delete-comment-thread" -msgstr "goge rubutu" +msgid "workspace.layout_grid.editor.title" +msgstr "tace akwati" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation" -msgstr "hotuna masu motsi" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.add" +msgstr "tarawa" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.drop-shadow" -msgstr "ajiye inuwa" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.colors" +msgstr "%s kala" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "jaraba fenfot ka ga ko ta yi daidai da tawaga " +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "Babu salon kaloli a ma'ajiya yanzu" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "malami ko dalibi" +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "Babu rubutun rubutu a ma'ajiya yanzu" -msgid "workspace.undo.entry.single.curve" -msgstr "lankwasa" +#: src/app/main/ui/workspace/colorpicker/libraries.cljs, src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.file-library" +msgstr "F" -#: src/app/main/ui/static.cljs -msgid "labels.not-found.main-message" -msgstr "alama!" +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.hsv" +msgstr "HSV" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.overlay" -msgstr "mai rufi" +#: src/app/main/ui/workspace/colorpicker/libraries.cljs, src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.recent-colors" +msgstr "kalar yanzu" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgb-complementary" +msgstr "Jituwar RGB" -msgid "onboarding.team-modal.create-team" -msgstr "yin tawaga" +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgba" +msgstr "RGBA" -msgid "dashboard.import.progress.process-colors" -msgstr "aikin rini" +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.save-color" +msgstr "Adana salon kala" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-account" -msgstr "qirqiri taskar gwaji" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.components" +msgstr "%s bangarori" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.title" -msgstr "ma'aunin karvuwar aiki" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.file-library" +msgstr "Ma'adanar fiyal" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.margin" -msgstr "gefe" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.graphics" +msgstr "%s zane zane" -msgid "onboarding-v2.welcome.title" -msgstr "barka da zuwa fenfot!" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.in-this-file" +msgstr "Ma'adana a wanna fiyal" -#, permanent -msgid "inspect.attributes.stroke.alignment.center" -msgstr "tsakiya" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.libraries" +msgstr "ma'adanai" -#: src/app/main/ui/auth/verify_token.cljs -msgid "dashboard.notifications.email-changed-successfully" -msgstr "ka zamanantar da adireshinka na imel" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library" +msgstr "ma'adana" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "barin aikin tawaga" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library-updates" +msgstr "sabunta ma'adana" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.accept" -msgstr "qara yin wurin ajiyar tawaga" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.no-libraries-need-sync" +msgstr "Babu rabben ma'adanai da suke bukatar sabuntawa" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in-out" -msgstr "sauki ciki waje" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.no-matches-for" +msgstr "Babu daidaituwa da aka samu na “%s“" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-guides" -msgstr "Tsinke zuwa mai jagora" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.no-shared-libraries-available" +msgstr "Babu rababbun ma'adanai wanda aka samu" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-linear" -msgstr "mikakke" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.search-shared-libraries" +msgstr "Duba rabbaun ma'adanai" -#: src/app/main/ui/inspect/attributes/blur.cljs -msgid "inspect.attributes.blur.value" -msgstr "muhimmanci" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.shared-libraries" +msgstr "Rabban ma'adanai" -msgid "common.share-link.manage-ops" -msgstr "amincewar shugaba" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.libraries.text.multiple-typography" +msgstr "Rubutun rubutu dayawa" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.start" -msgstr "fara jagoranci" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.libraries.text.multiple-typography-tooltip" +msgstr "Cire mahadar duka rabutun rubutu" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-on-click" -msgstr "da an danna" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.typography" +msgstr "%s Rubutun rubutu" -msgid "onboarding.choice.team-up.invite-members" -msgstr "gayyato mambobi" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.update" +msgstr "Sabuntawa" -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.hdistribute" -msgstr "rarraba filin kwance (%s)" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "Aga duka canjin" -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-length-hint" -msgstr "aqalla a sami alamoni 8" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.updates" +msgstr "sabuntawa" -msgid "modals.delete-webhook.message" -msgstr "ka tabbata ka na son goge webhook?" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.add-interaction" +msgstr "Danna wannan madannin + domin saka hulda." -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.title" -msgstr "goge kundi" +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "workspace.options.blur-options.title" +msgstr "Dishi dishi" -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.title" -msgstr "goge aikin" +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "workspace.options.blur-options.title.group" +msgstr "rukuni" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to-dest" -msgstr "kewayawa zywa: %s" +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "workspace.options.blur-options.title.multiple" +msgstr "zabin dishi dishi" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.selected-count" -msgid_plural "workspace.assets.selected-count" -msgstr[0] "%s" -msgstr[1] "%s zababbun abubuwan" +#: src/app/main/ui/workspace/sidebar/options/page.cljs +msgid "workspace.options.canvas-background" +msgstr "bayan zane" -msgid "dashboard.libraries-and-templates.import-error" -msgstr "akwai matsala wurin shigo da fejin talla. fejin tallar ba ya xauko." +msgid "workspace.options.clip-content" +msgstr "Matse abun ciki" -# SECTIONS -msgid "shortcut-section.basics" -msgstr "shikashikai" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs +msgid "workspace.options.component" +msgstr "Bangarori" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-go-to" -msgstr "je ka taskar fenfot" +msgid "workspace.options.component.annotation" +msgstr "Yin sharhin rubutu" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.libraries-and-templates" -msgstr "taskoki & allunan talla" +msgid "workspace.options.component.copy" +msgstr "Kwafa" -#: src/app/main/ui/auth/login.cljs -msgid "errors.wrong-credentials" -msgstr "kuskuren imel ko lambar tsaro." +msgid "workspace.options.component.create-annotation" +msgstr "Kirkiri sharhin rubuta" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.spread" -msgstr "bazu" +msgid "workspace.options.component.edit-annotation" +msgstr "Tace sharhin rubutu" -msgid "shortcuts.open-inspect" -msgstr "tafi sashin da 'yan kallo za su duba" +msgid "workspace.options.component.main" +msgstr "Ainahin" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.info" -msgstr "ka san dokokin fenfot lokacin da ka ke tare da masoya koyarwa." +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints" +msgstr "Takura" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "31-50" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.bottom" +msgstr "Kasa" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.bottom" -msgstr "kasa" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.center" +msgstr "Tsakiya" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-duration" -msgstr "tsahon lokaci" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.fix-when-scrolling" +msgstr "gyara nemowa" -msgid "shortcuts.go-to-libs" -msgstr "ta fi zuwa rabbabben ma'ajiya" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.left" +msgstr "Hagu" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.advanced-ops" -msgstr "zabi na ci gaba" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.leftright" +msgstr "hagu & dama" -#: src/app/main/ui/settings/change_email.cljs -msgid "notifications.validation-email-sent" -msgstr "an aika da imel din tantancewa %s. bincika imel xinka!" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.right" +msgstr "dama" -msgid "shortcuts.toggle-zoom-style" -msgstr "Danna salon zukowa" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.scale" +msgstr "maauni" -msgid "shortcut-subsection.zoom-workspace" -msgstr "Zukowa" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.top" +msgstr "sama" -msgid "shortcuts.increase-zoom" -msgstr "zuko ciki" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.topbottom" +msgstr "sama & kasa" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-outside" -msgstr "rufe yayin matsewa ta waje" +#: src/app/main/ui/workspace/sidebar/options.cljs +msgid "workspace.options.design" +msgstr "zane" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.blur" -msgstr "dishi dishi" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export" +msgstr "fitarwa" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.no-access-tokens" -msgstr "ba ka da wasu lambobin tsaro yanzu." +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export-multiple" +msgstr "Fitar da zababbun" -msgid "workspace.path.actions.separate-nodes" -msgstr "raba kauri (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export-object" +msgid_plural "workspace.options.export-object" +msgstr[0] "Fitarwa 1 Sashi" +msgstr[1] "Fitarwa %s sashi-sashi" -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.title-search" -msgstr "neman sakamako" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs +msgid "workspace.options.export.suffix" +msgstr "Kari na bayan baki" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "teburin aiki" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-complete" +msgstr "An gama fitarwa" -#: src/app/main/ui/workspace.cljs -msgid "labels.reload-file" -msgstr "qara dora kundi" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object" +msgstr "Ana fitarwa" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.font-id" -msgstr "tsarin haruffa" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object-error" +msgstr "An gaza fitarwa" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.selection-stroke" -msgstr "gigciye zabi" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object-slow" +msgstr "Fitarwa ba tsammani ta sami tsaiko" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"lambarka ta shiga na a matsayin zabin hanyar shiga/lambar tsaronmuza a iya " -"amfani tsarin tantancewa,domin shiga manhajar cikin fenfot API" +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.fill" +msgstr "Cikawa" -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.title" -msgstr "mallakar tawaga" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.add-flow-start" +msgstr "Kara gudun farko" -msgid "dashboard.import" -msgstr "shigo da kundin fenfot" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-start" +msgstr "Gudun farko" -#: src/app/main/ui/workspace/sidebar/options.cljs -msgid "workspace.options.prototype" -msgstr "samfur" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-starts" +msgstr "gudun farko" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.right" -msgstr "dama" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.auto" +msgstr "da kanshi" -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.success-delete-project" -msgstr "ka goge aikinka" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.column" +msgstr "shafi" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.text" -msgstr "fenfot ta menbobin tawaga ce. kirawo kowa domin yin aiki tarekundaye" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.grid-title" +msgstr "Akwati" -#: src/app/main/ui/auth/recovery.cljs -msgid "profile.recovery.go-to-login" -msgstr "je ka hanyar shiga" +msgid "workspace.options.grid.params.color" +msgstr "Kala" -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.theme-change" -msgstr "batun UI" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.columns" +msgstr "shafi" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.use-play-button" -msgstr "yi amfani da madanneta ta sama ki tafi da samfuri." +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.gutter" +msgstr "mahada" -msgid "modals.delete-font.message" -msgstr "" -"ka tabbata kana son goge wannan font xin ? ba zai yi aiki ba idan an yi " -"amfani da shi a kundi." +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.height" +msgstr "tsawo" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.hue" -msgstr "Haske haske" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.margin" +msgstr "gefe" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-artboard-names" -msgstr "Nuna sunayen allo" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.rows" +msgstr "jere" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.save-error" -msgstr "an samu kuskure wajen adanawa" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.set-default" +msgstr "saita a tsoho" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.dashed" -msgstr "layin raba abu" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.size" +msgstr "girma" -msgid "common.share-link.all-users" -msgstr "duk fenfot" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type" +msgstr "Nau'i" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "mallakar lambobin shiga na sirri" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.bottom" +msgstr "Kasa" -#: src/app/main/ui/settings/password.cljs -msgid "dashboard.password-change" -msgstr "sauya lambar tsaro" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.center" +msgstr "Tsakiya" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Canva" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.left" +msgstr "Hagu" -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.fill" -msgstr "Cikawa" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.right" +msgstr "Dama" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.left" -msgstr "hagu" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.stretch" +msgstr "mikewa" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "qara samun bayanin fenfot" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.top" +msgstr "sama" -msgid "workspace.shape.menu.thumbnail-remove" -msgstr "cire girman babban danyatsa" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.use-default" +msgstr "yi amfani da tsoho" -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.width" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.width" msgstr "fadi" -msgid "inspect.empty.select" -msgstr "zabar zubi, hukumar masu sa ido akan bangarorinsu da lambobinsu" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expires-on" -msgstr "gama aiki kan %s" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.row" +msgstr "layuka" -msgid "shortcuts.toggle-layout-flex" -msgstr "Tara/fitar da lankwasashhiyar shimfida" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.square" +msgstr "murabba'i" -msgid "labels.or" -msgstr "ko" +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.group-fill" +msgstr "Cika rukuni" -msgid "onboarding.choice.team-up.roles" -msgstr "gayyata tare da bayar da matsayi:" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.group-stroke" +msgstr "Ja layi a rukuni" -msgid "labels.font-providers" -msgstr "ma su fenfot" +msgid "workspace.options.height" +msgstr "Tsawo" -msgid "shortcuts.italic" -msgstr "juya zuwa kwantaccen rubuyu" +msgid "workspace.options.inspect" +msgstr "Duba" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.space-around" -msgstr "kewayayyen sarrari" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-action" +msgstr "aiki" -msgid "errors.webhooks.timeout" -msgstr "dakatarwa" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-after-delay" +msgstr "Bayan jinkiri" -msgid "errors.profile-blocked" -msgstr "bayanan a rufe suke" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation" +msgstr "hotuna masu motsi" -msgid "workspace.options.width" -msgstr "fadi" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-dissolve" +msgstr "narkewa" -msgid "shortcuts.letter-spacing-dec" -msgstr "rage filin harafin" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-none" +msgstr "Babu" -msgid "errors.webhooks.last-delivery" -msgstr "saqon qarshe bai je ba." +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-push" +msgstr "Tura" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-move-files" -msgstr "an tura kundayenka" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-slide" +msgstr "Ja" -msgid "shortcut-subsection.general-dashboard" -msgstr "gamayya" +msgid "workspace.options.interaction-auto" +msgstr "da kanshi" -#: src/app/main/ui/settings/password.cljs -msgid "errors.password-too-short" -msgstr "lambar tsaro dole ta kai yawan alamu 8" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-background" +msgstr "kara mai rufin bayan" -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.title" -msgstr "ka tabbata ka na son goge asusunka?" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-outside" +msgstr "rufe yayin matsewa ta waje" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.title" -msgstr "jagoranci" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay" +msgstr "kulle mai rufi" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.rect" -msgstr "Rectangle (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay-dest" +msgstr "kulle mai rufi %s" -msgid "labels.continue-with" -msgstr "ci gaba da" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-delay" +msgstr "jinkiri" -msgid "inspect.attributes.typography.text-transform.lowercase" -msgstr "qananan baqaqe" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-destination" +msgstr "makoma" -msgid "workspace.undo.entry.single.group" -msgstr "rukuni" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-duration" +msgstr "tsahon lokaci" -msgid "inspect.attributes.stroke.style.dotted" -msgstr "xige-xige" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing" +msgstr "saukakawa" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-max-w" -msgstr "fadi mafi yawa" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease" +msgstr "sauki" -msgid "shortcuts.align-right" -msgstr "tsarin dama" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in" +msgstr "sauki ciki" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "can baya" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in-out" +msgstr "sauki ciki waje" -msgid "modals.invite-member.emails" -msgstr "imel, rabawar waqafi" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-out" +msgstr "sauki waje" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.sitemap" -msgstr "taswirar wuri" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-linear" +msgstr "mikakke" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-dynamic-alignment" -msgstr "kashe daidaitawa mai canjawa" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-in" +msgstr "ciki" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-bottom-left" -msgstr "kasan hagu" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-enter" +msgstr "linzamin kwamfuter ya shiga" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.right" -msgstr "Dama" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-leave" +msgstr "linzamin kwamfutar ya fita" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay" -msgstr "kulle mai rufi" +msgid "workspace.options.interaction-ms" +msgstr "ms" -msgid "errors.invite-invalid.info" -msgstr "za a iya soke gayyata ko ta ki aiki." +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to" +msgstr "kewayawa zuwa" -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.fonts-added" -msgid_plural "dashboard.fonts.fonts-added" -msgstr[0] "an qara font 1" -msgstr[1] "%s an qara fonts da yawa" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to-dest" +msgstr "kewayawa zywa: %s" -msgid "modals.create-webhook.submit-label" -msgstr "qirqirar webhook" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-none" +msgstr "(ba'a saita ba )" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "" -"danna maddanin qasa\"danna qasa\n" -"emo sabuwar lambar tsaro\" samar da wani." +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-offset-effect" +msgstr "cire tasiri" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.title" -msgstr "goge alama" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-on-click" +msgstr "da an danna" -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.vtop" -msgstr "Daidaita sama(%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay" +msgstr "bude mai rufi" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.viewer" -msgstr "ma su kallo" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay-dest" +msgstr "bude mai rufi: %s" -msgid "shortcuts.toggle-alignment" -msgstr "Danna a jere" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-url" +msgstr "bude URL" -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.invite-profile" -msgstr "neman mutane" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-out" +msgstr "fita" -#: src/app/main/ui/dashboard/grid.cljs -#, markdown -msgid "dashboard.empty-placeholder-drafts" -msgstr "" -"nan za a sami kundayen da aka sanya a taska. gwada sanya na ka kundin \"a " -"taskirarmumaginar kundi](https://manhajar fenfot/taskokin maginar kundaye." -"html)." +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-center" +msgstr "kasa tsakiya" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker" -msgstr "darajar kasuwa" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-left" +msgstr "kasa hagu" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.soft-light" -msgstr "haske mai sauki" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-right" +msgstr "kasa dama" -msgid "shortcuts.decrease-zoom" -msgstr "fito da shi waje" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-center" +msgstr "tsakiya" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding-simple" -msgstr "sassaukan ciko" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-manual" +msgstr "Yi da kanka" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.gutter" -msgstr "mahada" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-center" +msgstr "sama tsakiya" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.group" -msgstr "rukuni" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-left" +msgstr "sama hagu" -msgid "dashboard.webhooks.update.success" -msgstr "sabunta Webhook." +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-right" +msgstr "sama dama" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-github-submit" -msgstr "matattarar manazarta" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-position" +msgstr "Mataki" -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.letter-spacing" -msgstr "tazarar harafi" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-preserve-scroll" +msgstr "adana komawa sama da kasa" -msgid "inspect.tabs.code.selected.text" -msgstr "rubutu" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-prev-screen" +msgstr "allon daya gabata" -msgid "shortcuts.opacity-4" -msgstr "Saita dishi dishi zuwa kashi 40" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-relative-to" +msgstr "alaka zuwa" -#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "workspace.options.blur-options.title.multiple" -msgstr "zabin dishi dishi" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-self" +msgstr "kai/ni" -msgid "shortcuts.align-vcenter" -msgstr "tsarin tsakiya a tsaye" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay" +msgstr "Juya mai murfi" -msgid "workspace.shape.menu.create-annotation" -msgstr "kirkiri hoto mai motsi" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay-dest" +msgstr "Juya mai murfi: %s" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-selected" -msgstr "zuko zababbe" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-trigger" +msgstr "Jawo" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.message" -msgstr "" -"ka tabbata kana son goge wannan tawagar? Duk aiyukanka na kundayen da suka " -"danganci tawagar za su yi gogewar dindindin." +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-url" +msgstr "URL" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay-dest" -msgstr "bude mai rufi: %s" +msgid "workspace.options.interaction-while-hovering" +msgstr "yayin shawagi" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type" -msgstr "Nau'i" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-pressing" +msgstr "yayin dannawa" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-url" -msgstr "bude URL" +msgid "workspace.options.interactions" +msgstr "yayin hulda" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.delete-invitation" -msgstr "goge gayyata" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color" +msgstr "kala" -msgid "workspace.path.actions.delete-node" -msgstr "goge kauri (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color-burn" +msgstr "kala konanniya" -msgid "shortcuts.letter-spacing-inc" -msgstr "kara filin harafin" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color-dodge" +msgstr "kala gudajjiya" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-destination" -msgstr "makoma" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.darken" +msgstr "kara masa duhu" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-google-submit" -msgstr "Gugul" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.difference" +msgstr "banbanci" -msgid "onboarding.newsletter.acceptance-message" -msgstr "" -"an aika maka da saqon buqatar biya, za mu aika maka da saqon imel tabbatar " -"da shi." +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.exclusion" +msgstr "warewa" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.go-main" -msgstr "tafi ainihin wurin fal" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.hard-light" +msgstr "Haske mai muya" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "fara aiki na" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.hue" +msgstr "Haske haske" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.delete-team" -msgstr "goge tawaga" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.lighten" +msgstr "kara masa haske" -msgid "shortcuts.draw-frame" -msgstr "Allo" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.luminosity" +msgstr "warewa" -msgid "shortcuts.text-align-center" -msgstr "jera tsakiya" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.multiply" +msgstr "sau" -msgid "shortcuts.undo" -msgstr "Cire" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.normal" +msgstr "na kullum" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "mashi" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.overlay" +msgstr "mai rufi" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.accept" -msgstr "sabunta" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.saturation" +msgstr "jikewa" -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.vcenter" -msgstr "Daidaita a kwance tsakiya (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.screen" +msgstr "allo" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.twitter-subtitle1" -msgstr "tambayoyin da ke buqatar amsa." +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.soft-light" +msgstr "haske mai sauki" -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.remove-account" -msgstr "ka na son cire taskarka?" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title" +msgstr "shafi" -msgid "labels.font-family" -msgstr "ire-iren font" +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title.group" +msgstr "rukunin shafi" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title.multiple" +msgstr "dayawa" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.advanced-ops" +msgstr "zabi na ci gaba" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-max-h" +msgstr "tsawo mafi yawa" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-max-w" +msgstr "fadi mafi yawa" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.viewer" -msgstr "yanayin kallo (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-min-h" +msgstr "tsawo mafi kankanta" -msgid "workspace.path.actions.make-curve" -msgstr "Ta lankwasa (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-min-w" +msgstr "fadi mafi kankanta" -msgid "workspace.options.search-font" -msgstr "nemo jerin harufa" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-max-h" +msgstr "tsawo mafi yawa" -msgid "onboarding.team-modal.create-team-feature-3" -msgstr "aiyukan shugaba" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-max-w" +msgstr "fadi mafi yawa" -msgid "workspace.path.actions.move-nodes" -msgstr "tafi da kauri (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-min-h" +msgstr "tsaho mafi kankanta" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-title" -msgstr "dangin fenfot" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-min-w" +msgstr "fadi mafi kankanta" -msgid "workspace.path.actions.join-nodes" -msgstr "hada kauri (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.bottom" +msgstr "kasa" -msgid "shortcuts.merge-nodes" -msgstr "hada da kauri" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column" +msgstr "shafi" -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "wane kayan zane ka fi iya aiki da shi?" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column-reverse" +msgstr "sake shafi" -msgid "shortcuts.bool-difference" -msgstr "ma'auni mabanbanci" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row" +msgstr "jerawa" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-url" -msgstr "URL" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row-reverse" +msgstr "jera sauyin fasali" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "ka sami lambar tsaron da aka yi." +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.gap" +msgstr "Gibi" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.community" -msgstr "matattara" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.left" +msgstr "hagu" -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.move" -msgstr "motsa abun" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin" +msgstr "gefe" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title.multiple" -msgstr "dayawa" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin-all" +msgstr "gefen duka" -msgid "shortcuts.make-corner" -msgstr "kirkiri kwana" +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin-simple" +msgstr "Samfarin gefe" -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.show-your-comments" -msgstr "bayyana na ka ra’ayin" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.packed" +msgstr "cushe" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "mi ne ne matsayinka?" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding" +msgstr "filla filla" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.letter-spacing" -msgstr "fili a tsakanin haruffa" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-all" +msgstr "duka gefan" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.direction-ltr" -msgstr "LTR" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-simple" +msgstr "sassaukan ciko" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.shared-libraries" -msgstr "taskoki" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.right" +msgstr "dama" -#: src/app/main/ui/dashboard/team.cljs -msgid "title.team-invitations" -msgstr "Gayyata - %s - Mazubin biruka" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-around" +msgstr "kewayayyen sarrari" -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.pin-unpin" -msgstr "rufewa/buxewa" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-between" +msgstr "sarari tsakani" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.num-of-files" -msgid_plural "labels.num-of-files" -msgstr[0] "kundi 1" -msgstr[1] "kundaye %s" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.top" +msgstr "sama" -msgid "labels.custom-fonts" -msgstr "kwalliya da fenfot" +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.more-colors" +msgstr "kaloli masu yawa" -#: src/app/main/ui/dashboard/comments.cljs -msgid "labels.comments" -msgstr "yabo" +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.more-lib-colors" +msgstr "Ma'ajiyar kaloli masu yawa" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.height" -msgstr "tsawo" +msgid "workspace.options.opacity" +msgstr "dishi dishi" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.delete" -msgstr "goge" +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.position" +msgstr "matsayi" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show-in-assets" -msgstr "nuna ta kusuwar kadara" +#: src/app/main/ui/workspace/sidebar/options.cljs +msgid "workspace.options.prototype" +msgstr "samfur" -msgid "workspace.undo.entry.multiple.shape" -msgstr "siffa" +msgid "workspace.options.radius" +msgstr "digon tsakiyar da'ira" -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.info" -msgstr "bayani" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-bottom-left" +msgstr "kasan hagu" -msgid "workspace.options.interaction-auto" -msgstr "da kanshi" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-bottom-right" +msgstr "kasan dama" -msgid "onboarding.team-modal.create-team-feature-2" -msgstr "ma su yin shiri dayawa lokaci xaya" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-top-left" +msgstr "saman hagu" -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"xakin ba komai. wurin ajiyar tawaga, turken da ka yi za ya yi aiki a sauran " -"kundaye. ka tabbata kai ne ka ke son wallafa shi?" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-top-right" +msgstr "saman dama" -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.dashboard" -msgstr "dashbod" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius.all-corners" +msgstr "duka kwanar" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title.multiple" -msgstr "inuwar zabi" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius.single-corners" +msgstr "kwanar da take cin gashin kanta" -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.save-settings" -msgstr "wurin ajiyar saiti" +msgid "workspace.options.recent-fonts" +msgstr "da dimi dimi" -#: src/app/main/errors.cljs -msgid "errors.max-quote-reached" -msgstr "kammala adadin '%s' madogara. gyara." +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.retry" +msgstr "sake" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-prev-screen" -msgstr "allon daya gabata" +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.rotation" +msgstr "juyawa" -msgid "labels.active" -msgstr "mai amfani" +msgid "workspace.options.search-font" +msgstr "nemo jerin harufa" -msgid "shortcuts.text-align-right" -msgstr "jera dama" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.select-a-shape" +msgstr "zabi surar allo, ko rukuni ta hadu da daya allon." -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.add" -msgstr "tarawa" +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.selection-color" +msgstr "zababbabbin kaloli" -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.text-decoration" -msgstr "kwalliyar rubutu" +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.selection-fill" +msgstr "cika zabi" -msgid "dashboard.import.import-warning" -msgstr "wasu kundayen na dauke da abubuwan da ba su da amfani." +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.selection-stroke" +msgstr "gigciye zabi" -#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs -msgid "errors.media-type-mismatch" -msgstr "hoton da aka sanya bai yi daidai da kundin da ake son faxaxawa ba." +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.blur" +msgstr "dishi dishi" -msgid "shortcuts.opacity-0" -msgstr "Saita dishi dishi zuwa kashi 100" +msgid "workspace.options.shadow-options.color" +msgstr "inuwar kala" -msgid "shortcuts.clear-undo" -msgstr "goge sake" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.drop-shadow" +msgstr "ajiye inuwa" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.text" -msgstr "rubutu (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.inner-shadow" +msgstr "Inuwar ciki" -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.update" -msgstr "sabintawas" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsetx" +msgstr "X" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.copy" -msgstr "kwafi" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsety" +msgstr "Y" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.curve" -msgstr "kwana(%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.spread" +msgstr "bazu" -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding-all" -msgstr "duka gefan" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title" +msgstr "inuwa" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title" -msgstr "rubutu" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title.group" +msgstr "rukunin inuwa" -#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs -msgid "viewer.empty-state" -msgstr "Babu allon da aka samu a wannan fejin." +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title.multiple" +msgstr "inuwar zabi" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.file-library" -msgstr "Ma'adanar fiyal" +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.show-fill-on-export" +msgstr "fito da shi a ga" -msgid "inspect.tabs.code.selected.path" -msgstr "hanya" +msgid "workspace.options.show-in-viewer" +msgstr "fito da kaurin sosai" -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.left" -msgstr "hagu" +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.size" +msgstr "girma" -msgid "shortcut-subsection.navigation-workspace" -msgstr "shawagi" +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs +msgid "workspace.options.size-presets" +msgstr "yanayin girman yanayin" -msgid "shortcuts.bool-union" -msgstr "ma'auni hadaka" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke" +msgstr "gigciye" -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.submit" -msgstr "sake imel" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker" +msgstr "da'irar kasuwa" -#: src/app/main/errors.cljs -msgid "errors.feature-not-supported" -msgstr "sassa '%s' ba za su yi aiki ba." +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "da'ira" -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.rename-team" -msgstr "sake suna tawaga" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker" +msgstr "darajar kasuwa" -#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "workspace.options.blur-options.title.group" -msgstr "rukuni" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "mai daraja" -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-projects" -msgstr "aiyukan tawaga" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow" +msgstr "layin mashiw" -msgid "shortcuts.underline" -msgstr "Danna ta layi a kasa" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "mashi" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-never" -msgstr "bai yiwuwa" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.none" +msgstr "ba komai" -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgb-complementary" -msgstr "Jituwar RGB" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.round" +msgstr "da'ira" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.edit" -msgstr "Tace" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square" +msgstr "murabba'i" -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.message" -msgstr "ka tabbata kana son cire wannan memban a wannan tawaar?" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker" +msgstr "murabba'in kasuwa" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.hint" -msgstr "" -"ka kusa sabunta sashe a babbar taska. wannan za ya iya aiki a sauran " -"kundayen da ke amfani da ita." +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Rectangle" -#: src/app/main/ui/static.cljs -msgid "labels.internal-error.main-message" -msgstr "kuskuren ciki" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow" +msgstr "Triangle mashi" -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.title" -msgstr "sake imel xinka" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Triangle" -msgid "shortcut-subsection.modify-layers" -msgstr "gyara shimfida" +msgid "workspace.options.stroke-color" +msgstr "gigciye kalar" -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.release-notes" -msgstr "bayar da bayani" +msgid "workspace.options.stroke-width" +msgstr "gigciye fadin" -msgid "shortcuts.unmask" -msgstr "Cire takunkumi" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.center" +msgstr "tsakiya" -msgid "workspace.options.y" -msgstr "Y layi" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.dashed" +msgstr "layin raba abu" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.message" -msgstr "cire “%s” a taskar shirye-shirye" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.dotted" +msgstr "digo digo" #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.round" -msgstr "da'ira" +msgid "workspace.options.stroke.inner" +msgstr "ciki" -msgid "shortcuts.toggle-lock" -msgstr "Rufe/bude" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.mixed" +msgstr "gauraya" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.password" -msgstr "lambar tsaro" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.outer" +msgstr "waje" -msgid "viewer.breaking-change.message" -msgstr "Sannu!" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.solid" +msgstr "mai tauri" -msgid "shortcut-subsection.panels" -msgstr "allon sarrarfav naura" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-bottom" +msgstr "jerin kasa" -msgid "inspect.tabs.code.selected.circle" -msgstr "da'ira" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-middle" +msgstr "jerin tsakiya" -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.info" -msgstr "idan ka cire asusunka za ka iya rasa aikin da ka kammala." +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-top" +msgstr "jerin sama" -msgid "dashboard.loading-fonts" -msgstr "xora abin adonka …" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.direction-ltr" +msgstr "LTR" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.hint1" -msgstr "" -"kai ne mai wannan tawagar. zabi wani memba da za ya iya inganta wa mai shi " -"kafin ka fita." +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.direction-rtl" +msgstr "RTL" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to-multi" -msgstr "tura %s kundaye a" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-auto-height" +msgstr "sarrafaffan tsaho" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.topbottom" -msgstr "sama & kasa" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-auto-width" +msgstr "sarrafaffen fadi" -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.vdistribute" -msgstr "rarraba filin tsaye (%s)" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-fixed" +msgstr "dasa" -msgid "shortcuts.separate-nodes" -msgstr "raba kauri" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.letter-spacing" +msgstr "tazarar harafi" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-close-confirm.message" -msgstr "ka tabbata ka na son fita daga %s tawaga?" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.line-height" +msgstr "tsahon layi" -msgid "shortcut-subsection.path-editor" -msgstr "Hanya" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.lowercase" +msgstr "yanayin kasa" -msgid "common.share-link.link-copied-success" -msgstr "an samo kwafi" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.none" +msgstr "babu" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "mawallafi/VP" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.strikethrough" +msgstr "gigciye ta cikinsa (%s)" -#: src/app/main/ui/inspect/attributes/stroke.cljs -msgid "inspect.attributes.stroke.width" -msgstr "fadi" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-center" +msgstr "jerin tsakiya (%s)" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.message" -msgid_plural "modals.delete-shared-confirm.message" -msgstr[0] "ka tabbata kana son goge wannan kundin?" -msgstr[1] "ka tabbata kana son goge waxannan kundayen?" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-justify" +msgstr "tabbatarwa (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title" -msgstr "shafi" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-left" +msgstr "jera hagu (%s)" -#: src/app/main/ui/dashboard/fonts.cljs -msgid "title.dashboard.fonts" -msgstr "jerin harufa - %s - Mazubin biruka" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-right" +msgstr "jera dama (%s)" -msgid "workspace.undo.entry.multiple.text" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title" msgstr "rubutu" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.email" -msgstr "imel" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title-group" +msgstr "rukunin rubutu" -msgid "workspace.sidebar.layers.shapes" -msgstr "Siffa" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title-selection" +msgstr "zababbun rubutu" -#: src/app/main/ui/workspace/colorpicker/libraries.cljs, src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.recent-colors" -msgstr "kalar yanzu" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.titlecase" +msgstr "yanayin lakani" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.add-flow-start" -msgstr "Kara gudun farko" +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.underline" +msgstr "ja layi (%s)" -msgid "inspect.attributes.typography.text-transform.uppercase" -msgstr "manyan baqaqe" +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.uppercase" +msgstr "yanayin sama" -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.show-fill-on-export" -msgstr "fito da shi a ga" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.use-play-button" +msgstr "yi amfani da madanneta ta sama ki tafi da samfuri." -msgid "labels.inactive" -msgstr "maras amfani" +msgid "workspace.options.width" +msgstr "fadi" -msgid "dashboard.export.title" -msgstr "fitar da kundayr" +msgid "workspace.options.x" +msgstr "X layi" -msgid "modals.publish-empty-library.accept" -msgstr "wallafa" +msgid "workspace.options.y" +msgstr "Y layi" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.center" -msgstr "Tsakiya" +msgid "workspace.path.actions.add-node" +msgstr "kara kauri (%s)" -msgid "shortcuts.toggle-lock-size" -msgstr "Rufe rabo" +msgid "workspace.path.actions.delete-node" +msgstr "goge kauri (%s)" -#: src/app/main/ui/comments.cljs -msgid "labels.delete-comment" -msgstr "goge yabo" +msgid "workspace.path.actions.draw-nodes" +msgstr "zane da kauri (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-max-h" -msgstr "tsawo mafi yawa" +msgid "workspace.path.actions.join-nodes" +msgstr "hada kauri (%s)" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.register-submit" -msgstr "qirqiri kundi" +msgid "workspace.path.actions.make-corner" +msgstr "ta kwana (%s)" -msgid "onboarding-v2.before-start.desc3.title" -msgstr "koyarwa ta hoto mai motsi" +msgid "workspace.path.actions.make-curve" +msgstr "Ta lankwasa (%s)" -msgid "shortcuts.thumbnail-set" -msgstr "saita babban yatsa" +msgid "workspace.path.actions.merge-nodes" +msgstr "hade kauri (%s)" -msgid "workspace.shape.menu.restore-main" -msgstr "saita ainihin wurin" +msgid "workspace.path.actions.move-nodes" +msgstr "tafi da kauri (%s)" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.no-projects-placeholder" -msgstr "nan za a ga bayanin aiki" +msgid "workspace.path.actions.separate-nodes" +msgstr "raba kauri (%s)" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.libraries" -msgstr "ma'adanai" +msgid "workspace.path.actions.snap-nodes" +msgstr "tsinke kauri (%s)" -msgid "onboarding-v2.welcome.desc1" -msgstr "" -"fenfot ne ke yin kelaidos kamar yadda mutane ke yi, mutane na taimakon " -"junansu. kowa za ya iya hada hannu da:" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.add-flex" +msgstr "kara sassaukan tsarit" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.title" -msgstr "samar da alamar shiga" +msgid "workspace.shape.menu.add-grid" +msgstr "kara akwatin tsari" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.no-expiration" -msgstr "ba lokacin daina amfani" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.back" +msgstr "tura zuwa baya" -msgid "shortcuts.go-to-search" -msgstr "gajeran sako" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.backward" +msgstr "tura zuwa baya" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "suna dole ya qunshi alamomin rubutu 250." +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.copy" +msgstr "kwafi" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.libraries" -msgstr "dakunan karatu" +msgid "workspace.shape.menu.create-annotation" +msgstr "kirkiri hoto mai motsi" -#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.components" -msgstr "Bangarori" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.create-artboard-from-selection" +msgstr "zababban allo" -#, permanent -msgid "inspect.attributes.stroke.alignment.inner" -msgstr "daga ciki" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.create-component" +msgstr "kirkiri abubuwa" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.select-all" -msgstr "zabi duka" +msgid "workspace.shape.menu.create-multiple-components" +msgstr "kirkiri abubuwa da yawa" -msgid "labels.upload-custom-fonts" -msgstr "Upload custom fonts" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.cut" +msgstr "cire" -msgid "shortcuts.flip-horizontal" -msgstr "kifa shi dai dai" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete" +msgstr "goge" -msgid "dashboard.import.progress.process-components" -msgstr "aikin sassa" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete-flow-start" +msgstr "goge kwararar farko" -#: src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs -msgid "dashboard.update-settings" -msgstr "zamanartarwa wurin gyara" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.detach-instance" +msgstr "raba yanayin abin" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints" -msgstr "Takura" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.detach-instances-in-bulk" +msgstr "raba yanayin abin" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.saturation" -msgstr "jikewa" +msgid "workspace.shape.menu.difference" +msgstr "bambanci" -msgid "workspace.sidebar.expand" -msgstr "kara yankin ma'agiyar bayani" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.duplicate" +msgstr "maimaita" -#: src/app/main/ui/inspect/attributes/blur.cljs -msgid "inspect.attributes.blur" -msgstr "xige-xige" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.edit" +msgstr "tace" -#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.mask" -msgstr "takunkumik" +msgid "workspace.shape.menu.exclude" +msgstr "kebe" -#: src/app/main/ui/dashboard/fonts.cljs -msgid "title.dashboard.font-providers" -msgstr "samar da jerin harufa - %s - Mazubin biruka" +msgid "workspace.shape.menu.flatten" +msgstr "mikad da abu" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.num-of-projects" -msgid_plural "labels.num-of-projects" -msgstr[0] "aiki" -msgstr[1] "aiyuka %s" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flip-horizontal" +msgstr "kifa ta tsaye" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flip-vertical" +msgstr "kifa ta kwance" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.libraries.text.multiple-typography-tooltip" -msgstr "Cire mahadar duka rabutun rubutu" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flow-start" +msgstr "fara malala" -msgid "shortcuts.start-editing" -msgstr "fara gyarawa" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.forward" +msgstr "kawo ta gaba" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay-dest" -msgstr "Juya mai murfi: %s" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.front" +msgstr "kawo zuwa gaba" -#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.graphics" -msgstr "zane zane" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.go-main" +msgstr "tafi ainihin wurin fal" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.pending-invitation" -msgstr "tukuna" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.group" +msgstr "rukuni" -msgid "workspace.path.actions.make-corner" -msgstr "ta kwana (%s)" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.hide" +msgstr "boye" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.line-height" -msgstr "tsawon layi" +msgid "workspace.shape.menu.hide-ui" +msgstr "nuna / boye UI" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "da'ira" +msgid "workspace.shape.menu.intersection" +msgstr "mahada" -msgid "modals.create-webhook.url.label" -msgstr "farashin URL" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.lock" +msgstr "kulle" -msgid "workspace.options.stroke-color" -msgstr "gigciye kalar" +#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.mask" +msgstr "takunkumik" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "11-30" +#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.paste" +msgstr "manna" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.copy-token" -msgstr "kwafar kyauta" +msgid "workspace.shape.menu.path" +msgstr "hanya" -msgid "dashboard.export-binary-multi" -msgstr "sauke %s kundayen manhajar fenfot(.penpot)" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-flex" +msgstr "cire sassaukan tsari" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.components" -msgstr "%s bangarori" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.reset-overrides" +msgstr "sake saita sokewa" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.title" -msgid_plural "modals.unpublish-shared-confirm.title" -msgstr[0] "rufe taska" -msgstr[1] "rufe taskoki" +msgid "workspace.shape.menu.restore-main" +msgstr "saita ainihin wurin" -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.no-elements" -msgstr "ba wasu abubuwan da ake daidaitawa wajen tsara fitarwa." +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.select-layer" +msgstr "zabi shimfida" -#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs -msgid "workspace.gradients.radial" -msgstr "a da'ira" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show" +msgstr "nuna" -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.cancel" -msgstr "ajiye asusu da soke shi" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-in-assets" +msgstr "nuna ta kusuwar kadara" -msgid "shortcuts.move-unit-left" -msgstr "Matsa da sashin hagu" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-main" +msgstr "nuna ainihin wurin" -msgid "inspect.attributes.stroke.style.mixed" -msgstr "gauraya" +msgid "workspace.shape.menu.thumbnail-remove" +msgstr "cire girman babban danyatsa" -msgid "shortcuts.toggle-colorpalette" -msgstr "Danna launukan kala" +msgid "workspace.shape.menu.thumbnail-set" +msgstr "kara kamar girman babban yatsa" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.outer" -msgstr "waje" +msgid "workspace.shape.menu.transform-to-path" +msgstr "sauya zuwa hanya" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-top-left" -msgstr "saman hagu" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.ungroup" +msgstr "raba rukunin" -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.start" -msgstr "fara koyarwa" +msgid "workspace.shape.menu.union" +msgstr "hadakan" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.box-filter-all" -msgstr "duka kadara" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.unlock" +msgstr "bude" -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.invite-invalid" -msgstr "gaiyar ba ta yi ba" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.unmask" +msgstr "bude takunkumi" -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.normal" -msgstr "na kullum" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.update-components-in-bulk" +msgstr "sabunta ainihin wurin" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.delete-multi-files" -msgstr "goge %s kundaye" +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.update-main" +msgstr "sabunta ainihin wurin" -msgid "shortcuts.join-nodes" -msgstr "hada abubuwan" +msgid "workspace.sidebar.collapse" +msgstr "ruguza a'ajiyar bayani" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.preferences" -msgstr "fifiko" +msgid "workspace.sidebar.expand" +msgstr "kara yankin ma'agiyar bayani" -#: src/app/main/ui/static.cljs -msgid "labels.service-unavailable.desc-message" -msgstr "mu na cikin kula a tsarinka." +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.sidebar.history" +msgstr "labari (%s)" -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.vbottom" -msgstr "Daidaita kasa (%s)" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.sidebar.layers" +msgstr "shafi" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.font-variant-id" -msgstr "bambanci" +msgid "workspace.sidebar.layers.components" +msgstr "bangare" -#: src/app/main/ui/settings/options.cljs -msgid "labels.language" -msgstr "harshe" +msgid "workspace.sidebar.layers.frames" +msgstr "allo" -msgid "shortcut-subsection.text-editor" -msgstr "Rubutu" +msgid "workspace.sidebar.layers.groups" +msgstr "rukuni" -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.shared-libraries" -msgstr "Rabban ma'adanai" +msgid "workspace.sidebar.layers.images" +msgstr "hoto" -msgid "workspace.shape.menu.exclude" -msgstr "kebe" +msgid "workspace.sidebar.layers.masks" +msgstr "takunkumi" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-delete-file" -msgid_plural "dashboard.success-delete-file" -msgstr[0] "an goge kundinka" -msgstr[1] "an goge kundayenka" +msgid "workspace.sidebar.layers.search" +msgstr "nemo shimfida" -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.message" -msgstr "ka tabbata ka na son goge fira? duk sharhi a nan za a goge matsaloli." +msgid "workspace.sidebar.layers.shapes" +msgstr "Siffa" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.rotation" -msgstr "juyawa" +msgid "workspace.sidebar.layers.texts" +msgstr "rubutu" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "... zane-zane, kayan kallo, tsarin qira, etc." +#: src/app/main/ui/workspace/sidebar/options/menus/svg_attrs.cljs, src/app/main/ui/inspect/attributes/svg.cljs +msgid "workspace.sidebar.options.svg-attrs.title" +msgstr "shigo da shi SVG halaye" -msgid "shortcuts.move-unit-up" -msgstr "Matsa da sashin samu" +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "workspace.sidebar.sitemap" +msgstr "shafi" -msgid "labels.upload" -msgstr "xorawa" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.sitemap" +msgstr "taswirar wuri" -msgid "onboarding-v2.welcome.desc2" -msgstr "" -"wurin da kowa zai iya koyo, fahimtar ta juna a kan fenfot, kasancewarta " -"manyan tawagar fenfot da sauran mutane." +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.assets" +msgstr "kadara" -#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.rename" -msgstr "sake suna" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.color-palette" +msgstr "farantin kala (%s)" -msgid "shortcuts.zoom-lense-decrease" -msgstr "Zuko raguwar ido" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.comments" +msgstr "ra'ayi (%s)" -msgid "modals.edit-webhook.title" -msgstr "gyara webhook" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.curve" +msgstr "kwana(%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.ellipse" +msgstr "siffar kwai (%s)" -msgid "workspace.undo.entry.single.shape" -msgstr "siffa" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.frame" +msgstr "allo (%s)" -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "workspace.sidebar.sitemap" -msgstr "shafi" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.image" +msgstr "hoto (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.width" -msgstr "fadi" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.move" +msgstr "motsa (%s)" -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.send" -msgstr "aika" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.path" +msgstr "hanya (%s)" -#: src/app/main/ui/workspace.cljs -msgid "title.workspace" -msgstr "%s - Mazubin biruka" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.rect" +msgstr "Rectangle (%s)" -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.no-matches-for" -msgstr "ba wanda ya yi daidai da “%s“" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.shortcuts" +msgstr "yanke (%s)" -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.text-transform" -msgstr "canja rubutu" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text" +msgstr "rubutu (%s)" -msgid "errors.email-as-password" -msgstr "ba za ka iya amfani da imel ba a matsayin lambar tsaro ba" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text-palette" +msgstr "rubutub rubutu (%s)" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.duplicate-multi" -msgstr "kwafi %s kundaye" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.empty" +msgstr "babu labaran da su ka canja a yanzu" -msgid "shortcuts.line-height-dec" -msgstr "rage tsawon layi" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.delete" +msgstr "gogagge %s" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.view" -msgstr "gani" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.modify" +msgstr "gyaggyarawa %s" -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.detach-instances-in-bulk" -msgstr "raba yanayin abin" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.move" +msgstr "motsa abun" -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.scale" -msgstr "maauni" +msgid "workspace.undo.entry.multiple.circle" +msgstr "da'ira" -msgid "inspect.empty.more-info" -msgstr "qarin bayani a fagen lura" +msgid "workspace.undo.entry.multiple.color" +msgstr "kadarar kala" -#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs -msgid "notifications.profile-saved" -msgstr "an ajiye bayanai!" +msgid "workspace.undo.entry.multiple.component" +msgstr "bangare" -msgid "workspace.focus.focus-off" -msgstr "karka maida hankali" +msgid "workspace.undo.entry.multiple.curve" +msgstr "kwana" -msgid "shortcuts.toggle-fullscreen" -msgstr "Danna fuskar ta cika duka" +msgid "workspace.undo.entry.multiple.frame" +msgstr "allo" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "title.settings.access-tokens" -msgstr "karin bayani - Shiga alama" +msgid "workspace.undo.entry.multiple.group" +msgstr "rukunis" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-duplicate-file" -msgid_plural "dashboard.success-delete-file" -msgstr[0] "an kwafi kundinka" -msgstr[1] "an kwafi kundayenka" +msgid "workspace.undo.entry.multiple.media" +msgstr "kadarar zane" -#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.colors" -msgstr "kala" +msgid "workspace.undo.entry.multiple.multiple" +msgstr "abu" -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.owner" -msgstr "mai" +msgid "workspace.undo.entry.multiple.page" +msgstr "shafi" -msgid "shortcuts.select-prev" -msgstr "zabi shafin da ya gabata" +msgid "workspace.undo.entry.multiple.path" +msgstr "hanya" -#: src/app/main/ui/dashboard/grid.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-move-file" -msgstr "an tura aikinka" +msgid "workspace.undo.entry.multiple.rect" +msgstr "rectangles" -msgid "workspace.options.radius" -msgstr "digon tsakiyar da'ira" +msgid "workspace.undo.entry.multiple.shape" +msgstr "siffa" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.back" -msgstr "tura zuwa baya" +msgid "workspace.undo.entry.multiple.text" +msgstr "rubutu" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow" -msgstr "layin mashiw" +msgid "workspace.undo.entry.multiple.typography" +msgstr "rubutun rubuta kadara" -msgid "shortcuts.align-left" -msgstr "tsarin hagu" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.new" +msgstr "sabo %s" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.edit" -msgstr "tace" +msgid "workspace.undo.entry.single.circle" +msgstr "da'ira" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.ungroup" -msgstr "kashe daga kungiya" +msgid "workspace.undo.entry.single.color" +msgstr "kalar kadara" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.not-found" -msgstr "ba'a samu kadara ba" +msgid "workspace.undo.entry.single.component" +msgstr "bangarori" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fit-all" -msgstr "zuko yayi daidai da ko'ina" +msgid "workspace.undo.entry.single.curve" +msgstr "lankwasa" -#: src/app/main/ui/auth/register.cljs -msgid "auth.login-here" -msgstr "shiga nan" +msgid "workspace.undo.entry.single.frame" +msgstr "allo" -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.subject" -msgstr "shugabanci" +msgid "workspace.undo.entry.single.group" +msgstr "rukuni" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-after-delay" -msgstr "Bayan jinkiri" +msgid "workspace.undo.entry.single.image" +msgstr "hoto" -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.create-team.placeholder" -msgstr "shigar da sabon sunan tawaga" +msgid "workspace.undo.entry.single.media" +msgstr "kadarar zanen hotuna" -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-max-h" -msgstr "tsawo mafi yawa" +msgid "workspace.undo.entry.single.multiple" +msgstr "wani abu" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title" -msgstr "inuwa" +msgid "workspace.undo.entry.single.page" +msgstr "shafi" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.size" -msgstr "girma" +msgid "workspace.undo.entry.single.path" +msgstr "hanya" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.help-info" -msgstr "taimako & bayani" +msgid "workspace.undo.entry.single.rect" +msgstr "rectangle" -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title-group" -msgstr "rukunin rubutu" +msgid "workspace.undo.entry.single.shape" +msgstr "siffa" msgid "workspace.undo.entry.single.text" msgstr "sako" -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.type-something" -msgstr "rubuta neman sakamako" - -msgid "shortcuts.mask" -msgstr "takunkumi" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-fixed" -msgstr "dasa" +msgid "workspace.undo.entry.single.typography" +msgstr "rubutun rubuta kadara" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.image" -msgstr "hoto (%s)" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.unknown" +msgstr "yanayi fiye da %s" -msgid "shortcuts.line-through" -msgstr "danna layin duk" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.title" +msgstr "labari" -msgid "workspace.undo.entry.single.path" -msgstr "hanya" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.dismiss" +msgstr "watsar" -msgid "errors.cannot-upload" -msgstr "kasa xora xan aiken kundi." +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "bayanai masu yawa" -msgid "onboarding.choice.team-up.create-team-placeholder" -msgstr "sanya sunan tawaga" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.there-are-updates" +msgstr "a kwai na zamani a rababban ma'ajiya" -msgid "shortcuts.move-fast-down" -msgstr "Matsa kasa da sauri" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.update" +msgstr "sabintawas" -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.add-flex" -msgstr "kara sassaukan tsarit" +msgid "workspace.viewport.click-to-close-path" +msgstr "latsa kusa da hanya" diff --git a/frontend/translations/he.po b/frontend/translations/he.po index eafd1cd44..5ea29f18a 100644 --- a/frontend/translations/he.po +++ b/frontend/translations/he.po @@ -1,16 +1,16 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-10-16 04:09+0000\n" +"PO-Revision-Date: 2024-02-17 14:02+0000\n" "Last-Translator: Yaron Shahrabani \n" -"Language-Team: Hebrew \n" +"Language-Team: Hebrew " +"\n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " "n % 10 == 0) ? 2 : 3));\n" -"X-Generator: Weblate 5.1-dev\n" +"X-Generator: Weblate 5.4\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -171,6 +171,13 @@ msgstr "תנאי השירות" msgid "auth.terms-privacy-agreement" msgstr "יצירת חשבון חדש מהווה את הסכמתך לתנאי השירות ולמדיניות הפרטיות." +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"עצם יצירת חשבון חדש מהווה הסכמה ל[תנאי השירות](%s) ול[מדיניות הפרטיות](%s) " +"שלנו." + #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "שלחנו הודעת דוא״ל לאימות אל" @@ -285,6 +292,10 @@ msgstr "יצירת אסימון חדש" msgid "dashboard.access-tokens.create.success" msgstr "אסימון הגישה נוצר בהצלחה." +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "נא ללחוץ על הכפתור „יצירת אסימון חדש” כדי ליצור אחד חדש." + #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.empty.no-access-tokens" msgstr "אין לך אסימונים עדיין." @@ -329,6 +340,12 @@ msgstr "אין תאריך תפוגה" msgid "dashboard.access-tokens.personal" msgstr "אסימוני כניסה אישיים" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"אסימוני גישה אישיים הם דרך חלופית למערכת אימות הכניסה/סיסמה שלנו ומאפשרים " +"ליישום לגשת ל־API הפנימי של Penpot" + #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.token-will-expire" msgstr "האסימון יפוג ב־%s" @@ -501,9 +518,19 @@ msgstr "ייבוא קובצי Penpot" msgid "dashboard.import.analyze-error" msgstr "אופס! לא הצלחנו לייבא את הקובץ הזה" +msgid "dashboard.import.analyze-error.components-v2" +msgstr "קובץ עם רכיבים בגרסה 2 מופעל אך הצוות הזה לא תומך בזה עדיין." + msgid "dashboard.import.import-error" msgstr "אירעה תקלה בייבוא הקובץ. הוא לא ייובא." +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "קובץ יובא בהצלחה." +msgstr[1] "%s קבצים יובאו בהצלחה." +msgstr[2] "%s קבצים יובאו בהצלחה." +msgstr[3] "%s קבצים יובאו בהצלחה." + msgid "dashboard.import.import-warning" msgstr "חלק מהקבצים הכילו פריטים שגויים שהוסרו." @@ -869,6 +896,12 @@ msgstr "" msgid "errors.feature-not-supported" msgstr "אין תמיכה ביכולת ‚%s’." +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"נראה שאין התאמ בין היכולות הפעילות לבין הקובץ שניסית לפתוח. יש להחיל הסבות " +"עבור ‚%s’ לפני שיתאפשר לפתוח את הקובץ הזה." + #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -917,6 +950,9 @@ msgstr "סיסמת האימות חייבת להיות תואמת" msgid "errors.password-too-short" msgstr "הסיסמה חייבת להיות באורך 8 תווים לפחות" +msgid "errors.paste-data-validation" +msgstr "נתונים שגויים בלוח הגזירים" + msgid "errors.profile-blocked" msgstr "הפרופיל חסום" @@ -930,6 +966,10 @@ msgstr "הודעות הדוא״ל לפרופיל שלך מושתקות (דיוו msgid "errors.registration-disabled" msgstr "ההרשמה מושבתת כרגע." +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "התגלתה יכולת לא תואמת ‚%s’" + msgid "errors.team-leave.insufficient-members" msgstr "אין מספיק חברים כדי לעזוב את הצוות, כנראה יהיה עליך למחוק אותו." @@ -949,6 +989,13 @@ msgstr "אירעה שגיאה בלתי צפויה." msgid "errors.unexpected-token" msgstr "אסימון בלתי ידוע" +msgid "errors.validation" +msgstr "שגיאת אימות" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "מספר גרסת הקובץ לא תואם" + msgid "errors.webhooks.connection" msgstr "שגיאת תקשורת, הכתובת אינה נגישה" @@ -1180,6 +1227,9 @@ msgstr "ללא" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "ראשונות גדולות" +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "ביטול הגדרה" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "אותיות גדולות" @@ -1587,6 +1637,9 @@ msgstr "תפקיד" msgid "labels.save" msgstr "שמירה" +msgid "labels.search" +msgstr "חיפוש" + msgid "labels.search-font" msgstr "חיפוש גופן" @@ -1611,6 +1664,9 @@ msgstr "השירות אינו זמין" msgid "labels.settings" msgstr "הגדרות" +msgid "labels.share" +msgstr "שיתוף" + msgid "labels.share-prototype" msgstr "שיתוף אבטיפוס" @@ -1680,10 +1736,33 @@ msgstr "(אני)" msgid "labels.your-account" msgstr "החשבון שלך" +msgid "media.choose-image" +msgstr "בחירת תמונה" + +msgid "media.gradient" +msgstr "מדרג" + +msgid "media.image" +msgstr "תמונה" + +msgid "media.linear" +msgstr "קווי" + #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "התמונה נטענת…" +msgid "media.radial" +msgstr "מעגלי" + +msgid "media.solid" +msgstr "אחיד" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"הספרייה שלך ריקה. לאחר שנוספה כתיקייה משותפת, הנכסים שנוצרים על ידיך יהיו " +"זמינים לצד שאר הקבצים שלך. לפרסם אותה?" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -1801,6 +1880,12 @@ msgstr "למחוק את הדיון הזה? כל התגובות בשרשור תי msgid "modals.delete-comment-thread.title" msgstr "מחיקת דיון" +msgid "modals.delete-component-annotation.message" +msgstr "למחוק את הסימון הזה?" + +msgid "modals.delete-component-annotation.title" +msgstr "מחיקת סימון" + #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-file-confirm.accept" msgstr "מחיקת קובץ" @@ -1866,6 +1951,22 @@ msgstr[1] "מחיקת קבצים" msgstr[2] "מחיקת קבצים" msgstr[3] "מחיקת קבצים" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "לא מופעל באף קובץ." +msgstr[1] "לא מופעלים באף קובץ." +msgstr[2] "לא מופעלים באף קובץ." +msgstr[3] "לא מופעלים באף קובץ." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.scd-message" +msgid_plural "modals.delete-shared-confirm.activated.scd-message" +msgstr[0] "הספרייה הזאת מופעלת כאן: " +msgstr[1] "הספריות האלו מופעלות כאן: " +msgstr[2] "הספריות האלו מופעלות כאן: " +msgstr[3] "הספריות האלו מופעלות כאן: " + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-shared-confirm.message" @@ -1908,6 +2009,14 @@ msgstr "למחוק את החבר הזה מהצוות?" msgid "modals.delete-team-member-confirm.title" msgstr "למחוק חבר בצוות" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "נכסים שכבר נעשה בהם שימוש בקובץ הזה יישארו שם (אף עיצוב לא ייפגע)." +msgstr[1] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." +msgstr[2] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." +msgstr[3] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." + msgid "modals.delete-webhook.accept" msgstr "מחיקת התליה" @@ -2180,12 +2289,33 @@ msgstr "מדריך למתנדבים" msgid "onboarding-v2.welcome.title" msgstr "ברוך בואך ל־Penpot!" +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "להמשיך ביצירת צוות" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "להמשיך בלי צוות" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "ליצור צוות ולהזמין" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "ליצור צוות ולשלוח הזמנות" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "אפשר להזמין בהמשך" + msgid "onboarding.choice.team-up.create-team-desc" msgstr "לאחר מתן שם לצוות שלך, יתאפשר לך להזמין אנשים להצטרף." msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "נא למלא את שם הצוות" +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "ליצור צוות" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "ליצור צוות בלי לשלוח הזמנות" + msgid "onboarding.choice.team-up.invite-members" msgstr "הזמנת חברים" @@ -2195,6 +2325,12 @@ msgstr "רצוי לזכור לכלול את כולם. מפתחים, מעצבים msgid "onboarding.choice.team-up.roles" msgstr "הזמנה עם התפקיד:" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "להתחיל בלי צוות" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "אפשר ליצור צוות בהמשך." + msgid "onboarding.newsletter.accept" msgstr "כן, להירשם" @@ -2291,14 +2427,30 @@ msgstr "היכרות מעמיקה יותר עם Penpot" msgid "questions.figma" msgstr "Figma" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "מייסד/סגן נשיא" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.freelancer" msgstr "יש לי עסק משלי" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "הורדת הקוד מהמיזם הצוותי שלי " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "… עיצוב מנשק, נכסים חזותיים, מערכות עיצוב, וכו׳." + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.invision" msgstr "InVision" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "להשאיר משוב למיזם הצוותי שלי" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.lets-get-started" msgstr "מתחילים!" @@ -2363,10 +2515,40 @@ msgstr "התחלה" msgid "questions.start-to-work-on-my-project" msgstr "התחלת עבודה על מיזם משלי" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "סטודנט/ית או מרצה" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.team-size" msgstr "מה גודל הצוות שלך?" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "לבדוק את Penpot ולראות אם הוא מתאים לצוות שלי " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "אפשר להתנסות לפני שימוש ב־Penpot אצלך בעבודה" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "… תרשימי מתאר, סיפורי ותהליכי משתמשים, עצי ניווט ועוד." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "עבודה עם רעיונות למימוש" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"המשוב שלך יסייע לנו להבין מה הם ההרגלים וההעדפות שלך כדי שנוכל להמשיך להפוך " +"את Penpot לכלי מהנה ושימושי." + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "ניתוק" + #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, @@ -2823,6 +3005,9 @@ msgstr "הצגת/הסתרת סרגלים" msgid "shortcuts.toggle-textpalette" msgstr "החלפת לוח טקסט" +msgid "shortcuts.toggle-theme" +msgstr "החלפת ערכת עיצוב" + msgid "shortcuts.toggle-visibility" msgstr "החלפת מצב הצגה" @@ -3160,6 +3345,45 @@ msgstr "התמרת טקסט" msgid "workspace.assets.ungroup" msgstr "פירוק קבוצה" +msgid "workspace.context-menu.grid-cells.area" +msgstr "יצירת שטח" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "יצירת לוח" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "מיזוג תאים" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "הוספת עמודה מימין" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "הוספת עמודה משמאל" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "מחיקת עמודה" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "מחיקת עמודה וצורות" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "שכפול עמודה" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "הוספת שורה מתחת" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "הוספת שורה למעלה" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "מחיקת שורה" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "מחיקת שורה וצורות" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "שכפול שורה" + msgid "workspace.focus.focus-mode" msgstr "מצב מיקוד" @@ -3283,6 +3507,12 @@ msgstr "הצגת סרגלים" msgid "workspace.header.menu.show-textpalette" msgstr "הצגת לוח גופנים" +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "החלפה לערכת עיצוב כהה" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "החלפה לערכת עיצוב בהירה" + msgid "workspace.header.menu.undo" msgstr "החזרה" @@ -3334,6 +3564,21 @@ msgstr "מסך מלא" msgid "workspace.header.zoom-selected" msgstr "התמקדות על הנבחר" +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "עריכת רשת" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "יציאה מהמערכת" + +msgid "workspace.layout_grid.editor.title" +msgstr "רשת עריכה" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "בוצע" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "איתור" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "הוספה" @@ -3346,6 +3591,10 @@ msgstr "%s צבעים" msgid "workspace.libraries.colors.empty-palette" msgstr "אין עדיין סגנונות צבע בספרייה שלך" +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "עדיין אין סוגי טיפוגרפיה בספרייה שלך" + #: src/app/main/ui/workspace/colorpicker/libraries.cljs, #: src/app/main/ui/workspace/colorpalette.cljs msgid "workspace.libraries.colors.file-library" @@ -3400,6 +3649,10 @@ msgstr "ספרייה" msgid "workspace.libraries.library-updates" msgstr "עדכוני ספרייה" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "בטעינה…" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "אין ספריות משותפות שדורשות עדכון" @@ -3471,6 +3724,27 @@ msgstr "חיתוך התוכן" msgid "workspace.options.component" msgstr "רכיב" +msgid "workspace.options.component.annotation" +msgstr "הסבר" + +msgid "workspace.options.component.copy" +msgstr "העתקה" + +msgid "workspace.options.component.create-annotation" +msgstr "יצירת הסבר" + +msgid "workspace.options.component.edit-annotation" +msgstr "עריכת הסבר" + +msgid "workspace.options.component.main" +msgstr "ראשי" + +msgid "workspace.options.component.swap" +msgstr "החלפת רכיב" + +msgid "workspace.options.component.swap.empty" +msgstr "עדיין אין נכסים בתיקייה הזאת" + #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "הגבלות" @@ -3566,6 +3840,10 @@ msgstr "מילוי" msgid "workspace.options.flows.add-flow-start" msgstr "הוספת תחילת זרימה" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "זרימה" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "התחלת זרימה" @@ -3669,6 +3947,9 @@ msgstr "מילוי קבוצה" msgid "workspace.options.group-stroke" msgstr "מתאר קבוצה" +msgid "workspace.options.guides.title" +msgstr "קווים מנחים" + msgid "workspace.options.height" msgstr "גובה" @@ -4215,14 +4496,26 @@ msgstr "מתאר" msgid "workspace.options.stroke-cap.circle-marker" msgstr "סמן עגול" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "עיגול" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "סמן יהלום" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "יהלום" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "חץ קו" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "חץ" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "ללא" @@ -4239,10 +4532,18 @@ msgstr "ריבוע" msgid "workspace.options.stroke-cap.square-marker" msgstr "סמן ריבוע" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "מרובע" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "חץ משולש" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "משולש" + msgid "workspace.options.stroke-color" msgstr "צבע מתאר" @@ -4432,6 +4733,9 @@ msgstr "הרחקה לאחור" msgid "workspace.shape.menu.copy" msgstr "העתקה" +msgid "workspace.shape.menu.create-annotation" +msgstr "יצירת הסבר" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.create-artboard-from-selection" msgstr "בחירה ללוח" @@ -4710,6 +5014,13 @@ msgstr "טקסט (%s)" msgid "workspace.toolbar.text-palette" msgstr "טיפוגרפיות (%s)" +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**מצב חקירה** (צפייה בלבד)" + +msgid "workspace.top-bar.read-only.done" +msgstr "בוצע" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "אין שינויים היסטוריים עד כה" @@ -4843,146 +5154,3 @@ msgstr "עדכון" msgid "workspace.viewport.click-to-close-path" msgstr "לחיצה תסגור את הנתיב" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "אפשר להתנסות לפני שימוש ב־Penpot אצלך בעבודה" - -msgid "dashboard.import.import-message" -msgid_plural "dashboard.import.import-message" -msgstr[0] "קובץ יובא בהצלחה." -msgstr[1] "%s קבצים יובאו בהצלחה." -msgstr[2] "%s קבצים יובאו בהצלחה." -msgstr[3] "%s קבצים יובאו בהצלחה." - -msgid "modals.delete-component-annotation.message" -msgstr "למחוק את הסימון הזה?" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.scd-message" -msgid_plural "modals.delete-shared-confirm.activated.scd-message" -msgstr[0] "הספרייה הזאת מופעלת כאן: " -msgstr[1] "הספריות האלו מופעלות כאן: " -msgstr[2] "הספריות האלו מופעלות כאן: " -msgstr[3] "הספריות האלו מופעלות כאן: " - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.no-files-message" -msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "לא מופעל באף קובץ." -msgstr[1] "לא מופעלים באף קובץ." -msgstr[2] "לא מופעלים באף קובץ." -msgstr[3] "לא מופעלים באף קובץ." - -msgid "modals.delete-component-annotation.title" -msgstr "מחיקת סימון" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "לבדוק את Penpot ולראות אם הוא מתאים לצוות שלי " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "סטודנט/ית או מרצה" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "להשאיר משוב למיזם הצוותי שלי" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"אסימוני גישה אישיים הם דרך חלופית למערכת אימות הכניסה/סיסמה שלנו ומאפשרים " -"ליישום לגשת ל־API הפנימי של Penpot" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "נא ללחוץ על הכפתור „יצירת אסימון חדש” כדי ליצור אחד חדש." - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"הספרייה שלך ריקה. לאחר שנוספה כתיקייה משותפת, הנכסים שנוצרים על ידיך יהיו " -"זמינים לצד שאר הקבצים שלך. לפרסם אותה?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "… עיצוב מנשק, נכסים חזותיים, מערכות עיצוב, וכו׳." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "עבודה עם רעיונות למימוש" - -msgid "workspace.options.component.copy" -msgstr "העתקה" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"המשוב שלך יסייע לנו להבין מה הם ההרגלים וההעדפות שלך כדי שנוכל להמשיך להפוך " -"את Penpot לכלי מהנה ושימושי." - -msgid "workspace.options.component.create-annotation" -msgstr "יצירת הסבר" - -msgid "workspace.options.component.edit-annotation" -msgstr "עריכת הסבר" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "הורדת הקוד מהמיזם הצוותי שלי " - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "מרובע" - -msgid "workspace.options.component.main" -msgstr "ראשי" - -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "עדיין אין סוגי טיפוגרפיה בספרייה שלך" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "נכסים שכבר נעשה בהם שימוש בקובץ הזה יישארו שם (אף עיצוב לא ייפגע)." -msgstr[1] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." -msgstr[2] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." -msgstr[3] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." - -msgid "workspace.options.component.annotation" -msgstr "הסבר" - -msgid "workspace.layout_grid.editor.title" -msgstr "רשת עריכה" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "… תרשימי מתאר, סיפורי ותהליכי משתמשים, עצי ניווט ועוד." - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "יהלום" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "ניתוק" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "משולש" - -msgid "workspace.shape.menu.create-annotation" -msgstr "יצירת הסבר" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "חץ" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "מייסד/סגן נשיא" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "עיגול" diff --git a/frontend/translations/hr.po b/frontend/translations/hr.po index a0e38637e..9075ac5de 100644 --- a/frontend/translations/hr.po +++ b/frontend/translations/hr.po @@ -2697,7 +2697,6 @@ msgstr "Omogući dinamičko poravnanje" msgid "workspace.header.menu.enable-scale-text" msgstr "Omogući skaliranje teksta" - #: src/app/main/ui/workspace/header.cljs #, fuzzy msgid "workspace.header.menu.enable-snap-guides" diff --git a/frontend/translations/id.po b/frontend/translations/id.po index 037737bdd..86d745eef 100644 --- a/frontend/translations/id.po +++ b/frontend/translations/id.po @@ -1,15 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-10-07 12:12+0000\n" +"PO-Revision-Date: 2024-04-08 15:01+0000\n" "Last-Translator: Linerly \n" -"Language-Team: Indonesian \n" +"Language-Team: Indonesian " +"\n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.1-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -176,6 +176,13 @@ msgstr "" "Ketika membuat akun baru, Anda menyetujui kebijakan layanan dan kebijakan " "privasi kami." +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Ketika membuat akun baru, Anda menyetujui [persyaratan layanan](%s) dan " +"[kebijakan privasi](%s) kami." + #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "Kami telah mengirimkan surel verifikasi ke" @@ -528,6 +535,9 @@ msgstr "Impor berkas Penpot" msgid "dashboard.import.analyze-error" msgstr "Aduh! Kami tidak dapat mengimpor berkas ini" +msgid "dashboard.import.analyze-error.components-v2" +msgstr "Berkas dengan komponen v2 diaktifkan tetapi tim ini belum mendukungnya." + msgid "dashboard.import.import-error" msgstr "Terdapat masalah saat mengimpor berkas. Berkasnya tidak terimpor." @@ -894,6 +904,13 @@ msgstr "" msgid "errors.feature-not-supported" msgstr "Fitur '%s' tidak didukung." +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Sepertinya ada ketidakcocokan antara fitur yang diaktifkan dengan fitur " +"berkas yang sedang Anda buka. Migrasi untuk '%s' harus diterapkan sebelum " +"berkasnya dapat dibuka." + #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -944,6 +961,9 @@ msgstr "Kata sandi konfirmasi harus cocok" msgid "errors.password-too-short" msgstr "Kata sandi setidaknya 8 karakter" +msgid "errors.paste-data-validation" +msgstr "Data tidak valid dalam papan klip" + msgid "errors.profile-blocked" msgstr "Profil diblokir" @@ -957,6 +977,10 @@ msgstr "Profil Anda membisukan surel (laporan spam atau lompatan tinggi)." msgid "errors.registration-disabled" msgstr "Pendaftaran saat ini dinonaktifkan." +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Fitur '%s' tidak kompatibel terdeteksi" + msgid "errors.team-leave.insufficient-members" msgstr "" "Anggota tidak cukup untuk meninggalkan tim, Anda mungkin ingin menghapusnya " @@ -980,6 +1004,13 @@ msgstr "Sebuah kesalahan tidak terduga terjadi." msgid "errors.unexpected-token" msgstr "Token tidak diketahui" +msgid "errors.validation" +msgstr "Kesalahan Validasi" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Berkas memiliki nomor versi tidak kompatibel" + msgid "errors.webhooks.connection" msgstr "Kesalahan koneksi, URL tidak dapat diraih" @@ -1214,6 +1245,9 @@ msgstr "Tidak ada" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "Huruf Judul" +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Tidak ditetapkan" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Huruf Besar" @@ -1615,6 +1649,9 @@ msgstr "Peran" msgid "labels.save" msgstr "Simpan" +msgid "labels.search" +msgstr "Cari" + msgid "labels.search-font" msgstr "Cari fon" @@ -1639,6 +1676,9 @@ msgstr "Layanan Tidak Tersedia" msgid "labels.settings" msgstr "Pengaturan" +msgid "labels.share" +msgstr "Bagikan" + msgid "labels.share-prototype" msgstr "Bagikan prototipe" @@ -1708,10 +1748,34 @@ msgstr "(Anda)" msgid "labels.your-account" msgstr "Akun Anda" +msgid "media.choose-image" +msgstr "Pilih gambar" + +msgid "media.gradient" +msgstr "Gradien" + +msgid "media.image" +msgstr "Gambar" + +msgid "media.linear" +msgstr "Linear" + #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Memuat gambar…" +msgid "media.radial" +msgstr "Radial" + +msgid "media.solid" +msgstr "Padat" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Pustaka Anda saat ini kosong. Ketika ditambahkan sebagai Pustaka Terbagi, " +"aset yang Anda buat akan tersedia untuk digunakan bersama dengan berkas " +"Anda. Apakah Anda yakin ingin menerbitkannya?" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -2240,6 +2304,21 @@ msgstr "Panduan berkontribusi" msgid "onboarding-v2.welcome.title" msgstr "Selamat datang di Penpot!" +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Lanjutkan membuat tim" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Lanjutkan tanpa tim" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Buat tim & undang" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Buat tim dan kirim undangan" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Anda nanti akan dapat mengundang" + msgid "onboarding.choice.team-up.create-team-desc" msgstr "" "Setelah memberi nama tim, Anda akan dapat mengundang orang-orang untuk " @@ -2248,6 +2327,12 @@ msgstr "" msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "Masukkan nama tim" +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Buat tim" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Buat tim tanpa mengundang" + msgid "onboarding.choice.team-up.invite-members" msgstr "Undang anggota" @@ -2259,6 +2344,12 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Undang dengan peran:" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Mulai tanpa tim" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Anda nanti akan dapat membuat tim." + msgid "onboarding.newsletter.accept" msgstr "Ya, berlangganan" @@ -2475,6 +2566,10 @@ msgstr "" "Masukan Anda akan membantu kami mengerti kebiasaan dan preferensi Anda " "supaya kami dapat membuat Penpot sebuah alat yang berguna dan nyaman." +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Copot" + #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, @@ -2931,6 +3026,9 @@ msgstr "Tampilkan/sembunyikan penggaris" msgid "shortcuts.toggle-textpalette" msgstr "Alih palet teks" +msgid "shortcuts.toggle-theme" +msgstr "Ubah tema" + msgid "shortcuts.toggle-visibility" msgstr "Alih keterlihatan" @@ -3265,6 +3363,45 @@ msgstr "Transformasi Teks" msgid "workspace.assets.ungroup" msgstr "Lepas kelompok" +msgid "workspace.context-menu.grid-cells.area" +msgstr "Buat area" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Buat papan" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Gabungkan sel" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Tambah 1 kolom ke kanan" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Tambah 1 kolom ke kiri" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Hapus kolom" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Hapus kolom dan bentuk" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Gandakan kolom" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Tambah 1 baris di bawah" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Tambah 1 baris di atas" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Hapus baris" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Hapus baris dan bentuk" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Gandakan baris" + msgid "workspace.focus.focus-mode" msgstr "Mode fokus" @@ -3388,6 +3525,12 @@ msgstr "Tampilkan penggaris" msgid "workspace.header.menu.show-textpalette" msgstr "Tampilkan palet fon" +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Ubah ke tema gelap" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "Ubah ke tema terang" + msgid "workspace.header.menu.undo" msgstr "Urungkan" @@ -3439,9 +3582,21 @@ msgstr "Layar penuh" msgid "workspace.header.zoom-selected" msgstr "Zum ke terpilih" +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Sunting kisi" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Keluar" + msgid "workspace.layout_grid.editor.title" msgstr "Kisi penyuntingan" +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Selesai" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Cari lokasi" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Tambahkan" @@ -3512,6 +3667,10 @@ msgstr "PUSTAKA" msgid "workspace.libraries.library-updates" msgstr "PEMBARUAN PUSTAKA" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Memuat…" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "Tidak ada Pustaka Terbagi yang membutuhkan pembaruan" @@ -3586,12 +3745,24 @@ msgstr "Komponen" msgid "workspace.options.component.annotation" msgstr "Anotasi" +msgid "workspace.options.component.copy" +msgstr "Salin" + msgid "workspace.options.component.create-annotation" msgstr "Buat anotasi" msgid "workspace.options.component.edit-annotation" msgstr "Sunting anotasi" +msgid "workspace.options.component.main" +msgstr "Utama" + +msgid "workspace.options.component.swap" +msgstr "Ganti komponen" + +msgid "workspace.options.component.swap.empty" +msgstr "Belum ada aset dalam pustaka ini" + #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Pasangan" @@ -3684,6 +3855,10 @@ msgstr "Isian" msgid "workspace.options.flows.add-flow-start" msgstr "Tambahkan awalan alur" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Alur" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "Awalan alur" @@ -3787,6 +3962,9 @@ msgstr "Isian kelompok" msgid "workspace.options.group-stroke" msgstr "Sapuan kelompok" +msgid "workspace.options.guides.title" +msgstr "Panduan" + msgid "workspace.options.height" msgstr "Tinggi" @@ -4333,14 +4511,26 @@ msgstr "Sapuan" msgid "workspace.options.stroke-cap.circle-marker" msgstr "Penanda lingkaran" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Lingkaran" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "Penanda berlian" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Berlian" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "Panah garis" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Tanda panah" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "Tidak ada" @@ -4357,10 +4547,18 @@ msgstr "Kotak" msgid "workspace.options.stroke-cap.square-marker" msgstr "Penanda kotak" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Persegi panjang" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "Panah segi tiga" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Segitiga" + msgid "workspace.options.stroke-color" msgstr "Warna sapuan" @@ -4831,6 +5029,13 @@ msgstr "Teks (%s)" msgid "workspace.toolbar.text-palette" msgstr "Tipografi (%s)" +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**Mode inspeksi** (Hanya Tampilan)" + +msgid "workspace.top-bar.read-only.done" +msgstr "Selesai" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Tidak ada riwayat perubahan sejauh ini" @@ -4964,39 +5169,3 @@ msgstr "Perbarui" msgid "workspace.viewport.click-to-close-path" msgstr "Klik untuk menutup jalur" - -msgid "workspace.options.component.copy" -msgstr "Salin" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Persegi panjang" - -msgid "workspace.options.component.main" -msgstr "Utama" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Berlian" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Copot" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Segitiga" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Tanda panah" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Pustaka Anda saat ini kosong. Ketika ditambahkan sebagai Pustaka Terbagi, " -"aset yang Anda buat akan tersedia untuk digunakan bersama dengan berkas " -"Anda. Apakah Anda yakin ingin menerbitkannya?" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Lingkaran" diff --git a/frontend/translations/ig.po b/frontend/translations/ig.po new file mode 100644 index 000000000..79a03c878 --- /dev/null +++ b/frontend/translations/ig.po @@ -0,0 +1,2098 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2024-02-14 08:02+0000\n" +"Last-Translator: Alejandro Alonso \n" +"Language-Team: Igbo " +"\n" +"Language: ig\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.4-dev\n" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.check-your-email" +msgstr "Nyoo ozi- n gị ma pịa na njikọ inyocha ma bido jiri ite mkpịsị rụwa ọrụ ." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.confirm-password" +msgstr "kpebie akara mpibanye" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-account" +msgstr "mebeta akara ozigosi" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-profile" +msgstr "Chọọ nọọ ị nwa ya. ?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.demo-warning" +msgstr "" +"Ihe bụ ọrụ ozigosi ,e jile ya rụọ ezigbo ọrụ , ọrụ ndị a ga-ekpochapụ site " +"na oge ruo na oge" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.email" +msgstr "Ozi- n" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.forgot-password" +msgstr "Chefuru akara mpibanye ?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.fullname" +msgstr "Aha n'uju" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.login-here" +msgstr "Banye ebe a" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-submit" +msgstr "Banye" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-title" +msgstr "Ihe ịtụnanya ịhụ gị !" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-github-submit" +msgstr "Obi Git" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-gitlab-submit" +msgstr "Ụlọ nchọcha Git" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-google-submit" +msgstr "Gọgụlụ" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-ldap-submit" +msgstr "LDAP" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-oidc-submit" +msgstr "Mepe ID" + +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "Aha ga-enweriri ụfọdụ mkpụrụ edemede karịa oghere ." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "Aha ga-enweriri ọ karịa mkpụrụ okwu narị abụọ na iri ise" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.new-password" +msgstr "Pinye akara mpịbanye ọhụrụ" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.invalid-token-error" +msgstr "Ọdịmara e nweghachitere adabaghị ." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.password-changed-successfully" +msgstr "Akara mpịbanye a gbanwere gara aga" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.profile-not-verified" +msgstr "E nyochaghị nchịkọta , Biko nyocha nchịkọta tupu ị gaa n'ihu." + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.recovery-token-sent" +msgstr "E zigara akara njikọ nnweghachi akara mpibanye n'igbe mbata ozi gị ." + +#: src/app/main/ui/auth/verify_token.cljs +msgid "auth.notifications.team-invitation-accepted" +msgstr "Sonyere n'otu nke ọma" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-length-hint" +msgstr "Ọ karịa mkpụrụ ederede asatọ" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "Akara mpịbanye ga-enweriri ụfọdụ leta/akara mpị karịa oghere ." + +msgid "auth.privacy-policy" +msgstr "Iwu oñiño onwe" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-submit" +msgstr "Nweghachite akara mpịbanye" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-subtitle" +msgstr "Anyị ga-ezita ozi n na ndụmọdụ" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-title" +msgstr "Chefuru akara mpịbanye ?" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.recovery-submit" +msgstr "Gbanye akara mpịbanye." + +#: src/app/main/ui/auth/login.cljs +msgid "auth.register" +msgstr "E nweghị ebe Ntinye ihe ma kịta?" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.register-submit" +msgstr "Mepee ebe Ntinye ihe" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-subtitle" +msgstr "Ọ bụ n'efu , ọ bụ ebe nsị a jere oje" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-title" +msgstr "Mepee ebe ntinye ihe" + +#: src/app/main/ui/auth.cljs +msgid "auth.sidebar-tagline" +msgstr "Nsina ghere oghe iji mee nse na atụtụ" + +msgid "auth.terms-of-service" +msgstr "Ọnọdụ ọrụ" + +msgid "auth.terms-privacy-agreement" +msgstr "" +"Mgbe Ị na-emepe akara mbata ọhụrụ , ị ga-ekwe nye n'ọnọdụ ọrụ anyị na iwu " +"oñiño onwe" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.verification-email-sent" +msgstr "Anyị ezigaala ozi nnyocha na" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...onyinye aha, nkọwa gasị, ngwa ire ahịa dịrị gabazịa." + +msgid "common.publish" +msgstr "bipụta" + +msgid "common.share-link.all-users" +msgstr "Ndị niile ji ite mkpịsị arụ ọrụ" + +msgid "common.share-link.current-tag" +msgstr "(kee ugbu a )" + +msgid "common.share-link.destroy-link" +msgstr "Mebie njiko" + +msgid "common.share-link.get-link" +msgstr "Weta njiko" + +msgid "common.share-link.link-copied-success" +msgstr "E setere njiko nke ọma" + +msgid "common.share-link.manage-ops" +msgstr "Jikwa ikike" + +msgid "common.share-link.permissions-can-comment" +msgstr "nwere ike ikwu okwu" + +msgid "common.share-link.permissions-can-inspect" +msgstr "Nwere Ike inyocha akara" + +msgid "common.share-link.permissions-hint" +msgstr "Onye ọ bụla ga-enwe ohere mbanye" + +msgid "common.share-link.permissions-pages" +msgstr "Ihu akwụkwọ ekekoritara" + +msgid "common.share-link.placeholder" +msgstr "Njikọ e nwere ike ikekorita ga-apụta" + +msgid "common.share-link.team-members" +msgstr "Sọọsọ ndị otu" + +msgid "common.share-link.title" +msgstr "Kee atụ gasị" + +msgid "common.unpublish" +msgstr "Ebiputaghị" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.text" +msgstr "" +"Ite mkpịsị bụ maka otu . Kpọọ ndị otu ka arụkọta ọnụ on arụmarụ na ederede " +"ọnụ" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.title" +msgstr "Jikota ọnụ !" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.info" +msgstr "Mụọ ntọala na ite mkpịsị maka iji nkuzi mmemmekwa eme ihe egwu" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.start" +msgstr "Bido ọmụmụ" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.title" +msgstr "Nkuzi mmemmekwa" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.info" +msgstr "Mee ngagharị na ite mkpịsị ma mata isi a gwara ya." + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.start" +msgstr "Bido njem" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.title" +msgstr "Aba ngagharị" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "Mepụta ọdịmara ọhụrụ" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "Mmepụtara ọdịmara nnweta gara nke ọma ." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "Pịa mpi \"Nweta ọdịmara ọhụrụ \" inweta otu ." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "A chọrọ aha" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "Mkpụrụ ụbọchị narị na iri asatọ" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "Mkpụrụ ụbọchị iri atọ" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "Mkpụrụ ụbọchị iri isii" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "Mkpụrụ ụbọchị iri itoolu" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "Ncha ncha" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "Mebiri na%s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "Na-emebi na%s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.no-expiration" +msgstr "Enweghị ụbọchị mmebi" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "Ọdịmara nkeonwe" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"Ọdịmara nnweta nke onwe na-arụ ọrụ dị ka mgbamonwe mbanye anyị /akara " +"mpịbanye e nwere ike iji usoro mbinye aka kwe ka ngwa nweta ndịnime ite " +"mkpịsị API" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "Ọdịmara ga-emebi na%s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "Ọdịmara enweghị ụbọchị mmebi" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.add-shared" +msgstr "Tinye dị ka ọ a nkwekọrịta" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.change-email" +msgstr "Gbanwee ozi - n" + +#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs +msgid "dashboard.copy-suffix" +msgstr "(sere)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.create-new-team" +msgstr "Mebe otu ọhụrụ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.default-team-name" +msgstr "Ite mkpịsị gị" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.delete-team" +msgstr "kacha otu" + +msgid "dashboard.download-binary-file" +msgstr "Butuo ederede ite mkpịsị (.penpot)" + +msgid "dashboard.download-standard-file" +msgstr "Butuo ederede tozuru etozu (.svg + .json)" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate" +msgstr "mee oyiri" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate-multi" +msgstr "Mee o yiri %s ederede" + +#: src/app/main/ui/dashboard/grid.cljs +#, markdown +msgid "dashboard.empty-placeholder-drafts" +msgstr "" +"Ederede a tinyere n'ọba ederede ga-apụta ebe a. Gbalịa ikesa ma ọ bụ tinye " +"site n'[Ọba ederede na ndebiri anyị ](https://itemkpịsị.app/ọba ederede " +"gasị-ndebiri gasị.html)." + +msgid "dashboard.export-binary-multi" +msgstr "Butuo %s ederede ite mkpịsị (.penpot)" + +msgid "dashboard.export-frames" +msgstr "Bupu bọọdụ dị ka PDF" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-frames.title" +msgstr "Bupu dị ka PDF" + +msgid "dashboard.export-multi" +msgstr "Bupu %s ederede Ite mkpịsị" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-multiple.selected" +msgstr "A họrọ %s nke %s ndị na" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to" +msgstr "" +"Ị nwere ike ị tinye ntọala mbupu na ndịna site na ngwongwo nse (n'ala akụkụ " +"aka nri ihe ndepụta)" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to-link" +msgstr "Ozi etu esi ahazi mbupu n'ite mkpịsị" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.no-elements" +msgstr "E nweghị ndịna ọ bụla na ntọala mbupu" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.title" +msgstr "Nhọrọ mbupu" + +msgid "dashboard.export-standard-multi" +msgstr "Buto %s ederede tozuru etozu (.svg + .json)" + +msgid "dashboard.export.detail" +msgstr "* Nwere Ike ịgụnye ngwa , esereese gasị, agwụgwara na/ma ọ bụ akara nkụpụta." + +msgid "dashboard.export.options.all.message" +msgstr "" +"A ga-atinye ederede nwere ọba ederede nkekọrịta ma gụnyere mbupu , ma " +"jidekwa ụkpụrụ njikọ ha" + +msgid "dashboard.export.options.all.title" +msgstr "Bupu ọba ederede nkekọrịta" + +msgid "dashboard.export.options.detach.message" +msgstr "" +"Agaghị a tinye ọba ederede nkekọrịta na mbupu ma o nweghị ihe nnwe a ga a " +"tinye ọ a ederede . " + +msgid "dashboard.export.options.merge.title" +msgstr "Tinye ihe nnwe ọba ederede nkekọrịta n'ime ọ a ederede." + +msgid "dashboard.export.title" +msgstr "Ederede mbupu gasị" + +msgid "dashboard.fonts.deleted-placeholder" +msgstr "Mkpụrụ edemede na-efu efu" + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.dismiss-all" +msgstr "Gbasaa ha niile" + +msgid "dashboard.fonts.empty-placeholder" +msgstr "Mkpụrụ edemede ndị ị bugoro ga-apụta ebe." + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.upload-all" +msgstr "Bugo ha niile" + +#, markdown +msgid "dashboard.fonts.warning-text" +msgstr "" +"Anyị chọpụtara nsogbu nwere ike ịpụta na mkpụrụ edide gị gbasara ntụ kwụ " +"ọtọ " + +msgid "dashboard.import.analyze-error" +msgstr "Ewuu! Anyị enweghị ike bubata ederede a" + +msgid "dashboard.import.import-error" +msgstr "E nwere nsogbu na ibubata ederede . E bubataghị ederede ." + +msgid "dashboard.import.import-warning" +msgstr "Ụfọdụ ederede nwere ihe ndị adabaghị na ya nke ewepugoro. ." + +msgid "dashboard.import.progress.process-colors" +msgstr "Nhazi agwụgwara gasị" + +msgid "dashboard.import.progress.process-components" +msgstr "Nhazi ngwa gasị" + +msgid "dashboard.import.progress.process-media" +msgstr "Nhazi mgbasa ozi" + +msgid "dashboard.import.progress.process-page" +msgstr "Nhazi ihu akwụkwọ : %s" + +msgid "dashboard.import.progress.process-typographies" +msgstr "Nhazi akara nkụpụta" + +msgid "dashboard.import.progress.upload-data" +msgstr "Ibugo njatụle n'ebe nkesa (%s/%s)" + +msgid "dashboard.import.progress.upload-media" +msgstr "Ibugo ederede : %s" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.invite-profile" +msgstr "Kpọta mmadụ" + +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.leave-team" +msgstr "Hapụ otu" + +msgid "dashboard.libraries-and-templates" +msgstr "Ọba ederede gasị & ndebiri" + +msgid "dashboard.libraries-and-templates.explore" +msgstr "Nyocha ọtụtụ n'ime ha ma mara etu ị ga-esi tinye ọnụ" + +msgid "dashboard.libraries-and-templates.import-error" +msgstr "E nwere nsogbu ibu aba ndebiri . E bubataghị ndebiri." + +#: src/app/main/ui/dashboard/libraries.cljs +msgid "dashboard.libraries-title" +msgstr "Ọba ederede gasị" + +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.loading-files" +msgstr "Mbụbata ederede gị …" + +msgid "dashboard.loading-fonts" +msgstr "mbubata mkpụrụ edemede gị …" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to" +msgstr "Ga na" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-multi" +msgstr "Buga %s ederede gasị na" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-other-team" +msgstr "Gaa n'otu ọzọ" + +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/files.cljs +msgid "dashboard.new-file" +msgstr "+ Ederede ọhụrụ" + +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-file-prefix" +msgstr "Ederede ọhụrụ" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.new-project" +msgstr "+ Nchọcha ọhụrụ" + +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-project-prefix" +msgstr "Arụmarụ ọhụrụ" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.no-matches-for" +msgstr "Ọ nweghị ihe ndabara e nwetara maka “%s“" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.no-projects-placeholder" +msgstr "Arụmarụ a kụdoro ga-apụta ebe a" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-changed-successfully" +msgstr "Adreesị ozi - n gị ahazigharịala gara nke ọma" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-verified-successfully" +msgstr "E nyochala adreesị ozi - n gị nke ọma" + +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.notifications.password-saved" +msgstr "E dọkwara akara mpịbanye nke ọma !" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.num-of-members" +msgstr "%s Ndị otu" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.open-in-new-tab" +msgstr "Mepe ederede na tabụ ọhụrụ" + +msgid "dashboard.options" +msgstr "Nhọrọ gasị" + +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.password-change" +msgstr "Gbanwee akara mpịbanye" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.pin-unpin" +msgstr "Nọmba /Wepụ nọmba" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.projects-title" +msgstr "Arụmarụ" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.remove-account" +msgstr "Chọọ iwepu ebe Ntinye ihe gị ?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.remove-shared" +msgstr "Wepụ dị ka ọba ederede nkekọrịta" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.save-settings" +msgstr "Dokwa ntọala" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.search-placeholder" +msgstr "Chọọ…" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.searching-for" +msgstr "Na-achọ “%s“…" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-language" +msgstr "Họrọ asụsụ UI" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-duplicate-project" +msgstr "E megharịala arụmarụ gị nke ọma\"" + +#: src/app/main/ui/dashboard/grid.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-file" +msgstr "E wepula ederede gị nke ọma\"" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-move-project" +msgstr "E bupula arụmarụ gị nke ọma" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-info" +msgstr "Ozi otu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-members" +msgstr "Ndị otu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-projects" +msgstr "Arụmarụ otu" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.theme-change" +msgstr "Isiokwu UI" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.title-search" +msgstr "Chọọ risọltụ gasị" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.type-something" +msgstr "Pinye ịchọ risọltụ" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.unpublish-shared" +msgstr "Ọba ederede ebiputaghị" + +#: src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs +msgid "dashboard.update-settings" +msgstr "Hazie ntọala" + +msgid "dashboard.webhooks.active" +msgstr "Dị gara gara" + +msgid "dashboard.webhooks.active.explain" +msgstr "Mgbe a kpọlitere nkọ a, ọ ga-Ezipụta nkọwa emume n'uju" + +msgid "dashboard.webhooks.content-type" +msgstr "Ụdị ndịna" + +msgid "dashboard.webhooks.create" +msgstr "Mepe nko - ududọ" + +msgid "dashboard.webhooks.create.success" +msgstr "E mepere nko-ududọ nke ọma ." + +msgid "dashboard.webhooks.description" +msgstr "" +"Nko-ududọ bụ ụzọ dị mfe ga-ekwe ka ebe ududọ na apps ndị ọzọ nweta ozi Mgbe " +"ụfọdụ emume na eme n'ite mkpịsị . Anyị ga e ziga OZI arịrịọ nwe URLs ọ bụla " +"ị nwetara" + +msgid "dashboard.webhooks.empty.add-one" +msgstr "Pịa mpị \"Tinye nko-ududọ \" ịtinye otu ." + +msgid "dashboard.webhooks.empty.no-webhooks" +msgstr "E nweghị Nko-ududọ e ebere ruo ugbu a ." + +msgid "dashboard.webhooks.update.success" +msgstr "Ahazigharịrị nko-ududọ nke ọma ." + +#: src/app/main/ui/settings.cljs +msgid "dashboard.your-account-title" +msgstr "Ebe Ntinye ihe gị" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-email" +msgstr "Ozi-n" + +#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.your-penpot" +msgstr "Ite mkpịsị. gị" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-ok" +msgstr "Okay" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-title" +msgstr "Gee ntị" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-cancel" +msgstr "Kagbuo" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-ok" +msgstr "Okay" + +#: src/app/main/ui/confirm.cljs, src/app/main/ui/confirm.cljs +msgid "ds.confirm-title" +msgstr "Ọ doro gị anya ?" + +msgid "errors.auth.unable-to-login" +msgstr "Ọ dị ka enyochaghị gị ma ọ bụ na oge agwụla ." + +msgid "errors.bad-font" +msgstr "E nweghị ike bugo %s mkpụrụ edide" + +msgid "errors.bad-font-plural" +msgstr "E nweghị ike bugo %s mkpụrụ edide" + +msgid "errors.cannot-upload" +msgstr "E nweghị ike ị ugo ederede ." + +#: src/app/main/data/workspace.cljs +msgid "errors.clipboard-not-implemented" +msgstr "Your browser cannot do this operation" + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs +msgid "errors.email-already-exists" +msgstr "E jibuola ozi - n rụọ ọrụ" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.email-already-validated" +msgstr "Aha ozi-n adabala." + +msgid "errors.email-as-password" +msgstr "Ị nweghị ike iji aha ozi-n gị dị ka akara mpịbanye" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.email-has-permanent-bounces" +msgstr "Ozi-n «%s» nwere ọtụtụ ozi nkọwa mbịaghachigide." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs +msgid "errors.email-invalid" +msgstr "Debanye aha ozi-n dabara adaba" + +#: src/app/main/ui/settings/change_email.cljs +msgid "errors.email-invalid-confirmation" +msgstr "Ozi-n nnabata ga-adabrịrị" + +msgid "errors.email-spam-or-permanent-bounces" +msgstr "E nwela ozi nkọwa na ozi-n«%s» dị ka ozi abaghị uru ma ọ bụ mbịaghachigide." + +#: src/app/main/errors.cljs +msgid "errors.feature-mismatch" +msgstr "" +"Ọ dị ka ị na-emepe ederede nwere a gwara naọ gara aga '%s' mana ihu " +"itemkpịsị gị akwadoghị ya ma ọ bụ gosiri ọ gaghị aga." + +#: src/app/main/errors.cljs +msgid "errors.feature-not-supported" +msgstr "Akwadoghị agwara '%s' ." + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.generic" +msgstr "Ihe ezighị ezi emela ." + +#: src/app/main/ui/components/color_input.cljs +msgid "errors.invalid-color" +msgstr "Agwụgwara adabaghị" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.invite-invalid" +msgstr "kpọọ òkù adabaghị" + +msgid "errors.invite-invalid.info" +msgstr "This invite might be canceled or may be expired." + +#: src/app/main/ui/auth/login.cljs +msgid "errors.ldap-disabled" +msgstr "LDAP mbinye aka agaghị ." + +#: src/app/main/errors.cljs +msgid "errors.max-quote-reached" +msgstr "I ruola '%s' ole a chọrọ . Chọọ enyemaka nkwado ." + +#: src/app/main/data/workspace/persistence.cljs +msgid "errors.media-too-large" +msgstr "Onyinyo a ebuka ibu maka itinye ." + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "errors.media-type-mismatch" +msgstr "Dị ka ihe dị na onyinyo adabaghị na mgbatị ederede." + +#: src/app/main/ui/dashboard/team.cljs +msgid "errors.member-is-muted" +msgstr "" +"Nchịkọta gị nwere ozi-n mechiri emechi (akụkọ ozi-n adịghị mma ma ọ bụ " +"nwere oké bịaghachiri )." + +msgid "errors.profile-blocked" +msgstr "A gbachiri nchịkọta agbachi" + +#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.profile-is-muted" +msgstr "" +"Nchịkọta gị lnwere ozi-n mechiri emechi(akụkọ ozi-n adịghị mma ma ọ bụ " +"nwere oké bịaghachiri ).\")." + +#: src/app/main/ui/auth/register.cljs +msgid "errors.registration-disabled" +msgstr "Ndebanye merụrụ emerụ ugbu a." + +msgid "errors.team-leave.insufficient-members" +msgstr "Ndị otu ezughị okè ịhapụ otu, ọ nyere ike na ị chọrọ ihichapụ ya ." + +msgid "errors.team-leave.member-does-not-exists" +msgstr "Onye otu ị na-achọ inye adịghị ." + +msgid "errors.team-leave.owner-cant-leave" +msgstr "O wee enweghị ike ịhapụ otu, ị ga-enyegharịrị ọrụ onwee." + +#: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "errors.unexpected-error" +msgstr "Ndejo atughị anya ya pụtara ." + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.unexpected-token" +msgstr "Ọdịmara amaghị ama" + +msgid "errors.webhooks.connection" +msgstr "Mmejọ, e nwetaghị URL" + +msgid "errors.webhooks.invalid-uri" +msgstr "URL enweghị nkwado ." + +msgid "errors.webhooks.ssl-validation" +msgstr "Mmejọ na nkwado SSL ." + +msgid "errors.webhooks.timeout" +msgstr "Oge ezuola" + +#: src/app/main/ui/auth/login.cljs +msgid "errors.wrong-credentials" +msgstr "Ozi-na ma ọ bụ akara mpịbanye adịghị mma ." + +#: src/app/main/ui/settings/password.cljs +msgid "errors.wrong-old-password" +msgstr "Akara mpịbanye ochie adịghị mma" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.description" +msgstr "Nkọwa" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-go-to" +msgstr "Gaa n'ebe ite mkpịsị" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-subtitle1" +msgstr "" +"Obi dị anyị añụrị ịhụ gị ebea. Ọ bụrụ na enyemaka dị mkpa , biko chọọ tupu " +"ị ịga ozi ." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-title" +msgstr "Ogbe Ite mkpịsị" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subject" +msgstr "Isiokwu" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subtitle" +msgstr "" +"Biko, kọwaa ihe isi ozi-n gị , kwuo ma ọ bụ nsogbu , ncheputara ma ọ bụ " +"ekaenyeghị. Onye otu anyị ga-azaghachi ozugbo ọ nwere ike ." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.title" +msgstr "Ozi- n" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-go-to" +msgstr "Gaa na Twita" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-subtitle1" +msgstr "Ebe inyere gị aka n'ajụjụ nkà gị ." + +#: src/app/main/ui/settings/password.cljs +msgid "generic.error" +msgstr "Mmehie apụtala" + +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur" +msgstr "Inyogo" + +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur.value" +msgstr "Uru" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hex" +msgstr "HEX" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hsla" +msgstr "HSLA" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.rgba" +msgstr "RGBA" + +#: src/app/main/ui/inspect/attributes/fill.cljs +msgid "inspect.attributes.fill" +msgstr "Wunye" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.download" +msgstr "Butuo onyinyo nsina" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.height" +msgstr "Ogo" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.width" +msgstr "Uhie" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout" +msgstr "Mpụta" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.height" +msgstr "Ogo" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.left" +msgstr "Aka ekpe" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.rotation" +msgstr "Ntụgharị" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.top" +msgstr "Elu" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.width" +msgstr "Uhie" + +#: src/app/main/ui/inspect/attributes/shadow.cljs +msgid "inspect.attributes.shadow" +msgstr "Oninyo" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.size" +msgstr "Nhazi na ọnọdụ" + +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke" +msgstr "Akara" + +#, permanent +msgid "inspect.attributes.stroke.alignment.center" +msgstr "Etiti" + +#, permanent +msgid "inspect.attributes.stroke.alignment.inner" +msgstr "Ime" + +#, permanent +msgid "inspect.attributes.stroke.alignment.outer" +msgstr "Ezi" + +msgid "inspect.attributes.stroke.style.dotted" +msgstr "Atụrụ kpọm kpọm" + +msgid "inspect.attributes.stroke.style.mixed" +msgstr "Gwakọtara" + +msgid "inspect.attributes.stroke.style.none" +msgstr "Ncha ncha" + +msgid "inspect.attributes.stroke.style.solid" +msgstr "Akpụrụka" + +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke.width" +msgstr "Uhie" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography" +msgstr "Akara nkụpụta" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-family" +msgstr "Ezinụlọ mkpụrụ edide" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-size" +msgstr "Nhazi mkpụrụ edide" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.letter-spacing" +msgstr "Ndesa mkpụrụ edemede" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.line-height" +msgstr "Ogo akara" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-decoration" +msgstr "Nkwazi ederede" + +msgid "inspect.attributes.typography.text-decoration.none" +msgstr "Ncha ncha" + +msgid "inspect.attributes.typography.text-decoration.strikethrough" +msgstr "Kụọgafee" + +msgid "inspect.attributes.typography.text-decoration.underline" +msgstr "N'okpuru" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-transform" +msgstr "Mgbanwe ederede" + +msgid "inspect.attributes.typography.text-transform.none" +msgstr "None" + +msgid "inspect.attributes.typography.text-transform.titlecase" +msgstr "Mkpụrụ edemede isiokwu" + +msgid "inspect.attributes.typography.text-transform.uppercase" +msgstr "Mkpụrụ edemede nnukwu" + +msgid "inspect.empty.help" +msgstr "" +"Ị chọọ ị ma ihe ndị ọzọ maka nnyocha esereese, gaa n'ebe enyemaka ite " +"mkpịsị r" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code" +msgstr "Akara" + +msgid "inspect.tabs.code.selected.circle" +msgstr "Okirikiri" + +msgid "inspect.tabs.code.selected.component" +msgstr "Ndịna" + +msgid "inspect.tabs.code.selected.curve" +msgstr "Nrọgọ" + +msgid "inspect.tabs.code.selected.frame" +msgstr "Ogwe." + +msgid "inspect.tabs.code.selected.group" +msgstr "Otu" + +msgid "inspect.tabs.code.selected.image" +msgstr "Onyinyo" + +msgid "inspect.tabs.code.selected.mask" +msgstr "kpuchie" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code.selected.multiple" +msgstr "%s a họrọ" + +msgid "inspect.tabs.code.selected.path" +msgstr "Ụzọ" + +msgid "inspect.tabs.code.selected.rect" +msgstr "Rekụtagụlụ" + +msgid "inspect.tabs.code.selected.svg-raw" +msgstr "SVG" + +msgid "inspect.tabs.code.selected.text" +msgstr "Ederede" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.info" +msgstr "Ozi" + +#: src/app/main/ui/workspace/header.cljs +msgid "label.shortcuts" +msgstr "Ụzọ mkpirisi" + +msgid "labels.accept" +msgstr "Nabata" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "Nweta ọdịmara gasị" + +msgid "labels.active" +msgstr "Gara gara" + +msgid "labels.add-custom-font" +msgstr "Tinye mkpụrụ edide a haziri ahazi" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.admin" +msgstr "Ọchịkwa" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.all" +msgstr "Ha niile" + +msgid "labels.and" +msgstr "na" + +msgid "labels.back" +msgstr "Azụ" + +#: src/app/main/ui/static.cljs +msgid "labels.bad-gateway.main-message" +msgstr "Ajọ ụzọ mbanye" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.cancel" +msgstr "Kagbuo" + +msgid "labels.close" +msgstr "Megbuo" + +#: src/app/main/ui/dashboard/comments.cljs +msgid "labels.comments" +msgstr "Okwu gasị" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.community" +msgstr "Ogbe" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.confirm-password" +msgstr "Nabata akara mpịbanye" + +msgid "labels.continue" +msgstr "Ga n'ihu" + +msgid "labels.continue-with" +msgstr "Gaa n'ihu" + +msgid "labels.continue-with-penpot" +msgstr "I Nwere Ike ịganihu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.copy-invitation-link" +msgstr "Dọrọ njikọ" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "labels.create" +msgstr "Meputa" + +#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team" +msgstr "Mepee otu ọhụrụ" + +msgid "labels.custom-fonts" +msgstr "mkpụrụ edide a haziri" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete" +msgstr "Hichaa" + +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment" +msgstr "Hichaa okwu" + +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment-thread" +msgstr "Hichapụ eri" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.delete-invitation" +msgstr "Hichapụ oku" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete-multi-files" +msgstr "Hichapụ ederede %s" + +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.drafts" +msgstr "Ndesita" + +#: src/app/main/ui/comments.cljs +msgid "labels.edit" +msgstr "Dezie" + +msgid "labels.edit-file" +msgstr "Dezie ederede" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.editor" +msgstr "Odezi" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.expired-invitation" +msgstr "Mebiri" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-disabled" +msgstr "Nzaghachi merụrụ emeru" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-sent" +msgstr "Zigara nzaghachi" + +msgid "labels.font-family" +msgstr "Ezinụlọ mkpụrụ edide" + +msgid "labels.font-providers" +msgstr "Ndị na-enye mkpụrụ edide" + +msgid "labels.font-variants" +msgstr "Ụdịdị gasị" + +msgid "labels.fonts" +msgstr "Mkpụrụ edide gasị" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.github-repo" +msgstr "Ọ a Github" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.give-feedback" +msgstr "Nye nzaghachi" + +msgid "labels.go-back" +msgstr "Gaa azụ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.help-center" +msgstr "Ebe enyemaka" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.hide-resolved-comments" +msgstr "Zoo nkwupụta e kpebiri" + +msgid "labels.inactive" +msgstr "Arụghị ọrụ" + +msgid "labels.installed-fonts" +msgstr "Mkpụrụ edide gasị ewubere" + +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.desc-message" +msgstr "Ihe ọjọọ mere . Biko, rụgharịa ọrụ ma ọ bụ na nsogbu aka dị , kpọọ nkwado ." + +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.main-message" +msgstr "Nrụjọ ndịnime" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.invitations" +msgstr "Akwụkwọ ịkpọ ọkụ gasị" + +#: src/app/main/ui/settings/options.cljs +msgid "labels.language" +msgstr "Asụsụ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.libraries-and-templates" +msgstr "Ọba ederede na Ndebiri gasị" + +msgid "labels.log-or-sign" +msgstr "Banye ma ọ bụ debanye" + +#: src/app/main/ui/settings.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.logout" +msgstr "Pụọ" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.member" +msgstr "Onye otu" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.members" +msgstr "Ndị otu" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.new-password" +msgstr "Akara mpịbanye ọhụrụ" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs +msgid "labels.no-comments-available" +msgstr "E jidere unu niile! Ngosi nkwupụta ọhụrụ ga-apụta ebe a ." + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.no-invitations" +msgstr "E nweghị ọkụ na-echere" + +#: src/app/main/ui/dashboard/team.cljs +#, markdown +msgid "labels.no-invitations-hint" +msgstr "Pịa mpị**kpọọ ndị mmadụ ** ịkpọọ ndị mmadụ n'otu a." + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.desc-message" +msgstr "Ihu akwụkwọ a nwere ike ọ gaghị adị ma ọ bụ ị nweghị ikikere inweta ya ." + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.main-message" +msgstr "E wuu !" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.old-password" +msgstr "Akara mpịbanye ochie" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.only-yours" +msgstr "Sọọsọ nke gị" + +msgid "labels.or" +msgstr "ma ọ bụ" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.owner" +msgstr "Onye nwe" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.password" +msgstr "Akara mpịbanye" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.pending-invitation" +msgstr "Na-echere" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.profile" +msgstr "Nchịkọta" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.projects" +msgstr "Ọrụ gasị" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.release-notes" +msgstr "Wepụta ndetu" + +#: src/app/main/ui/workspace.cljs +msgid "labels.reload-file" +msgstr "Bugharịa ederede" + +#: src/app/main/ui/workspace/libraries.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.remove" +msgstr "Wepu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.remove-member" +msgstr "Wepụ onye otu" + +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.rename" +msgstr "Nyegharịa aha" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.rename-team" +msgstr "Nyegharịa otu" + +#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs +msgid "labels.retry" +msgstr "Nwagharịa" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.role" +msgstr "Ọrụ" + +msgid "labels.save" +msgstr "Dokwa" + +msgid "labels.search-font" +msgstr "Chọọ mkpụrụ edide" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.send" +msgstr "Ziga" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.sending" +msgstr "Na-eziga…" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.settings" +msgstr "Ntọala" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.shared-libraries" +msgstr "Ọba ederede" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-all-comments" +msgstr "Gosi nkwupụta niile" + +msgid "labels.show-comments-list" +msgstr "Gosi ndepụta nkwupụta gasị" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-your-comments" +msgstr "Gosi nanị nkwupụta gị gasị" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.status" +msgstr "Ọnọdụ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.tutorials" +msgstr "Nkuzi" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.unpublish-multi-files" +msgstr "%s ederede ebipụtaghị" + +#: src/app/main/ui/settings/profile.cljs +msgid "labels.update" +msgstr "Hazigharịa" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.update-team" +msgstr "Hazigharịa otu" + +msgid "labels.upload" +msgstr "Bugo" + +msgid "labels.upload-custom-fonts" +msgstr "Bugo ederede gasị ahaziri" + +msgid "labels.uploading" +msgstr "Na-ebugo…" + +msgid "labels.view-only" +msgstr "Sọọsọ nkiri" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.viewer" +msgstr "Ndị nkiri" + +msgid "labels.webhooks" +msgstr "Nko-ududọ" + +#: src/app/main/ui/comments.cljs +msgid "labels.write-new-comment" +msgstr "Dee nkwupụta ọhụrụ" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.you" +msgstr "(gị)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.your-account" +msgstr "Akara mbata gị" + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "media.loading" +msgstr "Na-ebupụta onyinyo …" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"E nweghị ihe dị n'ọba ederede gị. \"Ozugbo e tinyere dị ka ọba ederede " +"ekekoritara, ngwongwo ị mepere ga a dị maka iji ya rụọ ọrụ n'edemede gị ndị " +"ọzọ niile. Ọ kara gị obi na ị chọrọ ị bipụta ya?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.accept" +msgstr "Tinye ka ọba ederede Kekoritara" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.hint" +msgstr "" +".Ozugbo e tinyere dị ka ọba ederede ekekoritara, ngwongwo ị mepere ga a dị " +"maka iji ya rụọ ọrụ n'edemede gị ndị ọzọ niile." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.message" +msgstr "Tinye “%s” dị ka ọba ederede ekekoritara" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.big-nudge" +msgstr "nnukwu nkpatụ" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.submit" +msgstr "Gbanwee ozi nl" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.expiration-date.label" +msgstr "Ụbọchị mmebi" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "Aha" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "Create token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "Mepụta ọdịmara nweta" + +msgid "modals.create-webhook.submit-label" +msgstr "Mebe nko - ududo" + +msgid "modals.create-webhook.title" +msgstr "Mebe nko-ududo" + +msgid "modals.create-webhook.url.label" +msgstr "Isi ozi URL" + +msgid "modals.create-webhook.url.placeholder" +msgstr "https://ọmụmaaụ.com/ozi anabara" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "Hichapụ ọdịmara" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "Hichapụ ọdịmara" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.cancel" +msgstr "Kagbuo ma dobe ebe ntinye ihe m" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.confirm" +msgstr "Eee, hichapụ ebe ntinye ihe m" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.info" +msgstr "" +"Site na iwepu ebe ntinye ihe gị, arụmarụ gị gasị ugbu a naebe nchekwa " +"ga-efu ." + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.title" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ ebe ntinye ihe gị?" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.accept" +msgstr "Hichapụ mkparịtaụka" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.message" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ mkparịtaụka a?" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.title" +msgstr "Hichaa mkparịtaụka" + +msgid "modals.delete-component-annotation.message" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ nkọwa ?" + +msgid "modals.delete-component-annotation.title" +msgstr "Hichapụ nkọwa" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.accept" +msgstr "Hichapụ ederede" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.message" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ ederede ?" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.title" +msgstr "Na-ehichapụ ederede" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.title" +msgstr "Na-ehichapụ ederede %s" + +msgid "modals.delete-font.title" +msgstr "Na-ehichapụ mkpụrụ edide" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.body" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ ihu akwụkwọ a?" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.title" +msgstr "Hichapụ ihu akwụkwọ" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.accept" +msgstr "Hichapụ arụmarụ" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.message" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ arụmarụ ?" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.title" +msgstr "Hichapụ arụmarụ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.accept" +msgstr "Hichapụ otu" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.message" +msgstr "" +"Ọ kara gị obi na ị chọrọ ị hichapụ otu? ARỤMARỤ na ederede nille gasị " +"gbasara otú ga-ehichapụ kpam kpam" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.title" +msgstr "Na-ehichapụ otu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.accept" +msgstr "Hichapụ onye otu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.message" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ onye otu n'otu a?" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.title" +msgstr "Hichapụ onye otu" + +msgid "modals.delete-webhook.accept" +msgstr "Hichapụ nko-ududọ" + +msgid "modals.delete-webhook.message" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ nko-ududọ ?" + +msgid "modals.delete-webhook.title" +msgstr "Na-ehichapụ nko-ududo" + +msgid "modals.edit-webhook.submit-label" +msgstr "Dezie nko-ududo" + +msgid "modals.edit-webhook.title" +msgstr "Dezie nko-ududo" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-member-confirm.accept" +msgstr "Ziga akwụkwọ ozi mkpọta" + +msgid "modals.invite-member.emails" +msgstr "Ozi-n gasị, Rịkọm e kewara" + +msgid "modals.invite-member.repeated-invitation" +msgstr "Ụfọdụ ozi n sitere na ndị ugbu a A gaghị e ịga akwụkwọ ozi mkpọta ha" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-team-member.title" +msgstr "kpọta ndị otu n'otu a" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.hint" +msgstr "" +"Etu ị bụ sọọ otu onye otu , a ga e hichapụ otu a ya n'ọrụ na ederede ya " +"gasịits projects and files." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.message" +msgstr "Ọ kara gị obi na ị chọrọ ịhapụ otu %s ?" + +msgid "modals.leave-and-reassign.forbidden" +msgstr "" +"I nweghị ike ịhapụ otu ma ọ bụrụ na e nweghị onye otu ọzọ akwalitere ga na " +"onye nwe ya . Ị nwere ike chọọ ị hichapụ otu ." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.hint1" +msgstr "" +"Gị bụ onye nwee otu a, . Biko, họrọ onye otu ọzọ maka ịkwalite gana onye " +"nweeya tupu ị hapụ ." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.promote-and-leave" +msgstr "Kwalite ma hapụ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.select-member-to-promote" +msgstr "Họrọ onye otu maka ịkwalite" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.title" +msgstr "Tupu ị hapụ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.accept" +msgstr "Hapụ otu" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.message" +msgstr "Ọ kara gị obi na ịchọrọ ịhapụ otu ?" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.title" +msgstr "Nhapụ otu" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.nudge-title" +msgstr "ọnụ ọgụgụ nkpatụ" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.hint" +msgstr "" +"Ọ bụrụ na Inyefe onwunwe , ị ga-agbanwe ọrụ gị ka ọchikwa, ụfọdụ ikikere " +"n'isi ndị otu na-efu " + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.message" +msgstr "" +"G bụ onye nwe otu a ugbu a, Ọ doro gị anya na ị chọrọ ime%s Onye ọhụrụ nwe " +"otu a?" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.title" +msgstr "Onye nwe otu ọhụrụ" + +msgid "modals.publish-empty-library.accept" +msgstr "Biputa" + +msgid "modals.publish-empty-library.message" +msgstr "Your library is empty. Are you sure you want to publish it?" + +msgid "modals.publish-empty-library.title" +msgstr "Biputa ọba ederede efu" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.accept" +msgstr "Wepụ dịka ọba ederede ekekoritara" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.hint" +msgstr "" +"Ozugbo e wepụrụ dị ka ọba ederede ekekoritara, ọba ederede ederede a " +"ga-akwụsị dị n'ime ederede ndị ọzọ gasị e ji rụọ ọrụ" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.message" +msgstr "Wepu“%s” dịka ọba ederede ekekoritara" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.small-nudge" +msgstr "kpatụ obere" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.hint" +msgstr "" +"Ị na-achọ ịhazigharị ngwa gasị n'ọba ederede ekekoritara. Ihe nwere ike " +"imetuta ederede ndị ọzọ ji ya arụ ọrụ" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.message" +msgstr "Update components in a shared library" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.accept" +msgstr "Hazigharịa" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.cancel" +msgstr "Kagbuo" + +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "A new version is available, please refresh the page" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "notifications.profile-deletion-not-allowed" +msgstr "I nweghị ike ị hichapụ nchịkọta gị . Nyegharịa ya ndị otu gị tupu ị ganihu" + +#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs +msgid "notifications.profile-saved" +msgstr "E dọkwara nchịkọta nke ọma" + +#: src/app/main/ui/settings/change_email.cljs +msgid "notifications.validation-email-sent" +msgstr "Ozi nnyocha n zigara na%s. Mepe ozi n gị !" + +msgid "onboarding-v2.before-start.desc1" +msgstr "" +"I kwesịrị ịma na e nwere ọtụtụ ihe e ji arụ ọrụ dị inwere gị iji bido n'ite " +"mkpịsị , dị ka ntuziaka onye ọrụ na ọwa YouTube anyị l." + +msgid "onboarding-v2.before-start.desc2" +msgstr "" +"Ozi banyere etu esi eji ite mkpịsị arụ ọrụ uju. Site na ime atụtụ ga na " +"nhazi ma ọ bụ nkesa esereese ." + +msgid "onboarding-v2.before-start.desc2.title" +msgstr "Mkpanaka" + +msgid "onboarding-v2.before-start.desc3" +msgstr "Ị nwere ike ikiri amụmamụ anyị na amụmamụ nke ndị obodo anyị mere." + +msgid "onboarding-v2.before-start.desc3.title" +msgstr "Amụmamụ onyonyo" + +msgid "onboarding-v2.before-start.title" +msgstr "Tupu i bido" + +msgid "onboarding-v2.newsletter.desc" +msgstr "" +"Debanye aha n'akụkụ ozi ite mkpịsị iji nọrọ gam gam na ngwa ahịa aaga n'ihu " +"mwulite na akụkọ ụwa." + +msgid "onboarding-v2.newsletter.news" +msgstr "" +"Zitere m akụkọ banyere ite mkpịsị (ozi edemonye gasị, Nkụzi ihe onyonyo, " +"nkirigarị...)." + +msgid "onboarding-v2.newsletter.privacy1" +msgstr "Anyị na-eche banyere nzochi onwe, ebe a inwere ike ịgụ..... anyị " + +msgid "onboarding-v2.newsletter.privacy2" +msgstr "" +"Anyị ga e zitere ozi n bara uru sọọsọ . Ị nwere ike idepu aha oge ọ bụla " +"site na njikọ ndepu aha n'akwụkwọ ozi gasị anyị ọ bụla ." + +msgid "onboarding-v2.newsletter.updates" +msgstr "" +"Zitere m nhazigharị ngwa ahịa (a gwara ọhụrụ gasị , ihe ndị ewepụta gasịrị " +", ndo ị gasị..)." + +msgid "onboarding-v2.welcome.desc1" +msgstr "" +"Ite mkpịsị bụ nsina ghere oghe ma bụrụ nke Kaleidos nakwa ndị obodo rụrụ " +"Ebe ọtụtụ mmadụ nyewegoroa onwe anyị aka..Onye ọ bụla nwere arụkọrịtasite " +"na :" + +msgid "onboarding-v2.welcome.desc2" +msgstr "" +"Oghere ọha na ndị obodo niile na ndị otu ite mkpịsị kpọmkwem ịmụ, kesa ma " +"kọwaa maka ite mkpịsị , ọnọdụ ya ugbu a na ọdịnihu ya" + +msgid "onboarding-v2.welcome.desc3.title" +msgstr "Ntụziaka inye aka" + +msgid "onboarding-v2.welcome.title" +msgstr "Nabata ite mkpịsị !" + +msgid "onboarding.choice.team-up.create-team-desc" +msgstr "I nye ha otu gị aha , I nwere ike ị kpọta ndị mmadụ ka ha sonye." + +msgid "onboarding.choice.team-up.create-team-placeholder" +msgstr "Denye aha otu" + +msgid "onboarding.choice.team-up.invite-members" +msgstr "Kpọta ndị otu" + +msgid "onboarding.choice.team-up.invite-members-info" +msgstr "" +"Cheta ka itinye onye ọ bụla Ndị nzụlite, ndị nrụpụta, ndị njikwa... dị iche " +"iche adds up :)" + +msgid "onboarding.choice.team-up.roles" +msgstr "kpọta tinye ọrụ :" + +msgid "onboarding.newsletter.accept" +msgstr "Eee, debanye aha" + +msgid "onboarding.newsletter.acceptance-message" +msgstr "E zigala arịrịọ ndenye aha gị , anyị ga-ezi tara gị ozi - n iji nabata ya" + +msgid "onboarding.newsletter.title" +msgstr "Chọrọ inweta ozi ite mkpịsị ?" + +msgid "onboarding.team-modal.create-team" +msgstr "Mepụta otu" + +msgid "onboarding.team-modal.create-team-desc" +msgstr "" +"Otu ga-ekwe gị na ndị ọzọ ji ite mkpịsị arụ ọrụ ịrụkọta n'otu ederede na " +"arụmarụ gasị ." + +msgid "onboarding.team-modal.create-team-feature-1" +msgstr "Ederede na arụmarụ na enweghị njedebe" + +msgid "onboarding.team-modal.create-team-feature-2" +msgstr "Mbipụta ọtụtụ egwuregwu" + +msgid "onboarding.team-modal.create-team-feature-3" +msgstr "Njikwa ọrụ" + +msgid "onboarding.team-modal.create-team-feature-4" +msgstr "Ndị otu enweghị njedebe" + +msgid "onboarding.team-modal.create-team-feature-5" +msgstr "% narị efu!" + +msgid "onboarding.templates.subtitle" +msgstr "Ụfọdụ ndebiri nọ ebe a." + +msgid "onboarding.templates.title" +msgstr "Bido osise" + +#: src/app/main/ui/auth/recovery.cljs +msgid "profile.recovery.go-to-login" +msgstr "Gaa na mbanye" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "Kedu ngwa ọrụ nse ị ka mara eji arụ ọrụ ?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "Iri na otu ruo na iri atọ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "Abụọ ruo na iri" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "Iri atọ na otu ruo na iri ise" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "Ọtụtụ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Ngwa nrụkọrịta ọrụ Adobe" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Kanva" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "Kedụ ka Ị ga-esi kọwaa ọfụma ihe ndị ị hụrụ ịrụ ọrụ na..." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Onye nrụpụta" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "Chọpụta ihe ndị ọzọ gbasara ite mkpịsị" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Ihe onyonyo" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Onye malitere /VP" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Onye nwere onwe ya" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Weta akara site n'arụmarụ otu m " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... Nhazi ihu nse, uru ahụmụzọ, usoro imewe , etc." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "Mmakpo" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Hapụ Nzaghachi maka arụmarụ ndị otu m" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "Ka anyị bido!" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Onye njikwa ngwaahịa ma ọ bụ arụmarụ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Ịzụ ahịa" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "Karịrị iri ise" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-a-tool" +msgstr "E jibeghị m ngwa ọrụ nse rụọ ọrụ mbụ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Ọzọ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Onweghị" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Ọzọ (zipụta)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "A na m arụ ọrụ n'arụmarụ onwe" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Kedụ ka ị sị akwado iji ite mkpịsị arụ ọrụ ?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Gịnị bụ ọrụ gị ?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Họrọ nhọ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Eserese" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Ụfọdụ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Bido" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Bido ịrụ ọrụ m" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Nwata akwụkwọ ma ọ bụ onye nkụzi" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "Kedụ ka otu gị ha?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Nwale ite mkpịsị ịhụ ma ọ bụ ihe ndaba maka otu " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Gbalịa mee mbụ tupu ị jiri ite mkpịsị rụọ ọrụ n'ebe ọ dị" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "... waya etiti , ndị ọrụ njem na eruba , osisi ngagharị gasị , dgz." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Na-arụ ọrụ n'echiche ihe" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Nzaghachi gị ga-enyere anyị aka ịghọta ihe agwa na mmasị gị bụ Ka anyị ga " +"na-eme Ite mkpịsị ụdị ngwa ọrụ bara uru dị ụtọ ." + +msgid "shortcuts.bring-backward" +msgstr "Wega ebe azụ" + +msgid "shortcuts.duplicate" +msgstr "Mkpị" + +msgid "shortcuts.letter-spacing-inc" +msgstr "Leta mmụba oghere" + +msgid "shortcuts.paste" +msgstr "Nyado" + +msgid "shortcuts.text-align-left" +msgstr "Dozie akaekpe" + +msgid "viewer.breaking-change.message" +msgstr "Ndo" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.delete" +msgstr "Kachapụ" + +msgid "workspace.focus.focus-mode" +msgstr "Umezi nlekwasa anya" + +msgid "workspace.focus.focus-on" +msgstr "Gbanye nlekwasa anya" + +msgid "workspace.shape.menu.create-multiple-components" +msgstr "Mee ọtụtụ akọrọngwa ga" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.color-palette" +msgstr "Agba[ Palette (Na narị)" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.there-are-updates" +msgstr "E nwegasịrị nhazizigharị nime ọba ederede ga e kere eke" diff --git a/frontend/translations/lv.po b/frontend/translations/lv.po index 72c325638..4f6b9ab4f 100644 --- a/frontend/translations/lv.po +++ b/frontend/translations/lv.po @@ -1,16 +1,16 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-01-06 22:06+0000\n" +"PO-Revision-Date: 2024-04-19 08:03+0000\n" "Last-Translator: Edgars Andersons \n" -"Language-Team: Latvian \n" +"Language-Team: Latvian " +"\n" "Language: lv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= " -"19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" -"X-Generator: Weblate 5.4-dev\n" +"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 " +"<= 19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" +"X-Generator: Weblate 5.5-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -55,11 +55,11 @@ msgstr "Pilns vārds" #: src/app/main/ui/auth/register.cljs msgid "auth.login-here" -msgstr "Ienākt šeit" +msgstr "Pieteikties šeit" #: src/app/main/ui/auth/login.cljs msgid "auth.login-submit" -msgstr "Ienākt" +msgstr "Pieteikties" #: src/app/main/ui/auth/login.cljs msgid "auth.login-title" @@ -179,6 +179,13 @@ msgstr "" "Ar jauna konta izveidošanu tiek piekrists mūsu pakalpojuma noteikumiem un " "privātuma nosacījumiem." +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Ar jauna konta izveidošanu tiek piekrists mūsu [pakalpojuma " +"noteikumiem](%s) un [privātuma nosacījumiem](%s)." + #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "Mēs esam nosūtījuši apstiprinājuma e-pasta ziņojumu uz" @@ -194,8 +201,7 @@ msgid "common.share-link.all-users" msgstr "Visi Penpot lietotāji" msgid "common.share-link.confirm-deletion-link-description" -msgstr "" -"Vai tiešām noņemt šo saiti? Noņemot to, saite vairs nebūs pieejama nevienam" +msgstr "Vai tiešām noņemt šo saiti? Noņemot to, saite vairs nebūs pieejama nevienam" msgid "common.share-link.current-tag" msgstr "(pašreizējais)" @@ -261,8 +267,7 @@ msgstr "Apvienojieties!" #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.tutorial-hero.info" -msgstr "" -"Penpot pamatu apgūšana, kamēr tiek gūts prieks, ar šo praktisko apmācību." +msgstr "Penpot pamatu apgūšana, kamēr tiek gūts prieks, ar šo praktisko apmācību." #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.tutorial-hero.start" @@ -347,9 +352,9 @@ msgstr "Privātās piekļuves pilnvaras" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.personal.description" msgstr "" -"Privātās piekļuves pilnvaras darbojas kā alternatīva mūsu pieteikšanās/" -"paroles autentificēšanas sistēmai, un tās var izmantot, lai ļautu lietotnēm " -"piekļūt iekšējam Penpot API" +"Privātās piekļuves pilnvaras darbojas kā alternatīva mūsu " +"pieteikšanās/paroles autentificēšanas sistēmai, un tās var izmantot, lai " +"ļautu lietotnēm piekļūt iekšējam Penpot API" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.token-will-expire" @@ -403,8 +408,8 @@ msgstr "Divkāršot %s datnes" msgid "dashboard.empty-placeholder-drafts" msgstr "" "Šeit tiks parādītas bibliotēkām pievienotās datnes. Mēģini koplietot datnes " -"vai pievienot tās no mūsu [bibliotēkām un veidnēm](https://penpot.app/" -"libraries-templates.html)." +"vai pievienot tās no mūsu [bibliotēkām un " +"veidnēm](https://penpot.app/libraries-templates.html)." msgid "dashboard.export-binary-multi" msgstr "Lejupielādēt %s Penpot datnes (.penpot)" @@ -430,8 +435,8 @@ msgstr "Izgūt" #: src/app/main/ui/export.cljs msgid "dashboard.export-shapes.how-to" msgstr "" -"Izgūšanas iestatījumus elementiem var pievienot no noformējuma īpašībām (" -"labās sānjoslas apakšā)." +"Izgūšanas iestatījumus elementiem var pievienot no noformējuma īpašībām " +"(labās sānjoslas apakšā)." #: src/app/main/ui/export.cljs msgid "dashboard.export-shapes.how-to-link" @@ -449,8 +454,7 @@ msgid "dashboard.export-standard-multi" msgstr "Lejupielādēt %s standarta datnes (. svg +. json)" msgid "dashboard.export.detail" -msgstr "" -"* var ietvert sastāvdaļas, attēlus, krāsas un/vai burtu stilus un veidus." +msgstr "* var ietvert sastāvdaļas, attēlus, krāsas un/vai burtu stilus un veidus." msgid "dashboard.export.explain" msgstr "" @@ -471,8 +475,7 @@ msgstr "" "pievienoti līdzekļi. " msgid "dashboard.export.options.detach.title" -msgstr "" -"Attiekties pret koplietojamo bibliotēku līdzekļiem kā pret pamatobjektiem" +msgstr "Attiekties pret koplietojamo bibliotēku līdzekļiem kā pret pamatobjektiem" msgid "dashboard.export.options.merge.message" msgstr "" @@ -524,8 +527,8 @@ msgid "dashboard.fonts.warning-text" msgstr "" "Esam noteikuši iespējamu sarežģījumu ar fontiem, kas ir saistīta ar " "vertikālajiem rādītājiem dažādām operētājsistēmām. Lai to pārbaudītu, var " -"izmantot tādus fontu vertikālo rādītāju pakalpojumus kā [šis](https" -"://vertical-metrics.netlify.app/). Turklāt ir ieteicams izmantot " +"izmantot tādus fontu vertikālo rādītāju pakalpojumus kā " +"[šis](https://vertical-metrics.netlify.app/). Turklāt ir ieteicams izmantot " "[Transfonter](https://transfonter.org/), lai izveidotu tīmekļa fontus un " "novērstu kļūdas. " @@ -535,9 +538,18 @@ msgstr "Ievietot Penpot datnes" msgid "dashboard.import.analyze-error" msgstr "Ak vai! Šo datni nevarēja ievietot" +msgid "dashboard.import.analyze-error.components-v2" +msgstr "Datne ar v2 sastāvdaļām ir aktivizēta, bet šī komanda to vēl neatbalsta." + msgid "dashboard.import.import-error" msgstr "Datnes ievietošanas laikā radās sarežģījumi. Datne netika ievietota." +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "%s datņu tika veiksmīgi ievietotas." +msgstr[1] "%s datne tika veiksmīgi ievietota." +msgstr[2] "%s datnes tika veiksmīgi ievietotas." + msgid "dashboard.import.import-warning" msgstr "Dažās datnēs bija nederīgi objekti, kuri tika noņemti." @@ -894,13 +906,20 @@ msgstr "E-pasta adrese “%s” ir atzīmēta surogātpasts vai pastāvīgi saņ #: src/app/main/errors.cljs msgid "errors.feature-mismatch" msgstr "" -"Šķiet, ka tiek atvērta datne, kurā ir iespējota iespēja '%s', bet pašreizējā " -"Penpot versija to neatbalsta vai tā ir atspējota." +"Šķiet, ka tiek atvērta datne, kurā ir iespējota iespēja '%s', bet " +"pašreizējā Penpot versija to neatbalsta vai tā ir atspējota." #: src/app/main/errors.cljs msgid "errors.feature-not-supported" msgstr "Līdzeklis '%s' netiek atbalstīts." +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Izskatās, ka ir nesaderība starp iespējotajām iespējām un iespējām datnē, " +"kuru tiek mēģināts atvērt. Jāpiemēro '%s' migrācijas, pirms datne var tikt " +"atvērta." + #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -951,6 +970,9 @@ msgstr "Apstiprinājuma parolei ir jāsakrīt" msgid "errors.password-too-short" msgstr "Parolē ir jābūt vismaz 8 rakstzīmēm" +msgid "errors.paste-data-validation" +msgstr "Starpliktuvē ir nederīgi dati" + msgid "errors.profile-blocked" msgstr "Profils ir bloķēts" @@ -959,13 +981,17 @@ msgstr "Profils ir bloķēts" #: src/app/main/ui/dashboard/team.cljs msgid "errors.profile-is-muted" msgstr "" -"Profila epasta saņemšana ir apklusināta (ziņojumi par surogātpastu vai daudz " -"atlēcienu)." +"Profila epasta saņemšana ir apklusināta (ziņojumi par surogātpastu vai " +"daudz atlēcienu)." #: src/app/main/ui/auth/register.cljs msgid "errors.registration-disabled" msgstr "Reģistrācija pašlaik ir atspējota." +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Noteikta nesaderīga iespēja '%s'" + msgid "errors.team-leave.insufficient-members" msgstr "" "Komandā ir nepietiekams dalībnieku skaits, lai to pamestu. Iespējams, ka to " @@ -987,6 +1013,13 @@ msgstr "Atgadījās neparedzēta kļūda." msgid "errors.unexpected-token" msgstr "Nezināma tekstvienība" +msgid "errors.validation" +msgstr "Pārbaudes kļūda" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Datnei ir nesaderīgs versijas numurs" + msgid "errors.webhooks.connection" msgstr "Savienojuma kļūda, URL nav sasniedzams" @@ -1042,8 +1075,8 @@ msgstr "Temats" msgid "feedback.subtitle" msgstr "" "Lūgums aprakstīt e-pasta ziņojuma iemeslu, norādot, vai tā ir nepilnība, " -"ierosinājums vai šaubas. Kāds mūsu komandas dalībnieks atbildēs pēc iespējas " -"ātrāk." +"ierosinājums vai šaubas. Kāds mūsu komandas dalībnieks atbildēs pēc " +"iespējas ātrāk." #: src/app/main/ui/settings/feedback.cljs msgid "feedback.title" @@ -1221,6 +1254,9 @@ msgstr "Nav" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "Virsraksta stils" +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Atiestatīt" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Lielie burti" @@ -1314,8 +1350,8 @@ msgstr "Atpakaļ" #: src/app/main/ui/static.cljs msgid "labels.bad-gateway.desc-message" msgstr "" -"Izskatās, ka mazliet jāuzgaida un jāmēģina vēlreiz; mēs veicam nelielus mūsu " -"serveru uzturēšanas darbus." +"Izskatās, ka mazliet jāuzgaida un jāmēģina vēlreiz; mēs veicam nelielus " +"mūsu serveru uzturēšanas darbus." #: src/app/main/ui/static.cljs msgid "labels.bad-gateway.main-message" @@ -1628,6 +1664,9 @@ msgstr "Loma" msgid "labels.save" msgstr "Saglabāt" +msgid "labels.search" +msgstr "Meklēt" + msgid "labels.search-font" msgstr "Meklēt fontu" @@ -1652,6 +1691,9 @@ msgstr "Pakalpojums nav pieejams" msgid "labels.settings" msgstr "Iestatījumi" +msgid "labels.share" +msgstr "Kopīgot" + msgid "labels.share-prototype" msgstr "Kopīgot prototipu" @@ -1721,10 +1763,34 @@ msgstr "(Jūs)" msgid "labels.your-account" msgstr "Mans konts" +msgid "media.choose-image" +msgstr "Izvēlēties attēlu" + +msgid "media.gradient" +msgstr "Pāreja" + +msgid "media.image" +msgstr "Attēls" + +msgid "media.linear" +msgstr "Līnijveida" + #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Ielādē attēlu…" +msgid "media.radial" +msgstr "Radiāls" + +msgid "media.solid" +msgstr "Viengabalains" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Bibliotēka ir tukša. Tiklīdz tā būs pievienota kā koplietojama bibliotēka, " +"izveidotie līdzekļi būs pieejami izmantošanai pārējos failos. Vai tiešām " +"padarīt to pieejamu?" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -1838,8 +1904,7 @@ msgstr "Dzēst sarunu" #: src/app/main/ui/comments.cljs msgid "modals.delete-comment-thread.message" -msgstr "" -"Vai tiešām izdzēst šo sarunu? Visas šī pavediena piebildes tiks izdzēstas." +msgstr "Vai tiešām izdzēst šo sarunu? Visas šī pavediena piebildes tiks izdzēstas." #: src/app/main/ui/comments.cljs msgid "modals.delete-comment-thread.title" @@ -1884,8 +1949,7 @@ msgid "modals.delete-font-variant.title" msgstr "Fonta stila dzēšana" msgid "modals.delete-font.message" -msgstr "" -"Vai tiešām izdzēst šo fontu? Tas netiks ielādēts, ja tiek izmantots datnē." +msgstr "Vai tiešām izdzēst šo fontu? Tas netiks ielādēts, ja tiek izmantots datnē." msgid "modals.delete-font.title" msgstr "Fonta dzēšana" @@ -1974,6 +2038,19 @@ msgstr "Vai tiešām izdzēst šo dalībnieku no komandas?" msgid "modals.delete-team-member-confirm.title" msgstr "Dzēst komandas dalībnieku" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "" +"Līdzekļi, kas jau tiek izmantoti šajā datnē, paliks tajā (dizains netiks " +"salauzts)." +msgstr[1] "" +"Līdzeklis, kas jau tiek izmantots šajā datnē, paliks tajā (dizains netiks " +"salauzts)." +msgstr[2] "" +"Līdzekļi, kas jau tiek izmantoti šajā datnē, paliks tajā (dizains netiks " +"salauzts)." + msgid "modals.delete-webhook.accept" msgstr "Izdzēst tīmekļa aizķeri" @@ -2162,6 +2239,10 @@ msgstr "" msgid "modals.update-remote-component.message" msgstr "Atjaunināt sastāvdaļu koplietojamā bibliotēkā" +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "Ir pieejama jauna versija, lūgums atsvaidzināt lapu" + #: src/app/main/ui/dashboard/team.cljs msgid "notifications.invitation-email-sent" msgstr "Uzaicinājums veiksmīgi nosūtīts" @@ -2172,8 +2253,7 @@ msgstr "Uzaicinājuma saite nokopēta" #: src/app/main/ui/settings/delete_account.cljs msgid "notifications.profile-deletion-not-allowed" -msgstr "" -"Profilu nevar izdzēst. Pirms turpināšanas jāpiešķir savas komandas citiem." +msgstr "Profilu nevar izdzēst. Pirms turpināšanas jāpiešķir savas komandas citiem." #: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs msgid "notifications.profile-saved" @@ -2199,8 +2279,7 @@ msgid "onboarding-v2.before-start.desc2.title" msgstr "Lietotāja rokasgrāmata" msgid "onboarding-v2.before-start.desc3" -msgstr "" -"Ir iespējams apskatīt mūsu pamācības un mūsu kopienas izveidotās pamācības." +msgstr "Ir iespējams apskatīt mūsu pamācības un mūsu kopienas izveidotās pamācības." msgid "onboarding-v2.before-start.desc3.title" msgstr "Video pamācības" @@ -2255,6 +2334,21 @@ msgstr "Līdzdalības rokasgrāmata" msgid "onboarding-v2.welcome.title" msgstr "Laipni lūdzam Penpot!" +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Turpināt komandas izveidošanu" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Turpināt bez komandas" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Izveidot komandu un uzaicināt" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Izveidot komandu un nosūtīt uzaicinājumus" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Uzaicināt būs iespējams vēlāk" + msgid "onboarding.choice.team-up.create-team-desc" msgstr "" "Pēc komandas nosaukuma piešķiršanas varēs uzaicināt cilvēkus tai " @@ -2263,6 +2357,12 @@ msgstr "" msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "Jāievada komandas nosaukums" +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Izveidot komandu" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Izveidot komandu bez uzaicināšanas" + msgid "onboarding.choice.team-up.invite-members" msgstr "Uzaicināt dalībniekus" @@ -2274,6 +2374,12 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Uzaicināt ar lomu:" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Uzsākt bez komandas" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Komandu būs iespējams izveidot vēlāk." + msgid "onboarding.newsletter.accept" msgstr "Jā, abonēt" @@ -2356,6 +2462,14 @@ msgstr "Canva" msgid "questions.describe-your-experience-working-on" msgstr "Kā vislabāk raksturotu savu pieredzi strādājot pie..." +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Modelētājs" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Izstrādātājs" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.discover-more-about-penpot" msgstr "Atklāt vairāk par Penpot" @@ -2364,6 +2478,10 @@ msgstr "Atklāt vairāk par Penpot" msgid "questions.figma" msgstr "Figma" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Dibinātājs/viceprezidents" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.freelancer" msgstr "Esmu ārštātnieks(-ce)/Pašnodarbināts(-ā)" @@ -2388,6 +2506,14 @@ msgstr "Atstāt atsauksmes par manas grupas projektu" msgid "questions.lets-get-started" msgstr "Ķeramies pie darba!" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Produktu vai projektu vadītājs" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Tirgvedība" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.more-than-50" msgstr "Vairāk nekā 50" @@ -2416,6 +2542,10 @@ msgstr "Iepriekšējais" msgid "questions.questions-how-are-you-planning-to-use-penpot" msgstr "Kā ir iecerēts izmantot Penpot?" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Kāda ir ieņemamā loma?" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.select-option" msgstr "Atlasīt iespēju" @@ -2436,6 +2566,10 @@ msgstr "Sākt" msgid "questions.start-to-work-on-my-project" msgstr "Sākt strādāt pie sava projekta" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Students vai pasniedzējs" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.team-size" msgstr "Cik liela ir komanda?" @@ -2459,8 +2593,12 @@ msgstr "Darbs koncepcijas idejās" #: src/app/main/ui/onboarding/questions.cljs msgid "questions.your-feedback-will-help-us" msgstr "" -"Atsauksmes palīdzēs mums saprast, kādi ir lietotāju paradumi un izvēles, lai " -"mēs varētu turpināt padarīt Penpot par noderīgu un patīkamu rīku." +"Atsauksmes palīdzēs mums saprast, kādi ir lietotāju paradumi un izvēles, " +"lai mēs varētu turpināt padarīt Penpot par noderīgu un patīkamu rīku." + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Atdalīt" #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, @@ -2918,6 +3056,9 @@ msgstr "Rādīt/paslēpt mērjoslas" msgid "shortcuts.toggle-textpalette" msgstr "Pārslēgt teksta paleti" +msgid "shortcuts.toggle-theme" +msgstr "Mainīt izskatu" + msgid "shortcuts.toggle-visibility" msgstr "Pārslēgt redzamību" @@ -3024,8 +3165,7 @@ msgid "title.workspace" msgstr "%s - Penpot" msgid "viewer.breaking-change.description" -msgstr "" -"Šī kopīgojamā saite vairs nav derīga. Jāizveido vai jālūdz īpašniekam jauna." +msgstr "Šī kopīgojamā saite vairs nav derīga. Jāizveido vai jālūdz īpašniekam jauna." msgid "viewer.breaking-change.message" msgstr "Piedošanu!" @@ -3134,8 +3274,7 @@ msgstr "Izveidot kopu" #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.create-group-hint" -msgstr "" -"Vienumi tiks automātiski nosaukti kā “kopas nosaukums/vienuma nosaukums”" +msgstr "Vienumi tiks automātiski nosaukti kā “kopas nosaukums/vienuma nosaukums”" #: src/app/main/ui/workspace/sidebar/sitemap.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs, @@ -3148,6 +3287,9 @@ msgstr "Dzēst" msgid "workspace.assets.duplicate" msgstr "Divkāršot" +msgid "workspace.assets.duplicate-main" +msgstr "Divkāršot galveno" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.edit" @@ -3171,7 +3313,7 @@ msgid "workspace.assets.libraries" msgstr "Bibliotēkas" msgid "workspace.assets.local-library" -msgstr "lokālā bibliotēka" +msgstr "vietējā bibliotēka" #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.not-found" @@ -3251,6 +3393,45 @@ msgstr "Teksta pārveide" msgid "workspace.assets.ungroup" msgstr "Atapkopot" +msgid "workspace.context-menu.grid-cells.area" +msgstr "Izveidot laukumu" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Izveidot plātni" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Apvienot šūnas" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Pievienot 1 sleju pa labi" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Pievienot 1 sleju pa kreisi" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Izdzēst sleju" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Izdzēst slejas un apveidus" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Divkāršota sleja" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Pievienot 1 rindu zem" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Pievienot 1 rindu virs" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Izdzēst rindu" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Izdzēst rindu un apveidus" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Divkāršot rindu" + msgid "workspace.focus.focus-mode" msgstr "Fokusa režīms" @@ -3374,6 +3555,12 @@ msgstr "Rādīt mērjoslas" msgid "workspace.header.menu.show-textpalette" msgstr "Rādīt fontu paleti" +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Pārslēgties uz tumšo izskatu" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "Pārslēgties uz gaišo izskatu" + msgid "workspace.header.menu.undo" msgstr "Atsaukt" @@ -3425,6 +3612,21 @@ msgstr "Pilnekrāns" msgid "workspace.header.zoom-selected" msgstr "Tālummainīt uz atlasi" +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Labot režģi" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Iziet" + +msgid "workspace.layout_grid.editor.title" +msgstr "Režģa labošana" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Darīts" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Noteikt atrašanās vietu" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Pievienot" @@ -3495,6 +3697,10 @@ msgstr "BIBLIOTĒKA" msgid "workspace.libraries.library-updates" msgstr "BIBLIOTĒKAS JAUNINĀJUMI" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Ielādē…" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "Nav nevienas koplietojamās bibliotēkas, kas būtu jāatjaunina" @@ -3569,12 +3775,24 @@ msgstr "Sastāvdaļa" msgid "workspace.options.component.annotation" msgstr "Piezīme" +msgid "workspace.options.component.copy" +msgstr "Ievietot starpliktuvē" + msgid "workspace.options.component.create-annotation" msgstr "Izveidot piezīmi" msgid "workspace.options.component.edit-annotation" msgstr "Labot piezīmi" +msgid "workspace.options.component.main" +msgstr "Galvenais" + +msgid "workspace.options.component.swap" +msgstr "Mijmainīt sastāvdaļu" + +msgid "workspace.options.component.swap.empty" +msgstr "Šajā bibliotēkā vēl nav līdzekļu" + #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Ierobežojumi" @@ -3669,6 +3887,10 @@ msgstr "Aizpildīšana" msgid "workspace.options.flows.add-flow-start" msgstr "Pievienot plūsmas sākumu" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Plūsma" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "Plūsmas sākums" @@ -3683,7 +3905,7 @@ msgstr "Auto" #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.column" -msgstr "Kolonnas" +msgstr "Slejas" #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.grid-title" @@ -3694,7 +3916,7 @@ msgstr "Krāsa" #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.params.columns" -msgstr "Kolonnas" +msgstr "Slejas" #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.params.gutter" @@ -3772,6 +3994,9 @@ msgstr "Kopas aizpildījums" msgid "workspace.options.group-stroke" msgstr "Kopas vilkums" +msgid "workspace.options.guides.title" +msgstr "Vadotnes" + msgid "workspace.options.height" msgstr "Augstums" @@ -4111,11 +4336,11 @@ msgstr "Apakša" #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.direction.column" -msgstr "Kolona" +msgstr "Sleja" #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.direction.column-reverse" -msgstr "Apgrieztā kolonna" +msgstr "Apvērsta sleja" #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.direction.row" @@ -4241,8 +4466,7 @@ msgstr "Meklēt fontu" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.select-a-shape" -msgstr "" -"Jāatlasa apveids, plātne vai kopa, lai vilktu savienojumu uz citu plātni." +msgstr "Jāatlasa apveids, plātne vai kopa, lai vilktu savienojumu uz citu plātni." #: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs msgid "workspace.options.selection-color" @@ -4319,14 +4543,26 @@ msgstr "Vilkums" msgid "workspace.options.stroke-cap.circle-marker" msgstr "Apļa marķieris" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Aplis" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "Rombveida marķieris" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Dimants" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "Līnijas bulta" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Bulta" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "Nav" @@ -4343,10 +4579,18 @@ msgstr "Kvadrāts" msgid "workspace.options.stroke-cap.square-marker" msgstr "Kvadrāta marķieris" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Taisnstūris" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "Trīsstūra bulta" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Trijstūris" + msgid "workspace.options.stroke-color" msgstr "Vilkuma krāsa" @@ -4817,6 +5061,13 @@ msgstr "Teksts (%s)" msgid "workspace.toolbar.text-palette" msgstr "Burtu stili un veidi (%s)" +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**Apskatīšana** (tikai skatīt)" + +msgid "workspace.top-bar.read-only.done" +msgstr "Darīts" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Līdz šim nav notikušas nekādas vēsturiskās izmaiņas" @@ -4950,210 +5201,3 @@ msgstr "Atjaunināt" msgid "workspace.viewport.click-to-close-path" msgstr "Jānoklikšķina, lai aizvērtu ceļu" - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Noteikta nesaderīga iespēja '%s'" - -msgid "errors.paste-data-validation" -msgstr "Starpliktuvē ir nederīgi dati" - -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Turpināt komandas izveidošanu" - -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Uzsākt bez komandas" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Komandu būs iespējams izveidot vēlāk." - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Turpināt bez komandas" - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Izveidot komandu un nosūtīt uzaicinājumus" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Izveidot komandu un uzaicināt" - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Izveidot komandu" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Uzaicināt būs iespējams vēlāk" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "Izstrādātājs" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Iziet" - -msgid "media.image" -msgstr "Attēls" - -msgid "media.solid" -msgstr "Viengabalains" - -msgid "media.linear" -msgstr "Līnijveida" - -msgid "media.radial" -msgstr "Radiāls" - -msgid "media.gradient" -msgstr "Pāreja" - -msgid "media.choose-image" -msgstr "Izvēlēties attēlu" - -msgid "workspace.options.guides.title" -msgstr "Vadotnes" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Datnei ir nesaderīgs versijas numurs" - -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Izskatās, ka ir nesaderība starp iespējotajām iespējām un iespējām datnē, " -"kuru tiek mēģināts atvērt. Jāpiemēro '%s' migrācijas, pirms datne var tikt " -"atvērta." - -msgid "errors.validation" -msgstr "Pārbaudes kļūda" - -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Atiestatīt" - -msgid "labels.share" -msgstr "Kopīgot" - -msgid "labels.search" -msgstr "Meklēt" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Ar jauna konta izveidošanu tiek piekrists mūsu [pakalpojuma noteikumiem](%s) " -"un [privātuma nosacījumiem](%s)." - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Izveidot komandu bez uzaicināšanas" - -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Labot režģi" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Noteikt atrašanās vietu" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Darīts" - -msgid "workspace.options.component.swap" -msgstr "Mijmainīt sastāvdaļu" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Plūsma" - -msgid "workspace.top-bar.read-only.done" -msgstr "Darīts" - -msgid "workspace.options.component.swap.empty" -msgstr "Šajā bibliotēkā vēl nav līdzekļu" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Bulta" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Trijstūris" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Taisnstūris" - -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Apskatīšana** (tikai skatīt)" - -msgid "workspace.assets.duplicate-main" -msgstr "Divkāršot galveno" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "Modelētājs" - -msgid "dashboard.import.import-message" -msgid_plural "dashboard.import.import-message" -msgstr[0] "%s datņu tika veiksmīgi ievietotas." -msgstr[1] "%s datne tika veiksmīgi ievietota." -msgstr[2] "%s datnes tika veiksmīgi ievietotas." - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Bibliotēka ir tukša. Tiklīdz tā būs pievienota kā koplietojama bibliotēka, " -"izveidotie līdzekļi būs pieejami izmantošanai pārējos failos. Vai tiešām " -"padarīt to pieejamu?" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Atdalīt" - -msgid "workspace.options.component.copy" -msgstr "Ievietot starpliktuvē" - -msgid "workspace.options.component.main" -msgstr "Galvenais" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Aplis" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Dimants" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "" -"Līdzekļi, kas jau tiek izmantoti šajā datnē, paliks tajā (dizains netiks " -"salauzts)." -msgstr[1] "" -"Līdzeklis, kas jau tiek izmantots šajā datnē, paliks tajā (dizains netiks " -"salauzts)." -msgstr[2] "" -"Līdzekļi, kas jau tiek izmantoti šajā datnē, paliks tajā (dizains netiks " -"salauzts)." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Tirgvedība" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Dibinātājs/viceprezidents" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "Produktu vai projektu vadītājs" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "Kāda ir ieņemamā loma?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "Students vai pasniedzējs" - -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "Ir pieejama jauna versija, lūgums atsvaidzināt lapu" - -msgid "workspace.layout_grid.editor.title" -msgstr "Režģa labošana" diff --git a/frontend/translations/ms.po b/frontend/translations/ms.po index 110f93eca..087eb384d 100644 --- a/frontend/translations/ms.po +++ b/frontend/translations/ms.po @@ -1,16 +1,30 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-09 13:58+0000\n" +"PO-Revision-Date: 2024-02-10 15:02+0000\n" "Last-Translator: Revenant \n" -"Language-Team: Malay \n" +"Language-Team: Malay " +"\n" "Language: ms\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.4-dev\n" +#: src/app/main/ui/auth/register.cljs +msgid "auth.already-have-account" +msgstr "Sudah mempunyai akaun?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.check-your-email" +msgstr "" +"Semak e-mel anda dan klik pada pautan untuk mengesahkan dan mula " +"menggunakan Penpot." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.confirm-password" +msgstr "Mengesahkan kata laluan" + #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.create-demo-account" msgstr "Cipta akaun demo" @@ -69,6 +83,18 @@ msgstr "LDAP" msgid "auth.login-with-oidc-submit" msgstr "OpenID Connect" +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "Nama mesti mengandungi beberapa aksara selain ruang." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "Nama mesti mengandungi paling banyak 250 aksara." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.new-password" +msgstr "Taip kata laluan baharu" + #: src/app/main/ui/auth/recovery.cljs msgid "auth.notifications.invalid-token-error" msgstr "Token pemulihan adalah tidak sah." @@ -124,10 +150,18 @@ msgstr "Tukar kata laluan anda" msgid "auth.register" msgstr "Tiada akaun lagi?" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.register-submit" +msgstr "Cipta akaun" + #: src/app/main/ui/auth/register.cljs msgid "auth.register-subtitle" msgstr "Ia percuma dan Sumber Terbuka" +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-title" +msgstr "Cipta akaun" + #: src/app/main/ui/auth.cljs msgid "auth.sidebar-tagline" msgstr "Penyelesaian sumber terbuka untuk reka bentuk dan prototaip." @@ -135,6 +169,11 @@ msgstr "Penyelesaian sumber terbuka untuk reka bentuk dan prototaip." msgid "auth.terms-of-service" msgstr "Syarat perkhidmatan" +msgid "auth.terms-privacy-agreement" +msgstr "" +"Apabila membuat akaun baharu, anda bersetuju menerima syarat perkhidmatan " +"dan dasar privasi kami." + #: src/app/main/ui/auth/register.cljs #, markdown msgid "auth.terms-privacy-agreement-md" @@ -142,10 +181,9 @@ msgstr "" "Apabila membuat akaun baharu, anda bersetuju menerima [syarat " "perkhidmatan](%s) dan [dasar privasi](%s) kami." -msgid "auth.terms-privacy-agreement" -msgstr "" -"Apabila membuat akaun baharu, anda bersetuju menerima syarat perkhidmatan " -"dan dasar privasi kami." +#: src/app/main/ui/auth/register.cljs +msgid "auth.verification-email-sent" +msgstr "Kami telah menghantar e-mel pengesahan kepada" #: src/app/main/ui/onboarding/questions.cljs msgid "branding-illustrations-marketing-pieces" @@ -157,6 +195,11 @@ msgstr "Terbitkan" msgid "common.share-link.all-users" msgstr "Semua pengguna Penpot" +msgid "common.share-link.confirm-deletion-link-description" +msgstr "" +"Adakah anda pasti untuk mengalih keluar pautan ini? Jika anda melakukannya, " +"ia tidak lagi tersedia untuk sesiapa sahaja" + msgid "common.share-link.current-tag" msgstr "(semasa)" @@ -179,6 +222,9 @@ msgstr[0] "%s halaman dikongsi" msgid "common.share-link.permissions-can-comment" msgstr "Boleh komen" +msgid "common.share-link.permissions-can-inspect" +msgstr "Boleh memeriksa kod" + msgid "common.share-link.permissions-hint" msgstr "Sesiapa yang mempunyai pautan akan mendapat akses" @@ -220,6 +266,10 @@ msgstr "" "Pelajari asas-asas di Penpot sambil berseronok dengan tutorial guna tangan " "ini." +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.start" +msgstr "Mulakan tutorial" + #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.tutorial-hero.title" msgstr "Tutorial guna tangan" @@ -244,10 +294,22 @@ msgstr "Token disalin" msgid "dashboard.access-tokens.create" msgstr "Jana token baru" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "Token capaian berjaya dihasilkan." + #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.empty.add-one" msgstr "Tekan butang \"Jana token baharu\" untuk menjana token." +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "Anda tidak mempunyai token setakat ini." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "Nama diperlukan" + #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.expiration-180-days" msgstr "180 hari" @@ -284,6 +346,13 @@ msgstr "Tiada tarikh tamat tempoh" msgid "dashboard.access-tokens.personal" msgstr "Token capaian peribadi" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"Token capaian peribadi berfungsi seperti alternatif kepada sistem " +"pengesahan log masuk/kata laluan kami dan boleh digunakan untuk membenarkan " +"aplikasi mengakses API dalaman Penpot" + #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.token-will-expire" msgstr "Token akan luput pada %s" @@ -334,9 +403,9 @@ msgstr "Pendua %s fail" #, markdown msgid "dashboard.empty-placeholder-drafts" msgstr "" -"Fail yang ditambahkan pada Perpustakaan akan dipaparkan di sini. Cuba kongsi " -"fail anda atau tambahkan daripada [Perpustakaan & templat](https://penpot." -"app/libraries-templates.html) kami." +"Fail yang ditambahkan pada Perpustakaan akan dipaparkan di sini. Cuba " +"kongsi fail anda atau tambahkan daripada [Perpustakaan & " +"templat](https://penpot.app/libraries-templates.html) kami." msgid "dashboard.export-binary-multi" msgstr "Muat turun %s fail Penpot (.penpot)" @@ -344,75 +413,2356 @@ msgstr "Muat turun %s fail Penpot (.penpot)" msgid "dashboard.export-frames" msgstr "Eksport papan sebagai PDF" -#: src/app/main/ui/auth/register.cljs -msgid "auth.already-have-account" -msgstr "Sudah mempunyai akaun?" +#: src/app/main/ui/export.cljs +msgid "dashboard.export-frames.title" +msgstr "Eksport sebagai PDF" -#: src/app/main/ui/auth/register.cljs -msgid "auth.check-your-email" +msgid "dashboard.export-multi" +msgstr "Eksport fail Penpot %s" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-multiple.selected" +msgstr "%s daripada %s elemen dipilih" + +#: src/app/main/ui/workspace/header.cljs +msgid "dashboard.export-shapes" +msgstr "Eksport" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to" msgstr "" -"Semak e-mel anda dan klik pada pautan untuk mengesahkan dan mula menggunakan " -"Penpot." +"Anda boleh menambah tetapan eksport ke elemen daripada sifat reka bentuk " +"(di bahagian bawah bar sisi kanan)." -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-title" -msgstr "Cipta akaun" +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to-link" +msgstr "Maklumat cara untuk menetapkan eksport di Penpot." -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.confirm-password" -msgstr "Mengesahkan kata laluan" +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.no-elements" +msgstr "Tiada unsur dengan tetapan eksport." -#: src/app/main/ui/auth/register.cljs -msgid "auth.verification-email-sent" -msgstr "Kami telah menghantar e-mel pengesahan kepada" +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.title" +msgstr "Eksport Pemilihan" -msgid "common.share-link.confirm-deletion-link-description" +msgid "dashboard.export-standard-multi" +msgstr "Muat turun %s fail standard (.svg + .json)" + +msgid "dashboard.export.detail" +msgstr "* Mungkin termasuk komponen, grafik, warna dan/atau tipografi." + +msgid "dashboard.export.explain" msgstr "" -"Adakah anda pasti untuk mengalih keluar pautan ini? Jika anda melakukannya, " -"ia tidak lagi tersedia untuk sesiapa sahaja" +"Satu atau lebih fail yang anda ingin eksport menggunakan perpustakaan " +"kongsi. Apa yang anda mahu lakukan dengan aset mereka*?" -msgid "common.share-link.permissions-can-inspect" -msgstr "Boleh memeriksa kod" +msgid "dashboard.export.options.all.message" +msgstr "" +"fail dengan perpustakaan kongsi akan disertakan dalam eksport, mengekalkan " +"hubungannya." + +msgid "dashboard.export.options.all.title" +msgstr "Eksport perpustakaan kongsi" + +msgid "dashboard.export.options.detach.message" +msgstr "" +"Perpustakaan kongsi tidak akan disertakan dalam eksport dan tiada aset akan " +"ditambahkan ke perpustakaan. " + +msgid "dashboard.export.options.detach.title" +msgstr "Anggap aset perpustakaan kongsi sebagai objek asas" + +msgid "dashboard.export.options.merge.message" +msgstr "" +"Fail anda akan dieksport dengan semua aset luaran digabungkan ke dalam " +"pustaka fail." + +msgid "dashboard.export.options.merge.title" +msgstr "Sertakan aset perpustakaan kongsi dalam pustaka fail" + +msgid "dashboard.export.title" +msgstr "Eksport fail" + +msgid "dashboard.fonts.deleted-placeholder" +msgstr "Fon hilang" + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.dismiss-all" +msgstr "Tolak semua" + +msgid "dashboard.fonts.empty-placeholder" +msgstr "Fon tersuai yang anda muat naik akan dipaparkan di sini." + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.fonts-added" +msgid_plural "dashboard.fonts.fonts-added" +msgstr[0] "%s fon ditambah" + +#, markdown +msgid "dashboard.fonts.hero-text1" +msgstr "" +"Sebarang fon web yang anda muat naik di sini akan ditambahkan pada senarai " +"keluarga fon yang tersedia pada sifat teks fail pasukan ini. Fon dengan " +"nama keluarga fon yang sama akan dikumpulkan sebagai **keluarga fon " +"tunggal**. Anda boleh memuat naik fon dengan format berikut: **TTF, OTF dan " +"WOFF** (hanya satu sahaja diperlukan)." + +#, markdown +msgid "dashboard.fonts.hero-text2" +msgstr "" +"Anda hanya perlu memuat naik fon yang anda miliki atau mempunyai lesen " +"untuk digunakan dalam Penpot. Ketahui lebih lanjut dalam bahagian Hak " +"kandungan [Syarat Perkhidmatan Penpot](https://penpot.app/terms.html). Anda " +"juga mungkin ingin membaca tentang [pelesenan " +"fon](https://www.typography.com/faq)." + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.upload-all" +msgstr "Muat naik semua" + +#, markdown +msgid "dashboard.fonts.warning-text" +msgstr "" +"Kami telah mengesan kemungkinan masalah dalam fon anda yang berkaitan " +"dengan metrik menegak untuk sistem pengendalian yang berbeza. Untuk " +"menyemaknya, anda boleh menggunakan perkhidmatan metrik menegak fon seperti " +"[ini](https://vertical-metrics.netlify.app/). Selain itu, kami mengesyorkan " +"menggunakan [Transfonter](https://transfonter.org/) untuk menjana fon web " +"dan membetulkan ralat. " + +msgid "dashboard.import" +msgstr "Import fail Penpot" + +msgid "dashboard.import.analyze-error" +msgstr "Alamak! Kami tidak dapat mengimport fail ini" + +msgid "dashboard.import.analyze-error.components-v2" +msgstr "" +"Fail dengan komponen v2 diaktifkan tetapi pasukan ini belum menyokongnya " +"lagi." + +msgid "dashboard.import.import-error" +msgstr "Terdapat masalah mengimport fail. Fail tidak diimport." + +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "%s fail telah berjaya diimport." + +msgid "dashboard.import.import-warning" +msgstr "Sesetengah fail mengandungi objek tidak sah telah dialih keluar." + +msgid "dashboard.import.progress.process-colors" +msgstr "memproses warna" + +msgid "dashboard.import.progress.process-components" +msgstr "Memproses komponen" + +msgid "dashboard.import.progress.process-media" +msgstr "Memproses media" + +msgid "dashboard.import.progress.process-page" +msgstr "Memproses halaman: %s" + +msgid "dashboard.import.progress.process-typographies" +msgstr "Memproses tipografi" + +msgid "dashboard.import.progress.upload-data" +msgstr "Memuat naik data ke pelayan (%s/%s)" + +msgid "dashboard.import.progress.upload-media" +msgstr "Memuat naik fail: %s" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.invite-profile" +msgstr "Jemput orang ramai" + +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.leave-team" +msgstr "Tinggalkan pasukan" + +msgid "dashboard.libraries-and-templates" +msgstr "Perpustakaan & Templat" + +msgid "dashboard.libraries-and-templates.explore" +msgstr "Terokai lebih banyak daripada mereka dan ketahui cara untuk menyumbang" + +msgid "dashboard.libraries-and-templates.import-error" +msgstr "Terdapat masalah mengimport templat. Templat tidak diimport." + +#: src/app/main/ui/dashboard/libraries.cljs +msgid "dashboard.libraries-title" +msgstr "Perpustakaan" + +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.loading-files" +msgstr "memuatkan fail anda…" + +msgid "dashboard.loading-fonts" +msgstr "memuatkan fon anda…" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to" +msgstr "Berpindah ke" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-multi" +msgstr "Pindahkan fail %s ke" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-other-team" +msgstr "Pindah ke pasukan lain" + +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/files.cljs +msgid "dashboard.new-file" +msgstr "+ Fail Baharu" + +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-file-prefix" +msgstr "Fail Baharu" #: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.start" -msgstr "Mulakan tutorial" +msgid "dashboard.new-project" +msgstr "+ Projek baharu" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "Token capaian berjaya dihasilkan." +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-project-prefix" +msgstr "Projek Baharu" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.no-matches-for" +msgstr "Tiada padanan ditemui untuk \"%s\"" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.no-projects-placeholder" +msgstr "Projek yang disemat akan muncul di sini" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-changed-successfully" +msgstr "Alamat e-mel anda telah berjaya dikemas kini" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-verified-successfully" +msgstr "Alamat e-mel anda telah berjaya disahkan" + +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.notifications.password-saved" +msgstr "Kata laluan berjaya disimpan!" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.num-of-members" +msgstr "%s ahli" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.open-in-new-tab" +msgstr "Buka fail dalam tab baharu" + +msgid "dashboard.options" +msgstr "Pilihan" + +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.password-change" +msgstr "Tukar kata laluan" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.pin-unpin" +msgstr "Semat/Nyahsemat" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.projects-title" +msgstr "Projek" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.remove-account" +msgstr "Mahu mengalih keluar akaun anda?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.remove-shared" +msgstr "Alih keluar sebagai Pustaka Dikongsi" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.save-settings" +msgstr "Simpan tetapan" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.search-placeholder" +msgstr "Cari…" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.searching-for" +msgstr "Mencari \"%s\"…" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-language" +msgstr "Pilih Bahasa UI" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-theme" +msgstr "Pilih tema" + +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.show-all-files" +msgstr "Tunjukkan semua fail" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-delete-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "Fail anda telah berjaya dipadamkan" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-delete-project" +msgstr "Projek anda telah berjaya dipadamkan" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-duplicate-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "Fail anda telah berjaya dibuat pendua" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-duplicate-project" +msgstr "Projek anda telah berjaya dibuat pendua" + +#: src/app/main/ui/dashboard/grid.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-file" +msgstr "Fail anda berjaya dialihkan" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-files" +msgstr "Fail anda telah berjaya dialihkan" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-move-project" +msgstr "Projek anda berjaya dialihkan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-info" +msgstr "Maklumat pasukan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-members" +msgstr "Anggota kumpulan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-projects" +msgstr "Projek pasukan" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.theme-change" +msgstr "Tema UI" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.title-search" +msgstr "Hasil carian" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.type-something" +msgstr "Taip untuk hasil carian" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.unpublish-shared" +msgstr "Nyahterbit Perpustakaan" + +#: src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs +msgid "dashboard.update-settings" +msgstr "Kemas kini tetapan" + +msgid "dashboard.webhooks.active" +msgstr "Adalah aktif" + +msgid "dashboard.webhooks.active.explain" +msgstr "Apabila cangkuk ini dicetuskan, butiran peristiwa akan dihantar" + +msgid "dashboard.webhooks.content-type" +msgstr "Jenis kandungan" + +msgid "dashboard.webhooks.create" +msgstr "Cipta webhook" + +msgid "dashboard.webhooks.create.success" +msgstr "Webhook berjaya dihasilkan." + +msgid "dashboard.webhooks.description" msgstr "" -"Token capaian peribadi berfungsi seperti alternatif kepada sistem pengesahan " -"log masuk/kata laluan kami dan boleh digunakan untuk membenarkan aplikasi " -"mengakses API dalaman Penpot" +"Webhooks adalah cara mudah untuk membolehkan tapak web dan apl lain " +"dimaklumkan apabila acara tertentu berlaku di Penpot. Kami akan menghantar " +"permintaan POST ke setiap URL yang anda berikan." -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.no-access-tokens" -msgstr "Anda tidak mempunyai token setakat ini." +msgid "dashboard.webhooks.empty.add-one" +msgstr "Tekan butang \"Tambah webhook\" untuk menambahnya." -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "Nama diperlukan" +msgid "dashboard.webhooks.empty.no-webhooks" +msgstr "Tiada webhook dibuat setakat ini." -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "Nama mesti mengandungi beberapa aksara selain ruang." +msgid "dashboard.webhooks.update.success" +msgstr "Webhook berjaya dikemas kini." -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "Nama mesti mengandungi paling banyak 250 aksara." +#: src/app/main/ui/settings.cljs +msgid "dashboard.your-account-title" +msgstr "Akaun anda" -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.new-password" -msgstr "Taip kata laluan baharu" +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-email" +msgstr "E-mel" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.register-submit" -msgstr "Cipta akaun" +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-name" +msgstr "Nama anda" -#: src/app/main/ui/export.cljs -msgid "dashboard.export-frames.title" -msgstr "Eksport sebagai PDF" +#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.your-penpot" +msgstr "Penpot anda" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-ok" +msgstr "Ok" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-title" +msgstr "Perhatian" + +#: src/app/main/ui/confirm.cljs +msgid "ds.component-subtitle" +msgstr "Komponen untuk dikemas kini:" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-cancel" +msgstr "Batal" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-ok" +msgstr "Ok" + +#: src/app/main/ui/confirm.cljs, src/app/main/ui/confirm.cljs +msgid "ds.confirm-title" +msgstr "Adakah anda pasti?" + +#: src/app/main/ui/auth/login.cljs +msgid "errors.auth-provider-not-configured" +msgstr "Pembekal pengesahan tidak dikonfigurasikan." + +msgid "errors.auth.unable-to-login" +msgstr "Nampaknya anda belum disahkan atau sesi telah tamat tempoh." + +msgid "errors.bad-font" +msgstr "Fon %s tidak dapat dimuatkan" + +msgid "errors.bad-font-plural" +msgstr "Fon %s tidak dapat dimuatkan" + +msgid "errors.cannot-upload" +msgstr "Tidak boleh memuat naik fail media." + +#: src/app/main/data/workspace.cljs +msgid "errors.clipboard-not-implemented" +msgstr "Pelayar anda tidak dapat melakukan operasi ini" + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs +msgid "errors.email-already-exists" +msgstr "E-mel sudah digunakan" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.email-already-validated" +msgstr "E-mel sudah disahkan." + +msgid "errors.email-as-password" +msgstr "Anda tidak boleh menggunakan e-mel sebagai kata laluan" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.email-has-permanent-bounces" +msgstr "E-mel «%s» mempunyai banyak laporan lantunan kekal." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs +msgid "errors.email-invalid" +msgstr "Sila masukkan e-mel yang sah" + +#: src/app/main/ui/settings/change_email.cljs +msgid "errors.email-invalid-confirmation" +msgstr "E-mel pengesahan mesti sepadan" + +msgid "errors.email-spam-or-permanent-bounces" +msgstr "E-mel «%s» telah dilaporkan sebagai spam atau melantun secara kekal." + +#: src/app/main/errors.cljs +msgid "errors.feature-mismatch" +msgstr "" +"Nampaknya anda sedang membuka fail yang mendayakan ciri '%s' tetapi versi " +"penpot semasa tidak menyokongnya atau menyahdayakannya." + +#: src/app/main/errors.cljs +msgid "errors.feature-not-supported" +msgstr "Ciri '%s' tidak disokong." + +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Nampaknya terdapat ketidakpadanan antara ciri yang didayakan dan ciri fail " +"yang anda cuba buka. Migrasi untuk '%s' perlu digunakan sebelum fail boleh " +"dibuka." + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.generic" +msgstr "Sesuatu yang tidak kena telah berlaku." + +#: src/app/main/ui/components/color_input.cljs +msgid "errors.invalid-color" +msgstr "Warna tidak sah" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.invite-invalid" +msgstr "Jemputan tidak sah" + +msgid "errors.invite-invalid.info" +msgstr "Jemputan ini mungkin dibatalkan atau mungkin tamat tempoh." + +#: src/app/main/ui/auth/login.cljs +msgid "errors.ldap-disabled" +msgstr "Pengesahan LDAP dilumpuhkan." + +#: src/app/main/errors.cljs +msgid "errors.max-quote-reached" +msgstr "Anda telah mencapai petikan '%s'. Hubungi sokongan." + +#: src/app/main/data/workspace/persistence.cljs +msgid "errors.media-too-large" +msgstr "Imej terlalu besar untuk dimasukkan." + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "errors.media-type-mismatch" +msgstr "Nampaknya kandungan imej tidak sepadan dengan sambungan fail." + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "errors.media-type-not-allowed" +msgstr "Nampaknya ini bukan imej yang sah." + +#: src/app/main/ui/dashboard/team.cljs +msgid "errors.member-is-muted" +msgstr "" +"Profil yang anda jemput mempunyai e-mel yang diredamkan (laporan spam atau " +"lantunan tinggi)." + +#: src/app/main/ui/settings/password.cljs +msgid "errors.password-invalid-confirmation" +msgstr "Kata laluan pengesahan mesti sepadan" + +#: src/app/main/ui/settings/password.cljs +msgid "errors.password-too-short" +msgstr "Kata laluan hendaklah sekurang-kurangnya 8 aksara" + +msgid "errors.paste-data-validation" +msgstr "Data tidak sah dalam papan klip" + +msgid "errors.profile-blocked" +msgstr "Profil disekat" + +#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.profile-is-muted" +msgstr "" +"Profil anda mempunyai e-mel yang diredamkan (laporan spam atau lantunan " +"tinggi)." + +#: src/app/main/ui/auth/register.cljs +msgid "errors.registration-disabled" +msgstr "Pendaftaran dilumpuhkan pada masa ini." + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Ciri tidak serasi '%s' dikesan" + +msgid "errors.team-leave.insufficient-members" +msgstr "" +"Ahli tidak mencukupi untuk meninggalkan pasukan, anda mungkin mahu " +"memadamkannya." + +msgid "errors.team-leave.member-does-not-exists" +msgstr "Ahli yang anda cuba tetapkan tidak wujud." + +msgid "errors.team-leave.owner-cant-leave" +msgstr "" +"Pemilik tidak boleh meninggalkan pasukan, anda mesti menetapkan semula " +"peranan pemilik." + +#: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "errors.unexpected-error" +msgstr "Ralat yang tidak dijangka berlaku." + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.unexpected-token" +msgstr "Token tidak diketahui" + +msgid "errors.validation" +msgstr "Ralat Pengesahan" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Fail mempunyai nombor versi yang tidak serasi" + +msgid "errors.webhooks.connection" +msgstr "Ralat sambungan, URL tidak dapat dicapai" + +msgid "errors.webhooks.invalid-uri" +msgstr "URL tidak lulus pengesahan." + +msgid "errors.webhooks.last-delivery" +msgstr "Penghantaran terakhir tidak berjaya." + +msgid "errors.webhooks.ssl-validation" +msgstr "Ralat pada pengesahan SSL." + +msgid "errors.webhooks.timeout" +msgstr "Masa tamat" + +msgid "errors.webhooks.unexpected" +msgstr "Ralat yang tidak dijangka semasa mengesahkan" + +msgid "errors.webhooks.unexpected-status" +msgstr "Status tidak dijangka %s" + +#: src/app/main/ui/auth/login.cljs +msgid "errors.wrong-credentials" +msgstr "E-mel atau kata laluan tidak betul." + +#: src/app/main/ui/settings/password.cljs +msgid "errors.wrong-old-password" +msgstr "Kata laluan lama tidak betul" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.description" +msgstr "Penerangan" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-go-to" +msgstr "Pergi ke forum Penpot" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-subtitle1" +msgstr "" +"Kami berbesar hati anda berada disini. Jika anda memerlukan bantuan, sila " +"cari sebelum anda menyiarkan siaran baharu." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-title" +msgstr "Komuniti Penpot" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subject" +msgstr "Subjek" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subtitle" +msgstr "" +"Sila terangkan sebab e-mel anda, nyatakan sama ada isu, idea atau keraguan. " +"Seorang ahli pasukan kami akan menjawab secepat mungkin." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.title" +msgstr "E-mel" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-go-to" +msgstr "Pergi ke Twitter" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-subtitle1" +msgstr "Kami di sini untuk membantu dengan pertanyaan teknikal anda." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-title" +msgstr "Akaun sokongan Twitter" + +#: src/app/main/ui/settings/password.cljs +msgid "generic.error" +msgstr "Ralat telah berlaku" + +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur" +msgstr "Kabur" + +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur.value" +msgstr "Nilai" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hex" +msgstr "HEX" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hsla" +msgstr "HSLA" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.rgba" +msgstr "RGBA" + +#: src/app/main/ui/inspect/attributes/fill.cljs +msgid "inspect.attributes.fill" +msgstr "Isi" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.download" +msgstr "Muat turun sumber gambar" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.height" +msgstr "Tinggi" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.width" +msgstr "Lebar" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout" +msgstr "Susun atur" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.height" +msgstr "Tinggi" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.left" +msgstr "kiri" + +#: src/app/main/ui/inspect/attributes/layout.cljs, src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.radius" +msgstr "Jejari" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.rotation" +msgstr "Putaran" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.top" +msgstr "Atas" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.width" +msgstr "Lebar" + +#: src/app/main/ui/inspect/attributes/shadow.cljs +msgid "inspect.attributes.shadow" +msgstr "Bayang" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.size" +msgstr "Ukuran dan kedudukan" + +#: src/app/main/ui/inspect/attributes/stroke.cljs +#, fuzzy +msgid "inspect.attributes.stroke" +msgstr "Gurisan" + +#, permanent +msgid "inspect.attributes.stroke.alignment.center" +msgstr "Tengah" + +#, permanent +msgid "inspect.attributes.stroke.alignment.inner" +msgstr "Dalam" + +#, permanent +msgid "inspect.attributes.stroke.alignment.outer" +msgstr "Luar" + +msgid "inspect.attributes.stroke.style.dotted" +msgstr "Bertitik" + +msgid "inspect.attributes.stroke.style.mixed" +msgstr "bercampur" + +msgid "inspect.attributes.stroke.style.none" +msgstr "Tiada" + +msgid "inspect.attributes.stroke.style.solid" +msgstr "Padu" + +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke.width" +msgstr "Lebar" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography" +msgstr "Tipografi" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-family" +msgstr "Keluarga Fon" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-size" +msgstr "Saiz huruf" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-style" +msgstr "Gaya Huruf" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-weight" +msgstr "Berat Huruf" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.letter-spacing" +msgstr "Jarak Huruf" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.line-height" +msgstr "Tinggi Garis" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-decoration" +msgstr "Hiasan Teks" + +msgid "inspect.attributes.typography.text-decoration.none" +msgstr "Tiada" + +msgid "inspect.attributes.typography.text-decoration.strikethrough" +msgstr "Tembus" + +msgid "inspect.attributes.typography.text-decoration.underline" +msgstr "Garis bawah" + +#: src/app/main/ui/inspect/attributes/text.cljs +#, fuzzy +msgid "inspect.attributes.typography.text-transform" +msgstr "Transformasian Teks" + +msgid "inspect.attributes.typography.text-transform.lowercase" +msgstr "Huruf Kecil" + +msgid "inspect.attributes.typography.text-transform.none" +msgstr "Tiada" + +msgid "inspect.attributes.typography.text-transform.titlecase" +msgstr "Huruf Tajuk" + +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Nyahset" + +msgid "inspect.attributes.typography.text-transform.uppercase" +msgstr "Huruf Besar" + +msgid "inspect.empty.help" +msgstr "" +"Jika anda ingin mengetahui lebih lanjut tentang pemeriksaan reka bentuk, " +"lawati pusat bantuan Penpot" + +#, fuzzy +msgid "inspect.empty.more-info" +msgstr "Maklumat lanjut tentang inspect" + +msgid "inspect.empty.select" +msgstr "Pilih bentuk, papan atau kumpulan untuk memeriksa sifat dan kod mereka" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code" +msgstr "Kod" + +msgid "inspect.tabs.code.selected.circle" +msgstr "Bulatan" + +msgid "inspect.tabs.code.selected.component" +msgstr "Komponen" + +msgid "inspect.tabs.code.selected.curve" +msgstr "Lengkung" + +msgid "inspect.tabs.code.selected.frame" +msgstr "Papan" + +msgid "inspect.tabs.code.selected.group" +msgstr "Kumpulan" + +msgid "inspect.tabs.code.selected.image" +msgstr "Gambar" + +msgid "inspect.tabs.code.selected.mask" +msgstr "Maska" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code.selected.multiple" +msgstr "%s Dipilih" + +msgid "inspect.tabs.code.selected.path" +msgstr "Laluan" + +msgid "inspect.tabs.code.selected.rect" +msgstr "Segi empat tepat" + +msgid "inspect.tabs.code.selected.svg-raw" +msgstr "SVG" + +msgid "inspect.tabs.code.selected.text" +msgstr "Teks" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.info" +msgstr "Maklumat" + +#: src/app/main/ui/workspace/header.cljs +msgid "label.shortcuts" +msgstr "Pintasan" + +msgid "labels.accept" +msgstr "Terima" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "Token capaian" + +msgid "labels.active" +msgstr "Aktif" + +msgid "labels.add-custom-font" +msgstr "Tambah fon tersuai" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.admin" +msgstr "Pentadbir" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.all" +msgstr "Semua" + +msgid "labels.and" +msgstr "dan" + +msgid "labels.back" +msgstr "Kembali" + +#: src/app/main/ui/static.cljs +msgid "labels.bad-gateway.desc-message" +msgstr "" +"Nampaknya anda perlu menunggu sebentar dan mencuba semula; kami sedang " +"melakukan penyelenggaraan kecil pelayan kami." + +#: src/app/main/ui/static.cljs +msgid "labels.bad-gateway.main-message" +msgstr "Ralat pelayan (Bad Gateway)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.cancel" +msgstr "Batal" + +msgid "labels.close" +msgstr "Tutup" + +#: src/app/main/ui/dashboard/comments.cljs +msgid "labels.comments" +msgstr "Komen" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.community" +msgstr "Komuniti" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.confirm-password" +msgstr "Sahkan kata laluan" + +msgid "labels.continue" +msgstr "Teruskan" + +msgid "labels.continue-with" +msgstr "Teruskan dengan" + +msgid "labels.continue-with-penpot" +msgstr "Anda boleh meneruskan dengan akaun Penpot" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.copy-invitation-link" +msgstr "Salin pautan" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "labels.create" +msgstr "Cipta" + +#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team" +msgstr "Cipta pasukan baharu" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team.placeholder" +msgstr "Masukkan nama pasukan baharu" + +msgid "labels.custom-fonts" +msgstr "Fon tersuai" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.dashboard" +msgstr "Papan pemuka" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete" +msgstr "Padam" + +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment" +msgstr "Padam komen" + +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment-thread" +msgstr "Padam bebenang" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.delete-invitation" +msgstr "Padam jemputan" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete-multi-files" +msgstr "Padam fail %s" + +msgid "labels.discard" +msgstr "Buang" + +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.drafts" +msgstr "Draf" + +#: src/app/main/ui/comments.cljs +msgid "labels.edit" +msgstr "Sunting" + +msgid "labels.edit-file" +msgstr "Sunting fail" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.editor" +msgstr "Penyunting" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.expired-invitation" +msgstr "Tamat tempoh" + +msgid "labels.export" +msgstr "Eksport" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-disabled" +msgstr "Maklum balas dilumpuhkan" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-sent" +msgstr "Maklum balas dihantar" + +msgid "labels.font-family" +msgstr "Keluarga Fon" + +msgid "labels.font-providers" +msgstr "Pembekal fon" + +msgid "labels.font-variants" +msgstr "Gaya" + +msgid "labels.fonts" +msgstr "Fon" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.github-repo" +msgstr "Repositori Github" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.give-feedback" +msgstr "Beri maklum balas" + +msgid "labels.go-back" +msgstr "Pergi balik" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.help-center" +msgstr "Pusat Bantuan" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.hide-resolved-comments" +msgstr "Sembunyikan komen yang diselesaikan" + +msgid "labels.inactive" +msgstr "tidak aktif" + +msgid "labels.installed-fonts" +msgstr "Fon yang dipasang" + +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.desc-message" +msgstr "" +"Sesuatu yang buruk telah berlaku. Sila cuba semula operasi dan jika masalah " +"berterusan, hubungi sokongan." + +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.main-message" +msgstr "Ralat Dalaman" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.invitations" +msgstr "Jemputan" + +#: src/app/main/ui/settings/options.cljs +msgid "labels.language" +msgstr "Bahasa" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.libraries-and-templates" +msgstr "Perpustakaan & Templat" + +msgid "labels.log-or-sign" +msgstr "Log masuk atau daftar" + +#: src/app/main/ui/settings.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.logout" +msgstr "Log keluar" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.member" +msgstr "Ahli" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.members" +msgstr "Ahli" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.new-password" +msgstr "Kata laluan baharu" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs +msgid "labels.no-comments-available" +msgstr "" +"Anda telah melihat semua yang baru! Pemberitahuan ulasan baharu akan " +"dipaparkan di sini." + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.no-invitations" +msgstr "Tiada jemputan tertunda." + +#: src/app/main/ui/dashboard/team.cljs +#, markdown +msgid "labels.no-invitations-hint" +msgstr "Klik butang **Jemput orang** untuk menjemput orang ke pasukan ini." + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.desc-message" +msgstr "" +"Halaman ini mungkin tidak wujud atau anda tiada kebenaran untuk " +"mengaksesnya." + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.main-message" +msgstr "Alamak!" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.num-of-files" +msgid_plural "labels.num-of-files" +msgstr[0] "%s fail" + +msgid "labels.num-of-frames" +msgid_plural "labels.num-of-frames" +msgstr[0] "%s papan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.num-of-projects" +msgid_plural "labels.num-of-projects" +msgstr[0] "%s projek" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.old-password" +msgstr "Kata laluan lama" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.only-yours" +msgstr "Hanya milik anda" + +msgid "labels.or" +msgstr "atau" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.owner" +msgstr "Pemilik" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.password" +msgstr "Kata laluan" + +#: src/app/main/ui/dashboard/team.cljs +#, fuzzy +msgid "labels.pending-invitation" +msgstr "Belum selesai" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.profile" +msgstr "Profil" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.projects" +msgstr "Projek" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.release-notes" +msgstr "Nota keluaran" + +#: src/app/main/ui/workspace.cljs +msgid "labels.reload-file" +msgstr "Muat semula fail" + +#: src/app/main/ui/workspace/libraries.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.remove" +msgstr "Alih keluar" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.remove-member" +msgstr "Buang ahli" + +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.rename" +msgstr "Namakan semula" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.rename-team" +msgstr "Namakan semula pasukan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.resend-invitation" +msgstr "Hantar semula jemputan" + +#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs +msgid "labels.retry" +msgstr "Cuba semula" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.role" +msgstr "Peranan" + +msgid "labels.save" +msgstr "Simpan" + +msgid "labels.search" +msgstr "Cari" + +msgid "labels.search-font" +msgstr "Cari fon" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.send" +msgstr "Hantar" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.sending" +msgstr "Menghantar…" + +#: src/app/main/ui/static.cljs +msgid "labels.service-unavailable.desc-message" +msgstr "Kami sedang menjalankan penyelenggaraan berjadual pada sistem kami." + +#: src/app/main/ui/static.cljs +msgid "labels.service-unavailable.main-message" +msgstr "Perkhidmatan Tidak Tersedia" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.settings" +msgstr "Tetapan" + +msgid "labels.share" +msgstr "Kongsi" + +msgid "labels.share-prototype" +msgstr "Kongsi prototaip" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.shared-libraries" +msgstr "Perpustakaan" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-all-comments" +msgstr "Paparkan semua komen" + +msgid "labels.show-comments-list" +msgstr "Paparkan senarai komen" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-your-comments" +msgstr "Paparkan komen anda sahaja" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.status" +msgstr "Status" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.tutorials" +msgstr "Tutorial" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.unpublish-multi-files" +msgstr "Nyahterbitkan %s fail" + +#: src/app/main/ui/settings/profile.cljs +msgid "labels.update" +msgstr "Kemas kini" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.update-team" +msgstr "Kemas kini pasukan" + +msgid "labels.upload" +msgstr "Muat naik" + +msgid "labels.upload-custom-fonts" +msgstr "Muat naik fon tersuai" + +msgid "labels.uploading" +msgstr "Memuat naik…" + +msgid "labels.view-only" +msgstr "LIHAT SAHAJA" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.viewer" +msgstr "Penonton" + +msgid "labels.webhooks" +msgstr "Cangkuk Web (Webhook)" + +#: src/app/main/ui/comments.cljs +msgid "labels.write-new-comment" +msgstr "Tulis komen baharu" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.you" +msgstr "(anda)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.your-account" +msgstr "Akaun anda" + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "media.loading" +msgstr "Memuatkan gambar…" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Pustaka anda kosong. Setelah ditambahkan sebagai Pustaka Dikongsi, aset " +"yang anda buat akan tersedia untuk digunakan antara fail anda yang lain. " +"Adakah anda pasti mahu menerbitkannya?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.accept" +msgstr "Tambah sebagai Pustaka Kongsi" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.hint" +msgstr "" +"Setelah ditambahkan sebagai Pustaka Kongsi, aset pustaka fail ini akan " +"tersedia untuk digunakan antara fail anda yang lain." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.message" +msgstr "Tambah “%s” sebagai Pustaka Kongsi" + +#: src/app/main/ui/workspace/nudge.cljs +#, fuzzy +msgid "modals.big-nudge" +msgstr "Anjakan besar" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.confirm-email" +msgstr "Sahkan e-mel baharu" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.info" +msgstr "" +"Kami akan menghantar e-mel ke e-mel semasa anda “%s” untuk pengesahan " +"identiti." + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.new-email" +msgstr "E-mel baharu" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.submit" +msgstr "Tukar e-mel" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.title" +msgstr "Tukar e-mel anda" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.copy-token" +msgstr "Salin token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.expiration-date.label" +msgstr "Tarikh tamat tempoh" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "Nama" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.placeholder" +msgstr "Nama boleh membantu untuk mengetahui token itu untuk apa" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "Cipta token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "Jana token capaian" + +msgid "modals.create-webhook.submit-label" +msgstr "Cipta cangkuk web (webhook)" + +msgid "modals.create-webhook.title" +msgstr "Cipta cangkuk web (webhook)" + +msgid "modals.create-webhook.url.label" +msgstr "URL muatan" + +msgid "modals.create-webhook.url.placeholder" +msgstr "https://example.com/postreceive" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "Padam token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.message" +msgstr "Adakah anda pasti mahu memadamkan token ini?" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "Padam token" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.cancel" +msgstr "Batal dan kekalkan akaun saya" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.confirm" +msgstr "Ya, padam akaun saya" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.info" +msgstr "" +"Dengan mengalih keluar akaun anda, anda akan kehilangan semua projek dan " +"arkib semasa anda." + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.title" +msgstr "Adakah anda pasti mahu memadam akaun anda?" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.accept" +msgstr "Padam perbualan" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.message" +msgstr "" +"Adakah anda pasti mahu memadamkan perbualan ini? Semua komen dalam urutan " +"ini akan dipadamkan." + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.title" +msgstr "Padam perbualan" + +msgid "modals.delete-component-annotation.message" +msgstr "Adakah anda pasti ingin memadamkan anotasi ini?" + +msgid "modals.delete-component-annotation.title" +msgstr "Padam anotasi" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.accept" +msgstr "Padam fail" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.message" +msgstr "Adakah anda pasti mahu memadamkan fail ini?" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.title" +msgstr "Memadam fail" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.accept" +msgstr "Padam fail" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.message" +msgstr "Adakah anda pasti mahu memadamkan %s fail?" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.title" +msgstr "Memadamkan %s fail" + +msgid "modals.delete-font-variant.message" +msgstr "" +"Adakah anda pasti mahu memadamkan gaya fon ini? Ia tidak akan dimuatkan " +"jika digunakan dalam fail." + +msgid "modals.delete-font-variant.title" +msgstr "Memadam gaya fon" + +msgid "modals.delete-font.message" +msgstr "" +"Adakah anda pasti mahu memadamkan fon ini? Ia tidak akan dimuatkan jika " +"digunakan dalam fail." + +msgid "modals.delete-font.title" +msgstr "Memadam fon" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.body" +msgstr "Adakah anda pasti mahu memadamkan halaman ini?" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.title" +msgstr "Padam halaman" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.accept" +msgstr "Padam projek" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.message" +msgstr "Adakah anda pasti mahu memadamkan projek ini?" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.title" +msgstr "Padam projek" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.accept" +msgid_plural "modals.delete-shared-confirm.accept" +msgstr[0] "Padam fail" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "Ia tidak diaktifkan dalam mana-mana fail." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.scd-message" +msgid_plural "modals.delete-shared-confirm.activated.scd-message" +msgstr[0] "Pustaka ini diaktifkan di sini: " + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.message" +msgid_plural "modals.delete-shared-confirm.message" +msgstr[0] "Adakah anda pasti mahu memadamkan fail ini?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.title" +msgid_plural "modals.delete-shared-confirm.title" +msgstr[0] "Memadam fail" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.accept" +msgstr "Padam pasukan" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.message" +msgstr "" +"Adakah anda pasti mahu memadamkan pasukan ini? Semua projek dan fail yang " +"dikaitkan dengan pasukan akan dipadamkan secara kekal." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.title" +msgstr "Memadam pasukan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.accept" +msgstr "Padam ahli" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.message" +msgstr "Adakah anda pasti mahu memadamkan ahli ini daripada pasukan?" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.title" +msgstr "Padam ahli pasukan" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "" +"Aset yang telah digunakan dalam fail ini akan kekal di sana (tiada reka " +"bentuk akan rosak)." + +msgid "modals.delete-webhook.accept" +msgstr "Padam cangkuk web (webhook)" + +msgid "modals.delete-webhook.message" +msgstr "Adakah anda pasti mahu memadamkan cangkuk web (webhook) ini?" + +msgid "modals.delete-webhook.title" +msgstr "Memadam cangkuk web (webhook)" + +msgid "modals.edit-webhook.submit-label" +msgstr "Sunting cangkuk web (webhook)" + +msgid "modals.edit-webhook.title" +msgstr "Sunting cangkuk web (webhook)" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-member-confirm.accept" +msgstr "Hantar jemputan" + +msgid "modals.invite-member.emails" +msgstr "E-mel, dipisahkan dengan koma" + +msgid "modals.invite-member.repeated-invitation" +msgstr "" +"Sesetengah e-mel adalah daripada ahli pasukan semasa. Jemputan mereka tidak " +"akan dihantar." + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-team-member.title" +msgstr "Jemput ahli ke pasukan" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.hint" +msgstr "" +"Memandangkan anda satu-satunya ahli pasukan, pasukan ini akan dipadamkan " +"bersama-sama dengan projek dan failnya." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.message" +msgstr "Adakah anda pasti mahu meninggalkan pasukan %s?" + +msgid "modals.leave-and-reassign.forbidden" +msgstr "" +"Anda tidak boleh meninggalkan pasukan jika tiada ahli lain untuk dinaikkan " +"pangkat kepada pemilik. Anda mungkin mahu memadamkan pasukan." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.hint1" +msgstr "" +"Anda adalah pemilik pasukan ini. Sila pilih ahli lain untuk dinaikkan " +"pangkat kepada pemilik sebelum anda pergi." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.promote-and-leave" +msgstr "Naik pangkat dan tinggalkan" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.select-member-to-promote" +msgstr "Pilih ahli untuk dinaikkan pangkat" + +#: src/app/main/ui/dashboard/sidebar.cljs +#, fuzzy +msgid "modals.leave-and-reassign.title" +msgstr "Sebelum anda pergi" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.accept" +msgstr "Tinggalkan pasukan" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.message" +msgstr "Adakah anda pasti mahu meninggalkan pasukan ini?" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.title" +msgstr "Meninggalkan pasukan" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.nudge-title" +msgstr "Jumlah anjakan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.accept" +msgstr "Pindah hak milik" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.hint" +msgstr "" +"Jika anda memindahkan pemilikan, anda akan menukar peranan anda kepada " +"Pentadbir, kehilangan beberapa kebenaran ke atas pasukan ini. " + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.message" +msgstr "" +"Anda adalah pemilik semasa pasukan ini. Adakah anda pasti mahu menjadikan " +"%s pemilik baharu pasukan?" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.title" +msgstr "Pemilik pasukan baru" + +msgid "modals.publish-empty-library.accept" +msgstr "Terbitkan" + +msgid "modals.publish-empty-library.message" +msgstr "Pustaka anda kosong. Adakah anda pasti mahu menerbitkannya?" + +msgid "modals.publish-empty-library.title" +msgstr "Terbitkan perpustakaan kosong" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.accept" +msgstr "Alih keluar sebagai Pustaka Kongsi" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.hint" +msgstr "" +"Setelah dialih keluar sebagai Pustaka Kongsi, Pustaka Fail fail ini akan " +"berhenti tersedia untuk digunakan di antara fail anda yang lain." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.message" +msgstr "Alih keluar \"%s\" sebagai Pustaka Kongsi" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.small-nudge" +msgstr "Anjakan kecil" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.accept" +msgid_plural "modals.unpublish-shared-confirm.accept" +msgstr[0] "Nyahterbit" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.activated.no-files-message" +msgid_plural "modals.unpublish-shared-confirm.activated.no-files-message" +msgstr[0] "Ia tidak diaktifkan dalam mana-mana fail." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.activated.scd-message" +msgid_plural "modals.unpublish-shared-confirm.activated.scd-message" +msgstr[0] "Perpustakaan ini diaktifkan di sini:" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.message" +msgid_plural "modals.unpublish-shared-confirm.message" +msgstr[0] "Adakah anda pasti mahu menyahterbitkan perpustakaan ini?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.title" +msgid_plural "modals.unpublish-shared-confirm.title" +msgstr[0] "Nyahterbit pustaka" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.hint" +msgstr "" +"Anda akan mengemas kini komponen dalam pustaka kongsi. Ini mungkin " +"menjejaskan fail lain yang menggunakannya." + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.message" +msgstr "Kemas kini komponen dalam pustaka kongsi" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.accept" +msgstr "Kemas kini" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.cancel" +msgstr "Batal" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.hint" +msgstr "" +"Anda akan mengemas kini komponen dalam pustaka kongsi. Ini mungkin " +"menjejaskan fail lain yang menggunakannya." + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.message" +msgstr "Kemas kini komponen dalam pustaka kongsi" + +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "Versi baharu tersedia, sila muat semula halaman" + +#: src/app/main/ui/dashboard/team.cljs +msgid "notifications.invitation-email-sent" +msgstr "Jemputan berjaya dihantar" + +#: src/app/main/ui/dashboard/team.cljs +msgid "notifications.invitation-link-copied" +msgstr "Pautan jemputan disalin" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "notifications.profile-deletion-not-allowed" +msgstr "" +"Anda tidak boleh memadamkan profil anda. Tetapkan semula pasukan anda " +"sebelum meneruskan." + +#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs +msgid "notifications.profile-saved" +msgstr "Profil berjaya disimpan!" + +#: src/app/main/ui/settings/change_email.cljs +msgid "notifications.validation-email-sent" +msgstr "E-mel pengesahan dihantar kepada %s. Semak e-mel anda!" + +msgid "onboarding-v2.before-start.desc1" +msgstr "" +"Anda harus tahu bahawa terdapat banyak sumber yang tersedia untuk membantu " +"anda bermula dengan Penpot, seperti Panduan Pengguna dan saluran Youtube " +"kami." + +msgid "onboarding-v2.before-start.desc2" +msgstr "" +"Maklumat terperinci tentang cara menggunakan Penpot. Daripada prototaip " +"kepada menyusun atau berkongsi reka bentuk." + +msgid "onboarding-v2.before-start.desc2.title" +msgstr "Panduan pengguna" + +msgid "onboarding-v2.before-start.desc3" +msgstr "" +"Anda boleh menonton tutorial kami dan tutorial yang dibuat oleh komuniti " +"kami." + +msgid "onboarding-v2.before-start.desc3.title" +msgstr "Video tutorial" + +msgid "onboarding-v2.before-start.title" +msgstr "Sebelum anda mula" + +msgid "onboarding-v2.newsletter.desc" +msgstr "" +"Langgan surat berita Penpot untuk mengikuti perkembangan dan berita " +"pembangunan produk." + +msgid "onboarding-v2.newsletter.news" +msgstr "" +"Hantar kepada saya berita tentang Penpot (siaran blog, tutorial video, " +"penstriman...)." + +msgid "onboarding-v2.newsletter.privacy1" +msgstr "Kami mengambil berat tentang privasi, di sini anda boleh membaca. " + +msgid "onboarding-v2.newsletter.privacy2" +msgstr "" +"Kami hanya akan menghantar e-mel yang berkaitan kepada anda. Anda boleh " +"berhenti melanggan pada bila-bila masa melalui pautan nyahlanggan dalam " +"mana-mana surat berita kami." + +msgid "onboarding-v2.newsletter.updates" +msgstr "Hantar kepada saya kemas kini produk (ciri baharu, keluaran, pembetulan...)." + +msgid "onboarding-v2.welcome.desc1" +msgstr "" +"Penpot ialah Sumber Terbuka dan ia dibuat oleh Kaleidos serta komuniti, di " +"mana ramai orang sudah membantu antara satu sama lain. Semua orang boleh " +"bekerjasama dengan:" + +msgid "onboarding-v2.welcome.desc2" +msgstr "" +"Ruang awam untuk belajar, berkongsi dan membincangkan tentang Penpot, masa " +"kini dan masa depannya dengan seluruh Komuniti dan pasukan teras Penpot." + +msgid "onboarding-v2.welcome.desc2.title" +msgstr "Mengambil bahagian dalam Komuniti" + +msgid "onboarding-v2.welcome.desc3" +msgstr "" +"Di mana anda akan menemui cara untuk bekerjasama dengan terjemahan, " +"permintaan ciri, sumbangan teras, pemburuan pepijat…" + +msgid "onboarding-v2.welcome.desc3.title" +msgstr "Panduan memberi sumbangan" + +msgid "onboarding-v2.welcome.title" +msgstr "Selamat datang ke Penpot!" + +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Teruskan mencipta pasukan" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Teruskan tanpa pasukan" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Buat pasukan & jemput" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Buat pasukan dan hantar jemputan" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Anda boleh menjemput kemudian" + +msgid "onboarding.choice.team-up.create-team-desc" +msgstr "" +"Selepas menamakan pasukan anda, anda akan dapat menjemput orang untuk " +"menyertai." + +msgid "onboarding.choice.team-up.create-team-placeholder" +msgstr "Masukkan nama pasukan" + +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Cipta pasukan" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Buat pasukan tanpa menjemput" + +msgid "onboarding.choice.team-up.invite-members" +msgstr "Jemput ahli" + +msgid "onboarding.choice.team-up.invite-members-info" +msgstr "" +"Ingat untuk memasukkan semua orang. Pemaju, pereka bentuk, pengurus... " +"kepelbagaian bertambah :)" + +msgid "onboarding.choice.team-up.roles" +msgstr "Jemput dengan peranan:" + +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Mulakan tanpa pasukan" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Anda boleh membuat pasukan kemudian." + +msgid "onboarding.newsletter.accept" +msgstr "Ya, langgan" + +msgid "onboarding.newsletter.acceptance-message" +msgstr "" +"Permintaan langganan anda telah dihantar, kami akan menghantar e-mel kepada " +"anda untuk mengesahkannya." + +msgid "onboarding.newsletter.policy" +msgstr "Dasar Privasi." + +msgid "onboarding.newsletter.title" +msgstr "Ingin menerima berita Penpot?" + +msgid "onboarding.team-modal.create-team" +msgstr "Cipta pasukan" + +msgid "onboarding.team-modal.create-team-desc" +msgstr "" +"Pasukan membolehkan anda bekerjasama dengan pengguna Penpot lain yang " +"bekerja dalam fail dan projek yang sama." + +msgid "onboarding.team-modal.create-team-feature-1" +msgstr "Fail dan projek tanpa had" + +msgid "onboarding.team-modal.create-team-feature-2" +msgstr "Edisi berbilang pemain" + +msgid "onboarding.team-modal.create-team-feature-3" +msgstr "Pengurusan peranan" + +msgid "onboarding.team-modal.create-team-feature-4" +msgstr "Ahli tanpa had" + +msgid "onboarding.team-modal.create-team-feature-5" +msgstr "100% percuma!" + +msgid "onboarding.templates.subtitle" +msgstr "Berikut adalah beberapa templat." + +msgid "onboarding.templates.title" +msgstr "Mula mereka bentuk" + +msgid "onboarding.welcome.alt" +msgstr "Penpot" + +#: src/app/main/ui/auth/recovery.cljs +msgid "profile.recovery.go-to-login" +msgstr "Pergi ke log masuk" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "Alat reka bentuk yang manakah anda mempunyai lebih banyak pengalaman?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "Banyak" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canva" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "Bagaimanakah cara terbaik anda menerangkan pengalaman anda bekerja pada..." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Pereka bentuk" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Pembangun" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "Ketahui lebih lanjut tentang Penpot" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Pengasas/VP" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Saya seorang pekerja bebas (freelancer)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Dapatkan kod daripada projek pasukan saya " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... reka bentuk antara muka, aset visual, sistem reka bentuk, dsb." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "InVision" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Tinggalkan maklum balas untuk projek pasukan saya" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "Mari mulakan!" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Pengurus Produk atau Projek" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Pemasaran" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "Lebih daripada 50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-a-tool" +msgstr "Saya tidak pernah menggunakan alat reka bentuk sebelum ini" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Seterusnya" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Tiada" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Lain-lain (nyatakan)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "Saya sedang menjalankan projek peribadi" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "Sebelumnya" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Bagaimanakah anda merancang untuk menggunakan Penpot?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Apakah peranan anda?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Pilih pilihan" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Sketch" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Beberapa" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Mula" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Mula mengerjakan projek saya" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Pelajar atau guru" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "Berapakah saiz pasukan anda?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Uji Penpot untuk melihat sama ada ia sesuai untuk pasukan " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Cuba sebelum menggunakan Penpot pada pelayar peribadi" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "... rangka wayar, perjalanan & aliran pengguna, pepohon navigasi, dsb." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Bekerja dalam idea konsep" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Maklum balas anda akan membantu kami memahami tabiat dan keutamaan anda " +"supaya kami boleh terus menjadikan Penpot sebagai alat yang berguna dan " +"menyeronokkan." + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +#, fuzzy +msgid "settings.detach" +msgstr "Tanggalkan" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "settings.multiple" +msgstr "Bercampur" + +# SECTIONS +msgid "shortcut-section.basics" +msgstr "Asas" + +msgid "shortcut-section.dashboard" +msgstr "Papan pemuka" + +msgid "shortcut-section.viewer" +msgstr "Penonton" + +msgid "shortcut-section.workspace" +msgstr "Ruang kerja" + +# SUBSECTIONS +msgid "shortcut-subsection.alignment" +msgstr "Penjajaran" + +msgid "shortcut-subsection.edit" +msgstr "Sunting" + +msgid "shortcut-subsection.general-dashboard" +msgstr "Generik" + +msgid "shortcut-subsection.general-viewer" +msgstr "Generik" + +msgid "shortcut-subsection.main-menu" +msgstr "Menu utama" + +msgid "shortcut-subsection.modify-layers" +msgstr "Ubah suai lapisan" + +msgid "shortcut-subsection.navigation-dashboard" +msgstr "Navigasi" + +msgid "shortcut-subsection.navigation-viewer" +msgstr "Navigasi" + +msgid "shortcut-subsection.navigation-workspace" +msgstr "Navigasi" + +msgid "shortcut-subsection.panels" +msgstr "Panel" + +msgid "shortcut-subsection.path-editor" +msgstr "laluan" + +msgid "shortcut-subsection.shape" +msgstr "Bentuk" + +msgid "shortcut-subsection.text-editor" +msgstr "Teks" + +msgid "shortcut-subsection.tools" +msgstr "Alatan" + +msgid "shortcut-subsection.zoom-viewer" +msgstr "Zum" + +msgid "shortcut-subsection.zoom-workspace" +msgstr "Zum" + +msgid "shortcuts.add-comment" +msgstr "Komen" + +msgid "shortcuts.add-node" +msgstr "Tambah nota" + +msgid "shortcuts.align-bottom" +msgstr "Sejajarkan bahagian bawah" + +msgid "shortcuts.align-center" +msgstr "Jajarkan tengah" + +msgid "shortcuts.align-hcenter" +msgstr "Jajarkan tengah secara mendatar" + +msgid "shortcuts.align-justify" +msgstr "Mengimbangkan keselarasan" + +msgid "shortcuts.align-left" +msgstr "Jajar ke kiri" + +msgid "shortcuts.align-right" +msgstr "Sejajar ke kanan" + +msgid "shortcuts.align-top" +msgstr "Jajarkan atas" + +msgid "shortcuts.align-vcenter" +msgstr "Jajarkan tengah secara menegak" + +msgid "shortcuts.artboard-selection" +msgstr "Cipta papan daripada pemilihan" + +msgid "shortcuts.bold" +msgstr "Togol tebal" + +msgid "shortcuts.bool-difference" +msgstr "Perbezaan Boolean" + +msgid "shortcuts.bool-exclude" +msgstr "Pengecualian Boolean" + +msgid "shortcuts.bool-intersection" +msgstr "Persimpangan Boolean" + +msgid "shortcuts.bool-union" +msgstr "Kesatuan Boolean" + +msgid "shortcuts.bring-back" +msgstr "Hantar ke paling belakang" + +msgid "shortcuts.bring-backward" +msgstr "Hantar ke belakang" + +msgid "shortcuts.bring-forward" +msgstr "Bawa ke hadapan" + +msgid "shortcuts.bring-front" +msgstr "Bawa ke paling hadapan" + +msgid "shortcuts.clear-undo" +msgstr "Kosongkan buat asal" + +msgid "shortcuts.copy" +msgstr "Salin" + +msgid "shortcuts.create-component" +msgstr "Cipta komponen" + +msgid "shortcuts.create-new-project" +msgstr "Buat baharu" + +msgid "shortcuts.cut" +msgstr "Potong" + +msgid "shortcuts.decrease-zoom" +msgstr "Zum keluar" + +msgid "shortcuts.delete" +msgstr "Padam" + +msgid "shortcuts.delete-node" +msgstr "Padamkan nod" + +msgid "shortcuts.detach-component" +msgstr "Tanggalkan komponen" + +msgid "shortcuts.draw-curve" +msgstr "Lengkung" + +msgid "shortcuts.draw-ellipse" +msgstr "elips" + +msgid "shortcuts.draw-frame" +msgstr "Papan" + +msgid "shortcuts.draw-nodes" +msgstr "Lukis laluan" + +msgid "shortcuts.draw-path" +msgstr "Laluan" + +msgid "shortcuts.draw-rect" +msgstr "Segi empat tepat" + +msgid "shortcuts.draw-text" +msgstr "Teks" + +msgid "shortcuts.duplicate" +msgstr "Pendua" + +msgid "shortcuts.escape" +msgstr "Batal" + +msgid "shortcuts.export-shapes" +msgstr "Eksport bentuk" + +msgid "shortcuts.fit-all" +msgstr "Zum untuk muat semua" + +msgid "shortcuts.flip-horizontal" +msgstr "Terbalikkan secara mendatar" + +msgid "shortcuts.flip-vertical" +msgstr "Terbalikkan secara menegak" + +msgid "shortcuts.font-size-dec" +msgstr "Kurangkan saiz fon" + +msgid "shortcuts.font-size-inc" +msgstr "Tambah saiz fon" + +msgid "shortcuts.go-to-drafts" +msgstr "Pergi ke draf" + +msgid "shortcuts.go-to-libs" +msgstr "Pergi ke perpustakaan kongsi" + +msgid "shortcuts.go-to-search" +msgstr "Cari" + +msgid "shortcuts.group" +msgstr "Kumpulan" + +msgid "shortcuts.h-distribute" +msgstr "Edarkan secara mendatar" + +msgid "shortcuts.hide-ui" +msgstr "Tunjukkan / Sembunyikan UI" + +msgid "shortcuts.increase-zoom" +msgstr "Zum kedalam" + +msgid "shortcuts.insert-image" +msgstr "Masukkan gambar" + +msgid "shortcuts.italic" +msgstr "Togol condong" + +msgid "shortcuts.join-nodes" +msgstr "Sambung nod" + +msgid "shortcuts.letter-spacing-dec" +msgstr "Kurangkan jarak huruf" + +msgid "shortcuts.letter-spacing-inc" +msgstr "Penambahan jarak huruf" diff --git a/frontend/translations/nl.po b/frontend/translations/nl.po index 3e7a9bc04..c2676f780 100644 --- a/frontend/translations/nl.po +++ b/frontend/translations/nl.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-12-29 21:08+0000\n" +"PO-Revision-Date: 2024-02-12 19:02+0000\n" "Last-Translator: Stephan Paternotte \n" -"Language-Team: Dutch \n" +"Language-Team: Dutch " +"\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -118,8 +118,7 @@ msgstr "Wachtwoord succesvol gewijzigd" #: src/app/main/ui/auth/recovery_request.cljs msgid "auth.notifications.profile-not-verified" -msgstr "" -"Profiel is niet geverifieerd. Verifieer het profiel voordat je verder gaat." +msgstr "Profiel is niet geverifieerd. Verifieer het profiel voordat je verder gaat." #: src/app/main/ui/auth/recovery_request.cljs msgid "auth.notifications.recovery-token-sent" @@ -189,6 +188,13 @@ msgstr "" "Met het aanmaken van een nieuw account ga je akkoord met onze " "gebruiksvoorwaarden en ons privacybeleid." +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Met het aanmaken van een nieuw account ga je akkoord met onze " +"[servicevoorwaarden] (%s) en [privacybeleid] (%s)." + #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "We hebben een verificatie-e-mail verzonden naar" @@ -285,8 +291,7 @@ msgstr "Praktische introductie" #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.walkthrough-hero.info" -msgstr "" -"Maak een rondleiding door Penpot en leer de belangrijkste functies kennen." +msgstr "Maak een rondleiding door Penpot en leer de belangrijkste functies kennen." #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.walkthrough-hero.start" @@ -310,8 +315,7 @@ msgstr "Toegangsbewijs is succesvol aangemaakt." #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.empty.add-one" -msgstr "" -"Klik op de knop \"Nieuw toegangsbewijs aanmaken\" om er een aan te maken." +msgstr "Klik op de knop \"Nieuw toegangsbewijs aanmaken\" om er een aan te maken." #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.empty.no-access-tokens" @@ -360,9 +364,9 @@ msgstr "Persoonlijke toegangsbewijzen" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.personal.description" msgstr "" -"Persoonlijke toegangsbewijzen functioneren als alternatief voor ons login/" -"wachtwoord-authenticatiesysteem en kunnen worden gebruikt om een applicatie " -"toegang te geven tot de interne Penpot API" +"Persoonlijke toegangsbewijzen functioneren als alternatief voor ons " +"login/wachtwoord-authenticatiesysteem en kunnen worden gebruikt om een " +"applicatie toegang te geven tot de interne Penpot API" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.token-will-expire" @@ -523,9 +527,9 @@ msgid "dashboard.fonts.hero-text2" msgstr "" "Je mag alleen lettertypen uploaden waarvan je de eigenaar bent of waarvoor " "je een licentie hebt om te gebruiken in Penpot. Lees meer in de sectie " -"Inhoudsrechten van [Penpot's Servicevoorwaarden](https://penpot.app/terms." -"html). Misschien wil je ook meer lezen over [lettertypelicenties](https://" -"www.typography.com/faq)." +"Inhoudsrechten van [Penpot's " +"Servicevoorwaarden](https://penpot.app/terms.html). Misschien wil je ook " +"meer lezen over [lettertypelicenties](https://www.typography.com/faq)." #: src/app/main/ui/dashboard/fonts.cljs msgid "dashboard.fonts.upload-all" @@ -546,6 +550,11 @@ msgstr "Importeer Penpot-bestanden" msgid "dashboard.import.analyze-error" msgstr "Oeps! We konden dit bestand niet importeren" +msgid "dashboard.import.analyze-error.components-v2" +msgstr "" +"Bestand met componenten v2 geactiveerd, maar dit team ondersteunt dit nog " +"niet." + msgid "dashboard.import.import-error" msgstr "" "Er is een probleem opgetreden bij het importeren van het bestand. Het " @@ -788,8 +797,7 @@ msgid "dashboard.webhooks.active" msgstr "Is actief" msgid "dashboard.webhooks.active.explain" -msgstr "" -"Wanneer deze hook wordt getriggerd, worden gebeurtenisdetails afgeleverd" +msgstr "Wanneer deze hook wordt getriggerd, worden gebeurtenisdetails afgeleverd" msgid "dashboard.webhooks.content-type" msgstr "Contenttype" @@ -865,7 +873,8 @@ msgstr "Authenticatie-provider niet geconfigureerd." msgid "errors.auth.unable-to-login" msgstr "" -"Het lijkt erop dat je niet geauthentiseerd bent of dat de sessie is verlopen." +"Het lijkt erop dat je niet geauthentiseerd bent of dat de sessie is " +"verlopen." msgid "errors.bad-font" msgstr "Het lettertype %s kon niet geladen worden" @@ -922,6 +931,14 @@ msgstr "" msgid "errors.feature-not-supported" msgstr "Functie '%s' wordt niet ondersteund." +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Het lijkt erop dat er een discrepantie bestaat tussen de ingeschakelde " +"functies en de functies van het bestand dat je probeert te openen. Er " +"moeten migraties voor '%s' worden toegepast voordat het bestand kan worden " +"geopend." + #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -974,6 +991,9 @@ msgstr "Bevestigingswachtwoord moet overeenkomen" msgid "errors.password-too-short" msgstr "Wachtwoord moet minimaal 8 tekens lang zijn" +msgid "errors.paste-data-validation" +msgstr "Ongeldige gegevens op klembord" + msgid "errors.profile-blocked" msgstr "Het profiel is geblokkeerd" @@ -987,6 +1007,10 @@ msgstr "Je profiel heeft e-mails gedempt (spammeldingen of hoge bounces)." msgid "errors.registration-disabled" msgstr "De registratie is momenteel uitgeschakeld." +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Incompatibele functie '%s' gedetecteerd" + msgid "errors.team-leave.insufficient-members" msgstr "" "Onvoldoende leden om het team te verlaten, je kunt dit team maar beter " @@ -1010,6 +1034,13 @@ msgstr "Er is een onverwachte fout opgetreden." msgid "errors.unexpected-token" msgstr "Onbekend bewijsstuk" +msgid "errors.validation" +msgstr "Validatiefout" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Bestand heeft een incompatibel versienummer" + msgid "errors.webhooks.connection" msgstr "Verbindingsfout, URL niet bereikbaar" @@ -1243,6 +1274,9 @@ msgstr "Geen" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "Beginhoofdletters" +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Uitschakelen" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "HOOFDLETTERS" @@ -1256,7 +1290,8 @@ msgstr "Meer info over inspecteren" msgid "inspect.empty.select" msgstr "" -"Selecteer een vorm, bord of groep om hun eigenschappen en code te inspecteren" +"Selecteer een vorm, bord of groep om hun eigenschappen en code te " +"inspecteren" #: src/app/main/ui/inspect/right_sidebar.cljs msgid "inspect.tabs.code" @@ -1546,7 +1581,8 @@ msgstr "Geen openstaande uitnodigingen." #: src/app/main/ui/dashboard/team.cljs msgid "labels.no-invitations-hint" msgstr "" -"Klik op de knop **Mensen uitnodigen** om mensen uit te nodigen voor dit team." +"Klik op de knop **Mensen uitnodigen** om mensen uit te nodigen voor dit " +"team." #: src/app/main/ui/static.cljs msgid "labels.not-found.desc-message" @@ -1647,6 +1683,9 @@ msgstr "Rol" msgid "labels.save" msgstr "Opslaan" +msgid "labels.search" +msgstr "Zoeken" + msgid "labels.search-font" msgstr "Lettertype zoeken" @@ -1671,6 +1710,9 @@ msgstr "Service niet beschikbaar" msgid "labels.settings" msgstr "Instellingen" +msgid "labels.share" +msgstr "Delen" + msgid "labels.share-prototype" msgstr "Prototype delen" @@ -1740,10 +1782,34 @@ msgstr "(jij)" msgid "labels.your-account" msgstr "Jouw account" +msgid "media.choose-image" +msgstr "Afbeelding kiezen" + +msgid "media.gradient" +msgstr "Verloop" + +msgid "media.image" +msgstr "Afbeelding" + +msgid "media.linear" +msgstr "Lineair" + #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Afbeelding laden…" +msgid "media.radial" +msgstr "Radiaal" + +msgid "media.solid" +msgstr "Solide" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Je bibliotheek is leeg. Eenmaal toegevoegd als Gedeelde Bibliotheek, zijn " +"de assets die je aanmaakt beschikbaar voor gebruik in de rest van je " +"bestanden. Weet je zeker dat je dit wilt publiceren??" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -1754,7 +1820,8 @@ msgstr "Toevoegen als gedeelde bibliotheek" msgid "modals.add-shared-confirm.hint" msgstr "" "Eenmaal toegevoegd als gedeelde bibliotheek, zijn de assets van deze " -"bestandsbibliotheek beschikbaar voor gebruik tussen de rest van je bestanden." +"bestandsbibliotheek beschikbaar voor gebruik tussen de rest van je " +"bestanden." #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs @@ -2029,8 +2096,8 @@ msgstr "E-mailadressen, kommagescheiden" msgid "modals.invite-member.repeated-invitation" msgstr "" -"Sommige e-mailadressen zijn van bestaande teamleden. Zij krijgen geen nieuwe " -"uitnodigingen." +"Sommige e-mailadressen zijn van bestaande teamleden. Zij krijgen geen " +"nieuwe uitnodigingen." #: src/app/main/ui/dashboard/team.cljs msgid "modals.invite-team-member.title" @@ -2147,10 +2214,10 @@ msgstr[1] "Publicaties ongedaan maken" #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.message" msgid_plural "modals.unpublish-shared-confirm.message" -msgstr[0] "" -"Weet je zeker dat je de publicatie van deze bibliotheek ongedaan wilt maken?" +msgstr[0] "Weet je zeker dat je de publicatie van deze bibliotheek ongedaan wilt maken?" msgstr[1] "" -"Weet je zeker dat je de publicatie van deze bibliotheken ongedaan wilt maken?" +"Weet je zeker dat je de publicatie van deze bibliotheken ongedaan wilt " +"maken?" #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs @@ -2249,16 +2316,15 @@ msgstr "" "voortgang van de productontwikkeling en nieuws." msgid "onboarding-v2.newsletter.news" -msgstr "" -"Stuur mij nieuws over Penpot (blogposts, video-introducties, streamings…)." +msgstr "Stuur mij nieuws over Penpot (blogposts, video-introducties, streamings…)." msgid "onboarding-v2.newsletter.privacy1" msgstr "Wij geven om privacy, lees hier onze " msgid "onboarding-v2.newsletter.privacy2" msgstr "" -"We sturen je alleen relevante e-mails. Je kunt je op elk moment afmelden via " -"de afmeldlink in al onze nieuwsbrieven." +"We sturen je alleen relevante e-mails. Je kunt je op elk moment afmelden " +"via de afmeldlink in al onze nieuwsbrieven." msgid "onboarding-v2.newsletter.updates" msgstr "Stuur mij productnieuws (nieuwe functies, releases, correcties…)." @@ -2287,6 +2353,21 @@ msgstr "Bijdragen" msgid "onboarding-v2.welcome.title" msgstr "Welkom bij Penpot!" +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Doorgaan met team aanmaken" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Doorgaan zonder team" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Team aanmaken & uitnodigen" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Team aanmaken en uitnodigingen versturen" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Je kunt later uitnodigen" + msgid "onboarding.choice.team-up.create-team-desc" msgstr "" "Nadat je je team een naam hebt gegeven, kun je mensen uitnodigen om lid te " @@ -2295,6 +2376,12 @@ msgstr "" msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "Voer de naam van het team in" +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Team aanmaken" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Team aanmaken zonder uitnodigingen" + msgid "onboarding.choice.team-up.invite-members" msgstr "Leden uitnodigen" @@ -2306,6 +2393,12 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Uitnodigen met rol:" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Zonder team beginnen" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Je kunt later een team samenstellen." + msgid "onboarding.newsletter.accept" msgstr "Ja, abonneren" @@ -2524,6 +2617,10 @@ msgstr "" "Jouw feedback helpt ons te begrijpen wat je gewoonten en voorkeuren zijn, " "zodat we van Penpot een nuttig en plezierig hulpmiddel kunnen blijven maken." +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Ontkoppelen" + #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, @@ -2980,6 +3077,9 @@ msgstr "Linialen tonen/verbergen" msgid "shortcuts.toggle-textpalette" msgstr "Tekstpalet in/uitschakelen" +msgid "shortcuts.toggle-theme" +msgstr "Thema veranderen" + msgid "shortcuts.toggle-visibility" msgstr "Tonen/verbergen" @@ -3315,6 +3415,45 @@ msgstr "Tekst transformeren" msgid "workspace.assets.ungroup" msgstr "Groep opheffen" +msgid "workspace.context-menu.grid-cells.area" +msgstr "Gebied aanmaken" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Bord aanmaken" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Cellen samenvoegen" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Rechts 1 kolom toevoegen" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Links 1 kolom toevoegen" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Kolom verwijderen" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Kolom en vormen verwijderen" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Kolom dupliceren" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Onder 1 rij toevoegen" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Boven 1 rij toevoegen" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Rij verwijderen" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Rij en vormen verwijderen" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Rij dupliceren" + msgid "workspace.focus.focus-mode" msgstr "Focusmodus" @@ -3438,6 +3577,12 @@ msgstr "Linialen tonen" msgid "workspace.header.menu.show-textpalette" msgstr "Lettertype-palet tonen" +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Donker thema inschakelen" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "Licht thema inschakelen" + msgid "workspace.header.menu.undo" msgstr "Ongedaan maken" @@ -3489,9 +3634,21 @@ msgstr "Volledig scherm" msgid "workspace.header.zoom-selected" msgstr "Naar selectie zoomen" +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Raster bewerken" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Sluiten" + msgid "workspace.layout_grid.editor.title" msgstr "Raster bewerken" +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Klaar" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Lokaliseren" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Toevoegen" @@ -3562,6 +3719,10 @@ msgstr "BIBLIOTHEEK" msgid "workspace.libraries.library-updates" msgstr "BIBLIOTHEEK-UPDATES" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Laden…" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "Er zijn geen gedeelde bibliotheken die moeten worden bijgewerkt" @@ -3636,12 +3797,24 @@ msgstr "Component" msgid "workspace.options.component.annotation" msgstr "Aantekening" +msgid "workspace.options.component.copy" +msgstr "Kopiëren" + msgid "workspace.options.component.create-annotation" msgstr "Aantekening maken" msgid "workspace.options.component.edit-annotation" msgstr "Aantekening bewerken" +msgid "workspace.options.component.main" +msgstr "Hoofd" + +msgid "workspace.options.component.swap" +msgstr "Component uitwisselen" + +msgid "workspace.options.component.swap.empty" +msgstr "Er zijn nog geen assets in deze bibliotheek" + #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Beperkingen" @@ -3735,6 +3908,10 @@ msgstr "Vullen" msgid "workspace.options.flows.add-flow-start" msgstr "Stroomdiagram-startpunt toevoegen" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Stroomdiagram" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "Stroomdiagram-startpunt" @@ -3838,6 +4015,9 @@ msgstr "Groep vullen" msgid "workspace.options.group-stroke" msgstr "Groep-streek" +msgid "workspace.options.guides.title" +msgstr "Hulplijnen" + msgid "workspace.options.height" msgstr "Hoogte" @@ -4386,14 +4566,26 @@ msgstr "Streek" msgid "workspace.options.stroke-cap.circle-marker" msgstr "Cirkelmarkering" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Cirkel" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "Ruitmarkering" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Ruit" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "Lijn-pijl" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Pijl" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "Geen" @@ -4410,10 +4602,18 @@ msgstr "Vierkant" msgid "workspace.options.stroke-cap.square-marker" msgstr "Vierkantmarkering" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Rechthoek" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "Driehoek-pijl" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Driehoek" + msgid "workspace.options.stroke-color" msgstr "Streekkleur" @@ -4543,8 +4743,7 @@ msgstr "HOOFDLETTERS" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.use-play-button" -msgstr "" -"Gebruik de afspeelknop in de koptekst om de prototypeweergave uit te voeren." +msgstr "Gebruik de afspeelknop in de koptekst om de prototypeweergave uit te voeren." msgid "workspace.options.width" msgstr "Breedte" @@ -4885,6 +5084,13 @@ msgstr "Tekst (%s)" msgid "workspace.toolbar.text-palette" msgstr "Typografie (%s)" +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "** Inspectiemodus ** (alleen bekijken)" + +msgid "workspace.top-bar.read-only.done" +msgstr "Klaar" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Er zijn tot nu toe geen wijzigingen in de geschiedenis" @@ -5018,153 +5224,3 @@ msgstr "Bijwerken" msgid "workspace.viewport.click-to-close-path" msgstr "Klik om het pad te sluiten" - -msgid "workspace.options.component.copy" -msgstr "Kopiëren" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Rechthoek" - -msgid "workspace.options.component.main" -msgstr "Hoofd" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Ruit" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Ontkoppelen" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Driehoek" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Pijl" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Je bibliotheek is leeg. Eenmaal toegevoegd als Gedeelde Bibliotheek, zijn de " -"assets die je aanmaakt beschikbaar voor gebruik in de rest van je bestanden. " -"Weet je zeker dat je dit wilt publiceren??" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Cirkel" - -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Doorgaan met team aanmaken" - -msgid "workspace.options.guides.title" -msgstr "Hulplijnen" - -msgid "media.choose-image" -msgstr "Afbeelding kiezen" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Met het aanmaken van een nieuw account ga je akkoord met onze " -"[servicevoorwaarden] (%s) en [privacybeleid] (%s)." - -msgid "workspace.options.component.swap.empty" -msgstr "Er zijn nog geen assets in deze bibliotheek" - -msgid "media.solid" -msgstr "Solide" - -msgid "workspace.top-bar.read-only.done" -msgstr "Klaar" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Team aanmaken & uitnodigen" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Klaar" - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Doorgaan zonder team" - -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Uitschakelen" - -msgid "errors.validation" -msgstr "Validatiefout" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Sluiten" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Bestand heeft een incompatibel versienummer" - -msgid "workspace.options.component.swap" -msgstr "Component uitwisselen" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Team aanmaken zonder uitnodigingen" - -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Het lijkt erop dat er een discrepantie bestaat tussen de ingeschakelde " -"functies en de functies van het bestand dat je probeert te openen. Er moeten " -"migraties voor '%s' worden toegepast voordat het bestand kan worden geopend." - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Team aanmaken" - -msgid "media.linear" -msgstr "Lineair" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Stroomdiagram" - -msgid "labels.search" -msgstr "Zoeken" - -msgid "media.image" -msgstr "Afbeelding" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Je kunt later een team samenstellen." - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Team aanmaken en uitnodigingen versturen" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Lokaliseren" - -msgid "media.gradient" -msgstr "Verloop" - -msgid "labels.share" -msgstr "Delen" - -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Raster bewerken" - -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Zonder team beginnen" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Je kunt later uitnodigen" - -msgid "media.radial" -msgstr "Radiaal" - -msgid "errors.paste-data-validation" -msgstr "Ongeldige gegevens op klembord" - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Incompatibele functie '%s' gedetecteerd" - -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "** Inspectiemodus ** (alleen bekijken)" diff --git a/frontend/translations/pt_PT.po b/frontend/translations/pt_PT.po index 3bd8735be..da48c8ece 100644 --- a/frontend/translations/pt_PT.po +++ b/frontend/translations/pt_PT.po @@ -1,15 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-12-29 21:08+0000\n" +"PO-Revision-Date: 2024-04-20 23:07+0000\n" "Last-Translator: TheScientistPT \n" -"Language-Team: Portuguese (Portugal) \n" +"Language-Team: Portuguese (Portugal) " +"\n" "Language: pt_PT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -176,6 +176,13 @@ msgstr "" "Ao criar uma nova conta, concordas com os nossos termos de serviço e " "política de privacidade." +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Ao criar uma nova conta, concordas com os nossos [termos de serviço](%s) e " +"[política de privacidade](%s)." + #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "Enviámos um email de verificação para" @@ -343,9 +350,9 @@ msgstr "Tokens de acesso pessoais" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.personal.description" msgstr "" -"Os tokens de acesso pessoais funcionam como uma alternativa ao nosso sistema " -"de autenticação de login/palavra-passe e podem ser usados para permitir que " -"uma aplicação tenha acesso à API interna do Penpot" +"Os tokens de acesso pessoais funcionam como uma alternativa ao nosso " +"sistema de autenticação de login/palavra-passe e podem ser usados para " +"permitir que uma aplicação tenha acesso à API interna do Penpot" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.token-will-expire" @@ -398,9 +405,9 @@ msgstr "Duplicar %s ficheiros" #: src/app/main/ui/dashboard/grid.cljs msgid "dashboard.empty-placeholder-drafts" msgstr "" -"Oh não! Ainda não tens ficheiros! Se quiseres experimentar podes começar " -"com os nossos templates em [Libraries & " -"templates](https://penpot.app/libraries-templates.html)." +"Os ficheiros adicionados às Bibliotecas irão aparecer aqui. Experimenta " +"adicionar os teus ficheiros ou experimenta algumas das nossas [Bibliotecas " +"e templates](https://penpot.app/libraries-templates.html)." msgid "dashboard.export-binary-multi" msgstr "Descarrega %s ficheiros Penpot (.penpot)" @@ -529,9 +536,19 @@ msgstr "Importar ficheiros Penpot" msgid "dashboard.import.analyze-error" msgstr "Oops! Não conseguimos importar este ficheiro" +msgid "dashboard.import.analyze-error.components-v2" +msgstr "" +"Ficheiro exportado com componentes v2 mas a equipa atual ainda não os " +"suporta." + msgid "dashboard.import.import-error" msgstr "Ocorreu um problema na importação do ficheiro. O ficheiro não foi importado." +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "1 ficheiro foi importado com sucesso." +msgstr[1] "%s ficheiros foram importados com sucesso." + msgid "dashboard.import.import-warning" msgstr "Alguns ficheiros continham objetos inválidos que foram removidos." @@ -693,10 +710,22 @@ msgstr "Selecionar tema" msgid "dashboard.show-all-files" msgstr "Mostrar todos os ficheiros" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-delete-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "O teu ficheiro foi apagado com sucesso" +msgstr[1] "Os teus ficheiros foram apagados com sucesso" + #: src/app/main/ui/dashboard/project_menu.cljs msgid "dashboard.success-delete-project" msgstr "O teu projeto foi eliminado com sucesso" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-duplicate-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "O teu ficheiro foi duplicado com sucesso" +msgstr[1] "Os teus ficheiros foram duplicados com sucesso" + #: src/app/main/ui/dashboard/project_menu.cljs msgid "dashboard.success-duplicate-project" msgstr "O teu projeto foi duplicado com sucesso" @@ -882,6 +911,13 @@ msgstr "" msgid "errors.feature-not-supported" msgstr "A funcionalidade '%s' não é suportada." +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Parece que existem discrepâncias entre as funcionalidades ativadas e as " +"funcionalidades do ficheiro que estás a tentar abrir. Será necessário " +"aplicar migrações para '%s' antes de poder abrir o ficheiro." + #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -932,6 +968,9 @@ msgstr "A palavra-passe de confirmação tem de corresponder" msgid "errors.password-too-short" msgstr "A palavra-passe deverá conter no mínimo 8 caracteres" +msgid "errors.paste-data-validation" +msgstr "Dados inválidos na área de transferência" + msgid "errors.profile-blocked" msgstr "O perfil está bloqueado" @@ -947,6 +986,10 @@ msgstr "" msgid "errors.registration-disabled" msgstr "A criação de contas está atualmente desativada." +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Funcionalidade incompatível '%s' detetada" + msgid "errors.team-leave.insufficient-members" msgstr "Membros insuficientes para deixar a equipa, provavelmente queres eliminá-la." @@ -968,6 +1011,13 @@ msgstr "Ocorreu um erro inesperado." msgid "errors.unexpected-token" msgstr "Token desconhecido" +msgid "errors.validation" +msgstr "Erro de validação" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "O ficheiro tem um número de versão incompatível" + msgid "errors.webhooks.connection" msgstr "Erro de conexão, não foi possível alcançar o URL" @@ -1202,6 +1252,9 @@ msgstr "Nenhum" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "Capitalização de Título" +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Sem atribuição" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Maiúsculas" @@ -1606,6 +1659,9 @@ msgstr "Cargo" msgid "labels.save" msgstr "Salvar" +msgid "labels.search" +msgstr "Pesquisar" + msgid "labels.search-font" msgstr "Pesquisar font" @@ -1630,6 +1686,9 @@ msgstr "Serviço Indisponível" msgid "labels.settings" msgstr "Definições" +msgid "labels.share" +msgstr "Partilhar" + msgid "labels.share-prototype" msgstr "Partilhar protótipo" @@ -1699,10 +1758,35 @@ msgstr "(tu)" msgid "labels.your-account" msgstr "A tua conta" +msgid "media.choose-image" +msgstr "Escolher imagem" + +msgid "media.gradient" +msgstr "Gradiente" + +msgid "media.image" +msgstr "Imagem" + +msgid "media.linear" +msgstr "Linear" + #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "A carregar imagem…" +msgid "media.radial" +msgstr "Radial" + +msgid "media.solid" +msgstr "Sólido" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"A tua biblioteca está vazia. Assim que ela seja adicionada como uma " +"biblioteca partilhada, os recursos que criares nela estarão disponíveis " +"para serem usados nos teus outros ficheiros. Tens a certeza que queres " +"publicá-la?" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -2090,6 +2174,12 @@ msgstr "Remover \"%s\" como Biblioteca Partilhada" msgid "modals.small-nudge" msgstr "Pequeno deslocamento" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.accept" +msgid_plural "modals.unpublish-shared-confirm.accept" +msgstr[0] "Cancelar publicação" +msgstr[1] "Cancelar publicações" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.message" @@ -2234,12 +2324,33 @@ msgstr "Guia de Contribuição" msgid "onboarding-v2.welcome.title" msgstr "Bem-vindo ao Penpot!" +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Continuar criação de equipa" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Continuar sem equipa" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Criar equipa e convidar" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Criar equipa e enviar convites" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Poderás enviar convites mais tarde" + msgid "onboarding.choice.team-up.create-team-desc" msgstr "Depois de nomeares a tua equipa, poderás convidar pessoas para entrar." msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "Escreve o nome da equipa" +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Criar equipa" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Criar equipa sem convidar" + msgid "onboarding.choice.team-up.invite-members" msgstr "Convida membros" @@ -2251,6 +2362,12 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Convidar com a função:" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Começar sem equipa" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Poderás criar uma equipa mais tarde." + msgid "onboarding.newsletter.accept" msgstr "Sim, subscreve" @@ -2468,6 +2585,10 @@ msgstr "" "preferências para que possamos continuar a tornar o Penpot numa ferramenta " "fácil e divertida de usar." +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Desacoplar" + #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, @@ -2924,6 +3045,9 @@ msgstr "Mostrar/ocultar regras" msgid "shortcuts.toggle-textpalette" msgstr "Alternar paleta de texto" +msgid "shortcuts.toggle-theme" +msgstr "Mudar tema" + msgid "shortcuts.toggle-visibility" msgstr "Mostrar / Ocultar" @@ -3261,6 +3385,45 @@ msgstr "Transformar Texto" msgid "workspace.assets.ungroup" msgstr "Desagrupar" +msgid "workspace.context-menu.grid-cells.area" +msgstr "Criar área" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Criar prancheta" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Unir células" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Adicionar 1 coluna à direita" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Adicionar 1 coluna à esquerda" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Eliminar coluna" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Apagar coluna e conteúdos" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Duplicar coluna" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Adicionar 1 fila abaixo" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Adicionar 1 fila acima" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Apagar fila" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Apagar fila e conteúdos" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Duplicar fila" + msgid "workspace.focus.focus-mode" msgstr "Modo de foco" @@ -3384,6 +3547,12 @@ msgstr "Mostrar regras" msgid "workspace.header.menu.show-textpalette" msgstr "Mostrar paleta de texto" +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Alterar para tema escuro" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "Mudar para tema claro" + msgid "workspace.header.menu.undo" msgstr "Desfazer" @@ -3435,9 +3604,21 @@ msgstr "Tela cheia" msgid "workspace.header.zoom-selected" msgstr "Aumentar para seleção" +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Editar grelha" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Sair" + msgid "workspace.layout_grid.editor.title" msgstr "A editar grelha" +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Feito" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Localizar" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Adicionar" @@ -3508,6 +3689,10 @@ msgstr "BIBLIOTECA" msgid "workspace.libraries.library-updates" msgstr "ATUALIZAÇÕES DE BIBLIOTECAS" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "A carregar…" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "Não há bibliotecas partilhadas que precisem de atualização" @@ -3582,12 +3767,24 @@ msgstr "Componente" msgid "workspace.options.component.annotation" msgstr "Nota" +msgid "workspace.options.component.copy" +msgstr "Cópia" + msgid "workspace.options.component.create-annotation" msgstr "Criar uma nota" msgid "workspace.options.component.edit-annotation" msgstr "Editar uma nota" +msgid "workspace.options.component.main" +msgstr "Principal" + +msgid "workspace.options.component.swap" +msgstr "Trocar de componente" + +msgid "workspace.options.component.swap.empty" +msgstr "Ainda não existem recursos nesta biblioteca" + #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Restrições" @@ -3681,6 +3878,10 @@ msgstr "Preenchimento" msgid "workspace.options.flows.add-flow-start" msgstr "Adicionar início de fluxo" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Fluxo" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "Início de fluxo" @@ -3784,6 +3985,9 @@ msgstr "Preenchimento de grupo" msgid "workspace.options.group-stroke" msgstr "Traço de grupo" +msgid "workspace.options.guides.title" +msgstr "Guias" + msgid "workspace.options.height" msgstr "Altura" @@ -4332,14 +4536,26 @@ msgstr "Traço" msgid "workspace.options.stroke-cap.circle-marker" msgstr "Marcador circular" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Círculo" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "Marcador em diamante" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Diamante" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "Seta de linha" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Seta" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "Nenhum" @@ -4356,10 +4572,18 @@ msgstr "Quadrado" msgid "workspace.options.stroke-cap.square-marker" msgstr "Marcador quadrado" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Retângulo" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "Seta triangular" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Triângulo" + msgid "workspace.options.stroke-color" msgstr "Cor do traço" @@ -4832,6 +5056,13 @@ msgstr "Texto (%s)" msgid "workspace.toolbar.text-palette" msgstr "Tipografias (%s)" +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**Modo de inspeção** (Somente leitura)" + +msgid "workspace.top-bar.read-only.done" +msgstr "Feito" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Não há histórico de mudanças até agora" @@ -5014,176 +5245,3 @@ msgstr "Clica para fechar o caminho" #~ msgid "workspace.options.layout.direction.left" #~ msgstr "Linha" - -msgid "workspace.options.component.copy" -msgstr "Cópia" - -msgid "dashboard.import.import-message" -msgid_plural "dashboard.import.import-message" -msgstr[0] "1 ficheiro foi importado com sucesso." -msgstr[1] "%s ficheiros foram importados com sucesso." - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.accept" -msgid_plural "modals.unpublish-shared-confirm.accept" -msgstr[0] "Cancelar publicação" -msgstr[1] "Cancelar publicações" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Retângulo" - -msgid "workspace.options.component.main" -msgstr "Principal" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Diamante" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Desacoplar" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Triângulo" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Seta" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"A tua biblioteca está vazia. Assim que ela seja adicionada como uma " -"biblioteca partilhada, os recursos que criares nela estarão disponíveis para " -"serem usados nos teus outros ficheiros. Tens a certeza que queres publicá-la?" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Círculo" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-delete-file" -msgid_plural "dashboard.success-delete-file" -msgstr[0] "O teu ficheiro foi apagado com sucesso" -msgstr[1] "Os teus ficheiros foram apagados com sucesso" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-duplicate-file" -msgid_plural "dashboard.success-delete-file" -msgstr[0] "O teu ficheiro foi duplicado com sucesso" -msgstr[1] "Os teus ficheiros foram duplicados com sucesso" - -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Continuar criação de equipa" - -msgid "workspace.options.guides.title" -msgstr "Guias" - -msgid "media.choose-image" -msgstr "Escolher imagem" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Ao criar uma nova conta, concordas com os nossos [termos de serviço](%s) e [" -"política de privacidade](%s)." - -msgid "workspace.options.component.swap.empty" -msgstr "Ainda não existem recursos nesta biblioteca" - -msgid "media.solid" -msgstr "Sólido" - -msgid "workspace.top-bar.read-only.done" -msgstr "Feito" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Criar equipa e convidar" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Feito" - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Continuar sem equipa" - -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Sem atribuição" - -msgid "errors.validation" -msgstr "Erro de validação" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Sair" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "O ficheiro tem um número de versão incompatível" - -msgid "workspace.options.component.swap" -msgstr "Trocar de componente" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Criar equipa sem convidar" - -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Parece que existem discrepâncias entre as funcionalidades ativadas e as " -"funcionalidades do ficheiro que estás a tentar abrir. Será necessário " -"aplicar migrações para '%s' antes de poder abrir o ficheiro." - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Criar equipa" - -msgid "media.linear" -msgstr "Linear" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Fluxo" - -msgid "labels.search" -msgstr "Pesquisar" - -msgid "media.image" -msgstr "Imagem" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Poderás criar uma equipa mais tarde." - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Criar equipa e enviar convites" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Localizar" - -msgid "media.gradient" -msgstr "Gradiente" - -msgid "labels.share" -msgstr "Partilhar" - -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Editar grelha" - -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Começar sem equipa" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Poderás enviar convites mais tarde" - -msgid "media.radial" -msgstr "Radial" - -msgid "errors.paste-data-validation" -msgstr "Dados inválidos na área de transferência" - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Funcionalidade incompatível '%s' detetada" - -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Modo de inspeção** (Somente leitura)" diff --git a/frontend/translations/ro.po b/frontend/translations/ro.po index 232fc9a6c..ee3aa0aa9 100644 --- a/frontend/translations/ro.po +++ b/frontend/translations/ro.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2023-10-10 10:01+0000\n" "Last-Translator: AlexTECPlayz \n" -"Language-Team: Romanian \n" +"Language-Team: Romanian " +"\n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -539,6 +539,12 @@ msgstr "Hopa! Nu am putut importa acest fișier" msgid "dashboard.import.import-error" msgstr "A apărut o problemă la importul fișierului. Fișierul nu a fost importat." +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "1 fișier a fost importat cu succes." +msgstr[1] "% fișiere au fost importate cu succes." +msgstr[2] "% de fișiere au fost importate cu succes." + msgid "dashboard.import.import-warning" msgstr "Unele fișiere conțineau obiecte nevalide care au fost eliminate." @@ -1731,6 +1737,12 @@ msgstr "Contul tău" msgid "media.loading" msgstr "Încarcă imaginea…" +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Biblioteca dumneavoastră este goală. Odată adăugate ca bibliotecă " +"partajată, obiectele pe care le creați vor fi disponibile pentru a fi " +"utilizate în celelalte fișiere. Sunteți sigur că doriți să o publicați?" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -2508,6 +2520,10 @@ msgstr "" "preferințele dvs. pentru a putea continua să facem Penpot o unealtă " "folositoare și plăcută." +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Detașați" + #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, @@ -3621,12 +3637,18 @@ msgstr "Componentă" msgid "workspace.options.component.annotation" msgstr "Notă" +msgid "workspace.options.component.copy" +msgstr "Copiați" + msgid "workspace.options.component.create-annotation" msgstr "Creați o notă" msgid "workspace.options.component.edit-annotation" msgstr "Editați o notă" +msgid "workspace.options.component.main" +msgstr "Principal" + #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Constrângeri" @@ -4370,14 +4392,26 @@ msgstr "Contur" msgid "workspace.options.stroke-cap.circle-marker" msgstr "Marcator cerc" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Cerc" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "Marcator diamant" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Diamant" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "Săgeată linie" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Săgeată" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "Nimic" @@ -4394,10 +4428,18 @@ msgstr "Pătrat" msgid "workspace.options.stroke-cap.square-marker" msgstr "Marcator pătrat" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Dreptunghi" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "Săgeată triunghi" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Triunghi" + msgid "workspace.options.stroke-color" msgstr "Culoare contur" @@ -5001,45 +5043,3 @@ msgstr "Actualizează" msgid "workspace.viewport.click-to-close-path" msgstr "Click pentru a închide calea" - -msgid "dashboard.import.import-message" -msgid_plural "dashboard.import.import-message" -msgstr[0] "1 fișier a fost importat cu succes." -msgstr[1] "% fișiere au fost importate cu succes." -msgstr[2] "% de fișiere au fost importate cu succes." - -msgid "workspace.options.component.copy" -msgstr "Copiați" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Dreptunghi" - -msgid "workspace.options.component.main" -msgstr "Principal" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Diamant" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Detașați" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Triunghi" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Săgeată" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Biblioteca dumneavoastră este goală. Odată adăugate ca bibliotecă partajată, " -"obiectele pe care le creați vor fi disponibile pentru a fi utilizate în " -"celelalte fișiere. Sunteți sigur că doriți să o publicați?" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Cerc" diff --git a/frontend/translations/ru.po b/frontend/translations/ru.po index 5a68e36df..f76e5ff25 100644 --- a/frontend/translations/ru.po +++ b/frontend/translations/ru.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-01-23 15:01+0000\n" "Last-Translator: Stas Haas \n" -"Language-Team: Russian \n" +"Language-Team: Russian " +"\n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -262,6 +262,26 @@ msgstr "Начать тур" msgid "dasboard.walkthrough-hero.title" msgstr "Руководство по интерфейсу" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "180 дней" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "30 дней" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "60 дней" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "90 дней" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "Никогда" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "dashboard.add-shared" @@ -2544,6 +2564,9 @@ msgstr "Заливка для группы" msgid "workspace.options.group-stroke" msgstr "Обводка для группы" +msgid "workspace.options.guides.title" +msgstr "Направляющие" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interactions" msgstr "Интерактив" @@ -3009,26 +3032,3 @@ msgstr "Обновить" msgid "workspace.viewport.click-to-close-path" msgstr "Нажмите для замыкания контура" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-90-days" -msgstr "90 дней" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-never" -msgstr "Никогда" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "180 дней" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "30 дней" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-60-days" -msgstr "60 дней" - -msgid "workspace.options.guides.title" -msgstr "Направляющие" diff --git a/frontend/translations/tr.po b/frontend/translations/tr.po index f1ef022f9..647a720bf 100644 --- a/frontend/translations/tr.po +++ b/frontend/translations/tr.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-01-28 11:01+0000\n" +"PO-Revision-Date: 2024-02-10 15:02+0000\n" "Last-Translator: Oğuz Ersen \n" -"Language-Team: Turkish \n" +"Language-Team: Turkish " +"\n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -84,6 +84,14 @@ msgstr "LDAP" msgid "auth.login-with-oidc-submit" msgstr "OpenID" +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "İsim boşluk dışında bir karakter içermelidir." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "İsim en fazla 250 karakter içermelidir." + #: src/app/main/ui/auth/recovery.cljs msgid "auth.new-password" msgstr "Yeni bir parola gir" @@ -116,6 +124,10 @@ msgstr "Parola" msgid "auth.password-length-hint" msgstr "En az 8 karakter" +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "Parola boşluk dışında bir karakter içermelidir." + msgid "auth.privacy-policy" msgstr "Gizlilik politikası" @@ -164,10 +176,21 @@ msgstr "" "Bir hesap oluştururken, koşullarımızı ve gizlilik politikamızı kabul etmiş " "sayılırsınız." +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Bir hesap oluştururken, [koşullarımızı](%s) ve [gizlilik politikamızı](%s) " +"kabul etmiş sayılırsınız." + #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "Onay e-postanı şu adrese gönderdik" +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...marka çalışması, çizimler, pazarlama materyalleri, vb." + msgid "common.publish" msgstr "Yayınla" @@ -266,6 +289,81 @@ msgstr "Gezintiyi başlat" msgid "dasboard.walkthrough-hero.title" msgstr "Arayüz İncelemesi" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.copied-success" +msgstr "Belirteç kopyalandı" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "Yeni belirteç oluştur" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "Erişim belirteci başarıyla oluşturuldu." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "Bir belirteç oluşturmak için \"Yeni belirteç oluştur\" düğmesine basın." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "Şu ana kadar hiç belirteciniz yok." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "İsim gereklidir" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "180 gün" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "30 gün" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "60 gün" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "90 gün" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "Asla" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "%s tarihinde sona erdi" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "%s tarihinde sona eriyor" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.no-expiration" +msgstr "Süresiz" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "Kişisel erişim belirteçleri" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"Kişisel erişim belirteçleri, oturum açma/parola kimlik doğrulama " +"sistemimize alternatif olarak işlev görür ve bir uygulamanın dahili Penpot " +"API'sine erişmesine izin vermek için kullanılabilir" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "Belirtecin süresi %s tarihinde sona erecek" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "Belirtecin sona erme tarihi yok" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "dashboard.add-shared" @@ -409,10 +507,10 @@ msgstr[1] "%s yazı tipi eklendi" msgid "dashboard.fonts.hero-text1" msgstr "" "Buraya yüklediğiniz herhangi bir web yazı tipi, bu takımın dosyalarının " -"metin özelliklerinde bulunan yazı tipi ailesi listesine eklenecek. Aynı yazı " -"tipi ailesi adına sahip yazı tipleri, **tek yazı tipi ailesi** olarak " -"gruplandırılacak. Yazı tiplerini şu biçimlerde yükleyebilirsiniz: **TTF, OTF " -"ve WOFF** (yalnızca bir tane gerekli olacak)." +"metin özelliklerinde bulunan yazı tipi ailesi listesine eklenecek. Aynı " +"yazı tipi ailesi adına sahip yazı tipleri, **tek yazı tipi ailesi** olarak " +"gruplandırılacak. Yazı tiplerini şu biçimlerde yükleyebilirsiniz: **TTF, " +"OTF ve WOFF** (yalnızca bir tane gerekli olacak)." msgid "dashboard.fonts.hero-text2" msgstr "" @@ -427,15 +525,35 @@ msgstr "" msgid "dashboard.fonts.upload-all" msgstr "Tümünü karşıya yükle" +#, markdown +msgid "dashboard.fonts.warning-text" +msgstr "" +"İşletim sistemlerinin farklı dikey metriklerine ilişkin olarak yazı " +"tiplerinizde olası bir sorun tespit ettik. Bu durumu kontrol etmek için " +"[bunun gibi](https://vertical-metrics.netlify.app/) yazı tipi dikey metrik " +"hizmetlerini kullanabilirsiniz. Ayrıca web yazı tipleri oluşturmak ve " +"hataları düzeltmek için [Transfonter](https://transfonter.org/) " +"kullanmanızı öneririz. " + msgid "dashboard.import" msgstr "Penpot dosyalarını içe aktar" msgid "dashboard.import.analyze-error" msgstr "Oops! Bu dosyayı içeri aktaramadık" +msgid "dashboard.import.analyze-error.components-v2" +msgstr "" +"Bileşenler v2 ile dosya etkinleştirildi ancak bu takım henüz bunu " +"desteklemiyor." + msgid "dashboard.import.import-error" msgstr "Dosya içeri aktarılırken bir sorun oluştu. Dosya içeri aktarılmadı." +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "1 dosya başarıyla içeri aktarıldı." +msgstr[1] "%s dosya başarıyla içeri aktarıldı." + msgid "dashboard.import.import-warning" msgstr "Bazı dosyalar kaldırılmış geçersiz nesneler içeriyordu." @@ -595,10 +713,22 @@ msgstr "Tema seç" msgid "dashboard.show-all-files" msgstr "Tüm dosyaları göster" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-delete-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "Dosyanız başarıyla silindi" +msgstr[1] "Dosyalarınız başarıyla silindi" + #: src/app/main/ui/dashboard/project_menu.cljs msgid "dashboard.success-delete-project" msgstr "Projeniz başarıyla silindi" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-duplicate-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "Dosyanız başarıyla kopyalandı" +msgstr[1] "Dosyalarınız başarıyla kopyalandı" + #: src/app/main/ui/dashboard/project_menu.cljs msgid "dashboard.success-duplicate-project" msgstr "Projenin kopyası başarıyla oluşturuldu" @@ -738,6 +868,9 @@ msgstr "%s yazı tipi yüklenemedi" msgid "errors.bad-font-plural" msgstr "%s yazı tipleri yüklenemedi" +msgid "errors.cannot-upload" +msgstr "Medya dosyası yüklenemedi." + #: src/app/main/data/workspace.cljs msgid "errors.clipboard-not-implemented" msgstr "Tarayıcın bu işlemi gerçekleştiremiyor" @@ -783,6 +916,13 @@ msgstr "" msgid "errors.feature-not-supported" msgstr "'%s' özelliği desteklenmiyor." +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Etkinleştirilen özellikler ile açmaya çalıştığınız dosyanın özellikleri " +"arasında bir uyumsuzluk var gibi görünüyor. Dosyanın açılabilmesi için önce " +"'%s' için geçişlerin uygulanması gerekiyor." + #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -833,6 +973,9 @@ msgstr "Parolalar eşleşmedi" msgid "errors.password-too-short" msgstr "Parola en az 8 karakterden oluşmalı" +msgid "errors.paste-data-validation" +msgstr "Panoda geçersiz veri" + msgid "errors.profile-blocked" msgstr "Profil engellendi" @@ -848,6 +991,10 @@ msgstr "" msgid "errors.registration-disabled" msgstr "Kayıt olma şu anda devre dışı." +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Uyumsuz '%s' özelliği algılandı" + msgid "errors.team-leave.insufficient-members" msgstr "Takımdan ayrılmak için yeterli üye yok, onu silmek isteyebilirsiniz." @@ -867,6 +1014,13 @@ msgstr "Beklenmedik bir hata oluştu." msgid "errors.unexpected-token" msgstr "Bilinmeyen jeton" +msgid "errors.validation" +msgstr "Doğrulama Hatası" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Dosyanın uyumsuz bir sürüm numarası var" + msgid "errors.webhooks.connection" msgstr "Bağlantı hatası, URL'ye erişilemiyor" @@ -1062,6 +1216,10 @@ msgstr "Yazı Tipi Boyutu" msgid "inspect.attributes.typography.font-style" msgstr "Yazı Tipi Biçimi" +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-weight" +msgstr "Yazı Tipi Kalınlığı" + #: src/app/main/ui/inspect/attributes/text.cljs msgid "inspect.attributes.typography.letter-spacing" msgstr "Harf Aralığı" @@ -1096,6 +1254,9 @@ msgstr "Hiçbiri" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "İlk Harfleri Büyük" +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Ayarlanmadı" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Büyük Harf" @@ -1164,6 +1325,10 @@ msgstr "Kısayollar" msgid "labels.accept" msgstr "Kabul et" +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "Erişim belirteçleri" + msgid "labels.active" msgstr "Etkin" @@ -1267,6 +1432,9 @@ msgstr "Daveti sil" msgid "labels.delete-multi-files" msgstr "%s dosyayı sil" +msgid "labels.discard" +msgstr "At" + #: src/app/main/ui/dashboard/projects.cljs, #: src/app/main/ui/dashboard/sidebar.cljs, #: src/app/main/ui/dashboard/files.cljs, @@ -1496,6 +1664,9 @@ msgstr "Rol" msgid "labels.save" msgstr "Kaydet" +msgid "labels.search" +msgstr "Ara" + msgid "labels.search-font" msgstr "Yazı tipi ara" @@ -1520,6 +1691,9 @@ msgstr "Hizmet Kullanılamıyor" msgid "labels.settings" msgstr "Ayarlar" +msgid "labels.share" +msgstr "Paylaş" + #: src/app/main/ui/viewer/header.cljs, src/app/main/ui/viewer/header.cljs msgid "labels.share-prototype" msgstr "Prototipi paylaş" @@ -1590,10 +1764,34 @@ msgstr "(siz)" msgid "labels.your-account" msgstr "Hesabınız" +msgid "media.choose-image" +msgstr "Görsel seç" + +msgid "media.gradient" +msgstr "Değişim" + +msgid "media.image" +msgstr "Görsel" + +msgid "media.linear" +msgstr "Doğrusal" + #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Görsel yükleniyor…" +msgid "media.radial" +msgstr "Işınsal" + +msgid "media.solid" +msgstr "Katı" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Kütüphaneniz boş. Paylaşılan Kütüphane olarak eklendiğinde, oluşturduğunuz " +"varlıklar diğer dosyalarınız arasında kullanılabilir olacak. Yayınlamak " +"istediğinizden emin misiniz?" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -1637,6 +1835,30 @@ msgstr "E-postayı değiştir" msgid "modals.change-email.title" msgstr "E-postanızı değiştirin" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.copy-token" +msgstr "Belirteci kopyala" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.expiration-date.label" +msgstr "Sona erme tarihi" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "İsim" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.placeholder" +msgstr "Adı, belirtecin ne için olduğunu bilmenize yardımcı olabilir" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "Belirteç oluştur" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "Erişim belirteci oluştur" + msgid "modals.create-webhook.submit-label" msgstr "Web kancası oluştur" @@ -1649,6 +1871,18 @@ msgstr "Yük URL'si" msgid "modals.create-webhook.url.placeholder" msgstr "https://example.com/postreceive" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "Belirteci sil" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.message" +msgstr "Bu belirteci silmek istediğinizden emin misiniz?" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "Belirteci sil" + #: src/app/main/ui/settings/delete_account.cljs msgid "modals.delete-account.cancel" msgstr "İptal et ve hesabımı koru" @@ -1679,6 +1913,12 @@ msgstr "" msgid "modals.delete-comment-thread.title" msgstr "Konuşmayı sil" +msgid "modals.delete-component-annotation.message" +msgstr "Bu açıklamayı silmek istediğinize emin misiniz?" + +msgid "modals.delete-component-annotation.title" +msgstr "Açıklamayı sil" + #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-file-confirm.accept" msgstr "Dosyayı sil" @@ -1746,6 +1986,18 @@ msgid_plural "modals.delete-shared-confirm.accept" msgstr[0] "Dosyayı sil" msgstr[1] "Dosyaları sil" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "Hiçbir dosyada etkinleştirilmedi." +msgstr[1] "Hiçbir dosyada etkinleştirilmediler." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.scd-message" +msgid_plural "modals.delete-shared-confirm.activated.scd-message" +msgstr[0] "Bu kütüphane burada etkinleştirildi: " +msgstr[1] "Bu kütüphaneler burada etkinleştirildiler: " + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-shared-confirm.message" @@ -1786,6 +2038,16 @@ msgstr "Bu üyeyi takımdan silmek istediğinden emin misin?" msgid "modals.delete-team-member-confirm.title" msgstr "Takım üyesini sil" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "" +"Bu dosyada daha önce kullanılmış olan varlıklar orada kalmaya devam edecek " +"(hiçbir tasarım bozulmayacak)." +msgstr[1] "" +"Bu dosyalarda daha önce kullanılmış olan varlıklar orada kalmaya devam " +"edecek (hiçbir tasarım bozulmayacak)." + msgid "modals.delete-webhook.accept" msgstr "Web kancasını sil" @@ -1808,6 +2070,11 @@ msgstr "Davet gönder" msgid "modals.invite-member.emails" msgstr "E-posta adresleri, virgülle ayrılmış" +msgid "modals.invite-member.repeated-invitation" +msgstr "" +"Bazı e-posta adresleri mevcut takım üyelerine aittir. Davetleri " +"gönderilmeyecektir." + #: src/app/main/ui/dashboard/team.cljs msgid "modals.invite-team-member.title" msgstr "Üyeleri takıma davet et" @@ -1881,7 +2148,16 @@ msgstr "" msgid "modals.promote-owner-confirm.title" msgstr "Yeni takım sahibi" -#: src/app/main/ui/workspace/header.cljs, +msgid "modals.publish-empty-library.accept" +msgstr "Yayınla" + +msgid "modals.publish-empty-library.message" +msgstr "Kütüphaneniz boş. Yine de yayınlamak istediğinizden emin misiniz?" + +msgid "modals.publish-empty-library.title" +msgstr "Boş kütüphaneyi yayınla" + +#: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.remove-shared-confirm.accept" msgstr "Paylaşılan Kütüphane olarak kaldır" @@ -1902,6 +2178,12 @@ msgstr "“%s” Paylaşılan Kütüphanesini Kaldır" msgid "modals.small-nudge" msgstr "Küçük dürtme" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.accept" +msgid_plural "modals.unpublish-shared-confirm.accept" +msgstr[0] "Yayından kaldır" +msgstr[1] "Yayından kaldır" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.message" @@ -1950,6 +2232,10 @@ msgstr "" msgid "modals.update-remote-component.message" msgstr "Paylaşılmış bir kütüphanede bir bileşen güncelle" +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "Yeni bir sürüm mevcut, lütfen sayfayı yenileyin" + #: src/app/main/ui/dashboard/team.cljs msgid "notifications.invitation-email-sent" msgstr "Davet başarıyla iletildi" @@ -2039,12 +2325,33 @@ msgstr "Katkıda bulunma kılavuzu" msgid "onboarding-v2.welcome.title" msgstr "Penpot'a hoş geldiniz!" +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Takım oluşturmaya devam edin" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Takım olmadan devam edin" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Takım oluşturun ve davet edin" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Takım oluşturun ve davet gönderin" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Daha sonra davet edebileceksiniz" + msgid "onboarding.choice.team-up.create-team-desc" msgstr "Takımınızı adlandırdıktan sonra, insanları katılmaya davet edebileceksiniz." msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "Takımın adını girin" +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Takım oluşturun" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Davet etmeden takım oluşturun" + msgid "onboarding.choice.team-up.invite-members" msgstr "Üyeleri davet edin" @@ -2056,6 +2363,12 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Rol ile davet et:" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Takım olmadan başlayın" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Daha sonra bir takım oluşturabileceksiniz." + msgid "onboarding.newsletter.accept" msgstr "Evet, abone ol" @@ -2104,6 +2417,179 @@ msgstr "Penpot" msgid "profile.recovery.go-to-login" msgstr "Oturum açmaya git" +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "Hangi tasarım aracını daha iyi kullanıyorsunuz?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "Çok fazla" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canva" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "... üzerinde çalışma deneyiminizi en iyi nasıl tarif edersiniz?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Tasarımcı" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Geliştirici" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "Penpot'u daha fazla keşfedin" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Kurucu/Başkan Yardımcısı" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Serbest çalışıyorum" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Takım projemin kodunu al " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... kullanıcı arayüzü tasarımı, görsel öğeler, tasarım sistemleri, vb." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "InVision" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Takımımın projesi için geri bildirim bırakın" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "Haydi başlayalım!" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Ürün veya Proje yöneticisi" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Pazarlama" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "50'den fazla" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Sonraki" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Hiçbiri" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Diğer (lütfen belirtiniz)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "Kendi projem üzerinde çalışıyorum" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "Önceki" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Penpot'u nasıl kullanmayı planlıyorsunuz?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Göreviniz nedir?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Bir seçenek belirleyin" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Sketch" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Biraz" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Başla" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Projem üzerinde çalışmaya başla" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Öğrenci veya öğretmen" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "Takımınızın büyüklüğü nedir?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Penpot'un takımınız için uygun olup olmadığını görmek için test edin " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Penpot'u fiziksel bir sunucuda kullanmadan önce deneyin" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "" +"... taslak çizimler, kullanıcı deneyimi yol haritası ve akışları, gezinme " +"menüsü, vb." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Konsept fikirler üzerinde çalışmak" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Geri bildiriminiz, Penpot'u kullanışlı ve eğlenceli bir araç haline " +"getirmeye devam edebilmemiz için alışkanlıklarınızı ve tercihlerinizi " +"anlamamıza yardımcı olacaktır." + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Çıkar" + #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, @@ -2163,6 +2649,9 @@ msgstr "Yollar" msgid "shortcut-subsection.shape" msgstr "Şekiller" +msgid "shortcut-subsection.text-editor" +msgstr "Metinler" + msgid "shortcut-subsection.tools" msgstr "Araçlar" @@ -2181,9 +2670,15 @@ msgstr "Düğüm ekle" msgid "shortcuts.align-bottom" msgstr "Alta hizala" +msgid "shortcuts.align-center" +msgstr "Ortala" + msgid "shortcuts.align-hcenter" msgstr "Ortayı yatay olarak hizala" +msgid "shortcuts.align-justify" +msgstr "İki yana yasla" + msgid "shortcuts.align-left" msgstr "Sola hizala" @@ -2199,6 +2694,9 @@ msgstr "Ortayı dikey olarak hizala" msgid "shortcuts.artboard-selection" msgstr "Seçimden çalışma yüzeyi oluştur" +msgid "shortcuts.bold" +msgstr "Kalın yazı aç/kapat" + msgid "shortcuts.bool-difference" msgstr "Boole farkı" @@ -2289,6 +2787,12 @@ msgstr "Yatay olarak çevir" msgid "shortcuts.flip-vertical" msgstr "Dikey olarak çevir" +msgid "shortcuts.font-size-dec" +msgstr "Yazı boyutunu azalt" + +msgid "shortcuts.font-size-inc" +msgstr "Yazı boyutunu artır" + msgid "shortcuts.go-to-drafts" msgstr "Taslaklara git" @@ -2313,9 +2817,27 @@ msgstr "Yakınlaştır" msgid "shortcuts.insert-image" msgstr "Görsel ekle" +msgid "shortcuts.italic" +msgstr "İtalik yazı aç/kapat" + msgid "shortcuts.join-nodes" msgstr "Düğümlere katıl" +msgid "shortcuts.letter-spacing-dec" +msgstr "Harf aralığını azalt" + +msgid "shortcuts.letter-spacing-inc" +msgstr "Harf aralığını artır" + +msgid "shortcuts.line-height-dec" +msgstr "Satır yüksekliğini azalt" + +msgid "shortcuts.line-height-inc" +msgstr "Satır yüksekliğini artır" + +msgid "shortcuts.line-through" +msgstr "Üstü çizili yazı aç/kapat" + msgid "shortcuts.make-corner" msgstr "Köşe yap" @@ -2436,6 +2958,15 @@ msgstr "Kısayolları ara" msgid "shortcuts.select-all" msgstr "Tümünü seç" +msgid "shortcuts.select-next" +msgstr "Sonraki katmanı seç" + +msgid "shortcuts.select-parent-layer" +msgstr "Ana katmanı seç" + +msgid "shortcuts.select-prev" +msgstr "Önceki katmanı seç" + msgid "shortcuts.separate-nodes" msgstr "Düğümleri ayır" @@ -2460,6 +2991,18 @@ msgstr "Ölçüme başla" msgid "shortcuts.stop-measure" msgstr "Ölçümü durdur" +msgid "shortcuts.text-align-center" +msgstr "Ortaya hizala" + +msgid "shortcuts.text-align-justify" +msgstr "İki yana yasla" + +msgid "shortcuts.text-align-left" +msgstr "Sola hizala" + +msgid "shortcuts.text-align-right" +msgstr "Sağa hizala" + msgid "shortcuts.thumbnail-set" msgstr "Küçük resimleri ayarla" @@ -2503,9 +3046,18 @@ msgstr "Cetvelleri göster/gizle" msgid "shortcuts.toggle-textpalette" msgstr "Metin paletini değiştir" +msgid "shortcuts.toggle-theme" +msgstr "Temayı değiştir" + +msgid "shortcuts.toggle-visibility" +msgstr "Göster / Gizle" + msgid "shortcuts.toggle-zoom-style" msgstr "Yakınlaştırma şeklini değiştir" +msgid "shortcuts.underline" +msgstr "Alt çizgiyi aç/kapat" + msgid "shortcuts.undo" msgstr "Geri al" @@ -2518,9 +3070,19 @@ msgstr "Maskelemeyi kaldır" msgid "shortcuts.v-distribute" msgstr "Dikey olarak dağıt" +msgid "shortcuts.zoom-lense-decrease" +msgstr "Görüntüyü küçült" + +msgid "shortcuts.zoom-lense-increase" +msgstr "Görüntüyü büyült" + msgid "shortcuts.zoom-selected" msgstr "Seçilene yakınlaştır" +#: src/app/main/ui/dashboard/team.cljs +msgid "team.webhooks.max-length" +msgstr "Webhook adı en fazla 2048 karakter içermelidir." + #: src/app/main/ui/dashboard/files.cljs msgid "title.dashboard.files" msgstr "%s - Penpot" @@ -2549,6 +3111,10 @@ msgstr "Paylaşılmış Kütüphaneler - %s - Penpot" msgid "title.default" msgstr "Penpot - Takımlar için Özgür Tasarım" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "Profil - Erişim belirteçleri" + #: src/app/main/ui/settings/feedback.cljs msgid "title.settings.feedback" msgstr "Geri bildirimde bulun - Penpot" @@ -2713,6 +3279,9 @@ msgstr "Sil" msgid "workspace.assets.duplicate" msgstr "Çoğalt" +msgid "workspace.assets.duplicate-main" +msgstr "Ana bileşeni çoğalt" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.edit" @@ -2742,6 +3311,9 @@ msgstr "yerel kütüphane" msgid "workspace.assets.not-found" msgstr "Varlık bulunmadı" +msgid "workspace.assets.open-library" +msgstr "Kütüphane dosyasını aç" + #: src/app/main/ui/workspace/sidebar/sitemap.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs @@ -2762,6 +3334,10 @@ msgid_plural "workspace.assets.selected-count" msgstr[0] "%s öge seçildi" msgstr[1] "%s öge seçildi" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "Paylaşılan kütüphane" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" @@ -2808,6 +3384,45 @@ msgstr "Metin Dönüşümü" msgid "workspace.assets.ungroup" msgstr "Grubu dağıt" +msgid "workspace.context-menu.grid-cells.area" +msgstr "Alan oluştur" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Çalışma yüzeyi oluştur" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Hücreleri birleştir" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Sağa 1 sütun ekle" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Sola 1 sütun ekle" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Sütunu sil" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Sütun ve şekilleri sil" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Yinelenen sütun" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Aşağıya 1 satır ekle" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Yukarıya 1 satır ekle" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Satırı sil" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Satır ve şekilleri sil" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Yinelenen satır" + msgid "workspace.focus.focus-mode" msgstr "Odaklanma modu" @@ -2834,6 +3449,9 @@ msgstr "Dairesel degrade" msgid "workspace.header.menu.disable-dynamic-alignment" msgstr "Dinamik hizalamayı devre dışı bırak" +msgid "workspace.header.menu.disable-scale-content" +msgstr "Orantılı ölçeklendirmeyi devre dışı bırak" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.disable-scale-text" msgstr "Metin ölçeklendirmeyi devre dışı bırak" @@ -2849,6 +3467,9 @@ msgstr "Piksele tutturmayı devre dışı bırak" msgid "workspace.header.menu.enable-dynamic-alignment" msgstr "Dinamik hizalamayı etkinleştir" +msgid "workspace.header.menu.enable-scale-content" +msgstr "Orantılı ölçeklendirmeyi etkinleştir" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-scale-text" msgstr "Metin ölçeklendirmeyi etkinleştir" @@ -2899,6 +3520,9 @@ msgstr "Tercihler" msgid "workspace.header.menu.option.view" msgstr "Görünüm" +msgid "workspace.header.menu.redo" +msgstr "Tekrarla" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.select-all" msgstr "Tümünü seç" @@ -2922,6 +3546,15 @@ msgstr "Cetvelleri göster" msgid "workspace.header.menu.show-textpalette" msgstr "Yazı tipi paletini göster" +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Koyu temaya geç" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "Açık temaya geç" + +msgid "workspace.header.menu.undo" +msgstr "Geri al" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.reset-zoom" msgstr "Sıfırla" @@ -2946,6 +3579,10 @@ msgstr "Kaydedilmemiş değişiklikler" msgid "workspace.header.viewer" msgstr "Görünüm modu (%s)" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "Yakınlaştırma" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.zoom-fill" msgstr "Doldur - Doldurmak için ölçeklendir" @@ -2966,6 +3603,21 @@ msgstr "Tam ekran" msgid "workspace.header.zoom-selected" msgstr "Seçilene yakınlaştır" +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Izgarayı düzenle" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Çıkış" + +msgid "workspace.layout_grid.editor.title" +msgstr "Düzenleme ızgarası" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Bitti" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Bul" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Ekle" @@ -2974,6 +3626,14 @@ msgstr "Ekle" msgid "workspace.libraries.colors" msgstr "%s renk" +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "Kütüphanenizde henüz renk stili yok" + +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "Kütüphanenizde henüz tipografi stili yok" + #: src/app/main/ui/workspace/colorpicker/libraries.cljs, #: src/app/main/ui/workspace/colorpalette.cljs msgid "workspace.libraries.colors.file-library" @@ -3024,6 +3684,14 @@ msgstr "KÜTÜPHANELER" msgid "workspace.libraries.library" msgstr "KÜTÜPHANE" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library-updates" +msgstr "KÜTÜPHANE GÜNCELLEMELERİ" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Yükleniyor…" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "Güncelleme gerektiren Paylaşılmış Kütüphane bulunmuyor" @@ -3060,6 +3728,10 @@ msgstr "%s tipografi" msgid "workspace.libraries.update" msgstr "Güncelle" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "tüm değişiklikleri gör" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.updates" msgstr "GÜNCELLEMELER" @@ -3091,6 +3763,27 @@ msgstr "İçeriği kırp" msgid "workspace.options.component" msgstr "Bileşen" +msgid "workspace.options.component.annotation" +msgstr "Açıklama" + +msgid "workspace.options.component.copy" +msgstr "Kopyala" + +msgid "workspace.options.component.create-annotation" +msgstr "Bir açıklama oluştur" + +msgid "workspace.options.component.edit-annotation" +msgstr "Bir açıklamayı düzenle" + +msgid "workspace.options.component.main" +msgstr "Ana bileşen" + +msgid "workspace.options.component.swap" +msgstr "Bileşeni değiştir" + +msgid "workspace.options.component.swap.empty" +msgstr "Bu kütüphanede henüz varlık yok" + #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "Kısıtlamalar" @@ -3145,6 +3838,12 @@ msgstr "Dışa aktar" msgid "workspace.options.export-multiple" msgstr "Seçimi dışa aktar" +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export-object" +msgid_plural "workspace.options.export-object" +msgstr[0] "1 ögeyi dışa aktar" +msgstr[1] "%s ögeyi dışa aktar" + #: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs msgid "workspace.options.export.suffix" msgstr "Son ek" @@ -3177,6 +3876,10 @@ msgstr "Doldur" msgid "workspace.options.flows.add-flow-start" msgstr "Akış başlangıcı ekle" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Akış" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "Akış başlangıcı" @@ -3280,6 +3983,9 @@ msgstr "Grubu doldur" msgid "workspace.options.group-stroke" msgstr "Grubu çiz" +msgid "workspace.options.guides.title" +msgstr "Kılavuzlar" + msgid "workspace.options.height" msgstr "Yükseklik" @@ -3828,14 +4534,26 @@ msgstr "Çerçeve" msgid "workspace.options.stroke-cap.circle-marker" msgstr "Daire işaretleyici" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Daire" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "Elmas işaretleyici" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Elmas" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "Çizgi oku" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Ok" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "Hiçbiri" @@ -3852,10 +4570,18 @@ msgstr "Kare" msgid "workspace.options.stroke-cap.square-marker" msgstr "Kare işaretleyici" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Dikdörtgen" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "Üçgen ok" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Üçgen" + msgid "workspace.options.stroke-color" msgstr "Çerçeve rengi" @@ -4030,6 +4756,9 @@ msgstr "Düğümleri tuttur (%s)" msgid "workspace.shape.menu.add-flex" msgstr "Esnek düzen ekle" +msgid "workspace.shape.menu.add-grid" +msgstr "Izgara düzeni ekle" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.back" msgstr "En arkaya gönder" @@ -4042,6 +4771,9 @@ msgstr "Arkaya gönder" msgid "workspace.shape.menu.copy" msgstr "Kopyala" +msgid "workspace.shape.menu.create-annotation" +msgstr "Açıklama oluştur" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.create-artboard-from-selection" msgstr "Çalışma yüzeyi için seçim" @@ -4050,6 +4782,9 @@ msgstr "Çalışma yüzeyi için seçim" msgid "workspace.shape.menu.create-component" msgstr "Bileşen oluştur" +msgid "workspace.shape.menu.create-multiple-components" +msgstr "Çoklu bileşen oluştur" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.cut" msgstr "Kes" @@ -4317,6 +5052,13 @@ msgstr "Metin (%s)" msgid "workspace.toolbar.text-palette" msgstr "Tipografiler (%s)" +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**İnceleme modu** (Yalnızca görüntüle)" + +msgid "workspace.top-bar.read-only.done" +msgstr "Bitti" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Şu ana kadar değişim geçmişi yok" @@ -4436,6 +5178,10 @@ msgstr "Geçmiş" msgid "workspace.updates.dismiss" msgstr "Yoksay" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "Daha fazla bilgi" + #: src/app/main/data/workspace/libraries.cljs msgid "workspace.updates.there-are-updates" msgstr "Paylaşılan kütüphaneler için güncellemeler var" @@ -4504,692 +5250,3 @@ msgstr "Yolu kapatmak için tıklayın" #~ msgid "workspace.options.layout-item.title.min-w" #~ msgstr "Asgari genişlik" - -msgid "shortcuts.bold" -msgstr "Kalın yazı aç/kapat" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "Penpot'u fiziksel bir sunucuda kullanmadan önce deneyin" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "Konsept fikirler üzerinde çalışmak" - -#: src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.empty-palette" -msgstr "Kütüphanenizde henüz renk stili yok" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "30 gün" - -msgid "workspace.options.component.copy" -msgstr "Kopyala" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"Geri bildiriminiz, Penpot'u kullanışlı ve eğlenceli bir araç haline " -"getirmeye devam edebilmemiz için alışkanlıklarınızı ve tercihlerinizi " -"anlamamıza yardımcı olacaktır." - -msgid "modals.invite-member.repeated-invitation" -msgstr "" -"Bazı e-posta adresleri mevcut takım üyelerine aittir. Davetleri " -"gönderilmeyecektir." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "Geliştirici" - -msgid "shortcuts.align-justify" -msgstr "İki yana yasla" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "Ürün veya Proje yöneticisi" - -msgid "workspace.options.component.create-annotation" -msgstr "Bir açıklama oluştur" - -#, markdown -msgid "dashboard.fonts.warning-text" -msgstr "" -"İşletim sistemlerinin farklı dikey metriklerine ilişkin olarak yazı " -"tiplerinizde olası bir sorun tespit ettik. Bu durumu kontrol etmek için [" -"bunun gibi](https://vertical-metrics.netlify.app/) yazı tipi dikey metrik " -"hizmetlerini kullanabilirsiniz. Ayrıca web yazı tipleri oluşturmak ve " -"hataları düzeltmek için [Transfonter](https://transfonter.org/) kullanmanızı " -"öneririz. " - -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "Yeni bir sürüm mevcut, lütfen sayfayı yenileyin" - -msgid "modals.delete-component-annotation.message" -msgstr "Bu açıklamayı silmek istediğinize emin misiniz?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Pazarlama" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "180 gün" - -msgid "workspace.options.component.edit-annotation" -msgstr "Bir açıklamayı düzenle" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "Takım projemin kodunu al " - -msgid "workspace.shape.menu.create-multiple-components" -msgstr "Çoklu bileşen oluştur" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "Kendi projem üzerinde çalışıyorum" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Dikdörtgen" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "İsim gereklidir" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.scd-message" -msgid_plural "modals.delete-shared-confirm.activated.scd-message" -msgstr[0] "Bu kütüphane burada etkinleştirildi: " -msgstr[1] "Bu kütüphaneler burada etkinleştirildiler: " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "Serbest çalışıyorum" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.copied-success" -msgstr "Belirteç kopyalandı" - -msgid "modals.publish-empty-library.title" -msgstr "Boş kütüphaneyi yayınla" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Figma" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "tüm değişiklikleri gör" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "...marka çalışması, çizimler, pazarlama materyalleri, vb." - -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "Kütüphanenizde henüz tipografi stili yok" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-90-days" -msgstr "90 gün" - -msgid "shortcuts.zoom-lense-increase" -msgstr "Görüntüyü büyült" - -msgid "workspace.shape.menu.add-grid" -msgstr "Izgara düzeni ekle" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "" -"Bu dosyada daha önce kullanılmış olan varlıklar orada kalmaya devam edecek (" -"hiçbir tasarım bozulmayacak)." -msgstr[1] "" -"Bu dosyalarda daha önce kullanılmış olan varlıklar orada kalmaya devam " -"edecek (hiçbir tasarım bozulmayacak)." - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom" -msgstr "Yakınlaştırma" - -msgid "workspace.options.component.annotation" -msgstr "Açıklama" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.some" -msgstr "Biraz" - -msgid "shortcuts.text-align-justify" -msgstr "İki yana yasla" - -msgid "workspace.layout_grid.editor.title" -msgstr "Düzenleme ızgarası" - -#: src/app/main/ui/dashboard/team.cljs -msgid "team.webhooks.max-length" -msgstr "Webhook adı en fazla 2048 karakter içermelidir." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "%s tarihinde sona erdi" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.expiration-date.label" -msgstr "Sona erme tarihi" - -msgid "workspace.header.menu.undo" -msgstr "Geri al" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "50'den fazla" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-weight" -msgstr "Yazı Tipi Kalınlığı" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-not-empty" -msgstr "Parola boşluk dışında bir karakter içermelidir." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "Sonraki" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "Takımınızın büyüklüğü nedir?" - -msgid "shortcuts.toggle-visibility" -msgstr "Göster / Gizle" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "" -"... taslak çizimler, kullanıcı deneyimi yol haritası ve akışları, gezinme " -"menüsü, vb." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-60-days" -msgstr "60 gün" - -msgid "workspace.header.menu.disable-scale-content" -msgstr "Orantılı ölçeklendirmeyi devre dışı bırak" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "Çok fazla" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "Başla" - -msgid "shortcuts.align-center" -msgstr "Ortala" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Elmas" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "Penpot'u nasıl kullanmayı planlıyorsunuz?" - -msgid "workspace.header.menu.redo" -msgstr "Tekrarla" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "... üzerinde çalışma deneyiminizi en iyi nasıl tarif edersiniz?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "Bir seçenek belirleyin" - -msgid "shortcuts.text-align-left" -msgstr "Sola hizala" - -msgid "shortcuts.font-size-dec" -msgstr "Yazı boyutunu azalt" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "Tasarımcı" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "Hiçbiri" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "Haydi başlayalım!" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Adobe XD" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Çıkar" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Sketch" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library-updates" -msgstr "KÜTÜPHANE GÜNCELLEMELERİ" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Üçgen" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.label" -msgstr "İsim" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.no-files-message" -msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "Hiçbir dosyada etkinleştirilmedi." -msgstr[1] "Hiçbir dosyada etkinleştirilmediler." - -msgid "modals.publish-empty-library.message" -msgstr "Kütüphaneniz boş. Yine de yayınlamak istediğinizden emin misiniz?" - -msgid "workspace.assets.open-library" -msgstr "Kütüphane dosyasını aç" - -msgid "modals.delete-component-annotation.title" -msgstr "Açıklamayı sil" - -msgid "shortcuts.select-parent-layer" -msgstr "Ana katmanı seç" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "Paylaşılan kütüphane" - -msgid "shortcuts.select-next" -msgstr "Sonraki katmanı seç" - -msgid "workspace.header.menu.enable-scale-content" -msgstr "Orantılı ölçeklendirmeyi etkinleştir" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "Daha fazla bilgi" - -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "İsim boşluk dışında bir karakter içermelidir." - -msgid "shortcuts.line-height-inc" -msgstr "Satır yüksekliğini artır" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "Diğer (lütfen belirtiniz)" - -msgid "labels.discard" -msgstr "At" - -msgid "shortcuts.font-size-inc" -msgstr "Yazı boyutunu artır" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "Penpot'un takımınız için uygun olup olmadığını görmek için test edin " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "Öğrenci veya öğretmen" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "Takımımın projesi için geri bildirim bırakın" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "31-50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "InVision" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Canva" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "Penpot'u daha fazla keşfedin" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expires-on" -msgstr "%s tarihinde sona eriyor" - -msgid "shortcuts.italic" -msgstr "İtalik yazı aç/kapat" - -msgid "shortcuts.letter-spacing-dec" -msgstr "Harf aralığını azalt" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "Önceki" - -msgid "workspace.shape.menu.create-annotation" -msgstr "Açıklama oluştur" - -msgid "shortcuts.letter-spacing-inc" -msgstr "Harf aralığını artır" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "Projem üzerinde çalışmaya başla" - -msgid "shortcuts.text-align-center" -msgstr "Ortaya hizala" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Ok" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "Hangi tasarım aracını daha iyi kullanıyorsunuz?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "Göreviniz nedir?" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Kütüphaneniz boş. Paylaşılan Kütüphane olarak eklendiğinde, oluşturduğunuz " -"varlıklar diğer dosyalarınız arasında kullanılabilir olacak. Yayınlamak " -"istediğinizden emin misiniz?" - -msgid "shortcuts.text-align-right" -msgstr "Sağa hizala" - -msgid "shortcuts.underline" -msgstr "Alt çizgiyi aç/kapat" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-never" -msgstr "Asla" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Kurucu/Başkan Yardımcısı" - -msgid "modals.publish-empty-library.accept" -msgstr "Yayınla" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.no-expiration" -msgstr "Süresiz" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "İsim en fazla 250 karakter içermelidir." - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Daire" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "11-30" - -msgid "shortcut-subsection.text-editor" -msgstr "Metinler" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "... kullanıcı arayüzü tasarımı, görsel öğeler, tasarım sistemleri, vb." - -msgid "shortcuts.zoom-lense-decrease" -msgstr "Görüntüyü küçült" - -msgid "shortcuts.line-height-dec" -msgstr "Satır yüksekliğini azalt" - -msgid "shortcuts.select-prev" -msgstr "Önceki katmanı seç" - -msgid "shortcuts.line-through" -msgstr "Üstü çizili yazı aç/kapat" - -msgid "errors.cannot-upload" -msgstr "Medya dosyası yüklenemedi." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.message" -msgstr "Bu belirteci silmek istediğinizden emin misiniz?" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.access-tokens" -msgstr "Erişim belirteçleri" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-not-expire" -msgstr "Belirtecin sona erme tarihi yok" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "Yeni belirteç oluştur" - -msgid "workspace.options.component.main" -msgstr "Ana bileşen" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-expire" -msgstr "Belirtecin süresi %s tarihinde sona erecek" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.accept" -msgstr "Belirteci sil" - -msgid "workspace.assets.duplicate-main" -msgstr "Ana bileşeni çoğalt" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.submit-label" -msgstr "Belirteç oluştur" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.placeholder" -msgstr "Adı, belirtecin ne için olduğunu bilmenize yardımcı olabilir" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.no-access-tokens" -msgstr "Şu ana kadar hiç belirteciniz yok." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"Kişisel erişim belirteçleri, oturum açma/parola kimlik doğrulama sistemimize " -"alternatif olarak işlev görür ve bir uygulamanın dahili Penpot API'sine " -"erişmesine izin vermek için kullanılabilir" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "Kişisel erişim belirteçleri" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "Bir belirteç oluşturmak için \"Yeni belirteç oluştur\" düğmesine basın." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.title" -msgstr "Belirteci sil" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "Erişim belirteci başarıyla oluşturuldu." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.title" -msgstr "Erişim belirteci oluştur" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.copy-token" -msgstr "Belirteci kopyala" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "title.settings.access-tokens" -msgstr "Profil - Erişim belirteçleri" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Bir hesap oluştururken, [koşullarımızı](%s) ve [gizlilik politikamızı](%s) " -"kabul etmiş sayılırsınız." - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-delete-file" -msgid_plural "dashboard.success-delete-file" -msgstr[0] "Dosyanız başarıyla silindi" -msgstr[1] "Dosyalarınız başarıyla silindi" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Dosyanın uyumsuz bir sürüm numarası var" - -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Etkinleştirilen özellikler ile açmaya çalıştığınız dosyanın özellikleri " -"arasında bir uyumsuzluk var gibi görünüyor. Dosyanın açılabilmesi için önce " -"'%s' için geçişlerin uygulanması gerekiyor." - -msgid "errors.validation" -msgstr "Doğrulama Hatası" - -msgid "errors.paste-data-validation" -msgstr "Panoda geçersiz veri" - -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Ayarlanmadı" - -msgid "labels.share" -msgstr "Paylaş" - -msgid "labels.search" -msgstr "Ara" - -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Takım olmadan başlayın" - -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Takım oluşturmaya devam edin" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Daha sonra bir takım oluşturabileceksiniz." - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Takım olmadan devam edin" - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Takım oluşturun ve davet gönderin" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Davet etmeden takım oluşturun" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Takım oluşturun ve davet edin" - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Takım oluşturun" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Daha sonra davet edebileceksiniz" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Bul" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Bitti" - -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Izgarayı düzenle" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Çıkış" - -msgid "workspace.options.component.swap" -msgstr "Bileşeni değiştir" - -msgid "workspace.options.component.swap.empty" -msgstr "Bu kütüphanede henüz varlık yok" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Akış" - -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**İnceleme modu** (Yalnızca görüntüle)" - -msgid "workspace.top-bar.read-only.done" -msgstr "Bitti" - -msgid "media.image" -msgstr "Görsel" - -msgid "media.solid" -msgstr "Katı" - -msgid "media.linear" -msgstr "Doğrusal" - -msgid "media.radial" -msgstr "Işınsal" - -msgid "media.gradient" -msgstr "Değişim" - -msgid "media.choose-image" -msgstr "Görsel seç" - -msgid "workspace.options.guides.title" -msgstr "Kılavuzlar" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.accept" -msgid_plural "modals.unpublish-shared-confirm.accept" -msgstr[0] "Yayından kaldır" -msgstr[1] "Yayından kaldır" - -msgid "dashboard.import.import-message" -msgid_plural "dashboard.import.import-message" -msgstr[0] "1 dosya başarıyla içeri aktarıldı." -msgstr[1] "%s dosya başarıyla içeri aktarıldı." - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-duplicate-file" -msgid_plural "dashboard.success-delete-file" -msgstr[0] "Dosyanız başarıyla kopyalandı" -msgstr[1] "Dosyalarınız başarıyla kopyalandı" - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Uyumsuz '%s' özelliği algılandı" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "workspace.options.export-object" -msgid_plural "workspace.options.export-object" -msgstr[0] "1 ögeyi dışa aktar" -msgstr[1] "%s ögeyi dışa aktar" diff --git a/frontend/translations/yo.po b/frontend/translations/yo.po new file mode 100644 index 000000000..6a9b82b11 --- /dev/null +++ b/frontend/translations/yo.po @@ -0,0 +1,4646 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2024-02-14 08:02+0000\n" +"Last-Translator: Alejandro Alonso \n" +"Language-Team: Yoruba " +"\n" +"Language: yo\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.4-dev\n" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.check-your-email" +msgstr "" +"yẹ ímeèlì rẹ wò kí o tẹ ọ̀nà-àsopọ̀ láti mọ̀ dájú àti láti bẹ̀rẹ̀ sí lo " +"pẹ́ńpọtì." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.confirm-password" +msgstr "jẹ́rìísí ọ̀rọ̀-ìgbaniwọlé" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-account" +msgstr "ṣẹ̀dá ìfihàn àkáùntí" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-profile" +msgstr "kàn fẹ́ gbìyànjú ú rẹ̀?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.demo-warning" +msgstr "" +"\"\"This is a DEMO service, DO NOT USE for real work, the projects will be " +"parẹ́ lóòrèkóòrè." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.email" +msgstr "ímeèlì" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.forgot-password" +msgstr "gbàgbé ọ̀rọ̀-ìgbaniwọlé ?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.fullname" +msgstr "orúkọ lẹ́kùnn-ún-rẹ́rẹ́" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.login-here" +msgstr "wọlé síbí" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-submit" +msgstr "wọlé" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-title" +msgstr "ó dára láti rí ẹ lẹ́ẹ̀kan sí i!" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-github-submit" +msgstr "ibùdó gítì" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-gitlab-submit" +msgstr "láàbù gítì" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-google-submit" +msgstr "ṣàwárí" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-ldap-submit" +msgstr "LDAP" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-oidc-submit" +msgstr "ṣílẹ̀kuǹ ìdánimọ̀" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "orúkọ kò gbọdọ̀ ju àádọ́jọ́ lẹ́tà lọ." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.new-password" +msgstr "tẹ ọ̀rọ̀ ìgbaniwọlé tuntun" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.invalid-token-error" +msgstr "àmì àtúnwárí ti díbàjẹ́." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.password-changed-successfully" +msgstr "ọ̀rọ̀-ìgbaniwọlé ti yí padà dáadáa" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.profile-not-verified" +msgstr "" +"a tí ì ṣe ìwádìí bí o ṣe jẹ́, jọ̀wọ́ ṣe ìwádìí bí o ṣe jẹ́ kí o tó tẹ̀ " +"síwájú." + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.recovery-token-sent" +msgstr "a ti fi ọ̀rọ̀-ìgbaniwọle aṣàtúnwárí ránṣẹ sínu àpótí rẹ." + +#: src/app/main/ui/auth/verify_token.cljs +msgid "auth.notifications.team-invitation-accepted" +msgstr "o ti wọ inú ẹgbẹ́ bó ṣeyẹ" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.password" +msgstr "ọ̀rọ̀- ìgbaniwọlé" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-length-hint" +msgstr "kò gbọdọ̀ ju ohun kíkọ mẹ́jọ lọ" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "ọ̀rọ̀-ìgbaniwọlé gbọ́dọ̀ ní nǹkan kíkọ láìsí àlàfo." + +msgid "auth.privacy-policy" +msgstr "ìpamọ ètò ìmúló" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-submit" +msgstr "ṣàtuńwárí ọ̀rọ̀-ìgbaniwọlé" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-subtitle" +msgstr "a má a fi àwọn ìtọ́nisọ́nà ránsẹ́ sínú ímeèlì rẹ" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-title" +msgstr "gbàgbé ọ̀rọ̀-ìgbaniwọle ?" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.recovery-submit" +msgstr "yí ọ̀rọ̀-ìgbaniwọlé rẹ padà" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.register" +msgstr "kò tí ì sí àkáùntì?" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.register-submit" +msgstr "ṣẹ̀dá àkáùntì" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-subtitle" +msgstr "ọ̀fẹ́ ni,orísun rẹ̀ ṣí lẹ" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-title" +msgstr "ṣẹ̀dá àkáùntì" + +#: src/app/main/ui/auth.cljs +msgid "auth.sidebar-tagline" +msgstr "ṣíṣí orísun yíyà àti àwòrán ni yóò fi lojútùú ." + +msgid "auth.terms-of-service" +msgstr "òfin ibiṣẹ́" + +msgid "auth.terms-privacy-agreement" +msgstr "" +"\"nígbà, tí o bá ń ṣẹ̀dá àkáùntí tuntun ,o gbọ́dọ̀ gba àwọn òfin ibiṣẹ́ " +"àti àṣírí rẹ́`." + +#: src/app/main/ui/auth/register.cljs +msgid "auth.verification-email-sent" +msgstr "a ti fi ìjẹ́rìísí ránsẹ́ sínú ímeèlì rẹ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr ".. ìyàsọ́tọ, àpèjúwe,títajà nǹkan, abbl." + +msgid "common.publish" +msgstr "ìgbéjáde" + +msgid "common.share-link.all-users" +msgstr "gbogbo àwọn tó ń lo pẹ́ńpọtì" + +msgid "common.share-link.current-tag" +msgstr "(lọ́wọ́lọ́wọ́)" + +msgid "common.share-link.destroy-link" +msgstr "pa ọ̀nà-àsopọ̀ run" + +msgid "common.share-link.get-link" +msgstr "gba ọ̀nà-àsopọ́" + +msgid "common.share-link.link-copied-success" +msgstr "so àdàkọ pọ̀ bó ṣeyẹ" + +msgid "common.share-link.manage-ops" +msgstr "ṣàkóṣo ìgbaniláàye" + +msgid "common.share-link.permissions-can-comment" +msgstr "o lè sọ̀rọ̀" + +msgid "common.share-link.permissions-can-inspect" +msgstr "ṣe àyẹ̀wò kóòdù" + +msgid "common.share-link.permissions-hint" +msgstr "ẹnikẹ́ni tí ó bá ní ọ̀nà-àsopọ á ní àǹfààní àtiwọle" + +msgid "common.share-link.permissions-pages" +msgstr "pín ojú ìwé" + +msgid "common.share-link.placeholder" +msgstr "ọ̀nà-àsopọ̀ ojú ìwé tí a pín á hàn ní bí yìí" + +msgid "common.share-link.team-members" +msgstr "ọmọ ẹgbẹ́ nìkan ni" + +msgid "common.share-link.title" +msgstr "pín àwọn àpẹrẹ" + +msgid "common.share-link.view-all" +msgstr "yan gbogbo rẹ̀" + +msgid "common.unpublish" +msgstr "ohun tí a kò tí ì kọ jáde" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.management" +msgstr "ìṣàkóṣo ọmọ ẹgbẹ" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.title" +msgstr "kẹ́gbẹ́ ṣera wọn lọ́kan" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.info" +msgstr "" +"\"kọ́ nípa kókó bi pẹ́ńpọtì nígbàtí ò ń dára rẹ láraya nípa fífi àwon " +"ọwọ́ rẹ ṣe “ “ìdánilẹ́kọ̀ọ́ ." + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.start" +msgstr "bẹ̀rẹ̀ ìdánilẹ́kọ̀ọ́" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.title" +msgstr "gbọ́wọ́ lórí idánilẹ́kọ̀ọ́" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.info" +msgstr "rìn kàákiri pẹ́ńpọti kí o lè mọ kókó àwẹn ẹ̀yà ara rẹ̀." + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.start" +msgstr "bẹ̀rẹ̀ ìrìn kiri" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.title" +msgstr "wò ó bí o ṣe ń rìn kiri" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "ṣe ìpilẹ̀sẹ̀ àmì tókìnnì" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "ṣe àyẹ̀wò àmì tókìnnì tí o ṣẹ̀dá bó ṣeyẹ." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "tẹ bọ́tìnnì \" ṣe ìpilẹ̀sẹ̀ àmì tókìnnì tuntun\" láti ṣe ìpilẹ̀sẹ̀ òmíràn." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "o kò tí ì ní àmì tókínnì títí di ìsinsìn yìí." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "a nílò orúkọ" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "ọgọ́saǹ-ań ọjọ́" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "ọgbọ̀n ọjọ́" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "ọgọ́ta ọjọ́" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "àádọ́ruǹ-ún ọjọ́" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "rárá" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "ó parí ní %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "ó parí %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.no-expiration" +msgstr "kò sì ọjọ́ ìparí" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "àmì tokìnnì ìwọlé ti ara ẹni" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"Iṣẹ́ àmì tókìnì ìwọlé ti ara ẹni dàbì ọ̀nà kejí tí a le gbà wọlé/ ọ̀rọ̀- " +"agbaniwọle a lè lo ìfàsẹ sí ètò láti gbaye fún ohun èlò à tì wọlé " +"pẹ́ńpọtì ti abẹ́nú api" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "àmì tòkìn yóò parí ní %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "kò sí ọjọ́ ìparí fún àmì tókìn" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.add-shared" +msgstr "ṣe àpàpọ̀ bí i yàrá ìkàwe tí a pín" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.change-email" +msgstr "pàrọ̀ ímeèlí" + +#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs +msgid "dashboard.copy-suffix" +msgstr "(dàákọ)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.create-new-team" +msgstr "ṣẹ̀dá ẹgbẹ́ tuntun" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.default-team-name" +msgstr "pẹ́ńpọtì rẹ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.delete-team" +msgstr "pa ẹgbẹ́ rẹ́" + +msgid "dashboard.download-binary-file" +msgstr "sọ fáìlí pẹ́ńpọtì kalẹ̀ (.penpot)" + +msgid "dashboard.download-standard-file" +msgstr "sọ fáìlì ìpéwọ̀n kalẹ̀ (.svg + .json)" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate" +msgstr "ṣe ẹ̀dà" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate-multi" +msgstr "ṣe ẹ̀dà %s fáìlì" + +#: src/app/main/ui/dashboard/grid.cljs +#, markdown +msgid "dashboard.empty-placeholder-drafts" +msgstr "" +"\"\" fáìlí tí a dàpọ̀ mọ yàrá ìkàwé á hàn níbí yìí. gbìyànjú láti má a " +"pín àwon fáìlì rẹ̀ tàbí ṣàfikún láti ibi [yàrá ìkàwé wa àti àwòṣe " +"](https://penpot.app/libraries-templates.html)." + +msgid "dashboard.export-binary-multi" +msgstr "sọ àwọn fáìlì pẹ́ẹ́pọtì kalẹ́ %s (.pẹ́ńpọtì)" + +msgid "dashboard.export-frames" +msgstr "fi bọọdù ráńṣẹ bí i PDF" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-frames.title" +msgstr "fi ráńṣẹ́ bí i PDF" + +msgid "dashboard.export-multi" +msgstr "fi pẹ́ńpọtì ráńṣẹ́%s files" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-multiple.selected" +msgstr "% ti %s ẹ́límẹ́ǹti tí a yàn" + +#: src/app/main/ui/workspace/header.cljs +msgid "dashboard.export-shapes" +msgstr "fi ráńṣẹ" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to" +msgstr "" +"o lé ṣe àfikún ti ètò ìfiráńṣẹ si ẹ́límẹ́ǹtì láti bi àmì ohun ìní ( níbi " +"ìsàlẹ̀ báà lẹ́gbẹ̀ẹ́ ọ̀tun )." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to-link" +msgstr "àlàyé bí a ti ṣètò ìfiráńṣẹ sí pẹ́ńpọtì ." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.no-elements" +msgstr "kòsí àwọn ẹ́límẹ́ǹtì pẹ̀lú ètò ìfirańńṣẹ." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.title" +msgstr "àṣàyàn ìfiránṣẹ́" + +msgid "dashboard.export-standard-multi" +msgstr "danlóòdù %s àwọn ojúlówó fáìli (.svg + .json)" + +msgid "dashboard.export.detail" +msgstr "* ó le ní àwọn ẹ̀yà ara, àwòrán àti àwon àwọ̀ àti / tàbí àtẹ̀jáde." + +msgid "dashboard.export.options.all.message" +msgstr "" +"àwọn fáìli tí ó wà nínú yàrá ìkàwé pípín á dàpọ̀ mọ́ ti ìfiráńṣẹ́, fún " +"síṣetọ́jútheir linkage ìsopọ̀ wọn." + +msgid "dashboard.export.options.all.title" +msgstr "ṣe ìfiráńṣẹ́ yàrá ìkàwé pípín" + +msgid "dashboard.export.options.detach.message" +msgstr "" +"Shared libraries will not be included in the export and no assets will be " +"yàrá ìkàwé pípín kò ní sí nínú ti ìfiráńṣẹ́ àti pé kò ni ohun ìní kan tí " +"a ó fi kún yàrá ìkàwé. " + +msgid "dashboard.export.options.detach.title" +msgstr "ṣe ìtọ́jú ohun ìní iyàrá ìkàwé pípín bí i nǹkan tó jẹ́ kókó" + +msgid "dashboard.export.options.merge.message" +msgstr "" +"á fi fáìlì rẹ ráńṣẹ́ pẹ̀lú gbogbo àwọn ohun ìní tó wà láyìíka ni a ó papọ̀ " +"sínú fáìlì yàrá ìkàwé." + +msgid "dashboard.export.options.merge.title" +msgstr "da ohun ìní yàrá ìkàwé pípín pọ̀ mọ́ fáìlì yàrá ìkàwé" + +msgid "dashboard.export.title" +msgstr "fi àwọn fáìlì ráńṣẹ" + +msgid "dashboard.fonts.deleted-placeholder" +msgstr "fọ́ǹtì tó sọnù" + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.dismiss-all" +msgstr "yọ gbogbo wọn kúrò" + +msgid "dashboard.fonts.empty-placeholder" +msgstr "àwọn fọ́ǹtì tí o ọpulóòdù yó hàn níbí." + +#, markdown +msgid "dashboard.fonts.hero-text1" +msgstr "" +"èyíkéyìí wẹ́bù fọ́ǹtì tí o bá ti ọpulóòdù níbí ni á di àkópọ̀ mọ́ ẹbí " +"fọ́ǹtì àwọn ọ̀rọ̀ ohun ìní tí o wà nínú àwọn fáìlì ẹgbẹ́. Fọ́ǹtì " +"pẹ̀lú u orúkọ ẹbi fọ́ǹtì kanna la ó dàpọ̀ mọ́ ẹgbẹ́ bí i**ẹbí fọ́ǹtì kan " +"soso**. O lè ọpulóòdù fọ́ǹtì pẹ̀lú àwọn ìlànà wọ̀nyí: **TTF, OTF and " +"WOFF** (ẹyọ kan péré la ó nílò)." + +#, markdown +msgid "dashboard.fonts.hero-text2" +msgstr "" +"àwọn fọ́ǹtì tí ó bá jẹ́ tì ẹ nìkan ni o lè ọpulóòdù tàbí èyí tí o ní ìwé " +"àṣẹ láti lò ní pẹ́ńpọtì. Wá a sí i nínú kọ́ńtẹ́tì abala apá ọ̀tún àwọn " +"òfin pẹ́ńpọtìiṣẹ́](https://pẹ́ńpọtì.apù/àwọn òfin.html). o sì le fẹ́ kà " +"nípa[ ìwé àṣẹ- pẹ́ńpọtì](https://www.taipogíráfì.com/faq)." + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.upload-all" +msgstr "ọpulóòdù gbogbo rẹ̀" + +#, markdown +msgid "dashboard.fonts.warning-text" +msgstr "" +"a ti ṣàwárí àwọn ohun tí ó le fa wàhálà nínú àwọn fọ́ǹtì ìlànà olóòro " +"oríṣiríṣi àwọn ètò tó wà fún ìṣesí ọ̀nà ẹ̀rọ. láti ṣe àyẹ̀wò rẹ̀ o lè " +"lofont vertical metrics services like ìlànà fọ́ǹtì olóòró fún àwọn iṣẹ́ " +"ọ̀nà ẹ̀rọ bí i [èyí èkínní](https://mẹ́tíríkì ìlànà olóòró.netlify .app/). " +"Ní àfikún, a rẹkọmẹ́ǹdì lílo[tíráńsìfọtà(https://tíráńsìfọtà.org/) láti " +"pilẹ̀ṣẹ̀ àwọn wẹ́bù fọ́ǹtì láti túnṣeàsìṣe. " + +msgid "dashboard.import" +msgstr "gbé àwọn fáìlì pẹ́ńpọtì wọlé" + +msgid "dashboard.import.analyze-error" +msgstr "ooho! a kò lè gbé fáìlì yìí wọlé" + +msgid "dashboard.import.import-error" +msgstr "wàhálà wà láti gbé kan wà láti gbé fáìlì wọlé . fáìlì kò wọlé." + +msgid "dashboard.import.import-warning" +msgstr "àwọn fáìlì tí ó ní nǹkan tí kò fẹsẹ múlẹ̀ ti di yíyọ kúro." + +msgid "dashboard.import.progress.process-colors" +msgstr "síṣe ètò àwọ̀" + +msgid "dashboard.import.progress.process-components" +msgstr "síṣe ètò àwọn irin iṣẹ́" + +msgid "dashboard.import.progress.process-media" +msgstr "síṣe ètò àwọn ohun ìgbéròyìn jáde" + +msgid "dashboard.import.progress.process-page" +msgstr "síṣe ètò ojú ìwe : %s" + +msgid "dashboard.import.progress.process-typographies" +msgstr "síṣe ètò àkọsílẹ̀ ojú ìwé" + +msgid "dashboard.import.progress.upload-data" +msgstr "ọpulóòdù dátà sínú sáfà (%s/%s)" + +msgid "dashboard.import.progress.upload-media" +msgstr "ọpulóòdù fáìlì: %s" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.invite-profile" +msgstr "pe àwọn ènìyàn" + +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.leave-team" +msgstr "fẹgbẹ́ sílẹ̀" + +msgid "dashboard.libraries-and-templates" +msgstr "yàrá ìkàwé àti àwọn àwòṣe" + +msgid "dashboard.libraries-and-templates.explore" +msgstr "ṣe ìwákiri ọ̀pọ̀ wọn kí o sì mọ bí ó ṣe sojúṣe tiẹ" + +msgid "dashboard.libraries-and-templates.import-error" +msgstr "wàhálà wà fún gbígbé tẹ́ńpílétì wọlé. tẹ́ńpílétì kò wọlé." + +#: src/app/main/ui/dashboard/libraries.cljs +msgid "dashboard.libraries-title" +msgstr "yàrá ìkàwé" + +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.loading-files" +msgstr "ṣe ìkójọpọ̀ àwọn fáìlí rẹ …" + +msgid "dashboard.loading-fonts" +msgstr "ṣèkójọpọ̀ àwọ fọ́ǹtì rẹ …" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to" +msgstr "gbé lọ" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-multi" +msgstr "gbé %s àwọn fáìlì lọ" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-other-team" +msgstr "gbé lọ sí ẹgbẹ́ mìíràn" + +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/files.cljs +msgid "dashboard.new-file" +msgstr "+ fáìlì tuntun" + +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-file-prefix" +msgstr "fáìlì tuntun" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.new-project" +msgstr "+ iṣẹ́ àgbéṣe tuntun" + +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-project-prefix" +msgstr "iṣẹ́ àgbéṣe tuntun" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.no-matches-for" +msgstr "kò sí èyí tó báramu fún un“%s“" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.no-projects-placeholder" +msgstr "àwon iṣẹ́ àgbéṣe tí a kànpọ á hàn níbí" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-changed-successfully" +msgstr "a ti mú ímeèlì rẹ dójú ìwọn dáadáa" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-verified-successfully" +msgstr "a ti ṣe ìwádìí ímeèlì rẹ dáadáa" + +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.notifications.password-saved" +msgstr "a ti fi ọ̀rọ̀ ìgbaniwọlé rẹ pamọ́ dáadáa!" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.num-of-members" +msgstr "%s àwọn ọmọ ẹgbẹ́" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.open-in-new-tab" +msgstr "ṣí fáìlì sínú tábù tuntun" + +msgid "dashboard.options" +msgstr "àwọn àṣàyàn" + +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.password-change" +msgstr "yí ọ̀rọ̀ ìgbaniwọlé padà" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.pin-unpin" +msgstr "pínì/yọ pínì kúrò" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.projects-title" +msgstr "àwọn iṣẹ́ àgbéṣe" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.remove-account" +msgstr "o fẹ́ yọ àkáǹtì rẹ kúro?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.remove-shared" +msgstr "yọ ọ́ kúrò gẹ́gẹ́ bí yàrá kàwé pípín" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.save-settings" +msgstr "fi àwọn eto pamọ́" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.search-placeholder" +msgstr "ṣàwárí…" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.searching-for" +msgstr "ṣàwárí fún “%s“…" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-language" +msgstr "yan èdè ui" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-theme" +msgstr "yan àkọlé" + +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.show-all-files" +msgstr "fi gbogbo àwn fáìlì hàn" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-delete-project" +msgstr "iṣẹ́ àgbéṣe rẹ ti parẹ́ dáadáa" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-duplicate-project" +msgstr "a ti ṣe ẹ̀dà iṣẹ́ àgbéṣe rẹ dáadáa" + +#: src/app/main/ui/dashboard/grid.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-file" +msgstr "a ti gbé fáìlì rẹ kúro dáadáa" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-files" +msgstr "a ti gbé àwọn fáìlì rẹ kúrò dáadáa" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-move-project" +msgstr "a ti gbé iṣẹ́ àgbéṣe rẹ kúrò dáadáa" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-info" +msgstr "àlàyé ẹgbẹ́" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-members" +msgstr "àwọn ọmọ ẹgbẹ́" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-projects" +msgstr "iṣẹ́ àgbéṣe ọmọ ẹgbẹ́" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.theme-change" +msgstr "àkọlé ui" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.title-search" +msgstr "ṣàwárí àwọn èsì" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.type-something" +msgstr "tẹ̀ láti rí àwọn èsì" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.unpublish-shared" +msgstr "yàrá ìkàwé tí a kòtí ì gbé jáde" + +#: src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs +msgid "dashboard.update-settings" +msgstr "mú àwọn ètò dójú ìwọ̀n" + +msgid "dashboard.webhooks.active" +msgstr "ti ń siṣẹ́" + +msgid "dashboard.webhooks.active.explain" +msgstr "When this hook is triggered event details will be delivered" + +msgid "dashboard.webhooks.content-type" +msgstr "ẹ̀yà kọ́ńtẹ́ǹtì" + +msgid "dashboard.webhooks.create" +msgstr "ṣẹ̀dá ìkọ́-wẹ́bù" + +msgid "dashboard.webhooks.create.success" +msgstr "a ti ṣẹ̀dá ìkọ́-wẹ́bù dáadáa ." + +msgid "dashboard.webhooks.description" +msgstr "" +"àwọn ìkọ́-wẹ́bù jẹ́ ọ̀nà tó rọrùn láti fi ààyè sílẹ̀ fún àwọn ààyè " +"ayélujára mìíràn àti awọn ápù ṣe filọ́ tí àwọn ìṣẹ̀lẹ̀ kan bá ní " +"pẹ́ńpọtì’’ a ó fi ìbéèrè ráńṣẹ́ sí ọ̀kọ̀kan wọn tí urls tó o pèsè." + +msgid "dashboard.webhooks.empty.add-one" +msgstr "tẹ bọ́tínnì \"fikún ìkọ́- wẹ́bù\" láti fì kan sí i." + +msgid "dashboard.webhooks.empty.no-webhooks" +msgstr "kò sí ìkọ́-wẹ́bù tí a ṣẹ̀da´dì sisìnyí." + +#: src/app/main/ui/settings.cljs +msgid "dashboard.your-account-title" +msgstr "àkáǹtì rẹ" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-email" +msgstr "ímeèlì" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-name" +msgstr "ímeèlì rẹ" + +#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.your-penpot" +msgstr "pẹ́ńpọtì rẹ" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-ok" +msgstr "ó dára" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-title" +msgstr "àkíyèsí" + +#: src/app/main/ui/confirm.cljs +msgid "ds.component-subtitle" +msgstr "ní láti ṣe ìmúdójú ìwọ̀n àwọn irin iṣẹ́:" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-cancel" +msgstr "fagilé e" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-ok" +msgstr "ó dára" + +#: src/app/main/ui/auth/login.cljs +msgid "errors.auth-provider-not-configured" +msgstr "a kò tí ì fàṣẹ si àtúntò olùpèṣè." + +msgid "errors.auth.unable-to-login" +msgstr "ó dàbí pé o kò tí ì fàṣẹ sí i tàbí àkókò ti kọjá ." + +msgid "errors.bad-font" +msgstr "fọ́ǹtì %s kò ṣe kójọpọ̀" + +msgid "errors.bad-font-plural" +msgstr "àwọn fọ́ǹtì %s kò ṣe kójọpọ̀" + +msgid "errors.cannot-upload" +msgstr "kò le ọpulóòdù fáìlì ìgbéròyìn-jáde." + +#: src/app/main/data/workspace.cljs +msgid "errors.clipboard-not-implemented" +msgstr "a ṣàwákiri rẹ kò le ṣe iṣẹ́ yìí" + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs +msgid "errors.email-already-exists" +msgstr "ímeèlì yìí ti jẹ́ lílò tẹ́lẹ" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.email-already-validated" +msgstr "a ti fọwọ́ sí ímeèlì rẹ tẹ́lẹ̀." + +msgid "errors.email-as-password" +msgstr "o kò le lo ímeèlì rẹ gẹ́gẹ́ bí ọ̀rọ̀ ìgbaniwọlé" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.email-has-permanent-bounces" +msgstr "Ímeèlì «%s» ti ní ìjábọ̀ ọ̀pọ̀ọlọpọ̀ ìta-bọn-ọ̀n ti pẹ́." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs +msgid "errors.email-invalid" +msgstr "Tẹ àti wọlé pẹ̀lú ímeèlì tó wúlo jọ̀wọ́" + +#: src/app/main/ui/settings/change_email.cljs +msgid "errors.email-invalid-confirmation" +msgstr "Ímeèlì tí a ti mọ̀dájú gbọ́dọ̀ báramu" + +msgid "errors.email-spam-or-permanent-bounces" +msgstr "Ímeèlì ti «%s» ń jábọ̀ gẹ́gẹ́ bí i awúrúju tàbí ìta-bọ̀n-ọnọǹ tipẹ́." + +#: src/app/main/errors.cljs +msgid "errors.feature-not-supported" +msgstr "Àwọn ẹ̀yà ara ẹ̀rọ '%s' kò ní àtìlẹ́yìn." + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.generic" +msgstr "Àsìṣe kan ti ṣẹlẹ̀." + +#: src/app/main/ui/components/color_input.cljs +msgid "errors.invalid-color" +msgstr "àwọ̀ tó ti díbàjẹ́" + +msgid "errors.invite-invalid.info" +msgstr "Èyí tí a pè le parẹ́ tàbí ki àkókò lekọjá ." + +#: src/app/main/ui/auth/login.cljs +msgid "errors.ldap-disabled" +msgstr "Ìfàṣẹsí LDAP kò ṣe é ṣe ." + +#: src/app/main/errors.cljs +msgid "errors.max-quote-reached" +msgstr "O ti débi '%s' ìfàmìsí. Késí i pẹ̀lú àtìlẹ́yìn ." + +#: src/app/main/data/workspace/persistence.cljs +msgid "errors.media-too-large" +msgstr "Àwòrán tóbi púpọ ju ohun tí a le fisí lọ." + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "errors.media-type-not-allowed" +msgstr "Ó dàbí pé èyí kì í ṣe àwòrán tó fẹsẹ́ múlẹ̀." + +#: src/app/main/ui/dashboard/team.cljs +msgid "errors.member-is-muted" +msgstr "" +"Pírófáìlì ímeèlì tí ò ǹ pè ti dákẹ (ti jábọ̀ àwúrúju tàbí ìtabọ̀n-ọ̀n tó " +"ga)." + +#: src/app/main/ui/settings/password.cljs +msgid "errors.password-invalid-confirmation" +msgstr "Ijẹ́rìísí ọ̀rọ̀ ìgbaniwọlé rẹ gbọ́dọ̀ báramu" + +#: src/app/main/ui/settings/password.cljs +msgid "errors.password-too-short" +msgstr "Ọ̀rọ̀ ìgbaniwọlé kò gbọdọ̀ dín ní lẹ́tà mẹ́jọ" + +msgid "errors.profile-blocked" +msgstr "Ti dínà mọ́ pírófáìlì" + +#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.profile-is-muted" +msgstr "Ímeèlì pírófáìlì rẹ ti ní ìdákẹ́ (ìjábọ̀ àwúrúju tàbí ìtabọ̀n-ọ̀n tó ga)." + +#: src/app/main/ui/auth/register.cljs +msgid "errors.registration-disabled" +msgstr "Ìforúkọ-sílẹ̀ kò ṣe é ṣe lọ́wọ́lọ́wọ́." + +msgid "errors.team-leave.insufficient-members" +msgstr "kí àwọn ọmọ ẹgbẹ́ tí kò péye fi ẹgbẹ́ sílẹ̀, àbí bóyá o fẹ́ paárẹ́ ni ." + +msgid "errors.team-leave.member-does-not-exists" +msgstr "Kòsí ọmọ ẹgbẹ́ tí o fẹ́ yàn ." + +msgid "errors.team-leave.owner-cant-leave" +msgstr "Oní nǹkan kò le fi ẹgbẹ́ sílẹ̀ , o gbọ́dọ̀ tún ṣe àtúnyàn iṣẹ́ oní nǹkan." + +#: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "errors.unexpected-error" +msgstr "Àsìṣe tí a kòrò tẹ́lẹ̀ ti ṣẹlẹ." + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.unexpected-token" +msgstr "Tókìnnì àìmọ̀" + +msgid "errors.webhooks.connection" +msgstr "Àsìṣe nínú ètò ìsopọ̀, kò lè dé ibi URL" + +msgid "errors.webhooks.invalid-uri" +msgstr "URL kò páásì ìfọwọ́sí." + +msgid "errors.webhooks.last-delivery" +msgstr "Èyí tí a fijíṣẹ́ kẹ́yìn kò dára." + +msgid "errors.webhooks.ssl-validation" +msgstr "Àsìṣe nínú ìfẹwọ́sí SSL ." + +msgid "errors.webhooks.timeout" +msgstr "Àkókò ti lọ" + +msgid "errors.webhooks.unexpected" +msgstr "Unexpected error on validating àsìṣe àìròtẹ́lẹ̀ lórí ìfọwọ́sí" + +msgid "errors.webhooks.unexpected-status" +msgstr "Ipò àìròtẹ́lẹ̀ %s" + +#: src/app/main/ui/auth/login.cljs +msgid "errors.wrong-credentials" +msgstr "Ímeèlì tàbí ọ̀rọ̀ ìgbaniwọlé kò tọ̀nà." + +#: src/app/main/ui/settings/password.cljs +msgid "errors.wrong-old-password" +msgstr "Ọ̀rọ̀ ìgbaniwọlé ti àtijọ́ kò tọ̀nà" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.description" +msgstr "Àpèjúwe" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-go-to" +msgstr "Lọ ibi àpérò pẹ́ńpọtì" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-subtitle1" +msgstr "" +"Inú wa dùn láti rí ẹ níbí. Tí o bá nílò ìrànlọ́wọ, please search before " +"you jọ̀wọ́ ṣàwárí kí o tó firáńṣẹ́." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-title" +msgstr "Agbègbè pẹ́ńpọtì" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subject" +msgstr "Kókó-ọ̀rọ̀" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subtitle" +msgstr "" +"Jọ̀wọ́ ṣàpèjúwe ìdí tó wà fún ímeèlì rẹ, ṣàfihàn tì àríyànjiyàn bá wà, le " +"jẹ́ èrò tàbí síṣe iyèméjì. Ìkan lára àwọn ọmọ ẹgbẹ́ wa yóò dáhùn láìpẹ́ " +"láìjìnnà." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.title" +msgstr "Ímeèlì" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-go-to" +msgstr "Lọ sí Tíwítà" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-subtitle1" +msgstr "A wà níbí láti ṣe ìrànlọ́wọ́ fún àwọn ìbéèrè tó bá wà lórí iṣẹ́ ọnà." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-title" +msgstr "Àkáùnti àtìlẹ́yìn fún Tíwítà" + +#: src/app/main/ui/settings/password.cljs +msgid "generic.error" +msgstr "Àsìṣe kan ti ṣẹlẹ̀" + +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur" +msgstr "ìkùku ti wà" + +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur.value" +msgstr "bó se péye" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hex" +msgstr "dínà mọ́" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hsla" +msgstr "Ti dínà mọ" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.rgba" +msgstr "RGBA" + +#: src/app/main/ui/inspect/attributes/fill.cljs +msgid "inspect.attributes.fill" +msgstr "Fílì" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.download" +msgstr "Danlóòdù orísun àwòrán" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.height" +msgstr "Gíga" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.width" +msgstr "Fífẹ" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout" +msgstr "Layout" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.height" +msgstr "Gíga" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.left" +msgstr "Òsì" + +#: src/app/main/ui/inspect/attributes/layout.cljs, src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.radius" +msgstr "Rédíọ́sì" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.rotation" +msgstr "Yíyí" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.top" +msgstr "Òkè" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.width" +msgstr "Fífẹ̀" + +#: src/app/main/ui/inspect/attributes/shadow.cljs +msgid "inspect.attributes.shadow" +msgstr "Ibòòji" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.size" +msgstr "Ìwọ̀n àti ipò" + +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke" +msgstr "Stroke Sítírókì" + +#, permanent +msgid "inspect.attributes.stroke.alignment.center" +msgstr "Ààrin" + +#, permanent +msgid "inspect.attributes.stroke.alignment.inner" +msgstr "Nínú" + +#, permanent +msgid "inspect.attributes.stroke.alignment.outer" +msgstr "Ìtá" + +msgid "inspect.attributes.stroke.style.dotted" +msgstr "ti sàmì" + +msgid "inspect.attributes.stroke.style.mixed" +msgstr "Àdàlú" + +msgid "inspect.attributes.stroke.style.none" +msgstr "Kò sí" + +msgid "inspect.attributes.stroke.style.solid" +msgstr "Lágbára" + +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke.width" +msgstr "Fífẹ̀" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography" +msgstr "Taipogíráfì" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-family" +msgstr "Ẹbí Fọ́ǹtì" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-size" +msgstr "Ìwọ̀n Fọ́ǹtì" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-style" +msgstr "Àrà Fọ́ǹtì" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-weight" +msgstr "Ìwúwo Fọ́ǹtì" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.letter-spacing" +msgstr "Ìfàyè sí ààrin Lẹ́tà" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.line-height" +msgstr "Gíga Ìlà" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-decoration" +msgstr "Síṣe ọ̀rọ̀ lọ́ṣọ̀ọ́" + +msgid "inspect.attributes.typography.text-decoration.none" +msgstr "Kò sí" + +msgid "inspect.attributes.typography.text-decoration.strikethrough" +msgstr "Strikethrough" + +msgid "inspect.attributes.typography.text-decoration.underline" +msgstr "Fàlà sí" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-transform" +msgstr "ọ̀rọ̀ ti yí padà" + +msgid "inspect.attributes.typography.text-transform.lowercase" +msgstr "Lẹ́tà Kékeré" + +msgid "inspect.attributes.typography.text-transform.none" +msgstr "Kò sí" + +msgid "inspect.attributes.typography.text-transform.titlecase" +msgstr "Àkọlé Lẹ́tà" + +msgid "inspect.attributes.typography.text-transform.uppercase" +msgstr "Lẹ́tà ńlá" + +msgid "inspect.empty.help" +msgstr "" +"Tí o bá fẹ́ mọ̀ nípa àpẹẹrẹ alárà bẹ ààrin gbùngbùn àwọn pẹ́ńpọtì wò fún " +"ìràlọ́wọ́" + +msgid "inspect.empty.more-info" +msgstr "Àfikún àlàyé fún ìbẹ̀wò" + +msgid "inspect.empty.select" +msgstr "Yan ìrísí, bọ́ọ̀dù tàbí ẹgbẹ́ láti lọ ṣe ìbẹ̀wò ohun ìní wọn àti kóòdù" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code" +msgstr "Kóòdù" + +msgid "inspect.tabs.code.selected.circle" +msgstr "Àyíká" + +msgid "inspect.tabs.code.selected.component" +msgstr "Ẹ̀yà" + +msgid "inspect.tabs.code.selected.curve" +msgstr "Igun" + +msgid "inspect.tabs.code.selected.frame" +msgstr "Bọ́ọ̀dù" + +msgid "inspect.tabs.code.selected.group" +msgstr "Ẹgbẹ́" + +msgid "inspect.tabs.code.selected.image" +msgstr "Àwòrán" + +msgid "inspect.tabs.code.selected.mask" +msgstr "Ìbòjú" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code.selected.multiple" +msgstr "%s Ti yàn" + +msgid "inspect.tabs.code.selected.path" +msgstr "Ipa-ọ̀nà" + +msgid "inspect.tabs.code.selected.rect" +msgstr "Rectangle" + +msgid "inspect.tabs.code.selected.svg-raw" +msgstr "SVG" + +msgid "inspect.tabs.code.selected.text" +msgstr "Ọ̀rọ̀" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.info" +msgstr "Àlàyé" + +#: src/app/main/ui/workspace/header.cljs +msgid "label.shortcuts" +msgstr "Ọ̀nà àbùjá" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "Ṣàyẹ̀wò tókín-nì" + +msgid "labels.active" +msgstr "Ń siṣẹ́" + +msgid "labels.add-custom-font" +msgstr "Ṣàfikún àṣà Fọ́ǹtì" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.admin" +msgstr "Alábòjútó" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.all" +msgstr "Gbogbo ẹ̀" + +msgid "labels.and" +msgstr "àti" + +msgid "labels.back" +msgstr "Padá" + +#: src/app/main/ui/static.cljs +msgid "labels.bad-gateway.desc-message" +msgstr "" +"Ó dàbí ẹnipé o ní láti dúró díẹ̀ kí o tún gbìyàjú ; à ń siṣẹ́ díẹ̀ síṣe " +"ìtọ́jú sáfà wa." + +#: src/app/main/ui/static.cljs +msgid "labels.bad-gateway.main-message" +msgstr "Ọ̀nà-àbáwọle búburú" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.cancel" +msgstr "Párẹ́" + +msgid "labels.close" +msgstr "Tì í" + +#: src/app/main/ui/dashboard/comments.cljs +msgid "labels.comments" +msgstr "dásí i" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.community" +msgstr "Agbègbè" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.confirm-password" +msgstr "Jẹ́rìísí" + +msgid "labels.continue" +msgstr "Tẹ̀ síwájú" + +msgid "labels.continue-with" +msgstr "Tẹ̀ síwájú pẹ̀lú" + +msgid "labels.continue-with-penpot" +msgstr "O lè tẹ̀ síwájú pẹ̀lú àkáúnti pẹ́ńpọtì" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.copy-invitation-link" +msgstr "ṣà dàkọ ọ̀nà àsopọ̀" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "labels.create" +msgstr "Ṣẹ̀dá" + +#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team" +msgstr "Ṣẹ̀dá ẹgbẹ́ tuntun" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team.placeholder" +msgstr "Fi orúkọ ẹgbẹ́ tuntun wọlé" + +msgid "labels.custom-fonts" +msgstr "Kọ́sítọ́mù àwọn fọ́ǹtì" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.dashboard" +msgstr "Dáṣìbọọ̀dù" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete" +msgstr "Paárẹ́" + +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment" +msgstr "Pa kọ́mẹ́ǹtì rẹ́" + +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment-thread" +msgstr "Pa gbogbo kọ́mẹ́ǹtì rẹ́" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.delete-invitation" +msgstr "Pa ìfìwépè rẹ́" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete-multi-files" +msgstr "Pa gbogbo %s fáìlì rẹ́" + +msgid "labels.discard" +msgstr "Yọ́ kúrò" + +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.drafts" +msgstr "Kọ ọ́ sílẹ̀" + +#: src/app/main/ui/comments.cljs +msgid "labels.edit" +msgstr "sàtúnkà" + +msgid "labels.edit-file" +msgstr "sàtúnkà fáìlì" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.editor" +msgstr "Olóòtú" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.expired-invitation" +msgstr "Kọjá àkókò" + +msgid "labels.export" +msgstr "Fi ránṣẹ́" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-disabled" +msgstr "Èsì kò siṣẹ́" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-sent" +msgstr "Èsì ti lọ" + +msgid "labels.font-family" +msgstr "Ẹbí fọ́ǹtì" + +msgid "labels.font-providers" +msgstr "Àwọn Olùpèṣè fọ́ǹtì" + +msgid "labels.font-variants" +msgstr "Àrà" + +msgid "labels.fonts" +msgstr "Fọ̀ǹtì" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.github-repo" +msgstr "Báǹkì gítì-ọbù" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.give-feedback" +msgstr "Fèsì padà" + +msgid "labels.go-back" +msgstr "Padà sẹ́yìn" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.help-center" +msgstr "Ibi ìranilọ́wọ́" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.hide-resolved-comments" +msgstr "Fi àwọn ọ̀rọ̀ tí a ti yanjú pamọ́" + +msgid "labels.inactive" +msgstr "kò ja fáfá" + +msgid "labels.installed-fonts" +msgstr "Fi àwọn fọ́ǹtì sí orí ẹ̀rọ" + +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.desc-message" +msgstr "" +"Nǹkan bíburú ti ṣẹlè. Jọ̀wọ́ ṣe àtúnṣe iṣẹ́ náà àti pé tí wàhálà bá sì " +"tẹ̀ síwájú, ké sí olùbásọ̀rọ̀." + +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.main-message" +msgstr "Àsìṣe ti abẹ́nú" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.invitations" +msgstr "Ìfiwépè" + +#: src/app/main/ui/settings/options.cljs +msgid "labels.language" +msgstr "Èdè" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.libraries-and-templates" +msgstr "Àwọn yàrá ìkàwé & Tẹ́ńpílétì" + +msgid "labels.log-or-sign" +msgstr "ṣí kí o wọle tàbí kí o ṣàmì wọlé" + +#: src/app/main/ui/settings.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.logout" +msgstr "Padé kí ojáde" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.member" +msgstr "Ẹgbẹ" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.members" +msgstr "Àwọn ọmọ Ẹgbẹ́" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.new-password" +msgstr "Ọ̀rọ̀ Ìgbaniwọlé tuntun" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs +msgid "labels.no-comments-available" +msgstr "A ti gbé gbogbo yín dè! Àwọn ọ̀rọ̀ ìfitónilétí tuntun yí ó hàn níbí." + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.no-invitations" +msgstr "kò si àwọn ìfìwépè kankan nílẹ̀." + +#: src/app/main/ui/dashboard/team.cljs +#, markdown +msgid "labels.no-invitations-hint" +msgstr "Tẹ̀ ẹ́ **Pe àwọn ènìyàn** tẹ bọ́tìnnì láti pe àwọn ènìyàn sínú ẹgbẹ́." + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.desc-message" +msgstr "Ojú ìwé yìí le má sìí tàbí ò kò ni ìgbaniláàyè láti wọlé sí bẹ̀ ." + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.main-message" +msgstr "Óóho!" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.old-password" +msgstr "Ọ̀rọ̀ ìgbaniwọlé àtijọ́" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.only-yours" +msgstr "Tìrẹ nìkan" + +msgid "labels.or" +msgstr "tàbí" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.owner" +msgstr "Oníǹkan" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.password" +msgstr "Ọ̀rọ̀ ìgbaniwọlé" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.pending-invitation" +msgstr "Ńńdúró" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.profile" +msgstr "Pírófáìlì" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.projects" +msgstr "Àwọn iṣẹ́ àgbéṣe" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.release-notes" +msgstr "Fi àkọsílẹ̀ rẹ sílẹ̀" + +#: src/app/main/ui/workspace.cljs +msgid "labels.reload-file" +msgstr "Tún gbé fáìlì sí i" + +#: src/app/main/ui/workspace/libraries.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.remove" +msgstr "Yọ ọ́ kúrò" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.remove-member" +msgstr "Yọ ọmọ ẹgbẹ́ kúrò" + +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.rename" +msgstr "Fún un lórúkọ mìíràn" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.rename-team" +msgstr "Fún ẹgbẹ́ lórúkọ mìíràn" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.resend-invitation" +msgstr "Tún fì ìwé ìpè ránńṣẹ́" + +#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs +msgid "labels.retry" +msgstr "Tún gbìyànjú" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.role" +msgstr "Ojúṣe" + +msgid "labels.save" +msgstr "Fi pamọ́" + +msgid "labels.search-font" +msgstr "Ṣàwárí fọ́ǹtì" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.send" +msgstr "Fi ránńṣẹ́" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.sending" +msgstr "Fífi-ránńṣẹ…" + +#: src/app/main/ui/static.cljs +msgid "labels.service-unavailable.desc-message" +msgstr "A wà níbi ètò ìpèsè ìtọ́jú àwọn sísítẹ́mù wa." + +#: src/app/main/ui/static.cljs +msgid "labels.service-unavailable.main-message" +msgstr "Sáfísì kòsí" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.settings" +msgstr "Àwọn ètò" + +msgid "labels.share-prototype" +msgstr "Pín àwọn ohun tí a ti kọ tẹ́lẹ̀" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.shared-libraries" +msgstr "Yàrá ìkáwe" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-all-comments" +msgstr "Fi gbogbo kọ́mẹ́ǹtì hàn" + +msgid "labels.show-comments-list" +msgstr "Fi àkójọ àwọn kọ́mẹ́ǹtì hàn" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-your-comments" +msgstr "Fi àwọn kọ́mẹ́ǹtì tìrẹ nìkan hàn" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.status" +msgstr "Ipò" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.tutorials" +msgstr "Ìbáṣepọ̀" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.unpublish-multi-files" +msgstr "%s àwọn fáìlì tí a kò tí kọ jáde" + +#: src/app/main/ui/settings/profile.cljs +msgid "labels.update" +msgstr "mú dójú ìwọ̀n" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.update-team" +msgstr "Mẹ́gbẹ́ dójú ìwọ̀n" + +msgid "labels.upload" +msgstr "Ọpulóòdù" + +msgid "labels.upload-custom-fonts" +msgstr "Ọpulóòdù kọ́sítẹ́mù fọ́ǹtì" + +msgid "labels.uploading" +msgstr "Ń ọpulóòdù…" + +msgid "labels.view-only" +msgstr "Wò ó nìkan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.viewer" +msgstr "Olùwo" + +msgid "labels.webhooks" +msgstr "àwọn ìwé ìkọ́ wẹ́bù" + +#: src/app/main/ui/comments.cljs +msgid "labels.write-new-comment" +msgstr "Write new comment Kọ kọ́mẹ́ǹtì tuntun" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.you" +msgstr "(ìwọ)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.your-account" +msgstr "Àkáùntì rẹ" + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "media.loading" +msgstr "Ìkójọpọ̀ àwòrán…" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Yàrá ìkàwé rẹ ti dófìfo. Lọ́gán tí o bá ti ṣàfikún gẹ́gẹ́ bí yàrá ìkàwé " +"pípín, dúkìá tí o ṣẹ̀dá á wà fún lílò àwọn fáìlì rẹ tó kù. Are you sure " +"you tí o fẹ́ kọ jáde?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.accept" +msgstr "Ṣàfikún gẹ́gẹ́ bí yàrá ìkàwé pípín" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.hint" +msgstr "" +"Lẹ́ẹ̀kan-nà tí o bá ti ṣàfikún gẹ́gẹ́ bí yàrá ìkàwé pípín, àwọn dúkìá inú " +"fáìlì yàrá á di wíwà fún lílò àwọn fáìlì rẹ tó kù." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.message" +msgstr "Ṣàfikún “%s” gẹ́gẹ́ bí yàrá ìkàwé pípí" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.big-nudge" +msgstr "Big nudge Nọ́ọ̀jì ńlá" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.confirm-email" +msgstr "Ṣàyẹ̀wò ímeèlì tuntun" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.info" +msgstr "" +"A fi ímeèlì kan ránń ṣẹ́ sí inú ímeèlì tí ò ń lò lọ́wọ́lọ́wọ́“%s” láti ṣe " +"àyẹ̀wò ìdánimọ̀ rẹ." + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.new-email" +msgstr "Ímeèlì tuntun" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.submit" +msgstr "Pàrọ̀ ímeèlìl" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.title" +msgstr "Pàrọ̀ ímeèlì rẹ" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.copy-token" +msgstr "Ṣẹ̀dà tókìn" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.expiration-date.label" +msgstr "Ọjọ́ ìparí" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "Orúkọ" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.placeholder" +msgstr "Orúkọ yí ó ràn wá lọ́wọ́ láti mọ ohun tí tókìn wà fún" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "Ṣẹ̀dà tókìn" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "Pilẹ̀ṣẹ̀ wí wọlé tókìń" + +msgid "modals.create-webhook.submit-label" +msgstr "Ṣẹ̀dá ìkọ́- wẹ́bù" + +msgid "modals.create-webhook.title" +msgstr "Ṣẹ̀dá ìkọ́-wẹ́bù" + +msgid "modals.create-webhook.url.label" +msgstr "Péloòdù URL" + +msgid "modals.create-webhook.url.placeholder" +msgstr "https://àpẹrẹ.com/postreceive ìgbà àtẹ̀yinwá" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "Pa tókìn rẹ́" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa tókìn yi rẹ́?" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "Pa tókìn rẹ́" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.cancel" +msgstr "Fagilé e kí o sì fi àkáùntì mi pamọ́" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.confirm" +msgstr "Bẹ́ẹ̀ni, pa àkáùntì mi rẹ́" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.info" +msgstr "" +"Nípa yíyọ àkáùntì rẹ kúrò o ’ pàdánù gbogbo àwọn iṣẹ́ àgbéṣe rẹ àti àwọn tí " +"ó wà lápamọ́." + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.title" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa àkáùntì rẹ rẹ́ ?" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.accept" +msgstr "Pa ìtàkurọ̀sọ rẹ́" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.message" +msgstr "" +"Ṣé ódá ọ lójú pé o fẹ́ pa ìtàkurọ̀sọ yìí rẹ́? All comments in this Gbogbo " +"àsọyé tó wà níbí tó tẹ̀lé ra wọn ni á di píparẹ́." + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.title" +msgstr "Pa ìtàkurọ̀sọ rẹ" + +msgid "modals.delete-component-annotation.message" +msgstr "Ṣe ó dá ọ lójú pé o fẹ́ pa àkọsílẹ̀ yìí rẹ́?" + +msgid "modals.delete-component-annotation.title" +msgstr "Pa àkọsílẹ̀ rẹ́" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.accept" +msgstr "Pa fáìlì rẹ́" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa fáìlì yìí rẹ́?" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.title" +msgstr "Pa fáìlì rẹ́" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.accept" +msgstr "Pa àwọn fáìlì rẹ́" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa %s àwọn fáìlì rẹ́ ?" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.title" +msgstr "Pa fáìlì rẹ́ %s" + +msgid "modals.delete-font-variant.message" +msgstr "" +"Ṣé ó dá ọ lójú pé o fẹ́ pa fọ́ǹtì alárà yìí rẹ́ ? Kò ní gbé e tí a bá lò " +"ó nínú fáìlì." + +msgid "modals.delete-font.message" +msgstr "" +"Ṣé ó dá ọ lójú pé o fẹ́ pa fẹ́ǹtì yí rẹ́? Kò ní le gbé e tí a bá lò ó nínú " +"Fáìlì." + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.body" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa ojú ìwé yìí rẹ́?" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.title" +msgstr "Pa ojú ìwé rẹ́" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.accept" +msgstr "Pa iṣẹ́ àgbéṣe rẹ́" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa iṣẹ́ àgbéṣe yìí rẹ́?" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.title" +msgstr "Pa iṣẹ́ àgbéṣe rẹ́" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.accept" +msgstr "Pa ẹgbẹ́ rẹ́" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.message" +msgstr "" +"Ṣé ó dá ọ lójú pé o fẹ́ pa ẹgbẹ́ yìí rẹ́? Ggogbo iṣẹ́ àgbéṣe àti fáìlì tí ó " +"bá ní nǹkan ṣe pẹ̀lú ẹgbẹ́ ni a ó parẹ́ pátápátá." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.title" +msgstr "Yọ ẹgbẹ́ kúrò" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.accept" +msgstr "Yọ ọmọ ẹgbẹ́ kúrò" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ yọ ọmọ ẹgbẹ́ yìí kúrò nínú ẹgbẹ́?" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.title" +msgstr "Yọ ọmọ ẹgbẹ́ kúrò" + +msgid "modals.delete-webhook.accept" +msgstr "Pa ìkọ́-wẹ́bù rẹ́" + +msgid "modals.delete-webhook.message" +msgstr "Ṣe ó dá ọ lójú pé o fẹ́ pa ìkọ́-wẹ́bù yìí rẹ́?" + +msgid "modals.delete-webhook.title" +msgstr "Pa ìkọ́- wẹ́bù rẹ́" + +msgid "modals.edit-webhook.submit-label" +msgstr "Ṣe àtúnṣe ìkọ́- wẹ́bù" + +msgid "modals.edit-webhook.title" +msgstr "Ṣe àtúnṣe ìkọ́-wẹ́bù" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-member-confirm.accept" +msgstr "Fi ìfìwépè ránńṣẹ́" + +msgid "modals.invite-member.emails" +msgstr "Ímeèlì, kí kọmá yà á sọ́tọ̀" + +msgid "modals.invite-member.repeated-invitation" +msgstr "" +"Díẹ̀ nínú àwọn ímeèlì wá láti ọ̀dọ̀ àwọn tó jẹ́ ọmọ ẹgbẹ́ ní ìsinsìnyí. Ìwé " +"ìfipé wọn a kò nífi ránńṣẹ́." + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-team-member.title" +msgstr "Pe àwọn ọmọ ẹgbẹ́ sínú ẹgbẹ́" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.hint" +msgstr "" +"Gẹ́gẹ́ bí o ṣe jẹ́ ìwọ nìkan ni ọmọ ẹgbẹ́ nínú ẹgbẹ́ yìí, a ó yọ ẹgbẹ́ " +"kúrò pẹ̀lú iṣẹ́ àgbéṣe rẹ̀ àti àwọn fáìlì." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ kúrò nínú %s ẹgbẹ́?" + +msgid "modals.leave-and-reassign.forbidden" +msgstr "" +"O kò lè kúrò nínú ẹgbẹ́ tí kò bá sí ọmọ ẹgbẹ́ mìíràn tó ní ìgbéga sí oní " +"ǹǹkan. O lè fẹ́ pa ẹgbẹ́ rẹ́." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.hint1" +msgstr "" +"Ìwọ ni ẹni tí ó ni ẹgbẹ́ yìí. Please select another member to promote to " +"Jọ̀wọ́ yan ọmọ ẹgbẹ́ mìíràn tí yíò ní ìgbéga ẹni tí ó ni nǹkan kí o tó " +"kúrò." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.promote-and-leave" +msgstr "Ṣe ìgbéga kí o kúrò" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.select-member-to-promote" +msgstr "Yan ọmọ ẹgbẹ́ kan tí o ó gbéga" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.title" +msgstr "Kí o tó kúrò" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.accept" +msgstr "Fi ẹgbẹ́ sílẹ̀" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ fi ẹgbẹ́ yìí sílẹ̀?" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.title" +msgstr "Ń fi ẹgbẹ́ sílẹ̀" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.nudge-title" +msgstr "Fi kún iye tó jẹ́" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.accept" +msgstr "Gbé ẹni tó ni nǹkan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.hint" +msgstr "" +"Tí o bá gbé ẹni tí ó ni nǹkan, o ó yìí ojúṣe rẹ pada sí Alábòjútó, losing " +" àwọn ìgbà láàyè díẹ̀ á wà fún ẹgbẹ́ yìí. " + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.message" +msgstr "" +"Ìwọ ni ẹni tí ó ni ẹgbẹ́ yìí lọ́wọ́lọ́wọ́. Are you sure you want to make Ṣé " +"ó dá ọ lójú pé o fẹ́ jẹ́ %s oní nǹkan tuntun fún ẹgbẹ́?" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.title" +msgstr "Ẹni tó ni ẹgbẹ́ tuntun" + +msgid "modals.publish-empty-library.accept" +msgstr "Kọ ọ́ jáde" + +msgid "modals.publish-empty-library.message" +msgstr "Yàrá ìkàwé rẹ ṣófìfo. Ṣé ó dá ọ lójú pé o fẹ́ kọ ọ́ jáde?" + +msgid "modals.publish-empty-library.title" +msgstr "Gbé yàrá ìkàwé tó ṣófìfo jáde" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.accept" +msgstr "Yọ ọ́ kúrò gẹ́gẹ́ bí i yàrá ìkàwé pípín" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.hint" +msgstr "" +"Lọ́gán tí o bá ti yọ ọ́ kúrò gẹ́gẹ́ bí i Fáìlì yàrá ìkàwé pípín , Fáìlì " +"yàrà ìkàwé ti fáìlì yìí á dúró tí á wà fún lílò àwọn fáìlì rẹ tó kù." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.message" +msgstr "Yọ ọ́ kúrò“%s” gẹ́gẹ́ bí yàrá ìkàwé pípín" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.small-nudge" +msgstr "Fọwọ́ làn-ań díẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.hint" +msgstr "" +"O ṣetán láti mú àwọn ẹ̀yà irin iṣẹ́ dé ojú ìwọ̀n ní yàrá ìkàwé pípín. Èyí " +"le fa wàhálà fún àwọn fáìlì mìíràn tí ó ń lò ó." + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.message" +msgstr "Mú àwọn ẹ̀yà irin iṣẹ́ dójú ìwọ̀n nínú iyàram ìkàwé pípín" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.accept" +msgstr "Mú dójú ìwọ̀n" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.cancel" +msgstr "Fagilé e" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.hint" +msgstr "" +"O ṣetán látí mú àwọn ẹ̀yà irin iṣẹ́ yàrá ìkàwé dójú ìwọ̀n . This may affect " +"Èyí lè fa wàhálà fún àwọn fáìlì míràn tí ó ń lò ó." + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.message" +msgstr "Mú ẹ̀yà iyàrá ìkàwé pípín kan dójú ìwọ̀n" + +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "Ẹ̀yà tuntun ti wà, jọ̀wọ́ tún sọ ọ́ jí" + +#: src/app/main/ui/dashboard/team.cljs +msgid "notifications.invitation-email-sent" +msgstr "Ìfipè tí a fi ránńṣẹ́ ti lọ dáadáa" + +#: src/app/main/ui/dashboard/team.cljs +msgid "notifications.invitation-link-copied" +msgstr "ti ṣe àdàkọ ìfipè ọ̀nà ìtọ́ka sí" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "notifications.profile-deletion-not-allowed" +msgstr "O kò le è yọ pírófáìlì rẹ kúro. Ṣe àtún yàn àwọn ẹgbẹ́ kí o tó tẹ̀ síwájú." + +#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs +msgid "notifications.profile-saved" +msgstr "A ti fi pírófáìlì pamọ́ dáadáa!" + +#: src/app/main/ui/settings/change_email.cljs +msgid "notifications.validation-email-sent" +msgstr "Verification email sent to %s. Check your email!" + +msgid "onboarding-v2.before-start.desc1" +msgstr "" +"O ní láti mọ̀ pé oríṣiríṣi ohu ohun èlò ló wà láti ràn ọ́ lọ́wọ́ láti rí " +"gbà bẹ̀rẹ̀ pẹ̀lú Pẹ́ńpọtì, gẹ́gẹ́ bí ohun èlò ìtọ́nisọ́nà àti yútuùbù wa " +"fún ìlànà ìbáni sọ̀rọ̀." + +msgid "onboarding-v2.before-start.desc2" +msgstr "" +"Ẹ̀kún-uń rẹ́rẹ́ àlàyé nípa bí a ó ṣe lo pẹ́ńpọtì . Láti bi àfọwọ́kọ lọ sí " +"síṣe ètò tàbí pípiń àwọn àrà orísi ." + +msgid "onboarding-v2.before-start.desc2.title" +msgstr "Ìtọ́ni sọ́nà Onílò" + +msgid "onboarding-v2.before-start.desc3" +msgstr "O lè wo ìbáṣepọ̀ wa àti ìbáṣepọ̀ ti èyí tí agbègbè wa ṣe." + +msgid "onboarding-v2.before-start.desc3.title" +msgstr "Fídíò àwọn ìbáṣepọ̀" + +msgid "onboarding-v2.before-start.title" +msgstr "Kí o tó bẹ̀rẹ̀" + +msgid "onboarding-v2.newsletter.desc" +msgstr "" +"Ṣe alábàápín ìwé ìròyìn ti pẹ́ńpọtì kí o lè mọ ohun tí ó ń lọ ọjà " +"development progress and new Ìdàgbàsókè, Ìlọsíwájú,àti àwọn ìròyìn ." + +msgid "onboarding-v2.newsletter.news" +msgstr "" +"Fí ìròyìn ránńṣẹ́ sí mi nípa Pẹ́ńpọtì (àwọn bulọ́ọ̀gì,àwọn fídiò " +"ìbáṣepọ̀, àwọn sísàn wọlé...)." + +msgid "onboarding-v2.newsletter.privacy1" +msgstr "Ìfi pamọ́ jẹ wá lógún, ní bí o le kà nípa wa " + +msgid "onboarding-v2.newsletter.privacy2" +msgstr "" +"Àwọn ímeèlì tó ṣe kókó nìknn la ó fi ránńṣẹ́ sí ọ. o lè yọwọ́ kúrò ní " +"ìgbàkììgbàní ìlànà ti ìyọwọ́ kúrò nínú èyíkéyìí ìwé ìròyìn wa." + +msgid "onboarding-v2.newsletter.updates" +msgstr "" +"Fi ìmú dójú ìwọ̀n ọjà ránńṣẹ́ sí mi (àwọn ẹ̀yà yuntun, tú sílẹ̀, ṣà " +"túnṣe...)." + +msgid "onboarding-v2.welcome.desc1" +msgstr "" +"Pẹ́ńpọtì ni orísun ìṣílẹ̀kùn àti pe Kálẹidòsìló ṣe é àti àwọn agbègbè, Ní " +"bi ọ̀pọ̀lọpọ̀ àwọn ènìyàn ti ran ara wọn lọ́wọ́ tẹ́lẹ̀ . Gbgbo wọn ló lè " +"ṣe àjùmọ̀ṣenípa:" + +msgid "onboarding-v2.welcome.desc2" +msgstr "" +"Ìkẹ́kọ̀ọ́ ìta gbangba, pín-in kí ẹ sì jí ròrò nípa Pẹ́ńpọtì, ibi tó wà " +"lọ́wọ́lọ́wọ́ ọ̀jọ́ iwájú pẹ̀lú gbogbo agbègbè àti ìmójútó ẹgbẹ́ pẹ́ńpọtì . " +" ." + +msgid "onboarding-v2.welcome.desc3" +msgstr "" +"Ibi tí a ó ti ri bí a ó ti ṣe àjùmọ̀ṣepọ̀ pẹ̀lú àwọn ìtumọ̀, àwọn ìbéèrè " +"ẹ̀yà ara ẹ̀rọ, ìmójútó síṣe ojúṣe, ìṣọdẹ kòkòrò…" + +msgid "onboarding-v2.welcome.desc3.title" +msgstr "Sísojúṣe ìtọ́sẹ́nà" + +msgid "onboarding-v2.welcome.title" +msgstr "Káàbọ̀ sí pẹ́ńpọtì!" + +msgid "onboarding.choice.team-up.create-team-desc" +msgstr "" +"Lẹ́yìn tí o bá ti fún ẹgbẹ́ rẹ lórúkọ, Ó le pe àwọn ènìyàn láti darapọ̀ mọ́ " +"ẹgbẹ́." + +msgid "onboarding.choice.team-up.create-team-placeholder" +msgstr "Tẹ orúkọ ẹgbẹ́" + +msgid "onboarding.choice.team-up.invite-members" +msgstr "Fìwépè ọmọ àwọn ẹgbẹ́" + +msgid "onboarding.choice.team-up.invite-members-info" +msgstr "" +"Rántí láti fi gbogbo wọn sí i. Àwọn Olùdásílẹ̀, àwọn aṣàpẹẹrẹ, alákóso... " +"onírúúrú dà wọ́n pọ̀ :)" + +msgid "onboarding.choice.team-up.roles" +msgstr "Pè wọ́n pẹ̀lú ojúṣe wọn:" + +msgid "onboarding.newsletter.accept" +msgstr "Bẹ́ẹ̀ni, ṣe alábàpín" + +msgid "onboarding.newsletter.acceptance-message" +msgstr "" +"A ti fi ìbéèrè fún síṣe alá-bápín rẹ ránńṣẹ́, a ó fi ímeèlì ránńṣẹ́ sí ọ " +"látijẹ́rìí sí." + +msgid "onboarding.newsletter.policy" +msgstr "Ètò ìmúlò tí a fi pamọ́." + +msgid "onboarding.newsletter.title" +msgstr "Fẹ́ gba àwọn ìròyìn pẹ́ńpọti?" + +msgid "onboarding.team-modal.create-team" +msgstr "Ṣẹ̀dá ẹgbẹ́ kan" + +msgid "onboarding.team-modal.create-team-desc" +msgstr "" +"A team allows you to collaborate with other Penpot users working in the " +"Ẹgbẹ́ kan yí ó gbà ọ́ láyè láti lè siṣẹ́pọ̀ pẹ̀lú àwọn onílò pẹ́ńpọti tí ó " +"siṣẹ́ nínú àwọn fáìlì àti àwọn iṣẹ́ àgbéṣe kan náà ." + +msgid "onboarding.team-modal.create-team-feature-1" +msgstr "Àwọn fáìlì àti àwọn iṣẹ́ àgbéṣe tí kò lópin" + +msgid "onboarding.team-modal.create-team-feature-2" +msgstr "Multiplayer edition" + +msgid "onboarding.team-modal.create-team-feature-3" +msgstr "àwọn ipa ìṣàkóṣo" + +msgid "onboarding.team-modal.create-team-feature-4" +msgstr "Àwọn ọmọ ẹgbẹ́ tí kò lópin" + +msgid "onboarding.team-modal.create-team-feature-5" +msgstr "100% Ọ̀fẹ́!" + +msgid "onboarding.templates.subtitle" +msgstr "Àwọn àwòṣe díẹ̀ nìyí níbí." + +msgid "onboarding.templates.title" +msgstr "Bẹ̀rẹ̀ sí ṣe ẹ̀yà alárà" + +msgid "onboarding.welcome.alt" +msgstr "Pẹ́ńpọtì" + +#: src/app/main/ui/auth/recovery.cljs +msgid "profile.recovery.go-to-login" +msgstr "Lọ láti wọlé" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "Èwo ni ohun èlò irin iṣẹ́ tí o ní ìmọ̀ kíkún nínú pẹ̀lú rẹ̀?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "Mọ́kànlá-Ọgbọ̀n" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "Méjì – mẹ́wàá" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "Mọ́kànlélọ́gbọ̀n-Àádọ́ta" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "O ´ pọ̀jù" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Àdòbí XD" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Káńfà" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "" +"Báwo ni ó ti le ṣe àpèjúwe bó ṣe dára tó lórí ìrírí rẹ lórí iṣẹ́ tí o ń ṣe " +"lọ́wọ́..." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Olùyà nǹkan" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Olùdásílẹ̀" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "Ṣàwárí sí i nípa pẹ́ńpọtì" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Fígímà" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Olùdásílẹ̀/VP" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Oníṣẹ́ ni mí" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Gba kóòdù láti inú iṣẹ́ àgbéṣe mi " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... wíwò ètò ọnà , ìrírí àwọn ohun ìní, àwọn ètò ọnà, abbl." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "Ìkógun wọ̀lú" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Fi èsì sílẹ̀ fún iṣẹ́ àgbéṣe ẹgbẹ́ mi" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "Ẹjẹ́ 'ká bẹ̀rẹ̀ !" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Ohun títà tàbí iṣẹ́ àgbéṣe Olùṣàkóso" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Títajà" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "Ju àádọ́ta lọ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-a-tool" +msgstr "N kò tí lo irin iṣẹ́ eto ọnà tẹ́lẹ̀ rí" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Èyí tó kàn" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Kòsí" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Òmíìràn(ní pàtó)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "Mò ń siṣẹ́ àgbéṣẹ ti ara mi ni" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "Tàtẹ̀yìn wá" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Báwo lo ṣe ń gbèrò lórí bí o ṣe lo pẹ́ńpọtì?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Ṣe àṣàyàn" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Yàwòrán" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Díẹ̀" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Bẹ̀rẹ̀" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Bẹ̀rẹ̀ láti lórí iṣẹ́ àgbéṣe mi" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Akẹ́kọ̀ọ́ tàbí olùkọ̀ọ́" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "kín ni ìwọ̀n ẹgbẹ́ rẹ ?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Ṣàyẹ̀wọ̀ pẹ́ńpọtì láti rí pé ó bẹ́gbẹ́ mu " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Gbìyànjú láti mọ̀ kí o tó bẹ̀rẹ̀ sí lo pẹ́ńpọtì ní àyíká" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "... wáyà-fèrèsé, ìrìàjò àwọn onílò & sísàn, àwọn igi ìyíkiri, abbl." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Iṣẹ́ lórí èròǹgbà àti àwọn èrò" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Èsì rẹ yó ràn wá lọ́wọ́ láti jẹ́ kó yé wa lórí kín ni ìhùwàsí rẹ àti àwọn " +"ohun tí o fẹ́ràn jù èyí yó jẹ́ kí á má ṣàmúlò pẹ́ńpọtì gẹ́gẹ́ bí èyí tí ó " +"wúlò àti ohun èlò fun ìgbáládùn." + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Yọ kúrò" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "settings.multiple" +msgstr "Dàárú" + +# SECTIONS +msgid "shortcut-section.basics" +msgstr "Ipìlẹ̀" + +msgid "shortcut-section.viewer" +msgstr "Ólùwò" + +msgid "shortcut-section.workspace" +msgstr "Àaye ìṣẹ́" + +# SUBSECTIONS +msgid "shortcut-subsection.alignment" +msgstr "Titete" + +msgid "shortcut-subsection.edit" +msgstr "Sàtunkọ" + +msgid "shortcut-subsection.general-viewer" +msgstr "àbùdá" + +msgid "shortcut-subsection.main-menu" +msgstr "Akojọ ólórì aṣyn" + +msgid "shortcut-subsection.modify-layers" +msgstr "Yípàdá fẹ́lẹ́fẹ́lẹ́" + +msgid "shortcut-subsection.navigation-dashboard" +msgstr "Lìlọ́ kìrì" + +msgid "shortcut-subsection.navigation-viewer" +msgstr "Lìlọ́ kìrì" + +msgid "shortcut-subsection.navigation-workspace" +msgstr "Lìlọ́ kìrì" + +msgid "shortcut-subsection.panels" +msgstr "Àwọ̀n pánẹ̀lí" + +msgid "shortcut-subsection.path-editor" +msgstr "Àwọ́n ọna" + +msgid "shortcut-subsection.shape" +msgstr "Àwọ́n apẹ́rẹ́" + +msgid "shortcut-subsection.text-editor" +msgstr "Àwọ́n ọ́rọ̀" + +msgid "shortcut-subsection.tools" +msgstr "Àwọ́n irínṣẹ̀" + +msgid "shortcut-subsection.zoom-viewer" +msgstr "Sun-un" + +msgid "shortcut-subsection.zoom-workspace" +msgstr "Sun-un" + +msgid "shortcuts.add-comment" +msgstr "Ọ́rọ̀íwòye" + +msgid "shortcuts.add-node" +msgstr "Fí ípàdé kùn" + +msgid "shortcuts.align-bottom" +msgstr "Sópọ sí ísàle" + +msgid "shortcuts.align-center" +msgstr "Parapọ àárin" + +msgid "shortcuts.align-hcenter" +msgstr "Páràpọ àárin naa" + +msgid "shortcuts.align-justify" +msgstr "Ṣe dèédé si ìdálárè" + +msgid "shortcuts.align-left" +msgstr "Sosi ósì" + +msgid "shortcuts.align-right" +msgstr "Sosi ọtún" + +msgid "shortcuts.align-top" +msgstr "Sopo si òké" + +msgid "shortcuts.align-vcenter" +msgstr "Tẹle àárin ni inàró" + +msgid "shortcuts.artboard-selection" +msgstr "Ṣẹ̀dá ọ̀kọ̀ lati yìyán" + +msgid "shortcuts.bold" +msgstr "Yipàdà to han" + +msgid "shortcuts.bool-difference" +msgstr "Iyàtò Boolean" + +msgid "shortcuts.bool-exclude" +msgstr "Boolean tà yọ̀kúro" + +msgid "shortcuts.bool-intersection" +msgstr "ikòritá Boolean" + +msgid "shortcuts.bool-union" +msgstr "Asépọ̀ Boolean" + +msgid "shortcuts.bring-back" +msgstr "Fírànṣẹ́ si ẹ́hin" + +msgid "shortcuts.bring-backward" +msgstr "Ran pàdà sí ehin" + +msgid "shortcuts.bring-forward" +msgstr "Mù siwájù" + +msgid "shortcuts.bring-front" +msgstr "Mù si wájù" + +msgid "shortcuts.clear-undo" +msgstr "Pa yipàdá rẹ" + +msgid "shortcuts.copy" +msgstr "Dàákọ" + +msgid "shortcuts.create-component" +msgstr "Ṣẹ̀dá pàátì" + +msgid "shortcuts.create-new-project" +msgstr "Ṣẹ̀dá títún" + +msgid "shortcuts.cut" +msgstr "Ge" + +msgid "shortcuts.decrease-zoom" +msgstr "Sun-un jàdé" + +msgid "shortcuts.delete" +msgstr "Pàrẹ" + +msgid "shortcuts.delete-node" +msgstr "Pa ipàdé" + +msgid "shortcuts.detach-component" +msgstr "Yà paati" + +msgid "shortcuts.draw-curve" +msgstr "Yìyí" + +msgid "shortcuts.draw-ellipse" +msgstr "Ẹ́lipsì" + +msgid "shortcuts.draw-nodes" +msgstr "Fà ọnà" + +msgid "shortcuts.draw-path" +msgstr "Ọnà" + +msgid "shortcuts.draw-rect" +msgstr "Ònìgún mèrìn" + +msgid "shortcuts.draw-text" +msgstr "Ọ́rọ̀" + +msgid "shortcuts.duplicate" +msgstr "Ṣe pidánpidán" + +msgid "shortcuts.escape" +msgstr "Fàgílèè" + +msgid "shortcuts.export-shapes" +msgstr "Ókèéré apẹ̀rẹ̀" + +msgid "shortcuts.fit-all" +msgstr "Sun-un látì ba gbògbò rẹ̀ mú" + +msgid "shortcuts.flip-horizontal" +msgstr "Yipadà ní pẹ̀tẹ̀lẹ̀" + +msgid "shortcuts.flip-vertical" +msgstr "Yipadà ní ínàró" + +msgid "shortcuts.font-size-dec" +msgstr "Dìn íwọ̀n fonti kù" + +msgid "shortcuts.font-size-inc" +msgstr "Alekun iwọn fonti" + +msgid "shortcuts.go-to-drafts" +msgstr "Lọ sí iyáwòran" + +msgid "shortcuts.go-to-libs" +msgstr "Lọ si awọn ílé-Ikàwé tí a pín" + +msgid "shortcuts.go-to-search" +msgstr "Wàá" + +msgid "shortcuts.group" +msgstr "Ẹgbẹ" + +msgid "shortcuts.h-distribute" +msgstr "Pinpín kàákírì pètèlè" + +msgid "shortcuts.hide-ui" +msgstr "Ífìhan / Tọju UI" + +msgid "shortcuts.increase-zoom" +msgstr "Sùn-un sínú" + +msgid "shortcuts.insert-image" +msgstr "Fí àwóran sii" + +msgid "shortcuts.italic" +msgstr "Yipàdà ítalikì" + +msgid "shortcuts.join-nodes" +msgstr "Dàràpọ̀ awọn ipàdé" + +msgid "shortcuts.letter-spacing-dec" +msgstr "Din aayé lẹ́tà kù" + +msgid "shortcuts.letter-spacing-inc" +msgstr "Alekun aayé lẹ́tà" + +msgid "shortcuts.line-height-dec" +msgstr "Dinkù gígà ílà" + +msgid "shortcuts.line-height-inc" +msgstr "Ílà ton gá sókè" + +msgid "shortcuts.line-through" +msgstr "Íyìpàdà ílà to yọ̀rí" + +msgid "shortcuts.make-corner" +msgstr "Ṣè ígùn" + +msgid "shortcuts.make-curve" +msgstr "Ṣe ìsépọ" + +msgid "shortcuts.mask" +msgstr "Ibòjú" + +msgid "shortcuts.merge-nodes" +msgstr "Dàpọ̀ awọ́n apa" + +msgid "shortcuts.move" +msgstr "Gbé" + +msgid "shortcuts.move-fast-down" +msgstr "Sàré lọ́ sí isàlẹ̀" + +msgid "shortcuts.move-fast-left" +msgstr "Gbé sí osi kiákiá" + +msgid "shortcuts.move-fast-right" +msgstr "Gbé si ọ̀tún kiákiá" + +msgid "shortcuts.move-fast-up" +msgstr "Gbé si òké kiákiá" + +msgid "shortcuts.move-nodes" +msgstr "Gbé ipàdé" + +msgid "shortcuts.move-unit-down" +msgstr "Gbé sílè" + +msgid "shortcuts.move-unit-left" +msgstr "Gbé osi" + +msgid "shortcuts.move-unit-right" +msgstr "Gbé sọtùn" + +msgid "shortcuts.move-unit-up" +msgstr "Gbé sóke" + +msgid "shortcuts.next-frame" +msgstr "Ọ̀kọ̀ tókan" + +msgid "shortcuts.not-found" +msgstr "Kò sí awọ́n ọ̀nà abùjá ti à rii" + +msgid "shortcuts.opacity-0" +msgstr "Fí akomo sí ipò 100%" + +msgid "shortcuts.opacity-1" +msgstr "Fi akomo si ipo 10%" + +msgid "shortcuts.opacity-2" +msgstr "Fi akomo si ipo 20%" + +msgid "shortcuts.opacity-3" +msgstr "Fi akomo si ipo 30%" + +msgid "shortcuts.opacity-4" +msgstr "Fi akomo si ipo 40%" + +msgid "shortcuts.opacity-5" +msgstr "Fi akomo si ipo 50%" + +msgid "shortcuts.opacity-6" +msgstr "Fi akomo si ipo 60%" + +msgid "shortcuts.opacity-7" +msgstr "Fi akomo si ipo 70%" + +msgid "shortcuts.opacity-8" +msgstr "Fi akomo si ipo 80%" + +msgid "shortcuts.opacity-9" +msgstr "Fi akomo si ipo 90%" + +msgid "shortcuts.open-color-picker" +msgstr "Ólùṣà àwọ̀" + +msgid "shortcuts.open-dashboard" +msgstr "Lọ si dasibodu" + +msgid "shortcuts.open-inspect" +msgstr "Lọ si apaa ayewo olùwò" + +msgid "shortcuts.open-viewer" +msgstr "Lọ si apaa ibaraẹnisọrọ olùwò" + +msgid "shortcuts.or" +msgstr " tabi " + +msgid "shortcuts.paste" +msgstr "Lẹẹmọ" + +msgid "shortcuts.prev-frame" +msgstr "Ọkọ ti tẹlẹ" + +msgid "shortcuts.redo" +msgstr "Tunṣe" + +msgid "shortcuts.reset-zoom" +msgstr "tun sun" + +msgid "shortcuts.search-placeholder" +msgstr "Wa awọn ọna abuja" + +msgid "shortcuts.select-all" +msgstr "Ṣa gbogbo re" + +msgid "shortcuts.select-parent-layer" +msgstr "Yan Obii pẹlẹbẹ" + +msgid "shortcuts.show-shortcuts" +msgstr "Ifihan / Itọju ọna abùjá" + +msgid "shortcuts.snap-nodes" +msgstr "Yaa si awon apa" + +msgid "shortcuts.snap-pixel-grid" +msgstr "Yaa si pikseli ilana" + +msgid "shortcuts.start-measure" +msgstr "Bẹ̀rẹ̀ wíwọ̀n" + +msgid "shortcuts.stop-measure" +msgstr "da wíwọ̀n duro" + +msgid "shortcuts.text-align-center" +msgstr "Parapọ saarin" + +msgid "shortcuts.text-align-justify" +msgstr "Sedede lárè" + +msgid "shortcuts.text-align-left" +msgstr "mo si osi" + +msgid "shortcuts.text-align-right" +msgstr "Mo sotun" + +msgid "shortcuts.thumbnail-set" +msgstr "Se étò awòn áwòran fun fidio" + +msgid "shortcuts.toggle-alignment" +msgstr "Iyipada titete ìmúdàgba" + +msgid "shortcuts.toggle-assets" +msgstr "Yi dukia pada" + +msgid "shortcuts.toggle-colorpalette" +msgstr "Yi paleti awọ pada" + +msgid "shortcuts.toggle-focus-mode" +msgstr "Yi ipo idojukọ pada" + +msgid "shortcuts.toggle-fullscreen" +msgstr "Yi kuro ni fulscrin" + +msgid "shortcuts.toggle-grid" +msgstr "Fihan / Tọju ilana" + +msgid "shortcuts.toggle-layers" +msgstr "Yi awon pelebe yii pada" + +msgid "shortcuts.toggle-lock" +msgstr "Tiipa / Siilẹ" + +msgid "shortcuts.toggle-lock-size" +msgstr "títìipa lápàkàn" + +msgid "shortcuts.toggle-rules" +msgstr "Fifihan / Titọju ólórì" + +msgid "shortcuts.toggle-scale-text" +msgstr "Yipada asekale ọrọ" + +msgid "shortcuts.toggle-snap-guide" +msgstr "Pín si awọ́n ítọ̀nisọ́nà" + +msgid "shortcuts.toggle-textpalette" +msgstr "Yíípàda ọrọ paleti" + +msgid "shortcuts.toggle-visibility" +msgstr "Fihan / Toju re" + +msgid "shortcuts.toggle-zoom-style" +msgstr "Yiipada asa sun-un" + +msgid "shortcuts.underline" +msgstr "Yii abẹlẹ" + +msgid "shortcuts.undo" +msgstr "Yi pada" + +msgid "shortcuts.ungroup" +msgstr "Tu ẹgbẹ" + +msgid "shortcuts.unmask" +msgstr "Aiboju" + +msgid "shortcuts.v-distribute" +msgstr "Pin ni inaro" + +msgid "shortcuts.zoom-lense-decrease" +msgstr "Dín lẹnsì sisun kù" + +msgid "shortcuts.zoom-lense-increase" +msgstr "Lílọ̀soké lẹnsi sisun" + +msgid "shortcuts.zoom-selected" +msgstr "Yiyan pelu sun-un" + +#: src/app/main/ui/dashboard/team.cljs +msgid "team.webhooks.max-length" +msgstr "Orúkọ̀ webhook kò gbọ́dọ̀ kọjà awọ́n óhun kíkọ́ 2048." + +#: src/app/main/ui/dashboard/files.cljs +msgid "title.dashboard.files" +msgstr "%s - Penpot" + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "title.dashboard.font-providers" +msgstr "Pipese oniru fọnti - %s - Penpot" + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "title.dashboard.fonts" +msgstr "Fọnti - %s - Penpot" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "title.dashboard.projects" +msgstr "Awọn ísè agbèsè - %s - Penpot" + +#: src/app/main/ui/dashboard/search.cljs +msgid "title.dashboard.search" +msgstr "Wà - %s - Penpot" + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/auth.cljs +msgid "title.default" +msgstr "Penpot – Se onìrú òmínìra fun awọ̀n ẹ̀gbẹ̀" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "Profaili – Aami wiwọle" + +#: src/app/main/ui/settings/feedback.cljs +msgid "title.settings.feedback" +msgstr "Fi esi- Penpot" + +#: src/app/main/ui/settings/options.cljs +msgid "title.settings.options" +msgstr "Awon eto - Penpot" + +#: src/app/main/ui/settings/password.cljs +msgid "title.settings.password" +msgstr "Ọrọigbaníwólé - Penpot" + +#: src/app/main/ui/settings/profile.cljs +msgid "title.settings.profile" +msgstr "Profaili - Penpot" + +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-invitations" +msgstr "Ifíwẹ́pe - %s - Penpot" + +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-members" +msgstr "Ọ́́mọ̀ ẹgbẹ - %s - Penpot" + +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-settings" +msgstr "Awọn eto - %s - Penpot" + +msgid "title.team-webhooks" +msgstr "Webhooks - %s - Penpot" + +#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs +msgid "title.viewer" +msgstr "%s –Ipo wíwò - Penpot" + +#: src/app/main/ui/workspace.cljs +msgid "title.workspace" +msgstr "%s - Penpot" + +#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs +msgid "viewer.empty-state" +msgstr "No boards found on the page." + +#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs +msgid "viewer.frame-not-found" +msgstr "A kò ri ọ̀kọ̀." + +msgid "viewer.header.comments-section" +msgstr "Ọrọìwòye (%s)" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.dont-show-interactions" +msgstr "Maa fi ìbaráẹ̀nìsepọ han" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.fullscreen" +msgstr "Fé ká gḅọgbọ síkírínì" + +msgid "viewer.header.inspect-section" +msgstr "Ayéwò (%s)" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.interactions" +msgstr "Ibaraenisépọ̀" + +msgid "viewer.header.interactions-section" +msgstr "Awọ̀n Ibaraenisépọ̀ (%s)" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.share.copy-link" +msgstr "Da línkì kọ̀" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.show-interactions" +msgstr "Ifihan Ibaraenisépọ̀" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.sitemap" +msgstr "Áwòran átọ̀kà ílẹ̀" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hcenter" +msgstr "Paŕàpọ̀ sí petelè aarin (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hdistribute" +msgstr "Pin aayè ni pètélè (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hleft" +msgstr "Páràpọ̀ sí òsì (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hright" +msgstr "Páràpọ̀ sí ọtun (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vbottom" +msgstr "Páràpọ̀ sí isàlẹ̀ (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vcenter" +msgstr "Páràpọ̀ sí inàro aarin (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vdistribute" +msgstr "Pin aayè inàró (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vtop" +msgstr "Párápọ̀ sóké (%s)" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.assets" +msgstr "Awọ̀n dukia" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.box-filter-all" +msgstr "Gbọ̀gbọ̀ awọ̀n dukia" + +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.colors" +msgstr "Áwò" + +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.components" +msgstr "Awọ̀n eroja" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.create-group" +msgstr "Ṣẹ̀dá ẹ̀gbẹ̀ kan" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.create-group-hint" +msgstr "páarẹ̀" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.duplicate" +msgstr "ẹẹdà" + +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.edit" +msgstr "Ṣatunkọ" + +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.graphics" +msgstr "Awọn Awòran" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.group" +msgstr "Ẹgbẹ" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.group-name" +msgstr "Orúkọ̀ ẹgbẹ" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.libraries" +msgstr "Ílè-iwè" + +msgid "workspace.assets.local-library" +msgstr "Ílè-iwè agbegbe" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.not-found" +msgstr "Ko si ohun-ini ti a rii" + +msgid "workspace.assets.open-library" +msgstr "Ṣii faili ìlé-ikáwè" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.rename" +msgstr "Lo oruko imiran" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.rename-group" +msgstr "Lo oruko imiran fun ẹgbẹ" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.search" +msgstr "Wa dukia" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "Iĺẹ̀ iwekika ti a pln" + +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.typography" +msgstr "Iwe itẹwe" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.font-id" +msgstr "Fonti" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.font-size" +msgstr "Iwon" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.font-variant-id" +msgstr "Iyatọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.letter-spacing" +msgstr "Aaye leta" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.line-height" +msgstr "Giga ila" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/inspect/attributes/text.cljs, src/app/main/ui/inspect/attributes/text.cljs +msgid "workspace.assets.typography.sample" +msgstr "Ag" + +msgid "workspace.assets.typography.text-styles" +msgstr "Oniru ọrọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.text-transform" +msgstr "Iyipádà ọrọ" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.ungroup" +msgstr "Títù ẹ̀gbẹ́" + +msgid "workspace.focus.focus-mode" +msgstr "Ipo Idojukọ" + +msgid "workspace.focus.focus-off" +msgstr "Pa Ídòjúkọ" + +msgid "workspace.focus.focus-on" +msgstr "Tan Ídòjúkọ" + +msgid "workspace.focus.selection" +msgstr "Yiyan" + +#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs +msgid "workspace.gradients.linear" +msgstr "Itesiwaju gerege" + +#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs +msgid "workspace.gradients.radial" +msgstr "Itesiwaju Radial" + +msgid "workspace.header.menu.disable-scale-content" +msgstr "Pa asèkalẹ̀ iwọnbà" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-scale-text" +msgstr "Pa ọrọ iwọnba" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-grid" +msgstr "Pa yipada si ilana" + +msgid "workspace.header.menu.disable-snap-pixel-grid" +msgstr "Pa yipada si piseli" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-dynamic-alignment" +msgstr "Tan imudagba to Sedede" + +msgid "workspace.header.menu.enable-scale-content" +msgstr "Tan asèkalẹ̀ iwọnbà" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-scale-text" +msgstr "Tan iwọnbà ọrọ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-grid" +msgstr "Yipada si ilana" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-guides" +msgstr "Yipada si itọ̀nìsọna" + +msgid "workspace.header.menu.enable-snap-pixel-grid" +msgstr "Tan Yipada si piseli" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-grid" +msgstr "Tọ̀jú ilana" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-palette" +msgstr "Tọ̀jú awọ palẹti" + +msgid "workspace.header.menu.hide-pixel-grid" +msgstr "Tọ̀jú pisẹli ilana" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-rules" +msgstr "Tọ̀jú awọn ólòrí" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-textpalette" +msgstr "Tọ̀jú awọn fọnti paleti" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.edit" +msgstr "Satunkọ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.file" +msgstr "Faili" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.help-info" +msgstr "Iranlọwọ ati alaye" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.preferences" +msgstr "Awọn àyánfẹ̀" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.view" +msgstr "Wiwo" + +msgid "workspace.header.menu.redo" +msgstr "Tun ṣe" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.select-all" +msgstr "Sa gbogbo rẹ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-grid" +msgstr "ifihan akoj" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-palette" +msgstr "Fi awo paleti han" + +msgid "workspace.header.menu.show-pixel-grid" +msgstr "Fi piseli ilana han" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-rules" +msgstr "Ifihan awọ̀n ólórí" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-textpalette" +msgstr "Ifihan fonti paleti" + +msgid "workspace.header.menu.undo" +msgstr "Yi pada" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.reset-zoom" +msgstr "Tunto" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.save-error" +msgstr "àsisè lórì fíf́ipamọ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.saved" +msgstr "Ti a fipamọ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.saving" +msgstr "Fifipámọ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.unsaved" +msgstr "Awọn ayípàdà ti kó ni fipamọ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.viewer" +msgstr "Ipo wiwo(%s)" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "sun-un" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fill" +msgstr "Kun - óṣùwọn to kun" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fit" +msgstr "Báràmù - óṣùwọn to Báràmù" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fit-all" +msgstr "Suun kí o bá gbógbó rẹ̀ dọ́gbà" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-full-screen" +msgstr "Áseàfihan to kún" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-selected" +msgstr "Ṣuum lati yan" + +msgid "workspace.layout_grid.editor.title" +msgstr "Ilànà àyípàdà" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.add" +msgstr "Afikùn" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.colors" +msgstr "%s awọn awọ" + +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "Kòyi si oniruiru awọ ni ilé-ikàwé re" + +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "Ko si oniruiru iwé itẹ̀wé ni ilé ikàwé rẹ̀" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.hsv" +msgstr "HSV" + +#: src/app/main/ui/workspace/colorpicker/libraries.cljs, src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.recent-colors" +msgstr "Awọn àwò tálò láipẹ̀" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgb-complementary" +msgstr "RGB Ibáramù" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgba" +msgstr "RGBA" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.save-color" +msgstr "Fi awọn oniru awọ pamọ" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.components" +msgstr "%s Ẹya ara ẹrọ" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.file-library" +msgstr "Faili ilé ikàwé" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.graphics" +msgstr "%s ayaworan" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.libraries" +msgstr "Awọn Ílè íkawè" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library" +msgstr "Ílè íkawè" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library-updates" +msgstr "Ílè íkawè ímùdojúiwọn" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.no-libraries-need-sync" +msgstr "Kò si Ilé kàwé ti a pin si ímùdojúiwọn" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.shared-libraries" +msgstr "Awọn ilé kàwé tí a pìn" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.libraries.text.multiple-typography" +msgstr "Óríṣí awọn íwè itẹ̀wé" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.libraries.text.multiple-typography-tooltip" +msgstr "Tú gbógbó lińkí awọn íwè itẹ̀wé" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.typography" +msgstr "%s awọn íwè itẹ̀wé" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.update" +msgstr "ímùdojúiwọn" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "wò gbògbò awọn ayípàdà" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.updates" +msgstr "Awọn ímùdojúiwọn" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.add-interaction" +msgstr "Tẹ amí + làtí fi íbàràénisépọ̀ kun" + +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "workspace.options.blur-options.title" +msgstr "Baìbaì" + +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "workspace.options.blur-options.title.group" +msgstr "Ẹ̀gdẹ́ Baìbaì" + +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "workspace.options.blur-options.title.multiple" +msgstr "Asayan Baìbaì" + +#: src/app/main/ui/workspace/sidebar/options/page.cljs +msgid "workspace.options.canvas-background" +msgstr "Kánfásì abẹ́le" + +msgid "workspace.options.clip-content" +msgstr "Ábẹrẹ́ ákoonù" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs +msgid "workspace.options.component" +msgstr "Apakan" + +msgid "workspace.options.component.copy" +msgstr "Ádàakọ" + +msgid "workspace.options.component.edit-annotation" +msgstr "Ṣatunkọ àkọ̀silẹ̀" + +msgid "workspace.options.component.main" +msgstr "Ólòrí" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints" +msgstr "Awọn ihámọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.bottom" +msgstr "Ídì" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.center" +msgstr "Aarin" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.left" +msgstr "Òsi" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.leftright" +msgstr "Osi ati otun" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.right" +msgstr "Ọ̀tún" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.scale" +msgstr "Íwọ́n" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.top" +msgstr "Ókè" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.topbottom" +msgstr "Ókè ati Ídí" + +#: src/app/main/ui/workspace/sidebar/options.cljs +msgid "workspace.options.design" +msgstr "Ónirú" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export" +msgstr "Sí ilẹ́ òkèeré" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs +msgid "workspace.options.export.suffix" +msgstr "afikun ọrọ niipárí" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-complete" +msgstr "Gbígbè okeere ti pari" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object" +msgstr "Gbígbè okeere …" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object-error" +msgstr "Gbígbè okeere kuna" + +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.fill" +msgstr "Kún" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.add-flow-start" +msgstr "Safikun ibẹrè ṣiṣan" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-start" +msgstr "ibẹrè ṣiṣan" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-starts" +msgstr "íbẹrè awọn ṣiṣan" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.auto" +msgstr "Aifọ́wọyi" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.grid-title" +msgstr "Ilánà" + +msgid "workspace.options.grid.params.color" +msgstr "Awọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.columns" +msgstr "Awọn ọwọn" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.gutter" +msgstr "Gota" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.height" +msgstr "Òkè" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.margin" +msgstr "Àlà" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.rows" +msgstr "Àwọn orí ìlà ìbú" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.set-default" +msgstr "Fi sípò abínibí" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.size" +msgstr "Ìwọ̀n" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type" +msgstr "Irú" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.bottom" +msgstr "ìsàlẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.center" +msgstr "Àárín" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.left" +msgstr "Òsì" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.right" +msgstr "Ọ̀tún" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.stretch" +msgstr "Nà" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.top" +msgstr "Òkè" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.use-default" +msgstr "Lo ipò abínibí" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.width" +msgstr "Ìgbòrò" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.row" +msgstr "Àwọn orị ìlà ìbú" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.square" +msgstr "Alápoméjì" + +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.group-fill" +msgstr "Ẹ̀kún ẹgbẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.group-stroke" +msgstr "Ẹgba ẹgbẹ́" + +msgid "workspace.options.height" +msgstr "Gíga" + +msgid "workspace.options.inspect" +msgstr "Ṣàyẹ̀wò" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-action" +msgstr "Ìgbésẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-after-delay" +msgstr "Lẹ́yìn ìdádúro" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation" +msgstr "Àwòrán abẹ̀mí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-dissolve" +msgstr "Túká" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-none" +msgstr "Kòsí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-push" +msgstr "Tì" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-slide" +msgstr "Aṣàfihàn" + +msgid "workspace.options.interaction-auto" +msgstr "Ọkọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-background" +msgstr "Fi àyíká ìtẹ̀lẹ̀ ìlànà síi" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-outside" +msgstr "Páadé tí o bá n tẹ ìta" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay" +msgstr "Pa ìlànà ìtẹ̀lẹ̀ dé" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay-dest" +msgstr "Pa ìlànà ìtẹ̀lẹ̀ dé: %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-delay" +msgstr "Ìdádúró" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-destination" +msgstr "Èbúté" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-duration" +msgstr "Ịgbà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing" +msgstr "Rírokùn" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease" +msgstr "Ìrọ̀rùn" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in" +msgstr "Rọra wọlé" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in-out" +msgstr "Rọra wọlé jáde" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-out" +msgstr "Rọra jáde" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-linear" +msgstr "Ilà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-in" +msgstr "Inú" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-enter" +msgstr "Atọ́ka ìwọnú" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-leave" +msgstr "Atọ́ka kíkúrò" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-ms" +msgstr "ms" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to" +msgstr "Lílọ kiri sí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to-dest" +msgstr "Lílo kiri sí: %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-none" +msgstr "(Akò ṣètò)" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-offset-effect" +msgstr "Ipa àìṣedédé" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-on-click" +msgstr "Tẹ orí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay" +msgstr "Ṣíìtẹ̀lé ìlànà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay-dest" +msgstr "Ṣí ìtẹ̀lé ìlànà: %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-url" +msgstr "Ṣí URL" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-out" +msgstr "Jáde" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-center" +msgstr "Àáriń ìsàlẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-left" +msgstr "Ìsàlẹ̀ òsì" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-right" +msgstr "Ìsàḷ̀ẹ̀ ọ̀tún" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-center" +msgstr "Àárín" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-manual" +msgstr "Aláfọwóṣe" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-center" +msgstr "Àárín òkè" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-left" +msgstr "Òkè òsì" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-right" +msgstr "Òkè ọ̀tún" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-position" +msgstr "Ipò" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-preserve-scroll" +msgstr "Ṣe ìtọ́jú ipò àyílọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-prev-screen" +msgstr "Aṣàfihàn àtẹ̀yìnwá" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-relative-to" +msgstr "Ìbátan sí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-self" +msgstr "Tìkara" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay" +msgstr "Àyípadà ìtẹ̀lé ìlànà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay-dest" +msgstr "Àyípadà ìtẹ̀lé ìlànà: %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-trigger" +msgstr "Okùnfà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-url" +msgstr "URL" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-hovering" +msgstr "Nígbàtí óhún rábàbà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-pressing" +msgstr "Nígbàtị óhún tẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interactions" +msgstr "Àwọn ìbáraẹniṣepọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color" +msgstr "Àwọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color-burn" +msgstr "Ṣẹ̀dà àwọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color-dodge" +msgstr "Òpó àwọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.darken" +msgstr "Ṣókuǹkùn" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.difference" +msgstr "Ìyàtọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.exclusion" +msgstr "Ìyàsọ́tọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.hard-light" +msgstr "Iná líle" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.hue" +msgstr "Ọdà" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.lighten" +msgstr "Fẹ́ẹ́rẹ́fẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.luminosity" +msgstr "Ìmọ́lẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.multiply" +msgstr "Ìsọdipúpọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.normal" +msgstr "Déédé" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.overlay" +msgstr "Ìtẹ̀lẹ́ ìlànà" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.saturation" +msgstr "Ẹ̀kúnrẹ́rẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.screen" +msgstr "Aṣàfihàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.soft-light" +msgstr "Ìmọ́lẹ̀ rokoṣo" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title" +msgstr "Ìpele" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title.group" +msgstr "Ẹgbẹ́ ìpele" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title.multiple" +msgstr "Egbẹ́ ààyò" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.advanced-ops" +msgstr "Ànàálè ìtẹ̀síwájú" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-max-h" +msgstr "Ibi tó ga jùlọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-max-w" +msgstr "Ìgbòrò tó ga jù" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-min-h" +msgstr "Gíga to kéré jù lọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-min-w" +msgstr "Ìgbòrò tó kéré jù lọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-max-h" +msgstr "Gíga tó pọ̀jù" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-max-w" +msgstr "Ìgbòrò tí pòjù" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-min-h" +msgstr "Gíga tó kéré jùlọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-min-w" +msgstr "Gbígbòrò tó kéré jù lọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.bottom" +msgstr "Ìdí" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column" +msgstr "Ìlà òòró" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column-reverse" +msgstr "Ìlà òòró yíyípadà" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row" +msgstr "Ilà ìbú" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row-reverse" +msgstr "Ilà ìbú yíyípadà" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.gap" +msgstr "Àlàfo" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.left" +msgstr "Òsì" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin" +msgstr "Etí ìwé" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin-all" +msgstr "Gbogbo àwọn àwòrán" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin-simple" +msgstr "Etí ìwé ẹyọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.packed" +msgstr "tí wọn dì" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding" +msgstr "Ìtẹ̀wọ́nú" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-all" +msgstr "Gbogbo ẹ̀gbẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-simple" +msgstr "Ìtẹ̀wọ́nú pọ́nbélé" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.right" +msgstr "Ọ̀tún" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-around" +msgstr "Àyè àyíká" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-between" +msgstr "Àyè àárín" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.top" +msgstr "Òkè" + +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.more-colors" +msgstr "Àwọn àwọ̀ púpọ̀ sí i" + +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.more-lib-colors" +msgstr "Àwọn yàrá àwọ̀ púpọ̀ sí I" + +msgid "workspace.options.opacity" +msgstr "Àìríran" + +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.position" +msgstr "Ipò" + +#: src/app/main/ui/workspace/sidebar/options.cljs +msgid "workspace.options.prototype" +msgstr "Ìtẹ̀lé ìlànà" + +msgid "workspace.options.radius" +msgstr "Ìdáméjì òbìrìkìtiì" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-bottom-left" +msgstr "Apá òsì ìsàlẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-bottom-right" +msgstr "Apá ọ̀tún ìsàle" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-top-left" +msgstr "Òkè òsì" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-top-right" +msgstr "Òkè ọ̀tún" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius.all-corners" +msgstr "Àwọn gbogbo igun" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius.single-corners" +msgstr "Àwọn igun olómìnira" + +msgid "workspace.options.recent-fonts" +msgstr "Àìpẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.retry" +msgstr "Tún gbìyànjú" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.rotation" +msgstr "Yíyípo" + +msgid "workspace.options.search-font" +msgstr "Àdàkọ ìwádìí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.select-a-shape" +msgstr "" +"Yan ìrísi ,pátákó tàbí ẹgbẹ́ láti fa ìsopọ̀ mọ́ pátákó " +"òmíràn." + +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.selection-color" +msgstr "Àwọn àwọ̀ tí a ti yàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.selection-fill" +msgstr "Ìmúṣẹ tí a yàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.selection-stroke" +msgstr "Ipò ìlù tí a yàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.blur" +msgstr "Rẹ́súrẹ́sú" + +msgid "workspace.options.shadow-options.color" +msgstr "Àwọ̀ òjíjí" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.drop-shadow" +msgstr "Da òjìjí" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.inner-shadow" +msgstr "Òjìjí inú" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsetx" +msgstr "X" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsety" +msgstr "Y" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.spread" +msgstr "Tànkálẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title" +msgstr "Òjìjí" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title.group" +msgstr "Àwùjọ òjìjí" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title.multiple" +msgstr "Òjìjí tí a yàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.show-fill-on-export" +msgstr "Fihàn nínụ àgbéjáde" + +msgid "workspace.options.show-in-viewer" +msgstr "Fihàn nínú ipò wíwò" + +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.size" +msgstr "Ìwọ̀n" + +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs +msgid "workspace.options.size-presets" +msgstr "Àwọn àtòjọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke" +msgstr "Ipò ìlà" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker" +msgstr "Àmì yíyíká" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Yíyíká" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker" +msgstr "Àmì dáyámọ́ǹdì" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Dáyámọ́ǹdì" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow" +msgstr "Ọfà ìlà" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Ofà" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.none" +msgstr "Kòsí" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.round" +msgstr "Yíká" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square" +msgstr "Alápoméjì" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker" +msgstr "Àmì alápoméjì" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Onígun mẹ́rin" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow" +msgstr "Ofà onígun mẹ́ta" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Onígun mẹ́ta" + +msgid "workspace.options.stroke-color" +msgstr "Àwọ ìlà" + +msgid "workspace.options.stroke-width" +msgstr "Ìgbòrò ìlà" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.center" +msgstr "Àárín" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.dashed" +msgstr "Tó ní ìlà-ìlà" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.dotted" +msgstr "àmì tó tó tó" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.inner" +msgstr "Nínú" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.mixed" +msgstr "Tí a ti dàpọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.outer" +msgstr "Ìta" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.solid" +msgstr "Ṣinsin" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-bottom" +msgstr "Mú dọ́gba abẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-middle" +msgstr "Mú dọgba àárín" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-top" +msgstr "Mú dọ́gba òkè" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.direction-ltr" +msgstr "LTR" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.direction-rtl" +msgstr "RTL" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-auto-height" +msgstr "Gíga aládàáṣiṣẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-auto-width" +msgstr "Gbígbòòrò aládáàṣiṣé" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-fixed" +msgstr "Tí kò yíyadà" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.letter-spacing" +msgstr "Àlàfo lẹ́tà" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.line-height" +msgstr "Gíga ìlà" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.lowercase" +msgstr "Lẹ́tà kékeré" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.none" +msgstr "Kòsí" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.strikethrough" +msgstr "Ìfọwọ́bàyíká (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-center" +msgstr "Mú dọ́gba àárín (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-justify" +msgstr "Ìdálàre (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-left" +msgstr "Mú dọ́gba òsì (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-right" +msgstr "Mú dọ́gba ọ̀tún (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title" +msgstr "Àyọkà" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title-group" +msgstr "Àwùjọ àyọkà" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title-selection" +msgstr "Àṣàyàn ọ̀rọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.titlecase" +msgstr "ipò ọ̀rọ̀ àkórí" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.underline" +msgstr "Fífàlà (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.uppercase" +msgstr "Lẹ́tà ńlá" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.use-play-button" +msgstr "" +"Lo bọ́tìnì ìṣe tó wà lóori àkọsórí náà láti ṣakóso ìwò " +"àkàwé." + +msgid "workspace.options.width" +msgstr "Ìgbòrò" + +msgid "workspace.options.x" +msgstr "Ipò X" + +msgid "workspace.options.y" +msgstr "Ipò Y" + +msgid "workspace.path.actions.add-node" +msgstr "Fi ìpàdé kún (%s)" + +msgid "workspace.path.actions.delete-node" +msgstr "Pa ìpàdé ré (%s)" + +msgid "workspace.path.actions.draw-nodes" +msgstr "Fa ìpàdé (%s)" + +msgid "workspace.path.actions.join-nodes" +msgstr "Da ìpàdé pọ̀ (%s)" + +msgid "workspace.path.actions.make-corner" +msgstr "Sí igun (%s)" + +msgid "workspace.path.actions.make-curve" +msgstr "Sí ẹkọ̀rọ̀ (%s)" + +msgid "workspace.path.actions.merge-nodes" +msgstr "Da ìpàdé pò (%s)" + +msgid "workspace.path.actions.move-nodes" +msgstr "Gbé ìpàde (%s)" + +msgid "workspace.path.actions.separate-nodes" +msgstr "Ya ̣ìpàdé sọ́tọ̀ (%s)" + +msgid "workspace.path.actions.snap-nodes" +msgstr "Ìmọ̀lára ìpàdé (%s)" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.add-flex" +msgstr "Fi àrọ ètò ìrísí kun" + +msgid "workspace.shape.menu.add-grid" +msgstr "Fi gírídì ètò ìrísị kun" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.back" +msgstr "dáa padà séyiǹ" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.backward" +msgstr "dá padà sọ́wọ èyiǹ" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.copy" +msgstr "Ṣẹ̀dà" + +msgid "workspace.shape.menu.create-annotation" +msgstr "Ṣèda àlàyé" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.create-artboard-from-selection" +msgstr "Yíyàn sí pátákó" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.create-component" +msgstr "Ṣẹ́dá àkóónú" + +msgid "workspace.shape.menu.create-multiple-components" +msgstr "Ṣẹ̀dá ọ̀pọ̀lọpọ̀ àkóónú" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.cut" +msgstr "Gé" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete" +msgstr "Parẹ́" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete-flow-start" +msgstr "Pa ìbẹ̀ẹ̀rè ìsàn rẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.detach-instance" +msgstr "ṣẹ́ àpẹ̣ẹre yọ nípò" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.detach-instances-in-bulk" +msgstr "Ṣẹ́ àwọn àpẹẹrẹ yọ nípò" + +msgid "workspace.shape.menu.difference" +msgstr "Ìyàtọ̀" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.duplicate" +msgstr "Sẹ ẹ̀dà" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.edit" +msgstr "Sàtúnṣe" + +msgid "workspace.shape.menu.exclude" +msgstr "Ṣà yọ sílè" + +msgid "workspace.shape.menu.flatten" +msgstr "Tẹ́ pẹrẹsẹ" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flip-horizontal" +msgstr "Ìyí padà oníbùú" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flip-vertical" +msgstr "Ìyí padà olóòró" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flow-start" +msgstr "Ìbẹ̀rè ìṣàn" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.forward" +msgstr "Mú wá sọ́wọ́ iwájú" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.front" +msgstr "Mú wá sí wájú" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.go-main" +msgstr "Lọ sí olórí fáìlì àkóónú" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.group" +msgstr "Àwùjọ" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.hide" +msgstr "Tọ́jú" + +msgid "workspace.shape.menu.hide-ui" +msgstr "Fihàn/ Tọ́jú UI" + +msgid "workspace.shape.menu.intersection" +msgstr "Ìkòríta" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.lock" +msgstr "Tì" + +#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.mask" +msgstr "Ìbòjú" + +#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.paste" +msgstr "lẹ̀mọ́" + +msgid "workspace.shape.menu.path" +msgstr "Ipa ọ̀nà" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-flex" +msgstr "Yọ àrọ ètò ìrísí kúrò" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.reset-overrides" +msgstr "Ṣe àtúnṣe ìdojúkọ" + +msgid "workspace.shape.menu.restore-main" +msgstr "Dạ àkóónú pàtàkì sí pò" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.select-layer" +msgstr "Yan ìpele" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show" +msgstr "Ṣà fihàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-in-assets" +msgstr "Ṣafihàn nínú atọ́ka àwọn ìgbìmọ̀ ìní" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-main" +msgstr "Ṣà fihàn àkóónú pàtàkì" + +msgid "workspace.shape.menu.thumbnail-remove" +msgstr "Yọ àwòrán aláṣojú kúrò" + +msgid "workspace.shape.menu.thumbnail-set" +msgstr "Fi sípò àwòrań aláṣojú" + +msgid "workspace.shape.menu.transform-to-path" +msgstr "Yípadà sí pópó ọ̀nà" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.ungroup" +msgstr "Ṣe àìkójọ" + +msgid "workspace.shape.menu.union" +msgstr "Ìbáṣepò" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.unlock" +msgstr "Ṣíí" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.unmask" +msgstr "Sí ìbòjú" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.update-components-in-bulk" +msgstr "Mímú àwọn ọ̀rọ̀ àkóónú pàtàkì dójú ìwọ̀n" + +msgid "workspace.sidebar.collapse" +msgstr "Wó òpó ègbẹ́" + +msgid "workspace.sidebar.expand" +msgstr "Fẹ òpó ẹ̀gbẹ́" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.sidebar.history" +msgstr "Ìtàn (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.sidebar.layers" +msgstr "Àwọn ìpele" + +msgid "workspace.sidebar.layers.components" +msgstr "Àwọn àkóónú" + +msgid "workspace.sidebar.layers.frames" +msgstr "Àwọn pátákó" + +msgid "workspace.sidebar.layers.groups" +msgstr "Àkójọ" + +msgid "workspace.sidebar.layers.images" +msgstr "Àwọn àwòrán" + +msgid "workspace.sidebar.layers.masks" +msgstr "Àwọn ìbòjú" + +msgid "workspace.sidebar.layers.search" +msgstr "Àwọn ìpele wíwá" + +msgid "workspace.sidebar.layers.shapes" +msgstr "Àwọn ìrísí" + +msgid "workspace.sidebar.layers.texts" +msgstr "Àwọn àyọkà" + +#: src/app/main/ui/workspace/sidebar/options/menus/svg_attrs.cljs, src/app/main/ui/inspect/attributes/svg.cljs +msgid "workspace.sidebar.options.svg-attrs.title" +msgstr "Gbígbé àwọn ànímọ́ SVG wọlé wá" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "workspace.sidebar.sitemap" +msgstr "Àwọn abala" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.sitemap" +msgstr "Máàpù ojú ìlà" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.assets" +msgstr "Àwọn ohun ìní" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.color-palette" +msgstr "Pálètì àwọ̀ (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.comments" +msgstr "Àwọn ìdáásí (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.curve" +msgstr "Ìṣépo (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.ellipse" +msgstr "Àlàfo (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.frame" +msgstr "Pátákó (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.image" +msgstr "Àwòrán(%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.move" +msgstr "Gbé (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.path" +msgstr "Pópó ọ̀nà (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.rect" +msgstr "Onígun mẹ́rin (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.shortcuts" +msgstr "Àwón ọ̀nà àbùjá (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text" +msgstr "Àyọkà (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text-palette" +msgstr "Àwọn ohun ìtẹ̀wé (%s)" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.empty" +msgstr "Di ìgbà yìí kò sí àyípadà nínú ìtàn" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.delete" +msgstr "Paarẹ́%s" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.modify" +msgstr "Àtuńṣe %s" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.move" +msgstr "Àwọn ohun tí a ti gbé lọ" + +msgid "workspace.undo.entry.multiple.circle" +msgstr "Awọn àyíká" + +msgid "workspace.undo.entry.multiple.color" +msgstr "Àwọn ohun àmúṣọrọ̀ àwọ̀" + +msgid "workspace.undo.entry.multiple.component" +msgstr "Àkóónú" + +msgid "workspace.undo.entry.multiple.curve" +msgstr "Àwọn ẹkọ̀rọ̀" + +msgid "workspace.undo.entry.multiple.frame" +msgstr "Pátákó" + +msgid "workspace.undo.entry.multiple.group" +msgstr "Àwọn àkójọ" + +msgid "workspace.undo.entry.multiple.media" +msgstr "Àwọn ohun ìyì àwòrán" + +msgid "workspace.undo.entry.multiple.multiple" +msgstr "Àwọn ǹǹkan" + +msgid "workspace.undo.entry.multiple.page" +msgstr "Àwọn ojú awé" + +msgid "workspace.undo.entry.multiple.path" +msgstr "Àwọn ẹ̀bá ọ̀nà" + +msgid "workspace.undo.entry.multiple.rect" +msgstr "Àwọn onígun mẹ́rin" + +msgid "workspace.undo.entry.multiple.shape" +msgstr "Ìrísí" + +msgid "workspace.undo.entry.multiple.text" +msgstr "Àwọn àyọkà" + +msgid "workspace.undo.entry.multiple.typography" +msgstr "Àwọn ohun ìyì ìwé títẹ̀" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.new" +msgstr "Titun %s" + +msgid "workspace.undo.entry.single.circle" +msgstr "Àyíká" + +msgid "workspace.undo.entry.single.color" +msgstr "Ohun àmúṣọrọ̀ àwọ̀" + +msgid "workspace.undo.entry.single.component" +msgstr "Àkóónú" + +msgid "workspace.undo.entry.single.curve" +msgstr "Ẹkọ̀rọ̀" + +msgid "workspace.undo.entry.single.frame" +msgstr "Pátákó" + +msgid "workspace.undo.entry.single.group" +msgstr "Àkójọ" + +msgid "workspace.undo.entry.single.image" +msgstr "Àwòrán" + +msgid "workspace.undo.entry.single.media" +msgstr "Ohun àmúṣọrọ̀ èyà àwòrán" + +msgid "workspace.undo.entry.single.multiple" +msgstr "Ohun" + +msgid "workspace.undo.entry.single.page" +msgstr "Ojú awẹ́" + +msgid "workspace.undo.entry.single.path" +msgstr "Pópó ònà" + +msgid "workspace.undo.entry.single.rect" +msgstr "Onígun mẹ́rin" + +msgid "workspace.undo.entry.single.shape" +msgstr "Ìrísí" + +msgid "workspace.undo.entry.single.text" +msgstr "Àyọkà" + +msgid "workspace.undo.entry.single.typography" +msgstr "Ohun ìyì ìwé títẹ̀" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.unknown" +msgstr "Iṣẹ́ parí %s" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.title" +msgstr "Ìtàn" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.dismiss" +msgstr "Ta nù" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "Àlàyé síi" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.there-are-updates" +msgstr "Àwọn imúdójúìwọ̀n wà nínú àwọn yàrá ìkàwẹ tí a pín" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.update" +msgstr "Ìmúdójúìwọ̀n" + +msgid "workspace.viewport.click-to-close-path" +msgstr "Tẹ̀ láti pa pópó ọ̀nà dé" diff --git a/frontend/translations/zh_CN.po b/frontend/translations/zh_CN.po index c7f736a1f..247639c11 100644 --- a/frontend/translations/zh_CN.po +++ b/frontend/translations/zh_CN.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-01-12 23:06+0000\n" "Last-Translator: Geek Squirrel \n" -"Language-Team: Chinese (Simplified) \n" +"Language-Team: Chinese (Simplified) " +"\n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -80,6 +80,14 @@ msgstr "LDAP登录" msgid "auth.login-with-oidc-submit" msgstr "OpenID登录" +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "姓名必须包含一些空格以外的字符。" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "姓名最多包含250个字符。" + #: src/app/main/ui/auth/recovery.cljs msgid "auth.new-password" msgstr "输入新的密码" @@ -112,6 +120,10 @@ msgstr "密码" msgid "auth.password-length-hint" msgstr "至少8位字符" +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "密码必须包含一些空格以外的字符。" + msgid "auth.privacy-policy" msgstr "隐私政策" @@ -158,10 +170,19 @@ msgstr "服务协议" msgid "auth.terms-privacy-agreement" msgstr "创建账号意味着您认可我们的服务条例和隐私政策。" +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "创建新账号,即代表你同意我们的[服务条例](%s)和[隐私政策](%s)。" + #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" msgstr "我们已经发送了一封验证邮件到" +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "品牌设计、插图、营销物料等。" + msgid "common.publish" msgstr "发布" @@ -254,6 +275,78 @@ msgstr "开始浏览" msgid "dasboard.walkthrough-hero.title" msgstr "界面浏览" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.copied-success" +msgstr "已复制令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "生成新令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "成功创建访问令牌。" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "点击“生成新令牌”按钮来生成一个。" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "你目前还没有令牌。" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "名称是必填项" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "180天" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "30天" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "60天" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "90天" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "从不" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "已经于%s到期" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "将于%s到期" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.no-expiration" +msgstr "无到期时限" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "个人访问令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "个人访问令牌可被理解为密码认证的代替选项,常用于允许(第三方)应用访问Penpot内部API" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "令牌将于%s到期" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "令牌无到期时限" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "dashboard.add-shared" @@ -726,6 +819,9 @@ msgstr "无法加载%s字体" msgid "errors.bad-font-plural" msgstr "无法加载%s等字体" +msgid "errors.cannot-upload" +msgstr "无法上传该媒体文件。" + #: src/app/main/data/workspace.cljs msgid "errors.clipboard-not-implemented" msgstr "你的浏览器不支持该操作" @@ -763,13 +859,16 @@ msgstr "此邮箱[%s]已被标记为垃圾邮件或已被永久拉黑。" #: src/app/main/errors.cljs msgid "errors.feature-mismatch" -msgstr "看起来你正在打开一个启用了'%s'功能的文件,但当前penpot版本并不支持该功能或已" -"将其禁用。" +msgstr "看起来你正在打开一个启用了'%s'功能的文件,但当前penpot版本并不支持该功能或已将其禁用。" #: src/app/main/errors.cljs msgid "errors.feature-not-supported" msgstr "不支持功能“%s”。" +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "看起来当前启用的功能,与正在打开的文件所依赖的功能不匹配。在打开文件前,需要应用对“%s”修改。" + #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" @@ -818,6 +917,9 @@ msgstr "确认密码必须保持一致" msgid "errors.password-too-short" msgstr "密码最少需要8位字符" +msgid "errors.paste-data-validation" +msgstr "剪切板中为无效数据" + msgid "errors.profile-blocked" msgstr "个人资料已被屏蔽" @@ -831,6 +933,10 @@ msgstr "你设置了邮件免打扰(报告垃圾邮件或者多次退信)。 msgid "errors.registration-disabled" msgstr "当前禁止注册。" +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "检测到不兼容功能“%s”" + msgid "errors.team-leave.insufficient-members" msgstr "离开团队后成员不足,您可能要将其删除。" @@ -850,6 +956,13 @@ msgstr "发生了意料之外的错误。" msgid "errors.unexpected-token" msgstr "未知的令牌" +msgid "errors.validation" +msgstr "验证错误" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "文件具有不兼容的版本号" + msgid "errors.webhooks.connection" msgstr "连接错误,无法访问 URL" @@ -1079,6 +1192,9 @@ msgstr "无" msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "首字母大写" +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "取消设置" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "大写" @@ -1143,6 +1259,10 @@ msgstr "快捷方式" msgid "labels.accept" msgstr "接受" +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "访问令牌" + msgid "labels.active" msgstr "激活" @@ -1244,6 +1364,9 @@ msgstr "删除邀请" msgid "labels.delete-multi-files" msgstr "删除%s个文件" +msgid "labels.discard" +msgstr "丢弃" + #: src/app/main/ui/dashboard/projects.cljs, #: src/app/main/ui/dashboard/sidebar.cljs, #: src/app/main/ui/dashboard/files.cljs, @@ -1469,6 +1592,9 @@ msgstr "角色" msgid "labels.save" msgstr "保存" +msgid "labels.search" +msgstr "搜索" + msgid "labels.search-font" msgstr "搜索字体" @@ -1493,6 +1619,9 @@ msgstr "服务不可用" msgid "labels.settings" msgstr "设置" +msgid "labels.share" +msgstr "分享" + msgid "labels.share-prototype" msgstr "分享原型" @@ -1562,10 +1691,31 @@ msgstr "(你)" msgid "labels.your-account" msgstr "你的账户" +msgid "media.choose-image" +msgstr "选择图片" + +msgid "media.gradient" +msgstr "渐变" + +msgid "media.image" +msgstr "图片" + +msgid "media.linear" +msgstr "线性" + #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "正在加载图片…" +msgid "media.radial" +msgstr "径向" + +msgid "media.solid" +msgstr "纯色" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "你的库是空白的。一旦添加为共享库,此文档库中的素材就可被用于你的其他文档中。你确定要发布它吗?" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -1605,6 +1755,30 @@ msgstr "修改电子邮件" msgid "modals.change-email.title" msgstr "修改你的电子邮件" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.copy-token" +msgstr "复制令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.expiration-date.label" +msgstr "到期时间" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "名称" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.placeholder" +msgstr "名称可以帮你记住令牌的用途" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "创建令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "生成访问令牌" + msgid "modals.create-webhook.submit-label" msgstr "创建webhook" @@ -1617,6 +1791,18 @@ msgstr "有效负载网址" msgid "modals.create-webhook.url.placeholder" msgstr "https://example.com/postreceive" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "删除令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.message" +msgstr "你确定想要删除这个令牌吗?" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "删除令牌" + #: src/app/main/ui/settings/delete_account.cljs msgid "modals.delete-account.cancel" msgstr "取消操作并保留我的账号" @@ -1645,6 +1831,12 @@ msgstr "你确定想要删除这个对话?该讨论串里的所有评论都会 msgid "modals.delete-comment-thread.title" msgstr "删除对话" +msgid "modals.delete-component-annotation.message" +msgstr "你确定想要删除这个注释?" + +msgid "modals.delete-component-annotation.title" +msgstr "删除注释" + #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-file-confirm.accept" msgstr "删除文档" @@ -1708,6 +1900,18 @@ msgid_plural "modals.delete-shared-confirm.accept" msgstr[0] "删除文件" msgstr[1] "批量删除文件" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "" +msgstr[1] "" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.scd-message" +msgid_plural "modals.delete-shared-confirm.activated.scd-message" +msgstr[0] "该库被以下文档使用: " +msgstr[1] "这些库被以下文档使用: " + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-shared-confirm.message" @@ -1834,6 +2038,15 @@ msgstr "您是此团队的所有者,你确定想要将所有者转让给该成 msgid "modals.promote-owner-confirm.title" msgstr "新增团队所有者" +msgid "modals.publish-empty-library.accept" +msgstr "发布" + +msgid "modals.publish-empty-library.message" +msgstr "你的库是空白的。你确定想要发布它?" + +msgid "modals.publish-empty-library.title" +msgstr "发布空白库" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.remove-shared-confirm.accept" @@ -1904,6 +2117,10 @@ msgstr "你即将更新共享库中的一个组件。这可能会对使用该组 msgid "modals.update-remote-component.message" msgstr "更新共享库中的一个组件" +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "有新版本可用,请刷新页面" + #: src/app/main/ui/dashboard/team.cljs msgid "notifications.invitation-email-sent" msgstr "成功发送邀请" @@ -1975,12 +2192,33 @@ msgstr "贡献指南" msgid "onboarding-v2.welcome.title" msgstr "欢迎来到Penpot!" +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "继续创建团队" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "以个人身份继续" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "创建团队 & 邀请" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "创建团队并发送邀请" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "你可以稍后再邀请成员" + msgid "onboarding.choice.team-up.create-team-desc" msgstr "命名团队后,您将能够邀请他人加入。" msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "输入团队名称" +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "创建团队" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "创建团队但暂不邀请" + msgid "onboarding.choice.team-up.invite-members" msgstr "邀请成员" @@ -1990,6 +2228,12 @@ msgstr "记得将开发人员、设计师、经理……等各类人员都加进 msgid "onboarding.choice.team-up.roles" msgstr "邀请角色:" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "以个人身份开始" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "你可以稍后再创建团队。" + msgid "onboarding.newsletter.accept" msgstr "是的,订阅" @@ -2036,18 +2280,170 @@ msgstr "Penpot" msgid "profile.recovery.go-to-login" msgstr "去登录" -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, -#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "settings.multiple" -msgstr "混合" +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "你最熟悉哪个设计工具?" -# SECTIONS -msgid "shortcut-section.basics" -msgstr "基础" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "非常多" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canva" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "设计师" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "开发者" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "深入了解Penpot的精彩之处" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "创始人/副总裁" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "我是一名自由职业者" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "从我的团队项目获得邀请码 " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "...界面设计,视觉素材,设计系统等。" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "InVision" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "给我的团队项目做反馈" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "让我们开始吧!" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "产品经理/项目经理" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "市场营销" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "50以上" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "下一项" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "无" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "其他(请注明)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "我在做个人项目" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "前一项" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "你计划用Penpot做什么?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "你是哪种身份?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Sketch" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "开始" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "开始着手我的项目" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "学生/教师" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "你的团队有多少人?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "试用Penpot,来看它是否适合团队 " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "在本地部署Penpot前进行试用" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "...线框图,用户轨迹和用户流程,导航树等。" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "从事概念构想的工作" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "你的反馈将帮助我们更好地理解你的习惯和偏好,以便我们不断改进Penpot,使其成为一个有用且好用的工具。" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "settings.multiple" +msgstr "混合" + +# SECTIONS +msgid "shortcut-section.basics" +msgstr "基础" msgid "shortcut-section.dashboard" msgstr "仪表盘" @@ -2407,6 +2803,9 @@ msgstr "选择所有" msgid "shortcuts.select-next" msgstr "选择下一个图层" +msgid "shortcuts.select-parent-layer" +msgstr "选择上级图层" + msgid "shortcuts.select-prev" msgstr "选择上一个图层" @@ -2434,6 +2833,18 @@ msgstr "启用测量" msgid "shortcuts.stop-measure" msgstr "停止测量" +msgid "shortcuts.text-align-center" +msgstr "水平居中" + +msgid "shortcuts.text-align-justify" +msgstr "两端对齐" + +msgid "shortcuts.text-align-left" +msgstr "靠左对齐" + +msgid "shortcuts.text-align-right" +msgstr "靠右对齐" + msgid "shortcuts.thumbnail-set" msgstr "设置缩略图" @@ -2507,6 +2918,10 @@ msgstr "变焦镜头放大" msgid "shortcuts.zoom-selected" msgstr "缩放到选定对象" +#: src/app/main/ui/dashboard/team.cljs +msgid "team.webhooks.max-length" +msgstr "Webhook的名称最多包含2048个字符。" + #: src/app/main/ui/dashboard/files.cljs msgid "title.dashboard.files" msgstr "%s - Penpot" @@ -2535,6 +2950,10 @@ msgstr "共享库 - %s - Penpot" msgid "title.default" msgstr "Penpot - 面向团队,设计自由" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "个人资料 — 访问令牌" + #: src/app/main/ui/settings/feedback.cljs msgid "title.settings.feedback" msgstr "提交反馈 - Penpot" @@ -2729,6 +3148,9 @@ msgstr "本地库" msgid "workspace.assets.not-found" msgstr "未找到素材" +msgid "workspace.assets.open-library" +msgstr "打开库文档" + #: src/app/main/ui/workspace/sidebar/sitemap.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs @@ -2749,6 +3171,10 @@ msgid_plural "workspace.assets.selected-count" msgstr[0] "已选中%s个物件" msgstr[1] "已选中%s个物件" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "共享库" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" @@ -2945,6 +3371,10 @@ msgstr "未保存的修改" msgid "workspace.header.viewer" msgstr "预览模式(%s)" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "缩放" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.zoom-fill" msgstr "填充 - 填充比例" @@ -2965,6 +3395,21 @@ msgstr "全屏" msgid "workspace.header.zoom-selected" msgstr "缩放到选定的位置" +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "编辑网格" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "退出" + +msgid "workspace.layout_grid.editor.title" +msgstr "编辑网格" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "完成" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "定位" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "添加" @@ -2973,6 +3418,14 @@ msgstr "添加" msgid "workspace.libraries.colors" msgstr "%s种颜色" +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "你的库中还没有颜色风格" + +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "你的库中还没有排版风格" + #: src/app/main/ui/workspace/colorpicker/libraries.cljs, #: src/app/main/ui/workspace/colorpalette.cljs msgid "workspace.libraries.colors.file-library" @@ -3059,6 +3512,10 @@ msgstr "%s个排版" msgid "workspace.libraries.update" msgstr "更新" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "查看所有修改" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.updates" msgstr "更新" @@ -3090,6 +3547,21 @@ msgstr "剪辑内容" msgid "workspace.options.component" msgstr "组件" +msgid "workspace.options.component.annotation" +msgstr "注释" + +msgid "workspace.options.component.copy" +msgstr "复制" + +msgid "workspace.options.component.create-annotation" +msgstr "创建注释" + +msgid "workspace.options.component.edit-annotation" +msgstr "编辑注释" + +msgid "workspace.options.component.swap.empty" +msgstr "你的库中还没有素材" + #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.constraints" msgstr "限制条件" @@ -3183,6 +3655,10 @@ msgstr "填充" msgid "workspace.options.flows.add-flow-start" msgstr "增加流程起点" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "流程" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.flows.flow-start" msgstr "流程起点" @@ -3832,14 +4308,26 @@ msgstr "边框" msgid "workspace.options.stroke-cap.circle-marker" msgstr "圆形标记" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "圆形" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.diamond-marker" msgstr "钻石标记" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "钻石" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow" msgstr "箭头" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "箭头" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.none" msgstr "无边框" @@ -3856,11 +4344,19 @@ msgstr "方头" msgid "workspace.options.stroke-cap.square-marker" msgstr "方形标记" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "矩形" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow" msgstr "三角箭头" -msgid "workspace.options.stroke-color" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "三角形" + +msgid "workspace.options.stroke-color" msgstr "线条颜色" msgid "workspace.options.stroke-width" @@ -4034,6 +4530,9 @@ msgstr "对接节点 (%s)" msgid "workspace.shape.menu.add-flex" msgstr "添加弹性布局" +msgid "workspace.shape.menu.add-grid" +msgstr "添加网格布局" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.back" msgstr "移至底层" @@ -4046,6 +4545,9 @@ msgstr "向下移动一层" msgid "workspace.shape.menu.copy" msgstr "复制" +msgid "workspace.shape.menu.create-annotation" +msgstr "创建注释" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.create-artboard-from-selection" msgstr "转为画板" @@ -4054,6 +4556,9 @@ msgstr "转为画板" msgid "workspace.shape.menu.create-component" msgstr "创建组件" +msgid "workspace.shape.menu.create-multiple-components" +msgstr "创建多个组件" + #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.cut" msgstr "剪切" @@ -4321,6 +4826,13 @@ msgstr "文本(%s)" msgid "workspace.toolbar.text-palette" msgstr "排字式样 (%s)" +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**检查模式**(不可编辑)" + +msgid "workspace.top-bar.read-only.done" +msgstr "完成" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "目前没有历史修改" @@ -4440,6 +4952,10 @@ msgstr "历史" msgid "workspace.updates.dismiss" msgstr "忽略" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "更多信息" + #: src/app/main/data/workspace/libraries.cljs msgid "workspace.updates.there-are-updates" msgstr "共享库有更新" @@ -4450,524 +4966,3 @@ msgstr "更新" msgid "workspace.viewport.click-to-close-path" msgstr "单击以闭合路径" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "定位" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "完成" - -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "编辑网格" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "退出" - -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "你的库中还没有排版风格" - -msgid "workspace.options.component.swap.empty" -msgstr "你的库中还没有素材" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "流程" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "钻石" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "箭头" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "矩形" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "三角形" - -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**检查模式**(不可编辑)" - -msgid "workspace.top-bar.read-only.done" -msgstr "完成" - -msgid "media.solid" -msgstr "纯色" - -msgid "media.linear" -msgstr "线性" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.no-access-tokens" -msgstr "你目前还没有令牌。" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "名称是必填项" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "180天" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "30天" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-60-days" -msgstr "60天" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-90-days" -msgstr "90天" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-never" -msgstr "从不" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "已经于%s到期" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "个人访问令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-expire" -msgstr "令牌将于%s到期" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expires-on" -msgstr "将于%s到期" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.no-expiration" -msgstr "无到期时限" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "文件具有不兼容的版本号" - -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "看起来当前启用的功能,与正在打开的文件所依赖的功能不匹配。在打开文件前,需要" -"应用对“%s”修改。" - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "检测到不兼容功能“%s”" - -msgid "errors.validation" -msgstr "验证错误" - -msgid "errors.paste-data-validation" -msgstr "剪切板中为无效数据" - -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "取消设置" - -msgid "labels.share" -msgstr "分享" - -msgid "labels.search" -msgstr "搜索" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "你的库是空白的。一旦添加为共享库,此文档库中的素材就可被用于你的其他文档中。" -"你确定要发布它吗?" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.copy-token" -msgstr "复制令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.expiration-date.label" -msgstr "到期时间" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.label" -msgstr "名称" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.placeholder" -msgstr "名称可以帮你记住令牌的用途" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.submit-label" -msgstr "创建令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.title" -msgstr "生成访问令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.title" -msgstr "删除令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.message" -msgstr "你确定想要删除这个令牌吗?" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.scd-message" -msgid_plural "modals.delete-shared-confirm.activated.scd-message" -msgstr[0] "该库被以下文档使用: " -msgstr[1] "这些库被以下文档使用: " - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.no-files-message" -msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "" -msgstr[1] "" - -msgid "modals.publish-empty-library.accept" -msgstr "发布" - -msgid "modals.publish-empty-library.message" -msgstr "你的库是空白的。你确定想要发布它?" - -msgid "modals.publish-empty-library.title" -msgstr "发布空白库" - -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "有新版本可用,请刷新页面" - -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "继续创建团队" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "你可以稍后再创建团队。" - -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "以个人身份开始" - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "以个人身份继续" - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "创建团队并发送邀请" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "创建团队但暂不邀请" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "创建团队 & 邀请" - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "创建团队" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "你可以稍后再邀请成员" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "...界面设计,视觉素材,设计系统等。" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "无" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "其他(请注明)" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "我在做个人项目" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "前一项" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "你计划用Penpot做什么?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Sketch" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "开始着手我的项目" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "学生/教师" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "开始" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "试用Penpot,来看它是否适合团队 " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "在本地部署Penpot前进行试用" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "从事概念构想的工作" - -#: src/app/main/ui/dashboard/team.cljs -msgid "team.webhooks.max-length" -msgstr "Webhook的名称最多包含2048个字符。" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "title.settings.access-tokens" -msgstr "个人资料 — 访问令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-not-expire" -msgstr "令牌无到期时限" - -msgid "workspace.shape.menu.add-grid" -msgstr "添加网格布局" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "给我的团队项目做反馈" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "品牌设计、插图、营销物料等。" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "非常多" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "...线框图,用户轨迹和用户流程,导航树等。" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "你最熟悉哪个设计工具?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "InVision" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "31-50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "50以上" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "我是一名自由职业者" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.copied-success" -msgstr "已复制令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "生成新令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "点击“生成新令牌”按钮来生成一个。" - -msgid "labels.discard" -msgstr "丢弃" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "创始人/副总裁" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Figma" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "从我的团队项目获得邀请码 " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "让我们开始吧!" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "市场营销" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "下一项" - -msgid "shortcuts.text-align-center" -msgstr "水平居中" - -msgid "shortcuts.text-align-left" -msgstr "靠左对齐" - -msgid "shortcuts.text-align-justify" -msgstr "两端对齐" - -msgid "workspace.options.component.annotation" -msgstr "注释" - -msgid "workspace.options.component.copy" -msgstr "复制" - -msgid "workspace.options.component.create-annotation" -msgstr "创建注释" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "圆形" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "更多信息" - -msgid "modals.delete-component-annotation.message" -msgstr "你确定想要删除这个注释?" - -msgid "workspace.shape.menu.create-annotation" -msgstr "创建注释" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Adobe XD" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Canva" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.accept" -msgstr "删除令牌" - -msgid "modals.delete-component-annotation.title" -msgstr "删除注释" - -#: src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.empty-palette" -msgstr "你的库中还没有颜色风格" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "11-30" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "设计师" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "开发者" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "深入了解Penpot的精彩之处" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "产品经理/项目经理" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "你是哪种身份?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "你的团队有多少人?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "你的反馈将帮助我们更好地理解你的习惯和偏好,以便我们不断改进Penpot,使其成为" -"一个有用且好用的工具。" - -msgid "shortcuts.select-parent-layer" -msgstr "选择上级图层" - -msgid "shortcuts.text-align-right" -msgstr "靠右对齐" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "查看所有修改" - -msgid "workspace.assets.open-library" -msgstr "打开库文档" - -msgid "workspace.options.component.edit-annotation" -msgstr "编辑注释" - -msgid "workspace.shape.menu.create-multiple-components" -msgstr "创建多个组件" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "共享库" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom" -msgstr "缩放" - -msgid "workspace.layout_grid.editor.title" -msgstr "编辑网格" - -msgid "media.radial" -msgstr "径向" - -msgid "media.gradient" -msgstr "渐变" - -msgid "media.choose-image" -msgstr "选择图片" - -msgid "media.image" -msgstr "图片" - -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "姓名必须包含一些空格以外的字符。" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "姓名最多包含250个字符。" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-not-empty" -msgstr "密码必须包含一些空格以外的字符。" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "创建新账号,即代表你同意我们的[服务条例](%s)和[隐私政策](%s)。" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "成功创建访问令牌。" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "个人访问令牌可被理解为密码认证的代替选项,常用于允许(第三方)应用访问Penpot" -"内部API" - -msgid "errors.cannot-upload" -msgstr "无法上传该媒体文件。" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.access-tokens" -msgstr "访问令牌" -- Gitee From a55bf341550a38eb28c79695551811dd080ee9b6 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:55:12 +0000 Subject: [PATCH 0387/1266] :globe_with_meridians: Add translations for: Turkish. Currently translated at 97.8% (1350 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/ --- frontend/translations/tr.po | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/frontend/translations/tr.po b/frontend/translations/tr.po index f10e6bb31..93c44d0d5 100644 --- a/frontend/translations/tr.po +++ b/frontend/translations/tr.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-10 15:02+0000\n" -"Last-Translator: Oğuz Ersen \n" +"PO-Revision-Date: 2024-04-24 13:04+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Turkish \n" "Language: tr\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -869,6 +869,7 @@ msgstr "Bağlantı hatası, URL'ye erişilemiyor" msgid "errors.webhooks.invalid-uri" msgstr "URL doğrulamayı geçemiyor." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Son iletim başarılı olmadı." @@ -2634,6 +2635,7 @@ msgstr "Tıklamada etkileşimleri göster" msgid "viewer.header.sitemap" msgstr "Site haritası" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Son iletim başarılı oldu." -- Gitee From ec9e32241db7878d79d22ad7a6e6c75b53600604 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Wed, 24 Apr 2024 13:04:00 +0000 Subject: [PATCH 0388/1266] :globe_with_meridians: Add translations for: Turkish. Currently translated at 97.8% (1350 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/ --- frontend/translations/tr.po | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/frontend/translations/tr.po b/frontend/translations/tr.po index 93c44d0d5..72a7be1c7 100644 --- a/frontend/translations/tr.po +++ b/frontend/translations/tr.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 13:04+0000\n" -"Last-Translator: Anonymous \n" +"Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" "Language: tr\n" @@ -5241,3 +5241,20 @@ msgstr "Aşağıya 1 satır ekle" msgid "workspace.context-menu.grid-track.row.delete-shapes" msgstr "Satır ve şekilleri sil" + +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "Etki alanına izin verilmiyor" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "Hesabımda oturum aç" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-tagline" +msgstr "" +"Penpot, tasarım ve kod işbirliği için özgür ve açık kaynaklı tasarım aracıdır" + +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "Kimlik doğrulama sağlayıcısına bu profil için izin verilmiyor" -- Gitee From 7d0bae66193f6865f89022c13e237a7e33fec01b Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:55:35 +0000 Subject: [PATCH 0389/1266] :globe_with_meridians: Add translations for: Chinese (Simplified). Currently translated at 95.4% (1316 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/ --- frontend/translations/zh_CN.po | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/frontend/translations/zh_CN.po b/frontend/translations/zh_CN.po index a95108c3b..0c8c8466a 100644 --- a/frontend/translations/zh_CN.po +++ b/frontend/translations/zh_CN.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-01-12 23:06+0000\n" -"Last-Translator: Geek Squirrel \n" +"PO-Revision-Date: 2024-04-24 13:04+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_CN\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -852,6 +852,7 @@ msgstr "连接错误,无法访问 URL" msgid "errors.webhooks.invalid-uri" msgstr "网址未通过验证。" +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "上次交付不成功。" @@ -904,6 +905,7 @@ msgid "feedback.title" msgstr "电子邮件" #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-go-to" msgstr "前往Twtter" @@ -912,6 +914,7 @@ msgid "feedback.twitter-subtitle1" msgstr "这里可以帮助您解决技术问题。" #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-title" msgstr "Twtter支持帐号" @@ -2618,6 +2621,7 @@ msgstr "点击时显示交互" msgid "viewer.header.sitemap" msgstr "站点地图" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "上次交付成功。" -- Gitee From 9ba7bb7e179bfe4be972791e7a2971892c26d639 Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Wed, 24 Apr 2024 12:56:51 +0000 Subject: [PATCH 0390/1266] :globe_with_meridians: Add translations for: Hebrew. Currently translated at 97.7% (1348 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/ --- frontend/translations/he.po | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/frontend/translations/he.po b/frontend/translations/he.po index 0f7d42912..dadbc4235 100644 --- a/frontend/translations/he.po +++ b/frontend/translations/he.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-24 12:55+0000\n" -"Last-Translator: Anonymous \n" +"PO-Revision-Date: 2024-04-24 13:04+0000\n" +"Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew \n" "Language: he\n" @@ -951,7 +951,6 @@ msgstr "שגיאת תקשורת, הכתובת אינה נגישה" msgid "errors.webhooks.invalid-uri" msgstr "הכתובת לא מעבירה תיקוף." -#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "ההעברה האחרונה לא הצליחה." @@ -1006,18 +1005,16 @@ msgid "feedback.title" msgstr "דוא״ל" #: src/app/main/ui/settings/feedback.cljs -#, fuzzy msgid "feedback.twitter-go-to" -msgstr "מעבר לטוויטר" +msgstr "מעבר ל־X" #: src/app/main/ui/settings/feedback.cljs msgid "feedback.twitter-subtitle1" msgstr "כאן כדי לסייע בסוגיות טכניות." #: src/app/main/ui/settings/feedback.cljs -#, fuzzy msgid "feedback.twitter-title" -msgstr "חשבון תמיכה בטוויטר" +msgstr "חשבון תמיכה ב־X" #: src/app/main/ui/settings/password.cljs msgid "generic.error" @@ -2977,7 +2974,6 @@ msgstr "הצגת פעילויות בקליק" msgid "viewer.header.sitemap" msgstr "מפת אתר" -#, fuzzy msgid "webhooks.last-delivery.success" msgstr "ההעברה האחרונה הצליחה." -- Gitee From 9a54785291187def4be0e0ea549982e1d3ae98c0 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:55:38 +0000 Subject: [PATCH 0391/1266] :globe_with_meridians: Add translations for: Chinese (Traditional). Currently translated at 44.5% (615 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/ --- frontend/translations/zh_Hant.po | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/frontend/translations/zh_Hant.po b/frontend/translations/zh_Hant.po index 89e0fa1e6..6fe709570 100644 --- a/frontend/translations/zh_Hant.po +++ b/frontend/translations/zh_Hant.po @@ -1,15 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-02-04 11:38+0000\n" -"Last-Translator: im424 <424@live.hk>\n" -"Language-Team: Chinese (Traditional) " -"\n" +"PO-Revision-Date: 2024-04-24 13:04+0000\n" +"Last-Translator: Anonymous \n" +"Language-Team: Chinese (Traditional) \n" "Language: zh_Hant\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.16-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -790,6 +790,7 @@ msgstr "連線錯誤,無法接上網址" msgid "errors.webhooks.invalid-uri" msgstr "網址未能通過驗証。" +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "上一次傳送未能成功。" -- Gitee From e2f6b02075e3fc21a6201f1b0b95657e1a8940d9 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:55:31 +0000 Subject: [PATCH 0392/1266] :globe_with_meridians: Add translations for: Yoruba. Currently translated at 88.5% (1221 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/yo/ --- frontend/translations/yo.po | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/frontend/translations/yo.po b/frontend/translations/yo.po index 880119490..3d7b0e925 100644 --- a/frontend/translations/yo.po +++ b/frontend/translations/yo.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-14 08:02+0000\n" -"Last-Translator: Alejandro Alonso \n" +"PO-Revision-Date: 2024-04-24 13:04+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Yoruba \n" "Language: yo\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.login-here" @@ -1165,6 +1165,7 @@ msgstr "Àsìṣe nínú ètò ìsopọ̀, kò lè dé ibi URL" msgid "errors.webhooks.invalid-uri" msgstr "URL kò páásì ìfọwọ́sí." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Èyí tí a fijíṣẹ́ kẹ́yìn kò dára." @@ -1219,6 +1220,7 @@ msgstr "" "láìjìnnà." #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-go-to" msgstr "Lọ sí Tíwítà" @@ -1227,6 +1229,7 @@ msgid "feedback.twitter-subtitle1" msgstr "A wà níbí láti ṣe ìrànlọ́wọ́ fún àwọn ìbéèrè tó bá wà lórí iṣẹ́ ọnà." #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-title" msgstr "Àkáùnti àtìlẹ́yìn fún Tíwítà" -- Gitee From 106fe05657b3cd8fa8c15843113ad6c6d6212c0b Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Tue, 23 Apr 2024 11:22:40 +0200 Subject: [PATCH 0393/1266] :sparkles: Add more login integration tests --- frontend/playwright.config.js | 2 ++ .../fixtures/login-with-password-error.json | 4 +++ frontend/playwright/helpers/index.js | 9 +++++-- frontend/playwright/login.spec.js | 26 ++++++++++++++++++- 4 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 frontend/playwright/fixtures/login-with-password-error.json diff --git a/frontend/playwright.config.js b/frontend/playwright.config.js index 73245e3ce..08a372946 100644 --- a/frontend/playwright.config.js +++ b/frontend/playwright.config.js @@ -28,6 +28,8 @@ export default defineConfig({ /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ trace: "on-first-retry", + + locale: "en-US" }, /* Configure projects for major browsers */ diff --git a/frontend/playwright/fixtures/login-with-password-error.json b/frontend/playwright/fixtures/login-with-password-error.json new file mode 100644 index 000000000..c54589e42 --- /dev/null +++ b/frontend/playwright/fixtures/login-with-password-error.json @@ -0,0 +1,4 @@ +{ + "~:type": "~:validation", + "~:code": "~:wrong-credentials" +} diff --git a/frontend/playwright/helpers/index.js b/frontend/playwright/helpers/index.js index 50f7e5487..419dfa918 100644 --- a/frontend/playwright/helpers/index.js +++ b/frontend/playwright/helpers/index.js @@ -1,7 +1,12 @@ -export const interceptRPC = async (page, path, jsonFilename) => { +export const interceptRPC = async (page, path, jsonFilename, options = {}) => { + const interceptConfig = { + status: 200, + ...options + }; + await page.route(`**/api/rpc/command/${path}`, (route) => { route.fulfill({ - status: 200, + ...interceptConfig, contentType: "application/transit+json", path: `playwright/fixtures/${jsonFilename}`, }); diff --git a/frontend/playwright/login.spec.js b/frontend/playwright/login.spec.js index 5463a74f2..5b10ca2ce 100644 --- a/frontend/playwright/login.spec.js +++ b/frontend/playwright/login.spec.js @@ -37,7 +37,16 @@ test("Shows login page when going to index and user is logged out", async ({ pag await page.goto("/"); await expect(page).toHaveURL(/auth\/login$/); - await expect(page.getByText("Log into my account")).toBeVisible(); + await expect(page.getByRole("heading", { name: "Log into my account" } )).toBeVisible(); +}); + +test("User submit a wrong formated email ", async ({ page }) => { + await interceptRPC(page, "get-profile", "get-profile-anonymous.json"); + await page.goto("/"); + await page.getByLabel("Email").fill("foo"); + + await expect(page).toHaveURL(/auth\/login$/); + await expect(page.getByText("Enter a valid email please")).toBeVisible(); }); test("User logs in by filling the login form", async ({ page }) => { @@ -54,3 +63,18 @@ test("User logs in by filling the login form", async ({ page }) => { await expect(page).toHaveURL(/dashboard/); }); + +test("User submits wrong credentials", async ({ page }) => { + await interceptRPC(page, "get-profile", "get-profile-anonymous.json"); + await interceptRPC(page, "login-with-password", "login-with-password-error.json", { status: 400 }); + + await page.goto("/"); + + await page.getByLabel("Email").fill("foo123@example.com"); + await page.getByLabel("Password").fill("aaaa"); + + await page.getByRole("button", { name: "Login" }).click(); + + await expect(page.getByText("Email or password is incorrect")).toBeVisible(); + await expect(page).toHaveURL(/auth\/login$/); +}); -- Gitee From 306a8edbec08738f9cf4790a3e8ddad6f127b983 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Tue, 23 Apr 2024 15:49:57 +0200 Subject: [PATCH 0394/1266] :sparkles: Swap http-server for a custom server with express (front-end integration tests) --- frontend/package.json | 4 +- frontend/scripts/e2e-server.js | 13 ++ frontend/yarn.lock | 333 +++++++++------------------------ 3 files changed, 99 insertions(+), 251 deletions(-) create mode 100644 frontend/scripts/e2e-server.js diff --git a/frontend/package.json b/frontend/package.json index ba2d09f72..e8aaa62c7 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -30,7 +30,7 @@ "translations:find-unused": "node ./scripts/find-unused-translations.js", "compile": "node ./scripts/compile.js", "watch": "node ./scripts/watch.js", - "e2e:server": "NODE_NO_WARNINGS=1 http-server ./resources/public -p 3500 -a 0.0.0.0", + "e2e:server": "node ./scripts/e2e-server.js", "e2e:test": "playwright test", "storybook:compile": "gulp template:storybook && clojure -M:dev:shadow-cljs compile storybook", "storybook:watch": "npm run storybook:compile && concurrently \"clojure -M:dev:shadow-cljs watch storybook\" \"storybook dev -p 6006\"", @@ -51,6 +51,7 @@ "autoprefixer": "^10.4.17", "concurrently": "^8.2.2", "draft-js": "git+https://github.com/penpot/draft-js.git", + "express": "^4.19.2", "fancy-log": "^2.0.0", "gettext-parser": "^8.0.0", "gulp": "4.0.2", @@ -62,7 +63,6 @@ "gulp-sass": "^5.1.0", "gulp-sourcemaps": "^3.0.0", "gulp-svg-sprite": "^2.0.3", - "http-server": "^14.1.1", "jsdom": "^24.0.0", "map-stream": "0.0.7", "marked": "^12.0.0", diff --git a/frontend/scripts/e2e-server.js b/frontend/scripts/e2e-server.js new file mode 100644 index 000000000..cebddcdd3 --- /dev/null +++ b/frontend/scripts/e2e-server.js @@ -0,0 +1,13 @@ +import express from "express"; +import { fileURLToPath } from "url"; +import path from "path"; + +const app = express(); +const port = 3500; + +const staticPath = path.join(fileURLToPath(import.meta.url), "../../resources/public"); +app.use(express.static(staticPath)); + +app.listen(port, () => { + console.log(`Listening at 0.0.0.0:${port}`); +}); diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 5ba630a73..63b549a05 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -4913,15 +4913,6 @@ __metadata: languageName: node linkType: hard -"async@npm:^2.6.4": - version: 2.6.4 - resolution: "async@npm:2.6.4" - dependencies: - lodash: "npm:^4.17.14" - checksum: 0ebb3273ef96513389520adc88e0d3c45e523d03653cc9b66f5c46f4239444294899bfd13d2b569e7dbfde7da2235c35cf5fd3ece9524f935d41bbe4efccdad0 - languageName: node - linkType: hard - "async@npm:^3.2.3, async@npm:^3.2.4": version: 3.2.5 resolution: "async@npm:3.2.5" @@ -5074,15 +5065,6 @@ __metadata: languageName: node linkType: hard -"basic-auth@npm:^2.0.1": - version: 2.0.1 - resolution: "basic-auth@npm:2.0.1" - dependencies: - safe-buffer: "npm:5.1.2" - checksum: 05f56db3a0fc31c89c86b605231e32ee143fb6ae38dc60616bc0970ae6a0f034172def99e69d3aed0e2c9e7cac84e2d63bc51a0b5ff6ab5fc8808cc8b29923c1 - languageName: node - linkType: hard - "better-opn@npm:^3.0.2": version: 3.0.2 resolution: "better-opn@npm:3.0.2" @@ -5174,6 +5156,26 @@ __metadata: languageName: node linkType: hard +"body-parser@npm:1.20.2": + version: 1.20.2 + resolution: "body-parser@npm:1.20.2" + dependencies: + bytes: "npm:3.1.2" + content-type: "npm:~1.0.5" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.4.24" + on-finished: "npm:2.4.1" + qs: "npm:6.11.0" + raw-body: "npm:2.5.2" + type-is: "npm:~1.6.18" + unpipe: "npm:1.0.0" + checksum: 06f1438fff388a2e2354c96aa3ea8147b79bfcb1262dfcc2aae68ec13723d01d5781680657b74e9f83c808266d5baf52804032fbde2b7382b89bd8cdb273ace9 + languageName: node + linkType: hard + "boolbase@npm:^1.0.0": version: 1.0.0 resolution: "boolbase@npm:1.0.0" @@ -5511,19 +5513,6 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.7": - version: 1.0.7 - resolution: "call-bind@npm:1.0.7" - dependencies: - es-define-property: "npm:^1.0.0" - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.4" - set-function-length: "npm:^1.2.1" - checksum: a3ded2e423b8e2a265983dba81c27e125b48eefb2655e7dfab6be597088da3d47c47976c24bc51b8fd9af1061f8f87b4ab78a314f3c77784b2ae2ba535ad8b8d - languageName: node - linkType: hard - "camelcase@npm:^3.0.0": version: 3.0.0 resolution: "camelcase@npm:3.0.0" @@ -6061,7 +6050,7 @@ __metadata: languageName: node linkType: hard -"content-type@npm:^1.0.5, content-type@npm:~1.0.4": +"content-type@npm:^1.0.5, content-type@npm:~1.0.4, content-type@npm:~1.0.5": version: 1.0.5 resolution: "content-type@npm:1.0.5" checksum: b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af @@ -6096,6 +6085,13 @@ __metadata: languageName: node linkType: hard +"cookie@npm:0.6.0": + version: 0.6.0 + resolution: "cookie@npm:0.6.0" + checksum: f2318b31af7a31b4ddb4a678d024514df5e705f9be5909a192d7f116cfb6d45cbacf96a473fa733faa95050e7cff26e7832bb3ef94751592f1387b71c8956686 + languageName: node + linkType: hard + "copy-descriptor@npm:^0.1.0": version: 0.1.1 resolution: "copy-descriptor@npm:0.1.1" @@ -6136,13 +6132,6 @@ __metadata: languageName: node linkType: hard -"corser@npm:^2.0.1": - version: 2.0.1 - resolution: "corser@npm:2.0.1" - checksum: 1f319a752a560342dd22d936e5a4c158bfcbc332524ef5b05a7277236dad8b0b2868fd5cf818559f29954ec4d777d82e797fccd76601fcfe431610e4143c8acc - languageName: node - linkType: hard - "create-ecdh@npm:^4.0.0": version: 4.0.4 resolution: "create-ecdh@npm:4.0.4" @@ -6384,7 +6373,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:3.X, debug@npm:^3.2.7": +"debug@npm:3.X": version: 3.2.7 resolution: "debug@npm:3.2.7" dependencies: @@ -6507,17 +6496,6 @@ __metadata: languageName: node linkType: hard -"define-data-property@npm:^1.1.4": - version: 1.1.4 - resolution: "define-data-property@npm:1.1.4" - dependencies: - es-define-property: "npm:^1.0.0" - es-errors: "npm:^1.3.0" - gopd: "npm:^1.0.1" - checksum: dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37 - languageName: node - linkType: hard - "define-lazy-prop@npm:^2.0.0": version: 2.0.0 resolution: "define-lazy-prop@npm:2.0.0" @@ -7037,22 +7015,6 @@ __metadata: languageName: node linkType: hard -"es-define-property@npm:^1.0.0": - version: 1.0.0 - resolution: "es-define-property@npm:1.0.0" - dependencies: - get-intrinsic: "npm:^1.2.4" - checksum: 6bf3191feb7ea2ebda48b577f69bdfac7a2b3c9bcf97307f55fd6ef1bbca0b49f0c219a935aca506c993d8c5d8bddd937766cb760cd5e5a1071351f2df9f9aa4 - languageName: node - linkType: hard - -"es-errors@npm:^1.3.0": - version: 1.3.0 - resolution: "es-errors@npm:1.3.0" - checksum: 0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 - languageName: node - linkType: hard - "es-get-iterator@npm:^1.1.3": version: 1.1.3 resolution: "es-get-iterator@npm:1.1.3" @@ -7425,13 +7387,6 @@ __metadata: languageName: node linkType: hard -"eventemitter3@npm:^4.0.0": - version: 4.0.7 - resolution: "eventemitter3@npm:4.0.7" - checksum: 5f6d97cbcbac47be798e6355e3a7639a84ee1f7d9b199a07017f1d2f1e2fe236004d14fa5dfaeba661f94ea57805385e326236a6debbc7145c8877fbc0297c6b - languageName: node - linkType: hard - "events@npm:^3.0.0, events@npm:^3.3.0": version: 3.3.0 resolution: "events@npm:3.3.0" @@ -7561,6 +7516,45 @@ __metadata: languageName: node linkType: hard +"express@npm:^4.19.2": + version: 4.19.2 + resolution: "express@npm:4.19.2" + dependencies: + accepts: "npm:~1.3.8" + array-flatten: "npm:1.1.1" + body-parser: "npm:1.20.2" + content-disposition: "npm:0.5.4" + content-type: "npm:~1.0.4" + cookie: "npm:0.6.0" + cookie-signature: "npm:1.0.6" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + finalhandler: "npm:1.2.0" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + merge-descriptors: "npm:1.0.1" + methods: "npm:~1.1.2" + on-finished: "npm:2.4.1" + parseurl: "npm:~1.3.3" + path-to-regexp: "npm:0.1.7" + proxy-addr: "npm:~2.0.7" + qs: "npm:6.11.0" + range-parser: "npm:~1.2.1" + safe-buffer: "npm:5.2.1" + send: "npm:0.18.0" + serve-static: "npm:1.15.0" + setprototypeof: "npm:1.2.0" + statuses: "npm:2.0.1" + type-is: "npm:~1.6.18" + utils-merge: "npm:1.0.1" + vary: "npm:~1.1.2" + checksum: e82e2662ea9971c1407aea9fc3c16d6b963e55e3830cd0ef5e00b533feda8b770af4e3be630488ef8a752d7c75c4fcefb15892868eeaafe7353cb9e3e269fdcb + languageName: node + linkType: hard + "ext@npm:^1.1.2": version: 1.7.0 resolution: "ext@npm:1.7.0" @@ -7928,16 +7922,6 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.0.0": - version: 1.15.6 - resolution: "follow-redirects@npm:1.15.6" - peerDependenciesMeta: - debug: - optional: true - checksum: 9ff767f0d7be6aa6870c82ac79cf0368cd73e01bbc00e9eb1c2a16fbb198ec105e3c9b6628bb98e9f3ac66fe29a957b9645bcb9a490bb7aa0d35f908b6b85071 - languageName: node - linkType: hard - "for-each@npm:^0.3.3": version: 0.3.3 resolution: "for-each@npm:0.3.3" @@ -8034,6 +8018,7 @@ __metadata: date-fns: "npm:^3.3.1" draft-js: "git+https://github.com/penpot/draft-js.git" eventsource-parser: "npm:^1.1.2" + express: "npm:^4.19.2" fancy-log: "npm:^2.0.0" gettext-parser: "npm:^8.0.0" gulp: "npm:4.0.2" @@ -8046,7 +8031,6 @@ __metadata: gulp-sourcemaps: "npm:^3.0.0" gulp-svg-sprite: "npm:^2.0.3" highlight.js: "npm:^11.9.0" - http-server: "npm:^14.1.1" js-beautify: "npm:^1.15.1" jsdom: "npm:^24.0.0" jszip: "npm:^3.10.1" @@ -8288,19 +8272,6 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.2.4": - version: 1.2.4 - resolution: "get-intrinsic@npm:1.2.4" - dependencies: - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - has-proto: "npm:^1.0.1" - has-symbols: "npm:^1.0.3" - hasown: "npm:^2.0.0" - checksum: 0a9b82c16696ed6da5e39b1267104475c47e3a9bdbe8b509dfe1710946e38a87be70d759f4bb3cda042d76a41ef47fe769660f3b7c0d1f68750299344ffb15b7 - languageName: node - linkType: hard - "get-nonce@npm:^1.0.0": version: 1.0.1 resolution: "get-nonce@npm:1.0.1" @@ -8791,15 +8762,6 @@ __metadata: languageName: node linkType: hard -"has-property-descriptors@npm:^1.0.2": - version: 1.0.2 - resolution: "has-property-descriptors@npm:1.0.2" - dependencies: - es-define-property: "npm:^1.0.0" - checksum: 253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236 - languageName: node - linkType: hard - "has-proto@npm:^1.0.1": version: 1.0.1 resolution: "has-proto@npm:1.0.1" @@ -8892,15 +8854,6 @@ __metadata: languageName: node linkType: hard -"he@npm:^1.2.0": - version: 1.2.0 - resolution: "he@npm:1.2.0" - bin: - he: bin/he - checksum: a27d478befe3c8192f006cdd0639a66798979dfa6e2125c6ac582a19a5ebfec62ad83e8382e6036170d873f46e4536a7e795bf8b95bf7c247f4cc0825ccc8c17 - languageName: node - linkType: hard - "highlight.js@npm:^11.9.0": version: 11.9.0 resolution: "highlight.js@npm:11.9.0" @@ -8935,15 +8888,6 @@ __metadata: languageName: node linkType: hard -"html-encoding-sniffer@npm:^3.0.0": - version: 3.0.0 - resolution: "html-encoding-sniffer@npm:3.0.0" - dependencies: - whatwg-encoding: "npm:^2.0.0" - checksum: b17b3b0fb5d061d8eb15121c3b0b536376c3e295ecaf09ba48dd69c6b6c957839db124fe1e2b3f11329753a4ee01aa7dedf63b7677999e86da17fbbdd82c5386 - languageName: node - linkType: hard - "html-encoding-sniffer@npm:^4.0.0": version: 4.0.0 resolution: "html-encoding-sniffer@npm:4.0.0" @@ -8990,40 +8934,6 @@ __metadata: languageName: node linkType: hard -"http-proxy@npm:^1.18.1": - version: 1.18.1 - resolution: "http-proxy@npm:1.18.1" - dependencies: - eventemitter3: "npm:^4.0.0" - follow-redirects: "npm:^1.0.0" - requires-port: "npm:^1.0.0" - checksum: 148dfa700a03fb421e383aaaf88ac1d94521dfc34072f6c59770528c65250983c2e4ec996f2f03aa9f3fe46cd1270a593126068319311e3e8d9e610a37533e94 - languageName: node - linkType: hard - -"http-server@npm:^14.1.1": - version: 14.1.1 - resolution: "http-server@npm:14.1.1" - dependencies: - basic-auth: "npm:^2.0.1" - chalk: "npm:^4.1.2" - corser: "npm:^2.0.1" - he: "npm:^1.2.0" - html-encoding-sniffer: "npm:^3.0.0" - http-proxy: "npm:^1.18.1" - mime: "npm:^1.6.0" - minimist: "npm:^1.2.6" - opener: "npm:^1.5.1" - portfinder: "npm:^1.0.28" - secure-compare: "npm:3.0.1" - union: "npm:~0.5.0" - url-join: "npm:^4.0.1" - bin: - http-server: bin/http-server - checksum: c5770ddd722dd520ce0af25efee6bfb7c6300ff4e934636d4eec83fa995739e64de2e699e89e7a795b3a1894bcc37bec226617c1023600aacd7871fd8d6ffe6d - languageName: node - linkType: hard - "https-browserify@npm:^1.0.0": version: 1.0.0 resolution: "https-browserify@npm:1.0.0" @@ -10384,7 +10294,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.14, lodash@npm:^4.17.21": +"lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c @@ -10779,7 +10689,7 @@ __metadata: languageName: node linkType: hard -"mime@npm:1.6.0, mime@npm:^1.6.0": +"mime@npm:1.6.0": version: 1.6.0 resolution: "mime@npm:1.6.0" bin: @@ -10976,7 +10886,7 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^0.5.4, mkdirp@npm:^0.5.6": +"mkdirp@npm:^0.5.4": version: 0.5.6 resolution: "mkdirp@npm:0.5.6" dependencies: @@ -11550,15 +11460,6 @@ __metadata: languageName: node linkType: hard -"opener@npm:^1.5.1": - version: 1.5.2 - resolution: "opener@npm:1.5.2" - bin: - opener: bin/opener-bin.js - checksum: dd56256ab0cf796585617bc28e06e058adf09211781e70b264c76a1dbe16e90f868c974e5bf5309c93469157c7d14b89c35dc53fe7293b0e40b4d2f92073bc79 - languageName: node - linkType: hard - "opentype.js@npm:^1.3.4": version: 1.3.4 resolution: "opentype.js@npm:1.3.4" @@ -12132,17 +12033,6 @@ __metadata: languageName: node linkType: hard -"portfinder@npm:^1.0.28": - version: 1.0.32 - resolution: "portfinder@npm:1.0.32" - dependencies: - async: "npm:^2.6.4" - debug: "npm:^3.2.7" - mkdirp: "npm:^0.5.6" - checksum: cef8b567b78aabccc59fe8e103bac8b394bb45a6a69be626608f099f454124c775aaf47b274c006332c07ab3f501cde55e49aaeb9d49d78d90362d776a565cbf - languageName: node - linkType: hard - "posix-character-classes@npm:^0.1.0": version: 0.1.1 resolution: "posix-character-classes@npm:0.1.1" @@ -12569,15 +12459,6 @@ __metadata: languageName: node linkType: hard -"qs@npm:^6.4.0": - version: 6.12.0 - resolution: "qs@npm:6.12.0" - dependencies: - side-channel: "npm:^1.0.6" - checksum: e165a77ac5f3ca60c15c5f3d51b321ddec7aa438804436b29d160117bc6fb7bf7dab94abd0c7d7c0785890d3a75ae41e1d6346e158aaf1540c6fe53a31f11675 - languageName: node - linkType: hard - "querystring-es3@npm:^0.2.0": version: 0.2.1 resolution: "querystring-es3@npm:0.2.1" @@ -12651,6 +12532,18 @@ __metadata: languageName: node linkType: hard +"raw-body@npm:2.5.2": + version: 2.5.2 + resolution: "raw-body@npm:2.5.2" + dependencies: + bytes: "npm:3.1.2" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.4.24" + unpipe: "npm:1.0.0" + checksum: b201c4b66049369a60e766318caff5cb3cc5a900efd89bdac431463822d976ad0670912c931fdbdcf5543207daf6f6833bca57aa116e1661d2ea91e12ca692c4 + languageName: node + linkType: hard + "react-colorful@npm:^5.1.2": version: 5.6.1 resolution: "react-colorful@npm:5.6.1" @@ -13715,13 +13608,6 @@ __metadata: languageName: node linkType: hard -"secure-compare@npm:3.0.1": - version: 3.0.1 - resolution: "secure-compare@npm:3.0.1" - checksum: af3102f3f555d917c8ffff7a5f6f00f70195708f4faf82d48794485c9f3cb365cee0dd4da6b4e53e8964f172970bce6069b6101ba3ce8c309bff54f460d1f650 - languageName: node - linkType: hard - "semver-greatest-satisfied-range@npm:^1.1.0": version: 1.1.0 resolution: "semver-greatest-satisfied-range@npm:1.1.0" @@ -13812,20 +13698,6 @@ __metadata: languageName: node linkType: hard -"set-function-length@npm:^1.2.1": - version: 1.2.2 - resolution: "set-function-length@npm:1.2.2" - dependencies: - define-data-property: "npm:^1.1.4" - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.4" - gopd: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.2" - checksum: 82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c - languageName: node - linkType: hard - "set-function-name@npm:^2.0.0": version: 2.0.1 resolution: "set-function-name@npm:2.0.1" @@ -13957,18 +13829,6 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.6": - version: 1.0.6 - resolution: "side-channel@npm:1.0.6" - dependencies: - call-bind: "npm:^1.0.7" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.4" - object-inspect: "npm:^1.13.1" - checksum: d2afd163dc733cc0a39aa6f7e39bf0c436293510dbccbff446733daeaf295857dbccf94297092ec8c53e2503acac30f0b78830876f0485991d62a90e9cad305f - languageName: node - linkType: hard - "siginfo@npm:^2.0.0": version: 2.0.0 resolution: "siginfo@npm:2.0.0" @@ -15309,15 +15169,6 @@ __metadata: languageName: node linkType: hard -"union@npm:~0.5.0": - version: 0.5.0 - resolution: "union@npm:0.5.0" - dependencies: - qs: "npm:^6.4.0" - checksum: 9ac158d99991063180e56f408f5991e808fa07594713439c098116da09215c154672ee8c832e16a6b39b037609c08bcaff8ff07c1e3e46c3cc622897972af2aa - languageName: node - linkType: hard - "unique-filename@npm:^3.0.0": version: 3.0.0 resolution: "unique-filename@npm:3.0.0" @@ -15461,13 +15312,6 @@ __metadata: languageName: node linkType: hard -"url-join@npm:^4.0.1": - version: 4.0.1 - resolution: "url-join@npm:4.0.1" - checksum: ac65e2c7c562d7b49b68edddcf55385d3e922bc1dd5d90419ea40b53b6de1607d1e45ceb71efb9d60da02c681d13c6cb3a1aa8b13fc0c989dfc219df97ee992d - languageName: node - linkType: hard - "url-parse@npm:^1.5.3": version: 1.5.10 resolution: "url-parse@npm:1.5.10" @@ -15923,15 +15767,6 @@ __metadata: languageName: node linkType: hard -"whatwg-encoding@npm:^2.0.0": - version: 2.0.0 - resolution: "whatwg-encoding@npm:2.0.0" - dependencies: - iconv-lite: "npm:0.6.3" - checksum: 91b90a49f312dc751496fd23a7e68981e62f33afe938b97281ad766235c4872fc4e66319f925c5e9001502b3040dd25a33b02a9c693b73a4cbbfdc4ad10c3e3e - languageName: node - linkType: hard - "whatwg-encoding@npm:^3.1.1": version: 3.1.1 resolution: "whatwg-encoding@npm:3.1.1" -- Gitee From 02c455dcbafbda67b7703b0c92c91ebe21915fd0 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Wed, 24 Apr 2024 09:48:12 +0200 Subject: [PATCH 0395/1266] :recycle: Components refactor: generator for duplicate component --- .../app/common/files/libraries_helpers.cljc | 33 +++++++++++++++++++ .../app/main/data/workspace/libraries.cljs | 28 +--------------- 2 files changed, 34 insertions(+), 27 deletions(-) diff --git a/common/src/app/common/files/libraries_helpers.cljc b/common/src/app/common/files/libraries_helpers.cljc index 37d893b12..a31aa948f 100644 --- a/common/src/app/common/files/libraries_helpers.cljc +++ b/common/src/app/common/files/libraries_helpers.cljc @@ -148,6 +148,39 @@ [new-component-shape new-component-shapes nil nil])))) + + +(defn generate-duplicate-component + "Create a new component copied from the one with the given id." + [changes library component-id components-v2] + (let [component (ctkl/get-component (:data library) component-id) + new-name (:name component) + + main-instance-page (when components-v2 + (ctf/get-component-page (:data library) component)) + + new-component-id (when components-v2 + (uuid/next)) + + [new-component-shape new-component-shapes ; <- null in components-v2 + new-main-instance-shape new-main-instance-shapes] + (duplicate-component (:data library) component new-component-id)] + + (-> changes + (pcb/with-page main-instance-page) + (pcb/with-objects (:objects main-instance-page)) + (pcb/add-objects new-main-instance-shapes {:ignore-touched true}) + (pcb/add-component (if components-v2 + new-component-id + (:id new-component-shape)) + (:path component) + new-name + new-component-shapes + [] + (:id new-main-instance-shape) + (:id main-instance-page) + (:annotation component))))) + (defn generate-instantiate-component "Generate changes to create a new instance from a component." ([changes objects file-id component-id position page libraries] diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index 9e944f9f4..c88a6b8e9 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -465,35 +465,9 @@ (watch [it state _] (let [libraries (wsh/get-libraries state) library (get libraries library-id) - component (ctkl/get-component (:data library) component-id) - new-name (:name component) - components-v2 (features/active-feature? state "components/v2") - - main-instance-page (when components-v2 - (ctf/get-component-page (:data library) component)) - - new-component-id (when components-v2 - (uuid/next)) - - [new-component-shape new-component-shapes ; <- null in components-v2 - new-main-instance-shape new-main-instance-shapes] - (cflh/duplicate-component component new-component-id (:data library)) - changes (-> (pcb/empty-changes it nil) - (pcb/with-page main-instance-page) - (pcb/with-objects (:objects main-instance-page)) - (pcb/add-objects new-main-instance-shapes {:ignore-touched true}) - (pcb/add-component (if components-v2 - new-component-id - (:id new-component-shape)) - (:path component) - new-name - new-component-shapes - [] - (:id new-main-instance-shape) - (:id main-instance-page) - (:annotation component)))] + (cflh/generate-duplicate-component library component-id components-v2))] (rx/of (dch/commit-changes changes)))))) -- Gitee From f91d60eeb6e060fe1d9958ab3473424d39b2a2af Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Mon, 22 Apr 2024 13:09:56 +0200 Subject: [PATCH 0396/1266] :recycle: Components refactor: generator for rename-component --- .../app/common/files/libraries_helpers.cljc | 6 ++++++ .../app/main/data/workspace/libraries.cljs | 21 +++---------------- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/common/src/app/common/files/libraries_helpers.cljc b/common/src/app/common/files/libraries_helpers.cljc index a31aa948f..0bb7d0e3a 100644 --- a/common/src/app/common/files/libraries_helpers.cljc +++ b/common/src/app/common/files/libraries_helpers.cljc @@ -847,6 +847,7 @@ (defn- generate-rename-component + "Generate the changes for rename the component with the given id, in the current file library." [changes id new-name library-data components-v2] (let [[path name] (cfh/parse-path-name new-name) update-fn @@ -864,6 +865,9 @@ (pcb/with-library-data library-data) (pcb/update-component id update-fn)))) + + + (defn generate-sync-shape-inverse "Generate changes to update the component a shape is linked to, from the values in the shape and all its children." @@ -1785,3 +1789,5 @@ [:component-root])] [root (:id root-shape) changes])) + + diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index c88a6b8e9..fcee4d366 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -414,25 +414,10 @@ (let [new-name (str/trim new-name)] (if (str/empty? new-name) (rx/empty) - (let [data (get state :workspace-data) - [path name] (cfh/parse-path-name new-name) + (let [library-data (get state :workspace-data) components-v2 (features/active-feature? state "components/v2") - - update-fn - (fn [component] - (cond-> component - :always - (assoc :path path - :name name) - - (not components-v2) - (update :objects - ;; Give the same name to the root shape - #(assoc-in % [id :name] name)))) - - changes (-> (pcb/empty-changes it) - (pcb/with-library-data data) - (pcb/update-component id update-fn))] + changes (-> (pcb/empty-changes it) + (cflh/generate-rename-component id new-name library-data components-v2))] (rx/of (dch/commit-changes changes)))))))) -- Gitee From 7d44eef4ab134c614478c4f6ed99f66e74b375d1 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Mon, 22 Apr 2024 13:17:42 +0200 Subject: [PATCH 0397/1266] :recycle: Components refactor: generator for restore-component --- .../app/common/files/libraries_helpers.cljc | 26 ++++++++++++++++--- .../app/main/data/workspace/libraries.cljs | 19 +++----------- .../app/main/data/workspace/selection.cljs | 2 +- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/common/src/app/common/files/libraries_helpers.cljc b/common/src/app/common/files/libraries_helpers.cljc index 0bb7d0e3a..bfe78afb0 100644 --- a/common/src/app/common/files/libraries_helpers.cljc +++ b/common/src/app/common/files/libraries_helpers.cljc @@ -286,15 +286,15 @@ (reduce skip-near changes children))) (defn prepare-restore-component - ([library-data component-id current-page it] + ([changes library-data component-id current-page] (let [component (ctkl/get-deleted-component library-data component-id) page (or (ctf/get-component-page library-data component) (when (some #(= (:id current-page) %) (:pages library-data)) ;; If the page doesn't belong to the library, it's not valid current-page) (ctpl/get-last-page library-data))] - (prepare-restore-component nil library-data component-id it page (gpt/point 0 0) nil nil nil))) + (prepare-restore-component changes library-data component-id page (gpt/point 0 0) nil nil nil))) - ([changes library-data component-id it page delta old-id parent-id frame-id] + ([changes library-data component-id page delta old-id parent-id frame-id] (let [component (ctkl/get-deleted-component library-data component-id) parent (get-in page [:objects parent-id]) main-inst (get-in component [:objects (:main-instance-id component)]) @@ -316,7 +316,7 @@ (not inside-component?) (assoc :component-root true)) - changes (-> (or changes (pcb/empty-changes it)) + changes (-> changes (pcb/with-page page) (pcb/with-objects (:objects page)) (pcb/with-library-data library-data)) @@ -1790,4 +1790,22 @@ [root (:id root-shape) changes])) +(defn generate-restore-component + "Restore a deleted component, with the given id, in the given file library." + [changes library-data component-id library-id current-page objects] + (let [{:keys [changes shape]} (prepare-restore-component changes library-data component-id current-page) + parent-id (:parent-id shape) + objects (cond-> (assoc objects (:id shape) shape) + (not (nil? parent-id)) + (update-in [parent-id :shapes] + #(conj % (:id shape)))) + + ;; Adds a resize-parents operation so the groups are updated. We add all the new objects + new-objects-ids (->> changes :redo-changes (filter #(= (:type %) :add-obj)) (mapv :id)) + changes (-> changes + (pcb/with-objects objects) + (pcb/resize-parents new-objects-ids))] + + (assoc changes :file-id library-id))) + diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index fcee4d366..184d55933 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -488,22 +488,11 @@ (watch [it state _] (let [page-id (:current-page-id state) current-page (dm/get-in state [:workspace-data :pages-index page-id]) - objects (wsh/lookup-page-objects state page-id) library-data (wsh/get-file state library-id) - {:keys [changes shape]} (cflh/prepare-restore-component library-data component-id current-page it) - parent-id (:parent-id shape) - objects (cond-> (assoc objects (:id shape) shape) - (not (nil? parent-id)) - (update-in [parent-id :shapes] - #(conj % (:id shape)))) - - ;; Adds a resize-parents operation so the groups are updated. We add all the new objects - new-objects-ids (->> changes :redo-changes (filter #(= (:type %) :add-obj)) (mapv :id)) - changes (-> changes - (pcb/with-objects objects) - (pcb/resize-parents new-objects-ids))] - - (rx/of (dch/commit-changes (assoc changes :file-id library-id))))))) + objects (wsh/lookup-page-objects state page-id) + changes (-> (pcb/empty-changes it) + (cflh/generate-restore-component library-data component-id library-id current-page objects))] + (rx/of (dch/commit-changes changes)))))) (defn restore-components diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index 1fcf1ecae..8461da54e 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -447,7 +447,7 @@ {}) restore-component - #(let [restore (cflh/prepare-restore-component changes library-data (:component-id component-root) it page delta (:id component-root) parent-id frame-id)] + #(let [restore (cflh/prepare-restore-component changes library-data (:component-id component-root) page delta (:id component-root) parent-id frame-id)] [(:shape restore) (:changes restore)]) [_shape changes] -- Gitee From 0ed582ebc5e5f4ca33b470cf27ec9b4339517c69 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Mon, 22 Apr 2024 13:20:52 +0200 Subject: [PATCH 0398/1266] :recycle: Components refactor: generator for detach-component --- common/src/app/common/files/libraries_helpers.cljc | 12 +++++++++++- frontend/src/app/main/data/workspace/libraries.cljs | 9 ++------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/common/src/app/common/files/libraries_helpers.cljc b/common/src/app/common/files/libraries_helpers.cljc index bfe78afb0..4813b9711 100644 --- a/common/src/app/common/files/libraries_helpers.cljc +++ b/common/src/app/common/files/libraries_helpers.cljc @@ -846,7 +846,7 @@ components-v2)))) -(defn- generate-rename-component +(defn generate-rename-component "Generate the changes for rename the component with the given id, in the current file library." [changes id new-name library-data components-v2] (let [[path name] (cfh/parse-path-name new-name) @@ -1808,4 +1808,14 @@ (assoc changes :file-id library-id))) +(defn generate-detach-component + "Generate changes for remove all references to components in the shape, + with the given id and all its children, at the current page." + [changes id file page-id libraries] + (let [container (cfh/get-container file :page page-id)] + (-> changes + (pcb/with-container container) + (pcb/with-objects (:objects container)) + (generate-detach-instance container libraries id)))) + diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index 184d55933..105d0a213 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -554,13 +554,10 @@ (watch [it state _] (let [file (wsh/get-local-file state) page-id (get state :current-page-id) - container (cfh/get-container file :page page-id) libraries (wsh/get-libraries state) changes (-> (pcb/empty-changes it) - (pcb/with-container container) - (pcb/with-objects (:objects container)) - (cflh/generate-detach-instance container libraries id))] + (cflh/generate-detach-component id file page-id libraries))] (rx/of (dch/commit-changes changes)))))) @@ -597,9 +594,7 @@ (reduce (fn [changes id] (cflh/generate-detach-instance changes container libraries id)) - (-> (pcb/empty-changes it) - (pcb/with-container container) - (pcb/with-objects objects)) + (pcb/empty-changes it) selected))] (rx/of (when can-detach? -- Gitee From c001710676438284f82734b7c819464c75a1218c Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 23 Apr 2024 11:24:03 +0200 Subject: [PATCH 0399/1266] :recycle: Components refactor: generator for delete shapes --- .../app/common/files/libraries_helpers.cljc | 126 ++++++++++++ .../src/app/main/data/workspace/shapes.cljs | 179 ++---------------- 2 files changed, 140 insertions(+), 165 deletions(-) diff --git a/common/src/app/common/files/libraries_helpers.cljc b/common/src/app/common/files/libraries_helpers.cljc index 4813b9711..625b201d9 100644 --- a/common/src/app/common/files/libraries_helpers.cljc +++ b/common/src/app/common/files/libraries_helpers.cljc @@ -21,8 +21,10 @@ [app.common.types.components-list :as ctkl] [app.common.types.container :as ctn] [app.common.types.file :as ctf] + [app.common.types.page :as ctp] [app.common.types.pages-list :as ctpl] [app.common.types.shape-tree :as ctst] + [app.common.types.shape.interactions :as ctsi] [app.common.types.shape.layout :as ctl] [app.common.types.typography :as cty] [app.common.uuid :as uuid] @@ -1818,4 +1820,128 @@ (pcb/with-objects (:objects container)) (generate-detach-instance container libraries id)))) +(defn generate-delete-shapes + [changes file page objects ids {:keys [components-v2 ignore-touched undo-group]}] + (let [changes (-> changes + (pcb/set-undo-group undo-group) + (pcb/with-page page) + (pcb/with-objects objects) + (pcb/with-library-data file)) + lookup (d/getf objects) + groups-to-unmask + (reduce (fn [group-ids id] + ;; When the shape to delete is the mask of a masked group, + ;; the mask condition must be removed, and it must be + ;; converted to a normal group. + (let [obj (lookup id) + parent (lookup (:parent-id obj))] + (if (and (:masked-group parent) + (= id (first (:shapes parent)))) + (conj group-ids (:id parent)) + group-ids))) + #{} + ids) + + interacting-shapes + (filter (fn [shape] + ;; If any of the deleted shapes is the destination of + ;; some interaction, this must be deleted, too. + (let [interactions (:interactions shape)] + (some #(and (ctsi/has-destination %) + (contains? ids (:destination %))) + interactions))) + (vals objects)) + + ids-set (set ids) + guides-to-remove + (->> (dm/get-in page [:options :guides]) + (vals) + (filter #(contains? ids-set (:frame-id %))) + (map :id)) + + guides + (->> guides-to-remove + (reduce dissoc (dm/get-in page [:options :guides]))) + + starting-flows + (filter (fn [flow] + ;; If any of the deleted is a frame that starts a flow, + ;; this must be deleted, too. + (contains? ids (:starting-frame flow))) + (-> page :options :flows)) + + all-parents + (reduce (fn [res id] + ;; All parents of any deleted shape must be resized. + (into res (cfh/get-parent-ids objects id))) + (d/ordered-set) + ids) + + all-children + (->> ids ;; Children of deleted shapes must be also deleted. + (reduce (fn [res id] + (into res (cfh/get-children-ids objects id))) + []) + (reverse) + (into (d/ordered-set))) + + find-all-empty-parents + (fn recursive-find-empty-parents [empty-parents] + (let [all-ids (into empty-parents ids) + contains? (partial contains? all-ids) + xform (comp (map lookup) + (filter #(or (cfh/group-shape? %) (cfh/bool-shape? %))) + (remove #(->> (:shapes %) (remove contains?) seq)) + (map :id)) + parents (into #{} xform all-parents)] + (if (= empty-parents parents) + empty-parents + (recursive-find-empty-parents parents)))) + + empty-parents + ;; Any parent whose children are all deleted, must be deleted too. + (into (d/ordered-set) (find-all-empty-parents #{})) + + components-to-delete + (if components-v2 + (reduce (fn [components id] + (let [shape (get objects id)] + (if (and (= (:component-file shape) (:id file)) ;; Main instances should exist only in local file + (:main-instance shape)) ;; but check anyway + (conj components (:component-id shape)) + components))) + [] + (into ids all-children)) + []) + + changes (-> changes + (pcb/set-page-option :guides guides)) + changes (reduce (fn [changes component-id] + ;; It's important to delete the component before the main instance, because we + ;; need to store the instance position if we want to restore it later. + (pcb/delete-component changes component-id (:id page))) + changes + components-to-delete) + + changes (-> changes + (pcb/remove-objects all-children {:ignore-touched true}) + (pcb/remove-objects ids {:ignore-touched ignore-touched}) + (pcb/remove-objects empty-parents) + (pcb/resize-parents all-parents) + (pcb/update-shapes groups-to-unmask + (fn [shape] + (assoc shape :masked-group false))) + (pcb/update-shapes (map :id interacting-shapes) + (fn [shape] + (d/update-when shape :interactions + (fn [interactions] + (into [] + (remove #(and (ctsi/has-destination %) + (contains? ids (:destination %)))) + interactions))))) + (cond-> (seq starting-flows) + (pcb/update-page-option :flows (fn [flows] + (->> (map :id starting-flows) + (reduce ctp/remove-flow flows))))))] + [changes all-parents])) \ No newline at end of file diff --git a/frontend/src/app/main/data/workspace/shapes.cljs b/frontend/src/app/main/data/workspace/shapes.cljs index 462b569c4..b60195259 100644 --- a/frontend/src/app/main/data/workspace/shapes.cljs +++ b/frontend/src/app/main/data/workspace/shapes.cljs @@ -10,13 +10,12 @@ [app.common.data.macros :as dm] [app.common.files.changes-builder :as pcb] [app.common.files.helpers :as cfh] + [app.common.files.libraries-helpers :as cflh] [app.common.files.shapes-helpers :as cfsh] [app.common.schema :as sm] [app.common.types.container :as ctn] - [app.common.types.page :as ctp] [app.common.types.shape :as cts] [app.common.types.shape-tree :as ctst] - [app.common.types.shape.interactions :as ctsi] [app.main.data.comments :as dc] [app.main.data.workspace.changes :as dch] [app.main.data.workspace.edition :as dwe] @@ -85,7 +84,6 @@ (rx/of (dch/commit-changes changes)) (rx/empty)))))) -(declare real-delete-shapes) (declare update-shape-flags) (defn delete-shapes @@ -136,168 +134,19 @@ (conj ids-to-delete id) ids-to-hide))))) [ids []]) - - undo-id (or (:undo-id options) (js/Symbol))] - - (rx/concat - (rx/of (dwu/start-undo-transaction undo-id) - (update-shape-flags ids-to-hide {:hidden true :undo-group (:undo-group options)})) - (real-delete-shapes file page objects ids-to-delete it {:components-v2 components-v2 - :ignore-touched (:component-swap options) - :undo-group (:undo-group options) - :undo-id undo-id}) - (rx/of (dwu/commit-undo-transaction undo-id)))))))) - -(defn- real-delete-shapes-changes - ([file page objects ids it {:keys [undo-group] :as options}] - (let [changes (-> (pcb/empty-changes it (:id page)) - (pcb/set-undo-group undo-group) - (pcb/with-page page) - (pcb/with-objects objects) - (pcb/with-library-data file))] - (real-delete-shapes-changes changes file page objects ids it options))) - ([changes file page objects ids _it {:keys [components-v2 ignore-touched]}] - (let [lookup (d/getf objects) - groups-to-unmask - (reduce (fn [group-ids id] - ;; When the shape to delete is the mask of a masked group, - ;; the mask condition must be removed, and it must be - ;; converted to a normal group. - (let [obj (lookup id) - parent (lookup (:parent-id obj))] - (if (and (:masked-group parent) - (= id (first (:shapes parent)))) - (conj group-ids (:id parent)) - group-ids))) - #{} - ids) - - interacting-shapes - (filter (fn [shape] - ;; If any of the deleted shapes is the destination of - ;; some interaction, this must be deleted, too. - (let [interactions (:interactions shape)] - (some #(and (ctsi/has-destination %) - (contains? ids (:destination %))) - interactions))) - (vals objects)) - - ids-set (set ids) - guides-to-remove - (->> (dm/get-in page [:options :guides]) - (vals) - (filter #(contains? ids-set (:frame-id %))) - (map :id)) - - guides - (->> guides-to-remove - (reduce dissoc (dm/get-in page [:options :guides]))) - - starting-flows - (filter (fn [flow] - ;; If any of the deleted is a frame that starts a flow, - ;; this must be deleted, too. - (contains? ids (:starting-frame flow))) - (-> page :options :flows)) - - all-parents - (reduce (fn [res id] - ;; All parents of any deleted shape must be resized. - (into res (cfh/get-parent-ids objects id))) - (d/ordered-set) - ids) - - all-children - (->> ids ;; Children of deleted shapes must be also deleted. - (reduce (fn [res id] - (into res (cfh/get-children-ids objects id))) - []) - (reverse) - (into (d/ordered-set))) - - find-all-empty-parents - (fn recursive-find-empty-parents [empty-parents] - (let [all-ids (into empty-parents ids) - contains? (partial contains? all-ids) - xform (comp (map lookup) - (filter #(or (cfh/group-shape? %) (cfh/bool-shape? %))) - (remove #(->> (:shapes %) (remove contains?) seq)) - (map :id)) - parents (into #{} xform all-parents)] - (if (= empty-parents parents) - empty-parents - (recursive-find-empty-parents parents)))) - - empty-parents - ;; Any parent whose children are all deleted, must be deleted too. - (into (d/ordered-set) (find-all-empty-parents #{})) - - components-to-delete - (if components-v2 - (reduce (fn [components id] - (let [shape (get objects id)] - (if (and (= (:component-file shape) (:id file)) ;; Main instances should exist only in local file - (:main-instance shape)) ;; but check anyway - (conj components (:component-id shape)) - components))) - [] - (into ids all-children)) - []) - - changes (-> changes - (pcb/set-page-option :guides guides)) - - changes (reduce (fn [changes component-id] - ;; It's important to delete the component before the main instance, because we - ;; need to store the instance position if we want to restore it later. - (pcb/delete-component changes component-id (:id page))) - changes - components-to-delete) - - changes (-> changes - (pcb/remove-objects all-children {:ignore-touched true}) - (pcb/remove-objects ids {:ignore-touched ignore-touched}) - (pcb/remove-objects empty-parents) - (pcb/resize-parents all-parents) - (pcb/update-shapes groups-to-unmask - (fn [shape] - (assoc shape :masked-group false))) - (pcb/update-shapes (map :id interacting-shapes) - (fn [shape] - (d/update-when shape :interactions - (fn [interactions] - (into [] - (remove #(and (ctsi/has-destination %) - (contains? ids (:destination %)))) - interactions))))) - (cond-> (seq starting-flows) - (pcb/update-page-option :flows (fn [flows] - (->> (map :id starting-flows) - (reduce ctp/remove-flow flows))))))] - [changes all-parents]))) - - -(defn delete-shapes-changes - [changes file page objects ids it components-v2 ignore-touched] - (let [[changes _all-parents] (real-delete-shapes-changes changes - file - page - objects - ids - it - {:components-v2 components-v2 - :ignore-touched ignore-touched})] - changes)) - -(defn- real-delete-shapes - [file page objects ids it options] - (let [[changes all-parents] (real-delete-shapes-changes file page objects ids it options) - undo-id (or (:undo-id options) (js/Symbol))] - (rx/of (dwu/start-undo-transaction undo-id) - (dc/detach-comment-thread ids) - (dch/commit-changes changes) - (ptk/data-event :layout/update {:ids all-parents :undo-group (:undo-group options)}) - (dwu/commit-undo-transaction undo-id)))) + undo-id (or (:undo-id options) (js/Symbol)) + [changes all-parents] (-> (pcb/empty-changes it (:id page)) + (cflh/generate-delete-shapes file page objects ids-to-delete {:components-v2 components-v2 + :ignore-touched (:component-swap options) + :undo-group (:undo-group options) + :undo-id undo-id}))] + + (rx/of (dwu/start-undo-transaction undo-id) + (update-shape-flags ids-to-hide {:hidden true :undo-group (:undo-group options)}) + (dc/detach-comment-thread ids) + (dch/commit-changes changes) + (ptk/data-event :layout/update {:ids all-parents :undo-group (:undo-group options)}) + (dwu/commit-undo-transaction undo-id))))))) (defn create-and-add-shape [type frame-x frame-y {:keys [width height] :as attrs}] -- Gitee From 05f4459fb7c722cf2156336a647020aa7a507b72 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 23 Apr 2024 13:00:21 +0200 Subject: [PATCH 0400/1266] :recycle: Components refactor: generator for generate component for swap --- .../app/common/files/libraries_helpers.cljc | 130 ++++++++++++++++-- .../app/main/data/workspace/libraries.cljs | 102 +++++--------- .../src/app/main/data/workspace/shapes.cljs | 42 +----- 3 files changed, 153 insertions(+), 121 deletions(-) diff --git a/common/src/app/common/files/libraries_helpers.cljc b/common/src/app/common/files/libraries_helpers.cljc index 625b201d9..8c195e7f7 100644 --- a/common/src/app/common/files/libraries_helpers.cljc +++ b/common/src/app/common/files/libraries_helpers.cljc @@ -1820,10 +1820,53 @@ (pcb/with-objects (:objects container)) (generate-detach-instance container libraries id)))) +(defn generate-update-shape-flags + [changes ids objects {:keys [blocked hidden] :as flags}] + (let [update-fn + (fn [obj] + (cond-> obj + (boolean? blocked) (assoc :blocked blocked) + (boolean? hidden) (assoc :hidden hidden))) + + ids (if (boolean? blocked) + (into ids (->> ids (mapcat #(cfh/get-children-ids objects %)))) + ids)] + (-> changes + (pcb/update-shapes ids update-fn {:attrs #{:blocked :hidden}})))) + (defn generate-delete-shapes - [changes file page objects ids {:keys [components-v2 ignore-touched undo-group]}] - (let [changes (-> changes - (pcb/set-undo-group undo-group) + [changes file page objects ids {:keys [components-v2 ignore-touched component-swap]}] + (let [ids (cfh/clean-loops objects ids) + + in-component-copy? + (fn [shape-id] + ;; Look for shapes that are inside a component copy, but are + ;; not the root. In this case, they must not be deleted, + ;; but hidden (to be able to recover them more easily). + ;; Unless we are doing a component swap, in which case we want + ;; to delete the old shape + (let [shape (get objects shape-id)] + (and (ctn/has-any-copy-parent? objects shape) + (not component-swap)))) + + [ids-to-delete ids-to-hide] + (if components-v2 + (loop [ids-seq (seq ids) + ids-to-delete [] + ids-to-hide []] + (let [id (first ids-seq)] + (if (nil? id) + [ids-to-delete ids-to-hide] + (if (in-component-copy? id) + (recur (rest ids-seq) + ids-to-delete + (conj ids-to-hide id)) + (recur (rest ids-seq) + (conj ids-to-delete id) + ids-to-hide))))) + [ids []]) + + changes (-> changes (pcb/with-page page) (pcb/with-objects objects) (pcb/with-library-data file)) @@ -1840,7 +1883,7 @@ (conj group-ids (:id parent)) group-ids))) #{} - ids) + ids-to-delete) interacting-shapes (filter (fn [shape] @@ -1848,11 +1891,11 @@ ;; some interaction, this must be deleted, too. (let [interactions (:interactions shape)] (some #(and (ctsi/has-destination %) - (contains? ids (:destination %))) + (contains? ids-to-delete (:destination %))) interactions))) (vals objects)) - ids-set (set ids) + ids-set (set ids-to-delete) guides-to-remove (->> (dm/get-in page [:options :guides]) (vals) @@ -1867,7 +1910,7 @@ (filter (fn [flow] ;; If any of the deleted is a frame that starts a flow, ;; this must be deleted, too. - (contains? ids (:starting-frame flow))) + (contains? ids-to-delete (:starting-frame flow))) (-> page :options :flows)) all-parents @@ -1875,10 +1918,10 @@ ;; All parents of any deleted shape must be resized. (into res (cfh/get-parent-ids objects id))) (d/ordered-set) - ids) + ids-to-delete) all-children - (->> ids ;; Children of deleted shapes must be also deleted. + (->> ids-to-delete ;; Children of deleted shapes must be also deleted. (reduce (fn [res id] (into res (cfh/get-children-ids objects id))) []) @@ -1887,7 +1930,7 @@ find-all-empty-parents (fn recursive-find-empty-parents [empty-parents] - (let [all-ids (into empty-parents ids) + (let [all-ids (into empty-parents ids-to-delete) contains? (partial contains? all-ids) xform (comp (map lookup) (filter #(or (cfh/group-shape? %) (cfh/bool-shape? %))) @@ -1911,7 +1954,7 @@ (conj components (:component-id shape)) components))) [] - (into ids all-children)) + (into ids-to-delete all-children)) []) changes (-> changes @@ -1923,10 +1966,10 @@ (pcb/delete-component changes component-id (:id page))) changes components-to-delete) - changes (-> changes + (generate-update-shape-flags ids-to-hide objects {:hidden true}) (pcb/remove-objects all-children {:ignore-touched true}) - (pcb/remove-objects ids {:ignore-touched ignore-touched}) + (pcb/remove-objects ids-to-delete {:ignore-touched ignore-touched}) (pcb/remove-objects empty-parents) (pcb/resize-parents all-parents) (pcb/update-shapes groups-to-unmask @@ -1938,10 +1981,67 @@ (fn [interactions] (into [] (remove #(and (ctsi/has-destination %) - (contains? ids (:destination %)))) + (contains? ids-to-delete (:destination %)))) interactions))))) (cond-> (seq starting-flows) (pcb/update-page-option :flows (fn [flows] (->> (map :id starting-flows) (reduce ctp/remove-flow flows))))))] - [changes all-parents])) \ No newline at end of file + [all-parents changes])) + +(defn generate-new-shape-for-swap + [changes shape file page libraries id-new-component index target-cell keep-props-values] + (let [objects (:objects page) + position (gpt/point (:x shape) (:y shape)) + changes (-> changes + (pcb/with-objects objects)) + position (-> position (with-meta {:cell target-cell})) + parent (get objects (:parent-id shape)) + inside-comp? (ctn/in-any-component? objects parent) + + [new-shape changes] + (generate-instantiate-component changes + objects + (:id file) + id-new-component + position + page + libraries + nil + (:parent-id shape) + (:frame-id shape) + {:force-frame? true}) + + new-shape (cond-> new-shape + ;; if the shape isn't inside a main component, it shouldn't have a swap slot + (and (nil? (ctk/get-swap-slot new-shape)) + inside-comp?) + (update :touched cfh/set-touched-group (-> (ctf/find-swap-slot shape + page + {:id (:id file) + :data file} + libraries) + (ctk/build-swap-slot-group))))] + + [new-shape (-> changes + ;; Restore the properties + (pcb/update-shapes [(:id new-shape)] #(d/patch-object % keep-props-values)) + + ;; We need to set the same index as the original shape + (pcb/change-parent (:parent-id shape) [new-shape] index {:component-swap true + :ignore-touched true}) + (change-touched new-shape + shape + (ctn/make-container page :page) + {}))])) + +(defn generate-component-swap + [changes objects shape file page libraries id-new-component index target-cell keep-props-values] + (let [[all-parents changes] + (-> changes + (generate-delete-shapes file page objects (d/ordered-set (:id shape)) {:components-v2 true + :component-swap true})) + [new-shape changes] + (-> changes + (generate-new-shape-for-swap shape file page libraries id-new-component index target-cell keep-props-values))] + [new-shape all-parents changes])) diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index 105d0a213..c3981cf1d 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -23,6 +23,7 @@ [app.common.types.shape.layout :as ctl] [app.common.types.typography :as ctt] [app.common.uuid :as uuid] + [app.main.data.comments :as dc] [app.main.data.events :as ev] [app.main.data.messages :as msg] [app.main.data.modal :as modal] @@ -31,7 +32,6 @@ [app.main.data.workspace.groups :as dwg] [app.main.data.workspace.notifications :as-alias dwn] [app.main.data.workspace.selection :as dws] - [app.main.data.workspace.shapes :as dwsh] [app.main.data.workspace.specialized-panel :as dwsp] [app.main.data.workspace.state-helpers :as wsh] [app.main.data.workspace.thumbnails :as dwt] @@ -465,12 +465,29 @@ (watch [it state _] (let [data (get state :workspace-data)] (if (features/active-feature? state "components/v2") - (let [component (ctkl/get-component data id) - page-id (:main-instance-page component) - root-id (:main-instance-id component)] + (let [component (ctkl/get-component data id) + page-id (:main-instance-page component) + root-id (:main-instance-id component) + file-id (:current-file-id state) + file (wsh/get-file state file-id) + page (wsh/lookup-page state page-id) + objects (wsh/lookup-page-objects state page-id) + components-v2 (features/active-feature? state "components/v2") + undo-group (uuid/next) + undo-id (js/Symbol) + [all-parents changes] + (-> (pcb/empty-changes it page-id) + ;; Deleting main root triggers component delete + (cflh/generate-delete-shapes file page objects #{root-id} {:components-v2 components-v2 + :undo-group undo-group + :undo-id undo-id}))] (rx/of + (dwu/start-undo-transaction undo-id) (dwt/clear-thumbnail (:current-file-id state) page-id root-id "component") - (dwsh/delete-shapes page-id #{root-id}))) ;; Deleting main root triggers component delete + (dc/detach-comment-thread #{root-id}) + (dch/commit-changes changes) + (ptk/data-event :layout/update {:ids all-parents :undo-group undo-group}) + (dwu/commit-undo-transaction undo-id))) (let [page-id (:current-page-id state) changes (-> (pcb/empty-changes it) (pcb/with-library-data data) @@ -880,62 +897,6 @@ second) 0))))) -(defn- add-component-for-swap - [shape file page libraries id-new-component index target-cell keep-props-values {:keys [undo-group]}] - (dm/assert! (uuid? id-new-component)) - (ptk/reify ::add-component-for-swap - ptk/WatchEvent - (watch [it _ _] - (let [objects (:objects page) - position (gpt/point (:x shape) (:y shape)) - changes (-> (pcb/empty-changes it (:id page)) - (pcb/set-undo-group undo-group) - (pcb/with-objects objects)) - position (-> position (with-meta {:cell target-cell})) - parent (get objects (:parent-id shape)) - inside-comp? (ctn/in-any-component? objects parent) - - [new-shape changes] - (cflh/generate-instantiate-component changes - objects - (:id file) - id-new-component - position - page - libraries - nil - (:parent-id shape) - (:frame-id shape) - {:force-frame? true}) - - new-shape (cond-> new-shape - ; if the shape isn't inside a main component, it shouldn't have a swap slot - (and (nil? (ctk/get-swap-slot new-shape)) - inside-comp?) - (update :touched cfh/set-touched-group (-> (ctf/find-swap-slot shape - page - {:id (:id file) - :data file} - libraries) - (ctk/build-swap-slot-group)))) - - changes - (-> changes - ;; Restore the properties - (pcb/update-shapes [(:id new-shape)] #(d/patch-object % keep-props-values)) - - ;; We need to set the same index as the original shape - (pcb/change-parent (:parent-id shape) [new-shape] index {:component-swap true - :ignore-touched true}) - (cflh/change-touched new-shape - shape - (ctn/make-container page :page) - {}))] - - ;; First delete so we don't break the grid layout cells - (rx/of (dch/commit-changes changes) - (dws/select-shape (:id new-shape) true)))))) - (defn- component-swap "Swaps a component with another one" [shape file-id id-new-component] @@ -943,7 +904,7 @@ (dm/assert! (uuid? file-id)) (ptk/reify ::component-swap ptk/WatchEvent - (watch [_ state _] + (watch [it state _] ;; First delete shapes so we have space in the layout otherwise we can have problems ;; in the grid creating new rows/columns to make space (let [file (wsh/get-file state file-id) @@ -962,15 +923,18 @@ keep-props-values (select-keys shape ctk/swap-keep-attrs) undo-id (js/Symbol) - undo-group (uuid/next)] + undo-group (uuid/next) + + [new-shape all-parents changes] + (-> (pcb/empty-changes it (:id page)) + (pcb/set-undo-group undo-group) + (cflh/generate-component-swap objects shape file page libraries id-new-component index target-cell keep-props-values))] + (rx/of (dwu/start-undo-transaction undo-id) - (dwsh/delete-shapes nil (d/ordered-set (:id shape)) {:component-swap true - :undo-id undo-id - :undo-group undo-group}) - (add-component-for-swap shape file page libraries id-new-component index target-cell keep-props-values - {:undo-group undo-group}) - (ptk/data-event :layout/update {:ids [(:parent-id shape)] :undo-group undo-group}) + (dch/commit-changes changes) + (dws/select-shape (:id new-shape) true) + (ptk/data-event :layout/update {:ids all-parents :undo-group undo-group}) (dwu/commit-undo-transaction undo-id)))))) (defn component-multi-swap diff --git a/frontend/src/app/main/data/workspace/shapes.cljs b/frontend/src/app/main/data/workspace/shapes.cljs index b60195259..692ff9317 100644 --- a/frontend/src/app/main/data/workspace/shapes.cljs +++ b/frontend/src/app/main/data/workspace/shapes.cljs @@ -102,47 +102,15 @@ file (wsh/get-file state file-id) page (wsh/lookup-page state page-id) objects (wsh/lookup-page-objects state page-id) - components-v2 (features/active-feature? state "components/v2") - - ids (cfh/clean-loops objects ids) - - in-component-copy? - (fn [shape-id] - ;; Look for shapes that are inside a component copy, but are - ;; not the root. In this case, they must not be deleted, - ;; but hidden (to be able to recover them more easily). - ;; Unless we are doing a component swap, in which case we want - ;; to delete the old shape - (let [shape (get objects shape-id)] - (and (ctn/has-any-copy-parent? objects shape) - (not (:component-swap options))))) - - [ids-to-delete ids-to-hide] - (if components-v2 - (loop [ids-seq (seq ids) - ids-to-delete [] - ids-to-hide []] - (let [id (first ids-seq)] - (if (nil? id) - [ids-to-delete ids-to-hide] - (if (in-component-copy? id) - (recur (rest ids-seq) - ids-to-delete - (conj ids-to-hide id)) - (recur (rest ids-seq) - (conj ids-to-delete id) - ids-to-hide))))) - [ids []]) undo-id (or (:undo-id options) (js/Symbol)) - [changes all-parents] (-> (pcb/empty-changes it (:id page)) - (cflh/generate-delete-shapes file page objects ids-to-delete {:components-v2 components-v2 - :ignore-touched (:component-swap options) - :undo-group (:undo-group options) - :undo-id undo-id}))] + [all-parents changes] (-> (pcb/empty-changes it (:id page)) + (cflh/generate-delete-shapes file page objects ids {:components-v2 components-v2 + :ignore-touched (:component-swap options) + :undo-group (:undo-group options) + :undo-id undo-id}))] (rx/of (dwu/start-undo-transaction undo-id) - (update-shape-flags ids-to-hide {:hidden true :undo-group (:undo-group options)}) (dc/detach-comment-thread ids) (dch/commit-changes changes) (ptk/data-event :layout/update {:ids all-parents :undo-group (:undo-group options)}) -- Gitee From 37e68249aa524b7b12112df31fb3344c8bc287a8 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Tue, 23 Apr 2024 19:07:16 +0200 Subject: [PATCH 0401/1266] :recycle: Components refactor: remove it usage on libraries_helpers --- backend/src/app/features/components_v2.clj | 7 ++- .../src/app/common/files/changes_builder.cljc | 5 +++ .../app/common/files/libraries_helpers.cljc | 43 ++++++++++--------- .../src/app/main/data/workspace/groups.cljs | 9 ++-- .../app/main/data/workspace/libraries.cljs | 14 +++--- .../app/main/data/workspace/selection.cljs | 4 +- .../test/frontend_tests/helpers/pages.cljs | 2 +- 7 files changed, 45 insertions(+), 39 deletions(-) diff --git a/backend/src/app/features/components_v2.clj b/backend/src/app/features/components_v2.clj index 05cd1a084..452b83bc5 100644 --- a/backend/src/app/features/components_v2.clj +++ b/backend/src/app/features/components_v2.clj @@ -1450,16 +1450,15 @@ page (cons shape children)) - [_ _ changes2] - (cflh/generate-add-component nil + [_ _ changes] + (cflh/generate-add-component changes [shape] (:objects page) (:id page) file-id true nil - cfsh/prepare-create-artboard-from-selection) - changes (fcb/concat-changes changes changes2)] + cfsh/prepare-create-artboard-from-selection)] (shape-cb shape) (:redo-changes changes))) diff --git a/common/src/app/common/files/changes_builder.cljc b/common/src/app/common/files/changes_builder.cljc index b0ab2b5bd..7d693c370 100644 --- a/common/src/app/common/files/changes_builder.cljc +++ b/common/src/app/common/files/changes_builder.cljc @@ -69,6 +69,11 @@ ::page page ::page-id (:id page))) +(defn with-page-id + [changes page-id] + (vary-meta changes assoc + ::page-id page-id)) + (defn with-container [changes container] (if (cfh/page? container) diff --git a/common/src/app/common/files/libraries_helpers.cljc b/common/src/app/common/files/libraries_helpers.cljc index 8c195e7f7..77ffcbe87 100644 --- a/common/src/app/common/files/libraries_helpers.cljc +++ b/common/src/app/common/files/libraries_helpers.cljc @@ -338,7 +338,7 @@ If an asset id is given, only shapes linked to this particular asset will be synchronized." - [it file-id asset-type asset-id library-id libraries current-file-id] + [changes file-id asset-type asset-id library-id libraries current-file-id] (s/assert #{:colors :components :typographies} asset-type) (s/assert (s/nilable ::us/uuid) asset-id) (s/assert ::us/uuid file-id) @@ -353,13 +353,13 @@ (let [file (get-in libraries [file-id :data]) components-v2 (get-in file [:options :components-v2])] (loop [containers (ctf/object-containers-seq file) - changes (pcb/empty-changes it)] + changes changes] (if-let [container (first containers)] (do (recur (next containers) - (pcb/concat-changes + (pcb/concat-changes ;;TODO Remove concat changes changes - (generate-sync-container it + (generate-sync-container (pcb/empty-changes nil) asset-type asset-id library-id @@ -376,7 +376,7 @@ If an asset id is given, only shapes linked to this particular asset will be synchronized." - [it file-id asset-type asset-id library-id libraries current-file-id] + [changes file-id asset-type asset-id library-id libraries current-file-id] (s/assert #{:colors :components :typographies} asset-type) (s/assert (s/nilable ::us/uuid) asset-id) (s/assert ::us/uuid file-id) @@ -391,25 +391,25 @@ (let [file (get-in libraries [file-id :data]) components-v2 (get-in file [:options :components-v2])] (loop [local-components (ctkl/components-seq file) - changes (pcb/empty-changes it)] + changes changes] (if-let [local-component (first local-components)] (recur (next local-components) - (pcb/concat-changes + (pcb/concat-changes ;;TODO Remove concat changes changes - (generate-sync-container it - asset-type - asset-id - library-id - (cfh/make-container local-component :component) - components-v2 - libraries - current-file-id))) + (generate-sync-container (pcb/empty-changes nil) + asset-type + asset-id + library-id + (cfh/make-container local-component :component) + components-v2 + libraries + current-file-id))) changes)))) (defn- generate-sync-container "Generate changes to synchronize all shapes in a particular container (a page or a component) that use assets of the given type in the given library." - [it asset-type asset-id library-id container components-v2 libraries current-file-id] + [changes asset-type asset-id library-id container components-v2 libraries current-file-id] (if (cfh/page? container) (log/debug :msg "Sync page in local file" :page-id (:id container)) @@ -418,7 +418,7 @@ (let [linked-shapes (->> (vals (:objects container)) (filter #(uses-assets? asset-type asset-id % library-id)))] (loop [shapes (seq linked-shapes) - changes (-> (pcb/empty-changes it) + changes (-> changes (pcb/with-container container) (pcb/with-objects (:objects container)))] (if-let [shape (first shapes)] @@ -1727,9 +1727,9 @@ "If there is exactly one id, and it's a frame (or a group in v1), and not already a component, use it as root. Otherwise, create a frame (v2) or group (v1) that contains all ids. Then, make a component with it, and link all shapes to their corresponding one in the component." - [it shapes objects page-id file-id components-v2 prepare-create-group prepare-create-board] + [changes shapes objects page-id file-id components-v2 prepare-create-group prepare-create-board] - (let [changes (pcb/empty-changes it page-id) + (let [changes (pcb/with-page-id changes page-id) shapes-count (count shapes) first-shape (first shapes) @@ -1744,7 +1744,8 @@ (cfh/frame-shape? first-shape)) (not (ctk/instance-head? first-shape))) [first-shape - (-> (pcb/empty-changes it page-id) + (-> changes + (pcb/with-page-id page-id) (pcb/with-objects objects)) (:shapes first-shape)] @@ -1756,7 +1757,7 @@ [root changes] (if-not components-v2 - (prepare-create-group it ; These functions needs to be passed as argument + (prepare-create-group changes ; These functions needs to be passed as argument objects ; to avoid a circular dependence page-id shapes diff --git a/frontend/src/app/main/data/workspace/groups.cljs b/frontend/src/app/main/data/workspace/groups.cljs index c3a403269..39ab2481b 100644 --- a/frontend/src/app/main/data/workspace/groups.cljs +++ b/frontend/src/app/main/data/workspace/groups.cljs @@ -68,7 +68,7 @@ result))))))) (defn prepare-create-group - [it objects page-id shapes base-name keep-name?] + [changes objects page-id shapes base-name keep-name?] (let [frame-id (:frame-id (first shapes)) parent-id (:parent-id (first shapes)) gname (if (and keep-name? @@ -114,7 +114,8 @@ (filter (partial ctl/grid-layout? objects))) shapes) - changes (-> (pcb/empty-changes it page-id) + changes (-> changes + (pcb/with-page-id page-id) (pcb/with-objects objects) (pcb/add-object group {:index group-idx}) (pcb/update-shapes (map :id shapes) ctl/remove-layout-item-data) @@ -191,7 +192,7 @@ parents (into #{} (map :parent-id) shapes)] (when-not (empty? shapes) (let [[group changes] - (prepare-create-group it objects page-id shapes "Group" false)] + (prepare-create-group (pcb/empty-changes it) objects page-id shapes "Group" false)] (rx/of (dch/commit-changes changes) (dws/select-shapes (d/ordered-set (:id group))) (ptk/data-event :layout/update {:ids parents})))))))) @@ -267,7 +268,7 @@ (= (:type (first shapes)) :group)) [first-shape (-> (pcb/empty-changes it page-id) (pcb/with-objects objects))] - (prepare-create-group it objects page-id shapes "Mask" true)) + (prepare-create-group (pcb/empty-changes it) objects page-id shapes "Mask" true)) changes (-> changes (pcb/update-shapes (:shapes group) diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index c3981cf1d..ad2e37a7d 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -351,7 +351,7 @@ parents (into #{} (map :parent-id) shapes)] (when-not (empty? shapes) (let [[root _ changes] - (cflh/generate-add-component it shapes objects page-id file-id components-v2 + (cflh/generate-add-component (pcb/empty-changes it) shapes objects page-id file-id components-v2 dwg/prepare-create-group cfsh/prepare-create-artboard-from-selection)] (when-not (empty? (:redo-changes changes)) @@ -1024,22 +1024,22 @@ (-> (pcb/empty-changes it) (pcb/set-undo-group undo-group)) [(when sync-components? - (cflh/generate-sync-library it file-id :components asset-id library-id libraries current-file-id)) + (cflh/generate-sync-library (pcb/empty-changes it) file-id :components asset-id library-id libraries current-file-id)) (when sync-colors? - (cflh/generate-sync-library it file-id :colors asset-id library-id libraries current-file-id)) + (cflh/generate-sync-library (pcb/empty-changes it) file-id :colors asset-id library-id libraries current-file-id)) (when sync-typographies? - (cflh/generate-sync-library it file-id :typographies asset-id library-id libraries current-file-id))]) + (cflh/generate-sync-library (pcb/empty-changes it) file-id :typographies asset-id library-id libraries current-file-id))]) file-changes (reduce pcb/concat-changes (-> (pcb/empty-changes it) (pcb/set-undo-group undo-group)) [(when sync-components? - (cflh/generate-sync-file it file-id :components asset-id library-id libraries current-file-id)) + (cflh/generate-sync-file (pcb/empty-changes it) file-id :components asset-id library-id libraries current-file-id)) (when sync-colors? - (cflh/generate-sync-file it file-id :colors asset-id library-id libraries current-file-id)) + (cflh/generate-sync-file (pcb/empty-changes it) file-id :colors asset-id library-id libraries current-file-id)) (when sync-typographies? - (cflh/generate-sync-file it file-id :typographies asset-id library-id libraries current-file-id))]) + (cflh/generate-sync-file (pcb/empty-changes it) file-id :typographies asset-id library-id libraries current-file-id))]) changes (pcb/concat-changes library-changes file-changes) diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index 8461da54e..d13921687 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -422,7 +422,7 @@ (prepare-duplicate-guides shapes page ids-map delta))))) (defn- prepare-duplicate-component-change - [changes objects page component-root parent-id frame-id delta libraries library-data it] + [changes objects page component-root parent-id frame-id delta libraries library-data] (let [component-id (:component-id component-root) file-id (:component-file component-root) main-component (ctf/get-component libraries file-id component-id) @@ -467,7 +467,7 @@ changes (ctf/is-main-of-known-component? obj libraries) - (prepare-duplicate-component-change changes objects page obj parent-id frame-id delta libraries library-data it) + (prepare-duplicate-component-change changes objects page obj parent-id frame-id delta libraries library-data) :else (let [frame? (cfh/frame-shape? obj) diff --git a/frontend/test/frontend_tests/helpers/pages.cljs b/frontend/test/frontend_tests/helpers/pages.cljs index cb5a080cc..e650c3d28 100644 --- a/frontend/test/frontend_tests/helpers/pages.cljs +++ b/frontend/test/frontend_tests/helpers/pages.cljs @@ -132,7 +132,7 @@ shapes (dwg/shapes-for-grouping objects shape-ids) [group component-id changes] - (cflh/generate-add-component nil + (cflh/generate-add-component (pcb/empty-changes nil) shapes (:objects page) (:id page) -- Gitee From f3220fa98544915409b4ed00d4038a8c90eabfff Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 25 Apr 2024 08:08:29 +0200 Subject: [PATCH 0402/1266] :recycle: Components refactor: generator for sync head --- common/src/app/common/files/libraries_helpers.cljc | 9 +++++++++ frontend/src/app/main/data/workspace/libraries.cljs | 4 +--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/common/src/app/common/files/libraries_helpers.cljc b/common/src/app/common/files/libraries_helpers.cljc index 77ffcbe87..b7f9bdc87 100644 --- a/common/src/app/common/files/libraries_helpers.cljc +++ b/common/src/app/common/files/libraries_helpers.cljc @@ -2046,3 +2046,12 @@ (-> changes (generate-new-shape-for-swap shape file page libraries id-new-component index target-cell keep-props-values))] [new-shape all-parents changes])) + +(defn generate-sync-head + [changes file-full libraries container head components-v2] + (let [changes + (-> changes + (pcb/with-container container) + (pcb/with-objects (:objects container)) + (generate-sync-shape-direct file-full libraries container (:id head) false components-v2))] + changes)) \ No newline at end of file diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index ad2e37a7d..44a58bdd6 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -695,9 +695,7 @@ changes (-> (pcb/empty-changes it) - (pcb/with-container container) - (pcb/with-objects (:objects container)) - (cflh/generate-sync-shape-direct file-full libraries container (:id head) false components-v2))] + (cflh/generate-sync-head file-full libraries container head components-v2))] (log/debug :msg "SYNC-head finished" :js/rchanges (log-changes (:redo-changes changes) -- Gitee From c73eb77125cb10d9dd93dc4f9c4485a256c64d3e Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 25 Apr 2024 09:32:09 +0200 Subject: [PATCH 0403/1266] :recycle: Components refactor: generator for reset component --- .../app/common/files/libraries_helpers.cljc | 27 ++++++++-- .../app/main/data/workspace/libraries.cljs | 52 +++---------------- 2 files changed, 31 insertions(+), 48 deletions(-) diff --git a/common/src/app/common/files/libraries_helpers.cljc b/common/src/app/common/files/libraries_helpers.cljc index b7f9bdc87..afec467c8 100644 --- a/common/src/app/common/files/libraries_helpers.cljc +++ b/common/src/app/common/files/libraries_helpers.cljc @@ -2048,10 +2048,29 @@ [new-shape all-parents changes])) (defn generate-sync-head - [changes file-full libraries container head components-v2] - (let [changes + [changes file-full libraries container id components-v2 reset?] + (let [shape-inst (ctn/get-shape container id) + objects (:objects container) + parent (get objects (:parent-id shape-inst)) + head (ctn/get-component-shape container parent) + changes (-> changes (pcb/with-container container) (pcb/with-objects (:objects container)) - (generate-sync-shape-direct file-full libraries container (:id head) false components-v2))] - changes)) \ No newline at end of file + (generate-sync-shape-direct file-full libraries container (:id head) reset? components-v2))] + changes)) + +(defn generate-reset-component + [changes file-full libraries container id components-v2] + (let [objects (:objects container) + swap-slot (-> (ctn/get-shape container id) + (ctk/get-swap-slot)) + changes + (-> changes + (pcb/with-container container) + (pcb/with-objects objects) + (generate-sync-shape-direct file-full libraries container id true components-v2))] + + (cond-> changes + (some? swap-slot) + (generate-sync-head file-full libraries container id components-v2 true)))) diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index 44a58bdd6..5d218e4d9 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -672,36 +672,6 @@ (rx/take-until stopper-s)))))) -(defn sync-head - [id] - (ptk/reify ::sync-head - ptk/WatchEvent - (watch [it state _] - (log/info :msg "SYNC-head of shape" :id (str id)) - (let [file (wsh/get-local-file state) - file-full (wsh/get-local-file-full state) - libraries (wsh/get-libraries state) - - page-id (:current-page-id state) - container (cfh/get-container file :page page-id) - objects (:objects container) - - shape-inst (ctn/get-shape container id) - parent (get objects (:parent-id shape-inst)) - head (ctn/get-component-shape container parent) - - components-v2 - (features/active-feature? state "components/v2") - - changes - (-> (pcb/empty-changes it) - (cflh/generate-sync-head file-full libraries container head components-v2))] - - (log/debug :msg "SYNC-head finished" :js/rchanges (log-changes - (:redo-changes changes) - file)) - (rx/of (dch/commit-changes changes)))))) - (defn reset-component "Cancels all modifications in the shape with the given id, and all its children, in the current page. Set all attributes equal to the ones in the linked component, @@ -712,35 +682,29 @@ ptk/WatchEvent (watch [it state _] (log/info :msg "RESET-COMPONENT of shape" :id (str id)) - (let [file (wsh/get-local-file state) - file-full (wsh/get-local-file-full state) - libraries (wsh/get-libraries state) + (let [file (wsh/get-local-file state) + file-full (wsh/get-local-file-full state) + libraries (wsh/get-libraries state) - page-id (:current-page-id state) - container (cfh/get-container file :page page-id) + page-id (:current-page-id state) + container (cfh/get-container file :page page-id) components-v2 (features/active-feature? state "components/v2") - swap-slot (-> (ctn/get-shape container id) - (ctk/get-swap-slot)) - - undo-id (js/Symbol) + undo-id (js/Symbol) changes (-> (pcb/empty-changes it) - (pcb/with-container container) - (pcb/with-objects (:objects container)) - (cflh/generate-sync-shape-direct file-full libraries container id true components-v2))] + (cflh/generate-reset-component file-full libraries container id components-v2))] (log/debug :msg "RESET-COMPONENT finished" :js/rchanges (log-changes (:redo-changes changes) file)) + (rx/of (dwu/start-undo-transaction undo-id) (dch/commit-changes changes) - (when (some? swap-slot) - (sync-head id)) (dwu/commit-undo-transaction undo-id)))))) (defn reset-components -- Gitee From a7bfa7c7c8373c18059d38fc8a93b3eaf55c991a Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Wed, 24 Apr 2024 16:38:18 +0200 Subject: [PATCH 0404/1266] :recycle: Components refactor: generator for sync-file --- .../app/common/files/libraries_helpers.cljc | 24 +++++++++++ .../app/main/data/workspace/libraries.cljs | 40 +++++-------------- 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/common/src/app/common/files/libraries_helpers.cljc b/common/src/app/common/files/libraries_helpers.cljc index afec467c8..d700237d2 100644 --- a/common/src/app/common/files/libraries_helpers.cljc +++ b/common/src/app/common/files/libraries_helpers.cljc @@ -2047,6 +2047,30 @@ (generate-new-shape-for-swap shape file page libraries id-new-component index target-cell keep-props-values))] [new-shape all-parents changes])) +(defn generate-sync-file-changes + [changes undo-group asset-type file-id asset-id library-id libraries current-file-id] + (let [sync-components? (or (nil? asset-type) (= asset-type :components)) + sync-colors? (or (nil? asset-type) (= asset-type :colors)) + sync-typographies? (or (nil? asset-type) (= asset-type :typographies))] + (cond-> changes + :always + (pcb/set-undo-group undo-group) + ;; library-changes + sync-components? + (generate-sync-library file-id :components asset-id library-id libraries current-file-id) + sync-colors? + (generate-sync-library file-id :colors asset-id library-id libraries current-file-id) + sync-typographies? + (generate-sync-library file-id :typographies asset-id library-id libraries current-file-id) + + ;; file-changes + sync-components? + (generate-sync-file file-id :components asset-id library-id libraries current-file-id) + sync-colors? + (generate-sync-file file-id :colors asset-id library-id libraries current-file-id) + sync-typographies? + (generate-sync-file file-id :typographies asset-id library-id libraries current-file-id)))) + (defn generate-sync-head [changes file-full libraries container id components-v2 reset?] (let [shape-inst (ctn/get-shape container id) diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index 5d218e4d9..a542301e8 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -976,34 +976,15 @@ libraries (wsh/get-libraries state) current-file-id (:current-file-id state) - - sync-components? (or (nil? asset-type) (= asset-type :components)) - sync-colors? (or (nil? asset-type) (= asset-type :colors)) - sync-typographies? (or (nil? asset-type) (= asset-type :typographies)) - - library-changes (reduce - pcb/concat-changes - (-> (pcb/empty-changes it) - (pcb/set-undo-group undo-group)) - [(when sync-components? - (cflh/generate-sync-library (pcb/empty-changes it) file-id :components asset-id library-id libraries current-file-id)) - (when sync-colors? - (cflh/generate-sync-library (pcb/empty-changes it) file-id :colors asset-id library-id libraries current-file-id)) - (when sync-typographies? - (cflh/generate-sync-library (pcb/empty-changes it) file-id :typographies asset-id library-id libraries current-file-id))]) - - file-changes (reduce - pcb/concat-changes - (-> (pcb/empty-changes it) - (pcb/set-undo-group undo-group)) - [(when sync-components? - (cflh/generate-sync-file (pcb/empty-changes it) file-id :components asset-id library-id libraries current-file-id)) - (when sync-colors? - (cflh/generate-sync-file (pcb/empty-changes it) file-id :colors asset-id library-id libraries current-file-id)) - (when sync-typographies? - (cflh/generate-sync-file (pcb/empty-changes it) file-id :typographies asset-id library-id libraries current-file-id))]) - - changes (pcb/concat-changes library-changes file-changes) + changes (cflh/generate-sync-file-changes + (pcb/empty-changes it) + undo-group + asset-type + file-id + asset-id + library-id + libraries + current-file-id) find-frames (fn [change] (->> (ch/frames-changed file change) @@ -1021,8 +1002,7 @@ (rx/of (set-updating-library false) (msg/hide-tag :sync-dialog)) (when (seq (:redo-changes changes)) - (rx/of (dch/commit-changes (assoc changes ;; TODO a ver qué pasa con esto - :file-id file-id)))) + (rx/of (dch/commit-changes changes))) (when-not (empty? updated-frames) (rx/merge (rx/of (ptk/data-event :layout/update {:ids (map :id updated-frames) :undo-group undo-group})) -- Gitee From 4896d3926120bd65abe3587708f0304a4d4345cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Wed, 24 Apr 2024 13:04:10 +0000 Subject: [PATCH 0405/1266] :globe_with_meridians: Add translations for: Turkish. Currently translated at 100.0% (1379 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/ --- frontend/translations/tr.po | 106 +++++++++++++++++++++++++++++++++++- 1 file changed, 103 insertions(+), 3 deletions(-) diff --git a/frontend/translations/tr.po b/frontend/translations/tr.po index 72a7be1c7..4e1fb1eaf 100644 --- a/frontend/translations/tr.po +++ b/frontend/translations/tr.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-24 13:04+0000\n" +"PO-Revision-Date: 2024-04-25 13:07+0000\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" @@ -869,7 +869,6 @@ msgstr "Bağlantı hatası, URL'ye erişilemiyor" msgid "errors.webhooks.invalid-uri" msgstr "URL doğrulamayı geçemiyor." -#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Son iletim başarılı olmadı." @@ -2635,7 +2634,6 @@ msgstr "Tıklamada etkileşimleri göster" msgid "viewer.header.sitemap" msgstr "Site haritası" -#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Son iletim başarılı oldu." @@ -5258,3 +5256,105 @@ msgstr "" #: src/app/main/data/users.cljs msgid "errors.auth-provider-not-allowed" msgstr "Kimlik doğrulama sağlayıcısına bu profil için izin verilmiyor" + +msgid "modals.move-shared-confirm.accept" +msgid_plural "modals.move-shared-confirm.accept" +msgstr[0] "Taşı" +msgstr[1] "Taşı" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-one" +msgstr "Hiçbiri" + +msgid "shortcuts.toggle-guides" +msgstr "Kılavuzları göster/gizle" + +msgid "shortcuts.toggle-rulers" +msgstr "Cetvelleri göster/gizle" + +msgid "shortcuts.scale" +msgstr "Ölçeklendir" + +msgid "shortcuts.toggle-snap-guides" +msgstr "Kılavuzlara tuttur" + +msgid "shortcuts.toggle-layout-grid" +msgstr "Izgara düzeni ekle/kaldır" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.filter" +msgstr "Filtrele" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "Sırala" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-ruler-guides" +msgstr "Cetvel kılavuzlarına tuttur" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-guides" +msgstr "Kılavuzları gizle" + +msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" +msgstr "Izgara düzenini bul" + +msgid "workspace.layout_grid.editor.padding.expand" +msgstr "4 taraflı dolgu seçeneklerini göster" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.shared-library-btn" +msgstr "Kütüphaneyi bağla" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.unlink-library-btn" +msgstr "Kütüphanenin bağlantısını kes" + +#: src/app/main/ui/workspace/sidebar/assets/common.cljs +msgid "workspace.assets.sidebar.components" +msgid_plural "workspace.assets.sidebar.components" +msgstr[0] "1 bileşen" +msgstr[1] "%s bileşen" + +msgid "media.image.short" +msgstr "görsel" + +msgid "media.keep-aspect-ratio" +msgstr "En boy oranını koru" + +msgid "modals.move-shared-confirm.message" +msgid_plural "modals.move-shared-confirm.message" +msgstr[0] "Bu kütüphaneyi taşımak istediğinizden emin misiniz?" +msgstr[1] "Bu kütüphaneleri taşımak istediğinizden emin misiniz?" + +msgid "modals.move-shared-confirm.title" +msgid_plural "modals.move-shared-confirm.title" +msgstr[0] "Kütüphaneyi taşı" +msgstr[1] "Kütüphaneleri taşı" + +msgid "onboarding.team-modal.team-definition" +msgstr "Takım nedir?" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs +msgid "settings.select-this-color" +msgstr "Bu biçimi kullanan ögeleri seç" + +msgid "shortcuts.toggle-snap-ruler-guide" +msgstr "Cetvel kılavuzlarına tuttur" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-ruler-guides" +msgstr "Cetvel kılavuzlarına tutturmayı devre dışı bırak" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-guides" +msgstr "Kılavuzları göster" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-grid" +msgstr "Izgara düzenini kaldır" + +#, markdown +msgid "workspace.top-bar.view-only" +msgstr "**Kodu incele** ( Yalnızca Görüntüle)" -- Gitee From 77f61191d1abaa9d0518024a5fefbb794f812633 Mon Sep 17 00:00:00 2001 From: Stas Haas Date: Thu, 25 Apr 2024 08:26:45 +0000 Subject: [PATCH 0406/1266] :globe_with_meridians: Add translations for: German. Currently translated at 99.7% (1376 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/ --- frontend/translations/de.po | 117 ++++++++++++++++++++++++++++++++++-- 1 file changed, 112 insertions(+), 5 deletions(-) diff --git a/frontend/translations/de.po b/frontend/translations/de.po index 102037b64..8a7edcbb2 100644 --- a/frontend/translations/de.po +++ b/frontend/translations/de.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-24 12:55+0000\n" -"Last-Translator: Anonymous \n" +"PO-Revision-Date: 2024-04-25 13:07+0000\n" +"Last-Translator: Stas Haas \n" "Language-Team: German \n" "Language: de\n" @@ -1003,7 +1003,6 @@ msgstr "Verbindungsfehler, URL ist nicht erreichbar" msgid "errors.webhooks.invalid-uri" msgstr "Die URL erfüllt nicht die Validierungskriterien." -#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Die letzte Übertragung war nicht erfolgreich." @@ -1716,7 +1715,7 @@ msgid "labels.uploading" msgstr "Hochladen…" msgid "labels.view-only" -msgstr "NUR ANSEHEN" +msgstr "Nur ansehen" #: src/app/main/ui/dashboard/team.cljs msgid "labels.viewer" @@ -2950,7 +2949,6 @@ msgstr "Interaktionen beim Klicken anzeigen" msgid "viewer.header.sitemap" msgstr "Sitemap" -#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Die letzte Übertragung war erfolgreich." @@ -5223,3 +5221,112 @@ msgstr "" msgid "workspace.context-menu.grid-track.column.add-after" msgstr "1 Spalte rechts einfügen" + +msgid "modals.move-shared-confirm.title" +msgid_plural "modals.move-shared-confirm.title" +msgstr[0] "Bibliothek verschieben" +msgstr[1] "Bibliotheken verschieben" + +msgid "modals.move-shared-confirm.accept" +msgid_plural "modals.move-shared-confirm.accept" +msgstr[0] "Verschieben" +msgstr[1] "Verschieben" + +msgid "shortcuts.toggle-guides" +msgstr "Hilfslinien anzeigen / ausblenden" + +msgid "shortcuts.scale" +msgstr "Skalieren" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.filter" +msgstr "Filtern" + +#: src/app/main/ui/workspace/sidebar/assets/common.cljs +msgid "workspace.assets.sidebar.components" +msgid_plural "workspace.assets.sidebar.components" +msgstr[0] "1 Komponente" +msgstr[1] "% Komponenten" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.unlink-library-btn" +msgstr "Bibliothek trennen" + +msgid "media.keep-aspect-ratio" +msgstr "Seitenverhältnis beibehalten" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "In mein Konto einloggen" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-tagline" +msgstr "" +"Penpot ist das kostenlose Open-Source-Design-Tool für die Zusammenarbeit von " +"Design und Code" + +msgid "modals.move-shared-confirm.message" +msgid_plural "modals.move-shared-confirm.message" +msgstr[0] "Sind Sie sicher, dass Sie diese Bibliothek verschieben wollen?" +msgstr[1] "Sind Sie sicher, dass Sie diese Bibliotheken verschieben wollen?" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs +msgid "settings.select-this-color" +msgstr "Elemente mit diesem Stil auswählen" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-grid" +msgstr "Grid-Layout entfernen" + +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "Auth-Provider für dieses Profil nicht erlaubt" + +msgid "onboarding.team-modal.team-definition" +msgstr "Was ist ein Team?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-one" +msgstr "Keine" + +msgid "shortcuts.toggle-rulers" +msgstr "Lineale anzeigen / ausblenden" + +msgid "shortcuts.toggle-snap-guides" +msgstr "An Hilfslinien ausrichten" + +msgid "shortcuts.toggle-layout-grid" +msgstr "Grid-Layout hinzufügen/entfernen" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "Sortieren" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-guides" +msgstr "Hilfslinien ausblenden" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-guides" +msgstr "Hilfslinien anzeigen" + +msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" +msgstr "Grid-Layout lokalisieren" + +msgid "workspace.layout_grid.editor.padding.expand" +msgstr "4-seitige Abstandsoptionen anzeigen" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.shared-library-btn" +msgstr "Bibliothek verknüpfen" + +#, markdown +msgid "workspace.top-bar.view-only" +msgstr "**Code inspizieren** (nur ansehen)" + +msgid "media.image.short" +msgstr "img" + +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "Domain nicht zulässig" -- Gitee From ca7bd20c332c2a17d84404d7e243ec7a76785b74 Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Thu, 25 Apr 2024 07:03:12 +0000 Subject: [PATCH 0407/1266] :globe_with_meridians: Add translations for: Hebrew. Currently translated at 98.9% (1364 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/ --- frontend/translations/he.po | 65 ++++++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/frontend/translations/he.po b/frontend/translations/he.po index dadbc4235..22d195f88 100644 --- a/frontend/translations/he.po +++ b/frontend/translations/he.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-24 13:04+0000\n" +"PO-Revision-Date: 2024-04-25 13:07+0000\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew \n" @@ -5143,3 +5143,66 @@ msgstr "יצירת שטח" msgid "workspace.context-menu.grid-cells.create-board" msgstr "יצירת לוח" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "כניסה לחשבון שלי" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-tagline" +msgstr "Penpot הוא כלי בקוד פתוח לשיתוף עיצוב וקוד" + +msgid "modals.move-shared-confirm.message" +msgid_plural "modals.move-shared-confirm.message" +msgstr[0] "להעביר את הספרייה הזאת?" +msgstr[1] "להעביר את הספריות האלו?" +msgstr[2] "להעביר את הספריות האלו?" +msgstr[3] "להעביר את הספריות האלו?" + +msgid "onboarding.team-modal.team-definition" +msgstr "מה זה צוות?" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs +msgid "settings.select-this-color" +msgstr "בחירת פריטים שמשתמשים בסגנון הזה" + +msgid "shortcuts.toggle-guides" +msgstr "הצגת / הסתרת קווים מנחים" + +msgid "shortcuts.scale" +msgstr "התאמת גודל" + +msgid "shortcuts.toggle-layout-grid" +msgstr "הוספת/הסרת פריסת רשת" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "מיון" + +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "ספק האימות לא מורשה לפרופיל הזה" + +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "שם התחום לא מורשה" + +msgid "modals.move-shared-confirm.title" +msgid_plural "modals.move-shared-confirm.title" +msgstr[0] "העברת ספרייה" +msgstr[1] "העברת ספריות" +msgstr[2] "העברת ספריות" +msgstr[3] "העברת ספריות" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-one" +msgstr "אין" + +msgid "shortcuts.toggle-rulers" +msgstr "הצגת / הסתרת סרגלים" + +msgid "shortcuts.toggle-snap-guides" +msgstr "הצמדה לקווים מנחים" + +msgid "shortcuts.toggle-snap-ruler-guide" +msgstr "הצמדה לקווים מנחים סרגלים" -- Gitee From e4178a66d69c46bd983aaf402f8ab2ff16e00e98 Mon Sep 17 00:00:00 2001 From: Edgars Andersons Date: Thu, 25 Apr 2024 06:26:12 +0000 Subject: [PATCH 0408/1266] :globe_with_meridians: Add translations for: Latvian. Currently translated at 100.0% (1379 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/ --- frontend/translations/lv.po | 129 ++++++++++++++++++++++++++++++++++-- 1 file changed, 125 insertions(+), 4 deletions(-) diff --git a/frontend/translations/lv.po b/frontend/translations/lv.po index ba3bb167f..98a5e8958 100644 --- a/frontend/translations/lv.po +++ b/frontend/translations/lv.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-24 12:55+0000\n" -"Last-Translator: Anonymous \n" +"PO-Revision-Date: 2024-04-25 13:07+0000\n" +"Last-Translator: Edgars Andersons \n" "Language-Team: Latvian \n" "Language: lv\n" @@ -989,7 +989,6 @@ msgstr "Savienojuma kļūda, URL nav sasniedzams" msgid "errors.webhooks.invalid-uri" msgstr "URL neiztur pārbaudi." -#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Pēdējā piegāde nebija veiksmīga." @@ -3069,7 +3068,6 @@ msgstr "Rādīt mijiedarbības pēc klikšķa" msgid "viewer.header.sitemap" msgstr "Vietnes karte" -#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Pēdējā piegāde bija veiksmīga." @@ -5204,3 +5202,126 @@ msgstr "" #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.loading" msgstr "Ielādē…" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "Pieteikties manā kontā" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-tagline" +msgstr "" +"Penpot ir bezmaksas atvērtā pirmkoda dizaina rīks dizaina un koda sadarbībai" + +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "Autentifikācijas nodrošinātājs nav atļauts šim profilam" + +msgid "shortcuts.toggle-rulers" +msgstr "Rādīt/paslēpt mērjoslas" + +msgid "shortcuts.toggle-snap-guides" +msgstr "Pievilkt pie vadlīnijām" + +msgid "shortcuts.toggle-guides" +msgstr "Rādīt/paslēpt vadlīnijas" + +msgid "shortcuts.toggle-snap-ruler-guide" +msgstr "Pievilkt pie mērjoslu vadlīnijām" + +msgid "shortcuts.toggle-layout-grid" +msgstr "Pievienot/noņemt režģa izkārtojumu" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-ruler-guides" +msgstr "Atspējot pievilkšanu mērjoslu vadlīnijām" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-ruler-guides" +msgstr "Pievilkt pie mērjoslu vadlīnijām" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-guides" +msgstr "Parādīt vadlīnijas" + +msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" +msgstr "Norādīt režģa izkārtojumu" + +msgid "workspace.layout_grid.editor.padding.expand" +msgstr "Rādīt četrpusējas atbīdes iespējas" + +#, markdown +msgid "workspace.top-bar.view-only" +msgstr "**Apskata kodu** (tikai skatīšana)" + +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "Domēns nav atļauts" + +msgid "modals.move-shared-confirm.accept" +msgid_plural "modals.move-shared-confirm.accept" +msgstr[0] "Pārvietot" +msgstr[1] "Pārvietot" +msgstr[2] "Pārvietot" + +msgid "modals.move-shared-confirm.message" +msgid_plural "modals.move-shared-confirm.message" +msgstr[0] "Vai tiešām pārvietot šīs bibliotēkas?" +msgstr[1] "Vai tiešām pārvietot šīs bibliotēkas?" +msgstr[2] "Vai tiešām pārvietot šīs bibliotēkas?" + +msgid "modals.move-shared-confirm.title" +msgid_plural "modals.move-shared-confirm.title" +msgstr[0] "Pārvietot bibliotēkas" +msgstr[1] "Pārvietot bibliotēkas" +msgstr[2] "Pārvietot bibliotēkas" + +msgid "onboarding.team-modal.team-definition" +msgstr "Kas ir komanda?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-one" +msgstr "Neviens" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs +msgid "settings.select-this-color" +msgstr "Atlasīt vienumus, kas izmanto šo stilu" + +msgid "shortcuts.scale" +msgstr "Mērogot" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.filter" +msgstr "Atlasīt" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "Kārtot" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-guides" +msgstr "Paslēpt vadlīnijas" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.shared-library-btn" +msgstr "Savienot bibliotēku" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.unlink-library-btn" +msgstr "Atvienot bibliotēku" + +#: src/app/main/ui/workspace/sidebar/assets/common.cljs +msgid "workspace.assets.sidebar.components" +msgid_plural "workspace.assets.sidebar.components" +msgstr[0] "%s sastāvdaļu" +msgstr[1] "%s sastāvdaļa" +msgstr[2] "%s sastāvdaļas" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-grid" +msgstr "Noņemt režģa izkārtojumu" + +msgid "media.image.short" +msgstr "att." + +msgid "media.keep-aspect-ratio" +msgstr "Paturēt samēru" -- Gitee From 8abc2261a6e77ac17c7d70f888165a2412551288 Mon Sep 17 00:00:00 2001 From: Stephan Paternotte Date: Wed, 24 Apr 2024 14:32:02 +0000 Subject: [PATCH 0409/1266] :globe_with_meridians: Add translations for: Dutch. Currently translated at 100.0% (1379 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/ --- frontend/translations/nl.po | 132 +++++++++++++++++++++++++++++++++--- 1 file changed, 124 insertions(+), 8 deletions(-) diff --git a/frontend/translations/nl.po b/frontend/translations/nl.po index bfbd1bdab..cac2e8663 100644 --- a/frontend/translations/nl.po +++ b/frontend/translations/nl.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-24 12:55+0000\n" -"Last-Translator: Anonymous \n" +"PO-Revision-Date: 2024-04-25 13:07+0000\n" +"Last-Translator: Stephan Paternotte \n" "Language-Team: Dutch \n" "Language: nl\n" @@ -1012,9 +1012,8 @@ msgstr "Verbindingsfout, URL niet bereikbaar" msgid "errors.webhooks.invalid-uri" msgstr "URL komt niet door de validatie." -#, fuzzy msgid "errors.webhooks.last-delivery" -msgstr "Laatste levering is niet gelukt." +msgstr "Laatste levering was niet succesvol." msgid "errors.webhooks.ssl-validation" msgstr "Fout bij SSL-validatie." @@ -1069,7 +1068,6 @@ msgid "feedback.title" msgstr "E-mail" #: src/app/main/ui/settings/feedback.cljs -#, fuzzy msgid "feedback.twitter-go-to" msgstr "Ga naar X" @@ -1078,7 +1076,6 @@ msgid "feedback.twitter-subtitle1" msgstr "Hier om te helpen met je technische vragen." #: src/app/main/ui/settings/feedback.cljs -#, fuzzy msgid "feedback.twitter-title" msgstr "X-ondersteuningsaccount" @@ -1124,7 +1121,7 @@ msgstr "Breedte" #: src/app/main/ui/inspect/attributes/layout.cljs msgid "inspect.attributes.layout" -msgstr "Lay-out" +msgstr "Layout" #: src/app/main/ui/inspect/attributes/layout.cljs msgid "inspect.attributes.layout.height" @@ -3134,7 +3131,6 @@ msgstr "Interacties tonen bij aanklikken" msgid "viewer.header.sitemap" msgstr "Sitemap" -#, fuzzy msgid "webhooks.last-delivery.success" msgstr "De laatste levering was succesvol." @@ -5218,3 +5214,123 @@ msgstr "Donker thema inschakelen" msgid "workspace.context-menu.grid-track.column.duplicate" msgstr "Kolom dupliceren" + +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "Domein niet toegestaan" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-one" +msgstr "Geen" + +msgid "shortcuts.toggle-snap-guides" +msgstr "Uitlijnen op hulpijnen" + +msgid "shortcuts.scale" +msgstr "Schaal" + +msgid "shortcuts.toggle-layout-grid" +msgstr "Raster-layout toevoegen/verwijderen" + +msgid "shortcuts.toggle-rulers" +msgstr "Linialen tonen/verbergen" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.filter" +msgstr "Filteren" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "Sorteren" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-ruler-guides" +msgstr "Uitlijnen op liniaal-hulplijnen" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.unlink-library-btn" +msgstr "Bibliotheekverbinding verbreken" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "Log in op mijn account" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-ruler-guides" +msgstr "Uitlijnen op liniaal-hulplijnen deactiveren" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-guides" +msgstr "Hulplijnen weergeven" + +msgid "workspace.layout_grid.editor.padding.expand" +msgstr "4-zijdige opvulopties weergeven" + +#, markdown +msgid "workspace.top-bar.view-only" +msgstr "**Code inspecteren** (alleen weergave)" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-tagline" +msgstr "" +"Penpot is de gratis open-source ontwerptool voor samenwerking op het gebied " +"van ontwerp en code" + +msgid "modals.move-shared-confirm.accept" +msgid_plural "modals.move-shared-confirm.accept" +msgstr[0] "Verplaatsen" +msgstr[1] "Verplaatsen" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-guides" +msgstr "Hulplijnen verbergen" + +msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" +msgstr "Raster-layout tonen" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.shared-library-btn" +msgstr "Bibliotheek verbinden" + +msgid "media.image.short" +msgstr "img" + +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "Auth-provider is niet toegestaan voor dit profiel" + +msgid "modals.move-shared-confirm.message" +msgid_plural "modals.move-shared-confirm.message" +msgstr[0] "Weet je zeker dat je deze bibliotheek wilt verplaatsen?" +msgstr[1] "Weet je zeker dat je deze bibliotheken wilt verplaatsen?" + +#: src/app/main/ui/workspace/sidebar/assets/common.cljs +msgid "workspace.assets.sidebar.components" +msgid_plural "workspace.assets.sidebar.components" +msgstr[0] "1 component" +msgstr[1] "%s componenten" + +msgid "modals.move-shared-confirm.title" +msgid_plural "modals.move-shared-confirm.title" +msgstr[0] "Bibliotheek verplaatsen" +msgstr[1] "Bibliotheken verplaatsen" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-grid" +msgstr "Raster-layout verwijderen" + +msgid "onboarding.team-modal.team-definition" +msgstr "Wat is een team?" + +msgid "media.keep-aspect-ratio" +msgstr "Verhoudingen behouden" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs +msgid "settings.select-this-color" +msgstr "Selecteer items in deze stijl" + +msgid "shortcuts.toggle-guides" +msgstr "Hulplijnen tonen/verbergen" + +msgid "shortcuts.toggle-snap-ruler-guide" +msgstr "Uitlijnen op liniaal-hulplijnen" -- Gitee From a8363f0c021a70a639bfeb3a8ba29e1d0fa640f0 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 25 Apr 2024 15:35:53 +0200 Subject: [PATCH 0410/1266] :bug: Fix problem with exporter texts --- frontend/src/app/main/ui/shapes/export.cljs | 6 +++++- frontend/src/app/main/ui/shapes/shape.cljs | 7 +++++++ frontend/src/app/worker/import/parser.cljs | 20 ++++++++++++++++---- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/frontend/src/app/main/ui/shapes/export.cljs b/frontend/src/app/main/ui/shapes/export.cljs index d10378e19..8ac2387e8 100644 --- a/frontend/src/app/main/ui/shapes/export.cljs +++ b/frontend/src/app/main/ui/shapes/export.cljs @@ -122,7 +122,11 @@ (add! :stroke-cap-end))) (cond-> text? - (-> (add! :grow-type) + (-> (add! :x) + (add! :y) + (add! :width) + (add! :height) + (add! :grow-type) (add! :content (comp json/encode uuid->string)) (add! :position-data (comp json/encode uuid->string)))) diff --git a/frontend/src/app/main/ui/shapes/shape.cljs b/frontend/src/app/main/ui/shapes/shape.cljs index cbda63671..e0ab37c45 100644 --- a/frontend/src/app/main/ui/shapes/shape.cljs +++ b/frontend/src/app/main/ui/shapes/shape.cljs @@ -94,6 +94,13 @@ (obj/unset! "disable-shadows?") (obj/set! "ref" ref) (obj/set! "id" (dm/fmt "shape-%" shape-id)) + + ;; TODO: This is added for backward compatibility. + (cond-> (and (cfh/text-shape? shape) (empty? (:position-data shape))) + (-> (obj/set! "x" (:x shape)) + (obj/set! "y" (:y shape)) + (obj/set! "width" (:width shape)) + (obj/set! "height" (:height shape)))) (obj/set! "style" styles)) wrapper-props diff --git a/frontend/src/app/worker/import/parser.cljs b/frontend/src/app/worker/import/parser.cljs index a0da1e60d..fab4075ca 100644 --- a/frontend/src/app/worker/import/parser.cljs +++ b/frontend/src/app/worker/import/parser.cljs @@ -272,9 +272,21 @@ (def has-position? #{:frame :rect :image :text}) (defn parse-position - [props svg-data] - (let [values (->> (select-keys svg-data [:x :y :width :height]) - (d/mapm (fn [_ val] (d/parse-double val))))] + [props node svg-data] + (let [x (get-meta node :x d/parse-double) + y (get-meta node :y d/parse-double) + width (get-meta node :width d/parse-double) + height (get-meta node :height d/parse-double) + + values (->> (select-keys svg-data [:x :y :width :height]) + (d/mapm (fn [_ val] (d/parse-double val)))) + + values + (cond-> values + (some? x) (assoc :x x) + (some? y) (assoc :y y) + (some? width) (assoc :width width) + (some? height) (assoc :height height))] (d/merge props values))) (defn parse-circle @@ -392,7 +404,7 @@ center (gpt/point center-x center-y)] (cond-> props (has-position? type) - (parse-position svg-data) + (parse-position node svg-data) (= type :svg-raw) (add-svg-position node) -- Gitee From a65282c01b7ede81e9f6dce200a0adfcaf96f7e7 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Fri, 26 Apr 2024 06:30:00 +0200 Subject: [PATCH 0411/1266] :bug: Fix update-temp-file audit_log stored data --- backend/src/app/rpc/commands/files_temp.clj | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/backend/src/app/rpc/commands/files_temp.clj b/backend/src/app/rpc/commands/files_temp.clj index bc183cfd9..4eef26214 100644 --- a/backend/src/app/rpc/commands/files_temp.clj +++ b/backend/src/app/rpc/commands/files_temp.clj @@ -16,6 +16,7 @@ [app.db.sql :as sql] [app.features.components-v2 :as feat.compv2] [app.features.fdata :as fdata] + [app.loggers.audit :as audit] [app.rpc :as-alias rpc] [app.rpc.commands.files :as files] [app.rpc.commands.files-create :as files.create] @@ -23,6 +24,7 @@ [app.rpc.commands.projects :as projects] [app.rpc.commands.teams :as teams] [app.rpc.doc :as-alias doc] + [app.rpc.helpers :as rph] [app.util.blob :as blob] [app.util.pointer-map :as pmap] [app.util.services :as sv] @@ -100,7 +102,9 @@ :revn revn :data nil :changes (blob/encode changes)}) - nil))) + (rph/with-meta (rph/wrap nil) + {::audit/replace-props {:file-id id + :revn revn}})))) ;; --- MUTATION COMMAND: persist-temp-file -- Gitee From 007bd86f09c6b52285856cbc13c6288c80e0191c Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Fri, 26 Apr 2024 04:37:34 +0000 Subject: [PATCH 0412/1266] :globe_with_meridians: Add translations for: Spanish. Currently translated at 99.8% (1377 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/ --- frontend/translations/es.po | 43 +++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/frontend/translations/es.po b/frontend/translations/es.po index ecb5c7f77..979dfa38a 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-24 12:55+0000\n" -"Last-Translator: Anonymous \n" +"PO-Revision-Date: 2024-04-26 04:53+0000\n" +"Last-Translator: Alejandro Alonso \n" "Language-Team: Spanish \n" "Language: es\n" @@ -5258,3 +5258,42 @@ msgstr "Crear area" msgid "workspace.context-menu.grid-cells.create-board" msgstr "Crear tablero" + +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "Una nueva versión está disponible, por favor actualiza la página" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Tu biblioteca está vacía. Una vez que se agregue como Biblioteca Compartida, " +"los recursos que crees estarán disponibles para ser utilizados entre el " +"resto de tus archivos. ¿Estás seguro de que deseas publicarlo?" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Cargando…" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-guides" +msgstr "Mostrar guías" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "El fichero tiene un número de versión incompatible" + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Detectada funcionalidad incompatible '%s'" + +msgid "errors.validation" +msgstr "Error de validación" + +msgid "errors.paste-data-validation" +msgstr "Datos inválidos en el portapapeles" + +msgid "labels.discard" +msgstr "Descartar" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "ver todos los cambios" -- Gitee From 15debe65fd8584b61b657414eb30bb5fd70792db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Fri, 9 Feb 2024 16:33:44 +0000 Subject: [PATCH 0413/1266] :sparkles: Update translations --- frontend/translations/ar.po | 13 ++-- frontend/translations/bn.po | 4 - frontend/translations/ca.po | 7 -- frontend/translations/cs.po | 15 ++-- frontend/translations/da.po | 4 - frontend/translations/de.po | 116 ++++++++++++++++++++++++++-- frontend/translations/el.po | 4 - frontend/translations/es.po | 47 ++++++++++-- frontend/translations/eu.po | 15 ++-- frontend/translations/fa.po | 14 +--- frontend/translations/fin_FI.po | 4 - frontend/translations/fo.po | 4 - frontend/translations/fr.po | 15 ++-- frontend/translations/gl.po | 4 - frontend/translations/ha.po | 17 ++--- frontend/translations/he.po | 72 ++++++++++++++++-- frontend/translations/hr.po | 8 -- frontend/translations/id.po | 15 ++-- frontend/translations/ig.po | 15 +--- frontend/translations/it.po | 4 - frontend/translations/jpn_JP.po | 4 - frontend/translations/ko.po | 4 - frontend/translations/lt.po | 4 - frontend/translations/lv.po | 125 ++++++++++++++++++++++++++++-- frontend/translations/ml.po | 4 - frontend/translations/ms.po | 27 ++----- frontend/translations/nl.po | 127 +++++++++++++++++++++++++++++-- frontend/translations/pl.po | 19 ++--- frontend/translations/pt_BR.po | 15 ++-- frontend/translations/pt_PT.po | 15 ++-- frontend/translations/ro.po | 15 ++-- frontend/translations/ru.po | 7 -- frontend/translations/ta.po | 4 - frontend/translations/tr.po | 123 ++++++++++++++++++++++++++++-- frontend/translations/ukr_UA.po | 4 - frontend/translations/yo.po | 45 ++--------- frontend/translations/zh_CN.po | 17 ++--- frontend/translations/zh_Hant.po | 14 +--- 38 files changed, 660 insertions(+), 310 deletions(-) diff --git a/frontend/translations/ar.po b/frontend/translations/ar.po index 400b28221..aa4b75c87 100644 --- a/frontend/translations/ar.po +++ b/frontend/translations/ar.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-01-02 16:16+0000\n" -"Last-Translator: Alejandro Alonso \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Arabic " "\n" "Language: ar\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -57,10 +57,6 @@ msgstr "تسجيل الدخول هنا" msgid "auth.login-submit" msgstr "تسجيل الدخول" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "سعيد برؤيتك مجددا!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "Github" @@ -858,6 +854,7 @@ msgstr "رمز غير معروف" msgid "errors.webhooks.connection" msgstr "خطأ في الاتصال ، عنوان إلكتروني لا يمكن الوصول إليه" +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "آخر تسليم لم يكن ناجحًا." @@ -917,6 +914,7 @@ msgid "feedback.twitter-subtitle1" msgstr "هنا للمساعدة في استفساراتك التقنية." #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-title" msgstr "رد عنوان تويتر" @@ -2434,6 +2432,7 @@ msgstr "أطهر التفاعلات بالنقر" msgid "viewer.header.sitemap" msgstr "خريطة الموقع" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "محاذاة المركز الأفقي" diff --git a/frontend/translations/bn.po b/frontend/translations/bn.po index 352aaac6a..456b8e988 100644 --- a/frontend/translations/bn.po +++ b/frontend/translations/bn.po @@ -55,10 +55,6 @@ msgstr "এখানে লগিন করুন" msgid "auth.login-submit" msgstr "লগিন" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "আপনাকে আবার দেখে ভালো লাগছে!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "গিটহাব" diff --git a/frontend/translations/ca.po b/frontend/translations/ca.po index b75496da4..ffa795e91 100644 --- a/frontend/translations/ca.po +++ b/frontend/translations/ca.po @@ -60,10 +60,6 @@ msgstr "Inicieu la sessió aquí" msgid "auth.login-submit" msgstr "Entra" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Ens agrada tornar a veure-vos!" - #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -2254,9 +2250,6 @@ msgstr "Bloqueja la selecció" msgid "shortcuts.toggle-lock-size" msgstr "Bloqueja les proporcions" -msgid "shortcuts.toggle-rules" -msgstr "Mostra/Amaga les regles" - msgid "shortcuts.toggle-textpalette" msgstr "Mostra/amaga la paleta de text" diff --git a/frontend/translations/cs.po b/frontend/translations/cs.po index d0b667449..8fbee30fb 100644 --- a/frontend/translations/cs.po +++ b/frontend/translations/cs.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-01-23 15:02+0000\n" -"Last-Translator: \"Amerey.eu\" \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Czech " "\n" "Language: cs\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -60,10 +60,6 @@ msgstr "Přihlaste se zde" msgid "auth.login-submit" msgstr "Přihlásit se" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Rádi vás znovu vidíme!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -1015,6 +1011,7 @@ msgstr "Chyba připojení, adresa URL není dostupná" msgid "errors.webhooks.invalid-uri" msgstr "Adresa URL neprošla ověřením." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Poslední dodávka nebyla úspěšná." @@ -3029,9 +3026,6 @@ msgstr "Uzamknout vybrané" msgid "shortcuts.toggle-lock-size" msgstr "Uzamknout proporce" -msgid "shortcuts.toggle-rules" -msgstr "Zobrazit/skrýt pravítka" - msgid "shortcuts.toggle-textpalette" msgstr "Přepnout paletu textu" @@ -3191,6 +3185,7 @@ msgstr "Zobrazit interakce po kliknutí" msgid "viewer.header.sitemap" msgstr "Mapa stránek" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Poslední doručení proběhlo úspěšně." diff --git a/frontend/translations/da.po b/frontend/translations/da.po index 8e4d96ba6..31479ed12 100644 --- a/frontend/translations/da.po +++ b/frontend/translations/da.po @@ -59,10 +59,6 @@ msgstr "Log på her" msgid "auth.login-submit" msgstr "Log på" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Fedt at se dig igen!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "Github" diff --git a/frontend/translations/de.po b/frontend/translations/de.po index 84195a044..9ae1cc35d 100644 --- a/frontend/translations/de.po +++ b/frontend/translations/de.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-03-22 16:01+0000\n" +"PO-Revision-Date: 2024-04-25 13:07+0000\n" "Last-Translator: Stas Haas \n" "Language-Team: German " "\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -52,6 +52,10 @@ msgstr "Passwort vergessen?" msgid "auth.fullname" msgstr "Vollständiger Name" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "In mein Konto einloggen" + #: src/app/main/ui/auth/register.cljs msgid "auth.login-here" msgstr "Hier anmelden" @@ -61,8 +65,10 @@ msgid "auth.login-submit" msgstr "Anmelden" #: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Schön, Sie wiederzusehen!" +msgid "auth.login-tagline" +msgstr "" +"Penpot ist das kostenlose Open-Source-Design-Tool für die Zusammenarbeit " +"von Design und Code" #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" @@ -865,6 +871,10 @@ msgstr "Ok" msgid "ds.confirm-title" msgstr "Sind Sie sicher?" +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "Auth-Provider für dieses Profil nicht erlaubt" + #: src/app/main/ui/auth/login.cljs msgid "errors.auth-provider-not-configured" msgstr "Authentifizierungsanbieter ist nicht konfiguriert." @@ -897,6 +907,10 @@ msgstr "E-Mail-Adresse wurde bereits validiert." msgid "errors.email-as-password" msgstr "Sie können Ihre E-Mail-Adresse nicht als Passwort verwenden" +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "Domain nicht zulässig" + #: src/app/main/ui/auth/register.cljs, #: src/app/main/ui/auth/recovery_request.cljs, #: src/app/main/ui/settings/change_email.cljs, @@ -1765,7 +1779,7 @@ msgid "labels.uploading" msgstr "Hochladen…" msgid "labels.view-only" -msgstr "NUR ANSEHEN" +msgstr "Nur ansehen" #: src/app/main/ui/dashboard/team.cljs msgid "labels.viewer" @@ -1795,6 +1809,12 @@ msgstr "Verlauf" msgid "media.image" msgstr "Bild" +msgid "media.image.short" +msgstr "img" + +msgid "media.keep-aspect-ratio" +msgstr "Seitenverhältnis beibehalten" + msgid "media.linear" msgstr "Linear" @@ -2146,6 +2166,21 @@ msgstr "Sind Sie sicher, dass Sie dieses Team verlassen wollen?" msgid "modals.leave-confirm.title" msgstr "Team verlassen" +msgid "modals.move-shared-confirm.accept" +msgid_plural "modals.move-shared-confirm.accept" +msgstr[0] "Verschieben" +msgstr[1] "Verschieben" + +msgid "modals.move-shared-confirm.message" +msgid_plural "modals.move-shared-confirm.message" +msgstr[0] "Sind Sie sicher, dass Sie diese Bibliothek verschieben wollen?" +msgstr[1] "Sind Sie sicher, dass Sie diese Bibliotheken verschieben wollen?" + +msgid "modals.move-shared-confirm.title" +msgid_plural "modals.move-shared-confirm.title" +msgstr[0] "Bibliothek verschieben" +msgstr[1] "Bibliotheken verschieben" + #: src/app/main/ui/workspace/nudge.cljs msgid "modals.nudge-title" msgstr "Verschiebung" @@ -2438,6 +2473,9 @@ msgstr "Unbegrenzte Anzahl von Mitgliedern" msgid "onboarding.team-modal.create-team-feature-5" msgstr "100% kostenlos!" +msgid "onboarding.team-modal.team-definition" +msgstr "Was ist ein Team?" + msgid "onboarding.templates.subtitle" msgstr "Hier sind einige Vorlagen." @@ -2539,6 +2577,10 @@ msgstr "Marketing" msgid "questions.more-than-50" msgstr "Mehr als 50" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-one" +msgstr "Keine" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.next" msgstr "Weiter" @@ -2631,6 +2673,10 @@ msgstr "Trennen" msgid "settings.multiple" msgstr "Mehrere" +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs +msgid "settings.select-this-color" +msgstr "Elemente mit diesem Stil auswählen" + # SECTIONS msgid "shortcut-section.basics" msgstr "Grundlagen" @@ -2984,6 +3030,9 @@ msgstr "Wiederholen" msgid "shortcuts.reset-zoom" msgstr "Zoom zurücksetzen" +msgid "shortcuts.scale" +msgstr "Skalieren" + msgid "shortcuts.search-placeholder" msgstr "Tastaturkürzel suchen" @@ -3057,6 +3106,9 @@ msgstr "Fokusmodus umschalten" msgid "shortcuts.toggle-fullscreen" msgstr "Vollbild aktivieren/deaktivieren" +msgid "shortcuts.toggle-guides" +msgstr "Hilfslinien anzeigen / ausblenden" + msgid "shortcuts.toggle-history" msgstr "Verlauf ein-/ausblenden" @@ -3066,14 +3118,20 @@ msgstr "Ebenen ein-/ausblenden" msgid "shortcuts.toggle-layout-flex" msgstr "Flex-Layout hinzufügen/entfernen" +msgid "shortcuts.toggle-layout-grid" +msgstr "Grid-Layout hinzufügen/entfernen" + msgid "shortcuts.toggle-lock" msgstr "Auswahl sperren" msgid "shortcuts.toggle-lock-size" msgstr "Seitenverhältnis sperren/entsperren" -msgid "shortcuts.toggle-rules" -msgstr "Lineale ein-/ausblenden" +msgid "shortcuts.toggle-rulers" +msgstr "Lineale anzeigen / ausblenden" + +msgid "shortcuts.toggle-snap-guides" +msgstr "An Hilfslinien ausrichten" msgid "shortcuts.toggle-textpalette" msgstr "Textpalette ein-/ausblenden" @@ -3321,6 +3379,10 @@ msgstr "Hauptkomponente duplizieren" msgid "workspace.assets.edit" msgstr "Bearbeiten" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.filter" +msgstr "Filtern" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.graphics" @@ -3372,6 +3434,16 @@ msgstr[1] "%s Elemente ausgewählt" msgid "workspace.assets.shared-library" msgstr "Geteilte Bibliothek" +#: src/app/main/ui/workspace/sidebar/assets/common.cljs +msgid "workspace.assets.sidebar.components" +msgid_plural "workspace.assets.sidebar.components" +msgstr[0] "1 Komponente" +msgstr[1] "% Komponenten" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "Sortieren" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" @@ -3519,6 +3591,10 @@ msgstr "Ausrichten am Pixel aktivieren" msgid "workspace.header.menu.hide-artboard-names" msgstr "Namen von Zeichenflächen ausblenden" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-guides" +msgstr "Hilfslinien ausblenden" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "Farbpalette ausblenden" @@ -3565,6 +3641,10 @@ msgstr "Alles auswählen" msgid "workspace.header.menu.show-artboard-names" msgstr "Namen der Zeichenflächen anzeigen" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-guides" +msgstr "Hilfslinien anzeigen" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Farbpalette einblenden" @@ -3643,6 +3723,9 @@ msgstr "Grid bearbeiten" msgid "workspace.layout_grid.editor.options.exit" msgstr "Beenden" +msgid "workspace.layout_grid.editor.padding.expand" +msgstr "4-seitige Abstandsoptionen anzeigen" + msgid "workspace.layout_grid.editor.title" msgstr "Raster bearbeiten" @@ -3652,6 +3735,9 @@ msgstr "Fertig" msgid "workspace.layout_grid.editor.top-bar.locate" msgstr "Lokalisieren" +msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" +msgstr "Grid-Layout lokalisieren" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Hinzufügen" @@ -3748,6 +3834,10 @@ msgstr "Suche nach gemeinsam genutzten Bibliotheken" msgid "workspace.libraries.shared-libraries" msgstr "GEMEINSAM GENUTZTE BIBLIOTHEKEN" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.shared-library-btn" +msgstr "Bibliothek verknüpfen" + #: src/app/main/ui/workspace/sidebar/options/menus/text.cljs msgid "workspace.libraries.text.multiple-typography" msgstr "Mehrere Textstile" @@ -3760,6 +3850,10 @@ msgstr "Verknüpfung aller Textstile aufheben" msgid "workspace.libraries.typography" msgstr "%s Textstile" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.unlink-library-btn" +msgstr "Bibliothek trennen" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.update" msgstr "Aktualisieren" @@ -4925,6 +5019,10 @@ msgstr "Pfad" msgid "workspace.shape.menu.remove-flex" msgstr "Flex-Layout entfernen" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-grid" +msgstr "Grid-Layout entfernen" + #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, #: src/app/main/ui/workspace/context_menu.cljs, #: src/app/main/ui/workspace/context_menu.cljs @@ -5098,6 +5196,10 @@ msgstr "**Inspektionsmodus** (nur Ansicht)" msgid "workspace.top-bar.read-only.done" msgstr "Fertig" +#, markdown +msgid "workspace.top-bar.view-only" +msgstr "**Code inspizieren** (nur ansehen)" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Es gibt bisher keine Änderungen im Verlauf" diff --git a/frontend/translations/el.po b/frontend/translations/el.po index cc62a2301..a6bcf2b62 100644 --- a/frontend/translations/el.po +++ b/frontend/translations/el.po @@ -60,10 +60,6 @@ msgstr "Συνδεθείτε εδώ" msgid "auth.login-submit" msgstr "Συνδεθείτε" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Χαίρομαι που σας ξαναδώ" - #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" diff --git a/frontend/translations/es.po b/frontend/translations/es.po index ff0bc53de..0f0e7f7d0 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-01-25 12:01+0000\n" -"Last-Translator: Yessenia Villarte Vaca \n" +"PO-Revision-Date: 2024-04-26 04:53+0000\n" +"Last-Translator: Alejandro Alonso \n" "Language-Team: Spanish " "\n" "Language: es\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -990,6 +990,9 @@ msgstr "La contraseña de confirmación debe coincidir" msgid "errors.password-too-short" msgstr "La contraseña debe tener 8 caracteres como mínimo" +msgid "errors.paste-data-validation" +msgstr "Datos inválidos en el portapapeles" + msgid "errors.profile-blocked" msgstr "El perfil esta blockeado" @@ -1005,6 +1008,10 @@ msgstr "" msgid "errors.registration-disabled" msgstr "El registro está actualmente desactivado." +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Detectada funcionalidad incompatible '%s'" + msgid "errors.team-leave.insufficient-members" msgstr "" "No hay miembros suficientes para salir del equipo, probablemente quieras " @@ -1028,12 +1035,20 @@ msgstr "Ha ocurrido un error inesperado." msgid "errors.unexpected-token" msgstr "Token desconocido" +msgid "errors.validation" +msgstr "Error de validación" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "El fichero tiene un número de versión incompatible" + msgid "errors.webhooks.connection" msgstr "Error de conexion, la url no es alcanzable" msgid "errors.webhooks.invalid-uri" msgstr "La URL no pasa la validación." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Hubo un problema en el último envío." @@ -1437,6 +1452,9 @@ msgstr "Eliminar invitation" msgid "labels.delete-multi-files" msgstr "Borrar %s archivos" +msgid "labels.discard" +msgstr "Descartar" + #: src/app/main/ui/dashboard/projects.cljs, #: src/app/main/ui/dashboard/sidebar.cljs, #: src/app/main/ui/dashboard/files.cljs, @@ -1793,6 +1811,12 @@ msgstr "Radial" msgid "media.solid" msgstr "Sólido" +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Tu biblioteca está vacía. Una vez que se agregue como Biblioteca " +"Compartida, los recursos que crees estarán disponibles para ser utilizados " +"entre el resto de tus archivos. ¿Estás seguro de que deseas publicarlo?" + #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" @@ -2241,6 +2265,10 @@ msgstr "" msgid "modals.update-remote-component.message" msgstr "Actualizar un componente en biblioteca" +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "Una nueva versión está disponible, por favor actualiza la página" + #: src/app/main/ui/dashboard/team.cljs msgid "notifications.invitation-email-sent" msgstr "Invitación enviada con éxito" @@ -3238,6 +3266,7 @@ msgstr "Mostrar interacciones al hacer click" msgid "viewer.header.sitemap" msgstr "Mapa del sitio" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "El último envío fue correcto." @@ -3591,8 +3620,8 @@ msgid "workspace.header.menu.show-artboard-names" msgstr "Mostrar nombres de tableros" #: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-g" -msgstr "Mostrar rejilla" +msgid "workspace.header.menu.show-guides" +msgstr "Mostrar guías" #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" @@ -3757,6 +3786,10 @@ msgstr "BIBLIOTECA" msgid "workspace.libraries.library-updates" msgstr "ACTUALIZACIONES DE BIBLIOTECAS" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Cargando…" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "No hay bibliotecas que necesiten ser actualizadas" @@ -3801,6 +3834,10 @@ msgstr "Desconectar biblioteca" msgid "workspace.libraries.update" msgstr "Actualizar" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "ver todos los cambios" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.updates" msgstr "ACTUALIZACIONES" diff --git a/frontend/translations/eu.po b/frontend/translations/eu.po index 9436e9d85..4db439f6e 100644 --- a/frontend/translations/eu.po +++ b/frontend/translations/eu.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-07-01 12:52+0000\n" -"Last-Translator: Mikel Larreategi \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Basque " "\n" "Language: eu\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.0-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -60,10 +60,6 @@ msgstr "Sartu" msgid "auth.login-submit" msgstr "Sartu" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Ongi etorri berriz ere!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -893,6 +889,7 @@ msgstr "Konexio errorea, URLa ezin da ireki" msgid "errors.webhooks.invalid-uri" msgstr "URLak ez du balidazioa gainditu." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Errore bat gertatu da azken bidalketan." @@ -2568,9 +2565,6 @@ msgstr "Blokeatu/Desblokeatu" msgid "shortcuts.toggle-lock-size" msgstr "Blokeatu/Desblokeatu proportzioak" -msgid "shortcuts.toggle-rules" -msgstr "Erakutsi/ezkutatu erregelak" - msgid "shortcuts.toggle-textpalette" msgstr "Erakutsi/Ezkutatu testuen paleta" @@ -2724,6 +2718,7 @@ msgstr "Erakutsi interakzioak klik egitean" msgid "viewer.header.sitemap" msgstr "Webgunearen mapa" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Azken bidalketa ondo joan da." diff --git a/frontend/translations/fa.po b/frontend/translations/fa.po index f010b9a74..abbbc8c5b 100644 --- a/frontend/translations/fa.po +++ b/frontend/translations/fa.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-01-24 14:27+0000\n" -"Last-Translator: Ahmad HosseinBor <123hozeifeh@gmail.com>\n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Persian " "\n" "Language: fa\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.16-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -60,10 +60,6 @@ msgstr "ورود از اینجا" msgid "auth.login-submit" msgstr "ورود" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "خوشحالم که دوباره شما را می‌بینم!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "گیتهاب" @@ -860,6 +856,7 @@ msgid "feedback.title" msgstr "ایمیل" #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-go-to" msgstr "به توییتر بروید" @@ -1876,9 +1873,6 @@ msgstr "انتقال" msgid "shortcuts.paste" msgstr "چسباندن" -msgid "shortcuts.toggle-rules" -msgstr "نمایش/پنهان کردن خط‌کش‌ها" - msgid "shortcuts.undo" msgstr "واگرد" diff --git a/frontend/translations/fin_FI.po b/frontend/translations/fin_FI.po index 2c733dca9..2e02a3c73 100644 --- a/frontend/translations/fin_FI.po +++ b/frontend/translations/fin_FI.po @@ -59,10 +59,6 @@ msgstr "Kirjaudu sisään" msgid "auth.login-submit" msgstr "Kirjaudu" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Mahtavaa nähdä sinut uudelleen!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" diff --git a/frontend/translations/fo.po b/frontend/translations/fo.po index 6daabf410..b4065190c 100644 --- a/frontend/translations/fo.po +++ b/frontend/translations/fo.po @@ -60,10 +60,6 @@ msgstr "Innrita her" msgid "auth.login-submit" msgstr "Rita inn" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Gott at síggja teg aftur!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" diff --git a/frontend/translations/fr.po b/frontend/translations/fr.po index b978a7da3..91571b084 100644 --- a/frontend/translations/fr.po +++ b/frontend/translations/fr.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-24 15:02+0000\n" -"Last-Translator: Louis Chance \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: French " "\n" "Language: fr\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -60,10 +60,6 @@ msgstr "Connectez-vous ici" msgid "auth.login-submit" msgstr "Se connecter" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Ravi de vous revoir !" - #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -1025,6 +1021,7 @@ msgstr "Erreur de connexion, URL inaccessible" msgid "errors.webhooks.invalid-uri" msgstr "L'URL ne passe pas la validation." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Il y a eu une erreur dans le dernier envoi." @@ -2987,9 +2984,6 @@ msgstr "Verrou sélectionné" msgid "shortcuts.toggle-lock-size" msgstr "Verrouiller les proportions" -msgid "shortcuts.toggle-rules" -msgstr "Afficher/masquer les règles" - msgid "shortcuts.toggle-textpalette" msgstr "Afficher/masquer la palette de texte" @@ -3151,6 +3145,7 @@ msgstr "Afficher les interactions au clic" msgid "viewer.header.sitemap" msgstr "Plan du site" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Le dernier envoi a réussi." diff --git a/frontend/translations/gl.po b/frontend/translations/gl.po index 17030b26a..e1b8b4d81 100644 --- a/frontend/translations/gl.po +++ b/frontend/translations/gl.po @@ -60,10 +60,6 @@ msgstr "Entra aquí" msgid "auth.login-submit" msgstr "Entrar" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Un pracer volverte ver!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" diff --git a/frontend/translations/ha.po b/frontend/translations/ha.po index f276a92b7..ee7801e44 100644 --- a/frontend/translations/ha.po +++ b/frontend/translations/ha.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-01-02 16:16+0000\n" -"Last-Translator: Alejandro Alonso \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Hausa " "\n" "Language: ha\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -59,10 +59,6 @@ msgstr "shiga nan" msgid "auth.login-submit" msgstr "shiga ciki" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "na ji daxin sake haxuwa da kai!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "matattarar manazarta" @@ -951,6 +947,7 @@ msgstr "hadin bai yi ba, ba a iya samun URL" msgid "errors.webhooks.invalid-uri" msgstr "URL bai gyaru ba." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "saqon qarshe bai je ba." @@ -1007,6 +1004,7 @@ msgid "feedback.title" msgstr "imel" #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-go-to" msgstr "je ka tiwita" @@ -1015,6 +1013,7 @@ msgid "feedback.twitter-subtitle1" msgstr "tambayoyin da ke buqatar amsa." #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-title" msgstr "wurin karvar qorafin tiwita" @@ -1960,8 +1959,8 @@ msgstr "ka tabbata ka na son fita daga %s tawaga?" msgid "modals.leave-and-reassign.forbidden" msgstr "" -"ba za ku iya bari ba idan ba wani memba da zai ingata wa mai shi. ku na iya " -"goge tawaga." +"Webhooks hanyar sanar da manhajoji da addireshi intanet idan wani ya faru a " +"Penpot. za a tura maka da saqon talla URLs ka samar da." #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.leave-and-reassign.hint1" diff --git a/frontend/translations/he.po b/frontend/translations/he.po index 5ea29f18a..9cbdf625b 100644 --- a/frontend/translations/he.po +++ b/frontend/translations/he.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-17 14:02+0000\n" +"PO-Revision-Date: 2024-04-25 13:07+0000\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew " "\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " "n % 10 == 0) ? 2 : 3));\n" -"X-Generator: Weblate 5.4\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -49,6 +49,10 @@ msgstr "שכחת סיסמה?" msgid "auth.fullname" msgstr "שם מלא" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "כניסה לחשבון שלי" + #: src/app/main/ui/auth/register.cljs msgid "auth.login-here" msgstr "כניסה מכאן" @@ -58,8 +62,8 @@ msgid "auth.login-submit" msgstr "כניסה" #: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "שמחים לראות אותך שוב!" +msgid "auth.login-tagline" +msgstr "Penpot הוא כלי בקוד פתוח לשיתוף עיצוב וקוד" #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" @@ -835,6 +839,10 @@ msgstr "אישור" msgid "ds.confirm-title" msgstr "להמשיך?" +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "ספק האימות לא מורשה לפרופיל הזה" + #: src/app/main/ui/auth/login.cljs msgid "errors.auth-provider-not-configured" msgstr "לא מוגדר ספק אימות." @@ -867,6 +875,10 @@ msgstr "כתובת הדוא״ל כבר אומתה." msgid "errors.email-as-password" msgstr "אין לך אפשרות להשתמש בכתובת הדוא״ל שלך כסיסמה" +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "שם התחום לא מורשה" + #: src/app/main/ui/auth/register.cljs, #: src/app/main/ui/auth/recovery_request.cljs, #: src/app/main/ui/settings/change_email.cljs, @@ -1057,7 +1069,7 @@ msgstr "דוא״ל" #: src/app/main/ui/settings/feedback.cljs msgid "feedback.twitter-go-to" -msgstr "מעבר לטוויטר" +msgstr "מעבר ל־X" #: src/app/main/ui/settings/feedback.cljs msgid "feedback.twitter-subtitle1" @@ -1065,7 +1077,7 @@ msgstr "כאן כדי לסייע בסוגיות טכניות." #: src/app/main/ui/settings/feedback.cljs msgid "feedback.twitter-title" -msgstr "חשבון תמיכה בטוויטר" +msgstr "חשבון תמיכה ב־X" #: src/app/main/ui/settings/password.cljs msgid "generic.error" @@ -2087,6 +2099,20 @@ msgstr "לעזוב את הצוות הזה?" msgid "modals.leave-confirm.title" msgstr "עזיבת הצוות" +msgid "modals.move-shared-confirm.message" +msgid_plural "modals.move-shared-confirm.message" +msgstr[0] "להעביר את הספרייה הזאת?" +msgstr[1] "להעביר את הספריות האלו?" +msgstr[2] "להעביר את הספריות האלו?" +msgstr[3] "להעביר את הספריות האלו?" + +msgid "modals.move-shared-confirm.title" +msgid_plural "modals.move-shared-confirm.title" +msgstr[0] "העברת ספרייה" +msgstr[1] "העברת ספריות" +msgstr[2] "העברת ספריות" +msgstr[3] "העברת ספריות" + #: src/app/main/ui/workspace/nudge.cljs msgid "modals.nudge-title" msgstr "כמות ההינד" @@ -2366,6 +2392,9 @@ msgstr "ללא הגבלת משתמשים" msgid "onboarding.team-modal.create-team-feature-5" msgstr "100% בחינם!" +msgid "onboarding.team-modal.team-definition" +msgstr "מה זה צוות?" + msgid "onboarding.templates.subtitle" msgstr "הנה כמה תבניות." @@ -2467,6 +2496,10 @@ msgstr "שיווק" msgid "questions.more-than-50" msgstr "גדול מ־50" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-one" +msgstr "אין" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.next" msgstr "הבאה" @@ -2558,6 +2591,10 @@ msgstr "ניתוק" msgid "settings.multiple" msgstr "מעורב" +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs +msgid "settings.select-this-color" +msgstr "בחירת פריטים שמשתמשים בסגנון הזה" + # SECTIONS msgid "shortcut-section.basics" msgstr "יסודות" @@ -2911,6 +2948,9 @@ msgstr "ביצוע חוזר" msgid "shortcuts.reset-zoom" msgstr "איפוס תקריב" +msgid "shortcuts.scale" +msgstr "התאמת גודל" + msgid "shortcuts.search-placeholder" msgstr "חיפוש בקיצורי הדרך" @@ -2984,6 +3024,9 @@ msgstr "החלפת מצב מיקוד" msgid "shortcuts.toggle-fullscreen" msgstr "החלפת מילוי מסך" +msgid "shortcuts.toggle-guides" +msgstr "הצגת / הסתרת קווים מנחים" + msgid "shortcuts.toggle-history" msgstr "החלפת הצגת היסטוריה" @@ -2993,14 +3036,23 @@ msgstr "החלפת הצגת שכבות" msgid "shortcuts.toggle-layout-flex" msgstr "הוספת/הסרת פריסת flex" +msgid "shortcuts.toggle-layout-grid" +msgstr "הוספת/הסרת פריסת רשת" + msgid "shortcuts.toggle-lock" msgstr "נעילת הנבחרים" msgid "shortcuts.toggle-lock-size" msgstr "נעילת יחס" -msgid "shortcuts.toggle-rules" -msgstr "הצגת/הסתרת סרגלים" +msgid "shortcuts.toggle-rulers" +msgstr "הצגת / הסתרת סרגלים" + +msgid "shortcuts.toggle-snap-guides" +msgstr "הצמדה לקווים מנחים" + +msgid "shortcuts.toggle-snap-ruler-guide" +msgstr "הצמדה לקווים מנחים סרגלים" msgid "shortcuts.toggle-textpalette" msgstr "החלפת לוח טקסט" @@ -3299,6 +3351,10 @@ msgstr[3] "%s פריטים נבחרו" msgid "workspace.assets.shared-library" msgstr "ספרייה משותפת" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "מיון" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" diff --git a/frontend/translations/hr.po b/frontend/translations/hr.po index 9075ac5de..c51d077c9 100644 --- a/frontend/translations/hr.po +++ b/frontend/translations/hr.po @@ -59,10 +59,6 @@ msgstr "Prijavi se ovdje" msgid "auth.login-submit" msgstr "Prijava" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Drago nam je vidjeti te opet!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -2345,10 +2341,6 @@ msgstr "Zaključaj odabrano" msgid "shortcuts.toggle-lock-size" msgstr "Zaključaj proporcije" -#, fuzzy -msgid "shortcuts.toggle-rules" -msgstr "Prikaži/sakrij \"rules\"" - msgid "shortcuts.toggle-textpalette" msgstr "Promijeni paletu teksta" diff --git a/frontend/translations/id.po b/frontend/translations/id.po index 86d745eef..c29981ce9 100644 --- a/frontend/translations/id.po +++ b/frontend/translations/id.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-08 15:01+0000\n" -"Last-Translator: Linerly \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Indonesian " "\n" "Language: id\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -60,10 +60,6 @@ msgstr "Masuk di sini" msgid "auth.login-submit" msgstr "Masuk" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Senang bertemu dengan Anda lagi!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -1017,6 +1013,7 @@ msgstr "Kesalahan koneksi, URL tidak dapat diraih" msgid "errors.webhooks.invalid-uri" msgstr "URL tidak melewati validasi." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Pengiriman terakhir tidak berhasil." @@ -3020,9 +3017,6 @@ msgstr "Kunci dipilih" msgid "shortcuts.toggle-lock-size" msgstr "Kunci proporsi" -msgid "shortcuts.toggle-rules" -msgstr "Tampilkan/sembunyikan penggaris" - msgid "shortcuts.toggle-textpalette" msgstr "Alih palet teks" @@ -3187,6 +3181,7 @@ msgstr "Tampilkan interaksi pada klik" msgid "viewer.header.sitemap" msgstr "Peta Situs" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Pengiriman terakhir berhasil." diff --git a/frontend/translations/ig.po b/frontend/translations/ig.po index 79a03c878..5c5ea3353 100644 --- a/frontend/translations/ig.po +++ b/frontend/translations/ig.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-14 08:02+0000\n" -"Last-Translator: Alejandro Alonso \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Igbo " "\n" "Language: ig\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.check-your-email" @@ -53,10 +53,6 @@ msgstr "Banye ebe a" msgid "auth.login-submit" msgstr "Banye" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Ihe ịtụnanya ịhụ gị !" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "Obi Git" @@ -875,6 +871,7 @@ msgid "feedback.title" msgstr "Ozi- n" #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-go-to" msgstr "Gaa na Twita" @@ -1980,10 +1977,6 @@ msgstr "Ịzụ ahịa" msgid "questions.more-than-50" msgstr "Karịrị iri ise" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.never-used-a-tool" -msgstr "E jibeghị m ngwa ọrụ nse rụọ ọrụ mbụ" - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.next" msgstr "Ọzọ" diff --git a/frontend/translations/it.po b/frontend/translations/it.po index e8ed1cd3d..538d09b8a 100644 --- a/frontend/translations/it.po +++ b/frontend/translations/it.po @@ -60,10 +60,6 @@ msgstr "Accedere qui" msgid "auth.login-submit" msgstr "Accedi" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Felice di rivederti!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" diff --git a/frontend/translations/jpn_JP.po b/frontend/translations/jpn_JP.po index e7847f005..e2de68012 100644 --- a/frontend/translations/jpn_JP.po +++ b/frontend/translations/jpn_JP.po @@ -55,10 +55,6 @@ msgstr "こちらからログイン" msgid "auth.login-submit" msgstr "ログイン" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "またお会いしましたね!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" diff --git a/frontend/translations/ko.po b/frontend/translations/ko.po index 2946e8f69..8105950ad 100644 --- a/frontend/translations/ko.po +++ b/frontend/translations/ko.po @@ -43,10 +43,6 @@ msgstr "여기서 로그인하세요" msgid "auth.login-submit" msgstr "로그인" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "다시 만나서 반가워요!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" diff --git a/frontend/translations/lt.po b/frontend/translations/lt.po index a4cebd6dd..a59ca0220 100644 --- a/frontend/translations/lt.po +++ b/frontend/translations/lt.po @@ -61,10 +61,6 @@ msgstr "Prisijungimas čia" msgid "auth.login-submit" msgstr "Prisijungti" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Malonu Jus vėl matyti!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" diff --git a/frontend/translations/lv.po b/frontend/translations/lv.po index 4f6b9ab4f..d4076ed81 100644 --- a/frontend/translations/lv.po +++ b/frontend/translations/lv.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-19 08:03+0000\n" +"PO-Revision-Date: 2024-04-25 13:07+0000\n" "Last-Translator: Edgars Andersons \n" "Language-Team: Latvian " "\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 " "<= 19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -53,6 +53,10 @@ msgstr "Aizmirsta parole?" msgid "auth.fullname" msgstr "Pilns vārds" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "Pieteikties manā kontā" + #: src/app/main/ui/auth/register.cljs msgid "auth.login-here" msgstr "Pieteikties šeit" @@ -62,8 +66,8 @@ msgid "auth.login-submit" msgstr "Pieteikties" #: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Prieks Jūs atkal redzēt!" +msgid "auth.login-tagline" +msgstr "Penpot ir bezmaksas atvērtā pirmkoda dizaina rīks dizaina un koda sadarbībai" #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" @@ -852,6 +856,10 @@ msgstr "Labi" msgid "ds.confirm-title" msgstr "Vai esat pārliecināti?" +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "Autentifikācijas nodrošinātājs nav atļauts šim profilam" + #: src/app/main/ui/auth/login.cljs msgid "errors.auth-provider-not-configured" msgstr "Autentifikācijas nodrošinātājs nav konfigurēts." @@ -884,6 +892,10 @@ msgstr "E-pasta adrese jau ir apliecināta." msgid "errors.email-as-password" msgstr "E-pastu nevar izmantot kā paroli" +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "Domēns nav atļauts" + #: src/app/main/ui/auth/register.cljs, #: src/app/main/ui/auth/recovery_request.cljs, #: src/app/main/ui/settings/change_email.cljs, @@ -1772,6 +1784,12 @@ msgstr "Pāreja" msgid "media.image" msgstr "Attēls" +msgid "media.image.short" +msgstr "att." + +msgid "media.keep-aspect-ratio" +msgstr "Paturēt samēru" + msgid "media.linear" msgstr "Līnijveida" @@ -2127,6 +2145,24 @@ msgstr "Vai tiešām pamest šo komandu?" msgid "modals.leave-confirm.title" msgstr "Komandas pamešana" +msgid "modals.move-shared-confirm.accept" +msgid_plural "modals.move-shared-confirm.accept" +msgstr[0] "Pārvietot" +msgstr[1] "Pārvietot" +msgstr[2] "Pārvietot" + +msgid "modals.move-shared-confirm.message" +msgid_plural "modals.move-shared-confirm.message" +msgstr[0] "Vai tiešām pārvietot šīs bibliotēkas?" +msgstr[1] "Vai tiešām pārvietot šīs bibliotēkas?" +msgstr[2] "Vai tiešām pārvietot šīs bibliotēkas?" + +msgid "modals.move-shared-confirm.title" +msgid_plural "modals.move-shared-confirm.title" +msgstr[0] "Pārvietot bibliotēkas" +msgstr[1] "Pārvietot bibliotēkas" +msgstr[2] "Pārvietot bibliotēkas" + #: src/app/main/ui/workspace/nudge.cljs msgid "modals.nudge-title" msgstr "Nobīdes apjoms" @@ -2417,6 +2453,9 @@ msgstr "Neierobežoti dalībnieki" msgid "onboarding.team-modal.create-team-feature-5" msgstr "100% bez maksas!" +msgid "onboarding.team-modal.team-definition" +msgstr "Kas ir komanda?" + msgid "onboarding.templates.subtitle" msgstr "Lūk, dažas veidnes." @@ -2518,6 +2557,10 @@ msgstr "Tirgvedība" msgid "questions.more-than-50" msgstr "Vairāk nekā 50" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-one" +msgstr "Neviens" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.next" msgstr "Nākamais" @@ -2609,6 +2652,10 @@ msgstr "Atdalīt" msgid "settings.multiple" msgstr "Jaukts" +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs +msgid "settings.select-this-color" +msgstr "Atlasīt vienumus, kas izmanto šo stilu" + # SECTIONS msgid "shortcut-section.basics" msgstr "Pamati" @@ -2962,6 +3009,9 @@ msgstr "Atatsaukt" msgid "shortcuts.reset-zoom" msgstr "Atiestatīt tālummaiņu" +msgid "shortcuts.scale" +msgstr "Mērogot" + msgid "shortcuts.search-placeholder" msgstr "Meklēt saīsnes" @@ -3035,6 +3085,9 @@ msgstr "Pārslēgt fokusa režīmu" msgid "shortcuts.toggle-fullscreen" msgstr "Pārslēgt pilnekrāna režīmu" +msgid "shortcuts.toggle-guides" +msgstr "Rādīt/paslēpt vadlīnijas" + msgid "shortcuts.toggle-history" msgstr "Pārslēgt vēsturi" @@ -3044,15 +3097,24 @@ msgstr "Pārslēgt slāņus" msgid "shortcuts.toggle-layout-flex" msgstr "Pievienot / Noņemt elastīgo izkārtojumu" +msgid "shortcuts.toggle-layout-grid" +msgstr "Pievienot/noņemt režģa izkārtojumu" + msgid "shortcuts.toggle-lock" msgstr "Slēgt / Atslēgt" msgid "shortcuts.toggle-lock-size" msgstr "Slēgt proporcijas" -msgid "shortcuts.toggle-rules" +msgid "shortcuts.toggle-rulers" msgstr "Rādīt/paslēpt mērjoslas" +msgid "shortcuts.toggle-snap-guides" +msgstr "Pievilkt pie vadlīnijām" + +msgid "shortcuts.toggle-snap-ruler-guide" +msgstr "Pievilkt pie mērjoslu vadlīnijām" + msgid "shortcuts.toggle-textpalette" msgstr "Pārslēgt teksta paleti" @@ -3295,6 +3357,10 @@ msgstr "Divkāršot galveno" msgid "workspace.assets.edit" msgstr "Labot" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.filter" +msgstr "Atlasīt" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.graphics" @@ -3347,6 +3413,17 @@ msgstr[2] "atlasīti %s vienumi" msgid "workspace.assets.shared-library" msgstr "Koplietojama bibliotēka" +#: src/app/main/ui/workspace/sidebar/assets/common.cljs +msgid "workspace.assets.sidebar.components" +msgid_plural "workspace.assets.sidebar.components" +msgstr[0] "%s sastāvdaļu" +msgstr[1] "%s sastāvdaļa" +msgstr[2] "%s sastāvdaļas" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "Kārtot" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" @@ -3472,6 +3549,10 @@ msgstr "Atspējot pieķeršanos vadotnēm" msgid "workspace.header.menu.disable-snap-pixel-grid" msgstr "Atspējot pieķeršanos pikselim" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-ruler-guides" +msgstr "Atspējot pievilkšanu mērjoslu vadlīnijām" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-dynamic-alignment" msgstr "Iespējot dinamisko līdzināšanu" @@ -3490,10 +3571,18 @@ msgstr "Pieķerties vadotnēm" msgid "workspace.header.menu.enable-snap-pixel-grid" msgstr "Iespējot pieķeršanos pikselim" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-ruler-guides" +msgstr "Pievilkt pie mērjoslu vadlīnijām" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-artboard-names" msgstr "Paslēpt plātņu nosaukumus" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-guides" +msgstr "Paslēpt vadlīnijas" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "Paslēpt krāsu paleti" @@ -3540,6 +3629,10 @@ msgstr "Atlasīt visu" msgid "workspace.header.menu.show-artboard-names" msgstr "Rādīt plātņu nosaukumus" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-guides" +msgstr "Parādīt vadlīnijas" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Rādīt krāsu paleti" @@ -3618,6 +3711,9 @@ msgstr "Labot režģi" msgid "workspace.layout_grid.editor.options.exit" msgstr "Iziet" +msgid "workspace.layout_grid.editor.padding.expand" +msgstr "Rādīt četrpusējas atbīdes iespējas" + msgid "workspace.layout_grid.editor.title" msgstr "Režģa labošana" @@ -3627,6 +3723,9 @@ msgstr "Darīts" msgid "workspace.layout_grid.editor.top-bar.locate" msgstr "Noteikt atrašanās vietu" +msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" +msgstr "Norādīt režģa izkārtojumu" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Pievienot" @@ -3721,6 +3820,10 @@ msgstr "Meklēt koplietojamās bibliotēkas" msgid "workspace.libraries.shared-libraries" msgstr "KOPLIETOJAMĀS BIBLIOTĒKAS" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.shared-library-btn" +msgstr "Savienot bibliotēku" + #: src/app/main/ui/workspace/sidebar/options/menus/text.cljs msgid "workspace.libraries.text.multiple-typography" msgstr "Vairāki burtu stili un veidi" @@ -3733,6 +3836,10 @@ msgstr "Atsaistīt visus burtu stilus un veidus" msgid "workspace.libraries.typography" msgstr "%s burtu stili un veidi" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.unlink-library-btn" +msgstr "Atvienot bibliotēku" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.update" msgstr "Atjaunināt" @@ -4895,6 +5002,10 @@ msgstr "Ceļš" msgid "workspace.shape.menu.remove-flex" msgstr "Noņemt elastīgo izkārtojumu" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-grid" +msgstr "Noņemt režģa izkārtojumu" + #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, #: src/app/main/ui/workspace/context_menu.cljs, #: src/app/main/ui/workspace/context_menu.cljs @@ -5068,6 +5179,10 @@ msgstr "**Apskatīšana** (tikai skatīt)" msgid "workspace.top-bar.read-only.done" msgstr "Darīts" +#, markdown +msgid "workspace.top-bar.view-only" +msgstr "**Apskata kodu** (tikai skatīšana)" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Līdz šim nav notikušas nekādas vēsturiskās izmaiņas" diff --git a/frontend/translations/ml.po b/frontend/translations/ml.po index e24b0cba0..b14a96f5c 100644 --- a/frontend/translations/ml.po +++ b/frontend/translations/ml.po @@ -59,10 +59,6 @@ msgstr "ഇവിടെ ലോഗിൻ ചെയ്യുക" msgid "auth.login-submit" msgstr "ലോഗിൻ" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "നിങ്ങളെ വീണ്ടും കാണാൻ കഴിഞ്ഞതിൽ സന്തോഷം!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "ഗിറ്റ്ഹബ്ബ്" diff --git a/frontend/translations/ms.po b/frontend/translations/ms.po index 087eb384d..fb10f5529 100644 --- a/frontend/translations/ms.po +++ b/frontend/translations/ms.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-10 15:02+0000\n" -"Last-Translator: Revenant \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Malay " "\n" "Language: ms\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -59,10 +59,6 @@ msgstr "Log masuk disini" msgid "auth.login-submit" msgstr "Log masuk" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Gembira dapat berjumpa lagi!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "Github" @@ -1002,6 +998,7 @@ msgstr "Ralat sambungan, URL tidak dapat dicapai" msgid "errors.webhooks.invalid-uri" msgstr "URL tidak lulus pengesahan." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Penghantaran terakhir tidak berjaya." @@ -1058,6 +1055,7 @@ msgid "feedback.title" msgstr "E-mel" #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-go-to" msgstr "Pergi ke Twitter" @@ -1066,6 +1064,7 @@ msgid "feedback.twitter-subtitle1" msgstr "Kami di sini untuk membantu dengan pertanyaan teknikal anda." #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-title" msgstr "Akaun sokongan Twitter" @@ -2115,16 +2114,6 @@ msgid "modals.unpublish-shared-confirm.accept" msgid_plural "modals.unpublish-shared-confirm.accept" msgstr[0] "Nyahterbit" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.activated.no-files-message" -msgid_plural "modals.unpublish-shared-confirm.activated.no-files-message" -msgstr[0] "Ia tidak diaktifkan dalam mana-mana fail." - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.activated.scd-message" -msgid_plural "modals.unpublish-shared-confirm.activated.scd-message" -msgstr[0] "Perpustakaan ini diaktifkan di sini:" - #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.message" msgid_plural "modals.unpublish-shared-confirm.message" @@ -2445,10 +2434,6 @@ msgstr "Pemasaran" msgid "questions.more-than-50" msgstr "Lebih daripada 50" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.never-used-a-tool" -msgstr "Saya tidak pernah menggunakan alat reka bentuk sebelum ini" - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.next" msgstr "Seterusnya" diff --git a/frontend/translations/nl.po b/frontend/translations/nl.po index c2676f780..ce1b4c484 100644 --- a/frontend/translations/nl.po +++ b/frontend/translations/nl.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-12 19:02+0000\n" +"PO-Revision-Date: 2024-04-25 13:07+0000\n" "Last-Translator: Stephan Paternotte \n" "Language-Team: Dutch " "\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -52,6 +52,10 @@ msgstr "Wachtwoord vergeten?" msgid "auth.fullname" msgstr "Volledige naam" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "Log in op mijn account" + #: src/app/main/ui/auth/register.cljs msgid "auth.login-here" msgstr "Hier inloggen" @@ -61,8 +65,10 @@ msgid "auth.login-submit" msgstr "Inloggen" #: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Goed om je weer te zien!" +msgid "auth.login-tagline" +msgstr "" +"Penpot is de gratis open-source ontwerptool voor samenwerking op het gebied " +"van ontwerp en code" #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" @@ -867,6 +873,10 @@ msgstr "Oké" msgid "ds.confirm-title" msgstr "Weet je het zeker?" +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "Auth-provider is niet toegestaan voor dit profiel" + #: src/app/main/ui/auth/login.cljs msgid "errors.auth-provider-not-configured" msgstr "Authenticatie-provider niet geconfigureerd." @@ -901,6 +911,10 @@ msgstr "E-mail is al gevalideerd." msgid "errors.email-as-password" msgstr "Je kan je e-mail niet als wachtwoord gebruiken" +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "Domein niet toegestaan" + #: src/app/main/ui/auth/register.cljs, #: src/app/main/ui/auth/recovery_request.cljs, #: src/app/main/ui/settings/change_email.cljs, @@ -1048,7 +1062,7 @@ msgid "errors.webhooks.invalid-uri" msgstr "URL komt niet door de validatie." msgid "errors.webhooks.last-delivery" -msgstr "Laatste levering is niet gelukt." +msgstr "Laatste levering was niet succesvol." msgid "errors.webhooks.ssl-validation" msgstr "Fout bij SSL-validatie." @@ -1156,7 +1170,7 @@ msgstr "Breedte" #: src/app/main/ui/inspect/attributes/layout.cljs msgid "inspect.attributes.layout" -msgstr "Lay-out" +msgstr "Layout" #: src/app/main/ui/inspect/attributes/layout.cljs msgid "inspect.attributes.layout.height" @@ -1791,6 +1805,12 @@ msgstr "Verloop" msgid "media.image" msgstr "Afbeelding" +msgid "media.image.short" +msgstr "img" + +msgid "media.keep-aspect-ratio" +msgstr "Verhoudingen behouden" + msgid "media.linear" msgstr "Lineair" @@ -2148,6 +2168,21 @@ msgstr "Weet je zeker dat je dit team wilt verlaten?" msgid "modals.leave-confirm.title" msgstr "Team verlaten" +msgid "modals.move-shared-confirm.accept" +msgid_plural "modals.move-shared-confirm.accept" +msgstr[0] "Verplaatsen" +msgstr[1] "Verplaatsen" + +msgid "modals.move-shared-confirm.message" +msgid_plural "modals.move-shared-confirm.message" +msgstr[0] "Weet je zeker dat je deze bibliotheek wilt verplaatsen?" +msgstr[1] "Weet je zeker dat je deze bibliotheken wilt verplaatsen?" + +msgid "modals.move-shared-confirm.title" +msgid_plural "modals.move-shared-confirm.title" +msgstr[0] "Bibliotheek verplaatsen" +msgstr[1] "Bibliotheken verplaatsen" + #: src/app/main/ui/workspace/nudge.cljs msgid "modals.nudge-title" msgstr "Verschuiving" @@ -2436,6 +2471,9 @@ msgstr "Oneindig veel leden" msgid "onboarding.team-modal.create-team-feature-5" msgstr "100% gratis!" +msgid "onboarding.team-modal.team-definition" +msgstr "Wat is een team?" + msgid "onboarding.templates.subtitle" msgstr "Hier zijn wat sjablonen." @@ -2537,6 +2575,10 @@ msgstr "Marketing" msgid "questions.more-than-50" msgstr "Meer dan 50" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-one" +msgstr "Geen" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.next" msgstr "Volgende" @@ -2630,6 +2672,10 @@ msgstr "Ontkoppelen" msgid "settings.multiple" msgstr "Gemixt" +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs +msgid "settings.select-this-color" +msgstr "Selecteer items in deze stijl" + # SECTIONS msgid "shortcut-section.basics" msgstr "Basis" @@ -2983,6 +3029,9 @@ msgstr "Opnieuw doen" msgid "shortcuts.reset-zoom" msgstr "Zoom herstellen" +msgid "shortcuts.scale" +msgstr "Schaal" + msgid "shortcuts.search-placeholder" msgstr "Sneltoetsen zoeken" @@ -3056,6 +3105,9 @@ msgstr "Focusmodus in/uitschakelen" msgid "shortcuts.toggle-fullscreen" msgstr "Volledig scherm in/uitschakelen" +msgid "shortcuts.toggle-guides" +msgstr "Hulplijnen tonen/verbergen" + msgid "shortcuts.toggle-history" msgstr "Geschiedenis in/uitschakelen" @@ -3065,15 +3117,24 @@ msgstr "Lagen in/uitschakelen" msgid "shortcuts.toggle-layout-flex" msgstr "Flex-layout toevoegen/verwijderen" +msgid "shortcuts.toggle-layout-grid" +msgstr "Raster-layout toevoegen/verwijderen" + msgid "shortcuts.toggle-lock" msgstr "Vergrendelen/ontgrendelen" msgid "shortcuts.toggle-lock-size" msgstr "Proporties vergrendelen" -msgid "shortcuts.toggle-rules" +msgid "shortcuts.toggle-rulers" msgstr "Linialen tonen/verbergen" +msgid "shortcuts.toggle-snap-guides" +msgstr "Uitlijnen op hulpijnen" + +msgid "shortcuts.toggle-snap-ruler-guide" +msgstr "Uitlijnen op liniaal-hulplijnen" + msgid "shortcuts.toggle-textpalette" msgstr "Tekstpalet in/uitschakelen" @@ -3318,6 +3379,10 @@ msgstr "Hoofdcomponent dupliceren" msgid "workspace.assets.edit" msgstr "Bewerken" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.filter" +msgstr "Filteren" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.graphics" @@ -3369,6 +3434,16 @@ msgstr[1] "%s items geselecteerd" msgid "workspace.assets.shared-library" msgstr "Gedeelde bibliotheek" +#: src/app/main/ui/workspace/sidebar/assets/common.cljs +msgid "workspace.assets.sidebar.components" +msgid_plural "workspace.assets.sidebar.components" +msgstr[0] "1 component" +msgstr[1] "%s componenten" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "Sorteren" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" @@ -3494,6 +3569,10 @@ msgstr "Uitlijnen op hulplijnen uitschakelen" msgid "workspace.header.menu.disable-snap-pixel-grid" msgstr "Uitlijnen op pixel uitschakelen" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-ruler-guides" +msgstr "Uitlijnen op liniaal-hulplijnen deactiveren" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-dynamic-alignment" msgstr "Dynamische uitlijning inschakelen" @@ -3512,10 +3591,18 @@ msgstr "Uitlijnen op hulplijnen" msgid "workspace.header.menu.enable-snap-pixel-grid" msgstr "Uitlijnen op pixel" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-ruler-guides" +msgstr "Uitlijnen op liniaal-hulplijnen" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-artboard-names" msgstr "Bordnamen verbergen" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-guides" +msgstr "Hulplijnen verbergen" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "Kleurenpalet verbergen" @@ -3562,6 +3649,10 @@ msgstr "Alles selecteren" msgid "workspace.header.menu.show-artboard-names" msgstr "Bordnamen tonen" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-guides" +msgstr "Hulplijnen weergeven" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Kleurenpalet tonen" @@ -3640,6 +3731,9 @@ msgstr "Raster bewerken" msgid "workspace.layout_grid.editor.options.exit" msgstr "Sluiten" +msgid "workspace.layout_grid.editor.padding.expand" +msgstr "4-zijdige opvulopties weergeven" + msgid "workspace.layout_grid.editor.title" msgstr "Raster bewerken" @@ -3649,6 +3743,9 @@ msgstr "Klaar" msgid "workspace.layout_grid.editor.top-bar.locate" msgstr "Lokaliseren" +msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" +msgstr "Raster-layout tonen" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Toevoegen" @@ -3743,6 +3840,10 @@ msgstr "Gedeelde bibliotheken zoeken" msgid "workspace.libraries.shared-libraries" msgstr "GEDEELDE BIBLIOTHEKEN" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.shared-library-btn" +msgstr "Bibliotheek verbinden" + #: src/app/main/ui/workspace/sidebar/options/menus/text.cljs msgid "workspace.libraries.text.multiple-typography" msgstr "Meervoudige typografie" @@ -3755,6 +3856,10 @@ msgstr "Alle typografie ontkoppelen" msgid "workspace.libraries.typography" msgstr "%s typografie" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.unlink-library-btn" +msgstr "Bibliotheekverbinding verbreken" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.update" msgstr "Bijwerken" @@ -4918,6 +5023,10 @@ msgstr "Pad" msgid "workspace.shape.menu.remove-flex" msgstr "Flex-indeling verwijderen" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-grid" +msgstr "Raster-layout verwijderen" + #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, #: src/app/main/ui/workspace/context_menu.cljs, #: src/app/main/ui/workspace/context_menu.cljs @@ -5091,6 +5200,10 @@ msgstr "** Inspectiemodus ** (alleen bekijken)" msgid "workspace.top-bar.read-only.done" msgstr "Klaar" +#, markdown +msgid "workspace.top-bar.view-only" +msgstr "**Code inspecteren** (alleen weergave)" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Er zijn tot nu toe geen wijzigingen in de geschiedenis" diff --git a/frontend/translations/pl.po b/frontend/translations/pl.po index 839c34218..951ad648d 100644 --- a/frontend/translations/pl.po +++ b/frontend/translations/pl.po @@ -1,16 +1,16 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-04-21 21:52+0000\n" -"Last-Translator: Radek Sawicki \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Polish " "\n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " -"|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.18-dev\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && " +"(n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -60,10 +60,6 @@ msgstr "Zaloguj się tutaj" msgid "auth.login-submit" msgstr "Zaloguj się" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Miło Cię znowu widzieć!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -858,6 +854,7 @@ msgstr "Błąd połączenia, adres URL nieosiągalny" msgid "errors.webhooks.invalid-uri" msgstr "Adres URL nie przechodzi weryfikacji." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Ostatnia wysyłka nie powiodła się." @@ -2466,9 +2463,6 @@ msgstr "Zablokuj wybrane" msgid "shortcuts.toggle-lock-size" msgstr "Zablokuj proporcje" -msgid "shortcuts.toggle-rules" -msgstr "Pokaż/ukryj linijki" - msgid "shortcuts.toggle-textpalette" msgstr "Przełącz paletę tekstu" @@ -2610,6 +2604,7 @@ msgstr "Pokaż interakcje po kliknięciu" msgid "viewer.header.sitemap" msgstr "Mapa strony" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Ostatnia wysyłka przebiegła pomyślnie." diff --git a/frontend/translations/pt_BR.po b/frontend/translations/pt_BR.po index 9610c9f4f..b2eee4944 100644 --- a/frontend/translations/pt_BR.po +++ b/frontend/translations/pt_BR.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-04-24 03:54+0000\n" -"Last-Translator: Ally Tiago \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Portuguese (Brazil) " "\n" "Language: pt_BR\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.18-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -59,10 +59,6 @@ msgstr "Entrar aqui" msgid "auth.login-submit" msgstr "Entrar" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Bom te ver novamente!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -856,6 +852,7 @@ msgstr "Erro de conexão, URL não acessível" msgid "errors.webhooks.invalid-uri" msgstr "A URL não passa na validação." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "O último envio não foi bem-sucedido." @@ -2457,9 +2454,6 @@ msgstr "Bloquear selecionado" msgid "shortcuts.toggle-lock-size" msgstr "Fixar proporções" -msgid "shortcuts.toggle-rules" -msgstr "Mostrar/ocultar réguas" - msgid "shortcuts.toggle-textpalette" msgstr "Mostrar/Esconder paleta de tipografias" @@ -2601,6 +2595,7 @@ msgstr "Mostrar interações ao clicar" msgid "viewer.header.sitemap" msgstr "Mapa do site" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "O último envio foi bem-sucedido." diff --git a/frontend/translations/pt_PT.po b/frontend/translations/pt_PT.po index da48c8ece..d68ee2f49 100644 --- a/frontend/translations/pt_PT.po +++ b/frontend/translations/pt_PT.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-20 23:07+0000\n" -"Last-Translator: TheScientistPT \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Portuguese (Portugal) " "\n" "Language: pt_PT\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -60,10 +60,6 @@ msgstr "Iniciar sessão" msgid "auth.login-submit" msgstr "Iniciar sessão" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Que bom voltar a ver-te!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "Github" @@ -1024,6 +1020,7 @@ msgstr "Erro de conexão, não foi possível alcançar o URL" msgid "errors.webhooks.invalid-uri" msgstr "O URL não passou na validação." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Último envio sem sucesso." @@ -3039,9 +3036,6 @@ msgstr "Bloquear selecionado" msgid "shortcuts.toggle-lock-size" msgstr "Bloquear proporções" -msgid "shortcuts.toggle-rules" -msgstr "Mostrar/ocultar regras" - msgid "shortcuts.toggle-textpalette" msgstr "Alternar paleta de texto" @@ -3206,6 +3200,7 @@ msgstr "Mostrar interações com click" msgid "viewer.header.sitemap" msgstr "Mapa do site" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Último envio com sucesso." diff --git a/frontend/translations/ro.po b/frontend/translations/ro.po index ee3aa0aa9..bd69468e9 100644 --- a/frontend/translations/ro.po +++ b/frontend/translations/ro.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-10-10 10:01+0000\n" -"Last-Translator: AlexTECPlayz \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Romanian " "\n" "Language: ro\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" -"X-Generator: Weblate 5.1-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -61,10 +61,6 @@ msgstr "Conectează-te" msgid "auth.login-submit" msgstr "Intră în cont" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Mă bucur să te văd din nou!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -1004,6 +1000,7 @@ msgstr "Eroare de conexiune, URL-ul nu poate fi accesat" msgid "errors.webhooks.invalid-uri" msgstr "URL-ul nu a trecut validarea." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Ultima livrare nu a avut succes." @@ -2974,9 +2971,6 @@ msgstr "Blocați selecția" msgid "shortcuts.toggle-lock-size" msgstr "Blocați proporțiile" -msgid "shortcuts.toggle-rules" -msgstr "Afișați/ascundeți rigle" - msgid "shortcuts.toggle-textpalette" msgstr "Comutați paleta de text" @@ -3138,6 +3132,7 @@ msgstr "Afişează interacţiunile la click" msgid "viewer.header.sitemap" msgstr "Harta site-ului" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Ultima livrare a fost cu succes." diff --git a/frontend/translations/ru.po b/frontend/translations/ru.po index f76e5ff25..8ec32ba61 100644 --- a/frontend/translations/ru.po +++ b/frontend/translations/ru.po @@ -58,10 +58,6 @@ msgstr "Войти здесь" msgid "auth.login-submit" msgstr "Вход" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Рады видеть Вас снова!" - #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -1999,9 +1995,6 @@ msgstr "Переключить историю" msgid "shortcuts.toggle-layers" msgstr "Переключить слои" -msgid "shortcuts.toggle-rules" -msgstr "Показать/скрыть линейки" - #: src/app/main/ui/dashboard/files.cljs msgid "title.dashboard.files" msgstr "%s - Penpot" diff --git a/frontend/translations/ta.po b/frontend/translations/ta.po index e3ab123eb..088fe8217 100644 --- a/frontend/translations/ta.po +++ b/frontend/translations/ta.po @@ -59,10 +59,6 @@ msgstr "இங்கே உள்நுழைக" msgid "auth.login-submit" msgstr "உள்நுழை" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "உங்களை மீண்டும் சந்திப்பதில் மகிழ்ச்சி!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" diff --git a/frontend/translations/tr.po b/frontend/translations/tr.po index 647a720bf..3430d1663 100644 --- a/frontend/translations/tr.po +++ b/frontend/translations/tr.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-10 15:02+0000\n" +"PO-Revision-Date: 2024-04-25 13:07+0000\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish " "\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -52,6 +52,10 @@ msgstr "Parolanı mı unuttun?" msgid "auth.fullname" msgstr "Tam Adın" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "Hesabımda oturum aç" + #: src/app/main/ui/auth/register.cljs msgid "auth.login-here" msgstr "Buradan oturum açın" @@ -61,8 +65,10 @@ msgid "auth.login-submit" msgstr "Oturum aç" #: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Seni tekrar görmek süper!" +msgid "auth.login-tagline" +msgstr "" +"Penpot, tasarım ve kod işbirliği için özgür ve açık kaynaklı tasarım " +"aracıdır" #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" @@ -855,6 +861,10 @@ msgstr "Tamam" msgid "ds.confirm-title" msgstr "Emin misin?" +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "Kimlik doğrulama sağlayıcısına bu profil için izin verilmiyor" + #: src/app/main/ui/auth/login.cljs msgid "errors.auth-provider-not-configured" msgstr "Kimlik doğrulama sağlayıcısı yapılandırılmadı." @@ -887,6 +897,10 @@ msgstr "E-posta zaten doğrulandı." msgid "errors.email-as-password" msgstr "E-postanızı parola olarak kullanamazsınız" +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "Etki alanına izin verilmiyor" + #: src/app/main/ui/auth/register.cljs, #: src/app/main/ui/auth/recovery_request.cljs, #: src/app/main/ui/settings/change_email.cljs, @@ -1773,6 +1787,12 @@ msgstr "Değişim" msgid "media.image" msgstr "Görsel" +msgid "media.image.short" +msgstr "görsel" + +msgid "media.keep-aspect-ratio" +msgstr "En boy oranını koru" + msgid "media.linear" msgstr "Doğrusal" @@ -2124,6 +2144,21 @@ msgstr "Bu takımdan ayrılmak istediğinden emin misin?" msgid "modals.leave-confirm.title" msgstr "Takımdan ayrıl" +msgid "modals.move-shared-confirm.accept" +msgid_plural "modals.move-shared-confirm.accept" +msgstr[0] "Taşı" +msgstr[1] "Taşı" + +msgid "modals.move-shared-confirm.message" +msgid_plural "modals.move-shared-confirm.message" +msgstr[0] "Bu kütüphaneyi taşımak istediğinizden emin misiniz?" +msgstr[1] "Bu kütüphaneleri taşımak istediğinizden emin misiniz?" + +msgid "modals.move-shared-confirm.title" +msgid_plural "modals.move-shared-confirm.title" +msgstr[0] "Kütüphaneyi taşı" +msgstr[1] "Kütüphaneleri taşı" + #: src/app/main/ui/workspace/nudge.cljs msgid "modals.nudge-title" msgstr "Dürtme miktarı" @@ -2404,6 +2439,9 @@ msgstr "Sınırsız üye" msgid "onboarding.team-modal.create-team-feature-5" msgstr "%100 özgür!" +msgid "onboarding.team-modal.team-definition" +msgstr "Takım nedir?" + msgid "onboarding.templates.subtitle" msgstr "İşte bazı şablonlar." @@ -2505,6 +2543,10 @@ msgstr "Pazarlama" msgid "questions.more-than-50" msgstr "50'den fazla" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-one" +msgstr "Hiçbiri" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.next" msgstr "Sonraki" @@ -2599,6 +2641,10 @@ msgstr "Çıkar" msgid "settings.multiple" msgstr "Karışık" +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs +msgid "settings.select-this-color" +msgstr "Bu biçimi kullanan ögeleri seç" + # SECTIONS msgid "shortcut-section.basics" msgstr "Temel bilgiler" @@ -2952,6 +2998,9 @@ msgstr "Yeniden yap" msgid "shortcuts.reset-zoom" msgstr "Yakınlaştırmayı sıfırla" +msgid "shortcuts.scale" +msgstr "Ölçeklendir" + msgid "shortcuts.search-placeholder" msgstr "Kısayolları ara" @@ -3025,6 +3074,9 @@ msgstr "Odak modunu değiştir" msgid "shortcuts.toggle-fullscreen" msgstr "Tam ekranı değiştir" +msgid "shortcuts.toggle-guides" +msgstr "Kılavuzları göster/gizle" + msgid "shortcuts.toggle-history" msgstr "Geçmişi değiştir" @@ -3034,15 +3086,24 @@ msgstr "Katmanları değiştir" msgid "shortcuts.toggle-layout-flex" msgstr "Düzen esnekliği ekle/kaldır" +msgid "shortcuts.toggle-layout-grid" +msgstr "Izgara düzeni ekle/kaldır" + msgid "shortcuts.toggle-lock" msgstr "Seçileni kilitle" msgid "shortcuts.toggle-lock-size" msgstr "Oranları kilitle" -msgid "shortcuts.toggle-rules" +msgid "shortcuts.toggle-rulers" msgstr "Cetvelleri göster/gizle" +msgid "shortcuts.toggle-snap-guides" +msgstr "Kılavuzlara tuttur" + +msgid "shortcuts.toggle-snap-ruler-guide" +msgstr "Cetvel kılavuzlarına tuttur" + msgid "shortcuts.toggle-textpalette" msgstr "Metin paletini değiştir" @@ -3287,6 +3348,10 @@ msgstr "Ana bileşeni çoğalt" msgid "workspace.assets.edit" msgstr "Düzenle" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.filter" +msgstr "Filtrele" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.graphics" @@ -3338,6 +3403,16 @@ msgstr[1] "%s öge seçildi" msgid "workspace.assets.shared-library" msgstr "Paylaşılan kütüphane" +#: src/app/main/ui/workspace/sidebar/assets/common.cljs +msgid "workspace.assets.sidebar.components" +msgid_plural "workspace.assets.sidebar.components" +msgstr[0] "1 bileşen" +msgstr[1] "%s bileşen" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "Sırala" + #: src/app/main/ui/workspace/sidebar/assets.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.typography" @@ -3463,6 +3538,10 @@ msgstr "Kılavuzlara tutturmayı devre dışı bırak" msgid "workspace.header.menu.disable-snap-pixel-grid" msgstr "Piksele tutturmayı devre dışı bırak" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-ruler-guides" +msgstr "Cetvel kılavuzlarına tutturmayı devre dışı bırak" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-dynamic-alignment" msgstr "Dinamik hizalamayı etkinleştir" @@ -3481,10 +3560,18 @@ msgstr "Kılavuzlara tuttur" msgid "workspace.header.menu.enable-snap-pixel-grid" msgstr "Piksele tutturmayı etkinleştir" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-ruler-guides" +msgstr "Cetvel kılavuzlarına tuttur" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-artboard-names" msgstr "Çalışma yüzeyi adlarını gizle" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-guides" +msgstr "Kılavuzları gizle" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "Renk paletini gizle" @@ -3531,6 +3618,10 @@ msgstr "Tümünü seç" msgid "workspace.header.menu.show-artboard-names" msgstr "Çalışma yüzeylerinin adlarını göster" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-guides" +msgstr "Kılavuzları göster" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Renk paletini göster" @@ -3609,6 +3700,9 @@ msgstr "Izgarayı düzenle" msgid "workspace.layout_grid.editor.options.exit" msgstr "Çıkış" +msgid "workspace.layout_grid.editor.padding.expand" +msgstr "4 taraflı dolgu seçeneklerini göster" + msgid "workspace.layout_grid.editor.title" msgstr "Düzenleme ızgarası" @@ -3618,6 +3712,9 @@ msgstr "Bitti" msgid "workspace.layout_grid.editor.top-bar.locate" msgstr "Bul" +msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" +msgstr "Izgara düzenini bul" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.add" msgstr "Ekle" @@ -3712,6 +3809,10 @@ msgstr "Paylaşılmış kütüphane ara" msgid "workspace.libraries.shared-libraries" msgstr "PAYLAŞILMIŞ KÜTÜPHANELER" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.shared-library-btn" +msgstr "Kütüphaneyi bağla" + #: src/app/main/ui/workspace/sidebar/options/menus/text.cljs msgid "workspace.libraries.text.multiple-typography" msgstr "Çoklu tipografiler" @@ -3724,6 +3825,10 @@ msgstr "Tüm tipografileri ayır" msgid "workspace.libraries.typography" msgstr "%s tipografi" +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.unlink-library-btn" +msgstr "Kütüphanenin bağlantısını kes" + #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.update" msgstr "Güncelle" @@ -4886,6 +4991,10 @@ msgstr "Yol" msgid "workspace.shape.menu.remove-flex" msgstr "Düzen esnekliğini kaldır" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-grid" +msgstr "Izgara düzenini kaldır" + #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, #: src/app/main/ui/workspace/context_menu.cljs, #: src/app/main/ui/workspace/context_menu.cljs @@ -5059,6 +5168,10 @@ msgstr "**İnceleme modu** (Yalnızca görüntüle)" msgid "workspace.top-bar.read-only.done" msgstr "Bitti" +#, markdown +msgid "workspace.top-bar.view-only" +msgstr "**Kodu incele** ( Yalnızca Görüntüle)" + #: src/app/main/ui/workspace/sidebar/history.cljs msgid "workspace.undo.empty" msgstr "Şu ana kadar değişim geçmişi yok" diff --git a/frontend/translations/ukr_UA.po b/frontend/translations/ukr_UA.po index 75c2e4e1c..7840000e3 100644 --- a/frontend/translations/ukr_UA.po +++ b/frontend/translations/ukr_UA.po @@ -36,10 +36,6 @@ msgstr "Ввійдіть тут" msgid "auth.login-submit" msgstr "Вхід" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Раді бачити Вас знову!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" diff --git a/frontend/translations/yo.po b/frontend/translations/yo.po index 6a9b82b11..183625c52 100644 --- a/frontend/translations/yo.po +++ b/frontend/translations/yo.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-14 08:02+0000\n" -"Last-Translator: Alejandro Alonso \n" +"PO-Revision-Date: 2024-04-24 13:04+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Yoruba " "\n" "Language: yo\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.check-your-email" @@ -55,10 +55,6 @@ msgstr "wọlé síbí" msgid "auth.login-submit" msgstr "wọlé" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "ó dára láti rí ẹ lẹ́ẹ̀kan sí i!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "ibùdó gítì" @@ -893,6 +889,7 @@ msgstr "Àsìṣe nínú ètò ìsopọ̀, kò lè dé ibi URL" msgid "errors.webhooks.invalid-uri" msgstr "URL kò páásì ìfọwọ́sí." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Èyí tí a fijíṣẹ́ kẹ́yìn kò dára." @@ -950,6 +947,7 @@ msgid "feedback.title" msgstr "Ímeèlì" #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-go-to" msgstr "Lọ sí Tíwítà" @@ -958,6 +956,7 @@ msgid "feedback.twitter-subtitle1" msgstr "A wà níbí láti ṣe ìrànlọ́wọ́ fún àwọn ìbéèrè tó bá wà lórí iṣẹ́ ọnà." #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-title" msgstr "Àkáùnti àtìlẹ́yìn fún Tíwítà" @@ -2210,10 +2209,6 @@ msgstr "Títajà" msgid "questions.more-than-50" msgstr "Ju àádọ́ta lọ" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.never-used-a-tool" -msgstr "N kò tí lo irin iṣẹ́ eto ọnà tẹ́lẹ̀ rí" - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.next" msgstr "Èyí tó kàn" @@ -2686,9 +2681,6 @@ msgstr "Yi ipo idojukọ pada" msgid "shortcuts.toggle-fullscreen" msgstr "Yi kuro ni fulscrin" -msgid "shortcuts.toggle-grid" -msgstr "Fihan / Tọju ilana" - msgid "shortcuts.toggle-layers" msgstr "Yi awon pelebe yii pada" @@ -2698,15 +2690,6 @@ msgstr "Tiipa / Siilẹ" msgid "shortcuts.toggle-lock-size" msgstr "títìipa lápàkàn" -msgid "shortcuts.toggle-rules" -msgstr "Fifihan / Titọju ólórì" - -msgid "shortcuts.toggle-scale-text" -msgstr "Yipada asekale ọrọ" - -msgid "shortcuts.toggle-snap-guide" -msgstr "Pín si awọ́n ítọ̀nisọ́nà" - msgid "shortcuts.toggle-textpalette" msgstr "Yíípàda ọrọ paleti" @@ -3024,10 +3007,6 @@ msgstr "Pa asèkalẹ̀ iwọnbà" msgid "workspace.header.menu.disable-scale-text" msgstr "Pa ọrọ iwọnba" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "Pa yipada si ilana" - msgid "workspace.header.menu.disable-snap-pixel-grid" msgstr "Pa yipada si piseli" @@ -3042,10 +3021,6 @@ msgstr "Tan asèkalẹ̀ iwọnbà" msgid "workspace.header.menu.enable-scale-text" msgstr "Tan iwọnbà ọrọ" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "Yipada si ilana" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-guides" msgstr "Yipada si itọ̀nìsọna" @@ -3053,10 +3028,6 @@ msgstr "Yipada si itọ̀nìsọna" msgid "workspace.header.menu.enable-snap-pixel-grid" msgstr "Tan Yipada si piseli" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-grid" -msgstr "Tọ̀jú ilana" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "Tọ̀jú awọ palẹti" @@ -3099,10 +3070,6 @@ msgstr "Tun ṣe" msgid "workspace.header.menu.select-all" msgstr "Sa gbogbo rẹ" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "ifihan akoj" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Fi awo paleti han" diff --git a/frontend/translations/zh_CN.po b/frontend/translations/zh_CN.po index 247639c11..924cd4593 100644 --- a/frontend/translations/zh_CN.po +++ b/frontend/translations/zh_CN.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-01-12 23:06+0000\n" -"Last-Translator: Geek Squirrel \n" +"PO-Revision-Date: 2024-04-24 13:04+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Chinese (Simplified) " "\n" "Language: zh_CN\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -56,10 +56,6 @@ msgstr "在这里登录" msgid "auth.login-submit" msgstr "登录" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "很高兴又见到你!" - #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub登录" @@ -969,6 +965,7 @@ msgstr "连接错误,无法访问 URL" msgid "errors.webhooks.invalid-uri" msgstr "网址未通过验证。" +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "上次交付不成功。" @@ -1021,6 +1018,7 @@ msgid "feedback.title" msgstr "电子邮件" #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-go-to" msgstr "前往Twtter" @@ -1029,6 +1027,7 @@ msgid "feedback.twitter-subtitle1" msgstr "这里可以帮助您解决技术问题。" #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-title" msgstr "Twtter支持帐号" @@ -2882,9 +2881,6 @@ msgstr "锁定所选" msgid "shortcuts.toggle-lock-size" msgstr "锁定比例" -msgid "shortcuts.toggle-rules" -msgstr "显示/隐藏规则" - msgid "shortcuts.toggle-textpalette" msgstr "切换文本调色板" @@ -3044,6 +3040,7 @@ msgstr "点击时显示交互" msgid "viewer.header.sitemap" msgstr "站点地图" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "上次交付成功。" diff --git a/frontend/translations/zh_Hant.po b/frontend/translations/zh_Hant.po index ad1fe9a14..5f14d51cb 100644 --- a/frontend/translations/zh_Hant.po +++ b/frontend/translations/zh_Hant.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2023-02-04 11:38+0000\n" -"Last-Translator: im424 <424@live.hk>\n" +"PO-Revision-Date: 2024-04-24 13:04+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Chinese (Traditional) " "\n" "Language: zh_Hant\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.16-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -55,10 +55,6 @@ msgstr "在此登入" msgid "auth.login-submit" msgstr "登入" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "很高興再次見到你!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -794,6 +790,7 @@ msgstr "連線錯誤,無法接上網址" msgid "errors.webhooks.invalid-uri" msgstr "網址未能通過驗証。" +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "上一次傳送未能成功。" @@ -1596,9 +1593,6 @@ msgstr "鎖定選擇" msgid "shortcuts.toggle-lock-size" msgstr "鎖定比例" -msgid "shortcuts.toggle-rules" -msgstr "顯示/隱藏尺規" - msgid "shortcuts.ungroup" msgstr "取消群組" -- Gitee From 2166435a52795736fca81b9ce2ffad6d68fc1a19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Fri, 9 Feb 2024 16:33:44 +0000 Subject: [PATCH 0414/1266] :globe_with_meridians: Add translations for: Turkish. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/ --- frontend/translations/tr.po | 748 +++++++++++++++++++++++++++++++++++- 1 file changed, 747 insertions(+), 1 deletion(-) diff --git a/frontend/translations/tr.po b/frontend/translations/tr.po index 3430d1663..dff0162e9 100644 --- a/frontend/translations/tr.po +++ b/frontend/translations/tr.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-25 13:07+0000\n" +"PO-Revision-Date: 2024-02-10 15:02+0000\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish " "\n" @@ -5363,3 +5363,749 @@ msgstr "Yolu kapatmak için tıklayın" #~ msgid "workspace.options.layout-item.title.min-w" #~ msgstr "Asgari genişlik" + +msgid "shortcuts.bold" +msgstr "Kalın yazı aç/kapat" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Penpot'u fiziksel bir sunucuda kullanmadan önce deneyin" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Konsept fikirler üzerinde çalışmak" + +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "Kütüphanenizde henüz renk stili yok" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "30 gün" + +msgid "workspace.options.component.copy" +msgstr "Kopyala" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Geri bildiriminiz, Penpot'u kullanışlı ve eğlenceli bir araç haline " +"getirmeye devam edebilmemiz için alışkanlıklarınızı ve tercihlerinizi " +"anlamamıza yardımcı olacaktır." + +msgid "modals.invite-member.repeated-invitation" +msgstr "" +"Bazı e-posta adresleri mevcut takım üyelerine aittir. Davetleri " +"gönderilmeyecektir." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Geliştirici" + +msgid "shortcuts.align-justify" +msgstr "İki yana yasla" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Ürün veya Proje yöneticisi" + +msgid "workspace.options.component.create-annotation" +msgstr "Bir açıklama oluştur" + +#, markdown +msgid "dashboard.fonts.warning-text" +msgstr "" +"İşletim sistemlerinin farklı dikey metriklerine ilişkin olarak yazı " +"tiplerinizde olası bir sorun tespit ettik. Bu durumu kontrol etmek için [" +"bunun gibi](https://vertical-metrics.netlify.app/) yazı tipi dikey metrik " +"hizmetlerini kullanabilirsiniz. Ayrıca web yazı tipleri oluşturmak ve " +"hataları düzeltmek için [Transfonter](https://transfonter.org/) kullanmanızı " +"öneririz. " + +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "Yeni bir sürüm mevcut, lütfen sayfayı yenileyin" + +msgid "modals.delete-component-annotation.message" +msgstr "Bu açıklamayı silmek istediğinize emin misiniz?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Pazarlama" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "180 gün" + +msgid "workspace.options.component.edit-annotation" +msgstr "Bir açıklamayı düzenle" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Takım projemin kodunu al " + +msgid "workspace.shape.menu.create-multiple-components" +msgstr "Çoklu bileşen oluştur" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "Kendi projem üzerinde çalışıyorum" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Dikdörtgen" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "İsim gereklidir" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.scd-message" +msgid_plural "modals.delete-shared-confirm.activated.scd-message" +msgstr[0] "Bu kütüphane burada etkinleştirildi: " +msgstr[1] "Bu kütüphaneler burada etkinleştirildiler: " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Serbest çalışıyorum" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.copied-success" +msgstr "Belirteç kopyalandı" + +msgid "modals.publish-empty-library.title" +msgstr "Boş kütüphaneyi yayınla" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "tüm değişiklikleri gör" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...marka çalışması, çizimler, pazarlama materyalleri, vb." + +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "Kütüphanenizde henüz tipografi stili yok" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "90 gün" + +msgid "shortcuts.zoom-lense-increase" +msgstr "Görüntüyü büyült" + +msgid "workspace.shape.menu.add-grid" +msgstr "Izgara düzeni ekle" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "" +"Bu dosyada daha önce kullanılmış olan varlıklar orada kalmaya devam edecek (" +"hiçbir tasarım bozulmayacak)." +msgstr[1] "" +"Bu dosyalarda daha önce kullanılmış olan varlıklar orada kalmaya devam " +"edecek (hiçbir tasarım bozulmayacak)." + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "Yakınlaştırma" + +msgid "workspace.options.component.annotation" +msgstr "Açıklama" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Biraz" + +msgid "shortcuts.text-align-justify" +msgstr "İki yana yasla" + +msgid "workspace.layout_grid.editor.title" +msgstr "Düzenleme ızgarası" + +#: src/app/main/ui/dashboard/team.cljs +msgid "team.webhooks.max-length" +msgstr "Webhook adı en fazla 2048 karakter içermelidir." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "%s tarihinde sona erdi" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.expiration-date.label" +msgstr "Sona erme tarihi" + +msgid "workspace.header.menu.undo" +msgstr "Geri al" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "50'den fazla" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-weight" +msgstr "Yazı Tipi Kalınlığı" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "Parola boşluk dışında bir karakter içermelidir." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Sonraki" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "Takımınızın büyüklüğü nedir?" + +msgid "shortcuts.toggle-visibility" +msgstr "Göster / Gizle" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "" +"... taslak çizimler, kullanıcı deneyimi yol haritası ve akışları, gezinme " +"menüsü, vb." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "60 gün" + +msgid "workspace.header.menu.disable-scale-content" +msgstr "Orantılı ölçeklendirmeyi devre dışı bırak" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "Çok fazla" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Başla" + +msgid "shortcuts.align-center" +msgstr "Ortala" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Elmas" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Penpot'u nasıl kullanmayı planlıyorsunuz?" + +msgid "workspace.header.menu.redo" +msgstr "Tekrarla" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "... üzerinde çalışma deneyiminizi en iyi nasıl tarif edersiniz?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Bir seçenek belirleyin" + +msgid "shortcuts.text-align-left" +msgstr "Sola hizala" + +msgid "shortcuts.font-size-dec" +msgstr "Yazı boyutunu azalt" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Tasarımcı" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Hiçbiri" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "Haydi başlayalım!" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Çıkar" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Sketch" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library-updates" +msgstr "KÜTÜPHANE GÜNCELLEMELERİ" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Üçgen" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "İsim" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "Hiçbir dosyada etkinleştirilmedi." +msgstr[1] "Hiçbir dosyada etkinleştirilmediler." + +msgid "modals.publish-empty-library.message" +msgstr "Kütüphaneniz boş. Yine de yayınlamak istediğinizden emin misiniz?" + +msgid "workspace.assets.open-library" +msgstr "Kütüphane dosyasını aç" + +msgid "modals.delete-component-annotation.title" +msgstr "Açıklamayı sil" + +msgid "shortcuts.select-parent-layer" +msgstr "Ana katmanı seç" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "Paylaşılan kütüphane" + +msgid "shortcuts.select-next" +msgstr "Sonraki katmanı seç" + +msgid "workspace.header.menu.enable-scale-content" +msgstr "Orantılı ölçeklendirmeyi etkinleştir" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "Daha fazla bilgi" + +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "İsim boşluk dışında bir karakter içermelidir." + +msgid "shortcuts.line-height-inc" +msgstr "Satır yüksekliğini artır" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Diğer (lütfen belirtiniz)" + +msgid "labels.discard" +msgstr "At" + +msgid "shortcuts.font-size-inc" +msgstr "Yazı boyutunu artır" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Penpot'un takımınız için uygun olup olmadığını görmek için test edin " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Öğrenci veya öğretmen" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Takımımın projesi için geri bildirim bırakın" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "InVision" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canva" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "Penpot'u daha fazla keşfedin" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "%s tarihinde sona eriyor" + +msgid "shortcuts.italic" +msgstr "İtalik yazı aç/kapat" + +msgid "shortcuts.letter-spacing-dec" +msgstr "Harf aralığını azalt" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "Önceki" + +msgid "workspace.shape.menu.create-annotation" +msgstr "Açıklama oluştur" + +msgid "shortcuts.letter-spacing-inc" +msgstr "Harf aralığını artır" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Projem üzerinde çalışmaya başla" + +msgid "shortcuts.text-align-center" +msgstr "Ortaya hizala" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Ok" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "Hangi tasarım aracını daha iyi kullanıyorsunuz?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Göreviniz nedir?" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Kütüphaneniz boş. Paylaşılan Kütüphane olarak eklendiğinde, oluşturduğunuz " +"varlıklar diğer dosyalarınız arasında kullanılabilir olacak. Yayınlamak " +"istediğinizden emin misiniz?" + +msgid "shortcuts.text-align-right" +msgstr "Sağa hizala" + +msgid "shortcuts.underline" +msgstr "Alt çizgiyi aç/kapat" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "Asla" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Kurucu/Başkan Yardımcısı" + +msgid "modals.publish-empty-library.accept" +msgstr "Yayınla" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.no-expiration" +msgstr "Süresiz" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "İsim en fazla 250 karakter içermelidir." + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Daire" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" + +msgid "shortcut-subsection.text-editor" +msgstr "Metinler" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... kullanıcı arayüzü tasarımı, görsel öğeler, tasarım sistemleri, vb." + +msgid "shortcuts.zoom-lense-decrease" +msgstr "Görüntüyü küçült" + +msgid "shortcuts.line-height-dec" +msgstr "Satır yüksekliğini azalt" + +msgid "shortcuts.select-prev" +msgstr "Önceki katmanı seç" + +msgid "shortcuts.line-through" +msgstr "Üstü çizili yazı aç/kapat" + +msgid "errors.cannot-upload" +msgstr "Medya dosyası yüklenemedi." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.message" +msgstr "Bu belirteci silmek istediğinizden emin misiniz?" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "Erişim belirteçleri" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "Belirtecin sona erme tarihi yok" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "Yeni belirteç oluştur" + +msgid "workspace.options.component.main" +msgstr "Ana bileşen" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "Belirtecin süresi %s tarihinde sona erecek" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "Belirteci sil" + +msgid "workspace.assets.duplicate-main" +msgstr "Ana bileşeni çoğalt" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "Belirteç oluştur" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.placeholder" +msgstr "Adı, belirtecin ne için olduğunu bilmenize yardımcı olabilir" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "Şu ana kadar hiç belirteciniz yok." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"Kişisel erişim belirteçleri, oturum açma/parola kimlik doğrulama sistemimize " +"alternatif olarak işlev görür ve bir uygulamanın dahili Penpot API'sine " +"erişmesine izin vermek için kullanılabilir" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "Kişisel erişim belirteçleri" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "Bir belirteç oluşturmak için \"Yeni belirteç oluştur\" düğmesine basın." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "Belirteci sil" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "Erişim belirteci başarıyla oluşturuldu." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "Erişim belirteci oluştur" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.copy-token" +msgstr "Belirteci kopyala" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "Profil - Erişim belirteçleri" + +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Bir hesap oluştururken, [koşullarımızı](%s) ve [gizlilik politikamızı](%s) " +"kabul etmiş sayılırsınız." + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-delete-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "Dosyanız başarıyla silindi" +msgstr[1] "Dosyalarınız başarıyla silindi" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Dosyanın uyumsuz bir sürüm numarası var" + +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Etkinleştirilen özellikler ile açmaya çalıştığınız dosyanın özellikleri " +"arasında bir uyumsuzluk var gibi görünüyor. Dosyanın açılabilmesi için önce " +"'%s' için geçişlerin uygulanması gerekiyor." + +msgid "errors.validation" +msgstr "Doğrulama Hatası" + +msgid "errors.paste-data-validation" +msgstr "Panoda geçersiz veri" + +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Ayarlanmadı" + +msgid "labels.share" +msgstr "Paylaş" + +msgid "labels.search" +msgstr "Ara" + +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Takım olmadan başlayın" + +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Takım oluşturmaya devam edin" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Daha sonra bir takım oluşturabileceksiniz." + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Takım olmadan devam edin" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Takım oluşturun ve davet gönderin" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Davet etmeden takım oluşturun" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Takım oluşturun ve davet edin" + +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Takım oluşturun" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Daha sonra davet edebileceksiniz" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Bul" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Bitti" + +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Izgarayı düzenle" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Çıkış" + +msgid "workspace.options.component.swap" +msgstr "Bileşeni değiştir" + +msgid "workspace.options.component.swap.empty" +msgstr "Bu kütüphanede henüz varlık yok" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Akış" + +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**İnceleme modu** (Yalnızca görüntüle)" + +msgid "workspace.top-bar.read-only.done" +msgstr "Bitti" + +msgid "media.image" +msgstr "Görsel" + +msgid "media.solid" +msgstr "Katı" + +msgid "media.linear" +msgstr "Doğrusal" + +msgid "media.radial" +msgstr "Işınsal" + +msgid "media.gradient" +msgstr "Değişim" + +msgid "media.choose-image" +msgstr "Görsel seç" + +msgid "workspace.options.guides.title" +msgstr "Kılavuzlar" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.accept" +msgid_plural "modals.unpublish-shared-confirm.accept" +msgstr[0] "Yayından kaldır" +msgstr[1] "Yayından kaldır" + +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "1 dosya başarıyla içeri aktarıldı." +msgstr[1] "%s dosya başarıyla içeri aktarıldı." + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-duplicate-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "Dosyanız başarıyla kopyalandı" +msgstr[1] "Dosyalarınız başarıyla kopyalandı" + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Uyumsuz '%s' özelliği algılandı" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export-object" +msgid_plural "workspace.options.export-object" +msgstr[0] "1 ögeyi dışa aktar" +msgstr[1] "%s ögeyi dışa aktar" + +msgid "shortcuts.toggle-theme" +msgstr "Temayı değiştir" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "Açık temaya geç" + +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Koyu temaya geç" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Yükleniyor…" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Sola 1 sütun ekle" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Sağa 1 sütun ekle" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Sütunu sil" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Sütun ve şekilleri sil" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Yinelenen satır" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Satırı sil" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Hücreleri birleştir" + +msgid "workspace.context-menu.grid-cells.area" +msgstr "Alan oluştur" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Çalışma yüzeyi oluştur" + +msgid "dashboard.import.analyze-error.components-v2" +msgstr "" +"Bileşenler v2 ile dosya etkinleştirildi ancak bu takım henüz bunu " +"desteklemiyor." + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Yinelenen sütun" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Yukarıya 1 satır ekle" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Aşağıya 1 satır ekle" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Satır ve şekilleri sil" -- Gitee From dc53c60db6578c4395f4e4f9bd85390dc3fd1ba9 Mon Sep 17 00:00:00 2001 From: Revenant Date: Fri, 9 Feb 2024 14:51:25 +0000 Subject: [PATCH 0415/1266] :globe_with_meridians: Add translations for: Malay. Currently translated at 52.0% (709 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ms/ --- frontend/translations/ms.po | 1482 ++++++++++++++++++----------------- 1 file changed, 747 insertions(+), 735 deletions(-) diff --git a/frontend/translations/ms.po b/frontend/translations/ms.po index fb10f5529..4527b9121 100644 --- a/frontend/translations/ms.po +++ b/frontend/translations/ms.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-24 12:55+0000\n" -"Last-Translator: Anonymous \n" -"Language-Team: Malay " -"\n" +"PO-Revision-Date: 2024-02-10 15:02+0000\n" +"Last-Translator: Revenant \n" +"Language-Team: Malay \n" "Language: ms\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -413,194 +413,9 @@ msgstr "Eksport papan sebagai PDF" msgid "dashboard.export-frames.title" msgstr "Eksport sebagai PDF" -msgid "dashboard.export-multi" -msgstr "Eksport fail Penpot %s" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-multiple.selected" -msgstr "%s daripada %s elemen dipilih" - -#: src/app/main/ui/workspace/header.cljs -msgid "dashboard.export-shapes" -msgstr "Eksport" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to" -msgstr "" -"Anda boleh menambah tetapan eksport ke elemen daripada sifat reka bentuk " -"(di bahagian bawah bar sisi kanan)." - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to-link" -msgstr "Maklumat cara untuk menetapkan eksport di Penpot." - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.no-elements" -msgstr "Tiada unsur dengan tetapan eksport." - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.title" -msgstr "Eksport Pemilihan" - -msgid "dashboard.export-standard-multi" -msgstr "Muat turun %s fail standard (.svg + .json)" - -msgid "dashboard.export.detail" -msgstr "* Mungkin termasuk komponen, grafik, warna dan/atau tipografi." - -msgid "dashboard.export.explain" -msgstr "" -"Satu atau lebih fail yang anda ingin eksport menggunakan perpustakaan " -"kongsi. Apa yang anda mahu lakukan dengan aset mereka*?" - -msgid "dashboard.export.options.all.message" -msgstr "" -"fail dengan perpustakaan kongsi akan disertakan dalam eksport, mengekalkan " -"hubungannya." - -msgid "dashboard.export.options.all.title" -msgstr "Eksport perpustakaan kongsi" - -msgid "dashboard.export.options.detach.message" -msgstr "" -"Perpustakaan kongsi tidak akan disertakan dalam eksport dan tiada aset akan " -"ditambahkan ke perpustakaan. " - -msgid "dashboard.export.options.detach.title" -msgstr "Anggap aset perpustakaan kongsi sebagai objek asas" - -msgid "dashboard.export.options.merge.message" -msgstr "" -"Fail anda akan dieksport dengan semua aset luaran digabungkan ke dalam " -"pustaka fail." - -msgid "dashboard.export.options.merge.title" -msgstr "Sertakan aset perpustakaan kongsi dalam pustaka fail" - -msgid "dashboard.export.title" -msgstr "Eksport fail" - -msgid "dashboard.fonts.deleted-placeholder" -msgstr "Fon hilang" - -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.dismiss-all" -msgstr "Tolak semua" - -msgid "dashboard.fonts.empty-placeholder" -msgstr "Fon tersuai yang anda muat naik akan dipaparkan di sini." - -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.fonts-added" -msgid_plural "dashboard.fonts.fonts-added" -msgstr[0] "%s fon ditambah" - -#, markdown -msgid "dashboard.fonts.hero-text1" -msgstr "" -"Sebarang fon web yang anda muat naik di sini akan ditambahkan pada senarai " -"keluarga fon yang tersedia pada sifat teks fail pasukan ini. Fon dengan " -"nama keluarga fon yang sama akan dikumpulkan sebagai **keluarga fon " -"tunggal**. Anda boleh memuat naik fon dengan format berikut: **TTF, OTF dan " -"WOFF** (hanya satu sahaja diperlukan)." - -#, markdown -msgid "dashboard.fonts.hero-text2" -msgstr "" -"Anda hanya perlu memuat naik fon yang anda miliki atau mempunyai lesen " -"untuk digunakan dalam Penpot. Ketahui lebih lanjut dalam bahagian Hak " -"kandungan [Syarat Perkhidmatan Penpot](https://penpot.app/terms.html). Anda " -"juga mungkin ingin membaca tentang [pelesenan " -"fon](https://www.typography.com/faq)." - -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.upload-all" -msgstr "Muat naik semua" - -#, markdown -msgid "dashboard.fonts.warning-text" -msgstr "" -"Kami telah mengesan kemungkinan masalah dalam fon anda yang berkaitan " -"dengan metrik menegak untuk sistem pengendalian yang berbeza. Untuk " -"menyemaknya, anda boleh menggunakan perkhidmatan metrik menegak fon seperti " -"[ini](https://vertical-metrics.netlify.app/). Selain itu, kami mengesyorkan " -"menggunakan [Transfonter](https://transfonter.org/) untuk menjana fon web " -"dan membetulkan ralat. " - -msgid "dashboard.import" -msgstr "Import fail Penpot" - -msgid "dashboard.import.analyze-error" -msgstr "Alamak! Kami tidak dapat mengimport fail ini" - -msgid "dashboard.import.analyze-error.components-v2" -msgstr "" -"Fail dengan komponen v2 diaktifkan tetapi pasukan ini belum menyokongnya " -"lagi." - -msgid "dashboard.import.import-error" -msgstr "Terdapat masalah mengimport fail. Fail tidak diimport." - -msgid "dashboard.import.import-message" -msgid_plural "dashboard.import.import-message" -msgstr[0] "%s fail telah berjaya diimport." - -msgid "dashboard.import.import-warning" -msgstr "Sesetengah fail mengandungi objek tidak sah telah dialih keluar." - -msgid "dashboard.import.progress.process-colors" -msgstr "memproses warna" - -msgid "dashboard.import.progress.process-components" -msgstr "Memproses komponen" - -msgid "dashboard.import.progress.process-media" -msgstr "Memproses media" - -msgid "dashboard.import.progress.process-page" -msgstr "Memproses halaman: %s" - -msgid "dashboard.import.progress.process-typographies" -msgstr "Memproses tipografi" - -msgid "dashboard.import.progress.upload-data" -msgstr "Memuat naik data ke pelayan (%s/%s)" - -msgid "dashboard.import.progress.upload-media" -msgstr "Memuat naik fail: %s" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.invite-profile" -msgstr "Jemput orang ramai" - -#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.leave-team" -msgstr "Tinggalkan pasukan" - -msgid "dashboard.libraries-and-templates" -msgstr "Perpustakaan & Templat" - -msgid "dashboard.libraries-and-templates.explore" -msgstr "Terokai lebih banyak daripada mereka dan ketahui cara untuk menyumbang" - -msgid "dashboard.libraries-and-templates.import-error" -msgstr "Terdapat masalah mengimport templat. Templat tidak diimport." - -#: src/app/main/ui/dashboard/libraries.cljs -msgid "dashboard.libraries-title" -msgstr "Perpustakaan" - -#: src/app/main/ui/dashboard/grid.cljs -msgid "dashboard.loading-files" -msgstr "memuatkan fail anda…" - msgid "dashboard.loading-fonts" msgstr "memuatkan fon anda…" -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to" -msgstr "Berpindah ke" - #: src/app/main/ui/dashboard/file_menu.cljs msgid "dashboard.move-to-multi" msgstr "Pindahkan fail %s ke" @@ -629,18 +444,6 @@ msgstr "Projek Baharu" msgid "dashboard.no-matches-for" msgstr "Tiada padanan ditemui untuk \"%s\"" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.no-projects-placeholder" -msgstr "Projek yang disemat akan muncul di sini" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "dashboard.notifications.email-changed-successfully" -msgstr "Alamat e-mel anda telah berjaya dikemas kini" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "dashboard.notifications.email-verified-successfully" -msgstr "Alamat e-mel anda telah berjaya disahkan" - #: src/app/main/ui/settings/password.cljs msgid "dashboard.notifications.password-saved" msgstr "Kata laluan berjaya disimpan!" @@ -660,38 +463,6 @@ msgstr "Pilihan" msgid "dashboard.password-change" msgstr "Tukar kata laluan" -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.pin-unpin" -msgstr "Semat/Nyahsemat" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dashboard.projects-title" -msgstr "Projek" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.remove-account" -msgstr "Mahu mengalih keluar akaun anda?" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.remove-shared" -msgstr "Alih keluar sebagai Pustaka Dikongsi" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.save-settings" -msgstr "Simpan tetapan" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.search-placeholder" -msgstr "Cari…" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.searching-for" -msgstr "Mencari \"%s\"…" - -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.select-ui-language" -msgstr "Pilih Bahasa UI" - #: src/app/main/ui/settings/options.cljs msgid "dashboard.select-ui-theme" msgstr "Pilih tema" @@ -783,85 +554,30 @@ msgstr "" "dimaklumkan apabila acara tertentu berlaku di Penpot. Kami akan menghantar " "permintaan POST ke setiap URL yang anda berikan." -msgid "dashboard.webhooks.empty.add-one" -msgstr "Tekan butang \"Tambah webhook\" untuk menambahnya." - -msgid "dashboard.webhooks.empty.no-webhooks" -msgstr "Tiada webhook dibuat setakat ini." - -msgid "dashboard.webhooks.update.success" -msgstr "Webhook berjaya dikemas kini." - #: src/app/main/ui/settings.cljs msgid "dashboard.your-account-title" msgstr "Akaun anda" -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.your-email" -msgstr "E-mel" +msgid "errors.bad-font" +msgstr "Fon %s tidak dapat dimuatkan" -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.your-name" -msgstr "Nama anda" +msgid "errors.cannot-upload" +msgstr "Tidak boleh memuat naik fail media." -#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.your-penpot" -msgstr "Penpot anda" +#: src/app/main/data/workspace.cljs +msgid "errors.clipboard-not-implemented" +msgstr "Pelayar anda tidak dapat melakukan operasi ini" -#: src/app/main/ui/alert.cljs -msgid "ds.alert-ok" -msgstr "Ok" +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs +msgid "errors.email-already-exists" +msgstr "E-mel sudah digunakan" -#: src/app/main/ui/alert.cljs -msgid "ds.alert-title" -msgstr "Perhatian" +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.email-already-validated" +msgstr "E-mel sudah disahkan." -#: src/app/main/ui/confirm.cljs -msgid "ds.component-subtitle" -msgstr "Komponen untuk dikemas kini:" - -#: src/app/main/ui/confirm.cljs -msgid "ds.confirm-cancel" -msgstr "Batal" - -#: src/app/main/ui/confirm.cljs -msgid "ds.confirm-ok" -msgstr "Ok" - -#: src/app/main/ui/confirm.cljs, src/app/main/ui/confirm.cljs -msgid "ds.confirm-title" -msgstr "Adakah anda pasti?" - -#: src/app/main/ui/auth/login.cljs -msgid "errors.auth-provider-not-configured" -msgstr "Pembekal pengesahan tidak dikonfigurasikan." - -msgid "errors.auth.unable-to-login" -msgstr "Nampaknya anda belum disahkan atau sesi telah tamat tempoh." - -msgid "errors.bad-font" -msgstr "Fon %s tidak dapat dimuatkan" - -msgid "errors.bad-font-plural" -msgstr "Fon %s tidak dapat dimuatkan" - -msgid "errors.cannot-upload" -msgstr "Tidak boleh memuat naik fail media." - -#: src/app/main/data/workspace.cljs -msgid "errors.clipboard-not-implemented" -msgstr "Pelayar anda tidak dapat melakukan operasi ini" - -#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs -msgid "errors.email-already-exists" -msgstr "E-mel sudah digunakan" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.email-already-validated" -msgstr "E-mel sudah disahkan." - -msgid "errors.email-as-password" -msgstr "Anda tidak boleh menggunakan e-mel sebagai kata laluan" +msgid "errors.email-as-password" +msgstr "Anda tidak boleh menggunakan e-mel sebagai kata laluan" #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.email-has-permanent-bounces" @@ -885,8 +601,8 @@ msgstr "" "penpot semasa tidak menyokongnya atau menyahdayakannya." #: src/app/main/errors.cljs -msgid "errors.feature-not-supported" -msgstr "Ciri '%s' tidak disokong." +msgid "errors.version-not-supported" +msgstr "Fail mempunyai nombor versi yang tidak serasi" #: src/app/main/errors.cljs msgid "errors.file-feature-mismatch" @@ -895,6 +611,14 @@ msgstr "" "yang anda cuba buka. Migrasi untuk '%s' perlu digunakan sebelum fail boleh " "dibuka." +#: src/app/main/errors.cljs +msgid "errors.feature-not-supported" +msgstr "Ciri '%s' tidak disokong." + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Ciri tidak serasi '%s' dikesan" + #: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" msgstr "Sesuatu yang tidak kena telah berlaku." @@ -944,9 +668,6 @@ msgstr "Kata laluan pengesahan mesti sepadan" msgid "errors.password-too-short" msgstr "Kata laluan hendaklah sekurang-kurangnya 8 aksara" -msgid "errors.paste-data-validation" -msgstr "Data tidak sah dalam papan klip" - msgid "errors.profile-blocked" msgstr "Profil disekat" @@ -960,10 +681,6 @@ msgstr "" msgid "errors.registration-disabled" msgstr "Pendaftaran dilumpuhkan pada masa ini." -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Ciri tidak serasi '%s' dikesan" - msgid "errors.team-leave.insufficient-members" msgstr "" "Ahli tidak mencukupi untuk meninggalkan pasukan, anda mungkin mahu " @@ -981,33 +698,18 @@ msgstr "" msgid "errors.unexpected-error" msgstr "Ralat yang tidak dijangka berlaku." -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.unexpected-token" -msgstr "Token tidak diketahui" - -msgid "errors.validation" -msgstr "Ralat Pengesahan" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Fail mempunyai nombor versi yang tidak serasi" - msgid "errors.webhooks.connection" msgstr "Ralat sambungan, URL tidak dapat dicapai" msgid "errors.webhooks.invalid-uri" msgstr "URL tidak lulus pengesahan." -#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Penghantaran terakhir tidak berjaya." msgid "errors.webhooks.ssl-validation" msgstr "Ralat pada pengesahan SSL." -msgid "errors.webhooks.timeout" -msgstr "Masa tamat" - msgid "errors.webhooks.unexpected" msgstr "Ralat yang tidak dijangka semasa mengesahkan" @@ -1022,6 +724,12 @@ msgstr "E-mel atau kata laluan tidak betul." msgid "errors.wrong-old-password" msgstr "Kata laluan lama tidak betul" +msgid "errors.validation" +msgstr "Ralat Pengesahan" + +msgid "errors.paste-data-validation" +msgstr "Data tidak sah dalam papan klip" + #: src/app/main/ui/settings/feedback.cljs msgid "feedback.description" msgstr "Penerangan" @@ -1036,26 +744,11 @@ msgstr "" "Kami berbesar hati anda berada disini. Jika anda memerlukan bantuan, sila " "cari sebelum anda menyiarkan siaran baharu." -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-title" -msgstr "Komuniti Penpot" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.subject" -msgstr "Subjek" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.subtitle" -msgstr "" -"Sila terangkan sebab e-mel anda, nyatakan sama ada isu, idea atau keraguan. " -"Seorang ahli pasukan kami akan menjawab secepat mungkin." - #: src/app/main/ui/settings/feedback.cljs msgid "feedback.title" msgstr "E-mel" #: src/app/main/ui/settings/feedback.cljs -#, fuzzy msgid "feedback.twitter-go-to" msgstr "Pergi ke Twitter" @@ -1064,7 +757,6 @@ msgid "feedback.twitter-subtitle1" msgstr "Kami di sini untuk membantu dengan pertanyaan teknikal anda." #: src/app/main/ui/settings/feedback.cljs -#, fuzzy msgid "feedback.twitter-title" msgstr "Akaun sokongan Twitter" @@ -1100,10 +792,6 @@ msgstr "Isi" msgid "inspect.attributes.image.download" msgstr "Muat turun sumber gambar" -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.height" -msgstr "Tinggi" - #: src/app/main/ui/inspect/attributes/image.cljs msgid "inspect.attributes.image.width" msgstr "Lebar" @@ -1116,6 +804,10 @@ msgstr "Susun atur" msgid "inspect.attributes.layout.height" msgstr "Tinggi" +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.height" +msgstr "Tinggi" + #: src/app/main/ui/inspect/attributes/layout.cljs msgid "inspect.attributes.layout.left" msgstr "kiri" @@ -1128,18 +820,6 @@ msgstr "Jejari" msgid "inspect.attributes.layout.rotation" msgstr "Putaran" -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.top" -msgstr "Atas" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.width" -msgstr "Lebar" - -#: src/app/main/ui/inspect/attributes/shadow.cljs -msgid "inspect.attributes.shadow" -msgstr "Bayang" - #: src/app/main/ui/inspect/attributes/layout.cljs msgid "inspect.attributes.size" msgstr "Ukuran dan kedudukan" @@ -1193,10 +873,6 @@ msgstr "Saiz huruf" msgid "inspect.attributes.typography.font-style" msgstr "Gaya Huruf" -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-weight" -msgstr "Berat Huruf" - #: src/app/main/ui/inspect/attributes/text.cljs msgid "inspect.attributes.typography.letter-spacing" msgstr "Jarak Huruf" @@ -1215,9 +891,6 @@ msgstr "Tiada" msgid "inspect.attributes.typography.text-decoration.strikethrough" msgstr "Tembus" -msgid "inspect.attributes.typography.text-decoration.underline" -msgstr "Garis bawah" - #: src/app/main/ui/inspect/attributes/text.cljs #, fuzzy msgid "inspect.attributes.typography.text-transform" @@ -1229,12 +902,12 @@ msgstr "Huruf Kecil" msgid "inspect.attributes.typography.text-transform.none" msgstr "Tiada" -msgid "inspect.attributes.typography.text-transform.titlecase" -msgstr "Huruf Tajuk" - msgid "inspect.attributes.typography.text-transform.unset" msgstr "Nyahset" +msgid "inspect.attributes.typography.text-transform.titlecase" +msgstr "Huruf Tajuk" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Huruf Besar" @@ -1285,9 +958,6 @@ msgstr "Laluan" msgid "inspect.tabs.code.selected.rect" msgstr "Segi empat tepat" -msgid "inspect.tabs.code.selected.svg-raw" -msgstr "SVG" - msgid "inspect.tabs.code.selected.text" msgstr "Teks" @@ -1306,9 +976,6 @@ msgstr "Terima" msgid "labels.access-tokens" msgstr "Token capaian" -msgid "labels.active" -msgstr "Aktif" - msgid "labels.add-custom-font" msgstr "Tambah fon tersuai" @@ -1316,10 +983,6 @@ msgstr "Tambah fon tersuai" msgid "labels.admin" msgstr "Pentadbir" -#: src/app/main/ui/workspace/comments.cljs -msgid "labels.all" -msgstr "Semua" - msgid "labels.and" msgstr "dan" @@ -1361,21 +1024,10 @@ msgstr "Teruskan" msgid "labels.continue-with" msgstr "Teruskan dengan" -msgid "labels.continue-with-penpot" -msgstr "Anda boleh meneruskan dengan akaun Penpot" - #: src/app/main/ui/dashboard/team.cljs msgid "labels.copy-invitation-link" msgstr "Salin pautan" -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "labels.create" -msgstr "Cipta" - -#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs -msgid "labels.create-team" -msgstr "Cipta pasukan baharu" - #: src/app/main/ui/dashboard/team_form.cljs msgid "labels.create-team.placeholder" msgstr "Masukkan nama pasukan baharu" @@ -1429,9 +1081,6 @@ msgstr "Penyunting" msgid "labels.expired-invitation" msgstr "Tamat tempoh" -msgid "labels.export" -msgstr "Eksport" - #: src/app/main/ui/settings/feedback.cljs msgid "labels.feedback-disabled" msgstr "Maklum balas dilumpuhkan" @@ -1463,10 +1112,6 @@ msgstr "Beri maklum balas" msgid "labels.go-back" msgstr "Pergi balik" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.help-center" -msgstr "Pusat Bantuan" - #: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs msgid "labels.hide-resolved-comments" msgstr "Sembunyikan komen yang diselesaikan" @@ -1477,12 +1122,6 @@ msgstr "tidak aktif" msgid "labels.installed-fonts" msgstr "Fon yang dipasang" -#: src/app/main/ui/static.cljs -msgid "labels.internal-error.desc-message" -msgstr "" -"Sesuatu yang buruk telah berlaku. Sila cuba semula operasi dan jika masalah " -"berterusan, hubungi sokongan." - #: src/app/main/ui/static.cljs msgid "labels.internal-error.main-message" msgstr "Ralat Dalaman" @@ -1518,26 +1157,14 @@ msgstr "Ahli" msgid "labels.new-password" msgstr "Kata laluan baharu" -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs -msgid "labels.no-comments-available" -msgstr "" -"Anda telah melihat semua yang baru! Pemberitahuan ulasan baharu akan " -"dipaparkan di sini." - #: src/app/main/ui/dashboard/team.cljs msgid "labels.no-invitations" msgstr "Tiada jemputan tertunda." -#: src/app/main/ui/dashboard/team.cljs -#, markdown -msgid "labels.no-invitations-hint" -msgstr "Klik butang **Jemput orang** untuk menjemput orang ke pasukan ini." - #: src/app/main/ui/static.cljs msgid "labels.not-found.desc-message" msgstr "" -"Halaman ini mungkin tidak wujud atau anda tiada kebenaran untuk " -"mengaksesnya." +"Halaman ini mungkin tidak wujud atau anda tiada kebenaran untuk mengaksesnya." #: src/app/main/ui/static.cljs msgid "labels.not-found.main-message" @@ -1572,47 +1199,10 @@ msgstr "atau" msgid "labels.owner" msgstr "Pemilik" -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.password" -msgstr "Kata laluan" - -#: src/app/main/ui/dashboard/team.cljs -#, fuzzy -msgid "labels.pending-invitation" -msgstr "Belum selesai" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.profile" -msgstr "Profil" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.projects" -msgstr "Projek" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.release-notes" -msgstr "Nota keluaran" - -#: src/app/main/ui/workspace.cljs -msgid "labels.reload-file" -msgstr "Muat semula fail" - -#: src/app/main/ui/workspace/libraries.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.remove" -msgstr "Alih keluar" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.remove-member" -msgstr "Buang ahli" - #: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "labels.rename" msgstr "Namakan semula" -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.rename-team" -msgstr "Namakan semula pasukan" - #: src/app/main/ui/dashboard/team.cljs msgid "labels.resend-invitation" msgstr "Hantar semula jemputan" @@ -1628,9 +1218,6 @@ msgstr "Peranan" msgid "labels.save" msgstr "Simpan" -msgid "labels.search" -msgstr "Cari" - msgid "labels.search-font" msgstr "Cari fon" @@ -1650,16 +1237,12 @@ msgstr "Kami sedang menjalankan penyelenggaraan berjadual pada sistem kami." msgid "labels.service-unavailable.main-message" msgstr "Perkhidmatan Tidak Tersedia" -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.settings" -msgstr "Tetapan" +msgid "labels.share-prototype" +msgstr "Kongsi prototaip" msgid "labels.share" msgstr "Kongsi" -msgid "labels.share-prototype" -msgstr "Kongsi prototaip" - #: src/app/main/ui/dashboard/sidebar.cljs msgid "labels.shared-libraries" msgstr "Perpustakaan" @@ -1675,35 +1258,9 @@ msgstr "Paparkan senarai komen" msgid "labels.show-your-comments" msgstr "Paparkan komen anda sahaja" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.status" -msgstr "Status" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.tutorials" -msgstr "Tutorial" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.unpublish-multi-files" -msgstr "Nyahterbitkan %s fail" - -#: src/app/main/ui/settings/profile.cljs -msgid "labels.update" -msgstr "Kemas kini" - -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.update-team" -msgstr "Kemas kini pasukan" - -msgid "labels.upload" -msgstr "Muat naik" - msgid "labels.upload-custom-fonts" msgstr "Muat naik fon tersuai" -msgid "labels.uploading" -msgstr "Memuat naik…" - msgid "labels.view-only" msgstr "LIHAT SAHAJA" @@ -1722,30 +1279,17 @@ msgstr "Tulis komen baharu" msgid "labels.you" msgstr "(anda)" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.your-account" -msgstr "Akaun anda" +msgid "labels.search" +msgstr "Cari" #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Memuatkan gambar…" -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Pustaka anda kosong. Setelah ditambahkan sebagai Pustaka Dikongsi, aset " -"yang anda buat akan tersedia untuk digunakan antara fail anda yang lain. " -"Adakah anda pasti mahu menerbitkannya?" - #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" msgstr "Tambah sebagai Pustaka Kongsi" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.hint" -msgstr "" -"Setelah ditambahkan sebagai Pustaka Kongsi, aset pustaka fail ini akan " -"tersedia untuk digunakan antara fail anda yang lain." - #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.message" msgstr "Tambah “%s” sebagai Pustaka Kongsi" @@ -1755,10 +1299,6 @@ msgstr "Tambah “%s” sebagai Pustaka Kongsi" msgid "modals.big-nudge" msgstr "Anjakan besar" -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.confirm-email" -msgstr "Sahkan e-mel baharu" - #: src/app/main/ui/settings/change_email.cljs msgid "modals.change-email.info" msgstr "" @@ -1813,14 +1353,6 @@ msgstr "URL muatan" msgid "modals.create-webhook.url.placeholder" msgstr "https://example.com/postreceive" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.accept" -msgstr "Padam token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.message" -msgstr "Adakah anda pasti mahu memadamkan token ini?" - #: src/app/main/ui/settings/access-tokens.cljs msgid "modals.delete-acces-token.title" msgstr "Padam token" @@ -1829,30 +1361,6 @@ msgstr "Padam token" msgid "modals.delete-account.cancel" msgstr "Batal dan kekalkan akaun saya" -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.confirm" -msgstr "Ya, padam akaun saya" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.info" -msgstr "" -"Dengan mengalih keluar akaun anda, anda akan kehilangan semua projek dan " -"arkib semasa anda." - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.title" -msgstr "Adakah anda pasti mahu memadam akaun anda?" - -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.accept" -msgstr "Padam perbualan" - -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.message" -msgstr "" -"Adakah anda pasti mahu memadamkan perbualan ini? Semua komen dalam urutan " -"ini akan dipadamkan." - #: src/app/main/ui/comments.cljs msgid "modals.delete-comment-thread.title" msgstr "Padam perbualan" @@ -1867,10 +1375,6 @@ msgstr "Padam anotasi" msgid "modals.delete-file-confirm.accept" msgstr "Padam fail" -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.message" -msgstr "Adakah anda pasti mahu memadamkan fail ini?" - #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-file-confirm.title" msgstr "Memadam fail" @@ -1889,8 +1393,8 @@ msgstr "Memadamkan %s fail" msgid "modals.delete-font-variant.message" msgstr "" -"Adakah anda pasti mahu memadamkan gaya fon ini? Ia tidak akan dimuatkan " -"jika digunakan dalam fail." +"Adakah anda pasti mahu memadamkan gaya fon ini? Ia tidak akan dimuatkan jika " +"digunakan dalam fail." msgid "modals.delete-font-variant.title" msgstr "Memadam gaya fon" @@ -1948,10 +1452,6 @@ msgid "modals.delete-shared-confirm.title" msgid_plural "modals.delete-shared-confirm.title" msgstr[0] "Memadam fail" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.accept" -msgstr "Padam pasukan" - #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.delete-team-confirm.message" msgstr "" @@ -1962,10 +1462,6 @@ msgstr "" msgid "modals.delete-team-confirm.title" msgstr "Memadam pasukan" -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.accept" -msgstr "Padam ahli" - #: src/app/main/ui/dashboard/team.cljs msgid "modals.delete-team-member-confirm.message" msgstr "Adakah anda pasti mahu memadamkan ahli ini daripada pasukan?" @@ -1974,13 +1470,6 @@ msgstr "Adakah anda pasti mahu memadamkan ahli ini daripada pasukan?" msgid "modals.delete-team-member-confirm.title" msgstr "Padam ahli pasukan" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "" -"Aset yang telah digunakan dalam fail ini akan kekal di sana (tiada reka " -"bentuk akan rosak)." - msgid "modals.delete-webhook.accept" msgstr "Padam cangkuk web (webhook)" @@ -2027,12 +1516,6 @@ msgstr "" "Anda tidak boleh meninggalkan pasukan jika tiada ahli lain untuk dinaikkan " "pangkat kepada pemilik. Anda mungkin mahu memadamkan pasukan." -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.hint1" -msgstr "" -"Anda adalah pemilik pasukan ini. Sila pilih ahli lain untuk dinaikkan " -"pangkat kepada pemilik sebelum anda pergi." - #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.leave-and-reassign.promote-and-leave" msgstr "Naik pangkat dan tinggalkan" @@ -2041,15 +1524,6 @@ msgstr "Naik pangkat dan tinggalkan" msgid "modals.leave-and-reassign.select-member-to-promote" msgstr "Pilih ahli untuk dinaikkan pangkat" -#: src/app/main/ui/dashboard/sidebar.cljs -#, fuzzy -msgid "modals.leave-and-reassign.title" -msgstr "Sebelum anda pergi" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-confirm.accept" -msgstr "Tinggalkan pasukan" - #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.leave-confirm.message" msgstr "Adakah anda pasti mahu meninggalkan pasukan ini?" @@ -2075,8 +1549,8 @@ msgstr "" #: src/app/main/ui/dashboard/team.cljs msgid "modals.promote-owner-confirm.message" msgstr "" -"Anda adalah pemilik semasa pasukan ini. Adakah anda pasti mahu menjadikan " -"%s pemilik baharu pasukan?" +"Anda adalah pemilik semasa pasukan ini. Adakah anda pasti mahu menjadikan %s " +"pemilik baharu pasukan?" #: src/app/main/ui/dashboard/team.cljs msgid "modals.promote-owner-confirm.title" @@ -2091,20 +1565,12 @@ msgstr "Pustaka anda kosong. Adakah anda pasti mahu menerbitkannya?" msgid "modals.publish-empty-library.title" msgstr "Terbitkan perpustakaan kosong" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.accept" -msgstr "Alih keluar sebagai Pustaka Kongsi" - #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.remove-shared-confirm.hint" msgstr "" "Setelah dialih keluar sebagai Pustaka Kongsi, Pustaka Fail fail ini akan " "berhenti tersedia untuk digunakan di antara fail anda yang lain." -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.message" -msgstr "Alih keluar \"%s\" sebagai Pustaka Kongsi" - #: src/app/main/ui/workspace/nudge.cljs msgid "modals.small-nudge" msgstr "Anjakan kecil" @@ -2114,16 +1580,21 @@ msgid "modals.unpublish-shared-confirm.accept" msgid_plural "modals.unpublish-shared-confirm.accept" msgstr[0] "Nyahterbit" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.activated.no-files-message" +msgid_plural "modals.unpublish-shared-confirm.activated.no-files-message" +msgstr[0] "Ia tidak diaktifkan dalam mana-mana fail." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.activated.scd-message" +msgid_plural "modals.unpublish-shared-confirm.activated.scd-message" +msgstr[0] "Perpustakaan ini diaktifkan di sini:" + #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.message" msgid_plural "modals.unpublish-shared-confirm.message" msgstr[0] "Adakah anda pasti mahu menyahterbitkan perpustakaan ini?" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.title" -msgid_plural "modals.unpublish-shared-confirm.title" -msgstr[0] "Nyahterbit pustaka" - #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs msgid "modals.update-remote-component-in-bulk.hint" msgstr "" @@ -2216,14 +1687,9 @@ msgstr "" msgid "onboarding-v2.newsletter.privacy1" msgstr "Kami mengambil berat tentang privasi, di sini anda boleh membaca. " -msgid "onboarding-v2.newsletter.privacy2" -msgstr "" -"Kami hanya akan menghantar e-mel yang berkaitan kepada anda. Anda boleh " -"berhenti melanggan pada bila-bila masa melalui pautan nyahlanggan dalam " -"mana-mana surat berita kami." - msgid "onboarding-v2.newsletter.updates" -msgstr "Hantar kepada saya kemas kini produk (ciri baharu, keluaran, pembetulan...)." +msgstr "" +"Hantar kepada saya kemas kini produk (ciri baharu, keluaran, pembetulan...)." msgid "onboarding-v2.welcome.desc1" msgstr "" @@ -2236,9 +1702,6 @@ msgstr "" "Ruang awam untuk belajar, berkongsi dan membincangkan tentang Penpot, masa " "kini dan masa depannya dengan seluruh Komuniti dan pasukan teras Penpot." -msgid "onboarding-v2.welcome.desc2.title" -msgstr "Mengambil bahagian dalam Komuniti" - msgid "onboarding-v2.welcome.desc3" msgstr "" "Di mana anda akan menemui cara untuk bekerjasama dengan terjemahan, " @@ -2250,35 +1713,24 @@ msgstr "Panduan memberi sumbangan" msgid "onboarding-v2.welcome.title" msgstr "Selamat datang ke Penpot!" +msgid "onboarding.choice.team-up.create-team-placeholder" +msgstr "Masukkan nama pasukan" + msgid "onboarding.choice.team-up.continue-creating-team" msgstr "Teruskan mencipta pasukan" -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Teruskan tanpa pasukan" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Mulakan tanpa pasukan" -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Buat pasukan & jemput" +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Anda boleh membuat pasukan kemudian." -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Buat pasukan dan hantar jemputan" +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Buat pasukan tanpa menjemput" msgid "onboarding.choice.team-up.create-team-and-send-invites-description" msgstr "Anda boleh menjemput kemudian" -msgid "onboarding.choice.team-up.create-team-desc" -msgstr "" -"Selepas menamakan pasukan anda, anda akan dapat menjemput orang untuk " -"menyertai." - -msgid "onboarding.choice.team-up.create-team-placeholder" -msgstr "Masukkan nama pasukan" - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Cipta pasukan" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Buat pasukan tanpa menjemput" - msgid "onboarding.choice.team-up.invite-members" msgstr "Jemput ahli" @@ -2290,12 +1742,6 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Jemput dengan peranan:" -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Mulakan tanpa pasukan" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Anda boleh membuat pasukan kemudian." - msgid "onboarding.newsletter.accept" msgstr "Ya, langgan" @@ -2313,11 +1759,6 @@ msgstr "Ingin menerima berita Penpot?" msgid "onboarding.team-modal.create-team" msgstr "Cipta pasukan" -msgid "onboarding.team-modal.create-team-desc" -msgstr "" -"Pasukan membolehkan anda bekerjasama dengan pengguna Penpot lain yang " -"bekerja dalam fail dan projek yang sama." - msgid "onboarding.team-modal.create-team-feature-1" msgstr "Fail dan projek tanpa had" @@ -2354,10 +1795,6 @@ msgstr "Alat reka bentuk yang manakah anda mempunyai lebih banyak pengalaman?" msgid "questions.11-30" msgstr "11-30" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.31-50" msgstr "31-50" @@ -2376,7 +1813,8 @@ msgstr "Canva" #: src/app/main/ui/onboarding/questions.cljs msgid "questions.describe-your-experience-working-on" -msgstr "Bagaimanakah cara terbaik anda menerangkan pengalaman anda bekerja pada..." +msgstr "" +"Bagaimanakah cara terbaik anda menerangkan pengalaman anda bekerja pada..." #: src/app/main/ui/onboarding/questions.cljs msgid "questions.designer" @@ -2394,18 +1832,10 @@ msgstr "Ketahui lebih lanjut tentang Penpot" msgid "questions.figma" msgstr "Figma" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Pengasas/VP" - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.freelancer" msgstr "Saya seorang pekerja bebas (freelancer)" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "Dapatkan kod daripada projek pasukan saya " - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.interface-design-visual-assets-design-systems" msgstr "... reka bentuk antara muka, aset visual, sistem reka bentuk, dsb." @@ -2426,17 +1856,13 @@ msgstr "Mari mulakan!" msgid "questions.manager" msgstr "Pengurus Produk atau Projek" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Pemasaran" - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.more-than-50" msgstr "Lebih daripada 50" #: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "Seterusnya" +msgid "questions.never-used-a-tool" +msgstr "Saya tidak pernah menggunakan alat reka bentuk sebelum ini" #: src/app/main/ui/onboarding/questions.cljs msgid "questions.none" @@ -2454,18 +1880,6 @@ msgstr "Saya sedang menjalankan projek peribadi" msgid "questions.previous" msgstr "Sebelumnya" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "Bagaimanakah anda merancang untuk menggunakan Penpot?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "Apakah peranan anda?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "Pilih pilihan" - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.sketch" msgstr "Sketch" @@ -2518,10 +1932,6 @@ msgstr "" msgid "settings.detach" msgstr "Tanggalkan" -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "settings.multiple" -msgstr "Bercampur" - # SECTIONS msgid "shortcut-section.basics" msgstr "Asas" @@ -2554,9 +1964,6 @@ msgstr "Menu utama" msgid "shortcut-subsection.modify-layers" msgstr "Ubah suai lapisan" -msgid "shortcut-subsection.navigation-dashboard" -msgstr "Navigasi" - msgid "shortcut-subsection.navigation-viewer" msgstr "Navigasi" @@ -2632,12 +2039,12 @@ msgstr "Persimpangan Boolean" msgid "shortcuts.bool-union" msgstr "Kesatuan Boolean" -msgid "shortcuts.bring-back" -msgstr "Hantar ke paling belakang" - msgid "shortcuts.bring-backward" msgstr "Hantar ke belakang" +msgid "shortcuts.bring-back" +msgstr "Hantar ke paling belakang" + msgid "shortcuts.bring-forward" msgstr "Bawa ke hadapan" @@ -2656,72 +2063,9 @@ msgstr "Cipta komponen" msgid "shortcuts.create-new-project" msgstr "Buat baharu" -msgid "shortcuts.cut" -msgstr "Potong" - msgid "shortcuts.decrease-zoom" msgstr "Zum keluar" -msgid "shortcuts.delete" -msgstr "Padam" - -msgid "shortcuts.delete-node" -msgstr "Padamkan nod" - -msgid "shortcuts.detach-component" -msgstr "Tanggalkan komponen" - -msgid "shortcuts.draw-curve" -msgstr "Lengkung" - -msgid "shortcuts.draw-ellipse" -msgstr "elips" - -msgid "shortcuts.draw-frame" -msgstr "Papan" - -msgid "shortcuts.draw-nodes" -msgstr "Lukis laluan" - -msgid "shortcuts.draw-path" -msgstr "Laluan" - -msgid "shortcuts.draw-rect" -msgstr "Segi empat tepat" - -msgid "shortcuts.draw-text" -msgstr "Teks" - -msgid "shortcuts.duplicate" -msgstr "Pendua" - -msgid "shortcuts.escape" -msgstr "Batal" - -msgid "shortcuts.export-shapes" -msgstr "Eksport bentuk" - -msgid "shortcuts.fit-all" -msgstr "Zum untuk muat semua" - -msgid "shortcuts.flip-horizontal" -msgstr "Terbalikkan secara mendatar" - -msgid "shortcuts.flip-vertical" -msgstr "Terbalikkan secara menegak" - -msgid "shortcuts.font-size-dec" -msgstr "Kurangkan saiz fon" - -msgid "shortcuts.font-size-inc" -msgstr "Tambah saiz fon" - -msgid "shortcuts.go-to-drafts" -msgstr "Pergi ke draf" - -msgid "shortcuts.go-to-libs" -msgstr "Pergi ke perpustakaan kongsi" - msgid "shortcuts.go-to-search" msgstr "Cari" @@ -2751,3 +2095,671 @@ msgstr "Kurangkan jarak huruf" msgid "shortcuts.letter-spacing-inc" msgstr "Penambahan jarak huruf" + +msgid "dashboard.export-multi" +msgstr "Eksport fail Penpot %s" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-multiple.selected" +msgstr "%s daripada %s elemen dipilih" + +#: src/app/main/ui/workspace/header.cljs +msgid "dashboard.export-shapes" +msgstr "Eksport" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to" +msgstr "" +"Anda boleh menambah tetapan eksport ke elemen daripada sifat reka bentuk (di " +"bahagian bawah bar sisi kanan)." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to-link" +msgstr "Maklumat cara untuk menetapkan eksport di Penpot." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.no-elements" +msgstr "Tiada unsur dengan tetapan eksport." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.title" +msgstr "Eksport Pemilihan" + +msgid "dashboard.export-standard-multi" +msgstr "Muat turun %s fail standard (.svg + .json)" + +msgid "dashboard.export.detail" +msgstr "* Mungkin termasuk komponen, grafik, warna dan/atau tipografi." + +msgid "dashboard.export.explain" +msgstr "" +"Satu atau lebih fail yang anda ingin eksport menggunakan perpustakaan " +"kongsi. Apa yang anda mahu lakukan dengan aset mereka*?" + +msgid "dashboard.export.options.all.message" +msgstr "" +"fail dengan perpustakaan kongsi akan disertakan dalam eksport, mengekalkan " +"hubungannya." + +msgid "dashboard.export.options.all.title" +msgstr "Eksport perpustakaan kongsi" + +msgid "dashboard.export.options.detach.message" +msgstr "" +"Perpustakaan kongsi tidak akan disertakan dalam eksport dan tiada aset akan " +"ditambahkan ke perpustakaan. " + +msgid "dashboard.export.options.detach.title" +msgstr "Anggap aset perpustakaan kongsi sebagai objek asas" + +msgid "dashboard.export.options.merge.message" +msgstr "" +"Fail anda akan dieksport dengan semua aset luaran digabungkan ke dalam " +"pustaka fail." + +msgid "dashboard.export.options.merge.title" +msgstr "Sertakan aset perpustakaan kongsi dalam pustaka fail" + +msgid "dashboard.export.title" +msgstr "Eksport fail" + +msgid "dashboard.fonts.deleted-placeholder" +msgstr "Fon hilang" + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.dismiss-all" +msgstr "Tolak semua" + +msgid "dashboard.fonts.empty-placeholder" +msgstr "Fon tersuai yang anda muat naik akan dipaparkan di sini." + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.fonts-added" +msgid_plural "dashboard.fonts.fonts-added" +msgstr[0] "%s fon ditambah" + +#, markdown +msgid "dashboard.fonts.hero-text1" +msgstr "" +"Sebarang fon web yang anda muat naik di sini akan ditambahkan pada senarai " +"keluarga fon yang tersedia pada sifat teks fail pasukan ini. Fon dengan nama " +"keluarga fon yang sama akan dikumpulkan sebagai **keluarga fon tunggal**. " +"Anda boleh memuat naik fon dengan format berikut: **TTF, OTF dan WOFF** (" +"hanya satu sahaja diperlukan)." + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.upload-all" +msgstr "Muat naik semua" + +#, markdown +msgid "dashboard.fonts.warning-text" +msgstr "" +"Kami telah mengesan kemungkinan masalah dalam fon anda yang berkaitan dengan " +"metrik menegak untuk sistem pengendalian yang berbeza. Untuk menyemaknya, " +"anda boleh menggunakan perkhidmatan metrik menegak fon seperti [ini](https" +"://vertical-metrics.netlify.app/). Selain itu, kami mengesyorkan menggunakan " +"[Transfonter](https://transfonter.org/) untuk menjana fon web dan " +"membetulkan ralat. " + +msgid "dashboard.import" +msgstr "Import fail Penpot" + +msgid "dashboard.import.analyze-error" +msgstr "Alamak! Kami tidak dapat mengimport fail ini" + +#: src/app/main/ui/dashboard/team.cljs +#, fuzzy +msgid "labels.pending-invitation" +msgstr "Belum selesai" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.profile" +msgstr "Profil" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.projects" +msgstr "Projek" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.release-notes" +msgstr "Nota keluaran" + +#: src/app/main/ui/workspace.cljs +msgid "labels.reload-file" +msgstr "Muat semula fail" + +#: src/app/main/ui/workspace/libraries.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.remove" +msgstr "Alih keluar" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.remove-member" +msgstr "Buang ahli" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.rename-team" +msgstr "Namakan semula pasukan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.status" +msgstr "Status" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.tutorials" +msgstr "Tutorial" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.unpublish-multi-files" +msgstr "Nyahterbitkan %s fail" + +#: src/app/main/ui/settings/profile.cljs +msgid "labels.update" +msgstr "Kemas kini" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.update-team" +msgstr "Kemas kini pasukan" + +msgid "labels.upload" +msgstr "Muat naik" + +msgid "labels.uploading" +msgstr "Memuat naik…" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.message" +msgstr "" +"Adakah anda pasti mahu memadamkan perbualan ini? Semua komen dalam urutan " +"ini akan dipadamkan." + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.confirm" +msgstr "Ya, padam akaun saya" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.info" +msgstr "" +"Dengan mengalih keluar akaun anda, anda akan kehilangan semua projek dan " +"arkib semasa anda." + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.title" +msgstr "Adakah anda pasti mahu memadam akaun anda?" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.accept" +msgstr "Padam perbualan" + +msgid "shortcut-subsection.navigation-dashboard" +msgstr "Navigasi" + +msgid "shortcuts.duplicate" +msgstr "Pendua" + +msgid "shortcuts.escape" +msgstr "Batal" + +msgid "shortcuts.export-shapes" +msgstr "Eksport bentuk" + +msgid "shortcuts.fit-all" +msgstr "Zum untuk muat semua" + +msgid "shortcuts.flip-horizontal" +msgstr "Terbalikkan secara mendatar" + +msgid "shortcuts.flip-vertical" +msgstr "Terbalikkan secara menegak" + +msgid "shortcuts.font-size-dec" +msgstr "Kurangkan saiz fon" + +#, markdown +msgid "dashboard.fonts.hero-text2" +msgstr "" +"Anda hanya perlu memuat naik fon yang anda miliki atau mempunyai lesen untuk " +"digunakan dalam Penpot. Ketahui lebih lanjut dalam bahagian Hak kandungan [" +"Syarat Perkhidmatan Penpot](https://penpot.app/terms.html). Anda juga " +"mungkin ingin membaca tentang [pelesenan fon](https://www.typography.com/" +"faq)." + +msgid "dashboard.import.analyze-error.components-v2" +msgstr "" +"Fail dengan komponen v2 diaktifkan tetapi pasukan ini belum menyokongnya " +"lagi." + +msgid "dashboard.import.progress.process-components" +msgstr "Memproses komponen" + +msgid "dashboard.import.progress.process-media" +msgstr "Memproses media" + +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.loading-files" +msgstr "memuatkan fail anda…" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to" +msgstr "Berpindah ke" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.no-projects-placeholder" +msgstr "Projek yang disemat akan muncul di sini" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-changed-successfully" +msgstr "Alamat e-mel anda telah berjaya dikemas kini" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-verified-successfully" +msgstr "Alamat e-mel anda telah berjaya disahkan" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.pin-unpin" +msgstr "Semat/Nyahsemat" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.remove-account" +msgstr "Mahu mengalih keluar akaun anda?" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.projects-title" +msgstr "Projek" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.remove-shared" +msgstr "Alih keluar sebagai Pustaka Dikongsi" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.search-placeholder" +msgstr "Cari…" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.save-settings" +msgstr "Simpan tetapan" + +#: src/app/main/ui/confirm.cljs +msgid "ds.component-subtitle" +msgstr "Komponen untuk dikemas kini:" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.searching-for" +msgstr "Mencari \"%s\"…" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-language" +msgstr "Pilih Bahasa UI" + +msgid "dashboard.import.import-error" +msgstr "Terdapat masalah mengimport fail. Fail tidak diimport." + +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "%s fail telah berjaya diimport." + +msgid "dashboard.import.import-warning" +msgstr "Sesetengah fail mengandungi objek tidak sah telah dialih keluar." + +msgid "dashboard.import.progress.process-colors" +msgstr "memproses warna" + +msgid "dashboard.import.progress.process-page" +msgstr "Memproses halaman: %s" + +msgid "dashboard.import.progress.process-typographies" +msgstr "Memproses tipografi" + +msgid "dashboard.import.progress.upload-data" +msgstr "Memuat naik data ke pelayan (%s/%s)" + +msgid "dashboard.import.progress.upload-media" +msgstr "Memuat naik fail: %s" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.invite-profile" +msgstr "Jemput orang ramai" + +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.leave-team" +msgstr "Tinggalkan pasukan" + +msgid "dashboard.libraries-and-templates" +msgstr "Perpustakaan & Templat" + +msgid "dashboard.libraries-and-templates.explore" +msgstr "Terokai lebih banyak daripada mereka dan ketahui cara untuk menyumbang" + +msgid "dashboard.libraries-and-templates.import-error" +msgstr "Terdapat masalah mengimport templat. Templat tidak diimport." + +#: src/app/main/ui/dashboard/libraries.cljs +msgid "dashboard.libraries-title" +msgstr "Perpustakaan" + +msgid "dashboard.webhooks.empty.no-webhooks" +msgstr "Tiada webhook dibuat setakat ini." + +msgid "dashboard.webhooks.empty.add-one" +msgstr "Tekan butang \"Tambah webhook\" untuk menambahnya." + +msgid "dashboard.webhooks.update.success" +msgstr "Webhook berjaya dikemas kini." + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-email" +msgstr "E-mel" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-name" +msgstr "Nama anda" + +#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.your-penpot" +msgstr "Penpot anda" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-ok" +msgstr "Ok" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-title" +msgstr "Perhatian" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-cancel" +msgstr "Batal" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-ok" +msgstr "Ok" + +#: src/app/main/ui/confirm.cljs, src/app/main/ui/confirm.cljs +msgid "ds.confirm-title" +msgstr "Adakah anda pasti?" + +#: src/app/main/ui/auth/login.cljs +msgid "errors.auth-provider-not-configured" +msgstr "Pembekal pengesahan tidak dikonfigurasikan." + +msgid "errors.auth.unable-to-login" +msgstr "Nampaknya anda belum disahkan atau sesi telah tamat tempoh." + +msgid "errors.bad-font-plural" +msgstr "Fon %s tidak dapat dimuatkan" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.unexpected-token" +msgstr "Token tidak diketahui" + +msgid "errors.webhooks.timeout" +msgstr "Masa tamat" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-title" +msgstr "Komuniti Penpot" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subject" +msgstr "Subjek" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subtitle" +msgstr "" +"Sila terangkan sebab e-mel anda, nyatakan sama ada isu, idea atau keraguan. " +"Seorang ahli pasukan kami akan menjawab secepat mungkin." + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.top" +msgstr "Atas" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.width" +msgstr "Lebar" + +#: src/app/main/ui/inspect/attributes/shadow.cljs +msgid "inspect.attributes.shadow" +msgstr "Bayang" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-weight" +msgstr "Berat Huruf" + +msgid "inspect.attributes.typography.text-decoration.underline" +msgstr "Garis bawah" + +msgid "inspect.tabs.code.selected.svg-raw" +msgstr "SVG" + +msgid "labels.active" +msgstr "Aktif" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.all" +msgstr "Semua" + +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.desc-message" +msgstr "" +"Sesuatu yang buruk telah berlaku. Sila cuba semula operasi dan jika masalah " +"berterusan, hubungi sokongan." + +msgid "labels.continue-with-penpot" +msgstr "Anda boleh meneruskan dengan akaun Penpot" + +msgid "labels.export" +msgstr "Eksport" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "labels.create" +msgstr "Cipta" + +#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team" +msgstr "Cipta pasukan baharu" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs +msgid "labels.no-comments-available" +msgstr "" +"Anda telah melihat semua yang baru! Pemberitahuan ulasan baharu akan " +"dipaparkan di sini." + +#: src/app/main/ui/dashboard/team.cljs +#, markdown +msgid "labels.no-invitations-hint" +msgstr "Klik butang **Jemput orang** untuk menjemput orang ke pasukan ini." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.help-center" +msgstr "Pusat Bantuan" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.password" +msgstr "Kata laluan" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.settings" +msgstr "Tetapan" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "Padam token" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.message" +msgstr "Adakah anda pasti mahu memadamkan fail ini?" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.message" +msgstr "Adakah anda pasti mahu memadamkan token ini?" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.hint1" +msgstr "" +"Anda adalah pemilik pasukan ini. Sila pilih ahli lain untuk dinaikkan " +"pangkat kepada pemilik sebelum anda pergi." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.accept" +msgstr "Padam pasukan" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.your-account" +msgstr "Akaun anda" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Pustaka anda kosong. Setelah ditambahkan sebagai Pustaka Dikongsi, aset yang " +"anda buat akan tersedia untuk digunakan antara fail anda yang lain. Adakah " +"anda pasti mahu menerbitkannya?" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.accept" +msgstr "Padam ahli" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "" +"Aset yang telah digunakan dalam fail ini akan kekal di sana (tiada reka " +"bentuk akan rosak)." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.hint" +msgstr "" +"Setelah ditambahkan sebagai Pustaka Kongsi, aset pustaka fail ini akan " +"tersedia untuk digunakan antara fail anda yang lain." + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.confirm-email" +msgstr "Sahkan e-mel baharu" + +#: src/app/main/ui/dashboard/sidebar.cljs +#, fuzzy +msgid "modals.leave-and-reassign.title" +msgstr "Sebelum anda pergi" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.accept" +msgstr "Tinggalkan pasukan" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.accept" +msgstr "Alih keluar sebagai Pustaka Kongsi" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.message" +msgstr "Alih keluar \"%s\" sebagai Pustaka Kongsi" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.title" +msgid_plural "modals.unpublish-shared-confirm.title" +msgstr[0] "Nyahterbit pustaka" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Teruskan tanpa pasukan" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Pemasaran" + +msgid "onboarding-v2.welcome.desc2.title" +msgstr "Mengambil bahagian dalam Komuniti" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Buat pasukan dan hantar jemputan" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Seterusnya" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Buat pasukan & jemput" + +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Cipta pasukan" + +msgid "onboarding.choice.team-up.create-team-desc" +msgstr "" +"Selepas menamakan pasukan anda, anda akan dapat menjemput orang untuk " +"menyertai." + +msgid "onboarding-v2.newsletter.privacy2" +msgstr "" +"Kami hanya akan menghantar e-mel yang berkaitan kepada anda. Anda boleh " +"berhenti melanggan pada bila-bila masa melalui pautan nyahlanggan dalam mana-" +"mana surat berita kami." + +msgid "onboarding.team-modal.create-team-desc" +msgstr "" +"Pasukan membolehkan anda bekerjasama dengan pengguna Penpot lain yang " +"bekerja dalam fail dan projek yang sama." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Pengasas/VP" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Dapatkan kod daripada projek pasukan saya " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Bagaimanakah anda merancang untuk menggunakan Penpot?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Apakah peranan anda?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Pilih pilihan" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "settings.multiple" +msgstr "Bercampur" + +msgid "shortcuts.cut" +msgstr "Potong" + +msgid "shortcuts.delete" +msgstr "Padam" + +msgid "shortcuts.draw-curve" +msgstr "Lengkung" + +msgid "shortcuts.delete-node" +msgstr "Padamkan nod" + +msgid "shortcuts.font-size-inc" +msgstr "Tambah saiz fon" + +msgid "shortcuts.go-to-drafts" +msgstr "Pergi ke draf" + +msgid "shortcuts.go-to-libs" +msgstr "Pergi ke perpustakaan kongsi" + +msgid "shortcuts.detach-component" +msgstr "Tanggalkan komponen" + +msgid "shortcuts.draw-ellipse" +msgstr "elips" + +msgid "shortcuts.draw-frame" +msgstr "Papan" + +msgid "shortcuts.draw-nodes" +msgstr "Lukis laluan" + +msgid "shortcuts.draw-path" +msgstr "Laluan" + +msgid "shortcuts.draw-text" +msgstr "Teks" + +msgid "shortcuts.draw-rect" +msgstr "Segi empat tepat" -- Gitee From 062c086eca7aed8ac90237aa2dd68c39a5344a52 Mon Sep 17 00:00:00 2001 From: Stas Haas Date: Mon, 12 Feb 2024 12:19:51 +0000 Subject: [PATCH 0416/1266] :globe_with_meridians: Add translations for: German. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/ --- frontend/translations/de.po | 400 +++++++++++++++++++++++++++++++++++- 1 file changed, 399 insertions(+), 1 deletion(-) diff --git a/frontend/translations/de.po b/frontend/translations/de.po index 9ae1cc35d..d8df88a3f 100644 --- a/frontend/translations/de.po +++ b/frontend/translations/de.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-25 13:07+0000\n" +"PO-Revision-Date: 2024-02-12 19:01+0000\n" "Last-Translator: Stas Haas \n" "Language-Team: German " "\n" @@ -5333,3 +5333,401 @@ msgstr "Aktualisieren" msgid "workspace.viewport.click-to-close-path" msgstr "Klicken Sie, um den Pfad zu schließen" + +msgid "workspace.options.component.copy" +msgstr "Kopieren" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Developer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Produkt- oder Projektmanager" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Marketing" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "Ich arbeite an einem persönlichen Projekt" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Rechteck" + +msgid "workspace.options.component.main" +msgstr "Main" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Ich bin ein Freelancer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...Branding, Illustrationen, Marketingmaterialien, usw." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Einige" + +msgid "workspace.layout_grid.editor.title" +msgstr "Raster bearbeiten" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "Mehr als 50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Weiter" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "Wie groß ist Ihr Team?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "... Wireframes, User Journeys & Flows, Navigationsbäume usw." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "Viel" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Start" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Diamant" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Wie wollen Sie Penpot nutzen?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Wählen Sie eine Option" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Designer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Keine" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Trennen" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Sketch" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Dreieck" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "Es ist in keiner Datei aktiviert." +msgstr[1] "Sie sind in keiner Datei aktiviert." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Sonstiges (bitte angeben)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Testen Sie Penpot, um zu sehen, ob es für das Team geeignet ist " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Schüler oder Lehrer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Feedback für mein Team-Projekt hinterlassen" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "InVision" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canva" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "Mehr über Penpot erfahren" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "Zurück" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Mit der Arbeit an meinem Projekt beginnen" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Pfeil" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "Mit welchem Design-Tool haben Sie mehr Erfahrung?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Was ist Ihre Rolle?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Gründer/VP" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Kreis" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... Interface-Design, visuelle Assets, Designsysteme usw." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Arbeiten an Konzeptideen" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Ihr Feedback wird uns helfen, Ihre Gewohnheiten und Vorlieben zu verstehen, " +"damit wir Penpot weiterhin zu einem nützlichen und angenehmen Werkzeug " +"machen können." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "" +"Wie würden Sie Ihre Erfahrungen bei der Arbeit an … am besten beschreiben?" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "Geteilte Bibliothek" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Testen Sie Penpot, bevor Sie es auf einem eigenen Server verwenden" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Code aus meinem Teamprojekt erhalten " + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "" +"Assets, die bereits in dieser Datei verwendet wurden, bleiben dort erhalten (" +"das Design bleibt erhalten)." +msgstr[1] "" +"Assets, die bereits in diesen Dateien verwendet wurden, bleiben dort " +"erhalten (das Design bleibt erhalten)." + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Ihre Bibliothek ist leer. Sobald es als Geteilte Bibliothek hinzugefügt " +"wurde, können die von Ihnen erstellten Assets in den übrigen Dateien " +"verwendet werden. Sind Sie sicher, dass Sie es veröffentlichen möchten?" + +msgid "media.radial" +msgstr "Radial" + +msgid "workspace.top-bar.read-only.done" +msgstr "Fertig" + +msgid "media.image" +msgstr "Bild" + +msgid "media.linear" +msgstr "Linear" + +msgid "media.gradient" +msgstr "Verlauf" + +msgid "media.solid" +msgstr "Einfarbig" + +msgid "media.choose-image" +msgstr "Bild auswählen" + +msgid "workspace.options.guides.title" +msgstr "Hilfslinien" + +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**Inspektionsmodus** (nur Ansicht)" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Die Datei hat eine inkompatible Versionsnummer" + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Inkompatible Funktion '%s' erkannt" + +msgid "errors.validation" +msgstr "Validierungsfehler" + +msgid "errors.paste-data-validation" +msgstr "Ungültige Daten in der Zwischenablage" + +msgid "labels.search" +msgstr "Suchen" + +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Ohne Team starten" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Sie können später ein Team erstellen." + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Ohne Team fortsetzen" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Team erstellen und Einladungen versenden" + +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Mit der Erstellung eines Teams fortsetzen" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Team ohne Einladungen erstellen" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Team erstellen & einladen" + +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Team erstellen" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Sie können später einladen" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Fertig" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Beenden" + +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Grid bearbeiten" + +msgid "workspace.options.component.swap" +msgstr "Komponente austauschen" + +msgid "workspace.options.component.swap.empty" +msgstr "Es gibt noch keine Assets in dieser Bibliothek" + +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Wenn Sie ein neues Konto erstellen, stimmen Sie unseren " +"[Nutzungsbedingungen](%s) und [Datenschutzrichtlinien](%s) zu." + +msgid "labels.share" +msgstr "Teilen" + +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Nicht gesetzt" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Lokalisieren" + +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Es scheint eine Nichtübereinstimmung zwischen den aktivierten Funktionen und " +"den Funktionen der Datei zu geben. Die Migrationen für '%s' müssen " +"durchgeführt werden, bevor die Datei geöffnet werden kann." + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Flow" + +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Zum dunklen Theme wechseln" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Laden…" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Spalte löschen" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Spalte und Formen löschen" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Zeile duplizieren" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Zeile löschen" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Zeile und Formen löschen" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Zellen zusammenführen" + +msgid "workspace.context-menu.grid-cells.area" +msgstr "Bereich erstellen" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Board erstellen" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "1 Spalte links einfügen" + +msgid "shortcuts.toggle-theme" +msgstr "Theme ändern" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "Zum hellen Theme wechseln" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Spalte duplizieren" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "1 Zeile unterhalb einfügen" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "1 Zeile oberhalb einfügen" + +msgid "dashboard.import.analyze-error.components-v2" +msgstr "" +"Datei mit Komponenten v2 aktiviert, aber dieses Team unterstützt es noch " +"nicht." + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "1 Spalte rechts einfügen" -- Gitee From 8adcb82c45368c60818b5b7c2db9bafb3bad63c7 Mon Sep 17 00:00:00 2001 From: TheScientistPT Date: Mon, 12 Feb 2024 15:26:14 +0000 Subject: [PATCH 0417/1266] :globe_with_meridians: Add translations for: Portuguese (Portugal). Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/ --- frontend/translations/pt_PT.po | 238 ++++++++++++++++++++++++++++++++- 1 file changed, 234 insertions(+), 4 deletions(-) diff --git a/frontend/translations/pt_PT.po b/frontend/translations/pt_PT.po index d68ee2f49..dc96bdf76 100644 --- a/frontend/translations/pt_PT.po +++ b/frontend/translations/pt_PT.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-24 12:55+0000\n" -"Last-Translator: Anonymous \n" -"Language-Team: Portuguese (Portugal) " -"\n" +"PO-Revision-Date: 2024-02-12 19:02+0000\n" +"Last-Translator: TheScientistPT \n" +"Language-Team: Portuguese (Portugal) \n" "Language: pt_PT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -5240,3 +5240,233 @@ msgstr "Clica para fechar o caminho" #~ msgid "workspace.options.layout.direction.left" #~ msgstr "Linha" + +msgid "workspace.options.component.copy" +msgstr "Cópia" + +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "1 ficheiro foi importado com sucesso." +msgstr[1] "%s ficheiros foram importados com sucesso." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.accept" +msgid_plural "modals.unpublish-shared-confirm.accept" +msgstr[0] "Cancelar publicação" +msgstr[1] "Cancelar publicações" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Retângulo" + +msgid "workspace.options.component.main" +msgstr "Principal" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Diamante" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Desacoplar" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Triângulo" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Seta" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"A tua biblioteca está vazia. Assim que ela seja adicionada como uma " +"biblioteca partilhada, os recursos que criares nela estarão disponíveis para " +"serem usados nos teus outros ficheiros. Tens a certeza que queres publicá-la?" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Círculo" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-delete-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "O teu ficheiro foi apagado com sucesso" +msgstr[1] "Os teus ficheiros foram apagados com sucesso" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-duplicate-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "O teu ficheiro foi duplicado com sucesso" +msgstr[1] "Os teus ficheiros foram duplicados com sucesso" + +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Continuar criação de equipa" + +msgid "workspace.options.guides.title" +msgstr "Guias" + +msgid "media.choose-image" +msgstr "Escolher imagem" + +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Ao criar uma nova conta, concordas com os nossos [termos de serviço](%s) e [" +"política de privacidade](%s)." + +msgid "workspace.options.component.swap.empty" +msgstr "Ainda não existem recursos nesta biblioteca" + +msgid "media.solid" +msgstr "Sólido" + +msgid "workspace.top-bar.read-only.done" +msgstr "Feito" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Criar equipa e convidar" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Feito" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Continuar sem equipa" + +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Sem atribuição" + +msgid "errors.validation" +msgstr "Erro de validação" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Sair" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "O ficheiro tem um número de versão incompatível" + +msgid "workspace.options.component.swap" +msgstr "Trocar de componente" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Criar equipa sem convidar" + +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Parece que existem discrepâncias entre as funcionalidades ativadas e as " +"funcionalidades do ficheiro que estás a tentar abrir. Será necessário " +"aplicar migrações para '%s' antes de poder abrir o ficheiro." + +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Criar equipa" + +msgid "media.linear" +msgstr "Linear" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Fluxo" + +msgid "labels.search" +msgstr "Pesquisar" + +msgid "media.image" +msgstr "Imagem" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Poderás criar uma equipa mais tarde." + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Criar equipa e enviar convites" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Localizar" + +msgid "media.gradient" +msgstr "Gradiente" + +msgid "labels.share" +msgstr "Partilhar" + +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Editar grelha" + +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Começar sem equipa" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Poderás enviar convites mais tarde" + +msgid "media.radial" +msgstr "Radial" + +msgid "errors.paste-data-validation" +msgstr "Dados inválidos na área de transferência" + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Funcionalidade incompatível '%s' detetada" + +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**Modo de inspeção** (Somente leitura)" + +msgid "shortcuts.toggle-theme" +msgstr "Mudar tema" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "Mudar para tema claro" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Duplicar coluna" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Adicionar 1 coluna à esquerda" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Adicionar 1 coluna à direita" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Eliminar coluna" + +msgid "workspace.context-menu.grid-cells.area" +msgstr "Criar área" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Apagar coluna e conteúdos" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Duplicar fila" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Adicionar 1 fila acima" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Apagar fila" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Apagar fila e conteúdos" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Unir células" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Criar prancheta" + +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Alterar para tema escuro" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "A carregar…" + +msgid "dashboard.import.analyze-error.components-v2" +msgstr "" +"Ficheiro exportado com componentes v2 mas a equipa atual ainda não os " +"suporta." + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Adicionar 1 fila abaixo" -- Gitee From 316242ac677665937e7e9eb162b05151963aa39b Mon Sep 17 00:00:00 2001 From: Stephan Paternotte Date: Sun, 11 Feb 2024 18:37:40 +0000 Subject: [PATCH 0418/1266] :globe_with_meridians: Add translations for: Dutch. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/ --- frontend/translations/nl.po | 209 +++++++++++++++++++++++++++++++++++- 1 file changed, 208 insertions(+), 1 deletion(-) diff --git a/frontend/translations/nl.po b/frontend/translations/nl.po index ce1b4c484..e3f9bd677 100644 --- a/frontend/translations/nl.po +++ b/frontend/translations/nl.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-25 13:07+0000\n" +"PO-Revision-Date: 2024-02-12 19:02+0000\n" "Last-Translator: Stephan Paternotte \n" "Language-Team: Dutch " "\n" @@ -5337,3 +5337,210 @@ msgstr "Bijwerken" msgid "workspace.viewport.click-to-close-path" msgstr "Klik om het pad te sluiten" + +msgid "workspace.options.component.copy" +msgstr "Kopiëren" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Rechthoek" + +msgid "workspace.options.component.main" +msgstr "Hoofd" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Ruit" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Ontkoppelen" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Driehoek" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Pijl" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Je bibliotheek is leeg. Eenmaal toegevoegd als Gedeelde Bibliotheek, zijn de " +"assets die je aanmaakt beschikbaar voor gebruik in de rest van je bestanden. " +"Weet je zeker dat je dit wilt publiceren??" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Cirkel" + +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Doorgaan met team aanmaken" + +msgid "workspace.options.guides.title" +msgstr "Hulplijnen" + +msgid "media.choose-image" +msgstr "Afbeelding kiezen" + +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Met het aanmaken van een nieuw account ga je akkoord met onze " +"[servicevoorwaarden] (%s) en [privacybeleid] (%s)." + +msgid "workspace.options.component.swap.empty" +msgstr "Er zijn nog geen assets in deze bibliotheek" + +msgid "media.solid" +msgstr "Solide" + +msgid "workspace.top-bar.read-only.done" +msgstr "Klaar" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Team aanmaken & uitnodigen" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Klaar" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Doorgaan zonder team" + +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Uitschakelen" + +msgid "errors.validation" +msgstr "Validatiefout" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Sluiten" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Bestand heeft een incompatibel versienummer" + +msgid "workspace.options.component.swap" +msgstr "Component uitwisselen" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Team aanmaken zonder uitnodigingen" + +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Het lijkt erop dat er een discrepantie bestaat tussen de ingeschakelde " +"functies en de functies van het bestand dat je probeert te openen. Er moeten " +"migraties voor '%s' worden toegepast voordat het bestand kan worden geopend." + +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Team aanmaken" + +msgid "media.linear" +msgstr "Lineair" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Stroomdiagram" + +msgid "labels.search" +msgstr "Zoeken" + +msgid "media.image" +msgstr "Afbeelding" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Je kunt later een team samenstellen." + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Team aanmaken en uitnodigingen versturen" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Lokaliseren" + +msgid "media.gradient" +msgstr "Verloop" + +msgid "labels.share" +msgstr "Delen" + +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Raster bewerken" + +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Zonder team beginnen" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Je kunt later uitnodigen" + +msgid "media.radial" +msgstr "Radiaal" + +msgid "errors.paste-data-validation" +msgstr "Ongeldige gegevens op klembord" + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Incompatibele functie '%s' gedetecteerd" + +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "** Inspectiemodus ** (alleen bekijken)" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Laden…" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Links 1 kolom toevoegen" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Rij dupliceren" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Boven 1 rij toevoegen" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Onder 1 rij toevoegen" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Rij verwijderen" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Rij en vormen verwijderen" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Cellen samenvoegen" + +msgid "workspace.context-menu.grid-cells.area" +msgstr "Gebied aanmaken" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Bord aanmaken" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Rechts 1 kolom toevoegen" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Kolom verwijderen" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Kolom en vormen verwijderen" + +msgid "dashboard.import.analyze-error.components-v2" +msgstr "" +"Bestand met componenten v2 geactiveerd, maar dit team ondersteunt dit nog " +"niet." + +msgid "shortcuts.toggle-theme" +msgstr "Thema veranderen" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "Licht thema inschakelen" + +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Donker thema inschakelen" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Kolom dupliceren" -- Gitee From d2a85dcd3772c5ee34afc0a2121445b45a3586bb Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 13 Feb 2024 07:31:10 +0100 Subject: [PATCH 0419/1266] :globe_with_meridians: Added translation for: Yoruba. --- frontend/translations/yo.po | 4613 +---------------------------------- 1 file changed, 1 insertion(+), 4612 deletions(-) diff --git a/frontend/translations/yo.po b/frontend/translations/yo.po index 183625c52..4f8f6e6de 100644 --- a/frontend/translations/yo.po +++ b/frontend/translations/yo.po @@ -1,4613 +1,2 @@ msgid "" -msgstr "" -"PO-Revision-Date: 2024-04-24 13:04+0000\n" -"Last-Translator: Anonymous \n" -"Language-Team: Yoruba " -"\n" -"Language: yo\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.5.1-dev\n" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.check-your-email" -msgstr "" -"yẹ ímeèlì rẹ wò kí o tẹ ọ̀nà-àsopọ̀ láti mọ̀ dájú àti láti bẹ̀rẹ̀ sí lo " -"pẹ́ńpọtì." - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.confirm-password" -msgstr "jẹ́rìísí ọ̀rọ̀-ìgbaniwọlé" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-account" -msgstr "ṣẹ̀dá ìfihàn àkáùntí" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-profile" -msgstr "kàn fẹ́ gbìyànjú ú rẹ̀?" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.demo-warning" -msgstr "" -"\"\"This is a DEMO service, DO NOT USE for real work, the projects will be " -"parẹ́ lóòrèkóòrè." - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.email" -msgstr "ímeèlì" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.forgot-password" -msgstr "gbàgbé ọ̀rọ̀-ìgbaniwọlé ?" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.fullname" -msgstr "orúkọ lẹ́kùnn-ún-rẹ́rẹ́" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.login-here" -msgstr "wọlé síbí" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-submit" -msgstr "wọlé" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-github-submit" -msgstr "ibùdó gítì" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-gitlab-submit" -msgstr "láàbù gítì" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-google-submit" -msgstr "ṣàwárí" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-ldap-submit" -msgstr "LDAP" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-oidc-submit" -msgstr "ṣílẹ̀kuǹ ìdánimọ̀" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "orúkọ kò gbọdọ̀ ju àádọ́jọ́ lẹ́tà lọ." - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.new-password" -msgstr "tẹ ọ̀rọ̀ ìgbaniwọlé tuntun" - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.invalid-token-error" -msgstr "àmì àtúnwárí ti díbàjẹ́." - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.password-changed-successfully" -msgstr "ọ̀rọ̀-ìgbaniwọlé ti yí padà dáadáa" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.profile-not-verified" -msgstr "" -"a tí ì ṣe ìwádìí bí o ṣe jẹ́, jọ̀wọ́ ṣe ìwádìí bí o ṣe jẹ́ kí o tó tẹ̀ " -"síwájú." - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.recovery-token-sent" -msgstr "a ti fi ọ̀rọ̀-ìgbaniwọle aṣàtúnwárí ránṣẹ sínu àpótí rẹ." - -#: src/app/main/ui/auth/verify_token.cljs -msgid "auth.notifications.team-invitation-accepted" -msgstr "o ti wọ inú ẹgbẹ́ bó ṣeyẹ" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.password" -msgstr "ọ̀rọ̀- ìgbaniwọlé" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-length-hint" -msgstr "kò gbọdọ̀ ju ohun kíkọ mẹ́jọ lọ" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-not-empty" -msgstr "ọ̀rọ̀-ìgbaniwọlé gbọ́dọ̀ ní nǹkan kíkọ láìsí àlàfo." - -msgid "auth.privacy-policy" -msgstr "ìpamọ ètò ìmúló" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-submit" -msgstr "ṣàtuńwárí ọ̀rọ̀-ìgbaniwọlé" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-subtitle" -msgstr "a má a fi àwọn ìtọ́nisọ́nà ránsẹ́ sínú ímeèlì rẹ" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-title" -msgstr "gbàgbé ọ̀rọ̀-ìgbaniwọle ?" - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.recovery-submit" -msgstr "yí ọ̀rọ̀-ìgbaniwọlé rẹ padà" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.register" -msgstr "kò tí ì sí àkáùntì?" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.register-submit" -msgstr "ṣẹ̀dá àkáùntì" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-subtitle" -msgstr "ọ̀fẹ́ ni,orísun rẹ̀ ṣí lẹ" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-title" -msgstr "ṣẹ̀dá àkáùntì" - -#: src/app/main/ui/auth.cljs -msgid "auth.sidebar-tagline" -msgstr "ṣíṣí orísun yíyà àti àwòrán ni yóò fi lojútùú ." - -msgid "auth.terms-of-service" -msgstr "òfin ibiṣẹ́" - -msgid "auth.terms-privacy-agreement" -msgstr "" -"\"nígbà, tí o bá ń ṣẹ̀dá àkáùntí tuntun ,o gbọ́dọ̀ gba àwọn òfin ibiṣẹ́ " -"àti àṣírí rẹ́`." - -#: src/app/main/ui/auth/register.cljs -msgid "auth.verification-email-sent" -msgstr "a ti fi ìjẹ́rìísí ránsẹ́ sínú ímeèlì rẹ" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr ".. ìyàsọ́tọ, àpèjúwe,títajà nǹkan, abbl." - -msgid "common.publish" -msgstr "ìgbéjáde" - -msgid "common.share-link.all-users" -msgstr "gbogbo àwọn tó ń lo pẹ́ńpọtì" - -msgid "common.share-link.current-tag" -msgstr "(lọ́wọ́lọ́wọ́)" - -msgid "common.share-link.destroy-link" -msgstr "pa ọ̀nà-àsopọ̀ run" - -msgid "common.share-link.get-link" -msgstr "gba ọ̀nà-àsopọ́" - -msgid "common.share-link.link-copied-success" -msgstr "so àdàkọ pọ̀ bó ṣeyẹ" - -msgid "common.share-link.manage-ops" -msgstr "ṣàkóṣo ìgbaniláàye" - -msgid "common.share-link.permissions-can-comment" -msgstr "o lè sọ̀rọ̀" - -msgid "common.share-link.permissions-can-inspect" -msgstr "ṣe àyẹ̀wò kóòdù" - -msgid "common.share-link.permissions-hint" -msgstr "ẹnikẹ́ni tí ó bá ní ọ̀nà-àsopọ á ní àǹfààní àtiwọle" - -msgid "common.share-link.permissions-pages" -msgstr "pín ojú ìwé" - -msgid "common.share-link.placeholder" -msgstr "ọ̀nà-àsopọ̀ ojú ìwé tí a pín á hàn ní bí yìí" - -msgid "common.share-link.team-members" -msgstr "ọmọ ẹgbẹ́ nìkan ni" - -msgid "common.share-link.title" -msgstr "pín àwọn àpẹrẹ" - -msgid "common.share-link.view-all" -msgstr "yan gbogbo rẹ̀" - -msgid "common.unpublish" -msgstr "ohun tí a kò tí ì kọ jáde" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.management" -msgstr "ìṣàkóṣo ọmọ ẹgbẹ" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.title" -msgstr "kẹ́gbẹ́ ṣera wọn lọ́kan" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.info" -msgstr "" -"\"kọ́ nípa kókó bi pẹ́ńpọtì nígbàtí ò ń dára rẹ láraya nípa fífi àwon " -"ọwọ́ rẹ ṣe “ “ìdánilẹ́kọ̀ọ́ ." - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.start" -msgstr "bẹ̀rẹ̀ ìdánilẹ́kọ̀ọ́" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.title" -msgstr "gbọ́wọ́ lórí idánilẹ́kọ̀ọ́" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.info" -msgstr "rìn kàákiri pẹ́ńpọti kí o lè mọ kókó àwẹn ẹ̀yà ara rẹ̀." - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.start" -msgstr "bẹ̀rẹ̀ ìrìn kiri" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.title" -msgstr "wò ó bí o ṣe ń rìn kiri" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "ṣe ìpilẹ̀sẹ̀ àmì tókìnnì" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "ṣe àyẹ̀wò àmì tókìnnì tí o ṣẹ̀dá bó ṣeyẹ." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "tẹ bọ́tìnnì \" ṣe ìpilẹ̀sẹ̀ àmì tókìnnì tuntun\" láti ṣe ìpilẹ̀sẹ̀ òmíràn." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.no-access-tokens" -msgstr "o kò tí ì ní àmì tókínnì títí di ìsinsìn yìí." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "a nílò orúkọ" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "ọgọ́saǹ-ań ọjọ́" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "ọgbọ̀n ọjọ́" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-60-days" -msgstr "ọgọ́ta ọjọ́" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-90-days" -msgstr "àádọ́ruǹ-ún ọjọ́" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-never" -msgstr "rárá" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "ó parí ní %s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expires-on" -msgstr "ó parí %s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.no-expiration" -msgstr "kò sì ọjọ́ ìparí" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "àmì tokìnnì ìwọlé ti ara ẹni" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"Iṣẹ́ àmì tókìnì ìwọlé ti ara ẹni dàbì ọ̀nà kejí tí a le gbà wọlé/ ọ̀rọ̀- " -"agbaniwọle a lè lo ìfàsẹ sí ètò láti gbaye fún ohun èlò à tì wọlé " -"pẹ́ńpọtì ti abẹ́nú api" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-expire" -msgstr "àmì tòkìn yóò parí ní %s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-not-expire" -msgstr "kò sí ọjọ́ ìparí fún àmì tókìn" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.add-shared" -msgstr "ṣe àpàpọ̀ bí i yàrá ìkàwe tí a pín" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.change-email" -msgstr "pàrọ̀ ímeèlí" - -#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs -msgid "dashboard.copy-suffix" -msgstr "(dàákọ)" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.create-new-team" -msgstr "ṣẹ̀dá ẹgbẹ́ tuntun" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.default-team-name" -msgstr "pẹ́ńpọtì rẹ" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.delete-team" -msgstr "pa ẹgbẹ́ rẹ́" - -msgid "dashboard.download-binary-file" -msgstr "sọ fáìlí pẹ́ńpọtì kalẹ̀ (.penpot)" - -msgid "dashboard.download-standard-file" -msgstr "sọ fáìlì ìpéwọ̀n kalẹ̀ (.svg + .json)" - -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.duplicate" -msgstr "ṣe ẹ̀dà" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.duplicate-multi" -msgstr "ṣe ẹ̀dà %s fáìlì" - -#: src/app/main/ui/dashboard/grid.cljs -#, markdown -msgid "dashboard.empty-placeholder-drafts" -msgstr "" -"\"\" fáìlí tí a dàpọ̀ mọ yàrá ìkàwé á hàn níbí yìí. gbìyànjú láti má a " -"pín àwon fáìlì rẹ̀ tàbí ṣàfikún láti ibi [yàrá ìkàwé wa àti àwòṣe " -"](https://penpot.app/libraries-templates.html)." - -msgid "dashboard.export-binary-multi" -msgstr "sọ àwọn fáìlì pẹ́ẹ́pọtì kalẹ́ %s (.pẹ́ńpọtì)" - -msgid "dashboard.export-frames" -msgstr "fi bọọdù ráńṣẹ bí i PDF" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-frames.title" -msgstr "fi ráńṣẹ́ bí i PDF" - -msgid "dashboard.export-multi" -msgstr "fi pẹ́ńpọtì ráńṣẹ́%s files" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-multiple.selected" -msgstr "% ti %s ẹ́límẹ́ǹti tí a yàn" - -#: src/app/main/ui/workspace/header.cljs -msgid "dashboard.export-shapes" -msgstr "fi ráńṣẹ" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to" -msgstr "" -"o lé ṣe àfikún ti ètò ìfiráńṣẹ si ẹ́límẹ́ǹtì láti bi àmì ohun ìní ( níbi " -"ìsàlẹ̀ báà lẹ́gbẹ̀ẹ́ ọ̀tun )." - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to-link" -msgstr "àlàyé bí a ti ṣètò ìfiráńṣẹ sí pẹ́ńpọtì ." - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.no-elements" -msgstr "kòsí àwọn ẹ́límẹ́ǹtì pẹ̀lú ètò ìfirańńṣẹ." - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.title" -msgstr "àṣàyàn ìfiránṣẹ́" - -msgid "dashboard.export-standard-multi" -msgstr "danlóòdù %s àwọn ojúlówó fáìli (.svg + .json)" - -msgid "dashboard.export.detail" -msgstr "* ó le ní àwọn ẹ̀yà ara, àwòrán àti àwon àwọ̀ àti / tàbí àtẹ̀jáde." - -msgid "dashboard.export.options.all.message" -msgstr "" -"àwọn fáìli tí ó wà nínú yàrá ìkàwé pípín á dàpọ̀ mọ́ ti ìfiráńṣẹ́, fún " -"síṣetọ́jútheir linkage ìsopọ̀ wọn." - -msgid "dashboard.export.options.all.title" -msgstr "ṣe ìfiráńṣẹ́ yàrá ìkàwé pípín" - -msgid "dashboard.export.options.detach.message" -msgstr "" -"Shared libraries will not be included in the export and no assets will be " -"yàrá ìkàwé pípín kò ní sí nínú ti ìfiráńṣẹ́ àti pé kò ni ohun ìní kan tí " -"a ó fi kún yàrá ìkàwé. " - -msgid "dashboard.export.options.detach.title" -msgstr "ṣe ìtọ́jú ohun ìní iyàrá ìkàwé pípín bí i nǹkan tó jẹ́ kókó" - -msgid "dashboard.export.options.merge.message" -msgstr "" -"á fi fáìlì rẹ ráńṣẹ́ pẹ̀lú gbogbo àwọn ohun ìní tó wà láyìíka ni a ó papọ̀ " -"sínú fáìlì yàrá ìkàwé." - -msgid "dashboard.export.options.merge.title" -msgstr "da ohun ìní yàrá ìkàwé pípín pọ̀ mọ́ fáìlì yàrá ìkàwé" - -msgid "dashboard.export.title" -msgstr "fi àwọn fáìlì ráńṣẹ" - -msgid "dashboard.fonts.deleted-placeholder" -msgstr "fọ́ǹtì tó sọnù" - -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.dismiss-all" -msgstr "yọ gbogbo wọn kúrò" - -msgid "dashboard.fonts.empty-placeholder" -msgstr "àwọn fọ́ǹtì tí o ọpulóòdù yó hàn níbí." - -#, markdown -msgid "dashboard.fonts.hero-text1" -msgstr "" -"èyíkéyìí wẹ́bù fọ́ǹtì tí o bá ti ọpulóòdù níbí ni á di àkópọ̀ mọ́ ẹbí " -"fọ́ǹtì àwọn ọ̀rọ̀ ohun ìní tí o wà nínú àwọn fáìlì ẹgbẹ́. Fọ́ǹtì " -"pẹ̀lú u orúkọ ẹbi fọ́ǹtì kanna la ó dàpọ̀ mọ́ ẹgbẹ́ bí i**ẹbí fọ́ǹtì kan " -"soso**. O lè ọpulóòdù fọ́ǹtì pẹ̀lú àwọn ìlànà wọ̀nyí: **TTF, OTF and " -"WOFF** (ẹyọ kan péré la ó nílò)." - -#, markdown -msgid "dashboard.fonts.hero-text2" -msgstr "" -"àwọn fọ́ǹtì tí ó bá jẹ́ tì ẹ nìkan ni o lè ọpulóòdù tàbí èyí tí o ní ìwé " -"àṣẹ láti lò ní pẹ́ńpọtì. Wá a sí i nínú kọ́ńtẹ́tì abala apá ọ̀tún àwọn " -"òfin pẹ́ńpọtìiṣẹ́](https://pẹ́ńpọtì.apù/àwọn òfin.html). o sì le fẹ́ kà " -"nípa[ ìwé àṣẹ- pẹ́ńpọtì](https://www.taipogíráfì.com/faq)." - -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.upload-all" -msgstr "ọpulóòdù gbogbo rẹ̀" - -#, markdown -msgid "dashboard.fonts.warning-text" -msgstr "" -"a ti ṣàwárí àwọn ohun tí ó le fa wàhálà nínú àwọn fọ́ǹtì ìlànà olóòro " -"oríṣiríṣi àwọn ètò tó wà fún ìṣesí ọ̀nà ẹ̀rọ. láti ṣe àyẹ̀wò rẹ̀ o lè " -"lofont vertical metrics services like ìlànà fọ́ǹtì olóòró fún àwọn iṣẹ́ " -"ọ̀nà ẹ̀rọ bí i [èyí èkínní](https://mẹ́tíríkì ìlànà olóòró.netlify .app/). " -"Ní àfikún, a rẹkọmẹ́ǹdì lílo[tíráńsìfọtà(https://tíráńsìfọtà.org/) láti " -"pilẹ̀ṣẹ̀ àwọn wẹ́bù fọ́ǹtì láti túnṣeàsìṣe. " - -msgid "dashboard.import" -msgstr "gbé àwọn fáìlì pẹ́ńpọtì wọlé" - -msgid "dashboard.import.analyze-error" -msgstr "ooho! a kò lè gbé fáìlì yìí wọlé" - -msgid "dashboard.import.import-error" -msgstr "wàhálà wà láti gbé kan wà láti gbé fáìlì wọlé . fáìlì kò wọlé." - -msgid "dashboard.import.import-warning" -msgstr "àwọn fáìlì tí ó ní nǹkan tí kò fẹsẹ múlẹ̀ ti di yíyọ kúro." - -msgid "dashboard.import.progress.process-colors" -msgstr "síṣe ètò àwọ̀" - -msgid "dashboard.import.progress.process-components" -msgstr "síṣe ètò àwọn irin iṣẹ́" - -msgid "dashboard.import.progress.process-media" -msgstr "síṣe ètò àwọn ohun ìgbéròyìn jáde" - -msgid "dashboard.import.progress.process-page" -msgstr "síṣe ètò ojú ìwe : %s" - -msgid "dashboard.import.progress.process-typographies" -msgstr "síṣe ètò àkọsílẹ̀ ojú ìwé" - -msgid "dashboard.import.progress.upload-data" -msgstr "ọpulóòdù dátà sínú sáfà (%s/%s)" - -msgid "dashboard.import.progress.upload-media" -msgstr "ọpulóòdù fáìlì: %s" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.invite-profile" -msgstr "pe àwọn ènìyàn" - -#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.leave-team" -msgstr "fẹgbẹ́ sílẹ̀" - -msgid "dashboard.libraries-and-templates" -msgstr "yàrá ìkàwé àti àwọn àwòṣe" - -msgid "dashboard.libraries-and-templates.explore" -msgstr "ṣe ìwákiri ọ̀pọ̀ wọn kí o sì mọ bí ó ṣe sojúṣe tiẹ" - -msgid "dashboard.libraries-and-templates.import-error" -msgstr "wàhálà wà fún gbígbé tẹ́ńpílétì wọlé. tẹ́ńpílétì kò wọlé." - -#: src/app/main/ui/dashboard/libraries.cljs -msgid "dashboard.libraries-title" -msgstr "yàrá ìkàwé" - -#: src/app/main/ui/dashboard/grid.cljs -msgid "dashboard.loading-files" -msgstr "ṣe ìkójọpọ̀ àwọn fáìlí rẹ …" - -msgid "dashboard.loading-fonts" -msgstr "ṣèkójọpọ̀ àwọ fọ́ǹtì rẹ …" - -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to" -msgstr "gbé lọ" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to-multi" -msgstr "gbé %s àwọn fáìlì lọ" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to-other-team" -msgstr "gbé lọ sí ẹgbẹ́ mìíràn" - -#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/files.cljs -msgid "dashboard.new-file" -msgstr "+ fáìlì tuntun" - -#: src/app/main/data/dashboard.cljs -msgid "dashboard.new-file-prefix" -msgstr "fáìlì tuntun" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dashboard.new-project" -msgstr "+ iṣẹ́ àgbéṣe tuntun" - -#: src/app/main/data/dashboard.cljs -msgid "dashboard.new-project-prefix" -msgstr "iṣẹ́ àgbéṣe tuntun" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.no-matches-for" -msgstr "kò sí èyí tó báramu fún un“%s“" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.no-projects-placeholder" -msgstr "àwon iṣẹ́ àgbéṣe tí a kànpọ á hàn níbí" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "dashboard.notifications.email-changed-successfully" -msgstr "a ti mú ímeèlì rẹ dójú ìwọn dáadáa" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "dashboard.notifications.email-verified-successfully" -msgstr "a ti ṣe ìwádìí ímeèlì rẹ dáadáa" - -#: src/app/main/ui/settings/password.cljs -msgid "dashboard.notifications.password-saved" -msgstr "a ti fi ọ̀rọ̀ ìgbaniwọlé rẹ pamọ́ dáadáa!" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.num-of-members" -msgstr "%s àwọn ọmọ ẹgbẹ́" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.open-in-new-tab" -msgstr "ṣí fáìlì sínú tábù tuntun" - -msgid "dashboard.options" -msgstr "àwọn àṣàyàn" - -#: src/app/main/ui/settings/password.cljs -msgid "dashboard.password-change" -msgstr "yí ọ̀rọ̀ ìgbaniwọlé padà" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.pin-unpin" -msgstr "pínì/yọ pínì kúrò" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dashboard.projects-title" -msgstr "àwọn iṣẹ́ àgbéṣe" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.remove-account" -msgstr "o fẹ́ yọ àkáǹtì rẹ kúro?" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.remove-shared" -msgstr "yọ ọ́ kúrò gẹ́gẹ́ bí yàrá kàwé pípín" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.save-settings" -msgstr "fi àwọn eto pamọ́" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.search-placeholder" -msgstr "ṣàwárí…" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.searching-for" -msgstr "ṣàwárí fún “%s“…" - -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.select-ui-language" -msgstr "yan èdè ui" - -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.select-ui-theme" -msgstr "yan àkọlé" - -#: src/app/main/ui/dashboard/grid.cljs -msgid "dashboard.show-all-files" -msgstr "fi gbogbo àwn fáìlì hàn" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.success-delete-project" -msgstr "iṣẹ́ àgbéṣe rẹ ti parẹ́ dáadáa" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.success-duplicate-project" -msgstr "a ti ṣe ẹ̀dà iṣẹ́ àgbéṣe rẹ dáadáa" - -#: src/app/main/ui/dashboard/grid.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-move-file" -msgstr "a ti gbé fáìlì rẹ kúro dáadáa" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-move-files" -msgstr "a ti gbé àwọn fáìlì rẹ kúrò dáadáa" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.success-move-project" -msgstr "a ti gbé iṣẹ́ àgbéṣe rẹ kúrò dáadáa" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-info" -msgstr "àlàyé ẹgbẹ́" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-members" -msgstr "àwọn ọmọ ẹgbẹ́" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-projects" -msgstr "iṣẹ́ àgbéṣe ọmọ ẹgbẹ́" - -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.theme-change" -msgstr "àkọlé ui" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.title-search" -msgstr "ṣàwárí àwọn èsì" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.type-something" -msgstr "tẹ̀ láti rí àwọn èsì" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.unpublish-shared" -msgstr "yàrá ìkàwé tí a kòtí ì gbé jáde" - -#: src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs -msgid "dashboard.update-settings" -msgstr "mú àwọn ètò dójú ìwọ̀n" - -msgid "dashboard.webhooks.active" -msgstr "ti ń siṣẹ́" - -msgid "dashboard.webhooks.active.explain" -msgstr "When this hook is triggered event details will be delivered" - -msgid "dashboard.webhooks.content-type" -msgstr "ẹ̀yà kọ́ńtẹ́ǹtì" - -msgid "dashboard.webhooks.create" -msgstr "ṣẹ̀dá ìkọ́-wẹ́bù" - -msgid "dashboard.webhooks.create.success" -msgstr "a ti ṣẹ̀dá ìkọ́-wẹ́bù dáadáa ." - -msgid "dashboard.webhooks.description" -msgstr "" -"àwọn ìkọ́-wẹ́bù jẹ́ ọ̀nà tó rọrùn láti fi ààyè sílẹ̀ fún àwọn ààyè " -"ayélujára mìíràn àti awọn ápù ṣe filọ́ tí àwọn ìṣẹ̀lẹ̀ kan bá ní " -"pẹ́ńpọtì’’ a ó fi ìbéèrè ráńṣẹ́ sí ọ̀kọ̀kan wọn tí urls tó o pèsè." - -msgid "dashboard.webhooks.empty.add-one" -msgstr "tẹ bọ́tínnì \"fikún ìkọ́- wẹ́bù\" láti fì kan sí i." - -msgid "dashboard.webhooks.empty.no-webhooks" -msgstr "kò sí ìkọ́-wẹ́bù tí a ṣẹ̀da´dì sisìnyí." - -#: src/app/main/ui/settings.cljs -msgid "dashboard.your-account-title" -msgstr "àkáǹtì rẹ" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.your-email" -msgstr "ímeèlì" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.your-name" -msgstr "ímeèlì rẹ" - -#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.your-penpot" -msgstr "pẹ́ńpọtì rẹ" - -#: src/app/main/ui/alert.cljs -msgid "ds.alert-ok" -msgstr "ó dára" - -#: src/app/main/ui/alert.cljs -msgid "ds.alert-title" -msgstr "àkíyèsí" - -#: src/app/main/ui/confirm.cljs -msgid "ds.component-subtitle" -msgstr "ní láti ṣe ìmúdójú ìwọ̀n àwọn irin iṣẹ́:" - -#: src/app/main/ui/confirm.cljs -msgid "ds.confirm-cancel" -msgstr "fagilé e" - -#: src/app/main/ui/confirm.cljs -msgid "ds.confirm-ok" -msgstr "ó dára" - -#: src/app/main/ui/auth/login.cljs -msgid "errors.auth-provider-not-configured" -msgstr "a kò tí ì fàṣẹ si àtúntò olùpèṣè." - -msgid "errors.auth.unable-to-login" -msgstr "ó dàbí pé o kò tí ì fàṣẹ sí i tàbí àkókò ti kọjá ." - -msgid "errors.bad-font" -msgstr "fọ́ǹtì %s kò ṣe kójọpọ̀" - -msgid "errors.bad-font-plural" -msgstr "àwọn fọ́ǹtì %s kò ṣe kójọpọ̀" - -msgid "errors.cannot-upload" -msgstr "kò le ọpulóòdù fáìlì ìgbéròyìn-jáde." - -#: src/app/main/data/workspace.cljs -msgid "errors.clipboard-not-implemented" -msgstr "a ṣàwákiri rẹ kò le ṣe iṣẹ́ yìí" - -#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs -msgid "errors.email-already-exists" -msgstr "ímeèlì yìí ti jẹ́ lílò tẹ́lẹ" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.email-already-validated" -msgstr "a ti fọwọ́ sí ímeèlì rẹ tẹ́lẹ̀." - -msgid "errors.email-as-password" -msgstr "o kò le lo ímeèlì rẹ gẹ́gẹ́ bí ọ̀rọ̀ ìgbaniwọlé" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.email-has-permanent-bounces" -msgstr "Ímeèlì «%s» ti ní ìjábọ̀ ọ̀pọ̀ọlọpọ̀ ìta-bọn-ọ̀n ti pẹ́." - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs -msgid "errors.email-invalid" -msgstr "Tẹ àti wọlé pẹ̀lú ímeèlì tó wúlo jọ̀wọ́" - -#: src/app/main/ui/settings/change_email.cljs -msgid "errors.email-invalid-confirmation" -msgstr "Ímeèlì tí a ti mọ̀dájú gbọ́dọ̀ báramu" - -msgid "errors.email-spam-or-permanent-bounces" -msgstr "Ímeèlì ti «%s» ń jábọ̀ gẹ́gẹ́ bí i awúrúju tàbí ìta-bọ̀n-ọnọǹ tipẹ́." - -#: src/app/main/errors.cljs -msgid "errors.feature-not-supported" -msgstr "Àwọn ẹ̀yà ara ẹ̀rọ '%s' kò ní àtìlẹ́yìn." - -#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.generic" -msgstr "Àsìṣe kan ti ṣẹlẹ̀." - -#: src/app/main/ui/components/color_input.cljs -msgid "errors.invalid-color" -msgstr "àwọ̀ tó ti díbàjẹ́" - -msgid "errors.invite-invalid.info" -msgstr "Èyí tí a pè le parẹ́ tàbí ki àkókò lekọjá ." - -#: src/app/main/ui/auth/login.cljs -msgid "errors.ldap-disabled" -msgstr "Ìfàṣẹsí LDAP kò ṣe é ṣe ." - -#: src/app/main/errors.cljs -msgid "errors.max-quote-reached" -msgstr "O ti débi '%s' ìfàmìsí. Késí i pẹ̀lú àtìlẹ́yìn ." - -#: src/app/main/data/workspace/persistence.cljs -msgid "errors.media-too-large" -msgstr "Àwòrán tóbi púpọ ju ohun tí a le fisí lọ." - -#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs -msgid "errors.media-type-not-allowed" -msgstr "Ó dàbí pé èyí kì í ṣe àwòrán tó fẹsẹ́ múlẹ̀." - -#: src/app/main/ui/dashboard/team.cljs -msgid "errors.member-is-muted" -msgstr "" -"Pírófáìlì ímeèlì tí ò ǹ pè ti dákẹ (ti jábọ̀ àwúrúju tàbí ìtabọ̀n-ọ̀n tó " -"ga)." - -#: src/app/main/ui/settings/password.cljs -msgid "errors.password-invalid-confirmation" -msgstr "Ijẹ́rìísí ọ̀rọ̀ ìgbaniwọlé rẹ gbọ́dọ̀ báramu" - -#: src/app/main/ui/settings/password.cljs -msgid "errors.password-too-short" -msgstr "Ọ̀rọ̀ ìgbaniwọlé kò gbọdọ̀ dín ní lẹ́tà mẹ́jọ" - -msgid "errors.profile-blocked" -msgstr "Ti dínà mọ́ pírófáìlì" - -#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.profile-is-muted" -msgstr "Ímeèlì pírófáìlì rẹ ti ní ìdákẹ́ (ìjábọ̀ àwúrúju tàbí ìtabọ̀n-ọ̀n tó ga)." - -#: src/app/main/ui/auth/register.cljs -msgid "errors.registration-disabled" -msgstr "Ìforúkọ-sílẹ̀ kò ṣe é ṣe lọ́wọ́lọ́wọ́." - -msgid "errors.team-leave.insufficient-members" -msgstr "kí àwọn ọmọ ẹgbẹ́ tí kò péye fi ẹgbẹ́ sílẹ̀, àbí bóyá o fẹ́ paárẹ́ ni ." - -msgid "errors.team-leave.member-does-not-exists" -msgstr "Kòsí ọmọ ẹgbẹ́ tí o fẹ́ yàn ." - -msgid "errors.team-leave.owner-cant-leave" -msgstr "Oní nǹkan kò le fi ẹgbẹ́ sílẹ̀ , o gbọ́dọ̀ tún ṣe àtúnyàn iṣẹ́ oní nǹkan." - -#: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "errors.unexpected-error" -msgstr "Àsìṣe tí a kòrò tẹ́lẹ̀ ti ṣẹlẹ." - -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.unexpected-token" -msgstr "Tókìnnì àìmọ̀" - -msgid "errors.webhooks.connection" -msgstr "Àsìṣe nínú ètò ìsopọ̀, kò lè dé ibi URL" - -msgid "errors.webhooks.invalid-uri" -msgstr "URL kò páásì ìfọwọ́sí." - -#, fuzzy -msgid "errors.webhooks.last-delivery" -msgstr "Èyí tí a fijíṣẹ́ kẹ́yìn kò dára." - -msgid "errors.webhooks.ssl-validation" -msgstr "Àsìṣe nínú ìfẹwọ́sí SSL ." - -msgid "errors.webhooks.timeout" -msgstr "Àkókò ti lọ" - -msgid "errors.webhooks.unexpected" -msgstr "Unexpected error on validating àsìṣe àìròtẹ́lẹ̀ lórí ìfọwọ́sí" - -msgid "errors.webhooks.unexpected-status" -msgstr "Ipò àìròtẹ́lẹ̀ %s" - -#: src/app/main/ui/auth/login.cljs -msgid "errors.wrong-credentials" -msgstr "Ímeèlì tàbí ọ̀rọ̀ ìgbaniwọlé kò tọ̀nà." - -#: src/app/main/ui/settings/password.cljs -msgid "errors.wrong-old-password" -msgstr "Ọ̀rọ̀ ìgbaniwọlé ti àtijọ́ kò tọ̀nà" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.description" -msgstr "Àpèjúwe" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-go-to" -msgstr "Lọ ibi àpérò pẹ́ńpọtì" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-subtitle1" -msgstr "" -"Inú wa dùn láti rí ẹ níbí. Tí o bá nílò ìrànlọ́wọ, please search before " -"you jọ̀wọ́ ṣàwárí kí o tó firáńṣẹ́." - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-title" -msgstr "Agbègbè pẹ́ńpọtì" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.subject" -msgstr "Kókó-ọ̀rọ̀" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.subtitle" -msgstr "" -"Jọ̀wọ́ ṣàpèjúwe ìdí tó wà fún ímeèlì rẹ, ṣàfihàn tì àríyànjiyàn bá wà, le " -"jẹ́ èrò tàbí síṣe iyèméjì. Ìkan lára àwọn ọmọ ẹgbẹ́ wa yóò dáhùn láìpẹ́ " -"láìjìnnà." - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.title" -msgstr "Ímeèlì" - -#: src/app/main/ui/settings/feedback.cljs -#, fuzzy -msgid "feedback.twitter-go-to" -msgstr "Lọ sí Tíwítà" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.twitter-subtitle1" -msgstr "A wà níbí láti ṣe ìrànlọ́wọ́ fún àwọn ìbéèrè tó bá wà lórí iṣẹ́ ọnà." - -#: src/app/main/ui/settings/feedback.cljs -#, fuzzy -msgid "feedback.twitter-title" -msgstr "Àkáùnti àtìlẹ́yìn fún Tíwítà" - -#: src/app/main/ui/settings/password.cljs -msgid "generic.error" -msgstr "Àsìṣe kan ti ṣẹlẹ̀" - -#: src/app/main/ui/inspect/attributes/blur.cljs -msgid "inspect.attributes.blur" -msgstr "ìkùku ti wà" - -#: src/app/main/ui/inspect/attributes/blur.cljs -msgid "inspect.attributes.blur.value" -msgstr "bó se péye" - -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.hex" -msgstr "dínà mọ́" - -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.hsla" -msgstr "Ti dínà mọ" - -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.rgba" -msgstr "RGBA" - -#: src/app/main/ui/inspect/attributes/fill.cljs -msgid "inspect.attributes.fill" -msgstr "Fílì" - -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.download" -msgstr "Danlóòdù orísun àwòrán" - -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.height" -msgstr "Gíga" - -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.width" -msgstr "Fífẹ" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout" -msgstr "Layout" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.height" -msgstr "Gíga" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.left" -msgstr "Òsì" - -#: src/app/main/ui/inspect/attributes/layout.cljs, src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.radius" -msgstr "Rédíọ́sì" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.rotation" -msgstr "Yíyí" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.top" -msgstr "Òkè" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.width" -msgstr "Fífẹ̀" - -#: src/app/main/ui/inspect/attributes/shadow.cljs -msgid "inspect.attributes.shadow" -msgstr "Ibòòji" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.size" -msgstr "Ìwọ̀n àti ipò" - -#: src/app/main/ui/inspect/attributes/stroke.cljs -msgid "inspect.attributes.stroke" -msgstr "Stroke Sítírókì" - -#, permanent -msgid "inspect.attributes.stroke.alignment.center" -msgstr "Ààrin" - -#, permanent -msgid "inspect.attributes.stroke.alignment.inner" -msgstr "Nínú" - -#, permanent -msgid "inspect.attributes.stroke.alignment.outer" -msgstr "Ìtá" - -msgid "inspect.attributes.stroke.style.dotted" -msgstr "ti sàmì" - -msgid "inspect.attributes.stroke.style.mixed" -msgstr "Àdàlú" - -msgid "inspect.attributes.stroke.style.none" -msgstr "Kò sí" - -msgid "inspect.attributes.stroke.style.solid" -msgstr "Lágbára" - -#: src/app/main/ui/inspect/attributes/stroke.cljs -msgid "inspect.attributes.stroke.width" -msgstr "Fífẹ̀" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography" -msgstr "Taipogíráfì" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-family" -msgstr "Ẹbí Fọ́ǹtì" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-size" -msgstr "Ìwọ̀n Fọ́ǹtì" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-style" -msgstr "Àrà Fọ́ǹtì" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-weight" -msgstr "Ìwúwo Fọ́ǹtì" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.letter-spacing" -msgstr "Ìfàyè sí ààrin Lẹ́tà" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.line-height" -msgstr "Gíga Ìlà" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.text-decoration" -msgstr "Síṣe ọ̀rọ̀ lọ́ṣọ̀ọ́" - -msgid "inspect.attributes.typography.text-decoration.none" -msgstr "Kò sí" - -msgid "inspect.attributes.typography.text-decoration.strikethrough" -msgstr "Strikethrough" - -msgid "inspect.attributes.typography.text-decoration.underline" -msgstr "Fàlà sí" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.text-transform" -msgstr "ọ̀rọ̀ ti yí padà" - -msgid "inspect.attributes.typography.text-transform.lowercase" -msgstr "Lẹ́tà Kékeré" - -msgid "inspect.attributes.typography.text-transform.none" -msgstr "Kò sí" - -msgid "inspect.attributes.typography.text-transform.titlecase" -msgstr "Àkọlé Lẹ́tà" - -msgid "inspect.attributes.typography.text-transform.uppercase" -msgstr "Lẹ́tà ńlá" - -msgid "inspect.empty.help" -msgstr "" -"Tí o bá fẹ́ mọ̀ nípa àpẹẹrẹ alárà bẹ ààrin gbùngbùn àwọn pẹ́ńpọtì wò fún " -"ìràlọ́wọ́" - -msgid "inspect.empty.more-info" -msgstr "Àfikún àlàyé fún ìbẹ̀wò" - -msgid "inspect.empty.select" -msgstr "Yan ìrísí, bọ́ọ̀dù tàbí ẹgbẹ́ láti lọ ṣe ìbẹ̀wò ohun ìní wọn àti kóòdù" - -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.code" -msgstr "Kóòdù" - -msgid "inspect.tabs.code.selected.circle" -msgstr "Àyíká" - -msgid "inspect.tabs.code.selected.component" -msgstr "Ẹ̀yà" - -msgid "inspect.tabs.code.selected.curve" -msgstr "Igun" - -msgid "inspect.tabs.code.selected.frame" -msgstr "Bọ́ọ̀dù" - -msgid "inspect.tabs.code.selected.group" -msgstr "Ẹgbẹ́" - -msgid "inspect.tabs.code.selected.image" -msgstr "Àwòrán" - -msgid "inspect.tabs.code.selected.mask" -msgstr "Ìbòjú" - -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.code.selected.multiple" -msgstr "%s Ti yàn" - -msgid "inspect.tabs.code.selected.path" -msgstr "Ipa-ọ̀nà" - -msgid "inspect.tabs.code.selected.rect" -msgstr "Rectangle" - -msgid "inspect.tabs.code.selected.svg-raw" -msgstr "SVG" - -msgid "inspect.tabs.code.selected.text" -msgstr "Ọ̀rọ̀" - -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.info" -msgstr "Àlàyé" - -#: src/app/main/ui/workspace/header.cljs -msgid "label.shortcuts" -msgstr "Ọ̀nà àbùjá" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.access-tokens" -msgstr "Ṣàyẹ̀wò tókín-nì" - -msgid "labels.active" -msgstr "Ń siṣẹ́" - -msgid "labels.add-custom-font" -msgstr "Ṣàfikún àṣà Fọ́ǹtì" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.admin" -msgstr "Alábòjútó" - -#: src/app/main/ui/workspace/comments.cljs -msgid "labels.all" -msgstr "Gbogbo ẹ̀" - -msgid "labels.and" -msgstr "àti" - -msgid "labels.back" -msgstr "Padá" - -#: src/app/main/ui/static.cljs -msgid "labels.bad-gateway.desc-message" -msgstr "" -"Ó dàbí ẹnipé o ní láti dúró díẹ̀ kí o tún gbìyàjú ; à ń siṣẹ́ díẹ̀ síṣe " -"ìtọ́jú sáfà wa." - -#: src/app/main/ui/static.cljs -msgid "labels.bad-gateway.main-message" -msgstr "Ọ̀nà-àbáwọle búburú" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.cancel" -msgstr "Párẹ́" - -msgid "labels.close" -msgstr "Tì í" - -#: src/app/main/ui/dashboard/comments.cljs -msgid "labels.comments" -msgstr "dásí i" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.community" -msgstr "Agbègbè" - -#: src/app/main/ui/settings/password.cljs -msgid "labels.confirm-password" -msgstr "Jẹ́rìísí" - -msgid "labels.continue" -msgstr "Tẹ̀ síwájú" - -msgid "labels.continue-with" -msgstr "Tẹ̀ síwájú pẹ̀lú" - -msgid "labels.continue-with-penpot" -msgstr "O lè tẹ̀ síwájú pẹ̀lú àkáúnti pẹ́ńpọtì" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.copy-invitation-link" -msgstr "ṣà dàkọ ọ̀nà àsopọ̀" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "labels.create" -msgstr "Ṣẹ̀dá" - -#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs -msgid "labels.create-team" -msgstr "Ṣẹ̀dá ẹgbẹ́ tuntun" - -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.create-team.placeholder" -msgstr "Fi orúkọ ẹgbẹ́ tuntun wọlé" - -msgid "labels.custom-fonts" -msgstr "Kọ́sítọ́mù àwọn fọ́ǹtì" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.dashboard" -msgstr "Dáṣìbọọ̀dù" - -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.delete" -msgstr "Paárẹ́" - -#: src/app/main/ui/comments.cljs -msgid "labels.delete-comment" -msgstr "Pa kọ́mẹ́ǹtì rẹ́" - -#: src/app/main/ui/comments.cljs -msgid "labels.delete-comment-thread" -msgstr "Pa gbogbo kọ́mẹ́ǹtì rẹ́" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.delete-invitation" -msgstr "Pa ìfìwépè rẹ́" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.delete-multi-files" -msgstr "Pa gbogbo %s fáìlì rẹ́" - -msgid "labels.discard" -msgstr "Yọ́ kúrò" - -#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.drafts" -msgstr "Kọ ọ́ sílẹ̀" - -#: src/app/main/ui/comments.cljs -msgid "labels.edit" -msgstr "sàtúnkà" - -msgid "labels.edit-file" -msgstr "sàtúnkà fáìlì" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.editor" -msgstr "Olóòtú" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.expired-invitation" -msgstr "Kọjá àkókò" - -msgid "labels.export" -msgstr "Fi ránṣẹ́" - -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.feedback-disabled" -msgstr "Èsì kò siṣẹ́" - -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.feedback-sent" -msgstr "Èsì ti lọ" - -msgid "labels.font-family" -msgstr "Ẹbí fọ́ǹtì" - -msgid "labels.font-providers" -msgstr "Àwọn Olùpèṣè fọ́ǹtì" - -msgid "labels.font-variants" -msgstr "Àrà" - -msgid "labels.fonts" -msgstr "Fọ̀ǹtì" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.github-repo" -msgstr "Báǹkì gítì-ọbù" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.give-feedback" -msgstr "Fèsì padà" - -msgid "labels.go-back" -msgstr "Padà sẹ́yìn" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.help-center" -msgstr "Ibi ìranilọ́wọ́" - -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.hide-resolved-comments" -msgstr "Fi àwọn ọ̀rọ̀ tí a ti yanjú pamọ́" - -msgid "labels.inactive" -msgstr "kò ja fáfá" - -msgid "labels.installed-fonts" -msgstr "Fi àwọn fọ́ǹtì sí orí ẹ̀rọ" - -#: src/app/main/ui/static.cljs -msgid "labels.internal-error.desc-message" -msgstr "" -"Nǹkan bíburú ti ṣẹlè. Jọ̀wọ́ ṣe àtúnṣe iṣẹ́ náà àti pé tí wàhálà bá sì " -"tẹ̀ síwájú, ké sí olùbásọ̀rọ̀." - -#: src/app/main/ui/static.cljs -msgid "labels.internal-error.main-message" -msgstr "Àsìṣe ti abẹ́nú" - -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.invitations" -msgstr "Ìfiwépè" - -#: src/app/main/ui/settings/options.cljs -msgid "labels.language" -msgstr "Èdè" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.libraries-and-templates" -msgstr "Àwọn yàrá ìkàwé & Tẹ́ńpílétì" - -msgid "labels.log-or-sign" -msgstr "ṣí kí o wọle tàbí kí o ṣàmì wọlé" - -#: src/app/main/ui/settings.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.logout" -msgstr "Padé kí ojáde" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.member" -msgstr "Ẹgbẹ" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.members" -msgstr "Àwọn ọmọ Ẹgbẹ́" - -#: src/app/main/ui/settings/password.cljs -msgid "labels.new-password" -msgstr "Ọ̀rọ̀ Ìgbaniwọlé tuntun" - -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs -msgid "labels.no-comments-available" -msgstr "A ti gbé gbogbo yín dè! Àwọn ọ̀rọ̀ ìfitónilétí tuntun yí ó hàn níbí." - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.no-invitations" -msgstr "kò si àwọn ìfìwépè kankan nílẹ̀." - -#: src/app/main/ui/dashboard/team.cljs -#, markdown -msgid "labels.no-invitations-hint" -msgstr "Tẹ̀ ẹ́ **Pe àwọn ènìyàn** tẹ bọ́tìnnì láti pe àwọn ènìyàn sínú ẹgbẹ́." - -#: src/app/main/ui/static.cljs -msgid "labels.not-found.desc-message" -msgstr "Ojú ìwé yìí le má sìí tàbí ò kò ni ìgbaniláàyè láti wọlé sí bẹ̀ ." - -#: src/app/main/ui/static.cljs -msgid "labels.not-found.main-message" -msgstr "Óóho!" - -#: src/app/main/ui/settings/password.cljs -msgid "labels.old-password" -msgstr "Ọ̀rọ̀ ìgbaniwọlé àtijọ́" - -#: src/app/main/ui/workspace/comments.cljs -msgid "labels.only-yours" -msgstr "Tìrẹ nìkan" - -msgid "labels.or" -msgstr "tàbí" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.owner" -msgstr "Oníǹkan" - -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.password" -msgstr "Ọ̀rọ̀ ìgbaniwọlé" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.pending-invitation" -msgstr "Ńńdúró" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.profile" -msgstr "Pírófáìlì" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.projects" -msgstr "Àwọn iṣẹ́ àgbéṣe" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.release-notes" -msgstr "Fi àkọsílẹ̀ rẹ sílẹ̀" - -#: src/app/main/ui/workspace.cljs -msgid "labels.reload-file" -msgstr "Tún gbé fáìlì sí i" - -#: src/app/main/ui/workspace/libraries.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.remove" -msgstr "Yọ ọ́ kúrò" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.remove-member" -msgstr "Yọ ọmọ ẹgbẹ́ kúrò" - -#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.rename" -msgstr "Fún un lórúkọ mìíràn" - -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.rename-team" -msgstr "Fún ẹgbẹ́ lórúkọ mìíràn" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.resend-invitation" -msgstr "Tún fì ìwé ìpè ránńṣẹ́" - -#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs -msgid "labels.retry" -msgstr "Tún gbìyànjú" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.role" -msgstr "Ojúṣe" - -msgid "labels.save" -msgstr "Fi pamọ́" - -msgid "labels.search-font" -msgstr "Ṣàwárí fọ́ǹtì" - -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.send" -msgstr "Fi ránńṣẹ́" - -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.sending" -msgstr "Fífi-ránńṣẹ…" - -#: src/app/main/ui/static.cljs -msgid "labels.service-unavailable.desc-message" -msgstr "A wà níbi ètò ìpèsè ìtọ́jú àwọn sísítẹ́mù wa." - -#: src/app/main/ui/static.cljs -msgid "labels.service-unavailable.main-message" -msgstr "Sáfísì kòsí" - -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.settings" -msgstr "Àwọn ètò" - -msgid "labels.share-prototype" -msgstr "Pín àwọn ohun tí a ti kọ tẹ́lẹ̀" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.shared-libraries" -msgstr "Yàrá ìkáwe" - -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.show-all-comments" -msgstr "Fi gbogbo kọ́mẹ́ǹtì hàn" - -msgid "labels.show-comments-list" -msgstr "Fi àkójọ àwọn kọ́mẹ́ǹtì hàn" - -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.show-your-comments" -msgstr "Fi àwọn kọ́mẹ́ǹtì tìrẹ nìkan hàn" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.status" -msgstr "Ipò" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.tutorials" -msgstr "Ìbáṣepọ̀" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.unpublish-multi-files" -msgstr "%s àwọn fáìlì tí a kò tí kọ jáde" - -#: src/app/main/ui/settings/profile.cljs -msgid "labels.update" -msgstr "mú dójú ìwọ̀n" - -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.update-team" -msgstr "Mẹ́gbẹ́ dójú ìwọ̀n" - -msgid "labels.upload" -msgstr "Ọpulóòdù" - -msgid "labels.upload-custom-fonts" -msgstr "Ọpulóòdù kọ́sítẹ́mù fọ́ǹtì" - -msgid "labels.uploading" -msgstr "Ń ọpulóòdù…" - -msgid "labels.view-only" -msgstr "Wò ó nìkan" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.viewer" -msgstr "Olùwo" - -msgid "labels.webhooks" -msgstr "àwọn ìwé ìkọ́ wẹ́bù" - -#: src/app/main/ui/comments.cljs -msgid "labels.write-new-comment" -msgstr "Write new comment Kọ kọ́mẹ́ǹtì tuntun" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.you" -msgstr "(ìwọ)" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.your-account" -msgstr "Àkáùntì rẹ" - -#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs -msgid "media.loading" -msgstr "Ìkójọpọ̀ àwòrán…" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Yàrá ìkàwé rẹ ti dófìfo. Lọ́gán tí o bá ti ṣàfikún gẹ́gẹ́ bí yàrá ìkàwé " -"pípín, dúkìá tí o ṣẹ̀dá á wà fún lílò àwọn fáìlì rẹ tó kù. Are you sure " -"you tí o fẹ́ kọ jáde?" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.accept" -msgstr "Ṣàfikún gẹ́gẹ́ bí yàrá ìkàwé pípín" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.hint" -msgstr "" -"Lẹ́ẹ̀kan-nà tí o bá ti ṣàfikún gẹ́gẹ́ bí yàrá ìkàwé pípín, àwọn dúkìá inú " -"fáìlì yàrá á di wíwà fún lílò àwọn fáìlì rẹ tó kù." - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.message" -msgstr "Ṣàfikún “%s” gẹ́gẹ́ bí yàrá ìkàwé pípí" - -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.big-nudge" -msgstr "Big nudge Nọ́ọ̀jì ńlá" - -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.confirm-email" -msgstr "Ṣàyẹ̀wò ímeèlì tuntun" - -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.info" -msgstr "" -"A fi ímeèlì kan ránń ṣẹ́ sí inú ímeèlì tí ò ń lò lọ́wọ́lọ́wọ́“%s” láti ṣe " -"àyẹ̀wò ìdánimọ̀ rẹ." - -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.new-email" -msgstr "Ímeèlì tuntun" - -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.submit" -msgstr "Pàrọ̀ ímeèlìl" - -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.title" -msgstr "Pàrọ̀ ímeèlì rẹ" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.copy-token" -msgstr "Ṣẹ̀dà tókìn" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.expiration-date.label" -msgstr "Ọjọ́ ìparí" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.label" -msgstr "Orúkọ" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.placeholder" -msgstr "Orúkọ yí ó ràn wá lọ́wọ́ láti mọ ohun tí tókìn wà fún" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.submit-label" -msgstr "Ṣẹ̀dà tókìn" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.title" -msgstr "Pilẹ̀ṣẹ̀ wí wọlé tókìń" - -msgid "modals.create-webhook.submit-label" -msgstr "Ṣẹ̀dá ìkọ́- wẹ́bù" - -msgid "modals.create-webhook.title" -msgstr "Ṣẹ̀dá ìkọ́-wẹ́bù" - -msgid "modals.create-webhook.url.label" -msgstr "Péloòdù URL" - -msgid "modals.create-webhook.url.placeholder" -msgstr "https://àpẹrẹ.com/postreceive ìgbà àtẹ̀yinwá" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.accept" -msgstr "Pa tókìn rẹ́" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.message" -msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa tókìn yi rẹ́?" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.title" -msgstr "Pa tókìn rẹ́" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.cancel" -msgstr "Fagilé e kí o sì fi àkáùntì mi pamọ́" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.confirm" -msgstr "Bẹ́ẹ̀ni, pa àkáùntì mi rẹ́" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.info" -msgstr "" -"Nípa yíyọ àkáùntì rẹ kúrò o ’ pàdánù gbogbo àwọn iṣẹ́ àgbéṣe rẹ àti àwọn tí " -"ó wà lápamọ́." - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.title" -msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa àkáùntì rẹ rẹ́ ?" - -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.accept" -msgstr "Pa ìtàkurọ̀sọ rẹ́" - -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.message" -msgstr "" -"Ṣé ódá ọ lójú pé o fẹ́ pa ìtàkurọ̀sọ yìí rẹ́? All comments in this Gbogbo " -"àsọyé tó wà níbí tó tẹ̀lé ra wọn ni á di píparẹ́." - -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.title" -msgstr "Pa ìtàkurọ̀sọ rẹ" - -msgid "modals.delete-component-annotation.message" -msgstr "Ṣe ó dá ọ lójú pé o fẹ́ pa àkọsílẹ̀ yìí rẹ́?" - -msgid "modals.delete-component-annotation.title" -msgstr "Pa àkọsílẹ̀ rẹ́" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.accept" -msgstr "Pa fáìlì rẹ́" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.message" -msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa fáìlì yìí rẹ́?" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.title" -msgstr "Pa fáìlì rẹ́" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-multi-confirm.accept" -msgstr "Pa àwọn fáìlì rẹ́" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-multi-confirm.message" -msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa %s àwọn fáìlì rẹ́ ?" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-multi-confirm.title" -msgstr "Pa fáìlì rẹ́ %s" - -msgid "modals.delete-font-variant.message" -msgstr "" -"Ṣé ó dá ọ lójú pé o fẹ́ pa fọ́ǹtì alárà yìí rẹ́ ? Kò ní gbé e tí a bá lò " -"ó nínú fáìlì." - -msgid "modals.delete-font.message" -msgstr "" -"Ṣé ó dá ọ lójú pé o fẹ́ pa fẹ́ǹtì yí rẹ́? Kò ní le gbé e tí a bá lò ó nínú " -"Fáìlì." - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "modals.delete-page.body" -msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa ojú ìwé yìí rẹ́?" - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "modals.delete-page.title" -msgstr "Pa ojú ìwé rẹ́" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.accept" -msgstr "Pa iṣẹ́ àgbéṣe rẹ́" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.message" -msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa iṣẹ́ àgbéṣe yìí rẹ́?" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.title" -msgstr "Pa iṣẹ́ àgbéṣe rẹ́" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.accept" -msgstr "Pa ẹgbẹ́ rẹ́" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.message" -msgstr "" -"Ṣé ó dá ọ lójú pé o fẹ́ pa ẹgbẹ́ yìí rẹ́? Ggogbo iṣẹ́ àgbéṣe àti fáìlì tí ó " -"bá ní nǹkan ṣe pẹ̀lú ẹgbẹ́ ni a ó parẹ́ pátápátá." - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.title" -msgstr "Yọ ẹgbẹ́ kúrò" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.accept" -msgstr "Yọ ọmọ ẹgbẹ́ kúrò" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.message" -msgstr "Ṣé ó dá ọ lójú pé o fẹ́ yọ ọmọ ẹgbẹ́ yìí kúrò nínú ẹgbẹ́?" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.title" -msgstr "Yọ ọmọ ẹgbẹ́ kúrò" - -msgid "modals.delete-webhook.accept" -msgstr "Pa ìkọ́-wẹ́bù rẹ́" - -msgid "modals.delete-webhook.message" -msgstr "Ṣe ó dá ọ lójú pé o fẹ́ pa ìkọ́-wẹ́bù yìí rẹ́?" - -msgid "modals.delete-webhook.title" -msgstr "Pa ìkọ́- wẹ́bù rẹ́" - -msgid "modals.edit-webhook.submit-label" -msgstr "Ṣe àtúnṣe ìkọ́- wẹ́bù" - -msgid "modals.edit-webhook.title" -msgstr "Ṣe àtúnṣe ìkọ́-wẹ́bù" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.invite-member-confirm.accept" -msgstr "Fi ìfìwépè ránńṣẹ́" - -msgid "modals.invite-member.emails" -msgstr "Ímeèlì, kí kọmá yà á sọ́tọ̀" - -msgid "modals.invite-member.repeated-invitation" -msgstr "" -"Díẹ̀ nínú àwọn ímeèlì wá láti ọ̀dọ̀ àwọn tó jẹ́ ọmọ ẹgbẹ́ ní ìsinsìnyí. Ìwé " -"ìfipé wọn a kò nífi ránńṣẹ́." - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.invite-team-member.title" -msgstr "Pe àwọn ọmọ ẹgbẹ́ sínú ẹgbẹ́" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-close-confirm.hint" -msgstr "" -"Gẹ́gẹ́ bí o ṣe jẹ́ ìwọ nìkan ni ọmọ ẹgbẹ́ nínú ẹgbẹ́ yìí, a ó yọ ẹgbẹ́ " -"kúrò pẹ̀lú iṣẹ́ àgbéṣe rẹ̀ àti àwọn fáìlì." - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-close-confirm.message" -msgstr "Ṣé ó dá ọ lójú pé o fẹ́ kúrò nínú %s ẹgbẹ́?" - -msgid "modals.leave-and-reassign.forbidden" -msgstr "" -"O kò lè kúrò nínú ẹgbẹ́ tí kò bá sí ọmọ ẹgbẹ́ mìíràn tó ní ìgbéga sí oní " -"ǹǹkan. O lè fẹ́ pa ẹgbẹ́ rẹ́." - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.hint1" -msgstr "" -"Ìwọ ni ẹni tí ó ni ẹgbẹ́ yìí. Please select another member to promote to " -"Jọ̀wọ́ yan ọmọ ẹgbẹ́ mìíràn tí yíò ní ìgbéga ẹni tí ó ni nǹkan kí o tó " -"kúrò." - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.promote-and-leave" -msgstr "Ṣe ìgbéga kí o kúrò" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.select-member-to-promote" -msgstr "Yan ọmọ ẹgbẹ́ kan tí o ó gbéga" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.title" -msgstr "Kí o tó kúrò" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-confirm.accept" -msgstr "Fi ẹgbẹ́ sílẹ̀" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-confirm.message" -msgstr "Ṣé ó dá ọ lójú pé o fẹ́ fi ẹgbẹ́ yìí sílẹ̀?" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-confirm.title" -msgstr "Ń fi ẹgbẹ́ sílẹ̀" - -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.nudge-title" -msgstr "Fi kún iye tó jẹ́" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.accept" -msgstr "Gbé ẹni tó ni nǹkan" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.hint" -msgstr "" -"Tí o bá gbé ẹni tí ó ni nǹkan, o ó yìí ojúṣe rẹ pada sí Alábòjútó, losing " -" àwọn ìgbà láàyè díẹ̀ á wà fún ẹgbẹ́ yìí. " - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.message" -msgstr "" -"Ìwọ ni ẹni tí ó ni ẹgbẹ́ yìí lọ́wọ́lọ́wọ́. Are you sure you want to make Ṣé " -"ó dá ọ lójú pé o fẹ́ jẹ́ %s oní nǹkan tuntun fún ẹgbẹ́?" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.title" -msgstr "Ẹni tó ni ẹgbẹ́ tuntun" - -msgid "modals.publish-empty-library.accept" -msgstr "Kọ ọ́ jáde" - -msgid "modals.publish-empty-library.message" -msgstr "Yàrá ìkàwé rẹ ṣófìfo. Ṣé ó dá ọ lójú pé o fẹ́ kọ ọ́ jáde?" - -msgid "modals.publish-empty-library.title" -msgstr "Gbé yàrá ìkàwé tó ṣófìfo jáde" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.accept" -msgstr "Yọ ọ́ kúrò gẹ́gẹ́ bí i yàrá ìkàwé pípín" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.hint" -msgstr "" -"Lọ́gán tí o bá ti yọ ọ́ kúrò gẹ́gẹ́ bí i Fáìlì yàrá ìkàwé pípín , Fáìlì " -"yàrà ìkàwé ti fáìlì yìí á dúró tí á wà fún lílò àwọn fáìlì rẹ tó kù." - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.message" -msgstr "Yọ ọ́ kúrò“%s” gẹ́gẹ́ bí yàrá ìkàwé pípín" - -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.small-nudge" -msgstr "Fọwọ́ làn-ań díẹ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component-in-bulk.hint" -msgstr "" -"O ṣetán láti mú àwọn ẹ̀yà irin iṣẹ́ dé ojú ìwọ̀n ní yàrá ìkàwé pípín. Èyí " -"le fa wàhálà fún àwọn fáìlì mìíràn tí ó ń lò ó." - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component-in-bulk.message" -msgstr "Mú àwọn ẹ̀yà irin iṣẹ́ dójú ìwọ̀n nínú iyàram ìkàwé pípín" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.accept" -msgstr "Mú dójú ìwọ̀n" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.cancel" -msgstr "Fagilé e" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.hint" -msgstr "" -"O ṣetán látí mú àwọn ẹ̀yà irin iṣẹ́ yàrá ìkàwé dójú ìwọ̀n . This may affect " -"Èyí lè fa wàhálà fún àwọn fáìlì míràn tí ó ń lò ó." - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.message" -msgstr "Mú ẹ̀yà iyàrá ìkàwé pípín kan dójú ìwọ̀n" - -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "Ẹ̀yà tuntun ti wà, jọ̀wọ́ tún sọ ọ́ jí" - -#: src/app/main/ui/dashboard/team.cljs -msgid "notifications.invitation-email-sent" -msgstr "Ìfipè tí a fi ránńṣẹ́ ti lọ dáadáa" - -#: src/app/main/ui/dashboard/team.cljs -msgid "notifications.invitation-link-copied" -msgstr "ti ṣe àdàkọ ìfipè ọ̀nà ìtọ́ka sí" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "notifications.profile-deletion-not-allowed" -msgstr "O kò le è yọ pírófáìlì rẹ kúro. Ṣe àtún yàn àwọn ẹgbẹ́ kí o tó tẹ̀ síwájú." - -#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs -msgid "notifications.profile-saved" -msgstr "A ti fi pírófáìlì pamọ́ dáadáa!" - -#: src/app/main/ui/settings/change_email.cljs -msgid "notifications.validation-email-sent" -msgstr "Verification email sent to %s. Check your email!" - -msgid "onboarding-v2.before-start.desc1" -msgstr "" -"O ní láti mọ̀ pé oríṣiríṣi ohu ohun èlò ló wà láti ràn ọ́ lọ́wọ́ láti rí " -"gbà bẹ̀rẹ̀ pẹ̀lú Pẹ́ńpọtì, gẹ́gẹ́ bí ohun èlò ìtọ́nisọ́nà àti yútuùbù wa " -"fún ìlànà ìbáni sọ̀rọ̀." - -msgid "onboarding-v2.before-start.desc2" -msgstr "" -"Ẹ̀kún-uń rẹ́rẹ́ àlàyé nípa bí a ó ṣe lo pẹ́ńpọtì . Láti bi àfọwọ́kọ lọ sí " -"síṣe ètò tàbí pípiń àwọn àrà orísi ." - -msgid "onboarding-v2.before-start.desc2.title" -msgstr "Ìtọ́ni sọ́nà Onílò" - -msgid "onboarding-v2.before-start.desc3" -msgstr "O lè wo ìbáṣepọ̀ wa àti ìbáṣepọ̀ ti èyí tí agbègbè wa ṣe." - -msgid "onboarding-v2.before-start.desc3.title" -msgstr "Fídíò àwọn ìbáṣepọ̀" - -msgid "onboarding-v2.before-start.title" -msgstr "Kí o tó bẹ̀rẹ̀" - -msgid "onboarding-v2.newsletter.desc" -msgstr "" -"Ṣe alábàápín ìwé ìròyìn ti pẹ́ńpọtì kí o lè mọ ohun tí ó ń lọ ọjà " -"development progress and new Ìdàgbàsókè, Ìlọsíwájú,àti àwọn ìròyìn ." - -msgid "onboarding-v2.newsletter.news" -msgstr "" -"Fí ìròyìn ránńṣẹ́ sí mi nípa Pẹ́ńpọtì (àwọn bulọ́ọ̀gì,àwọn fídiò " -"ìbáṣepọ̀, àwọn sísàn wọlé...)." - -msgid "onboarding-v2.newsletter.privacy1" -msgstr "Ìfi pamọ́ jẹ wá lógún, ní bí o le kà nípa wa " - -msgid "onboarding-v2.newsletter.privacy2" -msgstr "" -"Àwọn ímeèlì tó ṣe kókó nìknn la ó fi ránńṣẹ́ sí ọ. o lè yọwọ́ kúrò ní " -"ìgbàkììgbàní ìlànà ti ìyọwọ́ kúrò nínú èyíkéyìí ìwé ìròyìn wa." - -msgid "onboarding-v2.newsletter.updates" -msgstr "" -"Fi ìmú dójú ìwọ̀n ọjà ránńṣẹ́ sí mi (àwọn ẹ̀yà yuntun, tú sílẹ̀, ṣà " -"túnṣe...)." - -msgid "onboarding-v2.welcome.desc1" -msgstr "" -"Pẹ́ńpọtì ni orísun ìṣílẹ̀kùn àti pe Kálẹidòsìló ṣe é àti àwọn agbègbè, Ní " -"bi ọ̀pọ̀lọpọ̀ àwọn ènìyàn ti ran ara wọn lọ́wọ́ tẹ́lẹ̀ . Gbgbo wọn ló lè " -"ṣe àjùmọ̀ṣenípa:" - -msgid "onboarding-v2.welcome.desc2" -msgstr "" -"Ìkẹ́kọ̀ọ́ ìta gbangba, pín-in kí ẹ sì jí ròrò nípa Pẹ́ńpọtì, ibi tó wà " -"lọ́wọ́lọ́wọ́ ọ̀jọ́ iwájú pẹ̀lú gbogbo agbègbè àti ìmójútó ẹgbẹ́ pẹ́ńpọtì . " -" ." - -msgid "onboarding-v2.welcome.desc3" -msgstr "" -"Ibi tí a ó ti ri bí a ó ti ṣe àjùmọ̀ṣepọ̀ pẹ̀lú àwọn ìtumọ̀, àwọn ìbéèrè " -"ẹ̀yà ara ẹ̀rọ, ìmójútó síṣe ojúṣe, ìṣọdẹ kòkòrò…" - -msgid "onboarding-v2.welcome.desc3.title" -msgstr "Sísojúṣe ìtọ́sẹ́nà" - -msgid "onboarding-v2.welcome.title" -msgstr "Káàbọ̀ sí pẹ́ńpọtì!" - -msgid "onboarding.choice.team-up.create-team-desc" -msgstr "" -"Lẹ́yìn tí o bá ti fún ẹgbẹ́ rẹ lórúkọ, Ó le pe àwọn ènìyàn láti darapọ̀ mọ́ " -"ẹgbẹ́." - -msgid "onboarding.choice.team-up.create-team-placeholder" -msgstr "Tẹ orúkọ ẹgbẹ́" - -msgid "onboarding.choice.team-up.invite-members" -msgstr "Fìwépè ọmọ àwọn ẹgbẹ́" - -msgid "onboarding.choice.team-up.invite-members-info" -msgstr "" -"Rántí láti fi gbogbo wọn sí i. Àwọn Olùdásílẹ̀, àwọn aṣàpẹẹrẹ, alákóso... " -"onírúúrú dà wọ́n pọ̀ :)" - -msgid "onboarding.choice.team-up.roles" -msgstr "Pè wọ́n pẹ̀lú ojúṣe wọn:" - -msgid "onboarding.newsletter.accept" -msgstr "Bẹ́ẹ̀ni, ṣe alábàpín" - -msgid "onboarding.newsletter.acceptance-message" -msgstr "" -"A ti fi ìbéèrè fún síṣe alá-bápín rẹ ránńṣẹ́, a ó fi ímeèlì ránńṣẹ́ sí ọ " -"látijẹ́rìí sí." - -msgid "onboarding.newsletter.policy" -msgstr "Ètò ìmúlò tí a fi pamọ́." - -msgid "onboarding.newsletter.title" -msgstr "Fẹ́ gba àwọn ìròyìn pẹ́ńpọti?" - -msgid "onboarding.team-modal.create-team" -msgstr "Ṣẹ̀dá ẹgbẹ́ kan" - -msgid "onboarding.team-modal.create-team-desc" -msgstr "" -"A team allows you to collaborate with other Penpot users working in the " -"Ẹgbẹ́ kan yí ó gbà ọ́ láyè láti lè siṣẹ́pọ̀ pẹ̀lú àwọn onílò pẹ́ńpọti tí ó " -"siṣẹ́ nínú àwọn fáìlì àti àwọn iṣẹ́ àgbéṣe kan náà ." - -msgid "onboarding.team-modal.create-team-feature-1" -msgstr "Àwọn fáìlì àti àwọn iṣẹ́ àgbéṣe tí kò lópin" - -msgid "onboarding.team-modal.create-team-feature-2" -msgstr "Multiplayer edition" - -msgid "onboarding.team-modal.create-team-feature-3" -msgstr "àwọn ipa ìṣàkóṣo" - -msgid "onboarding.team-modal.create-team-feature-4" -msgstr "Àwọn ọmọ ẹgbẹ́ tí kò lópin" - -msgid "onboarding.team-modal.create-team-feature-5" -msgstr "100% Ọ̀fẹ́!" - -msgid "onboarding.templates.subtitle" -msgstr "Àwọn àwòṣe díẹ̀ nìyí níbí." - -msgid "onboarding.templates.title" -msgstr "Bẹ̀rẹ̀ sí ṣe ẹ̀yà alárà" - -msgid "onboarding.welcome.alt" -msgstr "Pẹ́ńpọtì" - -#: src/app/main/ui/auth/recovery.cljs -msgid "profile.recovery.go-to-login" -msgstr "Lọ láti wọlé" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "Èwo ni ohun èlò irin iṣẹ́ tí o ní ìmọ̀ kíkún nínú pẹ̀lú rẹ̀?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "Mọ́kànlá-Ọgbọ̀n" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "Méjì – mẹ́wàá" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "Mọ́kànlélọ́gbọ̀n-Àádọ́ta" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "O ´ pọ̀jù" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Àdòbí XD" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Káńfà" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "" -"Báwo ni ó ti le ṣe àpèjúwe bó ṣe dára tó lórí ìrírí rẹ lórí iṣẹ́ tí o ń ṣe " -"lọ́wọ́..." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "Olùyà nǹkan" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "Olùdásílẹ̀" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "Ṣàwárí sí i nípa pẹ́ńpọtì" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Fígímà" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Olùdásílẹ̀/VP" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "Oníṣẹ́ ni mí" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "Gba kóòdù láti inú iṣẹ́ àgbéṣe mi " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "... wíwò ètò ọnà , ìrírí àwọn ohun ìní, àwọn ètò ọnà, abbl." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "Ìkógun wọ̀lú" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "Fi èsì sílẹ̀ fún iṣẹ́ àgbéṣe ẹgbẹ́ mi" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "Ẹjẹ́ 'ká bẹ̀rẹ̀ !" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "Ohun títà tàbí iṣẹ́ àgbéṣe Olùṣàkóso" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Títajà" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "Ju àádọ́ta lọ" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "Èyí tó kàn" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "Kòsí" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "Òmíìràn(ní pàtó)" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "Mò ń siṣẹ́ àgbéṣẹ ti ara mi ni" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "Tàtẹ̀yìn wá" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "Báwo lo ṣe ń gbèrò lórí bí o ṣe lo pẹ́ńpọtì?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "Ṣe àṣàyàn" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Yàwòrán" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.some" -msgstr "Díẹ̀" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "Bẹ̀rẹ̀" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "Bẹ̀rẹ̀ láti lórí iṣẹ́ àgbéṣe mi" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "Akẹ́kọ̀ọ́ tàbí olùkọ̀ọ́" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "kín ni ìwọ̀n ẹgbẹ́ rẹ ?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "Ṣàyẹ̀wọ̀ pẹ́ńpọtì láti rí pé ó bẹ́gbẹ́ mu " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "Gbìyànjú láti mọ̀ kí o tó bẹ̀rẹ̀ sí lo pẹ́ńpọtì ní àyíká" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "... wáyà-fèrèsé, ìrìàjò àwọn onílò & sísàn, àwọn igi ìyíkiri, abbl." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "Iṣẹ́ lórí èròǹgbà àti àwọn èrò" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"Èsì rẹ yó ràn wá lọ́wọ́ láti jẹ́ kó yé wa lórí kín ni ìhùwàsí rẹ àti àwọn " -"ohun tí o fẹ́ràn jù èyí yó jẹ́ kí á má ṣàmúlò pẹ́ńpọtì gẹ́gẹ́ bí èyí tí ó " -"wúlò àti ohun èlò fun ìgbáládùn." - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Yọ kúrò" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "settings.multiple" -msgstr "Dàárú" - -# SECTIONS -msgid "shortcut-section.basics" -msgstr "Ipìlẹ̀" - -msgid "shortcut-section.viewer" -msgstr "Ólùwò" - -msgid "shortcut-section.workspace" -msgstr "Àaye ìṣẹ́" - -# SUBSECTIONS -msgid "shortcut-subsection.alignment" -msgstr "Titete" - -msgid "shortcut-subsection.edit" -msgstr "Sàtunkọ" - -msgid "shortcut-subsection.general-viewer" -msgstr "àbùdá" - -msgid "shortcut-subsection.main-menu" -msgstr "Akojọ ólórì aṣyn" - -msgid "shortcut-subsection.modify-layers" -msgstr "Yípàdá fẹ́lẹ́fẹ́lẹ́" - -msgid "shortcut-subsection.navigation-dashboard" -msgstr "Lìlọ́ kìrì" - -msgid "shortcut-subsection.navigation-viewer" -msgstr "Lìlọ́ kìrì" - -msgid "shortcut-subsection.navigation-workspace" -msgstr "Lìlọ́ kìrì" - -msgid "shortcut-subsection.panels" -msgstr "Àwọ̀n pánẹ̀lí" - -msgid "shortcut-subsection.path-editor" -msgstr "Àwọ́n ọna" - -msgid "shortcut-subsection.shape" -msgstr "Àwọ́n apẹ́rẹ́" - -msgid "shortcut-subsection.text-editor" -msgstr "Àwọ́n ọ́rọ̀" - -msgid "shortcut-subsection.tools" -msgstr "Àwọ́n irínṣẹ̀" - -msgid "shortcut-subsection.zoom-viewer" -msgstr "Sun-un" - -msgid "shortcut-subsection.zoom-workspace" -msgstr "Sun-un" - -msgid "shortcuts.add-comment" -msgstr "Ọ́rọ̀íwòye" - -msgid "shortcuts.add-node" -msgstr "Fí ípàdé kùn" - -msgid "shortcuts.align-bottom" -msgstr "Sópọ sí ísàle" - -msgid "shortcuts.align-center" -msgstr "Parapọ àárin" - -msgid "shortcuts.align-hcenter" -msgstr "Páràpọ àárin naa" - -msgid "shortcuts.align-justify" -msgstr "Ṣe dèédé si ìdálárè" - -msgid "shortcuts.align-left" -msgstr "Sosi ósì" - -msgid "shortcuts.align-right" -msgstr "Sosi ọtún" - -msgid "shortcuts.align-top" -msgstr "Sopo si òké" - -msgid "shortcuts.align-vcenter" -msgstr "Tẹle àárin ni inàró" - -msgid "shortcuts.artboard-selection" -msgstr "Ṣẹ̀dá ọ̀kọ̀ lati yìyán" - -msgid "shortcuts.bold" -msgstr "Yipàdà to han" - -msgid "shortcuts.bool-difference" -msgstr "Iyàtò Boolean" - -msgid "shortcuts.bool-exclude" -msgstr "Boolean tà yọ̀kúro" - -msgid "shortcuts.bool-intersection" -msgstr "ikòritá Boolean" - -msgid "shortcuts.bool-union" -msgstr "Asépọ̀ Boolean" - -msgid "shortcuts.bring-back" -msgstr "Fírànṣẹ́ si ẹ́hin" - -msgid "shortcuts.bring-backward" -msgstr "Ran pàdà sí ehin" - -msgid "shortcuts.bring-forward" -msgstr "Mù siwájù" - -msgid "shortcuts.bring-front" -msgstr "Mù si wájù" - -msgid "shortcuts.clear-undo" -msgstr "Pa yipàdá rẹ" - -msgid "shortcuts.copy" -msgstr "Dàákọ" - -msgid "shortcuts.create-component" -msgstr "Ṣẹ̀dá pàátì" - -msgid "shortcuts.create-new-project" -msgstr "Ṣẹ̀dá títún" - -msgid "shortcuts.cut" -msgstr "Ge" - -msgid "shortcuts.decrease-zoom" -msgstr "Sun-un jàdé" - -msgid "shortcuts.delete" -msgstr "Pàrẹ" - -msgid "shortcuts.delete-node" -msgstr "Pa ipàdé" - -msgid "shortcuts.detach-component" -msgstr "Yà paati" - -msgid "shortcuts.draw-curve" -msgstr "Yìyí" - -msgid "shortcuts.draw-ellipse" -msgstr "Ẹ́lipsì" - -msgid "shortcuts.draw-nodes" -msgstr "Fà ọnà" - -msgid "shortcuts.draw-path" -msgstr "Ọnà" - -msgid "shortcuts.draw-rect" -msgstr "Ònìgún mèrìn" - -msgid "shortcuts.draw-text" -msgstr "Ọ́rọ̀" - -msgid "shortcuts.duplicate" -msgstr "Ṣe pidánpidán" - -msgid "shortcuts.escape" -msgstr "Fàgílèè" - -msgid "shortcuts.export-shapes" -msgstr "Ókèéré apẹ̀rẹ̀" - -msgid "shortcuts.fit-all" -msgstr "Sun-un látì ba gbògbò rẹ̀ mú" - -msgid "shortcuts.flip-horizontal" -msgstr "Yipadà ní pẹ̀tẹ̀lẹ̀" - -msgid "shortcuts.flip-vertical" -msgstr "Yipadà ní ínàró" - -msgid "shortcuts.font-size-dec" -msgstr "Dìn íwọ̀n fonti kù" - -msgid "shortcuts.font-size-inc" -msgstr "Alekun iwọn fonti" - -msgid "shortcuts.go-to-drafts" -msgstr "Lọ sí iyáwòran" - -msgid "shortcuts.go-to-libs" -msgstr "Lọ si awọn ílé-Ikàwé tí a pín" - -msgid "shortcuts.go-to-search" -msgstr "Wàá" - -msgid "shortcuts.group" -msgstr "Ẹgbẹ" - -msgid "shortcuts.h-distribute" -msgstr "Pinpín kàákírì pètèlè" - -msgid "shortcuts.hide-ui" -msgstr "Ífìhan / Tọju UI" - -msgid "shortcuts.increase-zoom" -msgstr "Sùn-un sínú" - -msgid "shortcuts.insert-image" -msgstr "Fí àwóran sii" - -msgid "shortcuts.italic" -msgstr "Yipàdà ítalikì" - -msgid "shortcuts.join-nodes" -msgstr "Dàràpọ̀ awọn ipàdé" - -msgid "shortcuts.letter-spacing-dec" -msgstr "Din aayé lẹ́tà kù" - -msgid "shortcuts.letter-spacing-inc" -msgstr "Alekun aayé lẹ́tà" - -msgid "shortcuts.line-height-dec" -msgstr "Dinkù gígà ílà" - -msgid "shortcuts.line-height-inc" -msgstr "Ílà ton gá sókè" - -msgid "shortcuts.line-through" -msgstr "Íyìpàdà ílà to yọ̀rí" - -msgid "shortcuts.make-corner" -msgstr "Ṣè ígùn" - -msgid "shortcuts.make-curve" -msgstr "Ṣe ìsépọ" - -msgid "shortcuts.mask" -msgstr "Ibòjú" - -msgid "shortcuts.merge-nodes" -msgstr "Dàpọ̀ awọ́n apa" - -msgid "shortcuts.move" -msgstr "Gbé" - -msgid "shortcuts.move-fast-down" -msgstr "Sàré lọ́ sí isàlẹ̀" - -msgid "shortcuts.move-fast-left" -msgstr "Gbé sí osi kiákiá" - -msgid "shortcuts.move-fast-right" -msgstr "Gbé si ọ̀tún kiákiá" - -msgid "shortcuts.move-fast-up" -msgstr "Gbé si òké kiákiá" - -msgid "shortcuts.move-nodes" -msgstr "Gbé ipàdé" - -msgid "shortcuts.move-unit-down" -msgstr "Gbé sílè" - -msgid "shortcuts.move-unit-left" -msgstr "Gbé osi" - -msgid "shortcuts.move-unit-right" -msgstr "Gbé sọtùn" - -msgid "shortcuts.move-unit-up" -msgstr "Gbé sóke" - -msgid "shortcuts.next-frame" -msgstr "Ọ̀kọ̀ tókan" - -msgid "shortcuts.not-found" -msgstr "Kò sí awọ́n ọ̀nà abùjá ti à rii" - -msgid "shortcuts.opacity-0" -msgstr "Fí akomo sí ipò 100%" - -msgid "shortcuts.opacity-1" -msgstr "Fi akomo si ipo 10%" - -msgid "shortcuts.opacity-2" -msgstr "Fi akomo si ipo 20%" - -msgid "shortcuts.opacity-3" -msgstr "Fi akomo si ipo 30%" - -msgid "shortcuts.opacity-4" -msgstr "Fi akomo si ipo 40%" - -msgid "shortcuts.opacity-5" -msgstr "Fi akomo si ipo 50%" - -msgid "shortcuts.opacity-6" -msgstr "Fi akomo si ipo 60%" - -msgid "shortcuts.opacity-7" -msgstr "Fi akomo si ipo 70%" - -msgid "shortcuts.opacity-8" -msgstr "Fi akomo si ipo 80%" - -msgid "shortcuts.opacity-9" -msgstr "Fi akomo si ipo 90%" - -msgid "shortcuts.open-color-picker" -msgstr "Ólùṣà àwọ̀" - -msgid "shortcuts.open-dashboard" -msgstr "Lọ si dasibodu" - -msgid "shortcuts.open-inspect" -msgstr "Lọ si apaa ayewo olùwò" - -msgid "shortcuts.open-viewer" -msgstr "Lọ si apaa ibaraẹnisọrọ olùwò" - -msgid "shortcuts.or" -msgstr " tabi " - -msgid "shortcuts.paste" -msgstr "Lẹẹmọ" - -msgid "shortcuts.prev-frame" -msgstr "Ọkọ ti tẹlẹ" - -msgid "shortcuts.redo" -msgstr "Tunṣe" - -msgid "shortcuts.reset-zoom" -msgstr "tun sun" - -msgid "shortcuts.search-placeholder" -msgstr "Wa awọn ọna abuja" - -msgid "shortcuts.select-all" -msgstr "Ṣa gbogbo re" - -msgid "shortcuts.select-parent-layer" -msgstr "Yan Obii pẹlẹbẹ" - -msgid "shortcuts.show-shortcuts" -msgstr "Ifihan / Itọju ọna abùjá" - -msgid "shortcuts.snap-nodes" -msgstr "Yaa si awon apa" - -msgid "shortcuts.snap-pixel-grid" -msgstr "Yaa si pikseli ilana" - -msgid "shortcuts.start-measure" -msgstr "Bẹ̀rẹ̀ wíwọ̀n" - -msgid "shortcuts.stop-measure" -msgstr "da wíwọ̀n duro" - -msgid "shortcuts.text-align-center" -msgstr "Parapọ saarin" - -msgid "shortcuts.text-align-justify" -msgstr "Sedede lárè" - -msgid "shortcuts.text-align-left" -msgstr "mo si osi" - -msgid "shortcuts.text-align-right" -msgstr "Mo sotun" - -msgid "shortcuts.thumbnail-set" -msgstr "Se étò awòn áwòran fun fidio" - -msgid "shortcuts.toggle-alignment" -msgstr "Iyipada titete ìmúdàgba" - -msgid "shortcuts.toggle-assets" -msgstr "Yi dukia pada" - -msgid "shortcuts.toggle-colorpalette" -msgstr "Yi paleti awọ pada" - -msgid "shortcuts.toggle-focus-mode" -msgstr "Yi ipo idojukọ pada" - -msgid "shortcuts.toggle-fullscreen" -msgstr "Yi kuro ni fulscrin" - -msgid "shortcuts.toggle-layers" -msgstr "Yi awon pelebe yii pada" - -msgid "shortcuts.toggle-lock" -msgstr "Tiipa / Siilẹ" - -msgid "shortcuts.toggle-lock-size" -msgstr "títìipa lápàkàn" - -msgid "shortcuts.toggle-textpalette" -msgstr "Yíípàda ọrọ paleti" - -msgid "shortcuts.toggle-visibility" -msgstr "Fihan / Toju re" - -msgid "shortcuts.toggle-zoom-style" -msgstr "Yiipada asa sun-un" - -msgid "shortcuts.underline" -msgstr "Yii abẹlẹ" - -msgid "shortcuts.undo" -msgstr "Yi pada" - -msgid "shortcuts.ungroup" -msgstr "Tu ẹgbẹ" - -msgid "shortcuts.unmask" -msgstr "Aiboju" - -msgid "shortcuts.v-distribute" -msgstr "Pin ni inaro" - -msgid "shortcuts.zoom-lense-decrease" -msgstr "Dín lẹnsì sisun kù" - -msgid "shortcuts.zoom-lense-increase" -msgstr "Lílọ̀soké lẹnsi sisun" - -msgid "shortcuts.zoom-selected" -msgstr "Yiyan pelu sun-un" - -#: src/app/main/ui/dashboard/team.cljs -msgid "team.webhooks.max-length" -msgstr "Orúkọ̀ webhook kò gbọ́dọ̀ kọjà awọ́n óhun kíkọ́ 2048." - -#: src/app/main/ui/dashboard/files.cljs -msgid "title.dashboard.files" -msgstr "%s - Penpot" - -#: src/app/main/ui/dashboard/fonts.cljs -msgid "title.dashboard.font-providers" -msgstr "Pipese oniru fọnti - %s - Penpot" - -#: src/app/main/ui/dashboard/fonts.cljs -msgid "title.dashboard.fonts" -msgstr "Fọnti - %s - Penpot" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "title.dashboard.projects" -msgstr "Awọn ísè agbèsè - %s - Penpot" - -#: src/app/main/ui/dashboard/search.cljs -msgid "title.dashboard.search" -msgstr "Wà - %s - Penpot" - -#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/auth.cljs -msgid "title.default" -msgstr "Penpot – Se onìrú òmínìra fun awọ̀n ẹ̀gbẹ̀" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "title.settings.access-tokens" -msgstr "Profaili – Aami wiwọle" - -#: src/app/main/ui/settings/feedback.cljs -msgid "title.settings.feedback" -msgstr "Fi esi- Penpot" - -#: src/app/main/ui/settings/options.cljs -msgid "title.settings.options" -msgstr "Awon eto - Penpot" - -#: src/app/main/ui/settings/password.cljs -msgid "title.settings.password" -msgstr "Ọrọigbaníwólé - Penpot" - -#: src/app/main/ui/settings/profile.cljs -msgid "title.settings.profile" -msgstr "Profaili - Penpot" - -#: src/app/main/ui/dashboard/team.cljs -msgid "title.team-invitations" -msgstr "Ifíwẹ́pe - %s - Penpot" - -#: src/app/main/ui/dashboard/team.cljs -msgid "title.team-members" -msgstr "Ọ́́mọ̀ ẹgbẹ - %s - Penpot" - -#: src/app/main/ui/dashboard/team.cljs -msgid "title.team-settings" -msgstr "Awọn eto - %s - Penpot" - -msgid "title.team-webhooks" -msgstr "Webhooks - %s - Penpot" - -#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs -msgid "title.viewer" -msgstr "%s –Ipo wíwò - Penpot" - -#: src/app/main/ui/workspace.cljs -msgid "title.workspace" -msgstr "%s - Penpot" - -#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs -msgid "viewer.empty-state" -msgstr "No boards found on the page." - -#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs -msgid "viewer.frame-not-found" -msgstr "A kò ri ọ̀kọ̀." - -msgid "viewer.header.comments-section" -msgstr "Ọrọìwòye (%s)" - -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.dont-show-interactions" -msgstr "Maa fi ìbaráẹ̀nìsepọ han" - -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.fullscreen" -msgstr "Fé ká gḅọgbọ síkírínì" - -msgid "viewer.header.inspect-section" -msgstr "Ayéwò (%s)" - -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.interactions" -msgstr "Ibaraenisépọ̀" - -msgid "viewer.header.interactions-section" -msgstr "Awọ̀n Ibaraenisépọ̀ (%s)" - -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.share.copy-link" -msgstr "Da línkì kọ̀" - -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.show-interactions" -msgstr "Ifihan Ibaraenisépọ̀" - -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.sitemap" -msgstr "Áwòran átọ̀kà ílẹ̀" - -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.hcenter" -msgstr "Paŕàpọ̀ sí petelè aarin (%s)" - -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.hdistribute" -msgstr "Pin aayè ni pètélè (%s)" - -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.hleft" -msgstr "Páràpọ̀ sí òsì (%s)" - -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.hright" -msgstr "Páràpọ̀ sí ọtun (%s)" - -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.vbottom" -msgstr "Páràpọ̀ sí isàlẹ̀ (%s)" - -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.vcenter" -msgstr "Páràpọ̀ sí inàro aarin (%s)" - -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.vdistribute" -msgstr "Pin aayè inàró (%s)" - -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.vtop" -msgstr "Párápọ̀ sóké (%s)" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.assets" -msgstr "Awọ̀n dukia" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.box-filter-all" -msgstr "Gbọ̀gbọ̀ awọ̀n dukia" - -#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.colors" -msgstr "Áwò" - -#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.components" -msgstr "Awọ̀n eroja" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.create-group" -msgstr "Ṣẹ̀dá ẹ̀gbẹ̀ kan" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.create-group-hint" -msgstr "páarẹ̀" - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.duplicate" -msgstr "ẹẹdà" - -#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.edit" -msgstr "Ṣatunkọ" - -#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.graphics" -msgstr "Awọn Awòran" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.group" -msgstr "Ẹgbẹ" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.group-name" -msgstr "Orúkọ̀ ẹgbẹ" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.libraries" -msgstr "Ílè-iwè" - -msgid "workspace.assets.local-library" -msgstr "Ílè-iwè agbegbe" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.not-found" -msgstr "Ko si ohun-ini ti a rii" - -msgid "workspace.assets.open-library" -msgstr "Ṣii faili ìlé-ikáwè" - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.rename" -msgstr "Lo oruko imiran" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.rename-group" -msgstr "Lo oruko imiran fun ẹgbẹ" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.search" -msgstr "Wa dukia" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "Iĺẹ̀ iwekika ti a pln" - -#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.typography" -msgstr "Iwe itẹwe" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.font-id" -msgstr "Fonti" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.font-size" -msgstr "Iwon" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.font-variant-id" -msgstr "Iyatọ" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.letter-spacing" -msgstr "Aaye leta" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.line-height" -msgstr "Giga ila" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/inspect/attributes/text.cljs, src/app/main/ui/inspect/attributes/text.cljs -msgid "workspace.assets.typography.sample" -msgstr "Ag" - -msgid "workspace.assets.typography.text-styles" -msgstr "Oniru ọrọ" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.text-transform" -msgstr "Iyipádà ọrọ" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.ungroup" -msgstr "Títù ẹ̀gbẹ́" - -msgid "workspace.focus.focus-mode" -msgstr "Ipo Idojukọ" - -msgid "workspace.focus.focus-off" -msgstr "Pa Ídòjúkọ" - -msgid "workspace.focus.focus-on" -msgstr "Tan Ídòjúkọ" - -msgid "workspace.focus.selection" -msgstr "Yiyan" - -#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs -msgid "workspace.gradients.linear" -msgstr "Itesiwaju gerege" - -#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs -msgid "workspace.gradients.radial" -msgstr "Itesiwaju Radial" - -msgid "workspace.header.menu.disable-scale-content" -msgstr "Pa asèkalẹ̀ iwọnbà" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-scale-text" -msgstr "Pa ọrọ iwọnba" - -msgid "workspace.header.menu.disable-snap-pixel-grid" -msgstr "Pa yipada si piseli" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-dynamic-alignment" -msgstr "Tan imudagba to Sedede" - -msgid "workspace.header.menu.enable-scale-content" -msgstr "Tan asèkalẹ̀ iwọnbà" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-scale-text" -msgstr "Tan iwọnbà ọrọ" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-guides" -msgstr "Yipada si itọ̀nìsọna" - -msgid "workspace.header.menu.enable-snap-pixel-grid" -msgstr "Tan Yipada si piseli" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-palette" -msgstr "Tọ̀jú awọ palẹti" - -msgid "workspace.header.menu.hide-pixel-grid" -msgstr "Tọ̀jú pisẹli ilana" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-rules" -msgstr "Tọ̀jú awọn ólòrí" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-textpalette" -msgstr "Tọ̀jú awọn fọnti paleti" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.edit" -msgstr "Satunkọ" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.file" -msgstr "Faili" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.help-info" -msgstr "Iranlọwọ ati alaye" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.preferences" -msgstr "Awọn àyánfẹ̀" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.view" -msgstr "Wiwo" - -msgid "workspace.header.menu.redo" -msgstr "Tun ṣe" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.select-all" -msgstr "Sa gbogbo rẹ" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-palette" -msgstr "Fi awo paleti han" - -msgid "workspace.header.menu.show-pixel-grid" -msgstr "Fi piseli ilana han" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-rules" -msgstr "Ifihan awọ̀n ólórí" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-textpalette" -msgstr "Ifihan fonti paleti" - -msgid "workspace.header.menu.undo" -msgstr "Yi pada" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.reset-zoom" -msgstr "Tunto" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.save-error" -msgstr "àsisè lórì fíf́ipamọ" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.saved" -msgstr "Ti a fipamọ" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.saving" -msgstr "Fifipámọ" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.unsaved" -msgstr "Awọn ayípàdà ti kó ni fipamọ" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.viewer" -msgstr "Ipo wiwo(%s)" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom" -msgstr "sun-un" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fill" -msgstr "Kun - óṣùwọn to kun" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fit" -msgstr "Báràmù - óṣùwọn to Báràmù" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fit-all" -msgstr "Suun kí o bá gbógbó rẹ̀ dọ́gbà" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-full-screen" -msgstr "Áseàfihan to kún" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-selected" -msgstr "Ṣuum lati yan" - -msgid "workspace.layout_grid.editor.title" -msgstr "Ilànà àyípàdà" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.add" -msgstr "Afikùn" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.colors" -msgstr "%s awọn awọ" - -#: src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.empty-palette" -msgstr "Kòyi si oniruiru awọ ni ilé-ikàwé re" - -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "Ko si oniruiru iwé itẹ̀wé ni ilé ikàwé rẹ̀" - -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.hsv" -msgstr "HSV" - -#: src/app/main/ui/workspace/colorpicker/libraries.cljs, src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.recent-colors" -msgstr "Awọn àwò tálò láipẹ̀" - -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgb-complementary" -msgstr "RGB Ibáramù" - -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgba" -msgstr "RGBA" - -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.save-color" -msgstr "Fi awọn oniru awọ pamọ" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.components" -msgstr "%s Ẹya ara ẹrọ" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.file-library" -msgstr "Faili ilé ikàwé" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.graphics" -msgstr "%s ayaworan" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.libraries" -msgstr "Awọn Ílè íkawè" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library" -msgstr "Ílè íkawè" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library-updates" -msgstr "Ílè íkawè ímùdojúiwọn" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.no-libraries-need-sync" -msgstr "Kò si Ilé kàwé ti a pin si ímùdojúiwọn" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.shared-libraries" -msgstr "Awọn ilé kàwé tí a pìn" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.libraries.text.multiple-typography" -msgstr "Óríṣí awọn íwè itẹ̀wé" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.libraries.text.multiple-typography-tooltip" -msgstr "Tú gbógbó lińkí awọn íwè itẹ̀wé" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.typography" -msgstr "%s awọn íwè itẹ̀wé" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.update" -msgstr "ímùdojúiwọn" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "wò gbògbò awọn ayípàdà" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.updates" -msgstr "Awọn ímùdojúiwọn" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.add-interaction" -msgstr "Tẹ amí + làtí fi íbàràénisépọ̀ kun" - -#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "workspace.options.blur-options.title" -msgstr "Baìbaì" - -#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "workspace.options.blur-options.title.group" -msgstr "Ẹ̀gdẹ́ Baìbaì" - -#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "workspace.options.blur-options.title.multiple" -msgstr "Asayan Baìbaì" - -#: src/app/main/ui/workspace/sidebar/options/page.cljs -msgid "workspace.options.canvas-background" -msgstr "Kánfásì abẹ́le" - -msgid "workspace.options.clip-content" -msgstr "Ábẹrẹ́ ákoonù" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs -msgid "workspace.options.component" -msgstr "Apakan" - -msgid "workspace.options.component.copy" -msgstr "Ádàakọ" - -msgid "workspace.options.component.edit-annotation" -msgstr "Ṣatunkọ àkọ̀silẹ̀" - -msgid "workspace.options.component.main" -msgstr "Ólòrí" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints" -msgstr "Awọn ihámọ" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.bottom" -msgstr "Ídì" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.center" -msgstr "Aarin" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.left" -msgstr "Òsi" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.leftright" -msgstr "Osi ati otun" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.right" -msgstr "Ọ̀tún" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.scale" -msgstr "Íwọ́n" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.top" -msgstr "Ókè" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.topbottom" -msgstr "Ókè ati Ídí" - -#: src/app/main/ui/workspace/sidebar/options.cljs -msgid "workspace.options.design" -msgstr "Ónirú" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "workspace.options.export" -msgstr "Sí ilẹ́ òkèeré" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs -msgid "workspace.options.export.suffix" -msgstr "afikun ọrọ niipárí" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-complete" -msgstr "Gbígbè okeere ti pari" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-object" -msgstr "Gbígbè okeere …" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-object-error" -msgstr "Gbígbè okeere kuna" - -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.fill" -msgstr "Kún" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.add-flow-start" -msgstr "Safikun ibẹrè ṣiṣan" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow-start" -msgstr "ibẹrè ṣiṣan" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow-starts" -msgstr "íbẹrè awọn ṣiṣan" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.auto" -msgstr "Aifọ́wọyi" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.grid-title" -msgstr "Ilánà" - -msgid "workspace.options.grid.params.color" -msgstr "Awọ" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.columns" -msgstr "Awọn ọwọn" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.gutter" -msgstr "Gota" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.height" -msgstr "Òkè" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.margin" -msgstr "Àlà" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.rows" -msgstr "Àwọn orí ìlà ìbú" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.set-default" -msgstr "Fi sípò abínibí" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.size" -msgstr "Ìwọ̀n" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type" -msgstr "Irú" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.bottom" -msgstr "ìsàlẹ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.center" -msgstr "Àárín" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.left" -msgstr "Òsì" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.right" -msgstr "Ọ̀tún" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.stretch" -msgstr "Nà" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.top" -msgstr "Òkè" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.use-default" -msgstr "Lo ipò abínibí" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.width" -msgstr "Ìgbòrò" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.row" -msgstr "Àwọn orị ìlà ìbú" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.square" -msgstr "Alápoméjì" - -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.group-fill" -msgstr "Ẹ̀kún ẹgbẹ́" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.group-stroke" -msgstr "Ẹgba ẹgbẹ́" - -msgid "workspace.options.height" -msgstr "Gíga" - -msgid "workspace.options.inspect" -msgstr "Ṣàyẹ̀wò" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-action" -msgstr "Ìgbésẹ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-after-delay" -msgstr "Lẹ́yìn ìdádúro" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation" -msgstr "Àwòrán abẹ̀mí" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-dissolve" -msgstr "Túká" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-none" -msgstr "Kòsí" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-push" -msgstr "Tì" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-slide" -msgstr "Aṣàfihàn" - -msgid "workspace.options.interaction-auto" -msgstr "Ọkọ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-background" -msgstr "Fi àyíká ìtẹ̀lẹ̀ ìlànà síi" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-outside" -msgstr "Páadé tí o bá n tẹ ìta" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay" -msgstr "Pa ìlànà ìtẹ̀lẹ̀ dé" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay-dest" -msgstr "Pa ìlànà ìtẹ̀lẹ̀ dé: %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-delay" -msgstr "Ìdádúró" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-destination" -msgstr "Èbúté" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-duration" -msgstr "Ịgbà" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing" -msgstr "Rírokùn" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease" -msgstr "Ìrọ̀rùn" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in" -msgstr "Rọra wọlé" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in-out" -msgstr "Rọra wọlé jáde" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-out" -msgstr "Rọra jáde" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-linear" -msgstr "Ilà" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-in" -msgstr "Inú" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-enter" -msgstr "Atọ́ka ìwọnú" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-leave" -msgstr "Atọ́ka kíkúrò" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-ms" -msgstr "ms" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to" -msgstr "Lílọ kiri sí" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to-dest" -msgstr "Lílo kiri sí: %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-none" -msgstr "(Akò ṣètò)" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-offset-effect" -msgstr "Ipa àìṣedédé" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-on-click" -msgstr "Tẹ orí" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay" -msgstr "Ṣíìtẹ̀lé ìlànà" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay-dest" -msgstr "Ṣí ìtẹ̀lé ìlànà: %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-url" -msgstr "Ṣí URL" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-out" -msgstr "Jáde" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-center" -msgstr "Àáriń ìsàlẹ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-left" -msgstr "Ìsàlẹ̀ òsì" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-right" -msgstr "Ìsàḷ̀ẹ̀ ọ̀tún" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-center" -msgstr "Àárín" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-manual" -msgstr "Aláfọwóṣe" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-center" -msgstr "Àárín òkè" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-left" -msgstr "Òkè òsì" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-right" -msgstr "Òkè ọ̀tún" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-position" -msgstr "Ipò" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-preserve-scroll" -msgstr "Ṣe ìtọ́jú ipò àyílọ" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-prev-screen" -msgstr "Aṣàfihàn àtẹ̀yìnwá" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-relative-to" -msgstr "Ìbátan sí" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-self" -msgstr "Tìkara" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay" -msgstr "Àyípadà ìtẹ̀lé ìlànà" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay-dest" -msgstr "Àyípadà ìtẹ̀lé ìlànà: %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-trigger" -msgstr "Okùnfà" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-url" -msgstr "URL" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-hovering" -msgstr "Nígbàtí óhún rábàbà" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-pressing" -msgstr "Nígbàtị óhún tẹ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interactions" -msgstr "Àwọn ìbáraẹniṣepọ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.color" -msgstr "Àwọ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.color-burn" -msgstr "Ṣẹ̀dà àwọ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.color-dodge" -msgstr "Òpó àwọ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.darken" -msgstr "Ṣókuǹkùn" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.difference" -msgstr "Ìyàtọ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.exclusion" -msgstr "Ìyàsọ́tọ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.hard-light" -msgstr "Iná líle" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.hue" -msgstr "Ọdà" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.lighten" -msgstr "Fẹ́ẹ́rẹ́fẹ́" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.luminosity" -msgstr "Ìmọ́lẹ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.multiply" -msgstr "Ìsọdipúpọ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.normal" -msgstr "Déédé" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.overlay" -msgstr "Ìtẹ̀lẹ́ ìlànà" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.saturation" -msgstr "Ẹ̀kúnrẹ́rẹ́" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.screen" -msgstr "Aṣàfihàn" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.soft-light" -msgstr "Ìmọ́lẹ̀ rokoṣo" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title" -msgstr "Ìpele" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title.group" -msgstr "Ẹgbẹ́ ìpele" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title.multiple" -msgstr "Egbẹ́ ààyò" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.advanced-ops" -msgstr "Ànàálè ìtẹ̀síwájú" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-max-h" -msgstr "Ibi tó ga jùlọ" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-max-w" -msgstr "Ìgbòrò tó ga jù" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-min-h" -msgstr "Gíga to kéré jù lọ" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-min-w" -msgstr "Ìgbòrò tó kéré jù lọ" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-max-h" -msgstr "Gíga tó pọ̀jù" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-max-w" -msgstr "Ìgbòrò tí pòjù" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-min-h" -msgstr "Gíga tó kéré jùlọ" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-min-w" -msgstr "Gbígbòrò tó kéré jù lọ" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.bottom" -msgstr "Ìdí" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column" -msgstr "Ìlà òòró" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column-reverse" -msgstr "Ìlà òòró yíyípadà" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row" -msgstr "Ilà ìbú" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row-reverse" -msgstr "Ilà ìbú yíyípadà" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.gap" -msgstr "Àlàfo" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.left" -msgstr "Òsì" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin" -msgstr "Etí ìwé" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin-all" -msgstr "Gbogbo àwọn àwòrán" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin-simple" -msgstr "Etí ìwé ẹyọ" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.packed" -msgstr "tí wọn dì" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding" -msgstr "Ìtẹ̀wọ́nú" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding-all" -msgstr "Gbogbo ẹ̀gbẹ́" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding-simple" -msgstr "Ìtẹ̀wọ́nú pọ́nbélé" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.right" -msgstr "Ọ̀tún" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.space-around" -msgstr "Àyè àyíká" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.space-between" -msgstr "Àyè àárín" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.top" -msgstr "Òkè" - -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.more-colors" -msgstr "Àwọn àwọ̀ púpọ̀ sí i" - -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.more-lib-colors" -msgstr "Àwọn yàrá àwọ̀ púpọ̀ sí I" - -msgid "workspace.options.opacity" -msgstr "Àìríran" - -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.position" -msgstr "Ipò" - -#: src/app/main/ui/workspace/sidebar/options.cljs -msgid "workspace.options.prototype" -msgstr "Ìtẹ̀lé ìlànà" - -msgid "workspace.options.radius" -msgstr "Ìdáméjì òbìrìkìtiì" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-bottom-left" -msgstr "Apá òsì ìsàlẹ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-bottom-right" -msgstr "Apá ọ̀tún ìsàle" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-top-left" -msgstr "Òkè òsì" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-top-right" -msgstr "Òkè ọ̀tún" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius.all-corners" -msgstr "Àwọn gbogbo igun" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius.single-corners" -msgstr "Àwọn igun olómìnira" - -msgid "workspace.options.recent-fonts" -msgstr "Àìpẹ́" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.retry" -msgstr "Tún gbìyànjú" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.rotation" -msgstr "Yíyípo" - -msgid "workspace.options.search-font" -msgstr "Àdàkọ ìwádìí" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.select-a-shape" -msgstr "" -"Yan ìrísi ,pátákó tàbí ẹgbẹ́ láti fa ìsopọ̀ mọ́ pátákó " -"òmíràn." - -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.selection-color" -msgstr "Àwọn àwọ̀ tí a ti yàn" - -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.selection-fill" -msgstr "Ìmúṣẹ tí a yàn" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.selection-stroke" -msgstr "Ipò ìlù tí a yàn" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.blur" -msgstr "Rẹ́súrẹ́sú" - -msgid "workspace.options.shadow-options.color" -msgstr "Àwọ̀ òjíjí" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.drop-shadow" -msgstr "Da òjìjí" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.inner-shadow" -msgstr "Òjìjí inú" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.offsetx" -msgstr "X" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.offsety" -msgstr "Y" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.spread" -msgstr "Tànkálẹ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title" -msgstr "Òjìjí" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title.group" -msgstr "Àwùjọ òjìjí" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title.multiple" -msgstr "Òjìjí tí a yàn" - -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.show-fill-on-export" -msgstr "Fihàn nínụ àgbéjáde" - -msgid "workspace.options.show-in-viewer" -msgstr "Fihàn nínú ipò wíwò" - -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.size" -msgstr "Ìwọ̀n" - -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs -msgid "workspace.options.size-presets" -msgstr "Àwọn àtòjọ" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke" -msgstr "Ipò ìlà" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker" -msgstr "Àmì yíyíká" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Yíyíká" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker" -msgstr "Àmì dáyámọ́ǹdì" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Dáyámọ́ǹdì" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow" -msgstr "Ọfà ìlà" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Ofà" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.none" -msgstr "Kòsí" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.round" -msgstr "Yíká" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square" -msgstr "Alápoméjì" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker" -msgstr "Àmì alápoméjì" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Onígun mẹ́rin" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow" -msgstr "Ofà onígun mẹ́ta" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Onígun mẹ́ta" - -msgid "workspace.options.stroke-color" -msgstr "Àwọ ìlà" - -msgid "workspace.options.stroke-width" -msgstr "Ìgbòrò ìlà" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.center" -msgstr "Àárín" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.dashed" -msgstr "Tó ní ìlà-ìlà" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.dotted" -msgstr "àmì tó tó tó" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.inner" -msgstr "Nínú" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.mixed" -msgstr "Tí a ti dàpọ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.outer" -msgstr "Ìta" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.solid" -msgstr "Ṣinsin" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-bottom" -msgstr "Mú dọ́gba abẹ́" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-middle" -msgstr "Mú dọgba àárín" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-top" -msgstr "Mú dọ́gba òkè" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.direction-ltr" -msgstr "LTR" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.direction-rtl" -msgstr "RTL" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-auto-height" -msgstr "Gíga aládàáṣiṣẹ́" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-auto-width" -msgstr "Gbígbòòrò aládáàṣiṣé" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-fixed" -msgstr "Tí kò yíyadà" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.letter-spacing" -msgstr "Àlàfo lẹ́tà" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.line-height" -msgstr "Gíga ìlà" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.lowercase" -msgstr "Lẹ́tà kékeré" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.none" -msgstr "Kòsí" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.strikethrough" -msgstr "Ìfọwọ́bàyíká (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-center" -msgstr "Mú dọ́gba àárín (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-justify" -msgstr "Ìdálàre (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-left" -msgstr "Mú dọ́gba òsì (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-right" -msgstr "Mú dọ́gba ọ̀tún (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title" -msgstr "Àyọkà" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title-group" -msgstr "Àwùjọ àyọkà" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title-selection" -msgstr "Àṣàyàn ọ̀rọ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.titlecase" -msgstr "ipò ọ̀rọ̀ àkórí" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.underline" -msgstr "Fífàlà (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.uppercase" -msgstr "Lẹ́tà ńlá" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.use-play-button" -msgstr "" -"Lo bọ́tìnì ìṣe tó wà lóori àkọsórí náà láti ṣakóso ìwò " -"àkàwé." - -msgid "workspace.options.width" -msgstr "Ìgbòrò" - -msgid "workspace.options.x" -msgstr "Ipò X" - -msgid "workspace.options.y" -msgstr "Ipò Y" - -msgid "workspace.path.actions.add-node" -msgstr "Fi ìpàdé kún (%s)" - -msgid "workspace.path.actions.delete-node" -msgstr "Pa ìpàdé ré (%s)" - -msgid "workspace.path.actions.draw-nodes" -msgstr "Fa ìpàdé (%s)" - -msgid "workspace.path.actions.join-nodes" -msgstr "Da ìpàdé pọ̀ (%s)" - -msgid "workspace.path.actions.make-corner" -msgstr "Sí igun (%s)" - -msgid "workspace.path.actions.make-curve" -msgstr "Sí ẹkọ̀rọ̀ (%s)" - -msgid "workspace.path.actions.merge-nodes" -msgstr "Da ìpàdé pò (%s)" - -msgid "workspace.path.actions.move-nodes" -msgstr "Gbé ìpàde (%s)" - -msgid "workspace.path.actions.separate-nodes" -msgstr "Ya ̣ìpàdé sọ́tọ̀ (%s)" - -msgid "workspace.path.actions.snap-nodes" -msgstr "Ìmọ̀lára ìpàdé (%s)" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.add-flex" -msgstr "Fi àrọ ètò ìrísí kun" - -msgid "workspace.shape.menu.add-grid" -msgstr "Fi gírídì ètò ìrísị kun" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.back" -msgstr "dáa padà séyiǹ" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.backward" -msgstr "dá padà sọ́wọ èyiǹ" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.copy" -msgstr "Ṣẹ̀dà" - -msgid "workspace.shape.menu.create-annotation" -msgstr "Ṣèda àlàyé" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.create-artboard-from-selection" -msgstr "Yíyàn sí pátákó" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.create-component" -msgstr "Ṣẹ́dá àkóónú" - -msgid "workspace.shape.menu.create-multiple-components" -msgstr "Ṣẹ̀dá ọ̀pọ̀lọpọ̀ àkóónú" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.cut" -msgstr "Gé" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.delete" -msgstr "Parẹ́" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.delete-flow-start" -msgstr "Pa ìbẹ̀ẹ̀rè ìsàn rẹ́" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.detach-instance" -msgstr "ṣẹ́ àpẹ̣ẹre yọ nípò" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.detach-instances-in-bulk" -msgstr "Ṣẹ́ àwọn àpẹẹrẹ yọ nípò" - -msgid "workspace.shape.menu.difference" -msgstr "Ìyàtọ̀" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.duplicate" -msgstr "Sẹ ẹ̀dà" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.edit" -msgstr "Sàtúnṣe" - -msgid "workspace.shape.menu.exclude" -msgstr "Ṣà yọ sílè" - -msgid "workspace.shape.menu.flatten" -msgstr "Tẹ́ pẹrẹsẹ" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flip-horizontal" -msgstr "Ìyí padà oníbùú" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flip-vertical" -msgstr "Ìyí padà olóòró" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flow-start" -msgstr "Ìbẹ̀rè ìṣàn" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.forward" -msgstr "Mú wá sọ́wọ́ iwájú" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.front" -msgstr "Mú wá sí wájú" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.go-main" -msgstr "Lọ sí olórí fáìlì àkóónú" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.group" -msgstr "Àwùjọ" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.hide" -msgstr "Tọ́jú" - -msgid "workspace.shape.menu.hide-ui" -msgstr "Fihàn/ Tọ́jú UI" - -msgid "workspace.shape.menu.intersection" -msgstr "Ìkòríta" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.lock" -msgstr "Tì" - -#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.mask" -msgstr "Ìbòjú" - -#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.paste" -msgstr "lẹ̀mọ́" - -msgid "workspace.shape.menu.path" -msgstr "Ipa ọ̀nà" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.remove-flex" -msgstr "Yọ àrọ ètò ìrísí kúrò" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.reset-overrides" -msgstr "Ṣe àtúnṣe ìdojúkọ" - -msgid "workspace.shape.menu.restore-main" -msgstr "Dạ àkóónú pàtàkì sí pò" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.select-layer" -msgstr "Yan ìpele" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show" -msgstr "Ṣà fihàn" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show-in-assets" -msgstr "Ṣafihàn nínú atọ́ka àwọn ìgbìmọ̀ ìní" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show-main" -msgstr "Ṣà fihàn àkóónú pàtàkì" - -msgid "workspace.shape.menu.thumbnail-remove" -msgstr "Yọ àwòrán aláṣojú kúrò" - -msgid "workspace.shape.menu.thumbnail-set" -msgstr "Fi sípò àwòrań aláṣojú" - -msgid "workspace.shape.menu.transform-to-path" -msgstr "Yípadà sí pópó ọ̀nà" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.ungroup" -msgstr "Ṣe àìkójọ" - -msgid "workspace.shape.menu.union" -msgstr "Ìbáṣepò" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.unlock" -msgstr "Ṣíí" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.unmask" -msgstr "Sí ìbòjú" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.update-components-in-bulk" -msgstr "Mímú àwọn ọ̀rọ̀ àkóónú pàtàkì dójú ìwọ̀n" - -msgid "workspace.sidebar.collapse" -msgstr "Wó òpó ègbẹ́" - -msgid "workspace.sidebar.expand" -msgstr "Fẹ òpó ẹ̀gbẹ́" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.sidebar.history" -msgstr "Ìtàn (%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.sidebar.layers" -msgstr "Àwọn ìpele" - -msgid "workspace.sidebar.layers.components" -msgstr "Àwọn àkóónú" - -msgid "workspace.sidebar.layers.frames" -msgstr "Àwọn pátákó" - -msgid "workspace.sidebar.layers.groups" -msgstr "Àkójọ" - -msgid "workspace.sidebar.layers.images" -msgstr "Àwọn àwòrán" - -msgid "workspace.sidebar.layers.masks" -msgstr "Àwọn ìbòjú" - -msgid "workspace.sidebar.layers.search" -msgstr "Àwọn ìpele wíwá" - -msgid "workspace.sidebar.layers.shapes" -msgstr "Àwọn ìrísí" - -msgid "workspace.sidebar.layers.texts" -msgstr "Àwọn àyọkà" - -#: src/app/main/ui/workspace/sidebar/options/menus/svg_attrs.cljs, src/app/main/ui/inspect/attributes/svg.cljs -msgid "workspace.sidebar.options.svg-attrs.title" -msgstr "Gbígbé àwọn ànímọ́ SVG wọlé wá" - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "workspace.sidebar.sitemap" -msgstr "Àwọn abala" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.sitemap" -msgstr "Máàpù ojú ìlà" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.assets" -msgstr "Àwọn ohun ìní" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.color-palette" -msgstr "Pálètì àwọ̀ (%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.comments" -msgstr "Àwọn ìdáásí (%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.curve" -msgstr "Ìṣépo (%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.ellipse" -msgstr "Àlàfo (%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.frame" -msgstr "Pátákó (%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.image" -msgstr "Àwòrán(%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.move" -msgstr "Gbé (%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.path" -msgstr "Pópó ọ̀nà (%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.rect" -msgstr "Onígun mẹ́rin (%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.shortcuts" -msgstr "Àwón ọ̀nà àbùjá (%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.text" -msgstr "Àyọkà (%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.text-palette" -msgstr "Àwọn ohun ìtẹ̀wé (%s)" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.empty" -msgstr "Di ìgbà yìí kò sí àyípadà nínú ìtàn" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.delete" -msgstr "Paarẹ́%s" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.modify" -msgstr "Àtuńṣe %s" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.move" -msgstr "Àwọn ohun tí a ti gbé lọ" - -msgid "workspace.undo.entry.multiple.circle" -msgstr "Awọn àyíká" - -msgid "workspace.undo.entry.multiple.color" -msgstr "Àwọn ohun àmúṣọrọ̀ àwọ̀" - -msgid "workspace.undo.entry.multiple.component" -msgstr "Àkóónú" - -msgid "workspace.undo.entry.multiple.curve" -msgstr "Àwọn ẹkọ̀rọ̀" - -msgid "workspace.undo.entry.multiple.frame" -msgstr "Pátákó" - -msgid "workspace.undo.entry.multiple.group" -msgstr "Àwọn àkójọ" - -msgid "workspace.undo.entry.multiple.media" -msgstr "Àwọn ohun ìyì àwòrán" - -msgid "workspace.undo.entry.multiple.multiple" -msgstr "Àwọn ǹǹkan" - -msgid "workspace.undo.entry.multiple.page" -msgstr "Àwọn ojú awé" - -msgid "workspace.undo.entry.multiple.path" -msgstr "Àwọn ẹ̀bá ọ̀nà" - -msgid "workspace.undo.entry.multiple.rect" -msgstr "Àwọn onígun mẹ́rin" - -msgid "workspace.undo.entry.multiple.shape" -msgstr "Ìrísí" - -msgid "workspace.undo.entry.multiple.text" -msgstr "Àwọn àyọkà" - -msgid "workspace.undo.entry.multiple.typography" -msgstr "Àwọn ohun ìyì ìwé títẹ̀" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.new" -msgstr "Titun %s" - -msgid "workspace.undo.entry.single.circle" -msgstr "Àyíká" - -msgid "workspace.undo.entry.single.color" -msgstr "Ohun àmúṣọrọ̀ àwọ̀" - -msgid "workspace.undo.entry.single.component" -msgstr "Àkóónú" - -msgid "workspace.undo.entry.single.curve" -msgstr "Ẹkọ̀rọ̀" - -msgid "workspace.undo.entry.single.frame" -msgstr "Pátákó" - -msgid "workspace.undo.entry.single.group" -msgstr "Àkójọ" - -msgid "workspace.undo.entry.single.image" -msgstr "Àwòrán" - -msgid "workspace.undo.entry.single.media" -msgstr "Ohun àmúṣọrọ̀ èyà àwòrán" - -msgid "workspace.undo.entry.single.multiple" -msgstr "Ohun" - -msgid "workspace.undo.entry.single.page" -msgstr "Ojú awẹ́" - -msgid "workspace.undo.entry.single.path" -msgstr "Pópó ònà" - -msgid "workspace.undo.entry.single.rect" -msgstr "Onígun mẹ́rin" - -msgid "workspace.undo.entry.single.shape" -msgstr "Ìrísí" - -msgid "workspace.undo.entry.single.text" -msgstr "Àyọkà" - -msgid "workspace.undo.entry.single.typography" -msgstr "Ohun ìyì ìwé títẹ̀" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.unknown" -msgstr "Iṣẹ́ parí %s" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.title" -msgstr "Ìtàn" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.dismiss" -msgstr "Ta nù" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "Àlàyé síi" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.there-are-updates" -msgstr "Àwọn imúdójúìwọ̀n wà nínú àwọn yàrá ìkàwẹ tí a pín" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.update" -msgstr "Ìmúdójúìwọ̀n" - -msgid "workspace.viewport.click-to-close-path" -msgstr "Tẹ̀ láti pa pópó ọ̀nà dé" +msgstr "X-Generator: Weblate\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit" \ No newline at end of file -- Gitee From b3d46a59e352c58fb11e552d3294699c7f171f63 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 13 Feb 2024 06:48:41 +0000 Subject: [PATCH 0420/1266] :globe_with_meridians: Add translations for: Yoruba. Currently translated at 1.5% (21 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/yo/ --- frontend/translations/yo.po | 100 +++++++++++++++++++++++++++++++++++- 1 file changed, 99 insertions(+), 1 deletion(-) diff --git a/frontend/translations/yo.po b/frontend/translations/yo.po index 4f8f6e6de..3bfbe5043 100644 --- a/frontend/translations/yo.po +++ b/frontend/translations/yo.po @@ -1,2 +1,100 @@ msgid "" -msgstr "X-Generator: Weblate\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit" \ No newline at end of file +msgstr "" +"PO-Revision-Date: 2024-02-13 06:56+0000\n" +"Last-Translator: Alejandro Alonso \n" +"Language-Team: Yoruba \n" +"Language: yo\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.4-dev\n" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.check-your-email" +msgstr "" +"yẹ ímeèlì rẹ wò kí o tẹ ọ̀nà-àsopọ̀ láti mọ̀ dájú àti láti bẹ̀rẹ̀ sí lo " +"pẹ́ńpọtì." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.confirm-password" +msgstr "jẹ́rìísí ọ̀rọ̀-ìgbaniwọlé" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-oidc-submit" +msgstr "ṣílẹ̀kuǹ ìdánimọ̀" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.new-password" +msgstr "tẹ ọ̀rọ̀ ìgbaniwọlé tuntun" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-account" +msgstr "ṣẹ̀dá ìfihàn àkáùntí" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-profile" +msgstr "kàn fẹ́ gbìyànjú ú rẹ̀?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.demo-warning" +msgstr "" +"\"\"This is a DEMO service, DO NOT USE for real work, the projects will be " +"parẹ́ lóòrèkóòrè." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.email" +msgstr "ímeèlì" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.forgot-password" +msgstr "gbàgbé ọ̀rọ̀-ìgbaniwọlé ?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.fullname" +msgstr "orúkọ lẹ́kùnn-ún-rẹ́rẹ́" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.login-here" +msgstr "wọlé síbí" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-submit" +msgstr "wọlé" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-title" +msgstr "ó dára láti rí ẹ lẹ́ẹ̀kan sí i!" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-github-submit" +msgstr "ibùdó gítì" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-gitlab-submit" +msgstr "láàbù gítì" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-google-submit" +msgstr "ṣàwárí" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-ldap-submit" +msgstr "LDAP" + +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "orúkọ kíkọ gbọ́dọ̀ jẹ̀ lẹ́tà láìsí àlàfo ." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "orúkọ kò gbọdọ̀ ju àádọ́jọ́ lẹ́tà lọ." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.invalid-token-error" +msgstr "àmì àtúnwárí ti díbàjẹ́." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.password-changed-successfully" +msgstr "ọ̀rọ̀-ìgbaniwọlé ti yí padà dáadáa" -- Gitee From 9e9771fa1e8ea56df3f2fe011d3319ae91dd9f21 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 13 Feb 2024 08:12:28 +0100 Subject: [PATCH 0421/1266] :globe_with_meridians: Deleted translation: Yoruba. --- frontend/translations/yo.po | 100 ------------------------------------ 1 file changed, 100 deletions(-) delete mode 100644 frontend/translations/yo.po diff --git a/frontend/translations/yo.po b/frontend/translations/yo.po deleted file mode 100644 index 3bfbe5043..000000000 --- a/frontend/translations/yo.po +++ /dev/null @@ -1,100 +0,0 @@ -msgid "" -msgstr "" -"PO-Revision-Date: 2024-02-13 06:56+0000\n" -"Last-Translator: Alejandro Alonso \n" -"Language-Team: Yoruba \n" -"Language: yo\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.4-dev\n" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.check-your-email" -msgstr "" -"yẹ ímeèlì rẹ wò kí o tẹ ọ̀nà-àsopọ̀ láti mọ̀ dájú àti láti bẹ̀rẹ̀ sí lo " -"pẹ́ńpọtì." - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.confirm-password" -msgstr "jẹ́rìísí ọ̀rọ̀-ìgbaniwọlé" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-oidc-submit" -msgstr "ṣílẹ̀kuǹ ìdánimọ̀" - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.new-password" -msgstr "tẹ ọ̀rọ̀ ìgbaniwọlé tuntun" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-account" -msgstr "ṣẹ̀dá ìfihàn àkáùntí" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-profile" -msgstr "kàn fẹ́ gbìyànjú ú rẹ̀?" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.demo-warning" -msgstr "" -"\"\"This is a DEMO service, DO NOT USE for real work, the projects will be " -"parẹ́ lóòrèkóòrè." - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.email" -msgstr "ímeèlì" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.forgot-password" -msgstr "gbàgbé ọ̀rọ̀-ìgbaniwọlé ?" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.fullname" -msgstr "orúkọ lẹ́kùnn-ún-rẹ́rẹ́" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.login-here" -msgstr "wọlé síbí" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-submit" -msgstr "wọlé" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "ó dára láti rí ẹ lẹ́ẹ̀kan sí i!" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-github-submit" -msgstr "ibùdó gítì" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-gitlab-submit" -msgstr "láàbù gítì" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-google-submit" -msgstr "ṣàwárí" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-ldap-submit" -msgstr "LDAP" - -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "orúkọ kíkọ gbọ́dọ̀ jẹ̀ lẹ́tà láìsí àlàfo ." - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "orúkọ kò gbọdọ̀ ju àádọ́jọ́ lẹ́tà lọ." - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.invalid-token-error" -msgstr "àmì àtúnwárí ti díbàjẹ́." - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.password-changed-successfully" -msgstr "ọ̀rọ̀-ìgbaniwọlé ti yí padà dáadáa" -- Gitee From e15667bc3973a2e47df5bf8bf605e0b432ee4c62 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 13 Feb 2024 08:13:03 +0100 Subject: [PATCH 0422/1266] :globe_with_meridians: Added translation for: Igbo. --- frontend/translations/ig.po | 2091 +---------------------------------- 1 file changed, 1 insertion(+), 2090 deletions(-) diff --git a/frontend/translations/ig.po b/frontend/translations/ig.po index 5c5ea3353..4f8f6e6de 100644 --- a/frontend/translations/ig.po +++ b/frontend/translations/ig.po @@ -1,2091 +1,2 @@ msgid "" -msgstr "" -"PO-Revision-Date: 2024-04-24 12:55+0000\n" -"Last-Translator: Anonymous \n" -"Language-Team: Igbo " -"\n" -"Language: ig\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.5.1-dev\n" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.check-your-email" -msgstr "Nyoo ozi- n gị ma pịa na njikọ inyocha ma bido jiri ite mkpịsị rụwa ọrụ ." - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.confirm-password" -msgstr "kpebie akara mpibanye" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-account" -msgstr "mebeta akara ozigosi" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-profile" -msgstr "Chọọ nọọ ị nwa ya. ?" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.demo-warning" -msgstr "" -"Ihe bụ ọrụ ozigosi ,e jile ya rụọ ezigbo ọrụ , ọrụ ndị a ga-ekpochapụ site " -"na oge ruo na oge" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.email" -msgstr "Ozi- n" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.forgot-password" -msgstr "Chefuru akara mpibanye ?" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.fullname" -msgstr "Aha n'uju" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.login-here" -msgstr "Banye ebe a" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-submit" -msgstr "Banye" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-github-submit" -msgstr "Obi Git" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-gitlab-submit" -msgstr "Ụlọ nchọcha Git" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-google-submit" -msgstr "Gọgụlụ" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-ldap-submit" -msgstr "LDAP" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-oidc-submit" -msgstr "Mepe ID" - -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "Aha ga-enweriri ụfọdụ mkpụrụ edemede karịa oghere ." - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "Aha ga-enweriri ọ karịa mkpụrụ okwu narị abụọ na iri ise" - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.new-password" -msgstr "Pinye akara mpịbanye ọhụrụ" - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.invalid-token-error" -msgstr "Ọdịmara e nweghachitere adabaghị ." - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.password-changed-successfully" -msgstr "Akara mpịbanye a gbanwere gara aga" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.profile-not-verified" -msgstr "E nyochaghị nchịkọta , Biko nyocha nchịkọta tupu ị gaa n'ihu." - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.recovery-token-sent" -msgstr "E zigara akara njikọ nnweghachi akara mpibanye n'igbe mbata ozi gị ." - -#: src/app/main/ui/auth/verify_token.cljs -msgid "auth.notifications.team-invitation-accepted" -msgstr "Sonyere n'otu nke ọma" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-length-hint" -msgstr "Ọ karịa mkpụrụ ederede asatọ" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-not-empty" -msgstr "Akara mpịbanye ga-enweriri ụfọdụ leta/akara mpị karịa oghere ." - -msgid "auth.privacy-policy" -msgstr "Iwu oñiño onwe" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-submit" -msgstr "Nweghachite akara mpịbanye" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-subtitle" -msgstr "Anyị ga-ezita ozi n na ndụmọdụ" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-title" -msgstr "Chefuru akara mpịbanye ?" - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.recovery-submit" -msgstr "Gbanye akara mpịbanye." - -#: src/app/main/ui/auth/login.cljs -msgid "auth.register" -msgstr "E nweghị ebe Ntinye ihe ma kịta?" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.register-submit" -msgstr "Mepee ebe Ntinye ihe" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-subtitle" -msgstr "Ọ bụ n'efu , ọ bụ ebe nsị a jere oje" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-title" -msgstr "Mepee ebe ntinye ihe" - -#: src/app/main/ui/auth.cljs -msgid "auth.sidebar-tagline" -msgstr "Nsina ghere oghe iji mee nse na atụtụ" - -msgid "auth.terms-of-service" -msgstr "Ọnọdụ ọrụ" - -msgid "auth.terms-privacy-agreement" -msgstr "" -"Mgbe Ị na-emepe akara mbata ọhụrụ , ị ga-ekwe nye n'ọnọdụ ọrụ anyị na iwu " -"oñiño onwe" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.verification-email-sent" -msgstr "Anyị ezigaala ozi nnyocha na" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "...onyinye aha, nkọwa gasị, ngwa ire ahịa dịrị gabazịa." - -msgid "common.publish" -msgstr "bipụta" - -msgid "common.share-link.all-users" -msgstr "Ndị niile ji ite mkpịsị arụ ọrụ" - -msgid "common.share-link.current-tag" -msgstr "(kee ugbu a )" - -msgid "common.share-link.destroy-link" -msgstr "Mebie njiko" - -msgid "common.share-link.get-link" -msgstr "Weta njiko" - -msgid "common.share-link.link-copied-success" -msgstr "E setere njiko nke ọma" - -msgid "common.share-link.manage-ops" -msgstr "Jikwa ikike" - -msgid "common.share-link.permissions-can-comment" -msgstr "nwere ike ikwu okwu" - -msgid "common.share-link.permissions-can-inspect" -msgstr "Nwere Ike inyocha akara" - -msgid "common.share-link.permissions-hint" -msgstr "Onye ọ bụla ga-enwe ohere mbanye" - -msgid "common.share-link.permissions-pages" -msgstr "Ihu akwụkwọ ekekoritara" - -msgid "common.share-link.placeholder" -msgstr "Njikọ e nwere ike ikekorita ga-apụta" - -msgid "common.share-link.team-members" -msgstr "Sọọsọ ndị otu" - -msgid "common.share-link.title" -msgstr "Kee atụ gasị" - -msgid "common.unpublish" -msgstr "Ebiputaghị" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.text" -msgstr "" -"Ite mkpịsị bụ maka otu . Kpọọ ndị otu ka arụkọta ọnụ on arụmarụ na ederede " -"ọnụ" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.title" -msgstr "Jikota ọnụ !" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.info" -msgstr "Mụọ ntọala na ite mkpịsị maka iji nkuzi mmemmekwa eme ihe egwu" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.start" -msgstr "Bido ọmụmụ" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.title" -msgstr "Nkuzi mmemmekwa" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.info" -msgstr "Mee ngagharị na ite mkpịsị ma mata isi a gwara ya." - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.start" -msgstr "Bido njem" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.title" -msgstr "Aba ngagharị" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "Mepụta ọdịmara ọhụrụ" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "Mmepụtara ọdịmara nnweta gara nke ọma ." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "Pịa mpi \"Nweta ọdịmara ọhụrụ \" inweta otu ." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "A chọrọ aha" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "Mkpụrụ ụbọchị narị na iri asatọ" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "Mkpụrụ ụbọchị iri atọ" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-60-days" -msgstr "Mkpụrụ ụbọchị iri isii" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-90-days" -msgstr "Mkpụrụ ụbọchị iri itoolu" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-never" -msgstr "Ncha ncha" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "Mebiri na%s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expires-on" -msgstr "Na-emebi na%s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.no-expiration" -msgstr "Enweghị ụbọchị mmebi" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "Ọdịmara nkeonwe" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"Ọdịmara nnweta nke onwe na-arụ ọrụ dị ka mgbamonwe mbanye anyị /akara " -"mpịbanye e nwere ike iji usoro mbinye aka kwe ka ngwa nweta ndịnime ite " -"mkpịsị API" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-expire" -msgstr "Ọdịmara ga-emebi na%s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-not-expire" -msgstr "Ọdịmara enweghị ụbọchị mmebi" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.add-shared" -msgstr "Tinye dị ka ọ a nkwekọrịta" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.change-email" -msgstr "Gbanwee ozi - n" - -#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs -msgid "dashboard.copy-suffix" -msgstr "(sere)" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.create-new-team" -msgstr "Mebe otu ọhụrụ" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.default-team-name" -msgstr "Ite mkpịsị gị" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.delete-team" -msgstr "kacha otu" - -msgid "dashboard.download-binary-file" -msgstr "Butuo ederede ite mkpịsị (.penpot)" - -msgid "dashboard.download-standard-file" -msgstr "Butuo ederede tozuru etozu (.svg + .json)" - -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.duplicate" -msgstr "mee oyiri" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.duplicate-multi" -msgstr "Mee o yiri %s ederede" - -#: src/app/main/ui/dashboard/grid.cljs -#, markdown -msgid "dashboard.empty-placeholder-drafts" -msgstr "" -"Ederede a tinyere n'ọba ederede ga-apụta ebe a. Gbalịa ikesa ma ọ bụ tinye " -"site n'[Ọba ederede na ndebiri anyị ](https://itemkpịsị.app/ọba ederede " -"gasị-ndebiri gasị.html)." - -msgid "dashboard.export-binary-multi" -msgstr "Butuo %s ederede ite mkpịsị (.penpot)" - -msgid "dashboard.export-frames" -msgstr "Bupu bọọdụ dị ka PDF" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-frames.title" -msgstr "Bupu dị ka PDF" - -msgid "dashboard.export-multi" -msgstr "Bupu %s ederede Ite mkpịsị" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-multiple.selected" -msgstr "A họrọ %s nke %s ndị na" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to" -msgstr "" -"Ị nwere ike ị tinye ntọala mbupu na ndịna site na ngwongwo nse (n'ala akụkụ " -"aka nri ihe ndepụta)" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to-link" -msgstr "Ozi etu esi ahazi mbupu n'ite mkpịsị" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.no-elements" -msgstr "E nweghị ndịna ọ bụla na ntọala mbupu" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.title" -msgstr "Nhọrọ mbupu" - -msgid "dashboard.export-standard-multi" -msgstr "Buto %s ederede tozuru etozu (.svg + .json)" - -msgid "dashboard.export.detail" -msgstr "* Nwere Ike ịgụnye ngwa , esereese gasị, agwụgwara na/ma ọ bụ akara nkụpụta." - -msgid "dashboard.export.options.all.message" -msgstr "" -"A ga-atinye ederede nwere ọba ederede nkekọrịta ma gụnyere mbupu , ma " -"jidekwa ụkpụrụ njikọ ha" - -msgid "dashboard.export.options.all.title" -msgstr "Bupu ọba ederede nkekọrịta" - -msgid "dashboard.export.options.detach.message" -msgstr "" -"Agaghị a tinye ọba ederede nkekọrịta na mbupu ma o nweghị ihe nnwe a ga a " -"tinye ọ a ederede . " - -msgid "dashboard.export.options.merge.title" -msgstr "Tinye ihe nnwe ọba ederede nkekọrịta n'ime ọ a ederede." - -msgid "dashboard.export.title" -msgstr "Ederede mbupu gasị" - -msgid "dashboard.fonts.deleted-placeholder" -msgstr "Mkpụrụ edemede na-efu efu" - -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.dismiss-all" -msgstr "Gbasaa ha niile" - -msgid "dashboard.fonts.empty-placeholder" -msgstr "Mkpụrụ edemede ndị ị bugoro ga-apụta ebe." - -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.upload-all" -msgstr "Bugo ha niile" - -#, markdown -msgid "dashboard.fonts.warning-text" -msgstr "" -"Anyị chọpụtara nsogbu nwere ike ịpụta na mkpụrụ edide gị gbasara ntụ kwụ " -"ọtọ " - -msgid "dashboard.import.analyze-error" -msgstr "Ewuu! Anyị enweghị ike bubata ederede a" - -msgid "dashboard.import.import-error" -msgstr "E nwere nsogbu na ibubata ederede . E bubataghị ederede ." - -msgid "dashboard.import.import-warning" -msgstr "Ụfọdụ ederede nwere ihe ndị adabaghị na ya nke ewepugoro. ." - -msgid "dashboard.import.progress.process-colors" -msgstr "Nhazi agwụgwara gasị" - -msgid "dashboard.import.progress.process-components" -msgstr "Nhazi ngwa gasị" - -msgid "dashboard.import.progress.process-media" -msgstr "Nhazi mgbasa ozi" - -msgid "dashboard.import.progress.process-page" -msgstr "Nhazi ihu akwụkwọ : %s" - -msgid "dashboard.import.progress.process-typographies" -msgstr "Nhazi akara nkụpụta" - -msgid "dashboard.import.progress.upload-data" -msgstr "Ibugo njatụle n'ebe nkesa (%s/%s)" - -msgid "dashboard.import.progress.upload-media" -msgstr "Ibugo ederede : %s" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.invite-profile" -msgstr "Kpọta mmadụ" - -#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.leave-team" -msgstr "Hapụ otu" - -msgid "dashboard.libraries-and-templates" -msgstr "Ọba ederede gasị & ndebiri" - -msgid "dashboard.libraries-and-templates.explore" -msgstr "Nyocha ọtụtụ n'ime ha ma mara etu ị ga-esi tinye ọnụ" - -msgid "dashboard.libraries-and-templates.import-error" -msgstr "E nwere nsogbu ibu aba ndebiri . E bubataghị ndebiri." - -#: src/app/main/ui/dashboard/libraries.cljs -msgid "dashboard.libraries-title" -msgstr "Ọba ederede gasị" - -#: src/app/main/ui/dashboard/grid.cljs -msgid "dashboard.loading-files" -msgstr "Mbụbata ederede gị …" - -msgid "dashboard.loading-fonts" -msgstr "mbubata mkpụrụ edemede gị …" - -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to" -msgstr "Ga na" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to-multi" -msgstr "Buga %s ederede gasị na" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to-other-team" -msgstr "Gaa n'otu ọzọ" - -#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/files.cljs -msgid "dashboard.new-file" -msgstr "+ Ederede ọhụrụ" - -#: src/app/main/data/dashboard.cljs -msgid "dashboard.new-file-prefix" -msgstr "Ederede ọhụrụ" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dashboard.new-project" -msgstr "+ Nchọcha ọhụrụ" - -#: src/app/main/data/dashboard.cljs -msgid "dashboard.new-project-prefix" -msgstr "Arụmarụ ọhụrụ" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.no-matches-for" -msgstr "Ọ nweghị ihe ndabara e nwetara maka “%s“" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.no-projects-placeholder" -msgstr "Arụmarụ a kụdoro ga-apụta ebe a" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "dashboard.notifications.email-changed-successfully" -msgstr "Adreesị ozi - n gị ahazigharịala gara nke ọma" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "dashboard.notifications.email-verified-successfully" -msgstr "E nyochala adreesị ozi - n gị nke ọma" - -#: src/app/main/ui/settings/password.cljs -msgid "dashboard.notifications.password-saved" -msgstr "E dọkwara akara mpịbanye nke ọma !" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.num-of-members" -msgstr "%s Ndị otu" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.open-in-new-tab" -msgstr "Mepe ederede na tabụ ọhụrụ" - -msgid "dashboard.options" -msgstr "Nhọrọ gasị" - -#: src/app/main/ui/settings/password.cljs -msgid "dashboard.password-change" -msgstr "Gbanwee akara mpịbanye" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.pin-unpin" -msgstr "Nọmba /Wepụ nọmba" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dashboard.projects-title" -msgstr "Arụmarụ" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.remove-account" -msgstr "Chọọ iwepu ebe Ntinye ihe gị ?" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.remove-shared" -msgstr "Wepụ dị ka ọba ederede nkekọrịta" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.save-settings" -msgstr "Dokwa ntọala" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.search-placeholder" -msgstr "Chọọ…" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.searching-for" -msgstr "Na-achọ “%s“…" - -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.select-ui-language" -msgstr "Họrọ asụsụ UI" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.success-duplicate-project" -msgstr "E megharịala arụmarụ gị nke ọma\"" - -#: src/app/main/ui/dashboard/grid.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-move-file" -msgstr "E wepula ederede gị nke ọma\"" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.success-move-project" -msgstr "E bupula arụmarụ gị nke ọma" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-info" -msgstr "Ozi otu" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-members" -msgstr "Ndị otu" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-projects" -msgstr "Arụmarụ otu" - -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.theme-change" -msgstr "Isiokwu UI" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.title-search" -msgstr "Chọọ risọltụ gasị" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.type-something" -msgstr "Pinye ịchọ risọltụ" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.unpublish-shared" -msgstr "Ọba ederede ebiputaghị" - -#: src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs -msgid "dashboard.update-settings" -msgstr "Hazie ntọala" - -msgid "dashboard.webhooks.active" -msgstr "Dị gara gara" - -msgid "dashboard.webhooks.active.explain" -msgstr "Mgbe a kpọlitere nkọ a, ọ ga-Ezipụta nkọwa emume n'uju" - -msgid "dashboard.webhooks.content-type" -msgstr "Ụdị ndịna" - -msgid "dashboard.webhooks.create" -msgstr "Mepe nko - ududọ" - -msgid "dashboard.webhooks.create.success" -msgstr "E mepere nko-ududọ nke ọma ." - -msgid "dashboard.webhooks.description" -msgstr "" -"Nko-ududọ bụ ụzọ dị mfe ga-ekwe ka ebe ududọ na apps ndị ọzọ nweta ozi Mgbe " -"ụfọdụ emume na eme n'ite mkpịsị . Anyị ga e ziga OZI arịrịọ nwe URLs ọ bụla " -"ị nwetara" - -msgid "dashboard.webhooks.empty.add-one" -msgstr "Pịa mpị \"Tinye nko-ududọ \" ịtinye otu ." - -msgid "dashboard.webhooks.empty.no-webhooks" -msgstr "E nweghị Nko-ududọ e ebere ruo ugbu a ." - -msgid "dashboard.webhooks.update.success" -msgstr "Ahazigharịrị nko-ududọ nke ọma ." - -#: src/app/main/ui/settings.cljs -msgid "dashboard.your-account-title" -msgstr "Ebe Ntinye ihe gị" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.your-email" -msgstr "Ozi-n" - -#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.your-penpot" -msgstr "Ite mkpịsị. gị" - -#: src/app/main/ui/alert.cljs -msgid "ds.alert-ok" -msgstr "Okay" - -#: src/app/main/ui/alert.cljs -msgid "ds.alert-title" -msgstr "Gee ntị" - -#: src/app/main/ui/confirm.cljs -msgid "ds.confirm-cancel" -msgstr "Kagbuo" - -#: src/app/main/ui/confirm.cljs -msgid "ds.confirm-ok" -msgstr "Okay" - -#: src/app/main/ui/confirm.cljs, src/app/main/ui/confirm.cljs -msgid "ds.confirm-title" -msgstr "Ọ doro gị anya ?" - -msgid "errors.auth.unable-to-login" -msgstr "Ọ dị ka enyochaghị gị ma ọ bụ na oge agwụla ." - -msgid "errors.bad-font" -msgstr "E nweghị ike bugo %s mkpụrụ edide" - -msgid "errors.bad-font-plural" -msgstr "E nweghị ike bugo %s mkpụrụ edide" - -msgid "errors.cannot-upload" -msgstr "E nweghị ike ị ugo ederede ." - -#: src/app/main/data/workspace.cljs -msgid "errors.clipboard-not-implemented" -msgstr "Your browser cannot do this operation" - -#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs -msgid "errors.email-already-exists" -msgstr "E jibuola ozi - n rụọ ọrụ" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.email-already-validated" -msgstr "Aha ozi-n adabala." - -msgid "errors.email-as-password" -msgstr "Ị nweghị ike iji aha ozi-n gị dị ka akara mpịbanye" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.email-has-permanent-bounces" -msgstr "Ozi-n «%s» nwere ọtụtụ ozi nkọwa mbịaghachigide." - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs -msgid "errors.email-invalid" -msgstr "Debanye aha ozi-n dabara adaba" - -#: src/app/main/ui/settings/change_email.cljs -msgid "errors.email-invalid-confirmation" -msgstr "Ozi-n nnabata ga-adabrịrị" - -msgid "errors.email-spam-or-permanent-bounces" -msgstr "E nwela ozi nkọwa na ozi-n«%s» dị ka ozi abaghị uru ma ọ bụ mbịaghachigide." - -#: src/app/main/errors.cljs -msgid "errors.feature-mismatch" -msgstr "" -"Ọ dị ka ị na-emepe ederede nwere a gwara naọ gara aga '%s' mana ihu " -"itemkpịsị gị akwadoghị ya ma ọ bụ gosiri ọ gaghị aga." - -#: src/app/main/errors.cljs -msgid "errors.feature-not-supported" -msgstr "Akwadoghị agwara '%s' ." - -#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.generic" -msgstr "Ihe ezighị ezi emela ." - -#: src/app/main/ui/components/color_input.cljs -msgid "errors.invalid-color" -msgstr "Agwụgwara adabaghị" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.invite-invalid" -msgstr "kpọọ òkù adabaghị" - -msgid "errors.invite-invalid.info" -msgstr "This invite might be canceled or may be expired." - -#: src/app/main/ui/auth/login.cljs -msgid "errors.ldap-disabled" -msgstr "LDAP mbinye aka agaghị ." - -#: src/app/main/errors.cljs -msgid "errors.max-quote-reached" -msgstr "I ruola '%s' ole a chọrọ . Chọọ enyemaka nkwado ." - -#: src/app/main/data/workspace/persistence.cljs -msgid "errors.media-too-large" -msgstr "Onyinyo a ebuka ibu maka itinye ." - -#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs -msgid "errors.media-type-mismatch" -msgstr "Dị ka ihe dị na onyinyo adabaghị na mgbatị ederede." - -#: src/app/main/ui/dashboard/team.cljs -msgid "errors.member-is-muted" -msgstr "" -"Nchịkọta gị nwere ozi-n mechiri emechi (akụkọ ozi-n adịghị mma ma ọ bụ " -"nwere oké bịaghachiri )." - -msgid "errors.profile-blocked" -msgstr "A gbachiri nchịkọta agbachi" - -#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.profile-is-muted" -msgstr "" -"Nchịkọta gị lnwere ozi-n mechiri emechi(akụkọ ozi-n adịghị mma ma ọ bụ " -"nwere oké bịaghachiri ).\")." - -#: src/app/main/ui/auth/register.cljs -msgid "errors.registration-disabled" -msgstr "Ndebanye merụrụ emerụ ugbu a." - -msgid "errors.team-leave.insufficient-members" -msgstr "Ndị otu ezughị okè ịhapụ otu, ọ nyere ike na ị chọrọ ihichapụ ya ." - -msgid "errors.team-leave.member-does-not-exists" -msgstr "Onye otu ị na-achọ inye adịghị ." - -msgid "errors.team-leave.owner-cant-leave" -msgstr "O wee enweghị ike ịhapụ otu, ị ga-enyegharịrị ọrụ onwee." - -#: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "errors.unexpected-error" -msgstr "Ndejo atughị anya ya pụtara ." - -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.unexpected-token" -msgstr "Ọdịmara amaghị ama" - -msgid "errors.webhooks.connection" -msgstr "Mmejọ, e nwetaghị URL" - -msgid "errors.webhooks.invalid-uri" -msgstr "URL enweghị nkwado ." - -msgid "errors.webhooks.ssl-validation" -msgstr "Mmejọ na nkwado SSL ." - -msgid "errors.webhooks.timeout" -msgstr "Oge ezuola" - -#: src/app/main/ui/auth/login.cljs -msgid "errors.wrong-credentials" -msgstr "Ozi-na ma ọ bụ akara mpịbanye adịghị mma ." - -#: src/app/main/ui/settings/password.cljs -msgid "errors.wrong-old-password" -msgstr "Akara mpịbanye ochie adịghị mma" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.description" -msgstr "Nkọwa" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-go-to" -msgstr "Gaa n'ebe ite mkpịsị" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-subtitle1" -msgstr "" -"Obi dị anyị añụrị ịhụ gị ebea. Ọ bụrụ na enyemaka dị mkpa , biko chọọ tupu " -"ị ịga ozi ." - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-title" -msgstr "Ogbe Ite mkpịsị" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.subject" -msgstr "Isiokwu" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.subtitle" -msgstr "" -"Biko, kọwaa ihe isi ozi-n gị , kwuo ma ọ bụ nsogbu , ncheputara ma ọ bụ " -"ekaenyeghị. Onye otu anyị ga-azaghachi ozugbo ọ nwere ike ." - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.title" -msgstr "Ozi- n" - -#: src/app/main/ui/settings/feedback.cljs -#, fuzzy -msgid "feedback.twitter-go-to" -msgstr "Gaa na Twita" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.twitter-subtitle1" -msgstr "Ebe inyere gị aka n'ajụjụ nkà gị ." - -#: src/app/main/ui/settings/password.cljs -msgid "generic.error" -msgstr "Mmehie apụtala" - -#: src/app/main/ui/inspect/attributes/blur.cljs -msgid "inspect.attributes.blur" -msgstr "Inyogo" - -#: src/app/main/ui/inspect/attributes/blur.cljs -msgid "inspect.attributes.blur.value" -msgstr "Uru" - -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.hex" -msgstr "HEX" - -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.hsla" -msgstr "HSLA" - -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.rgba" -msgstr "RGBA" - -#: src/app/main/ui/inspect/attributes/fill.cljs -msgid "inspect.attributes.fill" -msgstr "Wunye" - -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.download" -msgstr "Butuo onyinyo nsina" - -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.height" -msgstr "Ogo" - -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.width" -msgstr "Uhie" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout" -msgstr "Mpụta" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.height" -msgstr "Ogo" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.left" -msgstr "Aka ekpe" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.rotation" -msgstr "Ntụgharị" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.top" -msgstr "Elu" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.width" -msgstr "Uhie" - -#: src/app/main/ui/inspect/attributes/shadow.cljs -msgid "inspect.attributes.shadow" -msgstr "Oninyo" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.size" -msgstr "Nhazi na ọnọdụ" - -#: src/app/main/ui/inspect/attributes/stroke.cljs -msgid "inspect.attributes.stroke" -msgstr "Akara" - -#, permanent -msgid "inspect.attributes.stroke.alignment.center" -msgstr "Etiti" - -#, permanent -msgid "inspect.attributes.stroke.alignment.inner" -msgstr "Ime" - -#, permanent -msgid "inspect.attributes.stroke.alignment.outer" -msgstr "Ezi" - -msgid "inspect.attributes.stroke.style.dotted" -msgstr "Atụrụ kpọm kpọm" - -msgid "inspect.attributes.stroke.style.mixed" -msgstr "Gwakọtara" - -msgid "inspect.attributes.stroke.style.none" -msgstr "Ncha ncha" - -msgid "inspect.attributes.stroke.style.solid" -msgstr "Akpụrụka" - -#: src/app/main/ui/inspect/attributes/stroke.cljs -msgid "inspect.attributes.stroke.width" -msgstr "Uhie" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography" -msgstr "Akara nkụpụta" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-family" -msgstr "Ezinụlọ mkpụrụ edide" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-size" -msgstr "Nhazi mkpụrụ edide" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.letter-spacing" -msgstr "Ndesa mkpụrụ edemede" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.line-height" -msgstr "Ogo akara" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.text-decoration" -msgstr "Nkwazi ederede" - -msgid "inspect.attributes.typography.text-decoration.none" -msgstr "Ncha ncha" - -msgid "inspect.attributes.typography.text-decoration.strikethrough" -msgstr "Kụọgafee" - -msgid "inspect.attributes.typography.text-decoration.underline" -msgstr "N'okpuru" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.text-transform" -msgstr "Mgbanwe ederede" - -msgid "inspect.attributes.typography.text-transform.none" -msgstr "None" - -msgid "inspect.attributes.typography.text-transform.titlecase" -msgstr "Mkpụrụ edemede isiokwu" - -msgid "inspect.attributes.typography.text-transform.uppercase" -msgstr "Mkpụrụ edemede nnukwu" - -msgid "inspect.empty.help" -msgstr "" -"Ị chọọ ị ma ihe ndị ọzọ maka nnyocha esereese, gaa n'ebe enyemaka ite " -"mkpịsị r" - -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.code" -msgstr "Akara" - -msgid "inspect.tabs.code.selected.circle" -msgstr "Okirikiri" - -msgid "inspect.tabs.code.selected.component" -msgstr "Ndịna" - -msgid "inspect.tabs.code.selected.curve" -msgstr "Nrọgọ" - -msgid "inspect.tabs.code.selected.frame" -msgstr "Ogwe." - -msgid "inspect.tabs.code.selected.group" -msgstr "Otu" - -msgid "inspect.tabs.code.selected.image" -msgstr "Onyinyo" - -msgid "inspect.tabs.code.selected.mask" -msgstr "kpuchie" - -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.code.selected.multiple" -msgstr "%s a họrọ" - -msgid "inspect.tabs.code.selected.path" -msgstr "Ụzọ" - -msgid "inspect.tabs.code.selected.rect" -msgstr "Rekụtagụlụ" - -msgid "inspect.tabs.code.selected.svg-raw" -msgstr "SVG" - -msgid "inspect.tabs.code.selected.text" -msgstr "Ederede" - -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.info" -msgstr "Ozi" - -#: src/app/main/ui/workspace/header.cljs -msgid "label.shortcuts" -msgstr "Ụzọ mkpirisi" - -msgid "labels.accept" -msgstr "Nabata" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.access-tokens" -msgstr "Nweta ọdịmara gasị" - -msgid "labels.active" -msgstr "Gara gara" - -msgid "labels.add-custom-font" -msgstr "Tinye mkpụrụ edide a haziri ahazi" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.admin" -msgstr "Ọchịkwa" - -#: src/app/main/ui/workspace/comments.cljs -msgid "labels.all" -msgstr "Ha niile" - -msgid "labels.and" -msgstr "na" - -msgid "labels.back" -msgstr "Azụ" - -#: src/app/main/ui/static.cljs -msgid "labels.bad-gateway.main-message" -msgstr "Ajọ ụzọ mbanye" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.cancel" -msgstr "Kagbuo" - -msgid "labels.close" -msgstr "Megbuo" - -#: src/app/main/ui/dashboard/comments.cljs -msgid "labels.comments" -msgstr "Okwu gasị" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.community" -msgstr "Ogbe" - -#: src/app/main/ui/settings/password.cljs -msgid "labels.confirm-password" -msgstr "Nabata akara mpịbanye" - -msgid "labels.continue" -msgstr "Ga n'ihu" - -msgid "labels.continue-with" -msgstr "Gaa n'ihu" - -msgid "labels.continue-with-penpot" -msgstr "I Nwere Ike ịganihu" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.copy-invitation-link" -msgstr "Dọrọ njikọ" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "labels.create" -msgstr "Meputa" - -#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs -msgid "labels.create-team" -msgstr "Mepee otu ọhụrụ" - -msgid "labels.custom-fonts" -msgstr "mkpụrụ edide a haziri" - -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.delete" -msgstr "Hichaa" - -#: src/app/main/ui/comments.cljs -msgid "labels.delete-comment" -msgstr "Hichaa okwu" - -#: src/app/main/ui/comments.cljs -msgid "labels.delete-comment-thread" -msgstr "Hichapụ eri" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.delete-invitation" -msgstr "Hichapụ oku" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.delete-multi-files" -msgstr "Hichapụ ederede %s" - -#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.drafts" -msgstr "Ndesita" - -#: src/app/main/ui/comments.cljs -msgid "labels.edit" -msgstr "Dezie" - -msgid "labels.edit-file" -msgstr "Dezie ederede" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.editor" -msgstr "Odezi" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.expired-invitation" -msgstr "Mebiri" - -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.feedback-disabled" -msgstr "Nzaghachi merụrụ emeru" - -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.feedback-sent" -msgstr "Zigara nzaghachi" - -msgid "labels.font-family" -msgstr "Ezinụlọ mkpụrụ edide" - -msgid "labels.font-providers" -msgstr "Ndị na-enye mkpụrụ edide" - -msgid "labels.font-variants" -msgstr "Ụdịdị gasị" - -msgid "labels.fonts" -msgstr "Mkpụrụ edide gasị" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.github-repo" -msgstr "Ọ a Github" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.give-feedback" -msgstr "Nye nzaghachi" - -msgid "labels.go-back" -msgstr "Gaa azụ" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.help-center" -msgstr "Ebe enyemaka" - -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.hide-resolved-comments" -msgstr "Zoo nkwupụta e kpebiri" - -msgid "labels.inactive" -msgstr "Arụghị ọrụ" - -msgid "labels.installed-fonts" -msgstr "Mkpụrụ edide gasị ewubere" - -#: src/app/main/ui/static.cljs -msgid "labels.internal-error.desc-message" -msgstr "Ihe ọjọọ mere . Biko, rụgharịa ọrụ ma ọ bụ na nsogbu aka dị , kpọọ nkwado ." - -#: src/app/main/ui/static.cljs -msgid "labels.internal-error.main-message" -msgstr "Nrụjọ ndịnime" - -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.invitations" -msgstr "Akwụkwọ ịkpọ ọkụ gasị" - -#: src/app/main/ui/settings/options.cljs -msgid "labels.language" -msgstr "Asụsụ" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.libraries-and-templates" -msgstr "Ọba ederede na Ndebiri gasị" - -msgid "labels.log-or-sign" -msgstr "Banye ma ọ bụ debanye" - -#: src/app/main/ui/settings.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.logout" -msgstr "Pụọ" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.member" -msgstr "Onye otu" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.members" -msgstr "Ndị otu" - -#: src/app/main/ui/settings/password.cljs -msgid "labels.new-password" -msgstr "Akara mpịbanye ọhụrụ" - -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs -msgid "labels.no-comments-available" -msgstr "E jidere unu niile! Ngosi nkwupụta ọhụrụ ga-apụta ebe a ." - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.no-invitations" -msgstr "E nweghị ọkụ na-echere" - -#: src/app/main/ui/dashboard/team.cljs -#, markdown -msgid "labels.no-invitations-hint" -msgstr "Pịa mpị**kpọọ ndị mmadụ ** ịkpọọ ndị mmadụ n'otu a." - -#: src/app/main/ui/static.cljs -msgid "labels.not-found.desc-message" -msgstr "Ihu akwụkwọ a nwere ike ọ gaghị adị ma ọ bụ ị nweghị ikikere inweta ya ." - -#: src/app/main/ui/static.cljs -msgid "labels.not-found.main-message" -msgstr "E wuu !" - -#: src/app/main/ui/settings/password.cljs -msgid "labels.old-password" -msgstr "Akara mpịbanye ochie" - -#: src/app/main/ui/workspace/comments.cljs -msgid "labels.only-yours" -msgstr "Sọọsọ nke gị" - -msgid "labels.or" -msgstr "ma ọ bụ" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.owner" -msgstr "Onye nwe" - -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.password" -msgstr "Akara mpịbanye" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.pending-invitation" -msgstr "Na-echere" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.profile" -msgstr "Nchịkọta" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.projects" -msgstr "Ọrụ gasị" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.release-notes" -msgstr "Wepụta ndetu" - -#: src/app/main/ui/workspace.cljs -msgid "labels.reload-file" -msgstr "Bugharịa ederede" - -#: src/app/main/ui/workspace/libraries.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.remove" -msgstr "Wepu" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.remove-member" -msgstr "Wepụ onye otu" - -#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.rename" -msgstr "Nyegharịa aha" - -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.rename-team" -msgstr "Nyegharịa otu" - -#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs -msgid "labels.retry" -msgstr "Nwagharịa" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.role" -msgstr "Ọrụ" - -msgid "labels.save" -msgstr "Dokwa" - -msgid "labels.search-font" -msgstr "Chọọ mkpụrụ edide" - -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.send" -msgstr "Ziga" - -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.sending" -msgstr "Na-eziga…" - -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.settings" -msgstr "Ntọala" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.shared-libraries" -msgstr "Ọba ederede" - -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.show-all-comments" -msgstr "Gosi nkwupụta niile" - -msgid "labels.show-comments-list" -msgstr "Gosi ndepụta nkwupụta gasị" - -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.show-your-comments" -msgstr "Gosi nanị nkwupụta gị gasị" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.status" -msgstr "Ọnọdụ" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.tutorials" -msgstr "Nkuzi" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.unpublish-multi-files" -msgstr "%s ederede ebipụtaghị" - -#: src/app/main/ui/settings/profile.cljs -msgid "labels.update" -msgstr "Hazigharịa" - -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.update-team" -msgstr "Hazigharịa otu" - -msgid "labels.upload" -msgstr "Bugo" - -msgid "labels.upload-custom-fonts" -msgstr "Bugo ederede gasị ahaziri" - -msgid "labels.uploading" -msgstr "Na-ebugo…" - -msgid "labels.view-only" -msgstr "Sọọsọ nkiri" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.viewer" -msgstr "Ndị nkiri" - -msgid "labels.webhooks" -msgstr "Nko-ududọ" - -#: src/app/main/ui/comments.cljs -msgid "labels.write-new-comment" -msgstr "Dee nkwupụta ọhụrụ" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.you" -msgstr "(gị)" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.your-account" -msgstr "Akara mbata gị" - -#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs -msgid "media.loading" -msgstr "Na-ebupụta onyinyo …" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"E nweghị ihe dị n'ọba ederede gị. \"Ozugbo e tinyere dị ka ọba ederede " -"ekekoritara, ngwongwo ị mepere ga a dị maka iji ya rụọ ọrụ n'edemede gị ndị " -"ọzọ niile. Ọ kara gị obi na ị chọrọ ị bipụta ya?" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.accept" -msgstr "Tinye ka ọba ederede Kekoritara" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.hint" -msgstr "" -".Ozugbo e tinyere dị ka ọba ederede ekekoritara, ngwongwo ị mepere ga a dị " -"maka iji ya rụọ ọrụ n'edemede gị ndị ọzọ niile." - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.message" -msgstr "Tinye “%s” dị ka ọba ederede ekekoritara" - -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.big-nudge" -msgstr "nnukwu nkpatụ" - -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.submit" -msgstr "Gbanwee ozi nl" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.expiration-date.label" -msgstr "Ụbọchị mmebi" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.label" -msgstr "Aha" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.submit-label" -msgstr "Create token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.title" -msgstr "Mepụta ọdịmara nweta" - -msgid "modals.create-webhook.submit-label" -msgstr "Mebe nko - ududo" - -msgid "modals.create-webhook.title" -msgstr "Mebe nko-ududo" - -msgid "modals.create-webhook.url.label" -msgstr "Isi ozi URL" - -msgid "modals.create-webhook.url.placeholder" -msgstr "https://ọmụmaaụ.com/ozi anabara" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.accept" -msgstr "Hichapụ ọdịmara" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.title" -msgstr "Hichapụ ọdịmara" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.cancel" -msgstr "Kagbuo ma dobe ebe ntinye ihe m" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.confirm" -msgstr "Eee, hichapụ ebe ntinye ihe m" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.info" -msgstr "" -"Site na iwepu ebe ntinye ihe gị, arụmarụ gị gasị ugbu a naebe nchekwa " -"ga-efu ." - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.title" -msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ ebe ntinye ihe gị?" - -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.accept" -msgstr "Hichapụ mkparịtaụka" - -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.message" -msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ mkparịtaụka a?" - -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.title" -msgstr "Hichaa mkparịtaụka" - -msgid "modals.delete-component-annotation.message" -msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ nkọwa ?" - -msgid "modals.delete-component-annotation.title" -msgstr "Hichapụ nkọwa" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.accept" -msgstr "Hichapụ ederede" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.message" -msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ ederede ?" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.title" -msgstr "Na-ehichapụ ederede" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-multi-confirm.title" -msgstr "Na-ehichapụ ederede %s" - -msgid "modals.delete-font.title" -msgstr "Na-ehichapụ mkpụrụ edide" - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "modals.delete-page.body" -msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ ihu akwụkwọ a?" - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "modals.delete-page.title" -msgstr "Hichapụ ihu akwụkwọ" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.accept" -msgstr "Hichapụ arụmarụ" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.message" -msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ arụmarụ ?" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.title" -msgstr "Hichapụ arụmarụ" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.accept" -msgstr "Hichapụ otu" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.message" -msgstr "" -"Ọ kara gị obi na ị chọrọ ị hichapụ otu? ARỤMARỤ na ederede nille gasị " -"gbasara otú ga-ehichapụ kpam kpam" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.title" -msgstr "Na-ehichapụ otu" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.accept" -msgstr "Hichapụ onye otu" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.message" -msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ onye otu n'otu a?" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.title" -msgstr "Hichapụ onye otu" - -msgid "modals.delete-webhook.accept" -msgstr "Hichapụ nko-ududọ" - -msgid "modals.delete-webhook.message" -msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ nko-ududọ ?" - -msgid "modals.delete-webhook.title" -msgstr "Na-ehichapụ nko-ududo" - -msgid "modals.edit-webhook.submit-label" -msgstr "Dezie nko-ududo" - -msgid "modals.edit-webhook.title" -msgstr "Dezie nko-ududo" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.invite-member-confirm.accept" -msgstr "Ziga akwụkwọ ozi mkpọta" - -msgid "modals.invite-member.emails" -msgstr "Ozi-n gasị, Rịkọm e kewara" - -msgid "modals.invite-member.repeated-invitation" -msgstr "Ụfọdụ ozi n sitere na ndị ugbu a A gaghị e ịga akwụkwọ ozi mkpọta ha" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.invite-team-member.title" -msgstr "kpọta ndị otu n'otu a" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-close-confirm.hint" -msgstr "" -"Etu ị bụ sọọ otu onye otu , a ga e hichapụ otu a ya n'ọrụ na ederede ya " -"gasịits projects and files." - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-close-confirm.message" -msgstr "Ọ kara gị obi na ị chọrọ ịhapụ otu %s ?" - -msgid "modals.leave-and-reassign.forbidden" -msgstr "" -"I nweghị ike ịhapụ otu ma ọ bụrụ na e nweghị onye otu ọzọ akwalitere ga na " -"onye nwe ya . Ị nwere ike chọọ ị hichapụ otu ." - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.hint1" -msgstr "" -"Gị bụ onye nwee otu a, . Biko, họrọ onye otu ọzọ maka ịkwalite gana onye " -"nweeya tupu ị hapụ ." - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.promote-and-leave" -msgstr "Kwalite ma hapụ" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.select-member-to-promote" -msgstr "Họrọ onye otu maka ịkwalite" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.title" -msgstr "Tupu ị hapụ" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-confirm.accept" -msgstr "Hapụ otu" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-confirm.message" -msgstr "Ọ kara gị obi na ịchọrọ ịhapụ otu ?" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-confirm.title" -msgstr "Nhapụ otu" - -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.nudge-title" -msgstr "ọnụ ọgụgụ nkpatụ" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.hint" -msgstr "" -"Ọ bụrụ na Inyefe onwunwe , ị ga-agbanwe ọrụ gị ka ọchikwa, ụfọdụ ikikere " -"n'isi ndị otu na-efu " - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.message" -msgstr "" -"G bụ onye nwe otu a ugbu a, Ọ doro gị anya na ị chọrọ ime%s Onye ọhụrụ nwe " -"otu a?" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.title" -msgstr "Onye nwe otu ọhụrụ" - -msgid "modals.publish-empty-library.accept" -msgstr "Biputa" - -msgid "modals.publish-empty-library.message" -msgstr "Your library is empty. Are you sure you want to publish it?" - -msgid "modals.publish-empty-library.title" -msgstr "Biputa ọba ederede efu" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.accept" -msgstr "Wepụ dịka ọba ederede ekekoritara" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.hint" -msgstr "" -"Ozugbo e wepụrụ dị ka ọba ederede ekekoritara, ọba ederede ederede a " -"ga-akwụsị dị n'ime ederede ndị ọzọ gasị e ji rụọ ọrụ" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.message" -msgstr "Wepu“%s” dịka ọba ederede ekekoritara" - -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.small-nudge" -msgstr "kpatụ obere" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component-in-bulk.hint" -msgstr "" -"Ị na-achọ ịhazigharị ngwa gasị n'ọba ederede ekekoritara. Ihe nwere ike " -"imetuta ederede ndị ọzọ ji ya arụ ọrụ" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component-in-bulk.message" -msgstr "Update components in a shared library" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.accept" -msgstr "Hazigharịa" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.cancel" -msgstr "Kagbuo" - -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "A new version is available, please refresh the page" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "notifications.profile-deletion-not-allowed" -msgstr "I nweghị ike ị hichapụ nchịkọta gị . Nyegharịa ya ndị otu gị tupu ị ganihu" - -#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs -msgid "notifications.profile-saved" -msgstr "E dọkwara nchịkọta nke ọma" - -#: src/app/main/ui/settings/change_email.cljs -msgid "notifications.validation-email-sent" -msgstr "Ozi nnyocha n zigara na%s. Mepe ozi n gị !" - -msgid "onboarding-v2.before-start.desc1" -msgstr "" -"I kwesịrị ịma na e nwere ọtụtụ ihe e ji arụ ọrụ dị inwere gị iji bido n'ite " -"mkpịsị , dị ka ntuziaka onye ọrụ na ọwa YouTube anyị l." - -msgid "onboarding-v2.before-start.desc2" -msgstr "" -"Ozi banyere etu esi eji ite mkpịsị arụ ọrụ uju. Site na ime atụtụ ga na " -"nhazi ma ọ bụ nkesa esereese ." - -msgid "onboarding-v2.before-start.desc2.title" -msgstr "Mkpanaka" - -msgid "onboarding-v2.before-start.desc3" -msgstr "Ị nwere ike ikiri amụmamụ anyị na amụmamụ nke ndị obodo anyị mere." - -msgid "onboarding-v2.before-start.desc3.title" -msgstr "Amụmamụ onyonyo" - -msgid "onboarding-v2.before-start.title" -msgstr "Tupu i bido" - -msgid "onboarding-v2.newsletter.desc" -msgstr "" -"Debanye aha n'akụkụ ozi ite mkpịsị iji nọrọ gam gam na ngwa ahịa aaga n'ihu " -"mwulite na akụkọ ụwa." - -msgid "onboarding-v2.newsletter.news" -msgstr "" -"Zitere m akụkọ banyere ite mkpịsị (ozi edemonye gasị, Nkụzi ihe onyonyo, " -"nkirigarị...)." - -msgid "onboarding-v2.newsletter.privacy1" -msgstr "Anyị na-eche banyere nzochi onwe, ebe a inwere ike ịgụ..... anyị " - -msgid "onboarding-v2.newsletter.privacy2" -msgstr "" -"Anyị ga e zitere ozi n bara uru sọọsọ . Ị nwere ike idepu aha oge ọ bụla " -"site na njikọ ndepu aha n'akwụkwọ ozi gasị anyị ọ bụla ." - -msgid "onboarding-v2.newsletter.updates" -msgstr "" -"Zitere m nhazigharị ngwa ahịa (a gwara ọhụrụ gasị , ihe ndị ewepụta gasịrị " -", ndo ị gasị..)." - -msgid "onboarding-v2.welcome.desc1" -msgstr "" -"Ite mkpịsị bụ nsina ghere oghe ma bụrụ nke Kaleidos nakwa ndị obodo rụrụ " -"Ebe ọtụtụ mmadụ nyewegoroa onwe anyị aka..Onye ọ bụla nwere arụkọrịtasite " -"na :" - -msgid "onboarding-v2.welcome.desc2" -msgstr "" -"Oghere ọha na ndị obodo niile na ndị otu ite mkpịsị kpọmkwem ịmụ, kesa ma " -"kọwaa maka ite mkpịsị , ọnọdụ ya ugbu a na ọdịnihu ya" - -msgid "onboarding-v2.welcome.desc3.title" -msgstr "Ntụziaka inye aka" - -msgid "onboarding-v2.welcome.title" -msgstr "Nabata ite mkpịsị !" - -msgid "onboarding.choice.team-up.create-team-desc" -msgstr "I nye ha otu gị aha , I nwere ike ị kpọta ndị mmadụ ka ha sonye." - -msgid "onboarding.choice.team-up.create-team-placeholder" -msgstr "Denye aha otu" - -msgid "onboarding.choice.team-up.invite-members" -msgstr "Kpọta ndị otu" - -msgid "onboarding.choice.team-up.invite-members-info" -msgstr "" -"Cheta ka itinye onye ọ bụla Ndị nzụlite, ndị nrụpụta, ndị njikwa... dị iche " -"iche adds up :)" - -msgid "onboarding.choice.team-up.roles" -msgstr "kpọta tinye ọrụ :" - -msgid "onboarding.newsletter.accept" -msgstr "Eee, debanye aha" - -msgid "onboarding.newsletter.acceptance-message" -msgstr "E zigala arịrịọ ndenye aha gị , anyị ga-ezi tara gị ozi - n iji nabata ya" - -msgid "onboarding.newsletter.title" -msgstr "Chọrọ inweta ozi ite mkpịsị ?" - -msgid "onboarding.team-modal.create-team" -msgstr "Mepụta otu" - -msgid "onboarding.team-modal.create-team-desc" -msgstr "" -"Otu ga-ekwe gị na ndị ọzọ ji ite mkpịsị arụ ọrụ ịrụkọta n'otu ederede na " -"arụmarụ gasị ." - -msgid "onboarding.team-modal.create-team-feature-1" -msgstr "Ederede na arụmarụ na enweghị njedebe" - -msgid "onboarding.team-modal.create-team-feature-2" -msgstr "Mbipụta ọtụtụ egwuregwu" - -msgid "onboarding.team-modal.create-team-feature-3" -msgstr "Njikwa ọrụ" - -msgid "onboarding.team-modal.create-team-feature-4" -msgstr "Ndị otu enweghị njedebe" - -msgid "onboarding.team-modal.create-team-feature-5" -msgstr "% narị efu!" - -msgid "onboarding.templates.subtitle" -msgstr "Ụfọdụ ndebiri nọ ebe a." - -msgid "onboarding.templates.title" -msgstr "Bido osise" - -#: src/app/main/ui/auth/recovery.cljs -msgid "profile.recovery.go-to-login" -msgstr "Gaa na mbanye" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "Kedu ngwa ọrụ nse ị ka mara eji arụ ọrụ ?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "Iri na otu ruo na iri atọ" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "Abụọ ruo na iri" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "Iri atọ na otu ruo na iri ise" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "Ọtụtụ" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Ngwa nrụkọrịta ọrụ Adobe" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Kanva" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "Kedụ ka Ị ga-esi kọwaa ọfụma ihe ndị ị hụrụ ịrụ ọrụ na..." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "Onye nrụpụta" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "Chọpụta ihe ndị ọzọ gbasara ite mkpịsị" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Ihe onyonyo" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Onye malitere /VP" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "Onye nwere onwe ya" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "Weta akara site n'arụmarụ otu m " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "... Nhazi ihu nse, uru ahụmụzọ, usoro imewe , etc." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "Mmakpo" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "Hapụ Nzaghachi maka arụmarụ ndị otu m" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "Ka anyị bido!" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "Onye njikwa ngwaahịa ma ọ bụ arụmarụ" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Ịzụ ahịa" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "Karịrị iri ise" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "Ọzọ" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "Onweghị" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "Ọzọ (zipụta)" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "A na m arụ ọrụ n'arụmarụ onwe" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "Kedụ ka ị sị akwado iji ite mkpịsị arụ ọrụ ?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "Gịnị bụ ọrụ gị ?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "Họrọ nhọ" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Eserese" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.some" -msgstr "Ụfọdụ" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "Bido" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "Bido ịrụ ọrụ m" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "Nwata akwụkwọ ma ọ bụ onye nkụzi" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "Kedụ ka otu gị ha?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "Nwale ite mkpịsị ịhụ ma ọ bụ ihe ndaba maka otu " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "Gbalịa mee mbụ tupu ị jiri ite mkpịsị rụọ ọrụ n'ebe ọ dị" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "... waya etiti , ndị ọrụ njem na eruba , osisi ngagharị gasị , dgz." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "Na-arụ ọrụ n'echiche ihe" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"Nzaghachi gị ga-enyere anyị aka ịghọta ihe agwa na mmasị gị bụ Ka anyị ga " -"na-eme Ite mkpịsị ụdị ngwa ọrụ bara uru dị ụtọ ." - -msgid "shortcuts.bring-backward" -msgstr "Wega ebe azụ" - -msgid "shortcuts.duplicate" -msgstr "Mkpị" - -msgid "shortcuts.letter-spacing-inc" -msgstr "Leta mmụba oghere" - -msgid "shortcuts.paste" -msgstr "Nyado" - -msgid "shortcuts.text-align-left" -msgstr "Dozie akaekpe" - -msgid "viewer.breaking-change.message" -msgstr "Ndo" - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.delete" -msgstr "Kachapụ" - -msgid "workspace.focus.focus-mode" -msgstr "Umezi nlekwasa anya" - -msgid "workspace.focus.focus-on" -msgstr "Gbanye nlekwasa anya" - -msgid "workspace.shape.menu.create-multiple-components" -msgstr "Mee ọtụtụ akọrọngwa ga" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.color-palette" -msgstr "Agba[ Palette (Na narị)" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.there-are-updates" -msgstr "E nwegasịrị nhazizigharị nime ọba ederede ga e kere eke" +msgstr "X-Generator: Weblate\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit" \ No newline at end of file -- Gitee From f970397b3635f998f5f63bb0097f533c0d887fe8 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 13 Feb 2024 08:55:28 +0100 Subject: [PATCH 0423/1266] :globe_with_meridians: Added translation for: Yoruba. --- frontend/translations/yo.po | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 frontend/translations/yo.po diff --git a/frontend/translations/yo.po b/frontend/translations/yo.po new file mode 100644 index 000000000..4f8f6e6de --- /dev/null +++ b/frontend/translations/yo.po @@ -0,0 +1,2 @@ +msgid "" +msgstr "X-Generator: Weblate\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit" \ No newline at end of file -- Gitee From 22047994298e234725f7dcbc400658745625962b Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 13 Feb 2024 07:52:31 +0000 Subject: [PATCH 0424/1266] :globe_with_meridians: Add translations for: Igbo. Currently translated at 40.0% (546 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ig/ --- frontend/translations/ig.po | 2103 ++++++++++++++++++++++++++++++++++- 1 file changed, 2102 insertions(+), 1 deletion(-) diff --git a/frontend/translations/ig.po b/frontend/translations/ig.po index 4f8f6e6de..c45887bb5 100644 --- a/frontend/translations/ig.po +++ b/frontend/translations/ig.po @@ -1,2 +1,2103 @@ msgid "" -msgstr "X-Generator: Weblate\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit" \ No newline at end of file +msgstr "" +"PO-Revision-Date: 2024-02-14 08:02+0000\n" +"Last-Translator: Alejandro Alonso \n" +"Language-Team: Igbo " +"\n" +"Language: ig\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.4-dev\n" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-title" +msgstr "Ihe ịtụnanya ịhụ gị !" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-github-submit" +msgstr "Obi Git" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-gitlab-submit" +msgstr "Ụlọ nchọcha Git" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-google-submit" +msgstr "Gọgụlụ" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-ldap-submit" +msgstr "LDAP" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.no-expiration" +msgstr "Enweghị ụbọchị mmebi" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "Ọdịmara nkeonwe" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "Ọdịmara ga-emebi na%s" + +msgid "dashboard.fonts.deleted-placeholder" +msgstr "Mkpụrụ edemede na-efu efu" + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.upload-all" +msgstr "Bugo ha niile" + +msgid "dashboard.import.progress.process-media" +msgstr "Nhazi mgbasa ozi" + +msgid "dashboard.import.progress.process-page" +msgstr "Nhazi ihu akwụkwọ : %s" + +msgid "dashboard.import.progress.process-typographies" +msgstr "Nhazi akara nkụpụta" + +msgid "dashboard.import.progress.upload-data" +msgstr "Ibugo njatụle n'ebe nkesa (%s/%s)" + +msgid "dashboard.libraries-and-templates" +msgstr "Ọba ederede gasị & ndebiri" + +msgid "dashboard.libraries-and-templates.explore" +msgstr "Nyocha ọtụtụ n'ime ha ma mara etu ị ga-esi tinye ọnụ" + +msgid "dashboard.libraries-and-templates.import-error" +msgstr "E nwere nsogbu ibu aba ndebiri . E bubataghị ndebiri." + +#: src/app/main/ui/dashboard/libraries.cljs +msgid "dashboard.libraries-title" +msgstr "Ọba ederede gasị" + +msgid "dashboard.options" +msgstr "Nhọrọ gasị" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.projects-title" +msgstr "Arụmarụ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.search-placeholder" +msgstr "Chọọ…" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.searching-for" +msgstr "Na-achọ “%s“…" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-language" +msgstr "Họrọ asụsụ UI" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.theme-change" +msgstr "Isiokwu UI" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.title-search" +msgstr "Chọọ risọltụ gasị" + +#: src/app/main/ui/confirm.cljs, src/app/main/ui/confirm.cljs +msgid "ds.confirm-title" +msgstr "Ọ doro gị anya ?" + +msgid "errors.auth.unable-to-login" +msgstr "Ọ dị ka enyochaghị gị ma ọ bụ na oge agwụla ." + +msgid "errors.bad-font" +msgstr "E nweghị ike bugo %s mkpụrụ edide" + +msgid "errors.bad-font-plural" +msgstr "E nweghị ike bugo %s mkpụrụ edide" + +msgid "errors.cannot-upload" +msgstr "E nweghị ike ị ugo ederede ." + +#: src/app/main/data/workspace.cljs +msgid "errors.clipboard-not-implemented" +msgstr "Your browser cannot do this operation" + +msgid "errors.profile-blocked" +msgstr "A gbachiri nchịkọta agbachi" + +#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.profile-is-muted" +msgstr "" +"Nchịkọta gị lnwere ozi-n mechiri emechi(akụkọ ozi-n adịghị mma ma ọ bụ nwere " +"oké bịaghachiri ).\")." + +#: src/app/main/ui/auth/register.cljs +msgid "errors.registration-disabled" +msgstr "Ndebanye merụrụ emerụ ugbu a." + +msgid "errors.team-leave.owner-cant-leave" +msgstr "O wee enweghị ike ịhapụ otu, ị ga-enyegharịrị ọrụ onwee." + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.unexpected-token" +msgstr "Ọdịmara amaghị ama" + +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur.value" +msgstr "Uru" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hex" +msgstr "HEX" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hsla" +msgstr "HSLA" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.rgba" +msgstr "RGBA" + +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke" +msgstr "Akara" + +#, permanent +msgid "inspect.attributes.stroke.alignment.center" +msgstr "Etiti" + +msgid "labels.font-providers" +msgstr "Ndị na-enye mkpụrụ edide" + +msgid "labels.font-variants" +msgstr "Ụdịdị gasị" + +msgid "labels.fonts" +msgstr "Mkpụrụ edide gasị" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.github-repo" +msgstr "Ọ a Github" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.libraries-and-templates" +msgstr "Ọba ederede na Ndebiri gasị" + +msgid "labels.log-or-sign" +msgstr "Banye ma ọ bụ debanye" + +#: src/app/main/ui/dashboard/team.cljs +#, markdown +msgid "labels.no-invitations-hint" +msgstr "Pịa mpị**kpọọ ndị mmadụ ** ịkpọọ ndị mmadụ n'otu a." + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.desc-message" +msgstr "" +"Ihu akwụkwọ a nwere ike ọ gaghị adị ma ọ bụ ị nweghị ikikere inweta ya ." + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.main-message" +msgstr "E wuu !" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.old-password" +msgstr "Akara mpịbanye ochie" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.only-yours" +msgstr "Sọọsọ nke gị" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.pending-invitation" +msgstr "Na-echere" + +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.rename" +msgstr "Nyegharịa aha" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.rename-team" +msgstr "Nyegharịa otu" + +#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs +msgid "labels.retry" +msgstr "Nwagharịa" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.role" +msgstr "Ọrụ" + +msgid "labels.save" +msgstr "Dokwa" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.settings" +msgstr "Ntọala" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.shared-libraries" +msgstr "Ọba ederede" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-all-comments" +msgstr "Gosi nkwupụta niile" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.unpublish-multi-files" +msgstr "%s ederede ebipụtaghị" + +msgid "labels.upload" +msgstr "Bugo" + +msgid "modals.delete-font.title" +msgstr "Na-ehichapụ mkpụrụ edide" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.body" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ ihu akwụkwọ a?" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.title" +msgstr "Hichapụ ihu akwụkwọ" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.accept" +msgstr "Hichapụ arụmarụ" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.message" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ arụmarụ ?" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.title" +msgstr "Hichapụ arụmarụ" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "notifications.profile-deletion-not-allowed" +msgstr "" +"I nweghị ike ị hichapụ nchịkọta gị . Nyegharịa ya ndị otu gị tupu ị ganihu" + +#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs +msgid "notifications.profile-saved" +msgstr "E dọkwara nchịkọta nke ọma" + +#: src/app/main/ui/settings/change_email.cljs +msgid "notifications.validation-email-sent" +msgstr "Ozi nnyocha n zigara na%s. Mepe ozi n gị !" + +msgid "onboarding-v2.before-start.desc1" +msgstr "" +"I kwesịrị ịma na e nwere ọtụtụ ihe e ji arụ ọrụ dị inwere gị iji bido n'ite " +"mkpịsị , dị ka ntuziaka onye ọrụ na ọwa YouTube anyị l." + +msgid "onboarding-v2.before-start.desc2" +msgstr "" +"Ozi banyere etu esi eji ite mkpịsị arụ ọrụ uju. Site na ime atụtụ ga na " +"nhazi ma ọ bụ nkesa esereese ." + +msgid "onboarding-v2.before-start.title" +msgstr "Tupu i bido" + +msgid "onboarding-v2.newsletter.news" +msgstr "" +"Zitere m akụkọ banyere ite mkpịsị (ozi edemonye gasị, Nkụzi ihe onyonyo, " +"nkirigarị...)." + +msgid "onboarding.choice.team-up.invite-members" +msgstr "Kpọta ndị otu" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "Kedu ngwa ọrụ nse ị ka mara eji arụ ọrụ ?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "Iri na otu ruo na iri atọ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "Abụọ ruo na iri" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "Kedụ ka Ị ga-esi kọwaa ọfụma ihe ndị ị hụrụ ịrụ ọrụ na..." + +msgid "shortcuts.paste" +msgstr "Nyado" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.color-palette" +msgstr "Agba[ Palette (Na narị)" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.check-your-email" +msgstr "" +"Nyoo ozi- n gị ma pịa na njikọ inyocha ma bido jiri ite mkpịsị rụwa ọrụ ." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.confirm-password" +msgstr "kpebie akara mpibanye" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-account" +msgstr "mebeta akara ozigosi" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-profile" +msgstr "Chọọ nọọ ị nwa ya. ?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.demo-warning" +msgstr "" +"Ihe bụ ọrụ ozigosi ,e jile ya rụọ ezigbo ọrụ , ọrụ ndị a ga-ekpochapụ site " +"na oge ruo na oge" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.email" +msgstr "Ozi- n" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.forgot-password" +msgstr "Chefuru akara mpibanye ?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.fullname" +msgstr "Aha n'uju" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.login-here" +msgstr "Banye ebe a" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-submit" +msgstr "Banye" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-oidc-submit" +msgstr "Mepe ID" + +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "Aha ga-enweriri ụfọdụ mkpụrụ edemede karịa oghere ." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "Aha ga-enweriri ọ karịa mkpụrụ okwu narị abụọ na iri ise" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.register" +msgstr "E nweghị ebe Ntinye ihe ma kịta?" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.new-password" +msgstr "Pinye akara mpịbanye ọhụrụ" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.invalid-token-error" +msgstr "Ọdịmara e nweghachitere adabaghị ." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.password-changed-successfully" +msgstr "Akara mpịbanye a gbanwere gara aga" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.profile-not-verified" +msgstr "E nyochaghị nchịkọta , Biko nyocha nchịkọta tupu ị gaa n'ihu." + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.recovery-token-sent" +msgstr "E zigara akara njikọ nnweghachi akara mpibanye n'igbe mbata ozi gị ." + +#: src/app/main/ui/auth/verify_token.cljs +msgid "auth.notifications.team-invitation-accepted" +msgstr "Sonyere n'otu nke ọma" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-length-hint" +msgstr "Ọ karịa mkpụrụ ederede asatọ" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "Akara mpịbanye ga-enweriri ụfọdụ leta/akara mpị karịa oghere ." + +msgid "auth.privacy-policy" +msgstr "Iwu oñiño onwe" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-submit" +msgstr "Nweghachite akara mpịbanye" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-subtitle" +msgstr "Anyị ga-ezita ozi n na ndụmọdụ" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-title" +msgstr "Chefuru akara mpịbanye ?" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.recovery-submit" +msgstr "Gbanye akara mpịbanye." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.register-submit" +msgstr "Mepee ebe Ntinye ihe" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-subtitle" +msgstr "Ọ bụ n'efu , ọ bụ ebe nsị a jere oje" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-title" +msgstr "Mepee ebe ntinye ihe" + +#: src/app/main/ui/auth.cljs +msgid "auth.sidebar-tagline" +msgstr "Nsina ghere oghe iji mee nse na atụtụ" + +msgid "auth.terms-of-service" +msgstr "Ọnọdụ ọrụ" + +msgid "auth.terms-privacy-agreement" +msgstr "" +"Mgbe Ị na-emepe akara mbata ọhụrụ , ị ga-ekwe nye n'ọnọdụ ọrụ anyị na iwu " +"oñiño onwe" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.verification-email-sent" +msgstr "Anyị ezigaala ozi nnyocha na" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...onyinye aha, nkọwa gasị, ngwa ire ahịa dịrị gabazịa." + +msgid "common.publish" +msgstr "bipụta" + +msgid "common.share-link.all-users" +msgstr "Ndị niile ji ite mkpịsị arụ ọrụ" + +msgid "common.share-link.current-tag" +msgstr "(kee ugbu a )" + +msgid "common.share-link.destroy-link" +msgstr "Mebie njiko" + +msgid "common.share-link.get-link" +msgstr "Weta njiko" + +msgid "common.share-link.link-copied-success" +msgstr "E setere njiko nke ọma" + +msgid "common.share-link.manage-ops" +msgstr "Jikwa ikike" + +msgid "common.share-link.permissions-can-comment" +msgstr "nwere ike ikwu okwu" + +msgid "common.share-link.permissions-can-inspect" +msgstr "Nwere Ike inyocha akara" + +msgid "common.share-link.permissions-hint" +msgstr "Onye ọ bụla ga-enwe ohere mbanye" + +msgid "common.share-link.permissions-pages" +msgstr "Ihu akwụkwọ ekekoritara" + +msgid "common.share-link.placeholder" +msgstr "Njikọ e nwere ike ikekorita ga-apụta" + +msgid "common.share-link.team-members" +msgstr "Sọọsọ ndị otu" + +msgid "common.share-link.title" +msgstr "Kee atụ gasị" + +msgid "common.unpublish" +msgstr "Ebiputaghị" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.text" +msgstr "" +"Ite mkpịsị bụ maka otu . Kpọọ ndị otu ka arụkọta ọnụ on arụmarụ na ederede " +"ọnụ" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.title" +msgstr "Jikota ọnụ !" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.info" +msgstr "Mụọ ntọala na ite mkpịsị maka iji nkuzi mmemmekwa eme ihe egwu" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.start" +msgstr "Bido ọmụmụ" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.title" +msgstr "Nkuzi mmemmekwa" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.info" +msgstr "Mee ngagharị na ite mkpịsị ma mata isi a gwara ya." + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.start" +msgstr "Bido njem" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.title" +msgstr "Aba ngagharị" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "Mepụta ọdịmara ọhụrụ" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "Mmepụtara ọdịmara nnweta gara nke ọma ." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "Pịa mpi \"Nweta ọdịmara ọhụrụ \" inweta otu ." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "A chọrọ aha" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "Mkpụrụ ụbọchị narị na iri asatọ" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "Mkpụrụ ụbọchị iri atọ" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "Mkpụrụ ụbọchị iri isii" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "Mkpụrụ ụbọchị iri itoolu" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "Ncha ncha" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "Mebiri na%s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "Na-emebi na%s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"Ọdịmara nnweta nke onwe na-arụ ọrụ dị ka mgbamonwe mbanye anyị /akara " +"mpịbanye e nwere ike iji usoro mbinye aka kwe ka ngwa nweta ndịnime ite " +"mkpịsị API" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "Ọdịmara enweghị ụbọchị mmebi" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.add-shared" +msgstr "Tinye dị ka ọ a nkwekọrịta" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.change-email" +msgstr "Gbanwee ozi - n" + +#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs +msgid "dashboard.copy-suffix" +msgstr "(sere)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.create-new-team" +msgstr "Mebe otu ọhụrụ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.default-team-name" +msgstr "Ite mkpịsị gị" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.delete-team" +msgstr "kacha otu" + +msgid "dashboard.download-binary-file" +msgstr "Butuo ederede ite mkpịsị (.penpot)" + +msgid "dashboard.download-standard-file" +msgstr "Butuo ederede tozuru etozu (.svg + .json)" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate" +msgstr "mee oyiri" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate-multi" +msgstr "Mee o yiri %s ederede" + +#: src/app/main/ui/dashboard/grid.cljs +#, markdown +msgid "dashboard.empty-placeholder-drafts" +msgstr "" +"Ederede a tinyere n'ọba ederede ga-apụta ebe a. Gbalịa ikesa ma ọ bụ tinye " +"site n'[Ọba ederede na ndebiri anyị ](https://itemkpịsị.app/ọba ederede gasị-" +"ndebiri gasị.html)." + +msgid "dashboard.export-binary-multi" +msgstr "Butuo %s ederede ite mkpịsị (.penpot)" + +msgid "dashboard.export-frames" +msgstr "Bupu bọọdụ dị ka PDF" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-frames.title" +msgstr "Bupu dị ka PDF" + +msgid "dashboard.export-multi" +msgstr "Bupu %s ederede Ite mkpịsị" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-multiple.selected" +msgstr "A họrọ %s nke %s ndị na" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to" +msgstr "" +"Ị nwere ike ị tinye ntọala mbupu na ndịna site na ngwongwo nse (n'ala akụkụ " +"aka nri ihe ndepụta)" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to-link" +msgstr "Ozi etu esi ahazi mbupu n'ite mkpịsị" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.no-elements" +msgstr "E nweghị ndịna ọ bụla na ntọala mbupu" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.title" +msgstr "Nhọrọ mbupu" + +msgid "dashboard.export-standard-multi" +msgstr "Buto %s ederede tozuru etozu (.svg + .json)" + +msgid "dashboard.export.detail" +msgstr "" +"* Nwere Ike ịgụnye ngwa , esereese gasị, agwụgwara na/ma ọ bụ akara nkụpụta." + +msgid "dashboard.export.options.all.message" +msgstr "" +"A ga-atinye ederede nwere ọba ederede nkekọrịta ma gụnyere mbupu , ma " +"jidekwa ụkpụrụ njikọ ha" + +msgid "dashboard.export.options.all.title" +msgstr "Bupu ọba ederede nkekọrịta" + +msgid "dashboard.export.options.detach.message" +msgstr "" +"Agaghị a tinye ọba ederede nkekọrịta na mbupu ma o nweghị ihe nnwe a ga a " +"tinye ọ a ederede . " + +msgid "dashboard.export.options.merge.title" +msgstr "Tinye ihe nnwe ọba ederede nkekọrịta n'ime ọ a ederede." + +msgid "dashboard.export.title" +msgstr "Ederede mbupu gasị" + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.dismiss-all" +msgstr "Gbasaa ha niile" + +msgid "dashboard.fonts.empty-placeholder" +msgstr "Mkpụrụ edemede ndị ị bugoro ga-apụta ebe." + +#, markdown +msgid "dashboard.fonts.warning-text" +msgstr "" +"Anyị chọpụtara nsogbu nwere ike ịpụta na mkpụrụ edide gị gbasara ntụ kwụ ọtọ " + +msgid "dashboard.import.analyze-error" +msgstr "Ewuu! Anyị enweghị ike bubata ederede a" + +msgid "dashboard.import.import-error" +msgstr "E nwere nsogbu na ibubata ederede . E bubataghị ederede ." + +msgid "dashboard.import.import-warning" +msgstr "Ụfọdụ ederede nwere ihe ndị adabaghị na ya nke ewepugoro. ." + +msgid "dashboard.import.progress.process-colors" +msgstr "Nhazi agwụgwara gasị" + +msgid "dashboard.import.progress.process-components" +msgstr "Nhazi ngwa gasị" + +msgid "dashboard.import.progress.upload-media" +msgstr "Ibugo ederede : %s" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.invite-profile" +msgstr "Kpọta mmadụ" + +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.leave-team" +msgstr "Hapụ otu" + +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.loading-files" +msgstr "Mbụbata ederede gị …" + +msgid "dashboard.loading-fonts" +msgstr "mbubata mkpụrụ edemede gị …" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to" +msgstr "Ga na" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-changed-successfully" +msgstr "Adreesị ozi - n gị ahazigharịala gara nke ọma" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-multi" +msgstr "Buga %s ederede gasị na" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-other-team" +msgstr "Gaa n'otu ọzọ" + +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/files.cljs +msgid "dashboard.new-file" +msgstr "+ Ederede ọhụrụ" + +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-file-prefix" +msgstr "Ederede ọhụrụ" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.new-project" +msgstr "+ Nchọcha ọhụrụ" + +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-project-prefix" +msgstr "Arụmarụ ọhụrụ" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.no-matches-for" +msgstr "Ọ nweghị ihe ndabara e nwetara maka “%s“" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.no-projects-placeholder" +msgstr "Arụmarụ a kụdoro ga-apụta ebe a" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-verified-successfully" +msgstr "E nyochala adreesị ozi - n gị nke ọma" + +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.notifications.password-saved" +msgstr "E dọkwara akara mpịbanye nke ọma !" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.num-of-members" +msgstr "%s Ndị otu" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.open-in-new-tab" +msgstr "Mepe ederede na tabụ ọhụrụ" + +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.password-change" +msgstr "Gbanwee akara mpịbanye" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.pin-unpin" +msgstr "Nọmba /Wepụ nọmba" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.remove-account" +msgstr "Chọọ iwepu ebe Ntinye ihe gị ?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.remove-shared" +msgstr "Wepụ dị ka ọba ederede nkekọrịta" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.save-settings" +msgstr "Dokwa ntọala" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-duplicate-project" +msgstr "E megharịala arụmarụ gị nke ọma\"" + +#: src/app/main/ui/dashboard/grid.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-file" +msgstr "E wepula ederede gị nke ọma\"" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-move-project" +msgstr "E bupula arụmarụ gị nke ọma" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-info" +msgstr "Ozi otu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-members" +msgstr "Ndị otu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-projects" +msgstr "Arụmarụ otu" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.type-something" +msgstr "Pinye ịchọ risọltụ" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.unpublish-shared" +msgstr "Ọba ederede ebiputaghị" + +#: src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs +msgid "dashboard.update-settings" +msgstr "Hazie ntọala" + +msgid "dashboard.webhooks.active" +msgstr "Dị gara gara" + +msgid "dashboard.webhooks.active.explain" +msgstr "Mgbe a kpọlitere nkọ a, ọ ga-Ezipụta nkọwa emume n'uju" + +msgid "dashboard.webhooks.content-type" +msgstr "Ụdị ndịna" + +msgid "dashboard.webhooks.create" +msgstr "Mepe nko - ududọ" + +msgid "dashboard.webhooks.create.success" +msgstr "E mepere nko-ududọ nke ọma ." + +msgid "dashboard.webhooks.description" +msgstr "" +"Nko-ududọ bụ ụzọ dị mfe ga-ekwe ka ebe ududọ na apps ndị ọzọ nweta ozi Mgbe " +"ụfọdụ emume na eme n'ite mkpịsị . Anyị ga e ziga OZI arịrịọ nwe URLs ọ bụla " +"ị nwetara" + +msgid "dashboard.webhooks.empty.add-one" +msgstr "Pịa mpị \"Tinye nko-ududọ \" ịtinye otu ." + +msgid "dashboard.webhooks.empty.no-webhooks" +msgstr "E nweghị Nko-ududọ e ebere ruo ugbu a ." + +msgid "errors.email-spam-or-permanent-bounces" +msgstr "" +"E nwela ozi nkọwa na ozi-n«%s» dị ka ozi abaghị uru ma ọ bụ mbịaghachigide." + +msgid "dashboard.webhooks.update.success" +msgstr "Ahazigharịrị nko-ududọ nke ọma ." + +#: src/app/main/ui/settings.cljs +msgid "dashboard.your-account-title" +msgstr "Ebe Ntinye ihe gị" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-email" +msgstr "Ozi-n" + +#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.your-penpot" +msgstr "Ite mkpịsị. gị" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-ok" +msgstr "Okay" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-title" +msgstr "Gee ntị" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-cancel" +msgstr "Kagbuo" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-ok" +msgstr "Okay" + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs +msgid "errors.email-already-exists" +msgstr "E jibuola ozi - n rụọ ọrụ" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.email-already-validated" +msgstr "Aha ozi-n adabala." + +msgid "errors.email-as-password" +msgstr "Ị nweghị ike iji aha ozi-n gị dị ka akara mpịbanye" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.email-has-permanent-bounces" +msgstr "Ozi-n «%s» nwere ọtụtụ ozi nkọwa mbịaghachigide." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs +msgid "errors.email-invalid" +msgstr "Debanye aha ozi-n dabara adaba" + +#: src/app/main/ui/settings/change_email.cljs +msgid "errors.email-invalid-confirmation" +msgstr "Ozi-n nnabata ga-adabrịrị" + +#: src/app/main/errors.cljs +msgid "errors.feature-mismatch" +msgstr "" +"Ọ dị ka ị na-emepe ederede nwere a gwara naọ gara aga '%s' mana ihu " +"itemkpịsị gị akwadoghị ya ma ọ bụ gosiri ọ gaghị aga." + +#: src/app/main/errors.cljs +msgid "errors.feature-not-supported" +msgstr "Akwadoghị agwara '%s' ." + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.generic" +msgstr "Ihe ezighị ezi emela ." + +#: src/app/main/ui/components/color_input.cljs +msgid "errors.invalid-color" +msgstr "Agwụgwara adabaghị" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.invite-invalid" +msgstr "kpọọ òkù adabaghị" + +msgid "errors.invite-invalid.info" +msgstr "This invite might be canceled or may be expired." + +#: src/app/main/ui/auth/login.cljs +msgid "errors.ldap-disabled" +msgstr "LDAP mbinye aka agaghị ." + +#: src/app/main/errors.cljs +msgid "errors.max-quote-reached" +msgstr "I ruola '%s' ole a chọrọ . Chọọ enyemaka nkwado ." + +#: src/app/main/data/workspace/persistence.cljs +msgid "errors.media-too-large" +msgstr "Onyinyo a ebuka ibu maka itinye ." + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "errors.media-type-mismatch" +msgstr "Dị ka ihe dị na onyinyo adabaghị na mgbatị ederede." + +#: src/app/main/ui/dashboard/team.cljs +msgid "errors.member-is-muted" +msgstr "" +"Nchịkọta gị nwere ozi-n mechiri emechi (akụkọ ozi-n adịghị mma ma ọ bụ " +"nwere oké bịaghachiri )." + +msgid "errors.team-leave.insufficient-members" +msgstr "Ndị otu ezughị okè ịhapụ otu, ọ nyere ike na ị chọrọ ihichapụ ya ." + +msgid "errors.team-leave.member-does-not-exists" +msgstr "Onye otu ị na-achọ inye adịghị ." + +#: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "errors.unexpected-error" +msgstr "Ndejo atughị anya ya pụtara ." + +msgid "errors.webhooks.connection" +msgstr "Mmejọ, e nwetaghị URL" + +msgid "errors.webhooks.invalid-uri" +msgstr "URL enweghị nkwado ." + +msgid "errors.webhooks.ssl-validation" +msgstr "Mmejọ na nkwado SSL ." + +msgid "errors.webhooks.timeout" +msgstr "Oge ezuola" + +#: src/app/main/ui/auth/login.cljs +msgid "errors.wrong-credentials" +msgstr "Ozi-na ma ọ bụ akara mpịbanye adịghị mma ." + +#: src/app/main/ui/settings/password.cljs +msgid "errors.wrong-old-password" +msgstr "Akara mpịbanye ochie adịghị mma" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.description" +msgstr "Nkọwa" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-go-to" +msgstr "Gaa n'ebe ite mkpịsị" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-subtitle1" +msgstr "" +"Obi dị anyị añụrị ịhụ gị ebea. Ọ bụrụ na enyemaka dị mkpa , biko chọọ tupu " +"ị ịga ozi ." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-title" +msgstr "Ogbe Ite mkpịsị" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subject" +msgstr "Isiokwu" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subtitle" +msgstr "" +"Biko, kọwaa ihe isi ozi-n gị , kwuo ma ọ bụ nsogbu , ncheputara ma ọ bụ " +"ekaenyeghị. Onye otu anyị ga-azaghachi ozugbo ọ nwere ike ." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.title" +msgstr "Ozi- n" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-go-to" +msgstr "Gaa na Twita" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-subtitle1" +msgstr "Ebe inyere gị aka n'ajụjụ nkà gị ." + +#: src/app/main/ui/settings/password.cljs +msgid "generic.error" +msgstr "Mmehie apụtala" + +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur" +msgstr "Inyogo" + +#: src/app/main/ui/inspect/attributes/fill.cljs +msgid "inspect.attributes.fill" +msgstr "Wunye" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.download" +msgstr "Butuo onyinyo nsina" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.height" +msgstr "Ogo" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.width" +msgstr "Uhie" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout" +msgstr "Mpụta" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.height" +msgstr "Ogo" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.left" +msgstr "Aka ekpe" + +#: src/app/main/ui/inspect/attributes/shadow.cljs +msgid "inspect.attributes.shadow" +msgstr "Oninyo" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.size" +msgstr "Nhazi na ọnọdụ" + +#, permanent +msgid "inspect.attributes.stroke.alignment.inner" +msgstr "Ime" + +#, permanent +msgid "inspect.attributes.stroke.alignment.outer" +msgstr "Ezi" + +msgid "inspect.attributes.stroke.style.dotted" +msgstr "Atụrụ kpọm kpọm" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.rotation" +msgstr "Ntụgharị" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.top" +msgstr "Elu" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.width" +msgstr "Uhie" + +msgid "inspect.attributes.stroke.style.mixed" +msgstr "Gwakọtara" + +msgid "inspect.attributes.stroke.style.none" +msgstr "Ncha ncha" + +msgid "inspect.attributes.stroke.style.solid" +msgstr "Akpụrụka" + +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke.width" +msgstr "Uhie" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography" +msgstr "Akara nkụpụta" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-family" +msgstr "Ezinụlọ mkpụrụ edide" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-size" +msgstr "Nhazi mkpụrụ edide" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.letter-spacing" +msgstr "Ndesa mkpụrụ edemede" + +msgid "inspect.empty.help" +msgstr "" +"Ị chọọ ị ma ihe ndị ọzọ maka nnyocha esereese, gaa n'ebe enyemaka ite mkpịsị " +"r" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.line-height" +msgstr "Ogo akara" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-decoration" +msgstr "Nkwazi ederede" + +msgid "inspect.attributes.typography.text-decoration.none" +msgstr "Ncha ncha" + +msgid "inspect.attributes.typography.text-decoration.strikethrough" +msgstr "Kụọgafee" + +msgid "inspect.attributes.typography.text-decoration.underline" +msgstr "N'okpuru" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-transform" +msgstr "Mgbanwe ederede" + +msgid "inspect.attributes.typography.text-transform.none" +msgstr "None" + +msgid "inspect.attributes.typography.text-transform.titlecase" +msgstr "Mkpụrụ edemede isiokwu" + +msgid "inspect.attributes.typography.text-transform.uppercase" +msgstr "Mkpụrụ edemede nnukwu" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code" +msgstr "Akara" + +msgid "inspect.tabs.code.selected.circle" +msgstr "Okirikiri" + +msgid "inspect.tabs.code.selected.component" +msgstr "Ndịna" + +msgid "inspect.tabs.code.selected.curve" +msgstr "Nrọgọ" + +msgid "inspect.tabs.code.selected.frame" +msgstr "Ogwe." + +msgid "inspect.tabs.code.selected.group" +msgstr "Otu" + +msgid "inspect.tabs.code.selected.image" +msgstr "Onyinyo" + +msgid "inspect.tabs.code.selected.mask" +msgstr "kpuchie" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code.selected.multiple" +msgstr "%s a họrọ" + +msgid "inspect.tabs.code.selected.path" +msgstr "Ụzọ" + +msgid "inspect.tabs.code.selected.rect" +msgstr "Rekụtagụlụ" + +msgid "inspect.tabs.code.selected.svg-raw" +msgstr "SVG" + +msgid "inspect.tabs.code.selected.text" +msgstr "Ederede" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.info" +msgstr "Ozi" + +#: src/app/main/ui/workspace/header.cljs +msgid "label.shortcuts" +msgstr "Ụzọ mkpirisi" + +msgid "labels.accept" +msgstr "Nabata" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "Nweta ọdịmara gasị" + +msgid "labels.active" +msgstr "Gara gara" + +msgid "labels.add-custom-font" +msgstr "Tinye mkpụrụ edide a haziri ahazi" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.admin" +msgstr "Ọchịkwa" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.all" +msgstr "Ha niile" + +msgid "labels.and" +msgstr "na" + +msgid "labels.back" +msgstr "Azụ" + +#: src/app/main/ui/static.cljs +msgid "labels.bad-gateway.main-message" +msgstr "Ajọ ụzọ mbanye" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.cancel" +msgstr "Kagbuo" + +msgid "labels.close" +msgstr "Megbuo" + +#: src/app/main/ui/dashboard/comments.cljs +msgid "labels.comments" +msgstr "Okwu gasị" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.community" +msgstr "Ogbe" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.confirm-password" +msgstr "Nabata akara mpịbanye" + +msgid "labels.continue" +msgstr "Ga n'ihu" + +msgid "labels.continue-with" +msgstr "Gaa n'ihu" + +msgid "labels.continue-with-penpot" +msgstr "I Nwere Ike ịganihu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.copy-invitation-link" +msgstr "Dọrọ njikọ" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "labels.create" +msgstr "Meputa" + +#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team" +msgstr "Mepee otu ọhụrụ" + +msgid "labels.custom-fonts" +msgstr "mkpụrụ edide a haziri" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete" +msgstr "Hichaa" + +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment" +msgstr "Hichaa okwu" + +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment-thread" +msgstr "Hichapụ eri" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.delete-invitation" +msgstr "Hichapụ oku" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete-multi-files" +msgstr "Hichapụ ederede %s" + +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.drafts" +msgstr "Ndesita" + +#: src/app/main/ui/comments.cljs +msgid "labels.edit" +msgstr "Dezie" + +msgid "labels.edit-file" +msgstr "Dezie ederede" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.editor" +msgstr "Odezi" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.expired-invitation" +msgstr "Mebiri" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-disabled" +msgstr "Nzaghachi merụrụ emeru" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-sent" +msgstr "Zigara nzaghachi" + +msgid "labels.font-family" +msgstr "Ezinụlọ mkpụrụ edide" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.give-feedback" +msgstr "Nye nzaghachi" + +msgid "labels.go-back" +msgstr "Gaa azụ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.help-center" +msgstr "Ebe enyemaka" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.hide-resolved-comments" +msgstr "Zoo nkwupụta e kpebiri" + +msgid "labels.inactive" +msgstr "Arụghị ọrụ" + +msgid "labels.installed-fonts" +msgstr "Mkpụrụ edide gasị ewubere" + +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.desc-message" +msgstr "" +"Ihe ọjọọ mere . Biko, rụgharịa ọrụ ma ọ bụ na nsogbu aka dị , kpọọ nkwado ." + +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.main-message" +msgstr "Nrụjọ ndịnime" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.invitations" +msgstr "Akwụkwọ ịkpọ ọkụ gasị" + +#: src/app/main/ui/settings/options.cljs +msgid "labels.language" +msgstr "Asụsụ" + +#: src/app/main/ui/settings.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.logout" +msgstr "Pụọ" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.member" +msgstr "Onye otu" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.members" +msgstr "Ndị otu" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.new-password" +msgstr "Akara mpịbanye ọhụrụ" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs +msgid "labels.no-comments-available" +msgstr "E jidere unu niile! Ngosi nkwupụta ọhụrụ ga-apụta ebe a ." + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.no-invitations" +msgstr "E nweghị ọkụ na-echere" + +msgid "labels.or" +msgstr "ma ọ bụ" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.owner" +msgstr "Onye nwe" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.password" +msgstr "Akara mpịbanye" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.profile" +msgstr "Nchịkọta" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.projects" +msgstr "Ọrụ gasị" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.release-notes" +msgstr "Wepụta ndetu" + +#: src/app/main/ui/workspace.cljs +msgid "labels.reload-file" +msgstr "Bugharịa ederede" + +#: src/app/main/ui/workspace/libraries.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.remove" +msgstr "Wepu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.remove-member" +msgstr "Wepụ onye otu" + +msgid "labels.search-font" +msgstr "Chọọ mkpụrụ edide" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.send" +msgstr "Ziga" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.sending" +msgstr "Na-eziga…" + +msgid "labels.show-comments-list" +msgstr "Gosi ndepụta nkwupụta gasị" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-your-comments" +msgstr "Gosi nanị nkwupụta gị gasị" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.tutorials" +msgstr "Nkuzi" + +#: src/app/main/ui/settings/profile.cljs +msgid "labels.update" +msgstr "Hazigharịa" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.status" +msgstr "Ọnọdụ" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.update-team" +msgstr "Hazigharịa otu" + +msgid "labels.upload-custom-fonts" +msgstr "Bugo ederede gasị ahaziri" + +msgid "labels.uploading" +msgstr "Na-ebugo…" + +msgid "labels.view-only" +msgstr "Sọọsọ nkiri" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.viewer" +msgstr "Ndị nkiri" + +msgid "labels.webhooks" +msgstr "Nko-ududọ" + +#: src/app/main/ui/comments.cljs +msgid "labels.write-new-comment" +msgstr "Dee nkwupụta ọhụrụ" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.you" +msgstr "(gị)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.your-account" +msgstr "Akara mbata gị" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.info" +msgstr "" +"Site na iwepu ebe ntinye ihe gị, arụmarụ gị gasị ugbu a naebe nchekwa ga-" +"efu ." + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "media.loading" +msgstr "Na-ebupụta onyinyo …" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"E nweghị ihe dị n'ọba ederede gị. \"Ozugbo e tinyere dị ka ọba ederede " +"ekekoritara, ngwongwo ị mepere ga a dị maka iji ya rụọ ọrụ n'edemede gị ndị " +"ọzọ niile. Ọ kara gị obi na ị chọrọ ị bipụta ya?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.accept" +msgstr "Tinye ka ọba ederede Kekoritara" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.hint" +msgstr "" +".Ozugbo e tinyere dị ka ọba ederede ekekoritara, ngwongwo ị mepere ga a dị " +"maka iji ya rụọ ọrụ n'edemede gị ndị ọzọ niile." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.message" +msgstr "Tinye “%s” dị ka ọba ederede ekekoritara" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.big-nudge" +msgstr "nnukwu nkpatụ" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.submit" +msgstr "Gbanwee ozi nl" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.expiration-date.label" +msgstr "Ụbọchị mmebi" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "Aha" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "Create token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "Mepụta ọdịmara nweta" + +msgid "modals.create-webhook.submit-label" +msgstr "Mebe nko - ududo" + +msgid "modals.create-webhook.title" +msgstr "Mebe nko-ududo" + +msgid "modals.create-webhook.url.label" +msgstr "Isi ozi URL" + +msgid "modals.create-webhook.url.placeholder" +msgstr "https://ọmụmaaụ.com/ozi anabara" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "Hichapụ ọdịmara" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "Hichapụ ọdịmara" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.cancel" +msgstr "Kagbuo ma dobe ebe ntinye ihe m" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.confirm" +msgstr "Eee, hichapụ ebe ntinye ihe m" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.title" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ ebe ntinye ihe gị?" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.accept" +msgstr "Hichapụ mkparịtaụka" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.message" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ mkparịtaụka a?" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.title" +msgstr "Hichaa mkparịtaụka" + +msgid "modals.delete-component-annotation.message" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ nkọwa ?" + +msgid "modals.delete-component-annotation.title" +msgstr "Hichapụ nkọwa" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.accept" +msgstr "Hichapụ ederede" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.message" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ ederede ?" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.title" +msgstr "Na-ehichapụ ederede" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.title" +msgstr "Na-ehichapụ ederede %s" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.accept" +msgstr "Hichapụ otu" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.message" +msgstr "" +"Ọ kara gị obi na ị chọrọ ị hichapụ otu? ARỤMARỤ na ederede nille gasị " +"gbasara otú ga-ehichapụ kpam kpam" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.title" +msgstr "Na-ehichapụ otu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.accept" +msgstr "Hichapụ onye otu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.message" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ onye otu n'otu a?" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.title" +msgstr "Hichapụ onye otu" + +msgid "modals.delete-webhook.accept" +msgstr "Hichapụ nko-ududọ" + +msgid "modals.delete-webhook.message" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ nko-ududọ ?" + +msgid "modals.delete-webhook.title" +msgstr "Na-ehichapụ nko-ududo" + +msgid "modals.edit-webhook.submit-label" +msgstr "Dezie nko-ududo" + +msgid "modals.edit-webhook.title" +msgstr "Dezie nko-ududo" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-member-confirm.accept" +msgstr "Ziga akwụkwọ ozi mkpọta" + +msgid "modals.invite-member.emails" +msgstr "Ozi-n gasị, Rịkọm e kewara" + +msgid "modals.invite-member.repeated-invitation" +msgstr "Ụfọdụ ozi n sitere na ndị ugbu a A gaghị e ịga akwụkwọ ozi mkpọta ha" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-team-member.title" +msgstr "kpọta ndị otu n'otu a" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.hint1" +msgstr "" +"Gị bụ onye nwee otu a, . Biko, họrọ onye otu ọzọ maka ịkwalite gana onye " +"nweeya tupu ị hapụ ." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.promote-and-leave" +msgstr "Kwalite ma hapụ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.hint" +msgstr "" +"Etu ị bụ sọọ otu onye otu , a ga e hichapụ otu a ya n'ọrụ na ederede ya " +"gasịits projects and files." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.message" +msgstr "Ọ kara gị obi na ị chọrọ ịhapụ otu %s ?" + +msgid "modals.leave-and-reassign.forbidden" +msgstr "" +"I nweghị ike ịhapụ otu ma ọ bụrụ na e nweghị onye otu ọzọ akwalitere ga na " +"onye nwe ya . Ị nwere ike chọọ ị hichapụ otu ." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.select-member-to-promote" +msgstr "Họrọ onye otu maka ịkwalite" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.title" +msgstr "Tupu ị hapụ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.accept" +msgstr "Hapụ otu" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.message" +msgstr "Ọ kara gị obi na ịchọrọ ịhapụ otu ?" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.title" +msgstr "Nhapụ otu" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.nudge-title" +msgstr "ọnụ ọgụgụ nkpatụ" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.hint" +msgstr "" +"Ọ bụrụ na Inyefe onwunwe , ị ga-agbanwe ọrụ gị ka ọchikwa, ụfọdụ ikikere " +"n'isi ndị otu na-efu " + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.message" +msgstr "" +"G bụ onye nwe otu a ugbu a, Ọ doro gị anya na ị chọrọ ime%s Onye ọhụrụ nwe " +"otu a?" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.title" +msgstr "Onye nwe otu ọhụrụ" + +msgid "modals.publish-empty-library.accept" +msgstr "Biputa" + +msgid "modals.publish-empty-library.message" +msgstr "Your library is empty. Are you sure you want to publish it?" + +msgid "modals.publish-empty-library.title" +msgstr "Biputa ọba ederede efu" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.accept" +msgstr "Wepụ dịka ọba ederede ekekoritara" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.hint" +msgstr "" +"Ozugbo e wepụrụ dị ka ọba ederede ekekoritara, ọba ederede ederede a ga-" +"akwụsị dị n'ime ederede ndị ọzọ gasị e ji rụọ ọrụ" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.message" +msgstr "Wepu“%s” dịka ọba ederede ekekoritara" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.small-nudge" +msgstr "kpatụ obere" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.hint" +msgstr "" +"Ị na-achọ ịhazigharị ngwa gasị n'ọba ederede ekekoritara. Ihe nwere ike " +"imetuta ederede ndị ọzọ ji ya arụ ọrụ" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.message" +msgstr "Update components in a shared library" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.accept" +msgstr "Hazigharịa" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.cancel" +msgstr "Kagbuo" + +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "A new version is available, please refresh the page" + +msgid "onboarding-v2.before-start.desc2.title" +msgstr "Mkpanaka" + +msgid "onboarding-v2.before-start.desc3" +msgstr "Ị nwere ike ikiri amụmamụ anyị na amụmamụ nke ndị obodo anyị mere." + +msgid "onboarding-v2.before-start.desc3.title" +msgstr "Amụmamụ onyonyo" + +msgid "onboarding-v2.newsletter.desc" +msgstr "" +"Debanye aha n'akụkụ ozi ite mkpịsị iji nọrọ gam gam na ngwa ahịa aaga n'ihu " +"mwulite na akụkọ ụwa." + +msgid "onboarding-v2.newsletter.privacy1" +msgstr "Anyị na-eche banyere nzochi onwe, ebe a inwere ike ịgụ..... anyị " + +msgid "onboarding.team-modal.create-team-feature-5" +msgstr "% narị efu!" + +msgid "onboarding-v2.newsletter.privacy2" +msgstr "" +"Anyị ga e zitere ozi n bara uru sọọsọ . Ị nwere ike idepu aha oge ọ bụla " +"site na njikọ ndepu aha n'akwụkwọ ozi gasị anyị ọ bụla ." + +msgid "onboarding-v2.newsletter.updates" +msgstr "" +"Zitere m nhazigharị ngwa ahịa (a gwara ọhụrụ gasị , ihe ndị ewepụta gasịrị , " +"ndo ị gasị..)." + +msgid "onboarding-v2.welcome.desc1" +msgstr "" +"Ite mkpịsị bụ nsina ghere oghe ma bụrụ nke Kaleidos nakwa ndị obodo rụrụ Ebe " +"ọtụtụ mmadụ nyewegoroa onwe anyị aka..Onye ọ bụla nwere arụkọrịtasite na :" + +msgid "onboarding-v2.welcome.desc2" +msgstr "" +"Oghere ọha na ndị obodo niile na ndị otu ite mkpịsị kpọmkwem ịmụ, kesa ma " +"kọwaa maka ite mkpịsị , ọnọdụ ya ugbu a na ọdịnihu ya" + +msgid "onboarding-v2.welcome.desc3.title" +msgstr "Ntụziaka inye aka" + +msgid "onboarding-v2.welcome.title" +msgstr "Nabata ite mkpịsị !" + +msgid "onboarding.choice.team-up.create-team-desc" +msgstr "I nye ha otu gị aha , I nwere ike ị kpọta ndị mmadụ ka ha sonye." + +msgid "onboarding.choice.team-up.create-team-placeholder" +msgstr "Denye aha otu" + +msgid "onboarding.choice.team-up.invite-members-info" +msgstr "" +"Cheta ka itinye onye ọ bụla Ndị nzụlite, ndị nrụpụta, ndị njikwa... dị iche " +"iche adds up :)" + +msgid "onboarding.choice.team-up.roles" +msgstr "kpọta tinye ọrụ :" + +msgid "onboarding.newsletter.accept" +msgstr "Eee, debanye aha" + +msgid "onboarding.newsletter.acceptance-message" +msgstr "" +"E zigala arịrịọ ndenye aha gị , anyị ga-ezi tara gị ozi - n iji nabata ya" + +msgid "onboarding.newsletter.title" +msgstr "Chọrọ inweta ozi ite mkpịsị ?" + +msgid "onboarding.team-modal.create-team" +msgstr "Mepụta otu" + +msgid "onboarding.team-modal.create-team-desc" +msgstr "" +"Otu ga-ekwe gị na ndị ọzọ ji ite mkpịsị arụ ọrụ ịrụkọta n'otu ederede na " +"arụmarụ gasị ." + +msgid "onboarding.team-modal.create-team-feature-1" +msgstr "Ederede na arụmarụ na enweghị njedebe" + +msgid "onboarding.team-modal.create-team-feature-2" +msgstr "Mbipụta ọtụtụ egwuregwu" + +msgid "onboarding.team-modal.create-team-feature-3" +msgstr "Njikwa ọrụ" + +msgid "onboarding.team-modal.create-team-feature-4" +msgstr "Ndị otu enweghị njedebe" + +msgid "onboarding.templates.subtitle" +msgstr "Ụfọdụ ndebiri nọ ebe a." + +msgid "onboarding.templates.title" +msgstr "Bido osise" + +#: src/app/main/ui/auth/recovery.cljs +msgid "profile.recovery.go-to-login" +msgstr "Gaa na mbanye" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "Iri atọ na otu ruo na iri ise" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "Ọtụtụ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Ngwa nrụkọrịta ọrụ Adobe" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Kanva" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Onye nrụpụta" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "Chọpụta ihe ndị ọzọ gbasara ite mkpịsị" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Ihe onyonyo" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Onye malitere /VP" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Onye nwere onwe ya" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Weta akara site n'arụmarụ otu m " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... Nhazi ihu nse, uru ahụmụzọ, usoro imewe , etc." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "Mmakpo" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Hapụ Nzaghachi maka arụmarụ ndị otu m" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "Ka anyị bido!" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Onye njikwa ngwaahịa ma ọ bụ arụmarụ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Ịzụ ahịa" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "Karịrị iri ise" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-a-tool" +msgstr "E jibeghị m ngwa ọrụ nse rụọ ọrụ mbụ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Ọzọ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Onweghị" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Ọzọ (zipụta)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "A na m arụ ọrụ n'arụmarụ onwe" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Kedụ ka ị sị akwado iji ite mkpịsị arụ ọrụ ?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Gịnị bụ ọrụ gị ?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Họrọ nhọ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Eserese" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Ụfọdụ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Bido" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Bido ịrụ ọrụ m" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Nwata akwụkwọ ma ọ bụ onye nkụzi" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "Kedụ ka otu gị ha?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Nwale ite mkpịsị ịhụ ma ọ bụ ihe ndaba maka otu " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Gbalịa mee mbụ tupu ị jiri ite mkpịsị rụọ ọrụ n'ebe ọ dị" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "... waya etiti , ndị ọrụ njem na eruba , osisi ngagharị gasị , dgz." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Na-arụ ọrụ n'echiche ihe" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Nzaghachi gị ga-enyere anyị aka ịghọta ihe agwa na mmasị gị bụ Ka anyị ga na-" +"eme Ite mkpịsị ụdị ngwa ọrụ bara uru dị ụtọ ." + +msgid "shortcuts.bring-backward" +msgstr "Wega ebe azụ" + +msgid "shortcuts.duplicate" +msgstr "Mkpị" + +msgid "shortcuts.letter-spacing-inc" +msgstr "Leta mmụba oghere" + +msgid "shortcuts.text-align-left" +msgstr "Dozie akaekpe" + +msgid "viewer.breaking-change.message" +msgstr "Ndo" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.delete" +msgstr "Kachapụ" + +msgid "workspace.focus.focus-mode" +msgstr "Umezi nlekwasa anya" + +msgid "workspace.focus.focus-on" +msgstr "Gbanye nlekwasa anya" + +msgid "workspace.shape.menu.create-multiple-components" +msgstr "Mee ọtụtụ akọrọngwa ga" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.there-are-updates" +msgstr "E nwegasịrị nhazizigharị nime ọba ederede ga e kere eke" -- Gitee From a0aec8023a0831cd14f0dd20f1e96406d4e40f2c Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 13 Feb 2024 07:55:49 +0000 Subject: [PATCH 0425/1266] :globe_with_meridians: Add translations for: Yoruba. Currently translated at 90.6% (1234 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/yo/ --- frontend/translations/yo.po | 4651 ++++++++++++++++++++++++++++++++++- 1 file changed, 4650 insertions(+), 1 deletion(-) diff --git a/frontend/translations/yo.po b/frontend/translations/yo.po index 4f8f6e6de..7d573ec6f 100644 --- a/frontend/translations/yo.po +++ b/frontend/translations/yo.po @@ -1,2 +1,4651 @@ msgid "" -msgstr "X-Generator: Weblate\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit" \ No newline at end of file +msgstr "" +"PO-Revision-Date: 2024-02-14 08:02+0000\n" +"Last-Translator: Alejandro Alonso \n" +"Language-Team: Yoruba \n" +"Language: yo\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.4-dev\n" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.login-here" +msgstr "wọlé síbí" + +msgid "common.publish" +msgstr "ìgbéjáde" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.start" +msgstr "bẹ̀rẹ̀ ìrìn kiri" + +msgid "dashboard.import" +msgstr "gbé àwọn fáìlì pẹ́ńpọtì wọlé" + +msgid "dashboard.import.analyze-error" +msgstr "ooho! a kò lè gbé fáìlì yìí wọlé" + +msgid "dashboard.import.import-error" +msgstr "wàhálà wà láti gbé kan wà láti gbé fáìlì wọlé . fáìlì kò wọlé." + +#: src/app/main/ui/dashboard/libraries.cljs +msgid "dashboard.libraries-title" +msgstr "yàrá ìkàwé" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-duplicate-project" +msgstr "a ti ṣe ẹ̀dà iṣẹ́ àgbéṣe rẹ dáadáa" + +#: src/app/main/ui/dashboard/grid.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-file" +msgstr "a ti gbé fáìlì rẹ kúro dáadáa" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-files" +msgstr "a ti gbé àwọn fáìlì rẹ kúrò dáadáa" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs +msgid "errors.email-invalid" +msgstr "Tẹ àti wọlé pẹ̀lú ímeèlì tó wúlo jọ̀wọ́" + +msgid "errors.webhooks.timeout" +msgstr "Àkókò ti lọ" + +msgid "inspect.tabs.code.selected.circle" +msgstr "Àyíká" + +msgid "inspect.tabs.code.selected.component" +msgstr "Ẹ̀yà" + +msgid "inspect.tabs.code.selected.curve" +msgstr "Igun" + +msgid "inspect.tabs.code.selected.frame" +msgstr "Bọ́ọ̀dù" + +msgid "inspect.tabs.code.selected.group" +msgstr "Ẹgbẹ́" + +msgid "inspect.tabs.code.selected.image" +msgstr "Àwòrán" + +msgid "inspect.tabs.code.selected.mask" +msgstr "Ìbòjú" + +msgid "labels.and" +msgstr "àti" + +msgid "labels.share-prototype" +msgstr "Pín àwọn ohun tí a ti kọ tẹ́lẹ̀" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.shared-libraries" +msgstr "Yàrá ìkáwe" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-all-comments" +msgstr "Fi gbogbo kọ́mẹ́ǹtì hàn" + +msgid "labels.show-comments-list" +msgstr "Fi àkójọ àwọn kọ́mẹ́ǹtì hàn" + +msgid "modals.delete-webhook.message" +msgstr "Ṣe ó dá ọ lójú pé o fẹ́ pa ìkọ́-wẹ́bù yìí rẹ́?" + +msgid "modals.publish-empty-library.accept" +msgstr "Kọ ọ́ jáde" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "Mọ́kànlélọ́gbọ̀n-Àádọ́ta" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "O ´ pọ̀jù" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Àdòbí XD" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.share.copy-link" +msgstr "Da línkì kọ̀" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.show-interactions" +msgstr "Ifihan Ibaraenisépọ̀" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "wò gbògbò awọn ayípàdà" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.updates" +msgstr "Awọn ímùdojúiwọn" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.add-interaction" +msgstr "Tẹ amí + làtí fi íbàràénisépọ̀ kun" + +#: src/app/main/ui/workspace/sidebar/options.cljs +msgid "workspace.options.design" +msgstr "Ónirú" + +msgid "workspace.options.height" +msgstr "Gíga" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-on-click" +msgstr "Tẹ orí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay" +msgstr "Ṣíìtẹ̀lé ìlànà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay-dest" +msgstr "Ṣí ìtẹ̀lé ìlànà: %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-relative-to" +msgstr "Ìbátan sí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-self" +msgstr "Tìkara" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay" +msgstr "Àyípadà ìtẹ̀lé ìlànà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay-dest" +msgstr "Àyípadà ìtẹ̀lé ìlànà: %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-trigger" +msgstr "Okùnfà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-url" +msgstr "URL" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row" +msgstr "Ilà ìbú" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row-reverse" +msgstr "Ilà ìbú yíyípadà" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.gap" +msgstr "Àlàfo" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.left" +msgstr "Òsì" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin" +msgstr "Etí ìwé" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin-all" +msgstr "Gbogbo àwọn àwòrán" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin-simple" +msgstr "Etí ìwé ẹyọ" + +msgid "workspace.options.shadow-options.color" +msgstr "Àwọ̀ òjíjí" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.forward" +msgstr "Mú wá sọ́wọ́ iwájú" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.front" +msgstr "Mú wá sí wájú" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.go-main" +msgstr "Lọ sí olórí fáìlì àkóónú" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.group" +msgstr "Àwùjọ" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.hide" +msgstr "Tọ́jú" + +msgid "workspace.shape.menu.hide-ui" +msgstr "Fihàn/ Tọ́jú UI" + +msgid "workspace.shape.menu.intersection" +msgstr "Ìkòríta" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.lock" +msgstr "Tì" + +#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.mask" +msgstr "Ìbòjú" + +#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.paste" +msgstr "lẹ̀mọ́" + +msgid "workspace.shape.menu.path" +msgstr "Ipa ọ̀nà" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-flex" +msgstr "Yọ àrọ ètò ìrísí kúrò" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.unlock" +msgstr "Ṣíí" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.unmask" +msgstr "Sí ìbòjú" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.update-components-in-bulk" +msgstr "Mímú àwọn ọ̀rọ̀ àkóónú pàtàkì dójú ìwọ̀n" + +msgid "workspace.sidebar.collapse" +msgstr "Wó òpó ègbẹ́" + +msgid "workspace.sidebar.expand" +msgstr "Fẹ òpó ẹ̀gbẹ́" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.sidebar.history" +msgstr "Ìtàn (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.sidebar.layers" +msgstr "Àwọn ìpele" + +msgid "workspace.sidebar.layers.components" +msgstr "Àwọn àkóónú" + +msgid "workspace.sidebar.layers.frames" +msgstr "Àwọn pátákó" + +#: src/app/main/ui/workspace/sidebar/options/menus/svg_attrs.cljs, src/app/main/ui/inspect/attributes/svg.cljs +msgid "workspace.sidebar.options.svg-attrs.title" +msgstr "Gbígbé àwọn ànímọ́ SVG wọlé wá" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "workspace.sidebar.sitemap" +msgstr "Àwọn abala" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.new" +msgstr "Titun %s" + +msgid "workspace.undo.entry.single.circle" +msgstr "Àyíká" + +msgid "workspace.undo.entry.single.color" +msgstr "Ohun àmúṣọrọ̀ àwọ̀" + +msgid "workspace.undo.entry.single.component" +msgstr "Àkóónú" + +msgid "workspace.undo.entry.single.curve" +msgstr "Ẹkọ̀rọ̀" + +msgid "workspace.undo.entry.single.frame" +msgstr "Pátákó" + +msgid "workspace.undo.entry.single.group" +msgstr "Àkójọ" + +msgid "workspace.undo.entry.single.image" +msgstr "Àwòrán" + +msgid "workspace.undo.entry.single.media" +msgstr "Ohun àmúṣọrọ̀ èyà àwòrán" + +msgid "workspace.undo.entry.single.multiple" +msgstr "Ohun" + +msgid "workspace.undo.entry.single.page" +msgstr "Ojú awẹ́" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.check-your-email" +msgstr "" +"yẹ ímeèlì rẹ wò kí o tẹ ọ̀nà-àsopọ̀ láti mọ̀ dájú àti láti bẹ̀rẹ̀ sí lo " +"pẹ́ńpọtì." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.confirm-password" +msgstr "jẹ́rìísí ọ̀rọ̀-ìgbaniwọlé" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-account" +msgstr "ṣẹ̀dá ìfihàn àkáùntí" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-profile" +msgstr "kàn fẹ́ gbìyànjú ú rẹ̀?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.demo-warning" +msgstr "" +"\"\"This is a DEMO service, DO NOT USE for real work, the projects will be " +"parẹ́ lóòrèkóòrè." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.email" +msgstr "ímeèlì" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.forgot-password" +msgstr "gbàgbé ọ̀rọ̀-ìgbaniwọlé ?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.fullname" +msgstr "orúkọ lẹ́kùnn-ún-rẹ́rẹ́" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-submit" +msgstr "wọlé" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-title" +msgstr "ó dára láti rí ẹ lẹ́ẹ̀kan sí i!" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-github-submit" +msgstr "ibùdó gítì" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-gitlab-submit" +msgstr "láàbù gítì" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-google-submit" +msgstr "ṣàwárí" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-ldap-submit" +msgstr "LDAP" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-oidc-submit" +msgstr "ṣílẹ̀kuǹ ìdánimọ̀" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "orúkọ kò gbọdọ̀ ju àádọ́jọ́ lẹ́tà lọ." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.new-password" +msgstr "tẹ ọ̀rọ̀ ìgbaniwọlé tuntun" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.invalid-token-error" +msgstr "àmì àtúnwárí ti díbàjẹ́." + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.password-changed-successfully" +msgstr "ọ̀rọ̀-ìgbaniwọlé ti yí padà dáadáa" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.profile-not-verified" +msgstr "" +"a tí ì ṣe ìwádìí bí o ṣe jẹ́, jọ̀wọ́ ṣe ìwádìí bí o ṣe jẹ́ kí o tó tẹ̀ " +"síwájú." + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.recovery-token-sent" +msgstr "a ti fi ọ̀rọ̀-ìgbaniwọle aṣàtúnwárí ránṣẹ sínu àpótí rẹ." + +#: src/app/main/ui/auth/verify_token.cljs +msgid "auth.notifications.team-invitation-accepted" +msgstr "o ti wọ inú ẹgbẹ́ bó ṣeyẹ" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.password" +msgstr "ọ̀rọ̀- ìgbaniwọlé" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-length-hint" +msgstr "kò gbọdọ̀ ju ohun kíkọ mẹ́jọ lọ" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "ọ̀rọ̀-ìgbaniwọlé gbọ́dọ̀ ní nǹkan kíkọ láìsí àlàfo." + +msgid "auth.privacy-policy" +msgstr "ìpamọ ètò ìmúló" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-submit" +msgstr "ṣàtuńwárí ọ̀rọ̀-ìgbaniwọlé" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-subtitle" +msgstr "a má a fi àwọn ìtọ́nisọ́nà ránsẹ́ sínú ímeèlì rẹ" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-title" +msgstr "gbàgbé ọ̀rọ̀-ìgbaniwọle ?" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.recovery-submit" +msgstr "yí ọ̀rọ̀-ìgbaniwọlé rẹ padà" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.register" +msgstr "kò tí ì sí àkáùntì?" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.register-submit" +msgstr "ṣẹ̀dá àkáùntì" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-subtitle" +msgstr "ọ̀fẹ́ ni,orísun rẹ̀ ṣí lẹ" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-title" +msgstr "ṣẹ̀dá àkáùntì" + +#: src/app/main/ui/auth.cljs +msgid "auth.sidebar-tagline" +msgstr "ṣíṣí orísun yíyà àti àwòrán ni yóò fi lojútùú ." + +msgid "auth.terms-of-service" +msgstr "òfin ibiṣẹ́" + +msgid "auth.terms-privacy-agreement" +msgstr "" +"\"nígbà, tí o bá ń ṣẹ̀dá àkáùntí tuntun ,o gbọ́dọ̀ gba àwọn òfin ibiṣẹ́ àti " +"àṣírí rẹ́`." + +#: src/app/main/ui/auth/register.cljs +msgid "auth.verification-email-sent" +msgstr "a ti fi ìjẹ́rìísí ránsẹ́ sínú ímeèlì rẹ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr ".. ìyàsọ́tọ, àpèjúwe,títajà nǹkan, abbl." + +msgid "common.share-link.all-users" +msgstr "gbogbo àwọn tó ń lo pẹ́ńpọtì" + +msgid "common.share-link.current-tag" +msgstr "(lọ́wọ́lọ́wọ́)" + +msgid "common.share-link.destroy-link" +msgstr "pa ọ̀nà-àsopọ̀ run" + +msgid "common.share-link.get-link" +msgstr "gba ọ̀nà-àsopọ́" + +msgid "common.share-link.link-copied-success" +msgstr "so àdàkọ pọ̀ bó ṣeyẹ" + +msgid "common.share-link.manage-ops" +msgstr "ṣàkóṣo ìgbaniláàye" + +msgid "common.share-link.permissions-can-comment" +msgstr "o lè sọ̀rọ̀" + +msgid "common.share-link.permissions-can-inspect" +msgstr "ṣe àyẹ̀wò kóòdù" + +msgid "common.share-link.permissions-hint" +msgstr "ẹnikẹ́ni tí ó bá ní ọ̀nà-àsopọ á ní àǹfààní àtiwọle" + +msgid "common.share-link.permissions-pages" +msgstr "pín ojú ìwé" + +msgid "common.share-link.placeholder" +msgstr "ọ̀nà-àsopọ̀ ojú ìwé tí a pín á hàn ní bí yìí" + +msgid "common.share-link.team-members" +msgstr "ọmọ ẹgbẹ́ nìkan ni" + +msgid "common.share-link.title" +msgstr "pín àwọn àpẹrẹ" + +msgid "common.share-link.view-all" +msgstr "yan gbogbo rẹ̀" + +msgid "common.unpublish" +msgstr "ohun tí a kò tí ì kọ jáde" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.management" +msgstr "ìṣàkóṣo ọmọ ẹgbẹ" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.title" +msgstr "kẹ́gbẹ́ ṣera wọn lọ́kan" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.info" +msgstr "" +"\"kọ́ nípa kókó bi pẹ́ńpọtì nígbàtí ò ń dára rẹ láraya nípa fífi àwon ọwọ́ " +"rẹ ṣe “ “ìdánilẹ́kọ̀ọ́ ." + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.start" +msgstr "bẹ̀rẹ̀ ìdánilẹ́kọ̀ọ́" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.title" +msgstr "gbọ́wọ́ lórí idánilẹ́kọ̀ọ́" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.info" +msgstr "rìn kàákiri pẹ́ńpọti kí o lè mọ kókó àwẹn ẹ̀yà ara rẹ̀." + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.title" +msgstr "wò ó bí o ṣe ń rìn kiri" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "ṣe ìpilẹ̀sẹ̀ àmì tókìnnì" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "ṣe àyẹ̀wò àmì tókìnnì tí o ṣẹ̀dá bó ṣeyẹ." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "" +"tẹ bọ́tìnnì \" ṣe ìpilẹ̀sẹ̀ àmì tókìnnì tuntun\" láti ṣe ìpilẹ̀sẹ̀ òmíràn." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "o kò tí ì ní àmì tókínnì títí di ìsinsìn yìí." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "a nílò orúkọ" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "ọgọ́saǹ-ań ọjọ́" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "ọgbọ̀n ọjọ́" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "ọgọ́ta ọjọ́" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "àádọ́ruǹ-ún ọjọ́" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "rárá" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "ó parí ní %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "ó parí %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.no-expiration" +msgstr "kò sì ọjọ́ ìparí" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "àmì tokìnnì ìwọlé ti ara ẹni" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"Iṣẹ́ àmì tókìnì ìwọlé ti ara ẹni dàbì ọ̀nà kejí tí a le gbà wọlé/ ọ̀rọ̀- " +"agbaniwọle a lè lo ìfàsẹ sí ètò láti gbaye fún ohun èlò à tì wọlé pẹ́ń" +"pọtì ti abẹ́nú api" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "àmì tòkìn yóò parí ní %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "kò sí ọjọ́ ìparí fún àmì tókìn" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.add-shared" +msgstr "ṣe àpàpọ̀ bí i yàrá ìkàwe tí a pín" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.change-email" +msgstr "pàrọ̀ ímeèlí" + +#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs +msgid "dashboard.copy-suffix" +msgstr "(dàákọ)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.create-new-team" +msgstr "ṣẹ̀dá ẹgbẹ́ tuntun" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.default-team-name" +msgstr "pẹ́ńpọtì rẹ" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.delete-team" +msgstr "pa ẹgbẹ́ rẹ́" + +msgid "dashboard.download-binary-file" +msgstr "sọ fáìlí pẹ́ńpọtì kalẹ̀ (.penpot)" + +msgid "dashboard.download-standard-file" +msgstr "sọ fáìlì ìpéwọ̀n kalẹ̀ (.svg + .json)" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate" +msgstr "ṣe ẹ̀dà" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate-multi" +msgstr "ṣe ẹ̀dà %s fáìlì" + +#: src/app/main/ui/dashboard/grid.cljs +#, markdown +msgid "dashboard.empty-placeholder-drafts" +msgstr "" +"\"\" fáìlí tí a dàpọ̀ mọ yàrá ìkàwé á hàn níbí yìí. gbìyànjú láti má a pín " +"àwon fáìlì rẹ̀ tàbí ṣàfikún láti ibi [yàrá ìkàwé wa àti àwòṣe " +"](https://penpot.app/libraries-templates.html)." + +msgid "dashboard.export-binary-multi" +msgstr "sọ àwọn fáìlì pẹ́ẹ́pọtì kalẹ́ %s (.pẹ́ńpọtì)" + +msgid "dashboard.export-frames" +msgstr "fi bọọdù ráńṣẹ bí i PDF" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-frames.title" +msgstr "fi ráńṣẹ́ bí i PDF" + +msgid "dashboard.export-multi" +msgstr "fi pẹ́ńpọtì ráńṣẹ́%s files" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-multiple.selected" +msgstr "% ti %s ẹ́límẹ́ǹti tí a yàn" + +#: src/app/main/ui/workspace/header.cljs +msgid "dashboard.export-shapes" +msgstr "fi ráńṣẹ" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to" +msgstr "" +"o lé ṣe àfikún ti ètò ìfiráńṣẹ si ẹ́límẹ́ǹtì láti bi àmì ohun ìní ( níbi " +"ìsàlẹ̀ báà lẹ́gbẹ̀ẹ́ ọ̀tun )." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to-link" +msgstr "àlàyé bí a ti ṣètò ìfiráńṣẹ sí pẹ́ńpọtì ." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.no-elements" +msgstr "kòsí àwọn ẹ́límẹ́ǹtì pẹ̀lú ètò ìfirańńṣẹ." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.title" +msgstr "àṣàyàn ìfiránṣẹ́" + +msgid "dashboard.export-standard-multi" +msgstr "danlóòdù %s àwọn ojúlówó fáìli (.svg + .json)" + +msgid "dashboard.export.detail" +msgstr "* ó le ní àwọn ẹ̀yà ara, àwòrán àti àwon àwọ̀ àti / tàbí àtẹ̀jáde." + +msgid "dashboard.export.options.all.message" +msgstr "" +"àwọn fáìli tí ó wà nínú yàrá ìkàwé pípín á dàpọ̀ mọ́ ti ìfiráńṣẹ́, fún " +"síṣetọ́jútheir linkage ìsopọ̀ wọn." + +msgid "dashboard.export.options.all.title" +msgstr "ṣe ìfiráńṣẹ́ yàrá ìkàwé pípín" + +msgid "dashboard.export.options.detach.message" +msgstr "" +"Shared libraries will not be included in the export and no assets will be " +"yàrá ìkàwé pípín kò ní sí nínú ti ìfiráńṣẹ́ àti pé kò ni ohun ìní kan tí " +"a ó fi kún yàrá ìkàwé. " + +msgid "dashboard.export.options.detach.title" +msgstr "ṣe ìtọ́jú ohun ìní iyàrá ìkàwé pípín bí i nǹkan tó jẹ́ kókó" + +msgid "dashboard.export.options.merge.message" +msgstr "" +"á fi fáìlì rẹ ráńṣẹ́ pẹ̀lú gbogbo àwọn ohun ìní tó wà láyìíka ni a ó papọ̀ " +"sínú fáìlì yàrá ìkàwé." + +msgid "dashboard.export.options.merge.title" +msgstr "da ohun ìní yàrá ìkàwé pípín pọ̀ mọ́ fáìlì yàrá ìkàwé" + +msgid "dashboard.export.title" +msgstr "fi àwọn fáìlì ráńṣẹ" + +msgid "dashboard.fonts.deleted-placeholder" +msgstr "fọ́ǹtì tó sọnù" + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.dismiss-all" +msgstr "yọ gbogbo wọn kúrò" + +msgid "dashboard.fonts.empty-placeholder" +msgstr "àwọn fọ́ǹtì tí o ọpulóòdù yó hàn níbí." + +#, markdown +msgid "dashboard.fonts.hero-text1" +msgstr "" +"èyíkéyìí wẹ́bù fọ́ǹtì tí o bá ti ọpulóòdù níbí ni á di àkópọ̀ mọ́ ẹbí fọ́ǹ" +"tì àwọn ọ̀rọ̀ ohun ìní tí o wà nínú àwọn fáìlì ẹgbẹ́. Fọ́ǹtì pẹ̀lú u " +"orúkọ ẹbi fọ́ǹtì kanna la ó dàpọ̀ mọ́ ẹgbẹ́ bí i**ẹbí fọ́ǹtì kan soso**. O " +"lè ọpulóòdù fọ́ǹtì pẹ̀lú àwọn ìlànà wọ̀nyí: **TTF, OTF and WOFF** (ẹyọ kan " +"péré la ó nílò)." + +#, markdown +msgid "dashboard.fonts.hero-text2" +msgstr "" +"àwọn fọ́ǹtì tí ó bá jẹ́ tì ẹ nìkan ni o lè ọpulóòdù tàbí èyí tí o ní ìwé " +"àṣẹ láti lò ní pẹ́ńpọtì. Wá a sí i nínú kọ́ńtẹ́tì abala apá ọ̀tún àwọn " +"òfin pẹ́ńpọtìiṣẹ́](https://pẹ́ńpọtì.apù/àwọn òfin.html). o sì le fẹ́ kà " +"nípa[ ìwé àṣẹ- pẹ́ńpọtì](https://www.taipogíráfì.com/faq)." + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.upload-all" +msgstr "ọpulóòdù gbogbo rẹ̀" + +#, markdown +msgid "dashboard.fonts.warning-text" +msgstr "" +"a ti ṣàwárí àwọn ohun tí ó le fa wàhálà nínú àwọn fọ́ǹtì ìlànà olóòro " +"oríṣiríṣi àwọn ètò tó wà fún ìṣesí ọ̀nà ẹ̀rọ. láti ṣe àyẹ̀wò rẹ̀ o lè " +"lofont vertical metrics services like ìlànà fọ́ǹtì olóòró fún àwọn iṣẹ́ ọ̀" +"nà ẹ̀rọ bí i [èyí èkínní](https://mẹ́tíríkì ìlànà olóòró.netlify .app/). Ní " +"àfikún, a rẹkọmẹ́ǹdì lílo[tíráńsìfọtà(https://tíráńsìfọtà.org/) láti " +"pilẹ̀ṣẹ̀ àwọn wẹ́bù fọ́ǹtì láti túnṣeàsìṣe. " + +msgid "dashboard.import.import-warning" +msgstr "àwọn fáìlì tí ó ní nǹkan tí kò fẹsẹ múlẹ̀ ti di yíyọ kúro." + +msgid "dashboard.import.progress.process-colors" +msgstr "síṣe ètò àwọ̀" + +msgid "dashboard.import.progress.process-components" +msgstr "síṣe ètò àwọn irin iṣẹ́" + +msgid "dashboard.import.progress.process-media" +msgstr "síṣe ètò àwọn ohun ìgbéròyìn jáde" + +msgid "dashboard.import.progress.process-page" +msgstr "síṣe ètò ojú ìwe : %s" + +msgid "dashboard.import.progress.process-typographies" +msgstr "síṣe ètò àkọsílẹ̀ ojú ìwé" + +msgid "dashboard.import.progress.upload-data" +msgstr "ọpulóòdù dátà sínú sáfà (%s/%s)" + +msgid "dashboard.import.progress.upload-media" +msgstr "ọpulóòdù fáìlì: %s" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.invite-profile" +msgstr "pe àwọn ènìyàn" + +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.leave-team" +msgstr "fẹgbẹ́ sílẹ̀" + +msgid "dashboard.libraries-and-templates" +msgstr "yàrá ìkàwé àti àwọn àwòṣe" + +msgid "dashboard.libraries-and-templates.explore" +msgstr "ṣe ìwákiri ọ̀pọ̀ wọn kí o sì mọ bí ó ṣe sojúṣe tiẹ" + +msgid "dashboard.libraries-and-templates.import-error" +msgstr "wàhálà wà fún gbígbé tẹ́ńpílétì wọlé. tẹ́ńpílétì kò wọlé." + +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.loading-files" +msgstr "ṣe ìkójọpọ̀ àwọn fáìlí rẹ …" + +msgid "dashboard.loading-fonts" +msgstr "ṣèkójọpọ̀ àwọ fọ́ǹtì rẹ …" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to" +msgstr "gbé lọ" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-multi" +msgstr "gbé %s àwọn fáìlì lọ" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to-other-team" +msgstr "gbé lọ sí ẹgbẹ́ mìíràn" + +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/files.cljs +msgid "dashboard.new-file" +msgstr "+ fáìlì tuntun" + +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-file-prefix" +msgstr "fáìlì tuntun" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.new-project" +msgstr "+ iṣẹ́ àgbéṣe tuntun" + +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-project-prefix" +msgstr "iṣẹ́ àgbéṣe tuntun" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.no-matches-for" +msgstr "kò sí èyí tó báramu fún un“%s“" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.no-projects-placeholder" +msgstr "àwon iṣẹ́ àgbéṣe tí a kànpọ á hàn níbí" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-changed-successfully" +msgstr "a ti mú ímeèlì rẹ dójú ìwọn dáadáa" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-verified-successfully" +msgstr "a ti ṣe ìwádìí ímeèlì rẹ dáadáa" + +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.notifications.password-saved" +msgstr "a ti fi ọ̀rọ̀ ìgbaniwọlé rẹ pamọ́ dáadáa!" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.num-of-members" +msgstr "%s àwọn ọmọ ẹgbẹ́" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.open-in-new-tab" +msgstr "ṣí fáìlì sínú tábù tuntun" + +msgid "dashboard.options" +msgstr "àwọn àṣàyàn" + +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.password-change" +msgstr "yí ọ̀rọ̀ ìgbaniwọlé padà" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.pin-unpin" +msgstr "pínì/yọ pínì kúrò" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.projects-title" +msgstr "àwọn iṣẹ́ àgbéṣe" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.remove-account" +msgstr "o fẹ́ yọ àkáǹtì rẹ kúro?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.remove-shared" +msgstr "yọ ọ́ kúrò gẹ́gẹ́ bí yàrá kàwé pípín" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.save-settings" +msgstr "fi àwọn eto pamọ́" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.search-placeholder" +msgstr "ṣàwárí…" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.searching-for" +msgstr "ṣàwárí fún “%s“…" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-language" +msgstr "yan èdè ui" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-theme" +msgstr "yan àkọlé" + +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.show-all-files" +msgstr "fi gbogbo àwn fáìlì hàn" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-delete-project" +msgstr "iṣẹ́ àgbéṣe rẹ ti parẹ́ dáadáa" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-move-project" +msgstr "a ti gbé iṣẹ́ àgbéṣe rẹ kúrò dáadáa" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-info" +msgstr "àlàyé ẹgbẹ́" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-members" +msgstr "àwọn ọmọ ẹgbẹ́" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-projects" +msgstr "iṣẹ́ àgbéṣe ọmọ ẹgbẹ́" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.theme-change" +msgstr "àkọlé ui" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.title-search" +msgstr "ṣàwárí àwọn èsì" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.type-something" +msgstr "tẹ̀ láti rí àwọn èsì" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.unpublish-shared" +msgstr "yàrá ìkàwé tí a kòtí ì gbé jáde" + +#: src/app/main/ui/settings/password.cljs, src/app/main/ui/settings/options.cljs +msgid "dashboard.update-settings" +msgstr "mú àwọn ètò dójú ìwọ̀n" + +msgid "dashboard.webhooks.active" +msgstr "ti ń siṣẹ́" + +msgid "dashboard.webhooks.active.explain" +msgstr "When this hook is triggered event details will be delivered" + +msgid "dashboard.webhooks.content-type" +msgstr "ẹ̀yà kọ́ńtẹ́ǹtì" + +msgid "dashboard.webhooks.create" +msgstr "ṣẹ̀dá ìkọ́-wẹ́bù" + +msgid "dashboard.webhooks.create.success" +msgstr "a ti ṣẹ̀dá ìkọ́-wẹ́bù dáadáa ." + +msgid "dashboard.webhooks.description" +msgstr "" +"àwọn ìkọ́-wẹ́bù jẹ́ ọ̀nà tó rọrùn láti fi ààyè sílẹ̀ fún àwọn ààyè ayélujára " +"mìíràn àti awọn ápù ṣe filọ́ tí àwọn ìṣẹ̀lẹ̀ kan bá ní pẹ́ńpọtì’’ a ó fi " +"ìbéèrè ráńṣẹ́ sí ọ̀kọ̀kan wọn tí urls tó o pèsè." + +msgid "dashboard.webhooks.empty.add-one" +msgstr "tẹ bọ́tínnì \"fikún ìkọ́- wẹ́bù\" láti fì kan sí i." + +msgid "dashboard.webhooks.empty.no-webhooks" +msgstr "kò sí ìkọ́-wẹ́bù tí a ṣẹ̀da´dì sisìnyí." + +#: src/app/main/ui/settings.cljs +msgid "dashboard.your-account-title" +msgstr "àkáǹtì rẹ" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-email" +msgstr "ímeèlì" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-name" +msgstr "ímeèlì rẹ" + +#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.your-penpot" +msgstr "pẹ́ńpọtì rẹ" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-ok" +msgstr "ó dára" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-title" +msgstr "àkíyèsí" + +#: src/app/main/ui/confirm.cljs +msgid "ds.component-subtitle" +msgstr "ní láti ṣe ìmúdójú ìwọ̀n àwọn irin iṣẹ́:" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-cancel" +msgstr "fagilé e" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-ok" +msgstr "ó dára" + +#: src/app/main/ui/auth/login.cljs +msgid "errors.auth-provider-not-configured" +msgstr "a kò tí ì fàṣẹ si àtúntò olùpèṣè." + +msgid "errors.auth.unable-to-login" +msgstr "ó dàbí pé o kò tí ì fàṣẹ sí i tàbí àkókò ti kọjá ." + +msgid "errors.bad-font" +msgstr "fọ́ǹtì %s kò ṣe kójọpọ̀" + +msgid "errors.bad-font-plural" +msgstr "àwọn fọ́ǹtì %s kò ṣe kójọpọ̀" + +msgid "errors.cannot-upload" +msgstr "kò le ọpulóòdù fáìlì ìgbéròyìn-jáde." + +#: src/app/main/data/workspace.cljs +msgid "errors.clipboard-not-implemented" +msgstr "a ṣàwákiri rẹ kò le ṣe iṣẹ́ yìí" + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs +msgid "errors.email-already-exists" +msgstr "ímeèlì yìí ti jẹ́ lílò tẹ́lẹ" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.email-already-validated" +msgstr "a ti fọwọ́ sí ímeèlì rẹ tẹ́lẹ̀." + +msgid "errors.email-as-password" +msgstr "o kò le lo ímeèlì rẹ gẹ́gẹ́ bí ọ̀rọ̀ ìgbaniwọlé" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.email-has-permanent-bounces" +msgstr "Ímeèlì «%s» ti ní ìjábọ̀ ọ̀pọ̀ọlọpọ̀ ìta-bọn-ọ̀n ti pẹ́." + +#: src/app/main/ui/settings/change_email.cljs +msgid "errors.email-invalid-confirmation" +msgstr "Ímeèlì tí a ti mọ̀dájú gbọ́dọ̀ báramu" + +msgid "errors.email-spam-or-permanent-bounces" +msgstr "" +"Ímeèlì ti «%s» ń jábọ̀ gẹ́gẹ́ bí i awúrúju tàbí ìta-bọ̀n-ọnọǹ tipẹ́." + +#: src/app/main/errors.cljs +msgid "errors.feature-not-supported" +msgstr "Àwọn ẹ̀yà ara ẹ̀rọ '%s' kò ní àtìlẹ́yìn." + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.generic" +msgstr "Àsìṣe kan ti ṣẹlẹ̀." + +#: src/app/main/ui/components/color_input.cljs +msgid "errors.invalid-color" +msgstr "àwọ̀ tó ti díbàjẹ́" + +msgid "errors.invite-invalid.info" +msgstr "Èyí tí a pè le parẹ́ tàbí ki àkókò lekọjá ." + +#: src/app/main/ui/auth/login.cljs +msgid "errors.ldap-disabled" +msgstr "Ìfàṣẹsí LDAP kò ṣe é ṣe ." + +#: src/app/main/errors.cljs +msgid "errors.max-quote-reached" +msgstr "O ti débi '%s' ìfàmìsí. Késí i pẹ̀lú àtìlẹ́yìn ." + +#: src/app/main/data/workspace/persistence.cljs +msgid "errors.media-too-large" +msgstr "Àwòrán tóbi púpọ ju ohun tí a le fisí lọ." + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "errors.media-type-not-allowed" +msgstr "Ó dàbí pé èyí kì í ṣe àwòrán tó fẹsẹ́ múlẹ̀." + +#: src/app/main/ui/dashboard/team.cljs +msgid "errors.member-is-muted" +msgstr "" +"Pírófáìlì ímeèlì tí ò ǹ pè ti dákẹ (ti jábọ̀ àwúrúju tàbí ìtabọ̀n-ọ̀n tó " +"ga)." + +#: src/app/main/ui/settings/password.cljs +msgid "errors.password-invalid-confirmation" +msgstr "Ijẹ́rìísí ọ̀rọ̀ ìgbaniwọlé rẹ gbọ́dọ̀ báramu" + +#: src/app/main/ui/settings/password.cljs +msgid "errors.password-too-short" +msgstr "Ọ̀rọ̀ ìgbaniwọlé kò gbọdọ̀ dín ní lẹ́tà mẹ́jọ" + +msgid "errors.team-leave.insufficient-members" +msgstr "kí àwọn ọmọ ẹgbẹ́ tí kò péye fi ẹgbẹ́ sílẹ̀, àbí bóyá o fẹ́ paárẹ́ ni ." + +msgid "errors.team-leave.member-does-not-exists" +msgstr "Kòsí ọmọ ẹgbẹ́ tí o fẹ́ yàn ." + +msgid "errors.profile-blocked" +msgstr "Ti dínà mọ́ pírófáìlì" + +#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.profile-is-muted" +msgstr "" +"Ímeèlì pírófáìlì rẹ ti ní ìdákẹ́ (ìjábọ̀ àwúrúju tàbí ìtabọ̀n-ọ̀n tó ga)." + +#: src/app/main/ui/auth/register.cljs +msgid "errors.registration-disabled" +msgstr "Ìforúkọ-sílẹ̀ kò ṣe é ṣe lọ́wọ́lọ́wọ́." + +msgid "errors.team-leave.owner-cant-leave" +msgstr "" +"Oní nǹkan kò le fi ẹgbẹ́ sílẹ̀ , o gbọ́dọ̀ tún ṣe àtúnyàn iṣẹ́ oní nǹkan." + +#: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "errors.unexpected-error" +msgstr "Àsìṣe tí a kòrò tẹ́lẹ̀ ti ṣẹlẹ." + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.unexpected-token" +msgstr "Tókìnnì àìmọ̀" + +msgid "errors.webhooks.connection" +msgstr "Àsìṣe nínú ètò ìsopọ̀, kò lè dé ibi URL" + +msgid "errors.webhooks.invalid-uri" +msgstr "URL kò páásì ìfọwọ́sí." + +msgid "errors.webhooks.last-delivery" +msgstr "Èyí tí a fijíṣẹ́ kẹ́yìn kò dára." + +msgid "errors.webhooks.ssl-validation" +msgstr "Àsìṣe nínú ìfẹwọ́sí SSL ." + +msgid "errors.webhooks.unexpected" +msgstr "Unexpected error on validating àsìṣe àìròtẹ́lẹ̀ lórí ìfọwọ́sí" + +msgid "errors.webhooks.unexpected-status" +msgstr "Ipò àìròtẹ́lẹ̀ %s" + +#: src/app/main/ui/auth/login.cljs +msgid "errors.wrong-credentials" +msgstr "Ímeèlì tàbí ọ̀rọ̀ ìgbaniwọlé kò tọ̀nà." + +#: src/app/main/ui/settings/password.cljs +msgid "errors.wrong-old-password" +msgstr "Ọ̀rọ̀ ìgbaniwọlé ti àtijọ́ kò tọ̀nà" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.description" +msgstr "Àpèjúwe" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-go-to" +msgstr "Lọ ibi àpérò pẹ́ńpọtì" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-subtitle1" +msgstr "" +"Inú wa dùn láti rí ẹ níbí. Tí o bá nílò ìrànlọ́wọ, please search before you " +"jọ̀wọ́ ṣàwárí kí o tó firáńṣẹ́." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.title" +msgstr "Ímeèlì" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-title" +msgstr "Agbègbè pẹ́ńpọtì" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subject" +msgstr "Kókó-ọ̀rọ̀" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subtitle" +msgstr "" +"Jọ̀wọ́ ṣàpèjúwe ìdí tó wà fún ímeèlì rẹ, ṣàfihàn tì àríyànjiyàn bá wà, le jẹ́" +" èrò tàbí síṣe iyèméjì. Ìkan lára àwọn ọmọ ẹgbẹ́ wa yóò dáhùn láìpẹ́ " +"láìjìnnà." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-go-to" +msgstr "Lọ sí Tíwítà" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-subtitle1" +msgstr "A wà níbí láti ṣe ìrànlọ́wọ́ fún àwọn ìbéèrè tó bá wà lórí iṣẹ́ ọnà." + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-title" +msgstr "Àkáùnti àtìlẹ́yìn fún Tíwítà" + +#: src/app/main/ui/settings/password.cljs +msgid "generic.error" +msgstr "Àsìṣe kan ti ṣẹlẹ̀" + +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur" +msgstr "ìkùku ti wà" + +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur.value" +msgstr "bó se péye" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hex" +msgstr "dínà mọ́" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hsla" +msgstr "Ti dínà mọ" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.rgba" +msgstr "RGBA" + +#: src/app/main/ui/inspect/attributes/fill.cljs +msgid "inspect.attributes.fill" +msgstr "Fílì" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.download" +msgstr "Danlóòdù orísun àwòrán" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.height" +msgstr "Gíga" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.width" +msgstr "Fífẹ" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout" +msgstr "Layout" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.height" +msgstr "Gíga" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.left" +msgstr "Òsì" + +#: src/app/main/ui/inspect/attributes/layout.cljs, src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.radius" +msgstr "Rédíọ́sì" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.rotation" +msgstr "Yíyí" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.top" +msgstr "Òkè" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.width" +msgstr "Fífẹ̀" + +#: src/app/main/ui/inspect/attributes/shadow.cljs +msgid "inspect.attributes.shadow" +msgstr "Ibòòji" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.size" +msgstr "Ìwọ̀n àti ipò" + +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke" +msgstr "Stroke Sítírókì" + +#, permanent +msgid "inspect.attributes.stroke.alignment.center" +msgstr "Ààrin" + +#, permanent +msgid "inspect.attributes.stroke.alignment.inner" +msgstr "Nínú" + +#, permanent +msgid "inspect.attributes.stroke.alignment.outer" +msgstr "Ìtá" + +msgid "inspect.attributes.stroke.style.dotted" +msgstr "ti sàmì" + +msgid "inspect.attributes.stroke.style.mixed" +msgstr "Àdàlú" + +msgid "inspect.attributes.stroke.style.none" +msgstr "Kò sí" + +msgid "inspect.attributes.stroke.style.solid" +msgstr "Lágbára" + +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke.width" +msgstr "Fífẹ̀" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography" +msgstr "Taipogíráfì" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-family" +msgstr "Ẹbí Fọ́ǹtì" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-size" +msgstr "Ìwọ̀n Fọ́ǹtì" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-style" +msgstr "Àrà Fọ́ǹtì" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-weight" +msgstr "Ìwúwo Fọ́ǹtì" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.letter-spacing" +msgstr "Ìfàyè sí ààrin Lẹ́tà" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.line-height" +msgstr "Gíga Ìlà" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-decoration" +msgstr "Síṣe ọ̀rọ̀ lọ́ṣọ̀ọ́" + +msgid "inspect.attributes.typography.text-decoration.none" +msgstr "Kò sí" + +msgid "inspect.attributes.typography.text-decoration.strikethrough" +msgstr "Strikethrough" + +msgid "inspect.attributes.typography.text-decoration.underline" +msgstr "Fàlà sí" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-transform" +msgstr "ọ̀rọ̀ ti yí padà" + +msgid "inspect.attributes.typography.text-transform.lowercase" +msgstr "Lẹ́tà Kékeré" + +msgid "inspect.attributes.typography.text-transform.none" +msgstr "Kò sí" + +msgid "inspect.attributes.typography.text-transform.titlecase" +msgstr "Àkọlé Lẹ́tà" + +msgid "inspect.attributes.typography.text-transform.uppercase" +msgstr "Lẹ́tà ńlá" + +msgid "inspect.empty.help" +msgstr "" +"Tí o bá fẹ́ mọ̀ nípa àpẹẹrẹ alárà bẹ ààrin gbùngbùn àwọn pẹ́ńpọtì wò fún " +"ìràlọ́wọ́" + +msgid "inspect.empty.more-info" +msgstr "Àfikún àlàyé fún ìbẹ̀wò" + +msgid "inspect.empty.select" +msgstr "Yan ìrísí, bọ́ọ̀dù tàbí ẹgbẹ́ láti lọ ṣe ìbẹ̀wò ohun ìní wọn àti kóòdù" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code" +msgstr "Kóòdù" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code.selected.multiple" +msgstr "%s Ti yàn" + +msgid "inspect.tabs.code.selected.path" +msgstr "Ipa-ọ̀nà" + +msgid "inspect.tabs.code.selected.rect" +msgstr "Rectangle" + +msgid "inspect.tabs.code.selected.svg-raw" +msgstr "SVG" + +msgid "inspect.tabs.code.selected.text" +msgstr "Ọ̀rọ̀" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.info" +msgstr "Àlàyé" + +#: src/app/main/ui/workspace/header.cljs +msgid "label.shortcuts" +msgstr "Ọ̀nà àbùjá" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "Ṣàyẹ̀wò tókín-nì" + +msgid "labels.active" +msgstr "Ń siṣẹ́" + +msgid "labels.add-custom-font" +msgstr "Ṣàfikún àṣà Fọ́ǹtì" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.admin" +msgstr "Alábòjútó" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.all" +msgstr "Gbogbo ẹ̀" + +msgid "labels.back" +msgstr "Padá" + +#: src/app/main/ui/static.cljs +msgid "labels.bad-gateway.desc-message" +msgstr "" +"Ó dàbí ẹnipé o ní láti dúró díẹ̀ kí o tún gbìyàjú ; à ń siṣẹ́ díẹ̀ síṣe " +"ìtọ́jú sáfà wa." + +#: src/app/main/ui/static.cljs +msgid "labels.bad-gateway.main-message" +msgstr "Ọ̀nà-àbáwọle búburú" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.cancel" +msgstr "Párẹ́" + +msgid "labels.font-family" +msgstr "Ẹbí fọ́ǹtì" + +msgid "labels.close" +msgstr "Tì í" + +#: src/app/main/ui/dashboard/comments.cljs +msgid "labels.comments" +msgstr "dásí i" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.community" +msgstr "Agbègbè" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.confirm-password" +msgstr "Jẹ́rìísí" + +msgid "labels.continue" +msgstr "Tẹ̀ síwájú" + +msgid "labels.continue-with" +msgstr "Tẹ̀ síwájú pẹ̀lú" + +msgid "labels.continue-with-penpot" +msgstr "O lè tẹ̀ síwájú pẹ̀lú àkáúnti pẹ́ńpọtì" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.copy-invitation-link" +msgstr "ṣà dàkọ ọ̀nà àsopọ̀" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "labels.create" +msgstr "Ṣẹ̀dá" + +#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team" +msgstr "Ṣẹ̀dá ẹgbẹ́ tuntun" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team.placeholder" +msgstr "Fi orúkọ ẹgbẹ́ tuntun wọlé" + +msgid "labels.custom-fonts" +msgstr "Kọ́sítọ́mù àwọn fọ́ǹtì" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.dashboard" +msgstr "Dáṣìbọọ̀dù" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete" +msgstr "Paárẹ́" + +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment" +msgstr "Pa kọ́mẹ́ǹtì rẹ́" + +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment-thread" +msgstr "Pa gbogbo kọ́mẹ́ǹtì rẹ́" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.delete-invitation" +msgstr "Pa ìfìwépè rẹ́" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.delete-multi-files" +msgstr "Pa gbogbo %s fáìlì rẹ́" + +msgid "labels.discard" +msgstr "Yọ́ kúrò" + +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.drafts" +msgstr "Kọ ọ́ sílẹ̀" + +#: src/app/main/ui/comments.cljs +msgid "labels.edit" +msgstr "sàtúnkà" + +msgid "labels.edit-file" +msgstr "sàtúnkà fáìlì" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.editor" +msgstr "Olóòtú" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.expired-invitation" +msgstr "Kọjá àkókò" + +msgid "labels.export" +msgstr "Fi ránṣẹ́" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-disabled" +msgstr "Èsì kò siṣẹ́" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.feedback-sent" +msgstr "Èsì ti lọ" + +msgid "labels.font-providers" +msgstr "Àwọn Olùpèṣè fọ́ǹtì" + +msgid "labels.font-variants" +msgstr "Àrà" + +msgid "labels.fonts" +msgstr "Fọ̀ǹtì" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.github-repo" +msgstr "Báǹkì gítì-ọbù" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.give-feedback" +msgstr "Fèsì padà" + +msgid "labels.go-back" +msgstr "Padà sẹ́yìn" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.help-center" +msgstr "Ibi ìranilọ́wọ́" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.hide-resolved-comments" +msgstr "Fi àwọn ọ̀rọ̀ tí a ti yanjú pamọ́" + +msgid "labels.inactive" +msgstr "kò ja fáfá" + +msgid "labels.installed-fonts" +msgstr "Fi àwọn fọ́ǹtì sí orí ẹ̀rọ" + +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.desc-message" +msgstr "" +"Nǹkan bíburú ti ṣẹlè. Jọ̀wọ́ ṣe àtúnṣe iṣẹ́ náà àti pé tí wàhálà bá sì tẹ̀ " +"síwájú, ké sí olùbásọ̀rọ̀." + +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.main-message" +msgstr "Àsìṣe ti abẹ́nú" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.invitations" +msgstr "Ìfiwépè" + +#: src/app/main/ui/settings/options.cljs +msgid "labels.language" +msgstr "Èdè" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.libraries-and-templates" +msgstr "Àwọn yàrá ìkàwé & Tẹ́ńpílétì" + +msgid "labels.log-or-sign" +msgstr "ṣí kí o wọle tàbí kí o ṣàmì wọlé" + +#: src/app/main/ui/settings.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.logout" +msgstr "Padé kí ojáde" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.member" +msgstr "Ẹgbẹ" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.members" +msgstr "Àwọn ọmọ Ẹgbẹ́" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.new-password" +msgstr "Ọ̀rọ̀ Ìgbaniwọlé tuntun" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs +msgid "labels.no-comments-available" +msgstr "A ti gbé gbogbo yín dè! Àwọn ọ̀rọ̀ ìfitónilétí tuntun yí ó hàn níbí." + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.no-invitations" +msgstr "kò si àwọn ìfìwépè kankan nílẹ̀." + +#: src/app/main/ui/dashboard/team.cljs +#, markdown +msgid "labels.no-invitations-hint" +msgstr "Tẹ̀ ẹ́ **Pe àwọn ènìyàn** tẹ bọ́tìnnì láti pe àwọn ènìyàn sínú ẹgbẹ́." + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.desc-message" +msgstr "Ojú ìwé yìí le má sìí tàbí ò kò ni ìgbaniláàyè láti wọlé sí bẹ̀ ." + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.main-message" +msgstr "Óóho!" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.old-password" +msgstr "Ọ̀rọ̀ ìgbaniwọlé àtijọ́" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.only-yours" +msgstr "Tìrẹ nìkan" + +msgid "labels.or" +msgstr "tàbí" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.owner" +msgstr "Oníǹkan" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.projects" +msgstr "Àwọn iṣẹ́ àgbéṣe" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.password" +msgstr "Ọ̀rọ̀ ìgbaniwọlé" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.release-notes" +msgstr "Fi àkọsílẹ̀ rẹ sílẹ̀" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.pending-invitation" +msgstr "Ńńdúró" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.profile" +msgstr "Pírófáìlì" + +#: src/app/main/ui/workspace.cljs +msgid "labels.reload-file" +msgstr "Tún gbé fáìlì sí i" + +#: src/app/main/ui/workspace/libraries.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.remove" +msgstr "Yọ ọ́ kúrò" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.remove-member" +msgstr "Yọ ọmọ ẹgbẹ́ kúrò" + +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.rename" +msgstr "Fún un lórúkọ mìíràn" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.rename-team" +msgstr "Fún ẹgbẹ́ lórúkọ mìíràn" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.resend-invitation" +msgstr "Tún fì ìwé ìpè ránńṣẹ́" + +#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs +msgid "labels.retry" +msgstr "Tún gbìyànjú" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.role" +msgstr "Ojúṣe" + +msgid "labels.save" +msgstr "Fi pamọ́" + +msgid "labels.search-font" +msgstr "Ṣàwárí fọ́ǹtì" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.send" +msgstr "Fi ránńṣẹ́" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.sending" +msgstr "Fífi-ránńṣẹ…" + +#: src/app/main/ui/static.cljs +msgid "labels.service-unavailable.desc-message" +msgstr "A wà níbi ètò ìpèsè ìtọ́jú àwọn sísítẹ́mù wa." + +#: src/app/main/ui/static.cljs +msgid "labels.service-unavailable.main-message" +msgstr "Sáfísì kòsí" + +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.settings" +msgstr "Àwọn ètò" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-your-comments" +msgstr "Fi àwọn kọ́mẹ́ǹtì tìrẹ nìkan hàn" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.status" +msgstr "Ipò" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.tutorials" +msgstr "Ìbáṣepọ̀" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.unpublish-multi-files" +msgstr "%s àwọn fáìlì tí a kò tí kọ jáde" + +#: src/app/main/ui/settings/profile.cljs +msgid "labels.update" +msgstr "mú dójú ìwọ̀n" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.update-team" +msgstr "Mẹ́gbẹ́ dójú ìwọ̀n" + +msgid "labels.upload" +msgstr "Ọpulóòdù" + +msgid "labels.upload-custom-fonts" +msgstr "Ọpulóòdù kọ́sítẹ́mù fọ́ǹtì" + +msgid "labels.uploading" +msgstr "Ń ọpulóòdù…" + +msgid "labels.view-only" +msgstr "Wò ó nìkan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.viewer" +msgstr "Olùwo" + +msgid "labels.webhooks" +msgstr "àwọn ìwé ìkọ́ wẹ́bù" + +#: src/app/main/ui/comments.cljs +msgid "labels.write-new-comment" +msgstr "Write new comment Kọ kọ́mẹ́ǹtì tuntun" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.you" +msgstr "(ìwọ)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.your-account" +msgstr "Àkáùntì rẹ" + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "media.loading" +msgstr "Ìkójọpọ̀ àwòrán…" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Yàrá ìkàwé rẹ ti dófìfo. Lọ́gán tí o bá ti ṣàfikún gẹ́gẹ́ bí yàrá ìkàwé " +"pípín, dúkìá tí o ṣẹ̀dá á wà fún lílò àwọn fáìlì rẹ tó kù. Are you sure " +"you tí o fẹ́ kọ jáde?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.accept" +msgstr "Ṣàfikún gẹ́gẹ́ bí yàrá ìkàwé pípín" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.hint" +msgstr "" +"Lẹ́ẹ̀kan-nà tí o bá ti ṣàfikún gẹ́gẹ́ bí yàrá ìkàwé pípín, àwọn dúkìá inú " +"fáìlì yàrá á di wíwà fún lílò àwọn fáìlì rẹ tó kù." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.message" +msgstr "Ṣàfikún “%s” gẹ́gẹ́ bí yàrá ìkàwé pípí" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.big-nudge" +msgstr "Big nudge Nọ́ọ̀jì ńlá" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.confirm-email" +msgstr "Ṣàyẹ̀wò ímeèlì tuntun" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.info" +msgstr "" +"A fi ímeèlì kan ránń ṣẹ́ sí inú ímeèlì tí ò ń lò lọ́wọ́lọ́wọ́“%s” láti ṣe " +"àyẹ̀wò ìdánimọ̀ rẹ." + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.new-email" +msgstr "Ímeèlì tuntun" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.submit" +msgstr "Pàrọ̀ ímeèlìl" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.title" +msgstr "Pàrọ̀ ímeèlì rẹ" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.copy-token" +msgstr "Ṣẹ̀dà tókìn" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.expiration-date.label" +msgstr "Ọjọ́ ìparí" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "Orúkọ" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.placeholder" +msgstr "Orúkọ yí ó ràn wá lọ́wọ́ láti mọ ohun tí tókìn wà fún" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "Ṣẹ̀dà tókìn" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "Pilẹ̀ṣẹ̀ wí wọlé tókìń" + +msgid "modals.create-webhook.submit-label" +msgstr "Ṣẹ̀dá ìkọ́- wẹ́bù" + +msgid "modals.create-webhook.title" +msgstr "Ṣẹ̀dá ìkọ́-wẹ́bù" + +msgid "modals.create-webhook.url.label" +msgstr "Péloòdù URL" + +msgid "modals.create-webhook.url.placeholder" +msgstr "https://àpẹrẹ.com/postreceive ìgbà àtẹ̀yinwá" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "Pa tókìn rẹ́" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa tókìn yi rẹ́?" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "Pa tókìn rẹ́" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.cancel" +msgstr "Fagilé e kí o sì fi àkáùntì mi pamọ́" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.confirm" +msgstr "Bẹ́ẹ̀ni, pa àkáùntì mi rẹ́" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.info" +msgstr "" +"Nípa yíyọ àkáùntì rẹ kúrò o ’ pàdánù gbogbo àwọn iṣẹ́ àgbéṣe rẹ àti àwọn tí " +"ó wà lápamọ́." + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.title" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa àkáùntì rẹ rẹ́ ?" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.accept" +msgstr "Pa ìtàkurọ̀sọ rẹ́" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.message" +msgstr "" +"Ṣé ódá ọ lójú pé o fẹ́ pa ìtàkurọ̀sọ yìí rẹ́? All comments in this Gbogbo " +"àsọyé tó wà níbí tó tẹ̀lé ra wọn ni á di píparẹ́." + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.title" +msgstr "Pa ìtàkurọ̀sọ rẹ" + +msgid "modals.delete-component-annotation.message" +msgstr "Ṣe ó dá ọ lójú pé o fẹ́ pa àkọsílẹ̀ yìí rẹ́?" + +msgid "modals.delete-component-annotation.title" +msgstr "Pa àkọsílẹ̀ rẹ́" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.accept" +msgstr "Pa fáìlì rẹ́" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa fáìlì yìí rẹ́?" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.title" +msgstr "Pa fáìlì rẹ́" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.accept" +msgstr "Pa àwọn fáìlì rẹ́" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa %s àwọn fáìlì rẹ́ ?" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.title" +msgstr "Pa fáìlì rẹ́ %s" + +msgid "modals.delete-font-variant.message" +msgstr "" +"Ṣé ó dá ọ lójú pé o fẹ́ pa fọ́ǹtì alárà yìí rẹ́ ? Kò ní gbé e tí a bá lò " +"ó nínú fáìlì." + +msgid "modals.delete-font.message" +msgstr "" +"Ṣé ó dá ọ lójú pé o fẹ́ pa fẹ́ǹtì yí rẹ́? Kò ní le gbé e tí a bá lò ó nínú " +"Fáìlì." + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.body" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa ojú ìwé yìí rẹ́?" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.title" +msgstr "Pa ojú ìwé rẹ́" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.accept" +msgstr "Pa iṣẹ́ àgbéṣe rẹ́" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ pa iṣẹ́ àgbéṣe yìí rẹ́?" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.title" +msgstr "Pa iṣẹ́ àgbéṣe rẹ́" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.accept" +msgstr "Pa ẹgbẹ́ rẹ́" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.message" +msgstr "" +"Ṣé ó dá ọ lójú pé o fẹ́ pa ẹgbẹ́ yìí rẹ́? Ggogbo iṣẹ́ àgbéṣe àti fáìlì tí ó " +"bá ní nǹkan ṣe pẹ̀lú ẹgbẹ́ ni a ó parẹ́ pátápátá." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.title" +msgstr "Yọ ẹgbẹ́ kúrò" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.accept" +msgstr "Yọ ọmọ ẹgbẹ́ kúrò" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ yọ ọmọ ẹgbẹ́ yìí kúrò nínú ẹgbẹ́?" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.title" +msgstr "Yọ ọmọ ẹgbẹ́ kúrò" + +msgid "modals.delete-webhook.accept" +msgstr "Pa ìkọ́-wẹ́bù rẹ́" + +msgid "modals.delete-webhook.title" +msgstr "Pa ìkọ́- wẹ́bù rẹ́" + +msgid "modals.edit-webhook.submit-label" +msgstr "Ṣe àtúnṣe ìkọ́- wẹ́bù" + +msgid "modals.edit-webhook.title" +msgstr "Ṣe àtúnṣe ìkọ́-wẹ́bù" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-member-confirm.accept" +msgstr "Fi ìfìwépè ránńṣẹ́" + +msgid "modals.invite-member.emails" +msgstr "Ímeèlì, kí kọmá yà á sọ́tọ̀" + +msgid "modals.invite-member.repeated-invitation" +msgstr "" +"Díẹ̀ nínú àwọn ímeèlì wá láti ọ̀dọ̀ àwọn tó jẹ́ ọmọ ẹgbẹ́ ní ìsinsìnyí. Ìwé " +"ìfipé wọn a kò nífi ránńṣẹ́." + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.invite-team-member.title" +msgstr "Pe àwọn ọmọ ẹgbẹ́ sínú ẹgbẹ́" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.hint" +msgstr "" +"Gẹ́gẹ́ bí o ṣe jẹ́ ìwọ nìkan ni ọmọ ẹgbẹ́ nínú ẹgbẹ́ yìí, a ó yọ ẹgbẹ́ kúrò " +"pẹ̀lú iṣẹ́ àgbéṣe rẹ̀ àti àwọn fáìlì." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-close-confirm.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ kúrò nínú %s ẹgbẹ́?" + +msgid "modals.publish-empty-library.title" +msgstr "Gbé yàrá ìkàwé tó ṣófìfo jáde" + +msgid "modals.leave-and-reassign.forbidden" +msgstr "" +"O kò lè kúrò nínú ẹgbẹ́ tí kò bá sí ọmọ ẹgbẹ́ mìíràn tó ní ìgbéga sí oní ǹǹ" +"kan. O lè fẹ́ pa ẹgbẹ́ rẹ́." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.hint1" +msgstr "" +"Ìwọ ni ẹni tí ó ni ẹgbẹ́ yìí. Please select another member to promote to " +"Jọ̀wọ́ yan ọmọ ẹgbẹ́ mìíràn tí yíò ní ìgbéga ẹni tí ó ni nǹkan kí o tó " +"kúrò." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.promote-and-leave" +msgstr "Ṣe ìgbéga kí o kúrò" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.select-member-to-promote" +msgstr "Yan ọmọ ẹgbẹ́ kan tí o ó gbéga" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.title" +msgstr "Kí o tó kúrò" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.accept" +msgstr "Fi ẹgbẹ́ sílẹ̀" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.message" +msgstr "Ṣé ó dá ọ lójú pé o fẹ́ fi ẹgbẹ́ yìí sílẹ̀?" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.title" +msgstr "Ń fi ẹgbẹ́ sílẹ̀" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.nudge-title" +msgstr "Fi kún iye tó jẹ́" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.accept" +msgstr "Yọ ọ́ kúrò gẹ́gẹ́ bí i yàrá ìkàwé pípín" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.accept" +msgstr "Gbé ẹni tó ni nǹkan" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.hint" +msgstr "" +"Tí o bá gbé ẹni tí ó ni nǹkan, o ó yìí ojúṣe rẹ pada sí Alábòjútó, losing " +"àwọn ìgbà láàyè díẹ̀ á wà fún ẹgbẹ́ yìí. " + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.message" +msgstr "" +"Ìwọ ni ẹni tí ó ni ẹgbẹ́ yìí lọ́wọ́lọ́wọ́. Are you sure you want to make Ṣé " +"ó dá ọ lójú pé o fẹ́ jẹ́ %s oní nǹkan tuntun fún ẹgbẹ́?" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.title" +msgstr "Ẹni tó ni ẹgbẹ́ tuntun" + +msgid "modals.publish-empty-library.message" +msgstr "Yàrá ìkàwé rẹ ṣófìfo. Ṣé ó dá ọ lójú pé o fẹ́ kọ ọ́ jáde?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.hint" +msgstr "" +"Lọ́gán tí o bá ti yọ ọ́ kúrò gẹ́gẹ́ bí i Fáìlì yàrá ìkàwé pípín , Fáìlì " +"yàrà ìkàwé ti fáìlì yìí á dúró tí á wà fún lílò àwọn fáìlì rẹ tó kù." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.message" +msgstr "Yọ ọ́ kúrò“%s” gẹ́gẹ́ bí yàrá ìkàwé pípín" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.message" +msgstr "Mú àwọn ẹ̀yà irin iṣẹ́ dójú ìwọ̀n nínú iyàram ìkàwé pípín" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.accept" +msgstr "Mú dójú ìwọ̀n" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.cancel" +msgstr "Fagilé e" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.hint" +msgstr "" +"O ṣetán látí mú àwọn ẹ̀yà irin iṣẹ́ yàrá ìkàwé dójú ìwọ̀n . This may affect " +"Èyí lè fa wàhálà fún àwọn fáìlì míràn tí ó ń lò ó." + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.message" +msgstr "Mú ẹ̀yà iyàrá ìkàwé pípín kan dójú ìwọ̀n" + +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.small-nudge" +msgstr "Fọwọ́ làn-ań díẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.hint" +msgstr "" +"O ṣetán láti mú àwọn ẹ̀yà irin iṣẹ́ dé ojú ìwọ̀n ní yàrá ìkàwé pípín. Èyí " +"le fa wàhálà fún àwọn fáìlì mìíràn tí ó ń lò ó." + +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "Ẹ̀yà tuntun ti wà, jọ̀wọ́ tún sọ ọ́ jí" + +#: src/app/main/ui/dashboard/team.cljs +msgid "notifications.invitation-email-sent" +msgstr "Ìfipè tí a fi ránńṣẹ́ ti lọ dáadáa" + +#: src/app/main/ui/dashboard/team.cljs +msgid "notifications.invitation-link-copied" +msgstr "ti ṣe àdàkọ ìfipè ọ̀nà ìtọ́ka sí" + +msgid "onboarding-v2.welcome.desc2" +msgstr "" +"Ìkẹ́kọ̀ọ́ ìta gbangba, pín-in kí ẹ sì jí ròrò nípa Pẹ́ńpọtì, ibi tó wà " +"lọ́wọ́lọ́wọ́ ọ̀jọ́ iwájú pẹ̀lú gbogbo agbègbè àti ìmójútó ẹgbẹ́ pẹ́ńpọtì " +". ." + +#: src/app/main/ui/settings/delete_account.cljs +msgid "notifications.profile-deletion-not-allowed" +msgstr "" +"O kò le è yọ pírófáìlì rẹ kúro. Ṣe àtún yàn àwọn ẹgbẹ́ kí o tó tẹ̀ síwájú." + +#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs +msgid "notifications.profile-saved" +msgstr "A ti fi pírófáìlì pamọ́ dáadáa!" + +#: src/app/main/ui/settings/change_email.cljs +msgid "notifications.validation-email-sent" +msgstr "Verification email sent to %s. Check your email!" + +msgid "onboarding-v2.before-start.desc1" +msgstr "" +"O ní láti mọ̀ pé oríṣiríṣi ohu ohun èlò ló wà láti ràn ọ́ lọ́wọ́ láti rí gbà " +"bẹ̀rẹ̀ pẹ̀lú Pẹ́ńpọtì, gẹ́gẹ́ bí ohun èlò ìtọ́nisọ́nà àti yútuùbù wa fún " +"ìlànà ìbáni sọ̀rọ̀." + +msgid "onboarding-v2.before-start.desc2" +msgstr "" +"Ẹ̀kún-uń rẹ́rẹ́ àlàyé nípa bí a ó ṣe lo pẹ́ńpọtì . Láti bi àfọwọ́kọ lọ sí " +"síṣe ètò tàbí pípiń àwọn àrà orísi ." + +msgid "onboarding-v2.before-start.desc2.title" +msgstr "Ìtọ́ni sọ́nà Onílò" + +msgid "onboarding-v2.before-start.desc3" +msgstr "O lè wo ìbáṣepọ̀ wa àti ìbáṣepọ̀ ti èyí tí agbègbè wa ṣe." + +msgid "onboarding-v2.before-start.desc3.title" +msgstr "Fídíò àwọn ìbáṣepọ̀" + +msgid "onboarding-v2.before-start.title" +msgstr "Kí o tó bẹ̀rẹ̀" + +msgid "onboarding-v2.newsletter.desc" +msgstr "" +"Ṣe alábàápín ìwé ìròyìn ti pẹ́ńpọtì kí o lè mọ ohun tí ó ń lọ ọjà " +"development progress and new Ìdàgbàsókè, Ìlọsíwájú,àti àwọn ìròyìn ." + +msgid "onboarding-v2.newsletter.news" +msgstr "" +"Fí ìròyìn ránńṣẹ́ sí mi nípa Pẹ́ńpọtì (àwọn bulọ́ọ̀gì,àwọn fídiò ìbáṣepọ̀, " +"àwọn sísàn wọlé...)." + +msgid "onboarding-v2.newsletter.privacy1" +msgstr "Ìfi pamọ́ jẹ wá lógún, ní bí o le kà nípa wa " + +msgid "onboarding-v2.newsletter.privacy2" +msgstr "" +"Àwọn ímeèlì tó ṣe kókó nìknn la ó fi ránńṣẹ́ sí ọ. o lè yọwọ́ kúrò ní " +"ìgbàkììgbàní ìlànà ti ìyọwọ́ kúrò nínú èyíkéyìí ìwé ìròyìn wa." + +msgid "onboarding-v2.newsletter.updates" +msgstr "" +"Fi ìmú dójú ìwọ̀n ọjà ránńṣẹ́ sí mi (àwọn ẹ̀yà yuntun, tú sílẹ̀, ṣà " +"túnṣe...)." + +msgid "onboarding-v2.welcome.desc1" +msgstr "" +"Pẹ́ńpọtì ni orísun ìṣílẹ̀kùn àti pe Kálẹidòsìló ṣe é àti àwọn agbègbè, Ní " +"bi ọ̀pọ̀lọpọ̀ àwọn ènìyàn ti ran ara wọn lọ́wọ́ tẹ́lẹ̀ . Gbgbo wọn ló lè ṣe " +"àjùmọ̀ṣenípa:" + +msgid "onboarding-v2.welcome.desc3" +msgstr "" +"Ibi tí a ó ti ri bí a ó ti ṣe àjùmọ̀ṣepọ̀ pẹ̀lú àwọn ìtumọ̀, àwọn ìbéèrè ẹ̀" +"yà ara ẹ̀rọ, ìmójútó síṣe ojúṣe, ìṣọdẹ kòkòrò…" + +msgid "onboarding.welcome.alt" +msgstr "Pẹ́ńpọtì" + +msgid "onboarding-v2.welcome.desc3.title" +msgstr "Sísojúṣe ìtọ́sẹ́nà" + +msgid "onboarding-v2.welcome.title" +msgstr "Káàbọ̀ sí pẹ́ńpọtì!" + +msgid "onboarding.choice.team-up.create-team-desc" +msgstr "" +"Lẹ́yìn tí o bá ti fún ẹgbẹ́ rẹ lórúkọ, Ó le pe àwọn ènìyàn láti darapọ̀ mọ́ " +"ẹgbẹ́." + +msgid "onboarding.choice.team-up.create-team-placeholder" +msgstr "Tẹ orúkọ ẹgbẹ́" + +msgid "onboarding.choice.team-up.invite-members" +msgstr "Fìwépè ọmọ àwọn ẹgbẹ́" + +msgid "onboarding.choice.team-up.invite-members-info" +msgstr "" +"Rántí láti fi gbogbo wọn sí i. Àwọn Olùdásílẹ̀, àwọn aṣàpẹẹrẹ, alákóso... " +"onírúúrú dà wọ́n pọ̀ :)" + +msgid "onboarding.choice.team-up.roles" +msgstr "Pè wọ́n pẹ̀lú ojúṣe wọn:" + +msgid "onboarding.newsletter.accept" +msgstr "Bẹ́ẹ̀ni, ṣe alábàpín" + +msgid "onboarding.newsletter.acceptance-message" +msgstr "" +"A ti fi ìbéèrè fún síṣe alá-bápín rẹ ránńṣẹ́, a ó fi ímeèlì ránńṣẹ́ sí ọ " +"látijẹ́rìí sí." + +msgid "onboarding.newsletter.policy" +msgstr "Ètò ìmúlò tí a fi pamọ́." + +msgid "onboarding.newsletter.title" +msgstr "Fẹ́ gba àwọn ìròyìn pẹ́ńpọti?" + +msgid "onboarding.team-modal.create-team" +msgstr "Ṣẹ̀dá ẹgbẹ́ kan" + +msgid "onboarding.team-modal.create-team-desc" +msgstr "" +"A team allows you to collaborate with other Penpot users working in the Ẹgbẹ́" +" kan yí ó gbà ọ́ láyè láti lè siṣẹ́pọ̀ pẹ̀lú àwọn onílò pẹ́ńpọti tí ó siṣẹ́ " +"nínú àwọn fáìlì àti àwọn iṣẹ́ àgbéṣe kan náà ." + +msgid "onboarding.team-modal.create-team-feature-1" +msgstr "Àwọn fáìlì àti àwọn iṣẹ́ àgbéṣe tí kò lópin" + +msgid "onboarding.team-modal.create-team-feature-2" +msgstr "Multiplayer edition" + +msgid "onboarding.team-modal.create-team-feature-3" +msgstr "àwọn ipa ìṣàkóṣo" + +msgid "onboarding.team-modal.create-team-feature-4" +msgstr "Àwọn ọmọ ẹgbẹ́ tí kò lópin" + +msgid "onboarding.team-modal.create-team-feature-5" +msgstr "100% Ọ̀fẹ́!" + +msgid "onboarding.templates.subtitle" +msgstr "Àwọn àwòṣe díẹ̀ nìyí níbí." + +msgid "onboarding.templates.title" +msgstr "Bẹ̀rẹ̀ sí ṣe ẹ̀yà alárà" + +#: src/app/main/ui/auth/recovery.cljs +msgid "profile.recovery.go-to-login" +msgstr "Lọ láti wọlé" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "Èwo ni ohun èlò irin iṣẹ́ tí o ní ìmọ̀ kíkún nínú pẹ̀lú rẹ̀?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "Mọ́kànlá-Ọgbọ̀n" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "Méjì – mẹ́wàá" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Káńfà" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "" +"Báwo ni ó ti le ṣe àpèjúwe bó ṣe dára tó lórí ìrírí rẹ lórí iṣẹ́ tí o ń ṣe " +"lọ́wọ́..." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Olùyà nǹkan" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Olùdásílẹ̀" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "Ṣàwárí sí i nípa pẹ́ńpọtì" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Fígímà" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Olùdásílẹ̀/VP" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Oníṣẹ́ ni mí" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... wíwò ètò ọnà , ìrírí àwọn ohun ìní, àwọn ètò ọnà, abbl." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "Ìkógun wọ̀lú" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Fi èsì sílẹ̀ fún iṣẹ́ àgbéṣe ẹgbẹ́ mi" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "Ẹjẹ́ 'ká bẹ̀rẹ̀ !" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Gba kóòdù láti inú iṣẹ́ àgbéṣe mi " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Ohun títà tàbí iṣẹ́ àgbéṣe Olùṣàkóso" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Títajà" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "Ju àádọ́ta lọ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-a-tool" +msgstr "N kò tí lo irin iṣẹ́ eto ọnà tẹ́lẹ̀ rí" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Èyí tó kàn" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Ṣe àṣàyàn" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Kòsí" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Yàwòrán" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Òmíìràn(ní pàtó)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "Mò ń siṣẹ́ àgbéṣẹ ti ara mi ni" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "Tàtẹ̀yìn wá" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Báwo lo ṣe ń gbèrò lórí bí o ṣe lo pẹ́ńpọtì?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Díẹ̀" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Bẹ̀rẹ̀" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Bẹ̀rẹ̀ láti lórí iṣẹ́ àgbéṣe mi" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Akẹ́kọ̀ọ́ tàbí olùkọ̀ọ́" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "kín ni ìwọ̀n ẹgbẹ́ rẹ ?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Ṣàyẹ̀wọ̀ pẹ́ńpọtì láti rí pé ó bẹ́gbẹ́ mu " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Gbìyànjú láti mọ̀ kí o tó bẹ̀rẹ̀ sí lo pẹ́ńpọtì ní àyíká" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "... wáyà-fèrèsé, ìrìàjò àwọn onílò & sísàn, àwọn igi ìyíkiri, abbl." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Iṣẹ́ lórí èròǹgbà àti àwọn èrò" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Èsì rẹ yó ràn wá lọ́wọ́ láti jẹ́ kó yé wa lórí kín ni ìhùwàsí rẹ àti àwọn " +"ohun tí o fẹ́ràn jù èyí yó jẹ́ kí á má ṣàmúlò pẹ́ńpọtì gẹ́gẹ́ bí èyí tí ó " +"wúlò àti ohun èlò fun ìgbáládùn." + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Yọ kúrò" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "settings.multiple" +msgstr "Dàárú" + +# SECTIONS +msgid "shortcut-section.basics" +msgstr "Ipìlẹ̀" + +msgid "shortcut-section.viewer" +msgstr "Ólùwò" + +msgid "shortcut-section.workspace" +msgstr "Àaye ìṣẹ́" + +# SUBSECTIONS +msgid "shortcut-subsection.alignment" +msgstr "Titete" + +msgid "shortcut-subsection.edit" +msgstr "Sàtunkọ" + +msgid "shortcut-subsection.general-viewer" +msgstr "àbùdá" + +msgid "shortcut-subsection.main-menu" +msgstr "Akojọ ólórì aṣyn" + +msgid "shortcut-subsection.modify-layers" +msgstr "Yípàdá fẹ́lẹ́fẹ́lẹ́" + +msgid "shortcut-subsection.navigation-dashboard" +msgstr "Lìlọ́ kìrì" + +msgid "shortcut-subsection.navigation-viewer" +msgstr "Lìlọ́ kìrì" + +msgid "shortcut-subsection.navigation-workspace" +msgstr "Lìlọ́ kìrì" + +msgid "shortcut-subsection.panels" +msgstr "Àwọ̀n pánẹ̀lí" + +msgid "shortcut-subsection.path-editor" +msgstr "Àwọ́n ọna" + +msgid "shortcut-subsection.shape" +msgstr "Àwọ́n apẹ́rẹ́" + +msgid "shortcut-subsection.text-editor" +msgstr "Àwọ́n ọ́rọ̀" + +msgid "shortcut-subsection.tools" +msgstr "Àwọ́n irínṣẹ̀" + +msgid "shortcut-subsection.zoom-viewer" +msgstr "Sun-un" + +msgid "shortcut-subsection.zoom-workspace" +msgstr "Sun-un" + +msgid "shortcuts.add-comment" +msgstr "Ọ́rọ̀íwòye" + +msgid "shortcuts.add-node" +msgstr "Fí ípàdé kùn" + +msgid "shortcuts.align-bottom" +msgstr "Sópọ sí ísàle" + +msgid "shortcuts.align-center" +msgstr "Parapọ àárin" + +msgid "shortcuts.align-hcenter" +msgstr "Páràpọ àárin naa" + +msgid "shortcuts.align-justify" +msgstr "Ṣe dèédé si ìdálárè" + +msgid "shortcuts.align-left" +msgstr "Sosi ósì" + +msgid "shortcuts.align-right" +msgstr "Sosi ọtún" + +msgid "shortcuts.align-top" +msgstr "Sopo si òké" + +msgid "shortcuts.align-vcenter" +msgstr "Tẹle àárin ni inàró" + +msgid "shortcuts.artboard-selection" +msgstr "Ṣẹ̀dá ọ̀kọ̀ lati yìyán" + +msgid "shortcuts.bold" +msgstr "Yipàdà to han" + +msgid "shortcuts.bool-difference" +msgstr "Iyàtò Boolean" + +msgid "shortcuts.bool-exclude" +msgstr "Boolean tà yọ̀kúro" + +msgid "shortcuts.bool-intersection" +msgstr "ikòritá Boolean" + +msgid "shortcuts.bool-union" +msgstr "Asépọ̀ Boolean" + +msgid "shortcuts.bring-back" +msgstr "Fírànṣẹ́ si ẹ́hin" + +msgid "shortcuts.bring-backward" +msgstr "Ran pàdà sí ehin" + +msgid "shortcuts.bring-forward" +msgstr "Mù siwájù" + +msgid "shortcuts.bring-front" +msgstr "Mù si wájù" + +msgid "shortcuts.clear-undo" +msgstr "Pa yipàdá rẹ" + +msgid "shortcuts.copy" +msgstr "Dàákọ" + +msgid "shortcuts.create-component" +msgstr "Ṣẹ̀dá pàátì" + +msgid "shortcuts.create-new-project" +msgstr "Ṣẹ̀dá títún" + +msgid "shortcuts.cut" +msgstr "Ge" + +msgid "shortcuts.decrease-zoom" +msgstr "Sun-un jàdé" + +msgid "shortcuts.delete" +msgstr "Pàrẹ" + +msgid "shortcuts.delete-node" +msgstr "Pa ipàdé" + +msgid "shortcuts.detach-component" +msgstr "Yà paati" + +msgid "shortcuts.draw-curve" +msgstr "Yìyí" + +msgid "shortcuts.draw-ellipse" +msgstr "Ẹ́lipsì" + +msgid "shortcuts.draw-nodes" +msgstr "Fà ọnà" + +msgid "shortcuts.draw-path" +msgstr "Ọnà" + +msgid "shortcuts.draw-rect" +msgstr "Ònìgún mèrìn" + +msgid "shortcuts.draw-text" +msgstr "Ọ́rọ̀" + +msgid "shortcuts.duplicate" +msgstr "Ṣe pidánpidán" + +msgid "shortcuts.escape" +msgstr "Fàgílèè" + +msgid "shortcuts.export-shapes" +msgstr "Ókèéré apẹ̀rẹ̀" + +msgid "shortcuts.fit-all" +msgstr "Sun-un látì ba gbògbò rẹ̀ mú" + +msgid "shortcuts.flip-horizontal" +msgstr "Yipadà ní pẹ̀tẹ̀lẹ̀" + +msgid "shortcuts.flip-vertical" +msgstr "Yipadà ní ínàró" + +msgid "shortcuts.font-size-dec" +msgstr "Dìn íwọ̀n fonti kù" + +msgid "shortcuts.font-size-inc" +msgstr "Alekun iwọn fonti" + +msgid "shortcuts.go-to-drafts" +msgstr "Lọ sí iyáwòran" + +msgid "shortcuts.go-to-libs" +msgstr "Lọ si awọn ílé-Ikàwé tí a pín" + +msgid "shortcuts.go-to-search" +msgstr "Wàá" + +msgid "shortcuts.group" +msgstr "Ẹgbẹ" + +msgid "shortcuts.h-distribute" +msgstr "Pinpín kàákírì pètèlè" + +msgid "shortcuts.hide-ui" +msgstr "Ífìhan / Tọju UI" + +msgid "shortcuts.increase-zoom" +msgstr "Sùn-un sínú" + +msgid "shortcuts.insert-image" +msgstr "Fí àwóran sii" + +msgid "shortcuts.italic" +msgstr "Yipàdà ítalikì" + +msgid "shortcuts.join-nodes" +msgstr "Dàràpọ̀ awọn ipàdé" + +msgid "shortcuts.letter-spacing-dec" +msgstr "Din aayé lẹ́tà kù" + +msgid "shortcuts.letter-spacing-inc" +msgstr "Alekun aayé lẹ́tà" + +msgid "shortcuts.line-height-dec" +msgstr "Dinkù gígà ílà" + +msgid "shortcuts.line-height-inc" +msgstr "Ílà ton gá sókè" + +msgid "shortcuts.line-through" +msgstr "Íyìpàdà ílà to yọ̀rí" + +msgid "shortcuts.make-corner" +msgstr "Ṣè ígùn" + +msgid "shortcuts.make-curve" +msgstr "Ṣe ìsépọ" + +msgid "shortcuts.mask" +msgstr "Ibòjú" + +msgid "shortcuts.merge-nodes" +msgstr "Dàpọ̀ awọ́n apa" + +msgid "shortcuts.move" +msgstr "Gbé" + +msgid "shortcuts.move-fast-down" +msgstr "Sàré lọ́ sí isàlẹ̀" + +msgid "shortcuts.move-fast-left" +msgstr "Gbé sí osi kiákiá" + +msgid "shortcuts.move-fast-right" +msgstr "Gbé si ọ̀tún kiákiá" + +msgid "shortcuts.move-fast-up" +msgstr "Gbé si òké kiákiá" + +msgid "shortcuts.move-nodes" +msgstr "Gbé ipàdé" + +msgid "shortcuts.move-unit-down" +msgstr "Gbé sílè" + +msgid "shortcuts.move-unit-left" +msgstr "Gbé osi" + +msgid "shortcuts.move-unit-right" +msgstr "Gbé sọtùn" + +msgid "shortcuts.move-unit-up" +msgstr "Gbé sóke" + +msgid "shortcuts.next-frame" +msgstr "Ọ̀kọ̀ tókan" + +msgid "shortcuts.not-found" +msgstr "Kò sí awọ́n ọ̀nà abùjá ti à rii" + +msgid "shortcuts.opacity-0" +msgstr "Fí akomo sí ipò 100%" + +msgid "shortcuts.opacity-1" +msgstr "Fi akomo si ipo 10%" + +msgid "shortcuts.opacity-2" +msgstr "Fi akomo si ipo 20%" + +msgid "shortcuts.opacity-3" +msgstr "Fi akomo si ipo 30%" + +msgid "shortcuts.opacity-4" +msgstr "Fi akomo si ipo 40%" + +msgid "shortcuts.opacity-5" +msgstr "Fi akomo si ipo 50%" + +msgid "shortcuts.opacity-6" +msgstr "Fi akomo si ipo 60%" + +msgid "shortcuts.opacity-7" +msgstr "Fi akomo si ipo 70%" + +msgid "shortcuts.opacity-8" +msgstr "Fi akomo si ipo 80%" + +msgid "shortcuts.opacity-9" +msgstr "Fi akomo si ipo 90%" + +msgid "shortcuts.open-color-picker" +msgstr "Ólùṣà àwọ̀" + +msgid "shortcuts.open-dashboard" +msgstr "Lọ si dasibodu" + +msgid "shortcuts.open-inspect" +msgstr "Lọ si apaa ayewo olùwò" + +msgid "shortcuts.open-viewer" +msgstr "Lọ si apaa ibaraẹnisọrọ olùwò" + +msgid "shortcuts.or" +msgstr " tabi " + +msgid "shortcuts.paste" +msgstr "Lẹẹmọ" + +msgid "shortcuts.prev-frame" +msgstr "Ọkọ ti tẹlẹ" + +msgid "shortcuts.redo" +msgstr "Tunṣe" + +msgid "shortcuts.reset-zoom" +msgstr "tun sun" + +msgid "shortcuts.search-placeholder" +msgstr "Wa awọn ọna abuja" + +msgid "shortcuts.select-all" +msgstr "Ṣa gbogbo re" + +msgid "shortcuts.select-parent-layer" +msgstr "Yan Obii pẹlẹbẹ" + +msgid "shortcuts.show-shortcuts" +msgstr "Ifihan / Itọju ọna abùjá" + +msgid "shortcuts.snap-nodes" +msgstr "Yaa si awon apa" + +msgid "shortcuts.snap-pixel-grid" +msgstr "Yaa si pikseli ilana" + +msgid "shortcuts.start-measure" +msgstr "Bẹ̀rẹ̀ wíwọ̀n" + +msgid "shortcuts.stop-measure" +msgstr "da wíwọ̀n duro" + +msgid "shortcuts.text-align-center" +msgstr "Parapọ saarin" + +msgid "shortcuts.text-align-justify" +msgstr "Sedede lárè" + +msgid "shortcuts.text-align-left" +msgstr "mo si osi" + +msgid "shortcuts.text-align-right" +msgstr "Mo sotun" + +msgid "shortcuts.thumbnail-set" +msgstr "Se étò awòn áwòran fun fidio" + +msgid "shortcuts.toggle-alignment" +msgstr "Iyipada titete ìmúdàgba" + +msgid "shortcuts.toggle-assets" +msgstr "Yi dukia pada" + +msgid "shortcuts.toggle-colorpalette" +msgstr "Yi paleti awọ pada" + +msgid "shortcuts.toggle-focus-mode" +msgstr "Yi ipo idojukọ pada" + +msgid "shortcuts.toggle-fullscreen" +msgstr "Yi kuro ni fulscrin" + +msgid "shortcuts.toggle-grid" +msgstr "Fihan / Tọju ilana" + +msgid "shortcuts.toggle-layers" +msgstr "Yi awon pelebe yii pada" + +msgid "shortcuts.toggle-lock" +msgstr "Tiipa / Siilẹ" + +msgid "shortcuts.toggle-lock-size" +msgstr "títìipa lápàkàn" + +msgid "shortcuts.toggle-rules" +msgstr "Fifihan / Titọju ólórì" + +msgid "shortcuts.toggle-scale-text" +msgstr "Yipada asekale ọrọ" + +msgid "shortcuts.toggle-snap-guide" +msgstr "Pín si awọ́n ítọ̀nisọ́nà" + +msgid "shortcuts.toggle-textpalette" +msgstr "Yíípàda ọrọ paleti" + +msgid "shortcuts.toggle-visibility" +msgstr "Fihan / Toju re" + +msgid "shortcuts.toggle-zoom-style" +msgstr "Yiipada asa sun-un" + +msgid "shortcuts.underline" +msgstr "Yii abẹlẹ" + +msgid "shortcuts.undo" +msgstr "Yi pada" + +msgid "shortcuts.ungroup" +msgstr "Tu ẹgbẹ" + +msgid "shortcuts.unmask" +msgstr "Aiboju" + +msgid "shortcuts.v-distribute" +msgstr "Pin ni inaro" + +msgid "shortcuts.zoom-lense-decrease" +msgstr "Dín lẹnsì sisun kù" + +msgid "shortcuts.zoom-lense-increase" +msgstr "Lílọ̀soké lẹnsi sisun" + +msgid "shortcuts.zoom-selected" +msgstr "Yiyan pelu sun-un" + +#: src/app/main/ui/dashboard/team.cljs +msgid "team.webhooks.max-length" +msgstr "Orúkọ̀ webhook kò gbọ́dọ̀ kọjà awọ́n óhun kíkọ́ 2048." + +#: src/app/main/ui/dashboard/files.cljs +msgid "title.dashboard.files" +msgstr "%s - Penpot" + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "title.dashboard.font-providers" +msgstr "Pipese oniru fọnti - %s - Penpot" + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "title.dashboard.fonts" +msgstr "Fọnti - %s - Penpot" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "title.dashboard.projects" +msgstr "Awọn ísè agbèsè - %s - Penpot" + +#: src/app/main/ui/dashboard/search.cljs +msgid "title.dashboard.search" +msgstr "Wà - %s - Penpot" + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/auth.cljs +msgid "title.default" +msgstr "Penpot – Se onìrú òmínìra fun awọ̀n ẹ̀gbẹ̀" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "Profaili – Aami wiwọle" + +#: src/app/main/ui/settings/feedback.cljs +msgid "title.settings.feedback" +msgstr "Fi esi- Penpot" + +#: src/app/main/ui/settings/options.cljs +msgid "title.settings.options" +msgstr "Awon eto - Penpot" + +#: src/app/main/ui/settings/password.cljs +msgid "title.settings.password" +msgstr "Ọrọigbaníwólé - Penpot" + +#: src/app/main/ui/settings/profile.cljs +msgid "title.settings.profile" +msgstr "Profaili - Penpot" + +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-invitations" +msgstr "Ifíwẹ́pe - %s - Penpot" + +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-members" +msgstr "Ọ́́mọ̀ ẹgbẹ - %s - Penpot" + +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-settings" +msgstr "Awọn eto - %s - Penpot" + +msgid "title.team-webhooks" +msgstr "Webhooks - %s - Penpot" + +#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs +msgid "title.viewer" +msgstr "%s –Ipo wíwò - Penpot" + +#: src/app/main/ui/workspace.cljs +msgid "title.workspace" +msgstr "%s - Penpot" + +#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs +msgid "viewer.empty-state" +msgstr "No boards found on the page." + +#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs +msgid "viewer.frame-not-found" +msgstr "A kò ri ọ̀kọ̀." + +msgid "viewer.header.comments-section" +msgstr "Ọrọìwòye (%s)" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.dont-show-interactions" +msgstr "Maa fi ìbaráẹ̀nìsepọ han" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.fullscreen" +msgstr "Fé ká gḅọgbọ síkírínì" + +msgid "viewer.header.inspect-section" +msgstr "Ayéwò (%s)" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.interactions" +msgstr "Ibaraenisépọ̀" + +msgid "viewer.header.interactions-section" +msgstr "Awọ̀n Ibaraenisépọ̀ (%s)" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.sitemap" +msgstr "Áwòran átọ̀kà ílẹ̀" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hcenter" +msgstr "Paŕàpọ̀ sí petelè aarin (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hdistribute" +msgstr "Pin aayè ni pètélè (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hleft" +msgstr "Páràpọ̀ sí òsì (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hright" +msgstr "Páràpọ̀ sí ọtun (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vbottom" +msgstr "Páràpọ̀ sí isàlẹ̀ (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vcenter" +msgstr "Páràpọ̀ sí inàro aarin (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vdistribute" +msgstr "Pin aayè inàró (%s)" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vtop" +msgstr "Párápọ̀ sóké (%s)" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.assets" +msgstr "Awọ̀n dukia" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.box-filter-all" +msgstr "Gbọ̀gbọ̀ awọ̀n dukia" + +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.colors" +msgstr "Áwò" + +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.components" +msgstr "Awọ̀n eroja" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.create-group" +msgstr "Ṣẹ̀dá ẹ̀gbẹ̀ kan" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.create-group-hint" +msgstr "páarẹ̀" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.duplicate" +msgstr "ẹẹdà" + +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.edit" +msgstr "Ṣatunkọ" + +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.graphics" +msgstr "Awọn Awòran" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.group" +msgstr "Ẹgbẹ" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.group-name" +msgstr "Orúkọ̀ ẹgbẹ" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.libraries" +msgstr "Ílè-iwè" + +msgid "workspace.assets.local-library" +msgstr "Ílè-iwè agbegbe" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.not-found" +msgstr "Ko si ohun-ini ti a rii" + +msgid "workspace.assets.open-library" +msgstr "Ṣii faili ìlé-ikáwè" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.rename" +msgstr "Lo oruko imiran" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.rename-group" +msgstr "Lo oruko imiran fun ẹgbẹ" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.search" +msgstr "Wa dukia" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "Iĺẹ̀ iwekika ti a pln" + +#: src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.typography" +msgstr "Iwe itẹwe" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.font-id" +msgstr "Fonti" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.font-size" +msgstr "Iwon" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.font-variant-id" +msgstr "Iyatọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.letter-spacing" +msgstr "Aaye leta" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.line-height" +msgstr "Giga ila" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/inspect/attributes/text.cljs, src/app/main/ui/inspect/attributes/text.cljs +msgid "workspace.assets.typography.sample" +msgstr "Ag" + +msgid "workspace.assets.typography.text-styles" +msgstr "Oniru ọrọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.text-transform" +msgstr "Iyipádà ọrọ" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.ungroup" +msgstr "Títù ẹ̀gbẹ́" + +msgid "workspace.focus.focus-mode" +msgstr "Ipo Idojukọ" + +msgid "workspace.focus.focus-off" +msgstr "Pa Ídòjúkọ" + +msgid "workspace.focus.focus-on" +msgstr "Tan Ídòjúkọ" + +msgid "workspace.focus.selection" +msgstr "Yiyan" + +#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs +msgid "workspace.gradients.linear" +msgstr "Itesiwaju gerege" + +#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs +msgid "workspace.gradients.radial" +msgstr "Itesiwaju Radial" + +msgid "workspace.header.menu.disable-scale-content" +msgstr "Pa asèkalẹ̀ iwọnbà" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-scale-text" +msgstr "Pa ọrọ iwọnba" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-grid" +msgstr "Pa yipada si ilana" + +msgid "workspace.header.menu.disable-snap-pixel-grid" +msgstr "Pa yipada si piseli" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-dynamic-alignment" +msgstr "Tan imudagba to Sedede" + +msgid "workspace.header.menu.enable-scale-content" +msgstr "Tan asèkalẹ̀ iwọnbà" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-scale-text" +msgstr "Tan iwọnbà ọrọ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-grid" +msgstr "Yipada si ilana" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-guides" +msgstr "Yipada si itọ̀nìsọna" + +msgid "workspace.header.menu.enable-snap-pixel-grid" +msgstr "Tan Yipada si piseli" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-grid" +msgstr "Tọ̀jú ilana" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-palette" +msgstr "Tọ̀jú awọ palẹti" + +msgid "workspace.header.menu.hide-pixel-grid" +msgstr "Tọ̀jú pisẹli ilana" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-rules" +msgstr "Tọ̀jú awọn ólòrí" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-textpalette" +msgstr "Tọ̀jú awọn fọnti paleti" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.edit" +msgstr "Satunkọ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.file" +msgstr "Faili" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.help-info" +msgstr "Iranlọwọ ati alaye" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.preferences" +msgstr "Awọn àyánfẹ̀" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.view" +msgstr "Wiwo" + +msgid "workspace.header.menu.redo" +msgstr "Tun ṣe" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.select-all" +msgstr "Sa gbogbo rẹ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-grid" +msgstr "ifihan akoj" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-palette" +msgstr "Fi awo paleti han" + +msgid "workspace.header.menu.show-pixel-grid" +msgstr "Fi piseli ilana han" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-rules" +msgstr "Ifihan awọ̀n ólórí" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-textpalette" +msgstr "Ifihan fonti paleti" + +msgid "workspace.header.menu.undo" +msgstr "Yi pada" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.reset-zoom" +msgstr "Tunto" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.save-error" +msgstr "àsisè lórì fíf́ipamọ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.saved" +msgstr "Ti a fipamọ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.saving" +msgstr "Fifipámọ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.unsaved" +msgstr "Awọn ayípàdà ti kó ni fipamọ" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.viewer" +msgstr "Ipo wiwo(%s)" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "sun-un" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fill" +msgstr "Kun - óṣùwọn to kun" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fit" +msgstr "Báràmù - óṣùwọn to Báràmù" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fit-all" +msgstr "Suun kí o bá gbógbó rẹ̀ dọ́gbà" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-full-screen" +msgstr "Áseàfihan to kún" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-selected" +msgstr "Ṣuum lati yan" + +msgid "workspace.layout_grid.editor.title" +msgstr "Ilànà àyípàdà" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.add" +msgstr "Afikùn" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.colors" +msgstr "%s awọn awọ" + +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "Kòyi si oniruiru awọ ni ilé-ikàwé re" + +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "Ko si oniruiru iwé itẹ̀wé ni ilé ikàwé rẹ̀" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.hsv" +msgstr "HSV" + +#: src/app/main/ui/workspace/colorpicker/libraries.cljs, src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.recent-colors" +msgstr "Awọn àwò tálò láipẹ̀" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgb-complementary" +msgstr "RGB Ibáramù" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgba" +msgstr "RGBA" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.save-color" +msgstr "Fi awọn oniru awọ pamọ" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.components" +msgstr "%s Ẹya ara ẹrọ" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.file-library" +msgstr "Faili ilé ikàwé" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.graphics" +msgstr "%s ayaworan" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.libraries" +msgstr "Awọn Ílè íkawè" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library" +msgstr "Ílè íkawè" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library-updates" +msgstr "Ílè íkawè ímùdojúiwọn" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.no-libraries-need-sync" +msgstr "Kò si Ilé kàwé ti a pin si ímùdojúiwọn" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.shared-libraries" +msgstr "Awọn ilé kàwé tí a pìn" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.libraries.text.multiple-typography" +msgstr "Óríṣí awọn íwè itẹ̀wé" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.libraries.text.multiple-typography-tooltip" +msgstr "Tú gbógbó lińkí awọn íwè itẹ̀wé" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.typography" +msgstr "%s awọn íwè itẹ̀wé" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.update" +msgstr "ímùdojúiwọn" + +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "workspace.options.blur-options.title" +msgstr "Baìbaì" + +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "workspace.options.blur-options.title.group" +msgstr "Ẹ̀gdẹ́ Baìbaì" + +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "workspace.options.blur-options.title.multiple" +msgstr "Asayan Baìbaì" + +#: src/app/main/ui/workspace/sidebar/options/page.cljs +msgid "workspace.options.canvas-background" +msgstr "Kánfásì abẹ́le" + +msgid "workspace.options.clip-content" +msgstr "Ábẹrẹ́ ákoonù" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs +msgid "workspace.options.component" +msgstr "Apakan" + +msgid "workspace.options.component.copy" +msgstr "Ádàakọ" + +msgid "workspace.options.component.edit-annotation" +msgstr "Ṣatunkọ àkọ̀silẹ̀" + +msgid "workspace.options.component.main" +msgstr "Ólòrí" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints" +msgstr "Awọn ihámọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.bottom" +msgstr "Ídì" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.center" +msgstr "Aarin" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.left" +msgstr "Òsi" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.leftright" +msgstr "Osi ati otun" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.right" +msgstr "Ọ̀tún" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.scale" +msgstr "Íwọ́n" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.top" +msgstr "Ókè" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.topbottom" +msgstr "Ókè ati Ídí" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export" +msgstr "Sí ilẹ́ òkèeré" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs +msgid "workspace.options.export.suffix" +msgstr "afikun ọrọ niipárí" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-complete" +msgstr "Gbígbè okeere ti pari" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object" +msgstr "Gbígbè okeere …" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object-error" +msgstr "Gbígbè okeere kuna" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.bottom" +msgstr "ìsàlẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.center" +msgstr "Àárín" + +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.fill" +msgstr "Kún" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.add-flow-start" +msgstr "Safikun ibẹrè ṣiṣan" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-start" +msgstr "ibẹrè ṣiṣan" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-starts" +msgstr "íbẹrè awọn ṣiṣan" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.auto" +msgstr "Aifọ́wọyi" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.grid-title" +msgstr "Ilánà" + +msgid "workspace.options.grid.params.color" +msgstr "Awọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.columns" +msgstr "Awọn ọwọn" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.gutter" +msgstr "Gota" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.height" +msgstr "Òkè" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.margin" +msgstr "Àlà" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.rows" +msgstr "Àwọn orí ìlà ìbú" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.set-default" +msgstr "Fi sípò abínibí" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.size" +msgstr "Ìwọ̀n" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type" +msgstr "Irú" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.left" +msgstr "Òsì" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.right" +msgstr "Ọ̀tún" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.stretch" +msgstr "Nà" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.top" +msgstr "Òkè" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.use-default" +msgstr "Lo ipò abínibí" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.width" +msgstr "Ìgbòrò" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.row" +msgstr "Àwọn orị ìlà ìbú" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.square" +msgstr "Alápoméjì" + +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.group-fill" +msgstr "Ẹ̀kún ẹgbẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.group-stroke" +msgstr "Ẹgba ẹgbẹ́" + +msgid "workspace.options.inspect" +msgstr "Ṣàyẹ̀wò" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-action" +msgstr "Ìgbésẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-after-delay" +msgstr "Lẹ́yìn ìdádúro" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation" +msgstr "Àwòrán abẹ̀mí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-dissolve" +msgstr "Túká" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-none" +msgstr "Kòsí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-push" +msgstr "Tì" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-slide" +msgstr "Aṣàfihàn" + +msgid "workspace.options.interaction-auto" +msgstr "Ọkọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-background" +msgstr "Fi àyíká ìtẹ̀lẹ̀ ìlànà síi" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-outside" +msgstr "Páadé tí o bá n tẹ ìta" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay" +msgstr "Pa ìlànà ìtẹ̀lẹ̀ dé" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay-dest" +msgstr "Pa ìlànà ìtẹ̀lẹ̀ dé: %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-delay" +msgstr "Ìdádúró" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-destination" +msgstr "Èbúté" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-duration" +msgstr "Ịgbà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing" +msgstr "Rírokùn" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease" +msgstr "Ìrọ̀rùn" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in" +msgstr "Rọra wọlé" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in-out" +msgstr "Rọra wọlé jáde" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-out" +msgstr "Rọra jáde" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-linear" +msgstr "Ilà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-in" +msgstr "Inú" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-enter" +msgstr "Atọ́ka ìwọnú" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-left" +msgstr "Ìsàlẹ̀ òsì" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-right" +msgstr "Ìsàḷ̀ẹ̀ ọ̀tún" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-center" +msgstr "Àárín" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-manual" +msgstr "Aláfọwóṣe" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-center" +msgstr "Àárín òkè" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-leave" +msgstr "Atọ́ka kíkúrò" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-ms" +msgstr "ms" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to" +msgstr "Lílọ kiri sí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to-dest" +msgstr "Lílo kiri sí: %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-none" +msgstr "(Akò ṣètò)" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-left" +msgstr "Òkè òsì" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-offset-effect" +msgstr "Ipa àìṣedédé" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-url" +msgstr "Ṣí URL" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-out" +msgstr "Jáde" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-center" +msgstr "Àáriń ìsàlẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-right" +msgstr "Òkè ọ̀tún" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-position" +msgstr "Ipò" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-preserve-scroll" +msgstr "Ṣe ìtọ́jú ipò àyílọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-prev-screen" +msgstr "Aṣàfihàn àtẹ̀yìnwá" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-hovering" +msgstr "Nígbàtí óhún rábàbà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-pressing" +msgstr "Nígbàtị óhún tẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interactions" +msgstr "Àwọn ìbáraẹniṣepọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color" +msgstr "Àwọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color-burn" +msgstr "Ṣẹ̀dà àwọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.color-dodge" +msgstr "Òpó àwọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.darken" +msgstr "Ṣókuǹkùn" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.difference" +msgstr "Ìyàtọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.exclusion" +msgstr "Ìyàsọ́tọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.hard-light" +msgstr "Iná líle" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.hue" +msgstr "Ọdà" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.lighten" +msgstr "Fẹ́ẹ́rẹ́fẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.luminosity" +msgstr "Ìmọ́lẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.multiply" +msgstr "Ìsọdipúpọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.normal" +msgstr "Déédé" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.overlay" +msgstr "Ìtẹ̀lẹ́ ìlànà" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.saturation" +msgstr "Ẹ̀kúnrẹ́rẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.screen" +msgstr "Aṣàfihàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.soft-light" +msgstr "Ìmọ́lẹ̀ rokoṣo" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title" +msgstr "Ìpele" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title.group" +msgstr "Ẹgbẹ́ ìpele" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title.multiple" +msgstr "Egbẹ́ ààyò" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.advanced-ops" +msgstr "Ànàálè ìtẹ̀síwájú" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-max-h" +msgstr "Ibi tó ga jùlọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-max-w" +msgstr "Ìgbòrò tó ga jù" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-min-h" +msgstr "Gíga to kéré jù lọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-min-w" +msgstr "Ìgbòrò tó kéré jù lọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-max-h" +msgstr "Gíga tó pọ̀jù" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-max-w" +msgstr "Ìgbòrò tí pòjù" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-min-h" +msgstr "Gíga tó kéré jùlọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-min-w" +msgstr "Gbígbòrò tó kéré jù lọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.bottom" +msgstr "Ìdí" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column" +msgstr "Ìlà òòró" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column-reverse" +msgstr "Ìlà òòró yíyípadà" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.packed" +msgstr "tí wọn dì" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding" +msgstr "Ìtẹ̀wọ́nú" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-all" +msgstr "Gbogbo ẹ̀gbẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-simple" +msgstr "Ìtẹ̀wọ́nú pọ́nbélé" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.right" +msgstr "Ọ̀tún" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-around" +msgstr "Àyè àyíká" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-between" +msgstr "Àyè àárín" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.top" +msgstr "Òkè" + +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.more-colors" +msgstr "Àwọn àwọ̀ púpọ̀ sí i" + +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.more-lib-colors" +msgstr "Àwọn yàrá àwọ̀ púpọ̀ sí I" + +msgid "workspace.options.opacity" +msgstr "Àìríran" + +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.position" +msgstr "Ipò" + +#: src/app/main/ui/workspace/sidebar/options.cljs +msgid "workspace.options.prototype" +msgstr "Ìtẹ̀lé ìlànà" + +msgid "workspace.options.radius" +msgstr "Ìdáméjì òbìrìkìtiì" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-bottom-left" +msgstr "Apá òsì ìsàlẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-bottom-right" +msgstr "Apá ọ̀tún ìsàle" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-top-left" +msgstr "Òkè òsì" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-top-right" +msgstr "Òkè ọ̀tún" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius.all-corners" +msgstr "Àwọn gbogbo igun" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.blur" +msgstr "Rẹ́súrẹ́sú" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.drop-shadow" +msgstr "Da òjìjí" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.inner-shadow" +msgstr "Òjìjí inú" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsetx" +msgstr "X" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsety" +msgstr "Y" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.spread" +msgstr "Tànkálẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius.single-corners" +msgstr "Àwọn igun olómìnira" + +msgid "workspace.options.recent-fonts" +msgstr "Àìpẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.retry" +msgstr "Tún gbìyànjú" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.rotation" +msgstr "Yíyípo" + +msgid "workspace.options.search-font" +msgstr "Àdàkọ ìwádìí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.select-a-shape" +msgstr "" +"Yan ìrísi ,pátákó tàbí ẹgbẹ́ láti fa ìsopọ̀ mọ́ pátákó " +"òmíràn." + +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.selection-color" +msgstr "Àwọn àwọ̀ tí a ti yàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.selection-fill" +msgstr "Ìmúṣẹ tí a yàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.selection-stroke" +msgstr "Ipò ìlù tí a yàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title" +msgstr "Òjìjí" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title.group" +msgstr "Àwùjọ òjìjí" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker" +msgstr "Àmì alápoméjì" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title.multiple" +msgstr "Òjìjí tí a yàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.show-fill-on-export" +msgstr "Fihàn nínụ àgbéjáde" + +msgid "workspace.options.show-in-viewer" +msgstr "Fihàn nínú ipò wíwò" + +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.size" +msgstr "Ìwọ̀n" + +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs +msgid "workspace.options.size-presets" +msgstr "Àwọn àtòjọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke" +msgstr "Ipò ìlà" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker" +msgstr "Àmì yíyíká" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Yíyíká" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker" +msgstr "Àmì dáyámọ́ǹdì" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Dáyámọ́ǹdì" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow" +msgstr "Ọfà ìlà" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Onígun mẹ́rin" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow" +msgstr "Ofà onígun mẹ́ta" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Ofà" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.none" +msgstr "Kòsí" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.round" +msgstr "Yíká" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square" +msgstr "Alápoméjì" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Onígun mẹ́ta" + +msgid "workspace.options.stroke-color" +msgstr "Àwọ ìlà" + +msgid "workspace.options.stroke-width" +msgstr "Ìgbòrò ìlà" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.center" +msgstr "Àárín" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.dashed" +msgstr "Tó ní ìlà-ìlà" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.dotted" +msgstr "àmì tó tó tó" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.inner" +msgstr "Nínú" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.mixed" +msgstr "Tí a ti dàpọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.outer" +msgstr "Ìta" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.solid" +msgstr "Ṣinsin" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-bottom" +msgstr "Mú dọ́gba abẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-middle" +msgstr "Mú dọgba àárín" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-top" +msgstr "Mú dọ́gba òkè" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.direction-ltr" +msgstr "LTR" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.direction-rtl" +msgstr "RTL" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-auto-height" +msgstr "Gíga aládàáṣiṣẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-auto-width" +msgstr "Gbígbòòrò aládáàṣiṣé" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-fixed" +msgstr "Tí kò yíyadà" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.letter-spacing" +msgstr "Àlàfo lẹ́tà" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.line-height" +msgstr "Gíga ìlà" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.lowercase" +msgstr "Lẹ́tà kékeré" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.none" +msgstr "Kòsí" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.strikethrough" +msgstr "Ìfọwọ́bàyíká (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-center" +msgstr "Mú dọ́gba àárín (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-justify" +msgstr "Ìdálàre (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-left" +msgstr "Mú dọ́gba òsì (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-right" +msgstr "Mú dọ́gba ọ̀tún (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title" +msgstr "Àyọkà" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title-group" +msgstr "Àwùjọ àyọkà" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title-selection" +msgstr "Àṣàyàn ọ̀rọ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.titlecase" +msgstr "ipò ọ̀rọ̀ àkórí" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.underline" +msgstr "Fífàlà (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.uppercase" +msgstr "Lẹ́tà ńlá" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.use-play-button" +msgstr "" +"Lo bọ́tìnì ìṣe tó wà lóori àkọsórí náà láti ṣakóso ìwò " +"àkàwé." + +msgid "workspace.options.width" +msgstr "Ìgbòrò" + +msgid "workspace.options.x" +msgstr "Ipò X" + +msgid "workspace.options.y" +msgstr "Ipò Y" + +msgid "workspace.path.actions.add-node" +msgstr "Fi ìpàdé kún (%s)" + +msgid "workspace.path.actions.delete-node" +msgstr "Pa ìpàdé ré (%s)" + +msgid "workspace.path.actions.draw-nodes" +msgstr "Fa ìpàdé (%s)" + +msgid "workspace.path.actions.join-nodes" +msgstr "Da ìpàdé pọ̀ (%s)" + +msgid "workspace.path.actions.make-corner" +msgstr "Sí igun (%s)" + +msgid "workspace.path.actions.make-curve" +msgstr "Sí ẹkọ̀rọ̀ (%s)" + +msgid "workspace.path.actions.merge-nodes" +msgstr "Da ìpàdé pò (%s)" + +msgid "workspace.path.actions.move-nodes" +msgstr "Gbé ìpàde (%s)" + +msgid "workspace.path.actions.separate-nodes" +msgstr "Ya ̣ìpàdé sọ́tọ̀ (%s)" + +msgid "workspace.path.actions.snap-nodes" +msgstr "Ìmọ̀lára ìpàdé (%s)" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.add-flex" +msgstr "Fi àrọ ètò ìrísí kun" + +msgid "workspace.shape.menu.add-grid" +msgstr "Fi gírídì ètò ìrísị kun" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.back" +msgstr "dáa padà séyiǹ" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.backward" +msgstr "dá padà sọ́wọ èyiǹ" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.copy" +msgstr "Ṣẹ̀dà" + +msgid "workspace.shape.menu.create-annotation" +msgstr "Ṣèda àlàyé" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.create-artboard-from-selection" +msgstr "Yíyàn sí pátákó" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.create-component" +msgstr "Ṣẹ́dá àkóónú" + +msgid "workspace.shape.menu.create-multiple-components" +msgstr "Ṣẹ̀dá ọ̀pọ̀lọpọ̀ àkóónú" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.cut" +msgstr "Gé" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete" +msgstr "Parẹ́" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete-flow-start" +msgstr "Pa ìbẹ̀ẹ̀rè ìsàn rẹ́" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.detach-instance" +msgstr "ṣẹ́ àpẹ̣ẹre yọ nípò" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.detach-instances-in-bulk" +msgstr "Ṣẹ́ àwọn àpẹẹrẹ yọ nípò" + +msgid "workspace.shape.menu.difference" +msgstr "Ìyàtọ̀" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.duplicate" +msgstr "Sẹ ẹ̀dà" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.edit" +msgstr "Sàtúnṣe" + +msgid "workspace.shape.menu.exclude" +msgstr "Ṣà yọ sílè" + +msgid "workspace.shape.menu.flatten" +msgstr "Tẹ́ pẹrẹsẹ" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flip-horizontal" +msgstr "Ìyí padà oníbùú" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flip-vertical" +msgstr "Ìyí padà olóòró" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flow-start" +msgstr "Ìbẹ̀rè ìṣàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.reset-overrides" +msgstr "Ṣe àtúnṣe ìdojúkọ" + +msgid "workspace.shape.menu.restore-main" +msgstr "Dạ àkóónú pàtàkì sí pò" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.select-layer" +msgstr "Yan ìpele" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show" +msgstr "Ṣà fihàn" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-in-assets" +msgstr "Ṣafihàn nínú atọ́ka àwọn ìgbìmọ̀ ìní" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-main" +msgstr "Ṣà fihàn àkóónú pàtàkì" + +msgid "workspace.shape.menu.thumbnail-remove" +msgstr "Yọ àwòrán aláṣojú kúrò" + +msgid "workspace.shape.menu.thumbnail-set" +msgstr "Fi sípò àwòrań aláṣojú" + +msgid "workspace.shape.menu.transform-to-path" +msgstr "Yípadà sí pópó ọ̀nà" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.ungroup" +msgstr "Ṣe àìkójọ" + +msgid "workspace.shape.menu.union" +msgstr "Ìbáṣepò" + +msgid "workspace.sidebar.layers.groups" +msgstr "Àkójọ" + +msgid "workspace.sidebar.layers.images" +msgstr "Àwọn àwòrán" + +msgid "workspace.sidebar.layers.masks" +msgstr "Àwọn ìbòjú" + +msgid "workspace.sidebar.layers.search" +msgstr "Àwọn ìpele wíwá" + +msgid "workspace.sidebar.layers.shapes" +msgstr "Àwọn ìrísí" + +msgid "workspace.sidebar.layers.texts" +msgstr "Àwọn àyọkà" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.sitemap" +msgstr "Máàpù ojú ìlà" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.assets" +msgstr "Àwọn ohun ìní" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.color-palette" +msgstr "Pálètì àwọ̀ (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.comments" +msgstr "Àwọn ìdáásí (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.curve" +msgstr "Ìṣépo (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.ellipse" +msgstr "Àlàfo (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.frame" +msgstr "Pátákó (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text" +msgstr "Àyọkà (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.image" +msgstr "Àwòrán(%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.move" +msgstr "Gbé (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.path" +msgstr "Pópó ọ̀nà (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.rect" +msgstr "Onígun mẹ́rin (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.shortcuts" +msgstr "Àwón ọ̀nà àbùjá (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text-palette" +msgstr "Àwọn ohun ìtẹ̀wé (%s)" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.empty" +msgstr "Di ìgbà yìí kò sí àyípadà nínú ìtàn" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.delete" +msgstr "Paarẹ́%s" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.modify" +msgstr "Àtuńṣe %s" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.move" +msgstr "Àwọn ohun tí a ti gbé lọ" + +msgid "workspace.undo.entry.multiple.circle" +msgstr "Awọn àyíká" + +msgid "workspace.undo.entry.multiple.color" +msgstr "Àwọn ohun àmúṣọrọ̀ àwọ̀" + +msgid "workspace.undo.entry.multiple.component" +msgstr "Àkóónú" + +msgid "workspace.undo.entry.multiple.multiple" +msgstr "Àwọn ǹǹkan" + +msgid "workspace.undo.entry.multiple.page" +msgstr "Àwọn ojú awé" + +msgid "workspace.undo.entry.multiple.curve" +msgstr "Àwọn ẹkọ̀rọ̀" + +msgid "workspace.undo.entry.multiple.frame" +msgstr "Pátákó" + +msgid "workspace.undo.entry.multiple.group" +msgstr "Àwọn àkójọ" + +msgid "workspace.undo.entry.multiple.media" +msgstr "Àwọn ohun ìyì àwòrán" + +msgid "workspace.undo.entry.multiple.path" +msgstr "Àwọn ẹ̀bá ọ̀nà" + +msgid "workspace.undo.entry.multiple.rect" +msgstr "Àwọn onígun mẹ́rin" + +msgid "workspace.undo.entry.multiple.shape" +msgstr "Ìrísí" + +msgid "workspace.undo.entry.multiple.text" +msgstr "Àwọn àyọkà" + +msgid "workspace.undo.entry.multiple.typography" +msgstr "Àwọn ohun ìyì ìwé títẹ̀" + +msgid "workspace.undo.entry.single.path" +msgstr "Pópó ònà" + +msgid "workspace.undo.entry.single.rect" +msgstr "Onígun mẹ́rin" + +msgid "workspace.undo.entry.single.shape" +msgstr "Ìrísí" + +msgid "workspace.undo.entry.single.text" +msgstr "Àyọkà" + +msgid "workspace.undo.entry.single.typography" +msgstr "Ohun ìyì ìwé títẹ̀" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.unknown" +msgstr "Iṣẹ́ parí %s" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.title" +msgstr "Ìtàn" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.dismiss" +msgstr "Ta nù" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "Àlàyé síi" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.there-are-updates" +msgstr "Àwọn imúdójúìwọ̀n wà nínú àwọn yàrá ìkàwẹ tí a pín" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.update" +msgstr "Ìmúdójúìwọ̀n" + +msgid "workspace.viewport.click-to-close-path" +msgstr "Tẹ̀ láti pa pópó ọ̀nà dé" -- Gitee From bb0427d613d390a24240a40bf13b965796d37440 Mon Sep 17 00:00:00 2001 From: Stas Haas Date: Wed, 14 Feb 2024 14:39:06 +0000 Subject: [PATCH 0426/1266] :globe_with_meridians: Add translations for: German. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/ --- frontend/translations/de.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/translations/de.po b/frontend/translations/de.po index d8df88a3f..199709462 100644 --- a/frontend/translations/de.po +++ b/frontend/translations/de.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-12 19:01+0000\n" +"PO-Revision-Date: 2024-02-15 15:01+0000\n" "Last-Translator: Stas Haas \n" "Language-Team: German " "\n" -- Gitee From 17b01b97cffa69fd4acdc3cd1a52fe933e55f372 Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Fri, 16 Feb 2024 13:28:08 +0000 Subject: [PATCH 0427/1266] :globe_with_meridians: Add translations for: Hebrew. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/ --- frontend/translations/he.po | 315 +++++++++++++++++++++++++++++++++++- 1 file changed, 313 insertions(+), 2 deletions(-) diff --git a/frontend/translations/he.po b/frontend/translations/he.po index 9cbdf625b..41e258061 100644 --- a/frontend/translations/he.po +++ b/frontend/translations/he.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-25 13:07+0000\n" +"PO-Revision-Date: 2024-02-17 14:02+0000\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew " "\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " "n % 10 == 0) ? 2 : 3));\n" -"X-Generator: Weblate 5.5.1-dev\n" +"X-Generator: Weblate 5.4\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -5210,3 +5210,314 @@ msgstr "עדכון" msgid "workspace.viewport.click-to-close-path" msgstr "לחיצה תסגור את הנתיב" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "אפשר להתנסות לפני שימוש ב־Penpot אצלך בעבודה" + +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "קובץ יובא בהצלחה." +msgstr[1] "%s קבצים יובאו בהצלחה." +msgstr[2] "%s קבצים יובאו בהצלחה." +msgstr[3] "%s קבצים יובאו בהצלחה." + +msgid "modals.delete-component-annotation.message" +msgstr "למחוק את הסימון הזה?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.scd-message" +msgid_plural "modals.delete-shared-confirm.activated.scd-message" +msgstr[0] "הספרייה הזאת מופעלת כאן: " +msgstr[1] "הספריות האלו מופעלות כאן: " +msgstr[2] "הספריות האלו מופעלות כאן: " +msgstr[3] "הספריות האלו מופעלות כאן: " + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "לא מופעל באף קובץ." +msgstr[1] "לא מופעלים באף קובץ." +msgstr[2] "לא מופעלים באף קובץ." +msgstr[3] "לא מופעלים באף קובץ." + +msgid "modals.delete-component-annotation.title" +msgstr "מחיקת סימון" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "לבדוק את Penpot ולראות אם הוא מתאים לצוות שלי " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "סטודנט/ית או מרצה" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "להשאיר משוב למיזם הצוותי שלי" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"אסימוני גישה אישיים הם דרך חלופית למערכת אימות הכניסה/סיסמה שלנו ומאפשרים " +"ליישום לגשת ל־API הפנימי של Penpot" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "נא ללחוץ על הכפתור „יצירת אסימון חדש” כדי ליצור אחד חדש." + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"הספרייה שלך ריקה. לאחר שנוספה כתיקייה משותפת, הנכסים שנוצרים על ידיך יהיו " +"זמינים לצד שאר הקבצים שלך. לפרסם אותה?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "… עיצוב מנשק, נכסים חזותיים, מערכות עיצוב, וכו׳." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "עבודה עם רעיונות למימוש" + +msgid "workspace.options.component.copy" +msgstr "העתקה" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"המשוב שלך יסייע לנו להבין מה הם ההרגלים וההעדפות שלך כדי שנוכל להמשיך להפוך " +"את Penpot לכלי מהנה ושימושי." + +msgid "workspace.options.component.create-annotation" +msgstr "יצירת הסבר" + +msgid "workspace.options.component.edit-annotation" +msgstr "עריכת הסבר" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "הורדת הקוד מהמיזם הצוותי שלי " + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "מרובע" + +msgid "workspace.options.component.main" +msgstr "ראשי" + +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "עדיין אין סוגי טיפוגרפיה בספרייה שלך" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "נכסים שכבר נעשה בהם שימוש בקובץ הזה יישארו שם (אף עיצוב לא ייפגע)." +msgstr[1] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." +msgstr[2] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." +msgstr[3] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." + +msgid "workspace.options.component.annotation" +msgstr "הסבר" + +msgid "workspace.layout_grid.editor.title" +msgstr "רשת עריכה" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "… תרשימי מתאר, סיפורי ותהליכי משתמשים, עצי ניווט ועוד." + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "יהלום" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "ניתוק" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "משולש" + +msgid "workspace.shape.menu.create-annotation" +msgstr "יצירת הסבר" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "חץ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "מייסד/סגן נשיא" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "עיגול" + +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"עצם יצירת חשבון חדש מהווה הסכמה ל[תנאי השירות](%s) ול[מדיניות הפרטיות](%s) " +"שלנו." + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "מספר גרסת הקובץ לא תואם" + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "התגלתה יכולת לא תואמת ‚%s’" + +msgid "labels.share" +msgstr "שיתוף" + +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "להמשיך ביצירת צוות" + +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "להתחיל בלי צוות" + +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "עריכת רשת" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "יציאה מהמערכת" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "איתור" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "בוצע" + +msgid "workspace.top-bar.read-only.done" +msgstr "בוצע" + +msgid "workspace.options.guides.title" +msgstr "קווים מנחים" + +msgid "media.linear" +msgstr "קווי" + +msgid "media.radial" +msgstr "מעגלי" + +msgid "media.gradient" +msgstr "מדרג" + +msgid "media.choose-image" +msgstr "בחירת תמונה" + +msgid "shortcuts.toggle-theme" +msgstr "החלפת ערכת עיצוב" + +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "החלפה לערכת עיצוב כהה" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "הוספת עמודה משמאל" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "מחיקת עמודה וצורות" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "שכפול שורה" + +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"נראה שאין התאמ בין היכולות הפעילות לבין הקובץ שניסית לפתוח. יש להחיל הסבות " +"עבור ‚%s’ לפני שיתאפשר לפתוח את הקובץ הזה." + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "החלפה לערכת עיצוב בהירה" + +msgid "workspace.options.component.swap" +msgstr "החלפת רכיב" + +msgid "workspace.options.component.swap.empty" +msgstr "עדיין אין נכסים בתיקייה הזאת" + +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**מצב חקירה** (צפייה בלבד)" + +msgid "dashboard.import.analyze-error.components-v2" +msgstr "קובץ עם רכיבים בגרסה 2 מופעל אך הצוות הזה לא תומך בזה עדיין." + +msgid "errors.validation" +msgstr "שגיאת אימות" + +msgid "errors.paste-data-validation" +msgstr "נתונים שגויים בלוח הגזירים" + +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "ביטול הגדרה" + +msgid "labels.search" +msgstr "חיפוש" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "אפשר ליצור צוות בהמשך." + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "להמשיך בלי צוות" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "ליצור צוות ולשלוח הזמנות" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "ליצור צוות בלי לשלוח הזמנות" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "ליצור צוות ולהזמין" + +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "ליצור צוות" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "אפשר להזמין בהמשך" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "בטעינה…" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "זרימה" + +msgid "media.image" +msgstr "תמונה" + +msgid "media.solid" +msgstr "אחיד" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "שכפול עמודה" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "הוספת עמודה מימין" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "מחיקת עמודה" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "הוספת שורה למעלה" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "הוספת שורה מתחת" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "מחיקת שורה" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "מחיקת שורה וצורות" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "מיזוג תאים" + +msgid "workspace.context-menu.grid-cells.area" +msgstr "יצירת שטח" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "יצירת לוח" -- Gitee From f3a0f818aa1e3f40922b5c64cc54496ff2060f7a Mon Sep 17 00:00:00 2001 From: Louis Chance Date: Fri, 23 Feb 2024 15:07:26 +0000 Subject: [PATCH 0428/1266] :globe_with_meridians: Add translations for: French. Currently translated at 96.4% (1313 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/ --- frontend/translations/fr.po | 650 +++++++++++++++++++++++++++++++++++- 1 file changed, 645 insertions(+), 5 deletions(-) diff --git a/frontend/translations/fr.po b/frontend/translations/fr.po index 91571b084..48eb87123 100644 --- a/frontend/translations/fr.po +++ b/frontend/translations/fr.po @@ -1,15 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-24 12:55+0000\n" -"Last-Translator: Anonymous \n" -"Language-Team: French " -"\n" +"PO-Revision-Date: 2024-02-24 15:02+0000\n" +"Last-Translator: Louis Chance \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" -"X-Generator: Weblate 5.5.1-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -5044,3 +5044,643 @@ msgstr "Actualiser" msgid "workspace.viewport.click-to-close-path" msgstr "Cliquez pour fermer le chemin" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Développeur" + +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "Une nouvelle version est disponible, merci de rafraîchir la page" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "Beaucoup" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "Comment décririez-vous votre expérience de travail sur..." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canevas" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "En découvrir plus à propos de Penpot" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "Quel est l'outil de design avec lequel vous avez plus d'expérience?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "Je travaille sur un projet personnel" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "Quelle est la taille de votre équipe ?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Comment comptez-vous utiliser Penpot ?" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "Bibliothèque partagée" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Autres (préciser)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Étudiant ou enseignant" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Essayer Penpot avant de l'utiliser en local" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Travailler sur des idées de concept" + +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "Il n'y a pas encore de styles de couleur dans votre bibliothèque" + +msgid "workspace.options.component.copy" +msgstr "Copier" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interactions" +msgstr "Interactions" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-center" +msgstr "Centré en bas" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Vos retours nous aideront à comprendre vos habitudes et préférences afin que " +"nous puissions continuer à améliorer Penpot." + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-push" +msgstr "Pousser" + +msgid "workspace.options.inspect" +msgstr "Inspecter" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Gestionnaire de produit ou de projet" + +msgid "workspace.options.component.create-annotation" +msgstr "Créer une note" + +msgid "viewer.header.inspect-section" +msgstr "Inspecter (%s)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Marketing" + +msgid "workspace.options.opacity" +msgstr "Opacité" + +msgid "workspace.options.component.edit-annotation" +msgstr "Éditer une note" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Obtenir le code du projet de mon équipe " + +msgid "workspace.options.show-in-viewer" +msgstr "Montrer en mode spectateur" + +msgid "workspace.shape.menu.create-multiple-components" +msgstr "Créer plusieurs composants" + +msgid "webhooks.last-delivery.success" +msgstr "Le dernier envoi a réussi." + +msgid "workspace.options.stroke-width" +msgstr "Largeur du tracé" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-out" +msgstr "Ease out" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-self" +msgstr "soi" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-ms" +msgstr "ms" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Rectangle" + +msgid "workspace.options.component.main" +msgstr "Principal" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-starts" +msgstr "Départs des flux" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-position" +msgstr "Position" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Je suis freelance" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-in" +msgstr "Dans" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay" +msgstr "Activer/désactiver la superposition" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow" +msgstr "Flèche triangle" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-slide" +msgstr "Glissement" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "Voir tous les changements" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...image de marque, illustrations, supports marketing, etc." + +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "Il n'y a pas encore de styles typographiques dans votre bibliothèque" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-background" +msgstr "Ajouter une superposition d'arrière-plan" + +msgid "workspace.sidebar.layers.search" +msgstr "Rechercher des calques" + +msgid "shortcuts.zoom-lense-increase" +msgstr "Augmenter le zoom" + +msgid "workspace.shape.menu.add-grid" +msgstr "Ajouter grid layout" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-delay" +msgstr "Délai" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square" +msgstr "Carré" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-between" +msgstr "espace entre" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "Zoom" + +msgid "workspace.options.component.annotation" +msgstr "Note" + +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.more-lib-colors" +msgstr "Plus de couleurs de la bibliothèque" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in" +msgstr "Ease in" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Un peu" + +msgid "workspace.layout_grid.editor.title" +msgstr "Édition de la grille" + +msgid "workspace.header.menu.undo" +msgstr "Annuler" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "Plus que 50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Suivant" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay" +msgstr "Ouvrir la superposition" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-dissolve" +msgstr "Dissolution" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "" +"... wireframes, parcours et flux utilisateurs, arborescence de navigation, " +"etc." + +msgid "workspace.header.menu.disable-scale-content" +msgstr "Désactiver l'échelle proportionnelle" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Commencer" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text-palette" +msgstr "Polices (%s)" + +msgid "workspace.sidebar.layers.frames" +msgstr "Plans de travail" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.hsv" +msgstr "HSV" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete-flow-start" +msgstr "Supprimer le départ du flux" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Diamant" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-offset-effect" +msgstr "Effet de décalage" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row" +msgstr "Ligne" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to" +msgstr "Naviguer vers" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay-dest" +msgstr "Fermer la superposition : %s" + +msgid "workspace.header.menu.redo" +msgstr "Répéter" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column-reverse" +msgstr "Colonne inversée" + +msgid "workspace.assets.duplicate-main" +msgstr "Dupliquer le principal" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Sélectionnez une option" + +msgid "workspace.options.recent-fonts" +msgstr "Récentes" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-pressing" +msgstr "En appuyant" + +msgid "workspace.sidebar.collapse" +msgstr "Réduire la barre latérale" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Designer" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flow-start" +msgstr "Départ du flux" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Aucune" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "C'est parti !" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-flex" +msgstr "Retirer flex layout" + +msgid "workspace.sidebar.layers.components" +msgstr "Composants" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease" +msgstr "Ease" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Détacher" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Sketch" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-relative-to" +msgstr "Relatif à" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.update-components-in-bulk" +msgstr "Mettre à jour les composants" + +msgid "workspace.options.clip-content" +msgstr "Tronquer le contenu" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.select-layer" +msgstr "Sélectionner le calque" + +msgid "workspace.shape.menu.intersection" +msgstr "Intersection" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding" +msgstr "Marge intérieure" + +msgid "title.team-webhooks" +msgstr "Webhooks - %s - Penpot" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library-updates" +msgstr "MISES À JOUR DE LA BIBLIOTHÈQUE" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing" +msgstr "Easing" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Triangle" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row-reverse" +msgstr "Ligne inversée" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export-object" +msgid_plural "workspace.options.export-object" +msgstr[0] "Exporter 1 élément" +msgstr[1] "Exporter %s éléments" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.packed" +msgstr "compacté" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-enter" +msgstr "Entrée de la souris" + +msgid "workspace.assets.open-library" +msgstr "Ouvrir le fichier de la bibliothèque" + +msgid "workspace.header.menu.enable-scale-content" +msgstr "Activer l'échelle proportionnelle" + +msgid "workspace.shape.menu.thumbnail-set" +msgstr "Définir comme miniature" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "Plus d'information" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-hovering" +msgstr "En survolant" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-manual" +msgstr "Manuel" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-leave" +msgstr "Sortie de la souris" + +msgid "workspace.assets.typography.text-styles" +msgstr "Styles de texte" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker" +msgstr "Marqueur cercle" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.gap" +msgstr "Gap" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker" +msgstr "Marqueur carré" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column" +msgstr "Colonne" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation" +msgstr "Animation" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Tester Penpot pour voir si ça convient à mon équipe " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Laisser un commentaire sur mon projet d'équipe" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in-out" +msgstr "Ease in out" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-linear" +msgstr "Linéaire" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-on-click" +msgstr "Au clic" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to-dest" +msgstr "Naviguer vers : %s" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "InVision" + +msgid "workspace.shape.menu.thumbnail-remove" +msgstr "Retirer la miniature" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-around" +msgstr "espace autour" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "Précédent" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay" +msgstr "Fermer la superposition" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker" +msgstr "Marqueur diamant" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-simple" +msgstr "Marge intérieure simple" + +msgid "workspace.shape.menu.create-annotation" +msgstr "Créer une note" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay-dest" +msgstr "Ouvrir la superposition : %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-destination" +msgstr "Destination" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Commencer à travailler sur mon projet" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Flèche" + +msgid "workspace.options.search-font" +msgstr "Rechercher une police" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Quel est votre rôle ?" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-in-assets" +msgstr "Afficher dans le panneau des ressources" + +msgid "workspace.options.interaction-auto" +msgstr "automatique" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Votre bibliothèque est vide. Une fois ajoutées comme Bibliothèque Partagée, " +"les ressources que vous créez seront utilisables dans vos autres fichiers. " +"Voulez-vous vraiment les publier ?" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgb-complementary" +msgstr "Complémentaire en RVB" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.round" +msgstr "Rond" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Fondateur/Direction" + +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.show-fill-on-export" +msgstr "Afficher à l'export" + +msgid "workspace.shape.menu.restore-main" +msgstr "Rétablir le composant principal" + +msgid "workspace.sidebar.expand" +msgstr "Ouvrir la barre latérale" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay-dest" +msgstr "Activer/désactiver la superposition : %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Cercle" + +msgid "workspace.options.stroke-color" +msgstr "Couleur du tracé" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... design d'interface, éléments visuels, systèmes de conception, etc." + +msgid "shortcuts.zoom-lense-decrease" +msgstr "Diminuer le zoom" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "Profil - Jetons d'accès" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow" +msgstr "Flèche de ligne" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-after-delay" +msgstr "Après un délai" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.add-flex" +msgstr "Ajouter flex layout" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Le numéro de version du fichier est incompatible" + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Fonctionnalité incompatible détectée '%s'" + +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Il semble y avoir une incompatibilité entre les fonctionnalités actives et " +"celles du fichier que tentez d'ouvrir. Vous devez activer les migrations " +"pour '%s' avant de pouvoir ouvrir le fichier." -- Gitee From 704103618b616da0e710d6c09ae75ed0d94acb2f Mon Sep 17 00:00:00 2001 From: Edgars Andersons Date: Fri, 8 Mar 2024 12:06:32 +0000 Subject: [PATCH 0429/1266] :globe_with_meridians: Add translations for: Latvian. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/ --- frontend/translations/lv.po | 271 +++++++++++++++++++++++++++++++++++- 1 file changed, 267 insertions(+), 4 deletions(-) diff --git a/frontend/translations/lv.po b/frontend/translations/lv.po index d4076ed81..a4a9a2655 100644 --- a/frontend/translations/lv.po +++ b/frontend/translations/lv.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-25 13:07+0000\n" +"PO-Revision-Date: 2024-03-09 13:01+0000\n" "Last-Translator: Edgars Andersons \n" "Language-Team: Latvian " "\n" @@ -8,9 +8,9 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 " -"<= 19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" -"X-Generator: Weblate 5.5.1-dev\n" +"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= " +"19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" +"X-Generator: Weblate 5.5-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -5316,3 +5316,266 @@ msgstr "Atjaunināt" msgid "workspace.viewport.click-to-close-path" msgstr "Jānoklikšķina, lai aizvērtu ceļu" + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Noteikta nesaderīga iespēja '%s'" + +msgid "errors.paste-data-validation" +msgstr "Starpliktuvē ir nederīgi dati" + +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Turpināt komandas izveidošanu" + +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Uzsākt bez komandas" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Komandu būs iespējams izveidot vēlāk." + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Turpināt bez komandas" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Izveidot komandu un nosūtīt uzaicinājumus" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Izveidot komandu un uzaicināt" + +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Izveidot komandu" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Uzaicināt būs iespējams vēlāk" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Izstrādātājs" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Iziet" + +msgid "media.image" +msgstr "Attēls" + +msgid "media.solid" +msgstr "Viengabalains" + +msgid "media.linear" +msgstr "Līnijveida" + +msgid "media.radial" +msgstr "Radiāls" + +msgid "media.gradient" +msgstr "Pāreja" + +msgid "media.choose-image" +msgstr "Izvēlēties attēlu" + +msgid "workspace.options.guides.title" +msgstr "Vadotnes" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Datnei ir nesaderīgs versijas numurs" + +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Izskatās, ka ir nesaderība starp iespējotajām iespējām un iespējām datnē, " +"kuru tiek mēģināts atvērt. Jāpiemēro '%s' migrācijas, pirms datne var tikt " +"atvērta." + +msgid "errors.validation" +msgstr "Pārbaudes kļūda" + +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Atiestatīt" + +msgid "labels.share" +msgstr "Kopīgot" + +msgid "labels.search" +msgstr "Meklēt" + +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Ar jauna konta izveidošanu tiek piekrists mūsu [pakalpojuma noteikumiem](%s) " +"un [privātuma nosacījumiem](%s)." + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Izveidot komandu bez uzaicināšanas" + +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Labot režģi" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Noteikt atrašanās vietu" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Darīts" + +msgid "workspace.options.component.swap" +msgstr "Mijmainīt sastāvdaļu" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Plūsma" + +msgid "workspace.top-bar.read-only.done" +msgstr "Darīts" + +msgid "workspace.options.component.swap.empty" +msgstr "Šajā bibliotēkā vēl nav līdzekļu" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Bulta" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Trijstūris" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Taisnstūris" + +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**Apskatīšana** (tikai skatīt)" + +msgid "workspace.assets.duplicate-main" +msgstr "Divkāršot galveno" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Modelētājs" + +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "%s datņu tika veiksmīgi ievietotas." +msgstr[1] "%s datne tika veiksmīgi ievietota." +msgstr[2] "%s datnes tika veiksmīgi ievietotas." + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Bibliotēka ir tukša. Tiklīdz tā būs pievienota kā koplietojama bibliotēka, " +"izveidotie līdzekļi būs pieejami izmantošanai pārējos failos. Vai tiešām " +"padarīt to pieejamu?" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Atdalīt" + +msgid "workspace.options.component.copy" +msgstr "Ievietot starpliktuvē" + +msgid "workspace.options.component.main" +msgstr "Galvenais" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Aplis" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Dimants" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "" +"Līdzekļi, kas jau tiek izmantoti šajā datnē, paliks tajā (dizains netiks " +"salauzts)." +msgstr[1] "" +"Līdzeklis, kas jau tiek izmantots šajā datnē, paliks tajā (dizains netiks " +"salauzts)." +msgstr[2] "" +"Līdzekļi, kas jau tiek izmantoti šajā datnē, paliks tajā (dizains netiks " +"salauzts)." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Tirgvedība" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Dibinātājs/viceprezidents" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Produktu vai projektu vadītājs" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Kāda ir ieņemamā loma?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Students vai pasniedzējs" + +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "Ir pieejama jauna versija, lūgums atsvaidzināt lapu" + +msgid "workspace.layout_grid.editor.title" +msgstr "Režģa labošana" + +msgid "shortcuts.toggle-theme" +msgstr "Mainīt izskatu" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "Pārslēgties uz gaišo izskatu" + +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Pārslēgties uz tumšo izskatu" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Divkāršota sleja" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Izdzēst sleju" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Izdzēst slejas un apveidus" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Divkāršot rindu" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Pievienot 1 rindu virs" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Pievienot 1 sleju pa labi" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Pievienot 1 sleju pa kreisi" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Pievienot 1 rindu zem" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Izdzēst rindu" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Izdzēst rindu un apveidus" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Apvienot šūnas" + +msgid "workspace.context-menu.grid-cells.area" +msgstr "Izveidot laukumu" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Izveidot plātni" + +msgid "dashboard.import.analyze-error.components-v2" +msgstr "" +"Datne ar v2 sastāvdaļām ir aktivizēta, bet šī komanda to vēl neatbalsta." + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Ielādē…" -- Gitee From 04359701a3d8656d2b55ddc569b953548a951eae Mon Sep 17 00:00:00 2001 From: Stas Haas Date: Thu, 21 Mar 2024 15:14:58 +0000 Subject: [PATCH 0430/1266] :globe_with_meridians: Add translations for: German. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/ --- frontend/translations/de.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/translations/de.po b/frontend/translations/de.po index 199709462..3c5067ee4 100644 --- a/frontend/translations/de.po +++ b/frontend/translations/de.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-15 15:01+0000\n" +"PO-Revision-Date: 2024-03-22 16:01+0000\n" "Last-Translator: Stas Haas \n" "Language-Team: German " "\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.5.1-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -5335,7 +5335,7 @@ msgid "workspace.viewport.click-to-close-path" msgstr "Klicken Sie, um den Pfad zu schließen" msgid "workspace.options.component.copy" -msgstr "Kopieren" +msgstr "Kopie" #: src/app/main/ui/onboarding/questions.cljs msgid "questions.developer" @@ -5358,7 +5358,7 @@ msgid "workspace.options.stroke-cap.square-marker-short" msgstr "Rechteck" msgid "workspace.options.component.main" -msgstr "Main" +msgstr "Hauptkomponente" #: src/app/main/ui/onboarding/questions.cljs msgid "questions.freelancer" -- Gitee From f9514f62a7691c0a4e90d95b9d96a9ed13fb0e63 Mon Sep 17 00:00:00 2001 From: Linerly Date: Sun, 7 Apr 2024 14:05:31 +0000 Subject: [PATCH 0431/1266] :globe_with_meridians: Add translations for: Indonesian. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/ --- frontend/translations/id.po | 215 +++++++++++++++++++++++++++++++++++- 1 file changed, 210 insertions(+), 5 deletions(-) diff --git a/frontend/translations/id.po b/frontend/translations/id.po index c29981ce9..151a04883 100644 --- a/frontend/translations/id.po +++ b/frontend/translations/id.po @@ -1,15 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-24 12:55+0000\n" -"Last-Translator: Anonymous \n" -"Language-Team: Indonesian " -"\n" +"PO-Revision-Date: 2024-04-08 15:01+0000\n" +"Last-Translator: Linerly \n" +"Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.5.1-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -5164,3 +5164,208 @@ msgstr "Perbarui" msgid "workspace.viewport.click-to-close-path" msgstr "Klik untuk menutup jalur" + +msgid "workspace.options.component.copy" +msgstr "Salin" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Persegi panjang" + +msgid "workspace.options.component.main" +msgstr "Utama" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Berlian" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Copot" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Segitiga" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Tanda panah" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Pustaka Anda saat ini kosong. Ketika ditambahkan sebagai Pustaka Terbagi, " +"aset yang Anda buat akan tersedia untuk digunakan bersama dengan berkas " +"Anda. Apakah Anda yakin ingin menerbitkannya?" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Lingkaran" + +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Ketika membuat akun baru, Anda menyetujui [persyaratan layanan](%s) dan [" +"kebijakan privasi](%s) kami." + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Berkas memiliki nomor versi tidak kompatibel" + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Fitur '%s' tidak kompatibel terdeteksi" + +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Tidak ditetapkan" + +msgid "labels.share" +msgstr "Bagikan" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Buat tim dan kirim undangan" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Cari lokasi" + +msgid "workspace.options.component.swap" +msgstr "Ganti komponen" + +#, markdown +msgid "workspace.top-bar.read-only" +msgstr "**Mode inspeksi** (Hanya Tampilan)" + +msgid "media.gradient" +msgstr "Gradien" + +msgid "media.choose-image" +msgstr "Pilih gambar" + +msgid "media.solid" +msgstr "Padat" + +msgid "media.linear" +msgstr "Linear" + +msgid "media.radial" +msgstr "Radial" + +msgid "dashboard.import.analyze-error.components-v2" +msgstr "Berkas dengan komponen v2 diaktifkan tetapi tim ini belum mendukungnya." + +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Sepertinya ada ketidakcocokan antara fitur yang diaktifkan dengan fitur " +"berkas yang sedang Anda buka. Migrasi untuk '%s' harus diterapkan sebelum " +"berkasnya dapat dibuka." + +msgid "errors.validation" +msgstr "Kesalahan Validasi" + +msgid "errors.paste-data-validation" +msgstr "Data tidak valid dalam papan klip" + +msgid "labels.search" +msgstr "Cari" + +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Lanjutkan membuat tim" + +msgid "shortcuts.toggle-theme" +msgstr "Ubah tema" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Selesai" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Keluar" + +msgid "workspace.top-bar.read-only.done" +msgstr "Selesai" + +msgid "media.image" +msgstr "Gambar" + +msgid "workspace.options.guides.title" +msgstr "Panduan" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Hapus baris" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Hapus baris dan bentuk" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Gabungkan sel" + +msgid "workspace.context-menu.grid-cells.area" +msgstr "Buat area" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Buat papan" + +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Mulai tanpa tim" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Anda nanti akan dapat membuat tim." + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Lanjutkan tanpa tim" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Buat tim tanpa mengundang" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Buat tim & undang" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Anda nanti akan dapat mengundang" + +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Buat tim" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "Ubah ke tema terang" + +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Ubah ke tema gelap" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Memuat…" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Alur" + +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Sunting kisi" + +msgid "workspace.options.component.swap.empty" +msgstr "Belum ada aset dalam pustaka ini" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Gandakan kolom" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Tambah 1 kolom ke kiri" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Tambah 1 kolom ke kanan" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Hapus kolom" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Hapus kolom dan bentuk" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Gandakan baris" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Tambah 1 baris di atas" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Tambah 1 baris di bawah" -- Gitee From aae02bfedbb18e41258f4a66ba1599a5e1e181fe Mon Sep 17 00:00:00 2001 From: Edgars Andersons Date: Thu, 18 Apr 2024 07:49:49 +0000 Subject: [PATCH 0432/1266] :globe_with_meridians: Add translations for: Latvian. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/ --- frontend/translations/lv.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/translations/lv.po b/frontend/translations/lv.po index a4a9a2655..36a2e4a54 100644 --- a/frontend/translations/lv.po +++ b/frontend/translations/lv.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-03-09 13:01+0000\n" +"PO-Revision-Date: 2024-04-19 08:03+0000\n" "Last-Translator: Edgars Andersons \n" "Language-Team: Latvian " "\n" -- Gitee From 0fd31c253acdd219b306d470d32bfa5d61db4a7a Mon Sep 17 00:00:00 2001 From: TheScientistPT Date: Fri, 19 Apr 2024 22:48:04 +0000 Subject: [PATCH 0433/1266] :globe_with_meridians: Add translations for: Portuguese (Portugal). Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/ --- frontend/translations/pt_PT.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/translations/pt_PT.po b/frontend/translations/pt_PT.po index dc96bdf76..7ab56fe65 100644 --- a/frontend/translations/pt_PT.po +++ b/frontend/translations/pt_PT.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-12 19:02+0000\n" +"PO-Revision-Date: 2024-04-20 23:07+0000\n" "Last-Translator: TheScientistPT \n" "Language-Team: Portuguese (Portugal) \n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.5.1-dev\n" +"X-Generator: Weblate 5.5-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -402,8 +402,8 @@ msgstr "Duplicar %s ficheiros" msgid "dashboard.empty-placeholder-drafts" msgstr "" "Os ficheiros adicionados às Bibliotecas irão aparecer aqui. Experimenta " -"adicionar os teus ficheiros ou experimenta algumas das nossas [Bibliotecas " -"e templates](https://penpot.app/libraries-templates.html)." +"adicionar os teus ficheiros ou experimenta algumas das nossas [Bibliotecas e " +"templates](https://penpot.app/libraries-templates.html)." msgid "dashboard.export-binary-multi" msgstr "Descarrega %s ficheiros Penpot (.penpot)" -- Gitee From 1f4266ffe47c1eda46d694cbc6d992a6a7c3a0ce Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Wed, 24 Apr 2024 14:52:04 +0200 Subject: [PATCH 0434/1266] Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ --- frontend/translations/af.po | 80 ++ frontend/translations/ar.po | 1441 ++++++++++++++++++++ frontend/translations/cs.po | 571 ++++++++ frontend/translations/de.po | 16 - frontend/translations/es.po | 77 +- frontend/translations/es_419.po | 154 +++ frontend/translations/ha.po | 2262 ++++++++++++++++++++++++++++++- frontend/translations/he.po | 17 - frontend/translations/id.po | 4 - frontend/translations/ig.po | 8 - frontend/translations/lv.po | 17 - frontend/translations/ms.po | 14 - frontend/translations/nl.po | 19 - frontend/translations/pt_PT.po | 4 - frontend/translations/tr.po | 19 - frontend/translations/yo.po | 36 - frontend/translations/zh_CN.po | 517 +++++++ 17 files changed, 5091 insertions(+), 165 deletions(-) diff --git a/frontend/translations/af.po b/frontend/translations/af.po index 14d5e8519..28d9148cd 100644 --- a/frontend/translations/af.po +++ b/frontend/translations/af.po @@ -11,6 +11,86 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.1-dev\n" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "30 dae" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.add-shared" +msgstr "Voeg by as Gedeelde Biblioteek" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "Die token het nie 'n verval datum nie" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-gitlab-submit" +msgstr "GitLab" + +msgid "common.share-link.placeholder" +msgstr "Deelbare skakel sal hier verskyn" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-title" +msgstr "Wagwoord vergeet?" + +msgid "common.share-link.current-tag" +msgstr "(huidige)" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.invalid-token-error" +msgstr "Die hersteltoken is ongeldig." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "Genereer nuwe token" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "auth.notifications.team-invitation-accepted" +msgstr "Het suksesvol by die span aangesluit" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.title" +msgstr "Span saam!" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "180 dae" + +msgid "dashboard.export-frames" +msgstr "Voer borde as PDF uit" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-profile" +msgstr "Wil jy dit net probeer?" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-submit" +msgstr "Herstel Wagwoord" + +#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs +msgid "dashboard.copy-suffix" +msgstr "(kopieer)" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "Die naam word vereis" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.create-new-team" +msgstr "Skep 'n nuwe span" + +msgid "common.share-link.destroy-link" +msgstr "Vernietig skakel" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.copied-success" +msgstr "Token gekopieer" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.info" +msgstr "Gaan stap deur Penpot en leer sy hoofkenmerke ken." + #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" msgstr "Reeds 'n rekening?" diff --git a/frontend/translations/ar.po b/frontend/translations/ar.po index aa4b75c87..d385af66f 100644 --- a/frontend/translations/ar.po +++ b/frontend/translations/ar.po @@ -4306,3 +4306,1444 @@ msgstr "تحديث" msgid "workspace.viewport.click-to-close-path" msgstr "انقر لتغلق المسار" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-out" +msgstr "خارج" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.move" +msgstr "تحريك (%s)" + +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "لا يوجد أنماط اللون في مكتبتك" + +msgid "workspace.options.component.copy" +msgstr "النسخ" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interactions" +msgstr "التفاعلات" + +msgid "workspace.undo.entry.multiple.circle" +msgstr "دوائر" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-action" +msgstr "فعل" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-center" +msgstr "المركز السفلي" + +msgid "workspace.shape.menu.transform-to-path" +msgstr "تحويل الى المسار" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-push" +msgstr "دفع" + +msgid "workspace.options.inspect" +msgstr "Inspectفحص" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-center" +msgstr "المركز العلوي" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.multiply" +msgstr "تضاعف" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.letter-spacing" +msgstr "تباعد الحروف" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.direction-rtl" +msgstr "RTL" + +msgid "workspace.options.component.create-annotation" +msgstr "إنشاء حاشية" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-auto-width" +msgstr "العرض التلقائي" + +msgid "workspace.options.shadow-options.color" +msgstr "لون الظل" + +msgid "viewer.header.inspect-section" +msgstr "التفحص (%s)" + +msgid "workspace.shape.menu.flatten" +msgstr "تسطيح" + +msgid "workspace.header.menu.hide-pixel-grid" +msgstr "إخفاء تشبيك اللوحة" + +msgid "workspace.undo.entry.multiple.page" +msgstr "صفحات" + +msgid "shortcuts.ungroup" +msgstr "فك التجميع" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.empty" +msgstr "لا يوجد تغييرات في التاريخ الى الآن" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin-simple" +msgstr "هامش بسيط" + +msgid "workspace.undo.entry.multiple.rect" +msgstr "مستطيلات" + +msgid "shortcuts.zoom-selected" +msgstr "كبر المحدد" + +msgid "workspace.options.grid.params.color" +msgstr "لون" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.group" +msgstr "مجموعة" + +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs +msgid "workspace.options.size-presets" +msgstr "الإعدادات المسبقة للحجم" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin" +msgstr "هامش" + +msgid "workspace.options.opacity" +msgstr "العتامة" + +msgid "workspace.options.component.edit-annotation" +msgstr "تحرير حاشية" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.file" +msgstr "الملف" + +msgid "workspace.undo.entry.multiple.media" +msgstr "الأصول الرسومية" + +msgid "workspace.options.show-in-viewer" +msgstr "أظهر في وضع العرض" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.lowercase" +msgstr "أحرف صغيرة" + +msgid "workspace.undo.entry.multiple.group" +msgstr "مجموعات" + +msgid "workspace.shape.menu.create-multiple-components" +msgstr "إنشاء عناصر جديدة" + +msgid "webhooks.last-delivery.success" +msgstr "محاذاة المركز الأفقي" + +msgid "workspace.options.stroke-width" +msgstr "عرض الضرب" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-out" +msgstr "خفف خارج" + +msgid "workspace.options.x" +msgstr "X محور" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-self" +msgstr "الذات" + +msgid "workspace.shape.menu.path" +msgstr "طريق" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsety" +msgstr "Y" + +msgid "workspace.focus.focus-mode" +msgstr "وضع التركيز" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-ms" +msgstr "القوائم" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.right" +msgstr "يمين" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.ellipse" +msgstr "الشكل البيضاوي (%s)" + +msgid "workspace.sidebar.layers.groups" +msgstr "مجموعات" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "مستطيل" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-left" +msgstr "أعلى اليسار" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.color-palette" +msgstr "لوحة اللون (%s)" + +msgid "workspace.undo.entry.multiple.frame" +msgstr "لوحة" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-min-h" +msgstr "الحد الأدنى للطول" + +msgid "workspace.path.actions.add-node" +msgstr "أضف العقدة (%s)" + +msgid "workspace.options.component.main" +msgstr "أصل" + +msgid "workspace.undo.entry.single.frame" +msgstr "لوحة" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-starts" +msgstr "جاري التخطيط" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-position" +msgstr "موضع" + +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.more-colors" +msgstr "المزيد من الألوان" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-bottom" +msgstr "محاذاة الأسفل" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.new" +msgstr "جديد %s" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.create-artboard-from-selection" +msgstr "تحديد محتوى اللوحة" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-top-right" +msgstr "أعلى اليمين" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-in" +msgstr "داخل" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay" +msgstr "تبديل التراكب" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow" +msgstr "سهم المثلث" + +msgid "workspace.undo.entry.multiple.curve" +msgstr "منحنيات" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-guides" +msgstr "إبطال الفرقعة للخ\\وط الإرشادية" + +msgid "workspace.path.actions.snap-nodes" +msgstr "كسر العقد (%s)" + +msgid "workspace.undo.entry.multiple.multiple" +msgstr "أشياء" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-slide" +msgstr "انزلاق" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-min-w" +msgstr "الحد الأدنى للعرض" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-min-h" +msgstr "الحد الأدنو للارتفاع" + +msgid "workspace.sidebar.layers.masks" +msgstr "قناعات" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.screen" +msgstr "شاشة" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "رؤية جميع التغييرات" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.inner-shadow" +msgstr "التظليل الداخلي" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.frame" +msgstr "لوحة (%s)" + +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "لا يوجد أنماط الكتابة في مكتبتك" + +#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.paste" +msgstr "معجون" + +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.selection-fill" +msgstr "اختر نوع الملأ" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-middle" +msgstr "محاذاة الوسط" + +msgid "viewer.breaking-change.description" +msgstr "" +"وصف كسر التغييرThis shareable link is no longer valid. Create a new one or " +"ask the owner for a new one.هذا الرابط القابل للمشاركة لم يعد صالحا.صمم " +"جديدا أو اسأل مالكه للجديد" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-background" +msgstr "إضافة تراكب الخلفية" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.unknown" +msgstr "انتهت العملية %s" + +msgid "shortcuts.zoom-lense-increase" +msgstr "زيادة عدسة التكبير" + +msgid "workspace.shape.menu.add-grid" +msgstr "إضافة تخطيط التشبيك" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-complete" +msgstr "تم التصدير" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-delay" +msgstr "تأخير" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.luminosity" +msgstr "لمعان" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flip-vertical" +msgstr "التوجيه الرئسي" + +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.position" +msgstr "الموضع" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square" +msgstr "مربع" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-justify" +msgstr "تعديل (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-between" +msgstr "التباعد بين" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.uppercase" +msgstr "الأحرف الكبيرة" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "تكبير" + +msgid "workspace.options.component.annotation" +msgstr "حاشية" + +msgid "shortcuts.toggle-layers" +msgstr "تبديل الطبقات" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-preserve-scroll" +msgstr "حفظ موضع التمرير" + +msgid "workspace.undo.entry.single.typography" +msgstr "أصل الكتابة" + +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.selection-color" +msgstr "الألوان المختارة" + +#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs +msgid "workspace.options.more-lib-colors" +msgstr "المزيد من ألوان المكتبة" + +msgid "workspace.header.menu.disable-snap-pixel-grid" +msgstr "إبطال الفرقعة للبكسل" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in" +msgstr "خفف داخل" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.solid" +msgstr "صلب" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.delete" +msgstr "محذوف %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.top" +msgstr "أعلى" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius.single-corners" +msgstr "زوايا مستقلة" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.dotted" +msgstr "منقط" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-artboard-names" +msgstr "إخفاء أسماء البورد" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.backward" +msgstr "أرسل الى الخلف" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.select-a-shape" +msgstr "اختر الشكل أو اللوحة لجر الإتصال الى لوحة أو شكل آخر" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke" +msgstr "ضرب" + +msgid "workspace.layout_grid.editor.title" +msgstr "تحرير التشبيك" + +msgid "workspace.undo.entry.single.page" +msgstr "صفحة" + +#: src/app/main/ui/dashboard/team.cljs +msgid "team.webhooks.max-length" +msgstr "يجب الا يزيد اسم الويبهوك على 2048 حرفا" + +msgid "workspace.sidebar.layers.images" +msgstr "صور" + +msgid "workspace.header.menu.show-pixel-grid" +msgstr "Show pixel grid" + +msgid "workspace.header.menu.undo" +msgstr "الإلغاء" + +msgid "workspace.undo.entry.single.color" +msgstr "أصل اللون" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.line-height" +msgstr "ارتفاع الخط" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.ungroup" +msgstr "فك التجميع" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-auto-height" +msgstr "الإرتفاع التلقائي" + +msgid "workspace.focus.focus-on" +msgstr "تشغيل التركيز" + +msgid "viewer.header.comments-section" +msgstr "التعليقات (%s)" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.unlock" +msgstr "الغاء القفل" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-bottom-right" +msgstr "أسفل اليمين" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay" +msgstr "فتح التراكب" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-dissolve" +msgstr "تذوب" + +msgid "workspace.undo.entry.single.rect" +msgstr "مستطيل" + +msgid "shortcuts.toggle-visibility" +msgstr "أظهر\\أخف" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-full-screen" +msgstr "تكبير الشاشة" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.cut" +msgstr "قطع" + +msgid "workspace.header.menu.disable-scale-content" +msgstr "Disable proportional scale" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object-slow" +msgstr "التصدير بطيء بشكل غير متوقع" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.lock" +msgstr "إغلاق" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.modify" +msgstr "معدل %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin-all" +msgstr "جميع النواحي" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.strikethrough" +msgstr "الإضراب من خلال(%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.reset-overrides" +msgstr "إعادة ضبط التجاوزات" + +msgid "workspace.undo.entry.multiple.typography" +msgstr "أصول الكتابة" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-center" +msgstr "محاذاة المركز (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text-palette" +msgstr "الكتابات (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.titlecase" +msgstr "Title case" + +msgid "workspace.sidebar.layers.frames" +msgstr "لوحات" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fit" +msgstr "تقليص المقياس للتناسب" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object-error" +msgstr "Export failed" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.hsv" +msgstr "HSV" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete-flow-start" +msgstr "حذف المخطط" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-left" +msgstr "اأسفل اليسار" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "الماس" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-offset-effect" +msgstr "تأثير الإزاحة" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.mixed" +msgstr "مختلط" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgba" +msgstr "RGBA" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row" +msgstr "الصف" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to" +msgstr "الإنتقال الى" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.inner" +msgstr "داخل" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.underline" +msgstr "تسطير (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay-dest" +msgstr "إغلاق التراكب: %s" + +msgid "workspace.header.menu.redo" +msgstr "إعادة" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.detach-instance" +msgstr "فصل المثال" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-right" +msgstr "محاذاة اليمين (%s)" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-textpalette" +msgstr "أظهر لوخة أسلوب الخط" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flip-horizontal" +msgstr "Flip horizontal" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.hard-light" +msgstr "ضوء الثابت" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-max-w" +msgstr "أقصى عرض" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column-reverse" +msgstr "العموج العكسي" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.front" +msgstr "النقل الى الأمام" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-center" +msgstr "مركز" + +msgid "workspace.undo.entry.single.multiple" +msgstr "عنصر" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.add-interaction" +msgstr "انقر على زر +لإضافة التفاعلات" + +msgid "workspace.shape.menu.difference" +msgstr "الفارق" + +msgid "workspace.assets.duplicate-main" +msgstr "انسخ الأصل" + +msgid "workspace.undo.entry.multiple.path" +msgstr "مسارات" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-right" +msgstr "أسفل اليمين" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-main" +msgstr "أظهر المكون الرئيسي" + +msgid "shortcuts.v-distribute" +msgstr "النشر عموديا" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.grid-title" +msgstr "تشبيك" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsetx" +msgstr "X" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.none" +msgstr "لا شيء" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.exclusion" +msgstr "الإستبعاد" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.title" +msgstr "تاريخ" + +msgid "workspace.options.recent-fonts" +msgstr "مؤخر" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-textpalette" +msgstr "إخفاء لوحة أسلوب خط" + +msgid "workspace.undo.entry.single.component" +msgstr "component" + +msgid "workspace.assets.local-library" +msgstr "المكتبة المحلية" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.unmask" +msgstr "كشف القناع" + +msgid "shortcuts.toggle-textpalette" +msgstr "تبديل لوحة النص" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-top" +msgstr "محاذاة أعلى" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-pressing" +msgstr "حين الضغط" + +msgid "workspace.sidebar.collapse" +msgstr "انهيار الشريط الجانبي" + +msgid "workspace.options.height" +msgstr "طول" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.update-main" +msgstr "تحديث العنصر الرئيسي" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flow-start" +msgstr "بداية المخطط" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-flex" +msgstr "إزالة تخطيط المنحنى" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-start" +msgstr "إضافة المخطط" + +msgid "workspace.sidebar.layers.components" +msgstr "العناصر" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease" +msgstr "خفف" + +#: src/app/main/ui/workspace/sidebar/options/menus/svg_attrs.cljs, src/app/main/ui/inspect/attributes/svg.cljs +msgid "workspace.sidebar.options.svg-attrs.title" +msgstr "السمات المستوردةSVG" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.comments" +msgstr "تعليقات (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-none" +msgstr "لا شيء" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.lighten" +msgstr "تفتيح" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export-multiple" +msgstr "تحديد المصدر" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.hide" +msgstr "إخفاء" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.retry" +msgstr "أعد المحاولة" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-relative-to" +msgstr "بالنسبة الى" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.update-components-in-bulk" +msgstr "تحديث العناصر الرئيسية" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.sidebar.history" +msgstr "التاريخ (%s)" + +msgid "workspace.options.clip-content" +msgstr "محتوى المقطع" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.path" +msgstr "مسار (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius.all-corners" +msgstr "كل الزوايا" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-right" +msgstr "أعلى اليمين" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.select-layer" +msgstr "اختيار الطبقة" + +msgid "workspace.undo.entry.single.image" +msgstr "صورة" + +msgid "workspace.shape.menu.intersection" +msgstr "التفاعلات" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-trigger" +msgstr "مشغل" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.shortcuts" +msgstr "الإختصار (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding" +msgstr "حشوة" + +msgid "title.team-webhooks" +msgstr "خطافات الويب - %s - Penpot" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library-updates" +msgstr "تحديث المكتبة" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.none" +msgstr "لا شيء" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-none" +msgstr "(غير مهيء)" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing" +msgstr "تخفيف" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "المثلث" + +msgid "workspace.path.actions.draw-nodes" +msgstr "جر العقدة (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row-reverse" +msgstr "الصف العكسي" + +msgid "workspace.undo.entry.single.media" +msgstr "أصل الرسومات" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.packed" +msgstr "معباة" + +msgid "workspace.header.menu.enable-snap-pixel-grid" +msgstr "تمكين الفرقعة للبكسل" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-enter" +msgstr "إدخال الفأرة" + +msgid "workspace.undo.entry.single.circle" +msgstr "دائرة" + +msgid "viewer.header.interactions-section" +msgstr "التفاعلات (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title.group" +msgstr "ظل المجموعة" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title.group" +msgstr "طبقات المجموعة" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.reset-zoom" +msgstr "إعادة ضبط" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.assets" +msgstr "أصول" + +msgid "workspace.assets.open-library" +msgstr "افتح ملف المكتب" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title-selection" +msgstr "نص الإختيار" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "مكتبة مشتركة" + +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.size" +msgstr "مقاس" + +msgid "workspace.undo.entry.multiple.component" +msgstr "عناصر" + +msgid "workspace.focus.selection" +msgstr "تحديد" + +msgid "workspace.path.actions.merge-nodes" +msgstr "دمج العقد (%s)" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.create-component" +msgstr "إنشاء نعصر" + +msgid "workspace.undo.entry.multiple.color" +msgstr "أصول اللون" + +msgid "workspace.header.menu.enable-scale-content" +msgstr "تمكين المقياس النسبي" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.group-stroke" +msgstr "ضرب المجموعة" + +msgid "workspace.shape.menu.union" +msgstr "اتحاد" + +msgid "workspace.shape.menu.thumbnail-set" +msgstr "تعيين كصورة مصغرة" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fill" +msgstr "مقياس الملأ" + +msgid "workspace.sidebar.layers.texts" +msgstr "نصوص" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-left" +msgstr "محاذاة (%s)" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.dismiss" +msgstr "رفض" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.duplicate" +msgstr "ينسخ" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "مزيد من المعلومات" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.forward" +msgstr "النقل الى الأمام" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-hovering" +msgstr "حين التحوم" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show" +msgstr "العرض" + +msgid "workspace.shape.menu.hide-ui" +msgstr "أظهر أو إخف UI" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.center" +msgstr "مركز" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-manual" +msgstr "يدوي" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.sidebar.layers" +msgstr "الطبقات" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-leave" +msgstr "إخراج الفأرة" + +msgid "workspace.assets.typography.text-styles" +msgstr "أسلوب خط النص" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker" +msgstr "معلم الدائرة" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-min-w" +msgstr "الحد الأدنى للعرض" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.gap" +msgstr "فجوة" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker" +msgstr "معلم المربع" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column" +msgstr "عمود" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation" +msgstr "الرسومات المتحركة" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.drop-shadow" +msgstr "إسقاط الظل" + +msgid "workspace.undo.entry.single.curve" +msgstr "منحنى" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.overlay" +msgstr "تراكب" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in-out" +msgstr "خفف داخل و خارج" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-guides" +msgstr "الفرقعة للخطوط الإرشادية" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-linear" +msgstr "خطي" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-on-click" +msgstr "بعد النقر" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to-dest" +msgstr "انتقال الى: %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.spread" +msgstr "الانتشار" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.bottom" +msgstr "أسفل" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-duration" +msgstr "مدة" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.advanced-ops" +msgstr "خيارات متقدمة" + +msgid "shortcuts.toggle-zoom-style" +msgstr "تبديل أسلوب التكبير" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-outside" +msgstr "عطل إذا نقر في الخارج" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.blur" +msgstr "تطميس" + +msgid "workspace.path.actions.separate-nodes" +msgstr "فصل العقد (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.selection-stroke" +msgstr "ضرب الإختيار" + +#: src/app/main/ui/workspace/sidebar/options.cljs +msgid "workspace.options.prototype" +msgstr "النموذج المبدئي" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.use-play-button" +msgstr "استعمل زر التشغيل أعلاه لتشغيل منظر النموذج المبدئي." + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.hue" +msgstr "مسحة" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-artboard-names" +msgstr "أظهر أسماء البورد" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.dashed" +msgstr "متقطع" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.left" +msgstr "شمال" + +msgid "workspace.shape.menu.thumbnail-remove" +msgstr "أطهر الصورة المصغرة" + +msgid "shortcuts.toggle-layout-flex" +msgstr "أضف\\أزل ثني التخطيط" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-around" +msgstr "التباعد حول" + +msgid "workspace.options.width" +msgstr "عرض" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.rect" +msgstr "مستطيل (%s)" + +msgid "workspace.undo.entry.single.group" +msgstr "مجموعة" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-max-w" +msgstr "أقصى عرض" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.sitemap" +msgstr "خريطة الموقع" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-bottom-left" +msgstr "أسفل اليسار" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay" +msgstr "إغلاق التراكب" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker" +msgstr "معلم الماس" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.soft-light" +msgstr "ضوء خافت" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-simple" +msgstr "حشوة بسيطة" + +msgid "workspace.shape.menu.create-annotation" +msgstr "إنشاء تعليق توضيحي" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-selected" +msgstr "تكبير" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay-dest" +msgstr "فتح التراكب: %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-url" +msgstr "رابط مفتوح" + +msgid "workspace.path.actions.delete-node" +msgstr "احذف العقدة (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-destination" +msgstr "وجهة" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.go-main" +msgstr "انتقل الى ملف العنصر الأصلي" + +msgid "shortcuts.undo" +msgstr "الغاء" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "سهم" + +msgid "workspace.path.actions.make-curve" +msgstr "الى المنحنى (%s)" + +msgid "workspace.options.search-font" +msgstr "البخث عن نوع الخط" + +msgid "workspace.path.actions.move-nodes" +msgstr "نقل العقد (%s)" + +msgid "workspace.path.actions.join-nodes" +msgstr "صل العقد (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-url" +msgstr "الرابط المفتوح" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.move" +msgstr "المكونات المعدلة" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title.multiple" +msgstr "الطبقات المحددة" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.direction-ltr" +msgstr "LTR" + +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-invitations" +msgstr "الدعوات - %s - Penpot" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete" +msgstr "حذف" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-in-assets" +msgstr "العرض في لوحة الاصول" + +msgid "workspace.undo.entry.multiple.shape" +msgstr "أشكال" + +msgid "workspace.options.interaction-auto" +msgstr "تلقائي" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title.multiple" +msgstr "ظلال الإختيار" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-prev-screen" +msgstr "الشاشة السابقة" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text" +msgstr "نص (%s)" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.copy" +msgstr "انسخ" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.curve" +msgstr "منحنى (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-all" +msgstr "جميع النواحي" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title" +msgstr "نص" + +msgid "shortcuts.underline" +msgstr "الخط التحتي" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgb-complementary" +msgstr "RGB مكملات" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.edit" +msgstr "التحرير" + +msgid "shortcuts.unmask" +msgstr "كشف القناع" + +msgid "workspace.options.y" +msgstr "Y محور" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.round" +msgstr "دائري" + +msgid "shortcuts.toggle-lock" +msgstr "قفل\\فتح" + +msgid "viewer.breaking-change.message" +msgstr "آسف" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title" +msgstr "طبقة" + +msgid "workspace.undo.entry.multiple.text" +msgstr "نصوص" + +msgid "workspace.sidebar.layers.shapes" +msgstr "بسومات" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.add-flow-start" +msgstr "إضافة المخطط" + +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.show-fill-on-export" +msgstr "أظهر في المصدر" + +msgid "shortcuts.toggle-lock-size" +msgstr "قفل النسب" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-max-h" +msgstr "أقصى ارتفاع" + +msgid "workspace.shape.menu.restore-main" +msgstr "استعادة العنصر الرئيسي" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.saturation" +msgstr "التشبع" + +msgid "workspace.sidebar.expand" +msgstr "توسيع الشريط الجانبي" + +#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.mask" +msgstr "قناع" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay-dest" +msgstr "تبديل التراكب: %s" + +msgid "workspace.path.actions.make-corner" +msgstr "الى الزاوية (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "الدائرة" + +msgid "workspace.options.stroke-color" +msgstr "لون الضرب" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.outer" +msgstr "خارج" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-top-left" +msgstr "أعلى الشمال" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.normal" +msgstr "عادي" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.preferences" +msgstr "التفضيلات" + +msgid "workspace.shape.menu.exclude" +msgstr "استبعاد" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.rotation" +msgstr "دوران" + +msgid "shortcuts.zoom-lense-decrease" +msgstr "تنقيص عدسة التكبير" + +msgid "workspace.undo.entry.single.shape" +msgstr "شكل" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "workspace.sidebar.sitemap" +msgstr "صفحات" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.view" +msgstr "المنظر" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.detach-instances-in-bulk" +msgstr "فصل الامثلة" + +msgid "workspace.focus.focus-off" +msgstr "تعطيل التركيز" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "رموز الوصول للحساب" + +msgid "workspace.options.radius" +msgstr "نصف القطر" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.back" +msgstr "أرسل الى الخلف" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow" +msgstr "سهم الخط" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.edit" +msgstr "تحرير" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fit-all" +msgstr "التكبير لتناسب الجميع" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-after-delay" +msgstr "بعد التأخير" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-max-h" +msgstr "أقصى ارتفاع" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title" +msgstr "الظل" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.help-info" +msgstr "المساعدة و المعلومة" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title-group" +msgstr "نص للمجموعة" + +msgid "workspace.undo.entry.single.text" +msgstr "نص" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.grow-fixed" +msgstr "مثبت" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.image" +msgstr "صورة (%s)" + +msgid "workspace.undo.entry.single.path" +msgstr "مسار" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.add-flex" +msgstr "إضافة تخطيط الثني" diff --git a/frontend/translations/cs.po b/frontend/translations/cs.po index 8fbee30fb..869479c32 100644 --- a/frontend/translations/cs.po +++ b/frontend/translations/cs.po @@ -5125,3 +5125,574 @@ msgstr "Aktualizace" msgid "workspace.viewport.click-to-close-path" msgstr "Kliknutím zavřete cestu" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "Nikdy" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "Platnost vypršela %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.no-expiration" +msgstr "Žádné datum vypršení platnosti" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Soubor má nekompatibilní číslo verze" + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Zjištěna nekompatibilní funkce '%s'" + +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Nenastaveno" + +msgid "labels.discard" +msgstr "Zahodit" + +msgid "labels.share" +msgstr "Sdílet" + +msgid "labels.search" +msgstr "Hledat" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "Vytvořit token" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.scd-message" +msgid_plural "modals.delete-shared-confirm.activated.scd-message" +msgstr[0] "Tato knihovna je aktivována zde: " +msgstr[1] "Tyto knihovny jsou aktivovány zde: " +msgstr[2] "Tyto knihovny jsou aktivovány zde: " + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Vytvořte tým a odešlete pozvánky" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Vytvořte tým bez pozvánek" + +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Vytvořte tým" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Budete moci pozvat později" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" + +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Pokračujte ve vytváření týmu" + +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Začněte bez týmu" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Později budete moci vytvořit tým." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canva" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "Odpojit" + +#: src/app/main/ui/dashboard/team.cljs +msgid "team.webhooks.max-length" +msgstr "Název webhooku musí obsahovat maximálně 2048 znaků." + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "Přiblížení" + +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Upravit mřížku" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Odejít" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library-updates" +msgstr "AKTUALIZACE KNIHOVNY" + +msgid "workspace.options.component.swap" +msgstr "Vyměnit komponent" + +msgid "workspace.options.component.swap.empty" +msgstr "V této knihovně zatím nejsou žádné položky" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Flow" + +msgid "workspace.top-bar.read-only.done" +msgstr "Hotovo" + +msgid "media.image" +msgstr "Obrázek" + +msgid "media.solid" +msgstr "Plná" + +msgid "media.linear" +msgstr "Lineární" + +msgid "media.radial" +msgstr "Radiální" + +msgid "media.gradient" +msgstr "Přechod" + +msgid "media.choose-image" +msgstr "Vyberte obrázek" + +msgid "workspace.options.guides.title" +msgstr "Vodítka" + +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Při vytváření nového účtu souhlasíte s našimi [smluvními podmínkami](%s) a [" +"zásadami ochrany soukromí](%s)." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.copied-success" +msgstr "Zkopírovaný token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"Osobní přístupové tokeny fungují jako alternativa k našemu systému ověřování " +"přihlašovacích údajů/hesel a lze je použít k tomu, aby aplikaci umožnily " +"přístup k internímu rozhraní Penpot API" + +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "" +"Zdá se, že existuje nesoulad mezi povolenými funkcemi a funkcemi souboru, " +"který se pokoušíte otevřít. Před otevřením souboru je třeba provést migraci " +"pro '%s'." + +msgid "errors.validation" +msgstr "Chyba ověření" + +msgid "errors.paste-data-validation" +msgstr "Neplatná data ve schránce" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Pokračovat bez týmu" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Vytvořte tým a pozvěte" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "Vývojář" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "InVision" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "Zanechte zpětnou vazbu pro můj týmový projekt" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Další" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "Jiné (upřesněte)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "Pracuji na osobním projektu" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "Předchozí" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Jak plánujete používat Penpot?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Jaká je vaše role?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Vyberte možnost" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "Jaká je velikost vašeho týmu?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "Vyzkoušejte Penpot, abyste zjistili, zda je vhodný pro tým " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "" +"Vaše zpětná vazba nám pomůže porozumět vašim zvykům a preferencím, abychom " +"mohli i nadále dělat Penpot užitečným nástrojem." + +msgid "shortcuts.text-align-center" +msgstr "Zarovnat na střed" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Lokalizovat" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Hotovo" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "zobrazit všechny změny" + +msgid "workspace.options.component.annotation" +msgstr "Anotace" + +msgid "workspace.shape.menu.create-multiple-components" +msgstr "Vytvořte více komponent" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Vaše knihovna je prázdná. Po přidání jako sdílená knihovna budou položky, " +"které vytvoříte, k dispozici pro použití se zbytkem vašich souborů. Opravdu " +"ji chcete publikovat?" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.copy-token" +msgstr "Kopírovat token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "Jméno" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.placeholder" +msgstr "Název může pomoci zjistit, k čemu token slouží" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.message" +msgstr "Opravdu chcete tento token smazat?" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "Smazat token" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "" +"Aktiva, která již byla v tomto souboru použita, tam zůstanou (nebude porušen " +"žádný návrh)." +msgstr[1] "" +"Aktiva, která již byla v těchto souborech použita, tam zůstanou (nebude " +"porušen žádný návrh)." +msgstr[2] "" +"Aktiva, která již byla v těchto souborech použita, tam zůstanou (nebude " +"porušen žádný návrh)." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "Název musí obsahovat maximálně 250 znaků." + +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "Název musí obsahovat jiný znak než mezeru." + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "Heslo musí obsahovat jiný znak než mezeru." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "Zatím nemáte žádné tokeny." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "Přístupový token byl úspěšně vytvořen." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "Platnost vyprší %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "60 dní" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "30 dní" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "180 dní" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "90 dní" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "Jméno je povinné" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "Platnost tokenu vyprší %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "Token nemá žádné datum vypršení platnosti" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "Přístupové tokeny" + +msgid "workspace.options.component.edit-annotation" +msgstr "Upravit anotaci" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "Začněte pracovat na mém projektu" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "Žádný" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "... drátové modely, cesty a toky uživatelů, navigační stromy atd." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "Není aktivován v žádném souboru." +msgstr[1] "Nejsou aktivovány v žádném souboru." +msgstr[2] "Nejsou aktivovány v žádném souboru." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "Generovat nový token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "" +"Pro vygenerování nového tokenu stiskněte tlačítko \"Vygenerovat nový token\"." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "Osobní přístupové tokeny" + +msgid "errors.cannot-upload" +msgstr "Nelze nahrát soubor médií." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.expiration-date.label" +msgstr "Datum vypršení platnosti" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "Smazat token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "Vygenerujte přístupový token" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "Designer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Zakladatel / viceprezident" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "Pusťme se do toho!" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "Jsem freelancer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "Produktový nebo projektový manažer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Marketing" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "Více než 50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Sketch" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "Start" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "Před použitím Penpot on-premise si to vyzkoušejte" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "Práce v konceptech" + +msgid "shortcuts.select-parent-layer" +msgstr "Vybrat nadřazenou vrstvu" + +msgid "workspace.options.component.copy" +msgstr "Kopírovat" + +msgid "workspace.options.component.main" +msgstr "Hlavní" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Kruh" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "Diamant" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "Šipka" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Obdélník" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Trojúhelník" + +msgid "workspace.shape.menu.add-grid" +msgstr "Přidat rozvržení mřížky" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "Více informací" + +msgid "modals.delete-component-annotation.message" +msgstr "Opravdu chcete smazat tuto anotaci?" + +msgid "modals.delete-component-annotation.title" +msgstr "Smazat anotaci" + +msgid "modals.publish-empty-library.title" +msgstr "Publikovat prázdnou knihovnu" + +msgid "modals.publish-empty-library.accept" +msgstr "Publikovat" + +msgid "modals.publish-empty-library.message" +msgstr "Vaše knihovna je prázdná. Opravdu to chcete publikovat?" + +msgid "shortcuts.text-align-justify" +msgstr "Zarovnat do bloku" + +msgid "shortcuts.text-align-left" +msgstr "Zarovnat vlevo" + +msgid "shortcuts.text-align-right" +msgstr "Zarovnat vpravo" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "Profil – Přístupové tokeny" + +msgid "workspace.assets.open-library" +msgstr "Otevřete soubor knihovny" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "Sdílená knihovna" + +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "Ve vaší knihovně zatím nejsou žádné barevné styly" + +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "Ve vaší knihovně zatím nejsou žádné typografické styly" + +msgid "workspace.options.component.create-annotation" +msgstr "Vytvořte anotaci" + +msgid "workspace.shape.menu.create-annotation" +msgstr "Vytvořit anotaci" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "Jak byste nejlépe popsali své zkušenosti s prací na..." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "Zjistěte více o Penpot" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Získejte kód z mého týmového projektu " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...branding, ilustrace, marketing atd." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "Hodně" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "... design rozhraní, vizuální aktiva, návrhové systémy atd." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.some" +msgstr "Nějaké" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "S jakým designovým nástrojem máte více zkušeností?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "Student nebo učitel" + +msgid "workspace.layout_grid.editor.title" +msgstr "Úprava mřížky" + +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "K dispozici je nová verze, obnovte prosím stránku" diff --git a/frontend/translations/de.po b/frontend/translations/de.po index 3c5067ee4..a1a7c4bb1 100644 --- a/frontend/translations/de.po +++ b/frontend/translations/de.po @@ -64,12 +64,6 @@ msgstr "Hier anmelden" msgid "auth.login-submit" msgstr "Anmelden" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-tagline" -msgstr "" -"Penpot ist das kostenlose Open-Source-Design-Tool für die Zusammenarbeit " -"von Design und Code" - #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -3127,12 +3121,6 @@ msgstr "Auswahl sperren" msgid "shortcuts.toggle-lock-size" msgstr "Seitenverhältnis sperren/entsperren" -msgid "shortcuts.toggle-rulers" -msgstr "Lineale anzeigen / ausblenden" - -msgid "shortcuts.toggle-snap-guides" -msgstr "An Hilfslinien ausrichten" - msgid "shortcuts.toggle-textpalette" msgstr "Textpalette ein-/ausblenden" @@ -5585,10 +5573,6 @@ msgstr "Bild auswählen" msgid "workspace.options.guides.title" msgstr "Hilfslinien" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Inspektionsmodus** (nur Ansicht)" - #: src/app/main/errors.cljs msgid "errors.version-not-supported" msgstr "Die Datei hat eine inkompatible Versionsnummer" diff --git a/frontend/translations/es.po b/frontend/translations/es.po index 0f0e7f7d0..4b5fa0fff 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -3619,10 +3619,6 @@ msgstr "Seleccionar todo" msgid "workspace.header.menu.show-artboard-names" msgstr "Mostrar nombres de tableros" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-guides" -msgstr "Mostrar guías" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Mostrar paleta de colores" @@ -5303,3 +5299,76 @@ msgstr "Actualizar" msgid "workspace.viewport.click-to-close-path" msgstr "Pulsar para cerrar la ruta" + +#, markdown +msgid "workspace.top-bar.view-only" +msgstr "**Inspeccionando código** (View only)" + +msgid "workspace.top-bar.read-only.done" +msgstr "Hecho" + +msgid "media.image" +msgstr "Imagen" + +msgid "media.image.short" +msgstr "img" + +msgid "media.solid" +msgstr "Sólido" + +msgid "media.linear" +msgstr "Linear" + +msgid "media.radial" +msgstr "Radial" + +msgid "media.gradient" +msgstr "Gradiente" + +msgid "media.choose-image" +msgstr "Elegir imagen" + +msgid "media.keep-aspect-ratio" +msgstr "Mantener la proporción" + +msgid "workspace.options.guides.title" +msgstr "Guías" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Duplicar columna" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Añadir 1 columna a la izquierda" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Añadir 1 columna a la derecha" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Borrar columna" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Borrar columna con el contenido" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Duplicar fila" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Añadir 1 fila encima" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Añadir 1 fila debajo" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Borrar fila" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Borrar fila con el contenido" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Fusionar celdas" + +msgid "workspace.context-menu.grid-cells.area" +msgstr "Crear area" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Crear tablero" diff --git a/frontend/translations/es_419.po b/frontend/translations/es_419.po index bc62bb5a1..7ed31990e 100644 --- a/frontend/translations/es_419.po +++ b/frontend/translations/es_419.po @@ -413,6 +413,160 @@ msgstr "" msgid "dashboard.export-binary-multi" msgstr "Descargar %s archivos Penpot (.penpot)" +#: src/app/main/ui/auth/register.cljs +msgid "auth.already-have-account" +msgstr "¿Ya tienes una cuenta?" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.check-your-email" +msgstr "" +"Revise su correo electrónico y haga clic en el enlace para verificar y " +"comenzar a usar Penpot." + +#: src/app/main/ui/auth/register.cljs +msgid "auth.demo-warning" +msgstr "" +"Este es un servicio DEMO, NO LO UTILICE para trabajos reales, los proyectos " +"se borrarán periódicamente." + +#: src/app/main/ui/auth/register.cljs +msgid "auth.fullname" +msgstr "Nombre completo" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-google-submit" +msgstr "Google" + +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "El nombre debe contener algún carácter distinto al del espacio." + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "El nombre debe contener como máximo 250 caracteres." + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.recovery-token-sent" +msgstr "" +"El enlace de recuperación de contraseña ha sido enviado a su bandeja de " +"entrada de su correo electrónico." + +#: src/app/main/ui/auth/verify_token.cljs +msgid "auth.notifications.team-invitation-accepted" +msgstr "Se unió al equipo con éxito" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-subtitle" +msgstr "Le enviaremos un correo electrónico con instrucciones" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-subtitle" +msgstr "Es gratis, es de código abierto" + +msgid "auth.terms-of-service" +msgstr "Términos de servicio" + +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"Al crear una nueva cuenta, acepta nuestros [terms of service](%s) y nuestra [" +"privacy policy](%s)." + +msgid "common.share-link.confirm-deletion-link-description" +msgstr "" +"¿Estás seguro de que deseas eliminar este enlace? Si lo haces ya no estará " +"disponible para nadie" + +msgid "common.share-link.link-copied-success" +msgstr "Enlace copiado exitosamente" + +msgid "common.share-link.manage-ops" +msgstr "Administrar permisos" + +msgid "common.share-link.placeholder" +msgstr "El enlace para compartir aparecerá aquí" + +msgid "common.share-link.team-members" +msgstr "Solo miembros del equipo" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-title" +msgstr "Crea una cuenta" + +msgid "common.share-link.title" +msgstr "Compartir prototipos" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.text" +msgstr "" +"Penpot está destinado a equipos. Invite a miembros a trabajar juntos en " +"proyectos y archivos" + +msgid "common.unpublish" +msgstr "Despublicar" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.title" +msgstr "¡En equipo!" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.info" +msgstr "" +"Aprenda los conceptos básicos en Penpot mientras se divierte con este " +"tutorial práctico." + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.start" +msgstr "Iniciar el tutorial" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.info" +msgstr "Date un paseo por Penpot y conoce sus principales características." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "Presione el botón \"Generar nuevo token\" para generar uno." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "Generar nuevo token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "El nombre es requerido" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "Expirado el %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "Tokens de acceso personal" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"Los tokens de acceso personal funcionan como una alternativa a nuestro " +"sistema de autenticación de inicio de sesión/contraseña y pueden usarse para " +"permitir que una aplicación acceda a la API interna de Penpot" + +#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs +msgid "dashboard.copy-suffix" +msgstr "(copiar)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.create-new-team" +msgstr "Crear nuevo equipo" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to-link" +msgstr "Información sobre cómo configurar las exportaciones en Penpot." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.no-elements" +msgstr "No hay elementos con configuración de exportación." + msgid "dashboard.export-frames" msgstr "Exportar tableros como PDF" diff --git a/frontend/translations/ha.po b/frontend/translations/ha.po index ee7801e44..e072830b7 100644 --- a/frontend/translations/ha.po +++ b/frontend/translations/ha.po @@ -142,13 +142,8 @@ msgstr "an manta lambar tsaro?" msgid "auth.recovery-submit" msgstr "canza lambar tsaro" -#: src/app/main/ui/auth/login.cljs -msgid "auth.register" -msgstr "ba ka da kunxi har yanzu?" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.register-submit" -msgstr "qirqiri kundi" +msgid "shortcut-subsection.shape" +msgstr "Siffa" #: src/app/main/ui/auth/register.cljs msgid "auth.register-subtitle" @@ -1962,6 +1957,2259 @@ msgstr "" "Webhooks hanyar sanar da manhajoji da addireshi intanet idan wani ya faru a " "Penpot. za a tura maka da saqon talla URLs ka samar da." +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text-palette" +msgstr "rubutub rubutu (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.titlecase" +msgstr "yanayin lakani" + +msgid "workspace.sidebar.layers.frames" +msgstr "allo" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fit" +msgstr "dace - ja sikeli ya dace da shi" + +#: src/app/main/ui/dashboard/files.cljs +msgid "title.dashboard.files" +msgstr "%s - Tukunyar aje biro" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.exporting-object-error" +msgstr "An gaza fitarwa" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-ok" +msgstr "haka" + +msgid "shortcuts.escape" +msgstr "kubuta" + +msgid "shortcuts.copy" +msgstr "kwafi" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.hsv" +msgstr "HSV" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete-flow-start" +msgstr "goge kwararar farko" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-left" +msgstr "kasa hagu" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "mai daraja" + +msgid "dashboard.export.detail" +msgstr "*akwai sassan,hotuna,launuka,da/kozane-zane." + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.hint" +msgstr "" +"idan ka aje a wurin ajiyar tawaga, turken kundin xakin ajiyar za ya kasance " +"za a iya amfani da shi a sauran kundaye." + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-offset-effect" +msgstr "cire tasiri" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to" +msgstr "tura a" + +msgid "modals.create-webhook.title" +msgstr "qirqirar webhook" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.rgba" +msgstr "RGBA" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.mixed" +msgstr "gauraya" + +msgid "shortcuts.detach-component" +msgstr "rarraba abubuwan da su ke a ware" + +msgid "shortcuts.reset-zoom" +msgstr "zake zukowa" + +msgid "onboarding-v2.welcome.desc3" +msgstr "" +"wurin da za ka san yadda za ka hada-hannu da fassara, neman fasali, manyan " +"gudunmawa, magance matsala…" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hright" +msgstr "Daidaita dama (%s)" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.status" +msgstr "daraja" + +msgid "common.share-link.permissions-can-comment" +msgstr "sharhi" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgba" +msgstr "RGBA" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row" +msgstr "jerawa" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to" +msgstr "kewayawa zuwa" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "ya kake tunanin aiki da fenfot?" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.inner" +msgstr "ciki" + +msgid "onboarding-v2.before-start.desc1" +msgstr "" +"ya kamata kasan akwai kayayyaki da yawa da za su iya taimaka maka ka sami " +"damar fara aiki da fenfot, kamar jagoran mai amfani tasharmu ta youtub." + +msgid "shortcut-subsection.general-viewer" +msgstr "gamayya" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-members" +msgstr "mambobin tawaga" + +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-file-prefix" +msgstr "sabon kundi" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "lambar tsaron za ta gama aiki %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.underline" +msgstr "ja layi (%s)" + +msgid "onboarding.choice.team-up.create-team-desc" +msgstr "bayan ka yi wa tawagarka suna, za ka iya gaiyato mutane ku hadu." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to" +msgstr "" +"za ka iya daidaita kayan zanenka ta hanyar (amfani da madannin qasa sashen " +"dama)." + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.accept" +msgstr "goge fira" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-duplicate-project" +msgstr "an kwafi aikinka" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.cancel" +msgstr "sokewa" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay-dest" +msgstr "kulle mai rufi %s" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "goge alama" + +#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.your-penpot" +msgstr "fenfot na ka" + +msgid "shortcuts.bring-forward" +msgstr "tura gaba" + +msgid "workspace.header.menu.redo" +msgstr "sake" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.detach-instance" +msgstr "raba yanayin abin" + +msgid "shortcuts.opacity-9" +msgstr "Seta dish dishi zuwa 90" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-right" +msgstr "jera dama (%s)" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-textpalette" +msgstr "Nuna launukan tsarin rubutu" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flip-horizontal" +msgstr "kifa ta tsaye" + +msgid "labels.continue" +msgstr "ci gaba" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.hard-light" +msgstr "Haske mai muya" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.layout-item-max-w" +msgstr "fadi mafi yawa" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.management" +msgstr "shuwagabannin tawaga" + +msgid "inspect.tabs.code.selected.component" +msgstr "bangare" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column-reverse" +msgstr "sake shafi" + +msgid "dashboard.download-standard-file" +msgstr "sauke cikakken kundi(.svg + .json)" + +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.desc-message" +msgstr "" +"an sami matsala. sake gwadawa idan matsalar ba ta kauce ba, tuntubi sashen " +"taimako." + +msgid "labels.font-variants" +msgstr "salo" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.title" +msgstr "kafin ka fita" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.front" +msgstr "kawo zuwa gaba" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-center" +msgstr "tsakiya" + +#: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "errors.unexpected-error" +msgstr "afkuwar kuskuren da ba a zata ba." + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.no-shared-libraries-available" +msgstr "Babu rababbun ma'adanai wanda aka samu" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.square" +msgstr "murabba'i" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.fullscreen" +msgstr "Cika fuskar" + +msgid "workspace.undo.entry.single.multiple" +msgstr "wani abu" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.role" +msgstr "matsayi" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.add-interaction" +msgstr "Danna wannan madannin + domin saka hulda." + +msgid "workspace.shape.menu.difference" +msgstr "bambanci" + +msgid "workspace.assets.duplicate-main" +msgstr "maimaita ainihin" + +msgid "shortcuts.fit-all" +msgstr "fitar da abubuwan da zai dace da ko wane abu" + +msgid "workspace.undo.entry.multiple.path" +msgstr "hanya" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-right" +msgstr "kasa dama" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.duplicate" +msgstr "maimaita" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-main" +msgstr "nuna ainihin wurin" + +msgid "onboarding-v2.before-start.desc2.title" +msgstr "xanjagora" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "ta ya za ka bayyana kwarewarka akai..." + +msgid "shortcut-subsection.zoom-viewer" +msgstr "Zukowa" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.remove-shared" +msgstr "cire matattarar kundate" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "dauki wanda kake so" + +msgid "shortcuts.v-distribute" +msgstr "Rarraba ta tsaye" + +msgid "common.share-link.page-shared" +msgid_plural "common.share-link.page-shared" +msgstr[0] "tura shafi 1" +msgstr[1] "%s an tura shafi" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.grid-title" +msgstr "Akwati" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsetx" +msgstr "X" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-go-to" +msgstr "je ka tiwita" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.none" +msgstr "ba komai" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.exclusion" +msgstr "warewa" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.title" +msgstr "labari" + +msgid "workspace.options.recent-fonts" +msgstr "da dimi dimi" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.new-email" +msgstr "sabon imel" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.search-shared-libraries" +msgstr "Duba rabbaun ma'adanai" + +msgid "shortcuts.text-align-left" +msgstr "jera hagu" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.register-subtitle" +msgstr "kyauta ne,an buxe hanyar samu" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-textpalette" +msgstr "boye launukan yanayin tsarin rubutu" + +msgid "labels.view-only" +msgstr "gani kaxai" + +msgid "workspace.undo.entry.single.component" +msgstr "bangarori" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.row" +msgstr "layuka" + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.upload-all" +msgstr "xora duka" + +msgid "inspect.attributes.typography.text-transform.none" +msgstr "babu" + +msgid "workspace.assets.local-library" +msgstr "dakin karatun gida" + +msgid "shortcuts.move-fast-right" +msgstr "matsa dama da sauri" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.unmask" +msgstr "bude takunkumi" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-submit" +msgstr "shiga ciki" + +msgid "shortcuts.toggle-textpalette" +msgstr "Juya zuwa launukan rubutu" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.update-team" +msgstr "sabunta tawaga" + +#: src/app/main/ui/workspace/sidebar/options/page.cljs +msgid "workspace.options.canvas-background" +msgstr "bayan zane" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.align-top" +msgstr "jerin sama" + +msgid "shortcuts.font-size-dec" +msgstr "rage girman rubutu" + +msgid "dashboard.webhooks.empty.add-one" +msgstr "danna qasa \"sanya webhook\" qara xaya." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.default-team-name" +msgstr "manhajar fenfot" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-pressing" +msgstr "yayin dannawa" + +msgid "shortcuts.open-dashboard" +msgstr "tafi gaban allon" + +#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.profile-is-muted" +msgstr "bayananka su na da imel maras motsi (baiyana matsaloli)." + +msgid "shortcuts.start-measure" +msgstr "fara aunawa" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.center" +msgstr "Tsakiya" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "yi sabuwar alama" + +msgid "workspace.sidebar.collapse" +msgstr "ruguza a'ajiyar bayani" + +msgid "common.share-link.permissions-can-inspect" +msgstr "iya bincka lamba" + +msgid "workspace.options.height" +msgstr "Tsawo" + +msgid "shortcuts.draw-ellipse" +msgstr "siffar kwai" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "ma su tsarawa" + +#, markdown +msgid "dashboard.fonts.hero-text1" +msgstr "" +"duk wani adireshi da ka xora a nan dangin font ne a wannan tawagar za a sami " +"kundayen da ke xauke da kayan rubutu. Da fontfont iri daya ne ake kasawa**" +"gwaurayen font**. Za ka iya xora font ta waxannan hanyoyin: **TTF, OTF and " +"WOFF** (xaya kawai ake buqata)." + +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.drafts" +msgstr "adana" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "title.dashboard.projects" +msgstr "tsare tsare - %s - Mazubin biruka" + +#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs +msgid "labels.retry" +msgstr "sake gwadawa" + +msgid "modals.delete-webhook.title" +msgstr "gogewa webhook" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.update-main" +msgstr "sabunta ainihin wurin" + +msgid "shortcuts.draw-path" +msgstr "Hanya" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.code.selected.multiple" +msgstr "%s zavavve" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.flow-start" +msgstr "fara malala" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "babu" + +msgid "inspect.attributes.typography.text-transform.titlecase" +msgstr "yadda ake rubuta batu" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "za mu fara!" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-flex" +msgstr "cire sassaukan tsari" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.body" +msgstr "ka tabbata kana son goge wannan shafin?" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow-start" +msgstr "Gudun farko" + +msgid "shortcuts.move" +msgstr "matsa" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.message" +msgstr "ka tabbata kana son goge wannan kundin?" + +msgid "shortcuts.opacity-3" +msgstr "Seta dashi dashi zuwa kashi 50" + +msgid "common.share-link.team-members" +msgstr "memba kaxai" + +msgid "workspace.sidebar.layers.components" +msgstr "bangare" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease" +msgstr "sauki" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.placeholder" +msgstr "sunan zai iya taimakawa wajen sanin menene alama" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.confirm-password" +msgstr "tabbatar da lambar tsaro" + +#: src/app/main/ui/workspace/sidebar/options/menus/svg_attrs.cljs, src/app/main/ui/inspect/attributes/svg.cljs +msgid "workspace.sidebar.options.svg-attrs.title" +msgstr "shigo da shi SVG halaye" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to-link" +msgstr "bayanin yadda ake fitarwa daga fenfot" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.comments" +msgstr "ra'ayi (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation-none" +msgstr "Babu" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.columns" +msgstr "shafi" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.accept" +msgstr "canza wurin mallaka" + +msgid "workspace.viewport.click-to-close-path" +msgstr "latsa kusa da hanya" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" + +msgid "labels.close" +msgstr "rufewa" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.lighten" +msgstr "kara masa haske" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export-multiple" +msgstr "Fitar da zababbun" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, +msgid "settings.detach" +msgstr "cire" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.hide" +msgstr "boye" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "zana" + +#: src/app/main/ui/settings/change_email.cljs +msgid "errors.email-invalid-confirmation" +msgstr "tabbata imel xinka ya yi daidai" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.title" +msgstr "Fitar da zavi" + +msgid "onboarding-v2.welcome.desc2.title" +msgstr "hulxa da kai cikin mutane" + +msgid "dashboard.import.progress.process-page" +msgstr "fejin kasuwar duniya: %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.set-default" +msgstr "saita a tsoho" + +#: src/app/main/errors.cljs +msgid "errors.feature-mismatch" +msgstr "" +"tamkar ka buxe wani kundi da ke da muhimmanci '%s' bayar da dama qarin da ka " +"yi ma fenfot xinka bai karbu ba ko ba zai yi aiki ba." + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs +msgid "workspace.options.retry" +msgstr "sake" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-palette" +msgstr "nuna launukan kala" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-relative-to" +msgstr "alaka zuwa" + +msgid "errors.webhooks.ssl-validation" +msgstr "kuskure kan farfaxo da SSL." + +msgid "shortcuts.create-component" +msgstr "samar da abubuwa iri- iri" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.update-components-in-bulk" +msgstr "sabunta ainihin wurin" + +msgid "auth.terms-privacy-agreement" +msgstr "" +"lokacin qirqirar kundi, sai ka amincewa da yanayi aikin da " +"qa'idojinmuqa'idoji." + +msgid "modals.delete-font-variant.title" +msgstr "goge salon font" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.sidebar.history" +msgstr "labari (%s)" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.no-libraries-need-sync" +msgstr "Babu rabben ma'adanai da suke bukatar sabuntawa" + +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "workspace.options.blur-options.title" +msgstr "Dishi dishi" + +msgid "dashboard.export.options.all.title" +msgstr "fitar da manhajar tura kundi" + +msgid "workspace.options.clip-content" +msgstr "Matse abun ciki" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.editor" +msgstr "maigyara" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.new-password" +msgstr "sanya sabuwar lambar tsaro" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.path" +msgstr "hanya (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius.all-corners" +msgstr "duka kwanar" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-right" +msgstr "sama dama" + +#: src/app/main/ui/settings/feedback.cljs +msgid "labels.sending" +msgstr "aikawa…" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.select-layer" +msgstr "zabi shimfida" + +msgid "workspace.undo.entry.single.image" +msgstr "hoto" + +msgid "workspace.shape.menu.intersection" +msgstr "mahada" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-trigger" +msgstr "Jawo" + +#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/files.cljs +msgid "dashboard.new-file" +msgstr "+ sabon kundi" + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/auth.cljs +msgid "title.default" +msgstr "Mazubin biruka - Tsara yanci ga tawaga" + +#: src/app/main/ui/alert.cljs +msgid "ds.alert-title" +msgstr "natsu" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.shortcuts" +msgstr "yanke (%s)" + +#: src/app/main/ui/inspect/attributes/shadow.cljs +msgid "inspect.attributes.shadow" +msgstr "inuwa" + +msgid "common.share-link.title" +msgstr "fenfot" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding" +msgstr "filla filla" + +msgid "shortcuts.toggle-history" +msgstr "Danna tarihi" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-theme" +msgstr "zaven batu" + +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.duplicate" +msgstr "kwafi" + +msgid "title.team-webhooks" +msgstr "gidan yanar gizo - %s - Mazubin biruka" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library-updates" +msgstr "sabunta ma'adana" + +#: src/app/main/ui/dashboard/team.cljs +#, markdown +msgid "labels.no-invitations-hint" +msgstr "danna **gayyato mutane** wurin da ake nemo mutane a wannan tawaga." + +msgid "inspect.tabs.code.selected.mask" +msgstr "marfi" + +msgid "modals.edit-webhook.submit-label" +msgstr "gyara webhook" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.none" +msgstr "babu" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-rules" +msgstr "boye ma'auni" + +msgid "dashboard.webhooks.create.success" +msgstr "an gina Webhook." + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.go-to-edit" +msgstr "tafi zuwa salon dakin karatu don a tace" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.confirm" +msgstr "haka, goge asusu" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.no-matches-for" +msgstr "Babu daidaituwa da aka samu na “%s“" + +msgid "shortcuts.move-unit-right" +msgstr "Matsa da sashin dama" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.projects" +msgstr "aiyuka" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.verification-email-sent" +msgstr "mun aika maka da saqon tantancewa ta imel" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-name" +msgstr "sunanka" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout" +msgstr "shiri" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-none" +msgstr "(ba'a saita ba )" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing" +msgstr "saukakawa" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Triangle" + +msgid "workspace.path.actions.draw-nodes" +msgstr "zane da kauri (%s)" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-scale-text" +msgstr "bada damar sikelin rubutu" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row-reverse" +msgstr "jera sauyin fasali" + +msgid "errors.email-spam-or-permanent-bounces" +msgstr "saqonni marasa amfani na imel «%s»." + +msgid "labels.add-custom-font" +msgstr "inganta font" + +#: src/app/main/ui/dashboard/libraries.cljs +msgid "title.dashboard.shared-libraries" +msgstr "Rababban dakin karatu- %s - Mazubin biruka" + +#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs +msgid "workspace.options.export-object" +msgid_plural "workspace.options.export-object" +msgstr[0] "Fitarwa 1 Sashi" +msgstr[1] "Fitarwa %s sashi-sashi" + +msgid "errors.bad-font" +msgstr "ba za a iya xora fonts %s ba" + +msgid "shortcuts.align-bottom" +msgstr "tsarin kasa" + +msgid "shortcuts.align-top" +msgstr "tsarin sama" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.message" +msgstr "sabunta sashe a babbar taska" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.profile-not-verified" +msgstr "ba a tantance bayananka ba,sai an tantance a ci gaba." + +#: src/app/main/ui/inspect/attributes/layout.cljs, src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.radius" +msgstr "tsakiya" + +msgid "workspace.undo.entry.single.media" +msgstr "kadarar zanen hotuna" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-title" +msgstr "wurin karvar qorafin tiwita" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.packed" +msgstr "cushe" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "suna" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-style" +msgstr "tsarin salo" + +msgid "dashboard.import.analyze-error" +msgstr "kash! mun gaza shigo da kundinka" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-subtitle" +msgstr "za mu aika maka da saqon qa'idoji ta imel" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "ba zai yi aiki a kowane kundi ba." +msgstr[1] "ba za su yi aiki a kowane kundi ba." + +#: src/app/main/ui/settings/password.cljs +msgid "title.settings.password" +msgstr "Nambobin sirri - Mazubin biruka" + +msgid "workspace.header.menu.enable-snap-pixel-grid" +msgstr "Bda damar tsinkewa zuwa akwatin pixel" + +msgid "shortcuts.add-comment" +msgstr "Bayyana Ra'ayi" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-enter" +msgstr "linzamin kwamfuter ya shiga" + +msgid "workspace.undo.entry.single.circle" +msgstr "da'ira" + +msgid "labels.back" +msgstr "baya" + +msgid "viewer.header.interactions-section" +msgstr "Hulda (%s)" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.forgot-password" +msgstr "ka manta lambar tsaro?" + +msgid "shortcut-subsection.tools" +msgstr "Kayan aiki" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.notifications.recovery-token-sent" +msgstr "an aika maka da saqon matakan da za a bi domin dawo da lambar tsaronka." + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title.group" +msgstr "rukunin inuwa" + +msgid "modals.publish-empty-library.message" +msgstr "ba komai a taskarka. ka na son wallafa ta?" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.only-yours" +msgstr "naka kawai" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title.group" +msgstr "rukunin shafi" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.reset-zoom" +msgstr "Kara saitawa" + +msgid "shortcuts.opacity-7" +msgstr "Saita dishi dishi zuwa kashi 70" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.assets" +msgstr "kadara" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.width" +msgstr "faxi" + +msgid "shortcuts.snap-pixel-grid" +msgstr "yanke zuwa ga akwatin pixel" + +#: src/app/main/ui/auth/login.cljs +msgid "errors.ldap-disabled" +msgstr "LDAP ya gaza tantancewa." + +msgid "workspace.assets.open-library" +msgstr "bude fiyal din dakin karatu" + +#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs +msgid "workspace.gradients.linear" +msgstr "a layi mikakke" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title-selection" +msgstr "zababbun rubutu" + +msgid "modals.delete-component-annotation.title" +msgstr "goge bayani" + +msgid "shortcuts.select-parent-layer" +msgstr "zabi ainihin shafi" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.promote-and-leave" +msgstr "inganta sannan ka bari" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.libraries.text.multiple-typography" +msgstr "Rubutun rubutu dayawa" + +msgid "dashboard.import.progress.upload-media" +msgstr "xora kundaye: %s" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-multi-confirm.accept" +msgstr "goge kundaye" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "rababben dakin karatu" + +msgid "labels.share-prototype" +msgstr "tura manhajar rubutu" + +msgid "shortcuts.export-shapes" +msgstr "samar da sabbabbin abubuwa" + +#: src/app/main/ui/dashboard/team.cljs +msgid "notifications.invitation-link-copied" +msgstr "kwafar hanyar gayya" + +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.notifications.password-saved" +msgstr "an tsare maka shaidar tsaro!" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.group-name" +msgstr "sunan kungiya" + +msgid "shortcuts.search-placeholder" +msgstr "takaitaccen sako yanken" + +msgid "inspect.tabs.code.selected.svg-raw" +msgstr "SVG" + +#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.size" +msgstr "girma" + +msgid "workspace.undo.entry.multiple.component" +msgstr "bangare" + +msgid "workspace.focus.selection" +msgstr "zaba" + +msgid "workspace.path.actions.merge-nodes" +msgstr "hade kauri (%s)" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.info" +msgstr "" +"za mu aika maka da imel ta wannan imel xin “%s” domin tantance shaidarka." + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.remove-member" +msgstr "cire mamba" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.create-component" +msgstr "kirkiri abubuwa" + +msgid "common.publish" +msgstr "wallafawa" + +msgid "shortcuts.select-next" +msgstr "zabi wani shafi" + +msgid "workspace.undo.entry.multiple.color" +msgstr "kadarar kala" + +#: src/app/main/ui/settings/options.cljs +msgid "title.settings.options" +msgstr "Saiti - Mazubin biruka" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.no-invitations" +msgstr "ba saqon da ba a buxa ba." + +msgid "workspace.header.menu.enable-scale-content" +msgstr "bada damar sikelin rabo" + +msgid "modals.delete-font-variant.message" +msgstr "" +"ka tabbata kana son goge wannan salon font din? ba zai xoru ba idan an yi " +"amfani da shi a kundi." + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.group-stroke" +msgstr "Ja layi a rukuni" + +msgid "workspace.shape.menu.union" +msgstr "hadakan" + +msgid "workspace.shape.menu.thumbnail-set" +msgstr "kara kamar girman babban yatsa" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.recovery-submit" +msgstr "canza lambar tsaro" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-cancel" +msgstr "goge" + +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.download" +msgstr "sauke hanyar hoto" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-fill" +msgstr "cike - cika sikeli" + +msgid "errors.bad-font-plural" +msgstr "ba za a iya xora fonts %s ba" + +msgid "inspect.empty.help" +msgstr "domin neman qarin bayani game da fenfot a tuntubi sashen agaji" + +msgid "workspace.sidebar.layers.texts" +msgstr "rubutu" + +#: src/app/main/ui/settings/profile.cljs +msgid "title.settings.profile" +msgstr "Karin bayani - Mazubin biruka" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.delete" +msgstr "goge" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.text-align-left" +msgstr "jera hagu (%s)" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.your-account" +msgstr "fagenka" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.dismiss" +msgstr "watsar" + +#: src/app/main/ui/settings/feedback.cljs +msgid "title.settings.feedback" +msgstr "bada martani - Mazubin biruka" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.duplicate" +msgstr "maimaita" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.change-email" +msgstr "canza imel" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.title" +msgstr "gogewar tawaga" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "bayanai masu yawa" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.forward" +msgstr "kawo ta gaba" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.title" +msgstr "imel" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.font-size" +msgstr "girma" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.message" +msgstr "" +"kai ke da wannan tawagar yanzu. ka tabbata kana son yin %s sabon mai tawaga?" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-palette" +msgstr "farantin launuka" + +msgid "shortcuts.group" +msgstr "rukuni" + +msgid "auth.privacy-policy" +msgstr "matakan kaxaita" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.notifications.password-changed-successfully" +msgstr "ka canza lambar tsaro" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-while-hovering" +msgstr "yayin shawagi" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show" +msgstr "nuna" + +msgid "workspace.shape.menu.hide-ui" +msgstr "nuna / boye UI" + +msgid "shortcuts.move-fast-up" +msgstr "Matsa sama da sauri" + +#: src/app/main/data/dashboard.cljs +msgid "dashboard.new-project-prefix" +msgstr "sabon aiki" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.center" +msgstr "tsakiya" + +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-settings" +msgstr "Saiti - %s - Mazubin biruka" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-manual" +msgstr "Yi da kanka" + +msgid "labels.save" +msgstr "ajiye" + +msgid "dashboard.import.progress.process-media" +msgstr "kammala aiki" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-ok" +msgstr "haka" + +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "dole suna ya qumshi waxansu alamimon rubutu, sannan tazara." + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.message" +msgstr "ka tabbata kana son goge wannan aikin?" + +msgid "shortcuts.line-height-inc" +msgstr "kara tsawon layi" + +msgid "onboarding-v2.before-start.desc2" +msgstr "" +"cikakken bayanin yadda za a yi amfani da fenfot. daga rubutu zuwa tsara ko " +"rarraba iri." + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.sidebar.layers" +msgstr "shafi" + +msgid "shortcuts.select-all" +msgstr "zabi duka" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.graphics" +msgstr "%s zane zane" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-mouse-leave" +msgstr "linzamin kwamfutar ya fita" + +msgid "labels.log-or-sign" +msgstr "yi ko shiga" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "idan akwai qari (bayyana)" + +msgid "workspace.assets.typography.text-styles" +msgstr "salon rubutu" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker" +msgstr "da'irar kasuwa" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.searching-for" +msgstr "neman “%s“…" + +msgid "inspect.attributes.typography.text-decoration.none" +msgstr "babu" + +msgid "labels.discard" +msgstr "vatar" + +msgid "shortcuts.font-size-inc" +msgstr "kara gaban yanayi" + +msgid "common.share-link.permissions-pages" +msgstr "tura shafuka" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-min-w" +msgstr "fadi mafi kankanta" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hcenter" +msgstr "Daidaita tsakiya a kwance (%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.gap" +msgstr "Gibi" + +msgid "inspect.tabs.code.selected.group" +msgstr "qungiya" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker" +msgstr "murabba'in kasuwa" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.column" +msgstr "shafi" + +#: src/app/main/ui/comments.cljs +msgid "labels.delete-comment-thread" +msgstr "goge rubutu" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-animation" +msgstr "hotuna masu motsi" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.drop-shadow" +msgstr "ajiye inuwa" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "jaraba fenfot ka ga ko ta yi daidai da tawaga " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "malami ko dalibi" + +msgid "workspace.undo.entry.single.curve" +msgstr "lankwasa" + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.main-message" +msgstr "alama!" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.overlay" +msgstr "mai rufi" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" + +msgid "onboarding.team-modal.create-team" +msgstr "yin tawaga" + +msgid "dashboard.import.progress.process-colors" +msgstr "aikin rini" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-account" +msgstr "qirqiri taskar gwaji" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.title" +msgstr "ma'aunin karvuwar aiki" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.margin" +msgstr "gefe" + +msgid "onboarding-v2.welcome.title" +msgstr "barka da zuwa fenfot!" + +#, permanent +msgid "inspect.attributes.stroke.alignment.center" +msgstr "tsakiya" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-changed-successfully" +msgstr "ka zamanantar da adireshinka na imel" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "barin aikin tawaga" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.accept" +msgstr "qara yin wurin ajiyar tawaga" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-in-out" +msgstr "sauki ciki waje" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-guides" +msgstr "Tsinke zuwa mai jagora" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-linear" +msgstr "mikakke" + +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur.value" +msgstr "muhimmanci" + +msgid "common.share-link.manage-ops" +msgstr "amincewar shugaba" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.start" +msgstr "fara jagoranci" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-on-click" +msgstr "da an danna" + +msgid "onboarding.choice.team-up.invite-members" +msgstr "gayyato mambobi" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.hdistribute" +msgstr "rarraba filin kwance (%s)" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-length-hint" +msgstr "aqalla a sami alamoni 8" + +msgid "modals.delete-webhook.message" +msgstr "ka tabbata ka na son goge webhook?" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.title" +msgstr "goge kundi" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.title" +msgstr "goge aikin" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-navigate-to-dest" +msgstr "kewayawa zywa: %s" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.selected-count" +msgid_plural "workspace.assets.selected-count" +msgstr[0] "%s" +msgstr[1] "%s zababbun abubuwan" + +msgid "dashboard.libraries-and-templates.import-error" +msgstr "akwai matsala wurin shigo da fejin talla. fejin tallar ba ya xauko." + +# SECTIONS +msgid "shortcut-section.basics" +msgstr "shikashikai" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-go-to" +msgstr "je ka taskar fenfot" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.libraries-and-templates" +msgstr "taskoki & allunan talla" + +#: src/app/main/ui/auth/login.cljs +msgid "errors.wrong-credentials" +msgstr "kuskuren imel ko lambar tsaro." + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.spread" +msgstr "bazu" + +msgid "shortcuts.open-inspect" +msgstr "tafi sashin da 'yan kallo za su duba" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.info" +msgstr "ka san dokokin fenfot lokacin da ka ke tare da masoya koyarwa." + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.bottom" +msgstr "kasa" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-duration" +msgstr "tsahon lokaci" + +msgid "shortcuts.go-to-libs" +msgstr "ta fi zuwa rabbabben ma'ajiya" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.advanced-ops" +msgstr "zabi na ci gaba" + +#: src/app/main/ui/settings/change_email.cljs +msgid "notifications.validation-email-sent" +msgstr "an aika da imel din tantancewa %s. bincika imel xinka!" + +msgid "shortcuts.toggle-zoom-style" +msgstr "Danna salon zukowa" + +msgid "shortcut-subsection.zoom-workspace" +msgstr "Zukowa" + +msgid "shortcuts.increase-zoom" +msgstr "zuko ciki" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-outside" +msgstr "rufe yayin matsewa ta waje" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.blur" +msgstr "dishi dishi" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "ba ka da wasu lambobin tsaro yanzu." + +msgid "workspace.path.actions.separate-nodes" +msgstr "raba kauri (%s)" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.title-search" +msgstr "neman sakamako" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "teburin aiki" + +#: src/app/main/ui/workspace.cljs +msgid "labels.reload-file" +msgstr "qara dora kundi" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.font-id" +msgstr "tsarin haruffa" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.selection-stroke" +msgstr "gigciye zabi" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "" +"lambarka ta shiga na a matsayin zabin hanyar shiga/lambar tsaronmuza a iya " +"amfani tsarin tantancewa,domin shiga manhajar cikin fenfot API" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.title" +msgstr "mallakar tawaga" + +msgid "dashboard.import" +msgstr "shigo da kundin fenfot" + +#: src/app/main/ui/workspace/sidebar/options.cljs +msgid "workspace.options.prototype" +msgstr "samfur" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.constraints.right" +msgstr "dama" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-delete-project" +msgstr "ka goge aikinka" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.team-hero.text" +msgstr "fenfot ta menbobin tawaga ce. kirawo kowa domin yin aiki tarekundaye" + +#: src/app/main/ui/auth/recovery.cljs +msgid "profile.recovery.go-to-login" +msgstr "je ka hanyar shiga" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.theme-change" +msgstr "batun UI" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.use-play-button" +msgstr "yi amfani da madanneta ta sama ki tafi da samfuri." + +msgid "modals.delete-font.message" +msgstr "" +"ka tabbata kana son goge wannan font xin ? ba zai yi aiki ba idan an yi " +"amfani da shi a kundi." + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.hue" +msgstr "Haske haske" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-artboard-names" +msgstr "Nuna sunayen allo" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.save-error" +msgstr "an samu kuskure wajen adanawa" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke.dashed" +msgstr "layin raba abu" + +msgid "common.share-link.all-users" +msgstr "duk fenfot" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "mallakar lambobin shiga na sirri" + +#: src/app/main/ui/settings/password.cljs +msgid "dashboard.password-change" +msgstr "sauya lambar tsaro" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canva" + +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.fill" +msgstr "Cikawa" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.left" +msgstr "hagu" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "qara samun bayanin fenfot" + +msgid "workspace.shape.menu.thumbnail-remove" +msgstr "cire girman babban danyatsa" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.width" +msgstr "fadi" + +msgid "inspect.empty.select" +msgstr "zabar zubi, hukumar masu sa ido akan bangarorinsu da lambobinsu" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "gama aiki kan %s" + +msgid "shortcuts.toggle-layout-flex" +msgstr "Tara/fitar da lankwasashhiyar shimfida" + +msgid "labels.or" +msgstr "ko" + +msgid "onboarding.choice.team-up.roles" +msgstr "gayyata tare da bayar da matsayi:" + +msgid "labels.font-providers" +msgstr "ma su fenfot" + +msgid "shortcuts.italic" +msgstr "juya zuwa kwantaccen rubuyu" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.space-around" +msgstr "kewayayyen sarrari" + +msgid "errors.webhooks.timeout" +msgstr "dakatarwa" + +msgid "errors.profile-blocked" +msgstr "bayanan a rufe suke" + +msgid "workspace.options.width" +msgstr "fadi" + +msgid "shortcuts.letter-spacing-dec" +msgstr "rage filin harafin" + +msgid "errors.webhooks.last-delivery" +msgstr "saqon qarshe bai je ba." + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-files" +msgstr "an tura kundayenka" + +msgid "shortcut-subsection.general-dashboard" +msgstr "gamayya" + +#: src/app/main/ui/settings/password.cljs +msgid "errors.password-too-short" +msgstr "lambar tsaro dole ta kai yawan alamu 8" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.title" +msgstr "ka tabbata ka na son goge asusunka?" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.tutorial-hero.title" +msgstr "jagoranci" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.rect" +msgstr "Rectangle (%s)" + +msgid "labels.continue-with" +msgstr "ci gaba da" + +msgid "inspect.attributes.typography.text-transform.lowercase" +msgstr "qananan baqaqe" + +msgid "workspace.undo.entry.single.group" +msgstr "rukuni" + +msgid "inspect.attributes.stroke.style.dotted" +msgstr "xige-xige" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout-item.title.layout-item-max-w" +msgstr "fadi mafi yawa" + +msgid "shortcuts.align-right" +msgstr "tsarin dama" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "can baya" + +msgid "modals.invite-member.emails" +msgstr "imel, rabawar waqafi" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.sitemap" +msgstr "taswirar wuri" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-dynamic-alignment" +msgstr "kashe daidaitawa mai canjawa" + +#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +msgid "workspace.options.radius-bottom-left" +msgstr "kasan hagu" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.right" +msgstr "Dama" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-close-overlay" +msgstr "kulle mai rufi" + +msgid "errors.invite-invalid.info" +msgstr "za a iya soke gayyata ko ta ki aiki." + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.fonts-added" +msgid_plural "dashboard.fonts.fonts-added" +msgstr[0] "an qara font 1" +msgstr[1] "%s an qara fonts da yawa" + +msgid "modals.create-webhook.submit-label" +msgstr "qirqirar webhook" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "" +"danna maddanin qasa\"danna qasa\n" +"emo sabuwar lambar tsaro\" samar da wani." + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "goge alama" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vtop" +msgstr "Daidaita sama(%s)" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.viewer" +msgstr "ma su kallo" + +msgid "shortcuts.toggle-alignment" +msgstr "Danna a jere" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.invite-profile" +msgstr "neman mutane" + +#: src/app/main/ui/dashboard/grid.cljs +#, markdown +msgid "dashboard.empty-placeholder-drafts" +msgstr "" +"nan za a sami kundayen da aka sanya a taska. gwada sanya na ka kundin \"a " +"taskirarmumaginar kundi](https://manhajar fenfot/taskokin maginar kundaye." +"html)." + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker" +msgstr "darajar kasuwa" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.blend-mode.soft-light" +msgstr "haske mai sauki" + +msgid "shortcuts.decrease-zoom" +msgstr "fito da shi waje" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-simple" +msgstr "sassaukan ciko" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.gutter" +msgstr "mahada" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.group" +msgstr "rukuni" + +msgid "dashboard.webhooks.update.success" +msgstr "sabunta Webhook." + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-github-submit" +msgstr "matattarar manazarta" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.letter-spacing" +msgstr "tazarar harafi" + +msgid "inspect.tabs.code.selected.text" +msgstr "rubutu" + +msgid "shortcuts.opacity-4" +msgstr "Saita dishi dishi zuwa kashi 40" + +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "workspace.options.blur-options.title.multiple" +msgstr "zabin dishi dishi" + +msgid "shortcuts.align-vcenter" +msgstr "tsarin tsakiya a tsaye" + +msgid "workspace.shape.menu.create-annotation" +msgstr "kirkiri hoto mai motsi" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom-selected" +msgstr "zuko zababbe" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.message" +msgstr "" +"ka tabbata kana son goge wannan tawagar? Duk aiyukanka na kundayen da suka " +"danganci tawagar za su yi gogewar dindindin." + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay-dest" +msgstr "bude mai rufi: %s" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type" +msgstr "Nau'i" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-url" +msgstr "bude URL" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.delete-invitation" +msgstr "goge gayyata" + +msgid "workspace.path.actions.delete-node" +msgstr "goge kauri (%s)" + +msgid "shortcuts.letter-spacing-inc" +msgstr "kara filin harafin" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-destination" +msgstr "makoma" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-google-submit" +msgstr "Gugul" + +msgid "onboarding.newsletter.acceptance-message" +msgstr "" +"an aika maka da saqon buqatar biya, za mu aika maka da saqon imel tabbatar " +"da shi." + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.go-main" +msgstr "tafi ainihin wurin fal" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "fara aiki na" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.delete-team" +msgstr "goge tawaga" + +msgid "shortcuts.draw-frame" +msgstr "Allo" + +msgid "shortcuts.text-align-center" +msgstr "jera tsakiya" + +msgid "shortcuts.undo" +msgstr "Cire" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "mashi" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.accept" +msgstr "sabunta" + +#: src/app/main/ui/workspace/sidebar/align.cljs +msgid "workspace.align.vcenter" +msgstr "Daidaita a kwance tsakiya (%s)" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.twitter-subtitle1" +msgstr "tambayoyin da ke buqatar amsa." + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.remove-account" +msgstr "ka na son cire taskarka?" + +msgid "labels.font-family" +msgstr "ire-iren font" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.viewer" +msgstr "yanayin kallo (%s)" + +msgid "workspace.path.actions.make-curve" +msgstr "Ta lankwasa (%s)" + +msgid "workspace.options.search-font" +msgstr "nemo jerin harufa" + +msgid "onboarding.team-modal.create-team-feature-3" +msgstr "aiyukan shugaba" + +msgid "workspace.path.actions.move-nodes" +msgstr "tafi da kauri (%s)" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-title" +msgstr "dangin fenfot" + +msgid "workspace.path.actions.join-nodes" +msgstr "hada kauri (%s)" + +msgid "shortcuts.merge-nodes" +msgstr "hada da kauri" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "wane kayan zane ka fi iya aiki da shi?" + +msgid "shortcuts.bool-difference" +msgstr "ma'auni mabanbanci" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-url" +msgstr "URL" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "ka sami lambar tsaron da aka yi." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.community" +msgstr "matattara" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.move" +msgstr "motsa abun" + +#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs +msgid "workspace.options.layer-options.title.multiple" +msgstr "dayawa" + +msgid "shortcuts.make-corner" +msgstr "kirkiri kwana" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-your-comments" +msgstr "bayyana na ka ra’ayin" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "mi ne ne matsayinka?" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.assets.typography.letter-spacing" +msgstr "fili a tsakanin haruffa" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.direction-ltr" +msgstr "LTR" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.shared-libraries" +msgstr "taskoki" + +#: src/app/main/ui/dashboard/team.cljs +msgid "title.team-invitations" +msgstr "Gayyata - %s - Mazubin biruka" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.pin-unpin" +msgstr "rufewa/buxewa" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.num-of-files" +msgid_plural "labels.num-of-files" +msgstr[0] "kundi 1" +msgstr[1] "kundaye %s" + +msgid "labels.custom-fonts" +msgstr "kwalliya da fenfot" + +#: src/app/main/ui/dashboard/comments.cljs +msgid "labels.comments" +msgstr "yabo" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.height" +msgstr "tsawo" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.delete" +msgstr "goge" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.show-in-assets" +msgstr "nuna ta kusuwar kadara" + +msgid "workspace.undo.entry.multiple.shape" +msgstr "siffa" + +#: src/app/main/ui/inspect/right_sidebar.cljs +msgid "inspect.tabs.info" +msgstr "bayani" + +msgid "workspace.options.interaction-auto" +msgstr "da kanshi" + +msgid "onboarding.team-modal.create-team-feature-2" +msgstr "ma su yin shiri dayawa lokaci xaya" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"xakin ba komai. wurin ajiyar tawaga, turken da ka yi za ya yi aiki a sauran " +"kundaye. ka tabbata kai ne ka ke son wallafa shi?" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.dashboard" +msgstr "dashbod" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.title.multiple" +msgstr "inuwar zabi" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.save-settings" +msgstr "wurin ajiyar saiti" + +#: src/app/main/errors.cljs +msgid "errors.max-quote-reached" +msgstr "kammala adadin '%s' madogara. gyara." + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-prev-screen" +msgstr "allon daya gabata" + +msgid "labels.active" +msgstr "mai amfani" + +msgid "shortcuts.text-align-right" +msgstr "jera dama" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.add" +msgstr "tarawa" + +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.text-decoration" +msgstr "kwalliyar rubutu" + +msgid "dashboard.import.import-warning" +msgstr "wasu kundayen na dauke da abubuwan da ba su da amfani." + +#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs +msgid "errors.media-type-mismatch" +msgstr "hoton da aka sanya bai yi daidai da kundin da ake son faxaxawa ba." + +msgid "shortcuts.opacity-0" +msgstr "Saita dishi dishi zuwa kashi 100" + +msgid "shortcuts.clear-undo" +msgstr "goge sake" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text" +msgstr "rubutu (%s)" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.update" +msgstr "sabintawas" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.copy" +msgstr "kwafi" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.curve" +msgstr "kwana(%s)" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.padding-all" +msgstr "duka gefan" + +#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs +msgid "workspace.options.text-options.title" +msgstr "rubutu" + +#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs +msgid "viewer.empty-state" +msgstr "Babu allon da aka samu a wannan fejin." + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.file-library" +msgstr "Ma'adanar fiyal" + +msgid "inspect.tabs.code.selected.path" +msgstr "hanya" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.left" +msgstr "hagu" + +msgid "shortcut-subsection.navigation-workspace" +msgstr "shawagi" + +msgid "shortcuts.bool-union" +msgstr "ma'auni hadaka" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.submit" +msgstr "sake imel" + +#: src/app/main/errors.cljs +msgid "errors.feature-not-supported" +msgstr "sassa '%s' ba za su yi aiki ba." + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.rename-team" +msgstr "sake suna tawaga" + +#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "workspace.options.blur-options.title.group" +msgstr "rukuni" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.team-projects" +msgstr "aiyukan tawaga" + +msgid "shortcuts.underline" +msgstr "Danna ta layi a kasa" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "bai yiwuwa" + +#: src/app/main/ui/workspace/colorpicker.cljs +msgid "workspace.libraries.colors.rgb-complementary" +msgstr "Jituwar RGB" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.edit" +msgstr "Tace" + +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.message" +msgstr "ka tabbata kana son cire wannan memban a wannan tawaar?" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component.hint" +msgstr "" +"ka kusa sabunta sashe a babbar taska. wannan za ya iya aiki a sauran " +"kundayen da ke amfani da ita." + +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.main-message" +msgstr "kuskuren ciki" + +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.title" +msgstr "sake imel xinka" + +msgid "shortcut-subsection.modify-layers" +msgstr "gyara shimfida" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.release-notes" +msgstr "bayar da bayani" + +msgid "shortcuts.unmask" +msgstr "Cire takunkumi" + +msgid "workspace.options.y" +msgstr "Y layi" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.message" +msgstr "cire “%s” a taskar shirye-shirye" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.round" +msgstr "da'ira" + +msgid "shortcuts.toggle-lock" +msgstr "Rufe/bude" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.password" +msgstr "lambar tsaro" + +msgid "viewer.breaking-change.message" +msgstr "Sannu!" + +msgid "shortcut-subsection.panels" +msgstr "allon sarrarfav naura" + +msgid "inspect.tabs.code.selected.circle" +msgstr "da'ira" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.info" +msgstr "idan ka cire asusunka za ka iya rasa aikin da ka kammala." + +msgid "dashboard.loading-fonts" +msgstr "xora abin adonka …" + #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.leave-and-reassign.hint1" msgstr "" diff --git a/frontend/translations/he.po b/frontend/translations/he.po index 41e258061..11b8115ce 100644 --- a/frontend/translations/he.po +++ b/frontend/translations/he.po @@ -61,10 +61,6 @@ msgstr "כניסה מכאן" msgid "auth.login-submit" msgstr "כניסה" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-tagline" -msgstr "Penpot הוא כלי בקוד פתוח לשיתוף עיצוב וקוד" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -3045,15 +3041,6 @@ msgstr "נעילת הנבחרים" msgid "shortcuts.toggle-lock-size" msgstr "נעילת יחס" -msgid "shortcuts.toggle-rulers" -msgstr "הצגת / הסתרת סרגלים" - -msgid "shortcuts.toggle-snap-guides" -msgstr "הצמדה לקווים מנחים" - -msgid "shortcuts.toggle-snap-ruler-guide" -msgstr "הצמדה לקווים מנחים סרגלים" - msgid "shortcuts.toggle-textpalette" msgstr "החלפת לוח טקסט" @@ -5438,10 +5425,6 @@ msgstr "החלפת רכיב" msgid "workspace.options.component.swap.empty" msgstr "עדיין אין נכסים בתיקייה הזאת" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**מצב חקירה** (צפייה בלבד)" - msgid "dashboard.import.analyze-error.components-v2" msgstr "קובץ עם רכיבים בגרסה 2 מופעל אך הצוות הזה לא תומך בזה עדיין." diff --git a/frontend/translations/id.po b/frontend/translations/id.po index 151a04883..3f81e228b 100644 --- a/frontend/translations/id.po +++ b/frontend/translations/id.po @@ -5231,10 +5231,6 @@ msgstr "Cari lokasi" msgid "workspace.options.component.swap" msgstr "Ganti komponen" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Mode inspeksi** (Hanya Tampilan)" - msgid "media.gradient" msgstr "Gradien" diff --git a/frontend/translations/ig.po b/frontend/translations/ig.po index c45887bb5..a3bc19749 100644 --- a/frontend/translations/ig.po +++ b/frontend/translations/ig.po @@ -11,10 +11,6 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.4-dev\n" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Ihe ịtụnanya ịhụ gị !" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "Obi Git" @@ -1992,10 +1988,6 @@ msgstr "Ịzụ ahịa" msgid "questions.more-than-50" msgstr "Karịrị iri ise" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.never-used-a-tool" -msgstr "E jibeghị m ngwa ọrụ nse rụọ ọrụ mbụ" - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.next" msgstr "Ọzọ" diff --git a/frontend/translations/lv.po b/frontend/translations/lv.po index 36a2e4a54..5c6113f4c 100644 --- a/frontend/translations/lv.po +++ b/frontend/translations/lv.po @@ -65,10 +65,6 @@ msgstr "Pieteikties šeit" msgid "auth.login-submit" msgstr "Pieteikties" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-tagline" -msgstr "Penpot ir bezmaksas atvērtā pirmkoda dizaina rīks dizaina un koda sadarbībai" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -3106,15 +3102,6 @@ msgstr "Slēgt / Atslēgt" msgid "shortcuts.toggle-lock-size" msgstr "Slēgt proporcijas" -msgid "shortcuts.toggle-rulers" -msgstr "Rādīt/paslēpt mērjoslas" - -msgid "shortcuts.toggle-snap-guides" -msgstr "Pievilkt pie vadlīnijām" - -msgid "shortcuts.toggle-snap-ruler-guide" -msgstr "Pievilkt pie mērjoslu vadlīnijām" - msgid "shortcuts.toggle-textpalette" msgstr "Pārslēgt teksta paleti" @@ -5443,10 +5430,6 @@ msgstr "Trijstūris" msgid "workspace.options.stroke-cap.square-marker-short" msgstr "Taisnstūris" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Apskatīšana** (tikai skatīt)" - msgid "workspace.assets.duplicate-main" msgstr "Divkāršot galveno" diff --git a/frontend/translations/ms.po b/frontend/translations/ms.po index 4527b9121..94e4ad9fe 100644 --- a/frontend/translations/ms.po +++ b/frontend/translations/ms.po @@ -1580,16 +1580,6 @@ msgid "modals.unpublish-shared-confirm.accept" msgid_plural "modals.unpublish-shared-confirm.accept" msgstr[0] "Nyahterbit" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.activated.no-files-message" -msgid_plural "modals.unpublish-shared-confirm.activated.no-files-message" -msgstr[0] "Ia tidak diaktifkan dalam mana-mana fail." - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.activated.scd-message" -msgid_plural "modals.unpublish-shared-confirm.activated.scd-message" -msgstr[0] "Perpustakaan ini diaktifkan di sini:" - #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.message" msgid_plural "modals.unpublish-shared-confirm.message" @@ -1860,10 +1850,6 @@ msgstr "Pengurus Produk atau Projek" msgid "questions.more-than-50" msgstr "Lebih daripada 50" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.never-used-a-tool" -msgstr "Saya tidak pernah menggunakan alat reka bentuk sebelum ini" - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.none" msgstr "Tiada" diff --git a/frontend/translations/nl.po b/frontend/translations/nl.po index e3f9bd677..06eaa2368 100644 --- a/frontend/translations/nl.po +++ b/frontend/translations/nl.po @@ -64,12 +64,6 @@ msgstr "Hier inloggen" msgid "auth.login-submit" msgstr "Inloggen" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-tagline" -msgstr "" -"Penpot is de gratis open-source ontwerptool voor samenwerking op het gebied " -"van ontwerp en code" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -3126,15 +3120,6 @@ msgstr "Vergrendelen/ontgrendelen" msgid "shortcuts.toggle-lock-size" msgstr "Proporties vergrendelen" -msgid "shortcuts.toggle-rulers" -msgstr "Linialen tonen/verbergen" - -msgid "shortcuts.toggle-snap-guides" -msgstr "Uitlijnen op hulpijnen" - -msgid "shortcuts.toggle-snap-ruler-guide" -msgstr "Uitlijnen op liniaal-hulplijnen" - msgid "shortcuts.toggle-textpalette" msgstr "Tekstpalet in/uitschakelen" @@ -5484,10 +5469,6 @@ msgstr "Ongeldige gegevens op klembord" msgid "errors.team-feature-mismatch" msgstr "Incompatibele functie '%s' gedetecteerd" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "** Inspectiemodus ** (alleen bekijken)" - #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.loading" msgstr "Laden…" diff --git a/frontend/translations/pt_PT.po b/frontend/translations/pt_PT.po index 7ab56fe65..9a6de8b02 100644 --- a/frontend/translations/pt_PT.po +++ b/frontend/translations/pt_PT.po @@ -5410,10 +5410,6 @@ msgstr "Dados inválidos na área de transferência" msgid "errors.team-feature-mismatch" msgstr "Funcionalidade incompatível '%s' detetada" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Modo de inspeção** (Somente leitura)" - msgid "shortcuts.toggle-theme" msgstr "Mudar tema" diff --git a/frontend/translations/tr.po b/frontend/translations/tr.po index dff0162e9..3e210149b 100644 --- a/frontend/translations/tr.po +++ b/frontend/translations/tr.po @@ -64,12 +64,6 @@ msgstr "Buradan oturum açın" msgid "auth.login-submit" msgstr "Oturum aç" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-tagline" -msgstr "" -"Penpot, tasarım ve kod işbirliği için özgür ve açık kaynaklı tasarım " -"aracıdır" - #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -3095,15 +3089,6 @@ msgstr "Seçileni kilitle" msgid "shortcuts.toggle-lock-size" msgstr "Oranları kilitle" -msgid "shortcuts.toggle-rulers" -msgstr "Cetvelleri göster/gizle" - -msgid "shortcuts.toggle-snap-guides" -msgstr "Kılavuzlara tuttur" - -msgid "shortcuts.toggle-snap-ruler-guide" -msgstr "Cetvel kılavuzlarına tuttur" - msgid "shortcuts.toggle-textpalette" msgstr "Metin paletini değiştir" @@ -5998,10 +5983,6 @@ msgstr "Bu kütüphanede henüz varlık yok" msgid "workspace.options.flows.flow" msgstr "Akış" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**İnceleme modu** (Yalnızca görüntüle)" - msgid "workspace.top-bar.read-only.done" msgstr "Bitti" diff --git a/frontend/translations/yo.po b/frontend/translations/yo.po index 7d573ec6f..880119490 100644 --- a/frontend/translations/yo.po +++ b/frontend/translations/yo.po @@ -363,10 +363,6 @@ msgstr "orúkọ lẹ́kùnn-ún-rẹ́rẹ́" msgid "auth.login-submit" msgstr "wọlé" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "ó dára láti rí ẹ lẹ́ẹ̀kan sí i!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "ibùdó gítì" @@ -2428,10 +2424,6 @@ msgstr "Títajà" msgid "questions.more-than-50" msgstr "Ju àádọ́ta lọ" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.never-used-a-tool" -msgstr "N kò tí lo irin iṣẹ́ eto ọnà tẹ́lẹ̀ rí" - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.next" msgstr "Èyí tó kàn" @@ -2904,9 +2896,6 @@ msgstr "Yi ipo idojukọ pada" msgid "shortcuts.toggle-fullscreen" msgstr "Yi kuro ni fulscrin" -msgid "shortcuts.toggle-grid" -msgstr "Fihan / Tọju ilana" - msgid "shortcuts.toggle-layers" msgstr "Yi awon pelebe yii pada" @@ -2916,15 +2905,6 @@ msgstr "Tiipa / Siilẹ" msgid "shortcuts.toggle-lock-size" msgstr "títìipa lápàkàn" -msgid "shortcuts.toggle-rules" -msgstr "Fifihan / Titọju ólórì" - -msgid "shortcuts.toggle-scale-text" -msgstr "Yipada asekale ọrọ" - -msgid "shortcuts.toggle-snap-guide" -msgstr "Pín si awọ́n ítọ̀nisọ́nà" - msgid "shortcuts.toggle-textpalette" msgstr "Yíípàda ọrọ paleti" @@ -3234,10 +3214,6 @@ msgstr "Pa asèkalẹ̀ iwọnbà" msgid "workspace.header.menu.disable-scale-text" msgstr "Pa ọrọ iwọnba" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-grid" -msgstr "Pa yipada si ilana" - msgid "workspace.header.menu.disable-snap-pixel-grid" msgstr "Pa yipada si piseli" @@ -3252,10 +3228,6 @@ msgstr "Tan asèkalẹ̀ iwọnbà" msgid "workspace.header.menu.enable-scale-text" msgstr "Tan iwọnbà ọrọ" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-grid" -msgstr "Yipada si ilana" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.enable-snap-guides" msgstr "Yipada si itọ̀nìsọna" @@ -3263,10 +3235,6 @@ msgstr "Yipada si itọ̀nìsọna" msgid "workspace.header.menu.enable-snap-pixel-grid" msgstr "Tan Yipada si piseli" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-grid" -msgstr "Tọ̀jú ilana" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-palette" msgstr "Tọ̀jú awọ palẹti" @@ -3309,10 +3277,6 @@ msgstr "Tun ṣe" msgid "workspace.header.menu.select-all" msgstr "Sa gbogbo rẹ" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-grid" -msgstr "ifihan akoj" - #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Fi awo paleti han" diff --git a/frontend/translations/zh_CN.po b/frontend/translations/zh_CN.po index 924cd4593..61341efb1 100644 --- a/frontend/translations/zh_CN.po +++ b/frontend/translations/zh_CN.po @@ -4963,3 +4963,520 @@ msgstr "更新" msgid "workspace.viewport.click-to-close-path" msgstr "单击以闭合路径" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "定位" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "完成" + +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "编辑网格" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "退出" + +#: src/app/main/ui/workspace/textpalette.cljs +msgid "workspace.libraries.colors.empty-typography-palette" +msgstr "你的库中还没有排版风格" + +msgid "workspace.options.component.swap.empty" +msgstr "你的库中还没有素材" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "流程" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.diamond-marker-short" +msgstr "钻石" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.line-arrow-short" +msgstr "箭头" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "矩形" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "三角形" + +msgid "workspace.top-bar.read-only.done" +msgstr "完成" + +msgid "media.solid" +msgstr "纯色" + +msgid "media.linear" +msgstr "线性" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "你目前还没有令牌。" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "名称是必填项" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "180天" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "30天" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "60天" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "90天" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "从不" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "已经于%s到期" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "个人访问令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "令牌将于%s到期" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "将于%s到期" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.no-expiration" +msgstr "无到期时限" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "文件具有不兼容的版本号" + +#: src/app/main/errors.cljs +msgid "errors.file-feature-mismatch" +msgstr "看起来当前启用的功能,与正在打开的文件所依赖的功能不匹配。在打开文件前,需要" +"应用对“%s”修改。" + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "检测到不兼容功能“%s”" + +msgid "errors.validation" +msgstr "验证错误" + +msgid "errors.paste-data-validation" +msgstr "剪切板中为无效数据" + +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "取消设置" + +msgid "labels.share" +msgstr "分享" + +msgid "labels.search" +msgstr "搜索" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "你的库是空白的。一旦添加为共享库,此文档库中的素材就可被用于你的其他文档中。" +"你确定要发布它吗?" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.copy-token" +msgstr "复制令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.expiration-date.label" +msgstr "到期时间" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.label" +msgstr "名称" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.name.placeholder" +msgstr "名称可以帮你记住令牌的用途" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.submit-label" +msgstr "创建令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.create-access-token.title" +msgstr "生成访问令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.title" +msgstr "删除令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.message" +msgstr "你确定想要删除这个令牌吗?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.scd-message" +msgid_plural "modals.delete-shared-confirm.activated.scd-message" +msgstr[0] "该库被以下文档使用: " +msgstr[1] "这些库被以下文档使用: " + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-shared-confirm.activated.no-files-message" +msgid_plural "modals.delete-shared-confirm.activated.no-files-message" +msgstr[0] "" +msgstr[1] "" + +msgid "modals.publish-empty-library.accept" +msgstr "发布" + +msgid "modals.publish-empty-library.message" +msgstr "你的库是空白的。你确定想要发布它?" + +msgid "modals.publish-empty-library.title" +msgstr "发布空白库" + +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "有新版本可用,请刷新页面" + +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "继续创建团队" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "你可以稍后再创建团队。" + +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "以个人身份开始" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "以个人身份继续" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "创建团队并发送邀请" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "创建团队但暂不邀请" + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "创建团队 & 邀请" + +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "创建团队" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "你可以稍后再邀请成员" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.interface-design-visual-assets-design-systems" +msgstr "...界面设计,视觉素材,设计系统等。" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.none" +msgstr "无" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.other" +msgstr "其他(请注明)" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.personal-project" +msgstr "我在做个人项目" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.previous" +msgstr "前一项" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "你计划用Penpot做什么?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Sketch" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start-to-work-on-my-project" +msgstr "开始着手我的项目" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.student-teacher" +msgstr "学生/教师" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.start" +msgstr "开始" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" +msgstr "试用Penpot,来看它是否适合团队 " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.try-out-before-using-penpot-on-premise" +msgstr "在本地部署Penpot前进行试用" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.work-in-concept-ideas" +msgstr "从事概念构想的工作" + +#: src/app/main/ui/dashboard/team.cljs +msgid "team.webhooks.max-length" +msgstr "Webhook的名称最多包含2048个字符。" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "title.settings.access-tokens" +msgstr "个人资料 — 访问令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "令牌无到期时限" + +msgid "workspace.shape.menu.add-grid" +msgstr "添加网格布局" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.leave-feedback-for-my-team-project" +msgstr "给我的团队项目做反馈" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "品牌设计、插图、营销物料等。" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "非常多" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.wireframes-user-journeys-flows-navigation-trees" +msgstr "...线框图,用户轨迹和用户流程,导航树等。" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "你最熟悉哪个设计工具?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.invision" +msgstr "InVision" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "31-50" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.more-than-50" +msgstr "50以上" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.freelancer" +msgstr "我是一名自由职业者" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.copied-success" +msgstr "已复制令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "生成新令牌" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "点击“生成新令牌”按钮来生成一个。" + +msgid "labels.discard" +msgstr "丢弃" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "创始人/副总裁" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.figma" +msgstr "Figma" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "从我的团队项目获得邀请码 " + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.lets-get-started" +msgstr "让我们开始吧!" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "市场营销" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "下一项" + +msgid "shortcuts.text-align-center" +msgstr "水平居中" + +msgid "shortcuts.text-align-left" +msgstr "靠左对齐" + +msgid "shortcuts.text-align-justify" +msgstr "两端对齐" + +msgid "workspace.options.component.annotation" +msgstr "注释" + +msgid "workspace.options.component.copy" +msgstr "复制" + +msgid "workspace.options.component.create-annotation" +msgstr "创建注释" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "圆形" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "更多信息" + +msgid "modals.delete-component-annotation.message" +msgstr "你确定想要删除这个注释?" + +msgid "workspace.shape.menu.create-annotation" +msgstr "创建注释" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Adobe XD" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.canva" +msgstr "Canva" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "删除令牌" + +msgid "modals.delete-component-annotation.title" +msgstr "删除注释" + +#: src/app/main/ui/workspace/colorpalette.cljs +msgid "workspace.libraries.colors.empty-palette" +msgstr "你的库中还没有颜色风格" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "11-30" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.designer" +msgstr "设计师" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.developer" +msgstr "开发者" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.discover-more-about-penpot" +msgstr "深入了解Penpot的精彩之处" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.manager" +msgstr "产品经理/项目经理" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "你是哪种身份?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.team-size" +msgstr "你的团队有多少人?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.your-feedback-will-help-us" +msgstr "你的反馈将帮助我们更好地理解你的习惯和偏好,以便我们不断改进Penpot,使其成为" +"一个有用且好用的工具。" + +msgid "shortcuts.select-parent-layer" +msgstr "选择上级图层" + +msgid "shortcuts.text-align-right" +msgstr "靠右对齐" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "查看所有修改" + +msgid "workspace.assets.open-library" +msgstr "打开库文档" + +msgid "workspace.options.component.edit-annotation" +msgstr "编辑注释" + +msgid "workspace.shape.menu.create-multiple-components" +msgstr "创建多个组件" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.shared-library" +msgstr "共享库" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.zoom" +msgstr "缩放" + +msgid "workspace.layout_grid.editor.title" +msgstr "编辑网格" + +msgid "media.radial" +msgstr "径向" + +msgid "media.gradient" +msgstr "渐变" + +msgid "media.choose-image" +msgstr "选择图片" + +msgid "media.image" +msgstr "图片" + +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "姓名必须包含一些空格以外的字符。" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "姓名最多包含250个字符。" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "密码必须包含一些空格以外的字符。" + +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "创建新账号,即代表你同意我们的[服务条例](%s)和[隐私政策](%s)。" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "成功创建访问令牌。" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "个人访问令牌可被理解为密码认证的代替选项,常用于允许(第三方)应用访问Penpot" +"内部API" + +msgid "errors.cannot-upload" +msgstr "无法上传该媒体文件。" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.access-tokens" +msgstr "访问令牌" -- Gitee From 6d3596ba14e852b16ca100571a7bc58844e40c62 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:53:06 +0000 Subject: [PATCH 0435/1266] :globe_with_meridians: Add translations for: Spanish. Currently translated at 99.3% (1353 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/ --- frontend/translations/es.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/translations/es.po b/frontend/translations/es.po index 4b5fa0fff..3c20441f5 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-26 04:53+0000\n" -"Last-Translator: Alejandro Alonso \n" -"Language-Team: Spanish " -"\n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" +"Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" -- Gitee From 7a849dd5c4713f860c3ff29964d31514ccc15f3d Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:53:32 +0000 Subject: [PATCH 0436/1266] :globe_with_meridians: Add translations for: French. Currently translated at 96.4% (1313 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/ --- frontend/translations/fr.po | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/frontend/translations/fr.po b/frontend/translations/fr.po index 48eb87123..af086c394 100644 --- a/frontend/translations/fr.po +++ b/frontend/translations/fr.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-24 15:02+0000\n" -"Last-Translator: Louis Chance \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: French \n" "Language: fr\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -5183,6 +5183,7 @@ msgstr "Montrer en mode spectateur" msgid "workspace.shape.menu.create-multiple-components" msgstr "Créer plusieurs composants" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Le dernier envoi a réussi." -- Gitee From 5523914605797d61f24672410a4d02870bd59c0f Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:54:54 +0000 Subject: [PATCH 0437/1266] :globe_with_meridians: Add translations for: Portuguese (Brazil). Currently translated at 85.2% (1161 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/ --- frontend/translations/pt_BR.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/translations/pt_BR.po b/frontend/translations/pt_BR.po index b2eee4944..2d187bf09 100644 --- a/frontend/translations/pt_BR.po +++ b/frontend/translations/pt_BR.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 12:55+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Portuguese (Brazil) " -"\n" +"Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" -- Gitee From a3cec26994cd9b57472c4f271967cf2a03010c1f Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:52:57 +0000 Subject: [PATCH 0438/1266] :globe_with_meridians: Add translations for: German. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/ --- frontend/translations/de.po | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/frontend/translations/de.po b/frontend/translations/de.po index a1a7c4bb1..d549ac6db 100644 --- a/frontend/translations/de.po +++ b/frontend/translations/de.po @@ -1,15 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-03-22 16:01+0000\n" -"Last-Translator: Stas Haas \n" -"Language-Team: German " -"\n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" +"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -1052,6 +1052,7 @@ msgstr "Verbindungsfehler, URL ist nicht erreichbar" msgid "errors.webhooks.invalid-uri" msgstr "Die URL erfüllt nicht die Validierungskriterien." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Die letzte Übertragung war nicht erfolgreich." @@ -3285,6 +3286,7 @@ msgstr "Interaktionen beim Klicken anzeigen" msgid "viewer.header.sitemap" msgstr "Sitemap" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Die letzte Übertragung war erfolgreich." -- Gitee From c40e3815df984df850e305b269487f09f3287753 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:55:01 +0000 Subject: [PATCH 0439/1266] :globe_with_meridians: Add translations for: Romanian. Currently translated at 96.1% (1310 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/ --- frontend/translations/ro.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/translations/ro.po b/frontend/translations/ro.po index bd69468e9..eec4e9541 100644 --- a/frontend/translations/ro.po +++ b/frontend/translations/ro.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 12:55+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Romanian " -"\n" +"Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" -- Gitee From 0ab9300107d957de072f056b8895d5d4ac2c6afa Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:52:21 +0000 Subject: [PATCH 0440/1266] :globe_with_meridians: Add translations for: Arabic. Currently translated at 83.1% (1132 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/ --- frontend/translations/ar.po | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frontend/translations/ar.po b/frontend/translations/ar.po index d385af66f..23b395643 100644 --- a/frontend/translations/ar.po +++ b/frontend/translations/ar.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 12:55+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Arabic " -"\n" +"Language-Team: Arabic \n" "Language: ar\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -4443,6 +4443,7 @@ msgstr "مجموعات" msgid "workspace.shape.menu.create-multiple-components" msgstr "إنشاء عناصر جديدة" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "محاذاة المركز الأفقي" -- Gitee From 5434ed146eba33a25bb2c33322e5663264b47477 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:54:05 +0000 Subject: [PATCH 0441/1266] :globe_with_meridians: Add translations for: Indonesian. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/ --- frontend/translations/id.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/translations/id.po b/frontend/translations/id.po index 3f81e228b..e4e1ea468 100644 --- a/frontend/translations/id.po +++ b/frontend/translations/id.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-08 15:01+0000\n" -"Last-Translator: Linerly \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Indonesian \n" "Language: id\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" -- Gitee From 6a2bdeb3cb1c270e0db30c54c4b7bc54719cb7a5 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:53:57 +0000 Subject: [PATCH 0442/1266] :globe_with_meridians: Add translations for: Hebrew. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/ --- frontend/translations/he.po | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/frontend/translations/he.po b/frontend/translations/he.po index 11b8115ce..dea3d679c 100644 --- a/frontend/translations/he.po +++ b/frontend/translations/he.po @@ -1,16 +1,16 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-17 14:02+0000\n" -"Last-Translator: Yaron Shahrabani \n" -"Language-Team: Hebrew " -"\n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" +"Language-Team: Hebrew \n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " "n % 10 == 0) ? 2 : 3));\n" -"X-Generator: Weblate 5.4\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -1010,6 +1010,7 @@ msgstr "שגיאת תקשורת, הכתובת אינה נגישה" msgid "errors.webhooks.invalid-uri" msgstr "הכתובת לא מעבירה תיקוף." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "ההעברה האחרונה לא הצליחה." @@ -1064,6 +1065,7 @@ msgid "feedback.title" msgstr "דוא״ל" #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-go-to" msgstr "מעבר ל־X" @@ -1072,6 +1074,7 @@ msgid "feedback.twitter-subtitle1" msgstr "כאן כדי לסייע בסוגיות טכניות." #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-title" msgstr "חשבון תמיכה ב־X" @@ -3205,6 +3208,7 @@ msgstr "הצגת פעילויות בקליק" msgid "viewer.header.sitemap" msgstr "מפת אתר" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "ההעברה האחרונה הצליחה." -- Gitee From f60c40516784cad346e00ab1f3499247c98eebc2 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:53:20 +0000 Subject: [PATCH 0443/1266] :globe_with_meridians: Add translations for: Persian. Currently translated at 50.0% (681 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/ --- frontend/translations/fa.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/translations/fa.po b/frontend/translations/fa.po index abbbc8c5b..ba5f00c96 100644 --- a/frontend/translations/fa.po +++ b/frontend/translations/fa.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 12:55+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Persian " -"\n" +"Language-Team: Persian \n" "Language: fa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" -- Gitee From 861348f97b608e6dfcf5598c30578f4af7373ca5 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:54:51 +0000 Subject: [PATCH 0444/1266] :globe_with_meridians: Add translations for: Polish. Currently translated at 85.3% (1162 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pl/ --- frontend/translations/pl.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/translations/pl.po b/frontend/translations/pl.po index 951ad648d..859eb8d2c 100644 --- a/frontend/translations/pl.po +++ b/frontend/translations/pl.po @@ -2,14 +2,14 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 12:55+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Polish " -"\n" +"Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && " -"(n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" "X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs -- Gitee From 16873891cb3d26c71f9c3189551c2c8438ae918e Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:53:16 +0000 Subject: [PATCH 0445/1266] :globe_with_meridians: Add translations for: Basque. Currently translated at 87.5% (1192 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/eu/ --- frontend/translations/eu.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/translations/eu.po b/frontend/translations/eu.po index 4db439f6e..14019c8a6 100644 --- a/frontend/translations/eu.po +++ b/frontend/translations/eu.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 12:55+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Basque " -"\n" +"Language-Team: Basque \n" "Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" -- Gitee From 3cf385e20982d9a023731a24e825952b44c9f576 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:52:50 +0000 Subject: [PATCH 0446/1266] :globe_with_meridians: Add translations for: Czech. Currently translated at 98.6% (1344 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/cs/ --- frontend/translations/cs.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/translations/cs.po b/frontend/translations/cs.po index 869479c32..d0944cd96 100644 --- a/frontend/translations/cs.po +++ b/frontend/translations/cs.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 12:55+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Czech " -"\n" +"Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" -- Gitee From 155346fa09b8f437abdcf206f91ba22bb308b3e7 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:54:58 +0000 Subject: [PATCH 0447/1266] :globe_with_meridians: Add translations for: Portuguese (Portugal). Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/ --- frontend/translations/pt_PT.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/translations/pt_PT.po b/frontend/translations/pt_PT.po index 9a6de8b02..c5a6de7c9 100644 --- a/frontend/translations/pt_PT.po +++ b/frontend/translations/pt_PT.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-20 23:07+0000\n" -"Last-Translator: TheScientistPT \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Portuguese (Portugal) \n" "Language: pt_PT\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" -- Gitee From 6cf060574544e0efb12727681a753c171108262c Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:54:28 +0000 Subject: [PATCH 0448/1266] :globe_with_meridians: Add translations for: Latvian. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/ --- frontend/translations/lv.po | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/frontend/translations/lv.po b/frontend/translations/lv.po index 5c6113f4c..1571281be 100644 --- a/frontend/translations/lv.po +++ b/frontend/translations/lv.po @@ -1,16 +1,16 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-19 08:03+0000\n" -"Last-Translator: Edgars Andersons \n" -"Language-Team: Latvian " -"\n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" +"Language-Team: Latvian \n" "Language: lv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= " "19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -1034,6 +1034,7 @@ msgstr "Savienojuma kļūda, URL nav sasniedzams" msgid "errors.webhooks.invalid-uri" msgstr "URL neiztur pārbaudi." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Pēdējā piegāde nebija veiksmīga." @@ -3264,6 +3265,7 @@ msgstr "Rādīt mijiedarbības pēc klikšķa" msgid "viewer.header.sitemap" msgstr "Vietnes karte" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Pēdējā piegāde bija veiksmīga." -- Gitee From 16a5218592ef3cf0743995f1429f4a1d60fc6bed Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:54:47 +0000 Subject: [PATCH 0449/1266] :globe_with_meridians: Add translations for: Dutch. Currently translated at 100.0% (1362 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/ --- frontend/translations/nl.po | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/frontend/translations/nl.po b/frontend/translations/nl.po index 06eaa2368..51bf23696 100644 --- a/frontend/translations/nl.po +++ b/frontend/translations/nl.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-12 19:02+0000\n" -"Last-Translator: Stephan Paternotte \n" -"Language-Team: Dutch " -"\n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" +"Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -1055,6 +1055,7 @@ msgstr "Verbindingsfout, URL niet bereikbaar" msgid "errors.webhooks.invalid-uri" msgstr "URL komt niet door de validatie." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Laatste levering was niet succesvol." @@ -1111,6 +1112,7 @@ msgid "feedback.title" msgstr "E-mail" #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-go-to" msgstr "Ga naar X" @@ -1119,6 +1121,7 @@ msgid "feedback.twitter-subtitle1" msgstr "Hier om te helpen met je technische vragen." #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-title" msgstr "X-ondersteuningsaccount" @@ -3284,6 +3287,7 @@ msgstr "Interacties tonen bij aanklikken" msgid "viewer.header.sitemap" msgstr "Sitemap" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "De laatste levering was succesvol." -- Gitee From 10c64330ebc2c6f25dbf56fab4111e27dc65e56f Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:53:40 +0000 Subject: [PATCH 0450/1266] :globe_with_meridians: Add translations for: Hausa. Currently translated at 96.1% (1309 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ha/ --- frontend/translations/ha.po | 110 ++++++++++++++++++++++++++++++++++-- 1 file changed, 106 insertions(+), 4 deletions(-) diff --git a/frontend/translations/ha.po b/frontend/translations/ha.po index e072830b7..92b68a95d 100644 --- a/frontend/translations/ha.po +++ b/frontend/translations/ha.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 12:55+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Hausa " -"\n" +"Language-Team: Hausa \n" "Language: ha\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -538,8 +538,107 @@ msgstr "kula da rubutu" msgid "dashboard.import.progress.upload-data" msgstr "xora bayani akan sabis (%s/%s)" -msgid "dashboard.import.progress.upload-media" -msgstr "xora kundaye: %s" +msgid "shortcuts.draw-curve" +msgstr "Ratse" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.all" +msgstr "duk" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.option.file" +msgstr "fayil" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hsla" +msgstr "HSLA" + +#: src/app/main/ui/auth/register.cljs +msgid "errors.registration-disabled" +msgstr "rigitar ba ta yi ba." + +msgid "workspace.undo.entry.multiple.media" +msgstr "kadarar zane" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "sami lambar kowane aiki " + +msgid "workspace.options.show-in-viewer" +msgstr "fito da kaurin sosai" + +#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +msgid "workspace.options.text-options.lowercase" +msgstr "yanayin kasa" + +#: src/app/main/ui/settings/password.cljs +msgid "errors.password-invalid-confirmation" +msgstr "tabbata labar tsaro ta yi daidai" + +msgid "workspace.undo.entry.multiple.group" +msgstr "rukunis" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.updates" +msgstr "sabuntawa" + +msgid "dashboard.export-frames" +msgstr "Allon fitarwa na PDF" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.title" +msgstr "goge shafi" + +#: src/app/main/ui/static.cljs +msgid "labels.service-unavailable.main-message" +msgstr "ba sabis" + +msgid "shortcuts.opacity-2" +msgstr "Saita dishi dishi zuwa kashi 20" + +msgid "workspace.shape.menu.create-multiple-components" +msgstr "kirkiri abubuwa da yawa" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.rename-group" +msgstr "sake sunan kungiyar" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.create-demo-profile" +msgstr "ka na son gwadawa ne kawai?" + +#, fuzzy +msgid "webhooks.last-delivery.success" +msgstr "Sakon karshe ya isa." + +msgid "shortcuts.bool-intersection" +msgstr "ma'aunin abubuwa daban daban" + +msgid "workspace.options.stroke-width" +msgstr "gigciye fadin" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-easing-ease-out" +msgstr "sauki waje" + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.desc-message" +msgstr "babu wannan fagen, ko ba ka da izinin shiga." + +msgid "workspace.options.x" +msgstr "X layi" + +#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.members" +msgstr "mambobi" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-verified-successfully" +msgstr "an tantance adireshinka na imel" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.show-interactions" +msgstr "Nuna hulda" #: src/app/main/ui/dashboard/team.cljs msgid "dashboard.invite-profile" @@ -2290,6 +2389,7 @@ msgid "workspace.options.shadow-options.offsetx" msgstr "X" #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-go-to" msgstr "je ka tiwita" @@ -2836,6 +2936,7 @@ msgid "workspace.undo.entry.single.media" msgstr "kadarar zanen hotuna" #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-title" msgstr "wurin karvar qorafin tiwita" @@ -3638,6 +3739,7 @@ msgstr "fadi" msgid "shortcuts.letter-spacing-dec" msgstr "rage filin harafin" +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "saqon qarshe bai je ba." -- Gitee From 46705d9ebc471c592e7f13fa456bcb403c87559f Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:54:35 +0000 Subject: [PATCH 0451/1266] :globe_with_meridians: Add translations for: Malay. Currently translated at 52.0% (709 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ms/ --- frontend/translations/ms.po | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/frontend/translations/ms.po b/frontend/translations/ms.po index 94e4ad9fe..0cd908439 100644 --- a/frontend/translations/ms.po +++ b/frontend/translations/ms.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-10 15:02+0000\n" -"Last-Translator: Revenant \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Malay \n" "Language: ms\n" @@ -11,20 +11,6 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.5.1-dev\n" -#: src/app/main/ui/auth/register.cljs -msgid "auth.already-have-account" -msgstr "Sudah mempunyai akaun?" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.check-your-email" -msgstr "" -"Semak e-mel anda dan klik pada pautan untuk mengesahkan dan mula " -"menggunakan Penpot." - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.confirm-password" -msgstr "Mengesahkan kata laluan" - #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.create-demo-account" msgstr "Cipta akaun demo" @@ -704,6 +690,7 @@ msgstr "Ralat sambungan, URL tidak dapat dicapai" msgid "errors.webhooks.invalid-uri" msgstr "URL tidak lulus pengesahan." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Penghantaran terakhir tidak berjaya." @@ -749,6 +736,7 @@ msgid "feedback.title" msgstr "E-mel" #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-go-to" msgstr "Pergi ke Twitter" @@ -757,6 +745,7 @@ msgid "feedback.twitter-subtitle1" msgstr "Kami di sini untuk membantu dengan pertanyaan teknikal anda." #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-title" msgstr "Akaun sokongan Twitter" -- Gitee From 158753073cc24c490db5ee7e7c9857d5743947d0 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:54:10 +0000 Subject: [PATCH 0452/1266] :globe_with_meridians: Add translations for: Igbo. Currently translated at 40.0% (546 of 1362 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ig/ --- frontend/translations/ig.po | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/frontend/translations/ig.po b/frontend/translations/ig.po index a3bc19749..2bbc09546 100644 --- a/frontend/translations/ig.po +++ b/frontend/translations/ig.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-14 08:02+0000\n" -"Last-Translator: Alejandro Alonso \n" +"PO-Revision-Date: 2024-04-24 12:55+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Igbo " "\n" "Language: ig\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" @@ -1061,6 +1061,7 @@ msgid "feedback.title" msgstr "Ozi- n" #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-go-to" msgstr "Gaa na Twita" -- Gitee From d2204ad48c9703090ecdaca9493831e722969aee Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:55:12 +0000 Subject: [PATCH 0453/1266] :globe_with_meridians: Add translations for: Turkish. Currently translated at 97.8% (1350 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/ --- frontend/translations/tr.po | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/frontend/translations/tr.po b/frontend/translations/tr.po index 3e210149b..079f46e9f 100644 --- a/frontend/translations/tr.po +++ b/frontend/translations/tr.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-10 15:02+0000\n" -"Last-Translator: Oğuz Ersen \n" -"Language-Team: Turkish " -"\n" +"PO-Revision-Date: 2024-04-24 13:04+0000\n" +"Last-Translator: Anonymous \n" +"Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -1035,6 +1035,7 @@ msgstr "Bağlantı hatası, URL'ye erişilemiyor" msgid "errors.webhooks.invalid-uri" msgstr "URL doğrulamayı geçemiyor." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Son iletim başarılı olmadı." @@ -3253,6 +3254,7 @@ msgstr "Tıklamada etkileşimleri göster" msgid "viewer.header.sitemap" msgstr "Site haritası" +#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Son iletim başarılı oldu." -- Gitee From 522909c66df89f6f3f9616fbe5d04358deb35ffa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Wed, 24 Apr 2024 13:04:00 +0000 Subject: [PATCH 0454/1266] :globe_with_meridians: Add translations for: Turkish. Currently translated at 97.8% (1350 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/ --- frontend/translations/tr.po | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/frontend/translations/tr.po b/frontend/translations/tr.po index 079f46e9f..800829abf 100644 --- a/frontend/translations/tr.po +++ b/frontend/translations/tr.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 13:04+0000\n" -"Last-Translator: Anonymous \n" +"Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" "Language: tr\n" @@ -6092,3 +6092,20 @@ msgstr "Aşağıya 1 satır ekle" msgid "workspace.context-menu.grid-track.row.delete-shapes" msgstr "Satır ve şekilleri sil" + +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "Etki alanına izin verilmiyor" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "Hesabımda oturum aç" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-tagline" +msgstr "" +"Penpot, tasarım ve kod işbirliği için özgür ve açık kaynaklı tasarım aracıdır" + +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "Kimlik doğrulama sağlayıcısına bu profil için izin verilmiyor" -- Gitee From 51eabd2a23c8d0a4819af3d574132502f59d4169 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:55:35 +0000 Subject: [PATCH 0455/1266] :globe_with_meridians: Add translations for: Chinese (Simplified). Currently translated at 95.4% (1316 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/ --- frontend/translations/zh_CN.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/translations/zh_CN.po b/frontend/translations/zh_CN.po index 61341efb1..8fd68a73a 100644 --- a/frontend/translations/zh_CN.po +++ b/frontend/translations/zh_CN.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 13:04+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Chinese (Simplified) " -"\n" +"Language-Team: Chinese (Simplified) \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" -- Gitee From b74ae49f38b52c8d95f05d27a4033aa13d78f223 Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Wed, 24 Apr 2024 12:56:51 +0000 Subject: [PATCH 0456/1266] :globe_with_meridians: Add translations for: Hebrew. Currently translated at 97.7% (1348 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/ --- frontend/translations/he.po | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/frontend/translations/he.po b/frontend/translations/he.po index dea3d679c..88d49995d 100644 --- a/frontend/translations/he.po +++ b/frontend/translations/he.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-24 12:55+0000\n" -"Last-Translator: Anonymous \n" +"PO-Revision-Date: 2024-04-24 13:04+0000\n" +"Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew \n" "Language: he\n" @@ -1010,7 +1010,6 @@ msgstr "שגיאת תקשורת, הכתובת אינה נגישה" msgid "errors.webhooks.invalid-uri" msgstr "הכתובת לא מעבירה תיקוף." -#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "ההעברה האחרונה לא הצליחה." @@ -1065,7 +1064,6 @@ msgid "feedback.title" msgstr "דוא״ל" #: src/app/main/ui/settings/feedback.cljs -#, fuzzy msgid "feedback.twitter-go-to" msgstr "מעבר ל־X" @@ -1074,7 +1072,6 @@ msgid "feedback.twitter-subtitle1" msgstr "כאן כדי לסייע בסוגיות טכניות." #: src/app/main/ui/settings/feedback.cljs -#, fuzzy msgid "feedback.twitter-title" msgstr "חשבון תמיכה ב־X" @@ -3208,7 +3205,6 @@ msgstr "הצגת פעילויות בקליק" msgid "viewer.header.sitemap" msgstr "מפת אתר" -#, fuzzy msgid "webhooks.last-delivery.success" msgstr "ההעברה האחרונה הצליחה." -- Gitee From 476099c06a6fe9ca67a67a86df5cf1237a9b40d2 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:55:38 +0000 Subject: [PATCH 0457/1266] :globe_with_meridians: Add translations for: Chinese (Traditional). Currently translated at 44.5% (615 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/ --- frontend/translations/zh_Hant.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/translations/zh_Hant.po b/frontend/translations/zh_Hant.po index 5f14d51cb..6fe709570 100644 --- a/frontend/translations/zh_Hant.po +++ b/frontend/translations/zh_Hant.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 13:04+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Chinese (Traditional) " -"\n" +"Language-Team: Chinese (Traditional) \n" "Language: zh_Hant\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" -- Gitee From 871a08aa75c106d5291b313e96bf82091c1c2a7a Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 24 Apr 2024 12:55:31 +0000 Subject: [PATCH 0458/1266] :globe_with_meridians: Add translations for: Yoruba. Currently translated at 88.5% (1221 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/yo/ --- frontend/translations/yo.po | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/frontend/translations/yo.po b/frontend/translations/yo.po index 880119490..3d7b0e925 100644 --- a/frontend/translations/yo.po +++ b/frontend/translations/yo.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-02-14 08:02+0000\n" -"Last-Translator: Alejandro Alonso \n" +"PO-Revision-Date: 2024-04-24 13:04+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: Yoruba \n" "Language: yo\n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs msgid "auth.login-here" @@ -1165,6 +1165,7 @@ msgstr "Àsìṣe nínú ètò ìsopọ̀, kò lè dé ibi URL" msgid "errors.webhooks.invalid-uri" msgstr "URL kò páásì ìfọwọ́sí." +#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Èyí tí a fijíṣẹ́ kẹ́yìn kò dára." @@ -1219,6 +1220,7 @@ msgstr "" "láìjìnnà." #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-go-to" msgstr "Lọ sí Tíwítà" @@ -1227,6 +1229,7 @@ msgid "feedback.twitter-subtitle1" msgstr "A wà níbí láti ṣe ìrànlọ́wọ́ fún àwọn ìbéèrè tó bá wà lórí iṣẹ́ ọnà." #: src/app/main/ui/settings/feedback.cljs +#, fuzzy msgid "feedback.twitter-title" msgstr "Àkáùnti àtìlẹ́yìn fún Tíwítà" -- Gitee From 258ead34f04ebf7b09a40acf4998e8569f9e2135 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Wed, 24 Apr 2024 13:04:10 +0000 Subject: [PATCH 0459/1266] :globe_with_meridians: Add translations for: Turkish. Currently translated at 100.0% (1379 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/ --- frontend/translations/tr.po | 106 +++++++++++++++++++++++++++++++++++- 1 file changed, 103 insertions(+), 3 deletions(-) diff --git a/frontend/translations/tr.po b/frontend/translations/tr.po index 800829abf..ffc732db9 100644 --- a/frontend/translations/tr.po +++ b/frontend/translations/tr.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-24 13:04+0000\n" +"PO-Revision-Date: 2024-04-25 13:07+0000\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" @@ -1035,7 +1035,6 @@ msgstr "Bağlantı hatası, URL'ye erişilemiyor" msgid "errors.webhooks.invalid-uri" msgstr "URL doğrulamayı geçemiyor." -#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Son iletim başarılı olmadı." @@ -3254,7 +3253,6 @@ msgstr "Tıklamada etkileşimleri göster" msgid "viewer.header.sitemap" msgstr "Site haritası" -#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Son iletim başarılı oldu." @@ -6109,3 +6107,105 @@ msgstr "" #: src/app/main/data/users.cljs msgid "errors.auth-provider-not-allowed" msgstr "Kimlik doğrulama sağlayıcısına bu profil için izin verilmiyor" + +msgid "modals.move-shared-confirm.accept" +msgid_plural "modals.move-shared-confirm.accept" +msgstr[0] "Taşı" +msgstr[1] "Taşı" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-one" +msgstr "Hiçbiri" + +msgid "shortcuts.toggle-guides" +msgstr "Kılavuzları göster/gizle" + +msgid "shortcuts.toggle-rulers" +msgstr "Cetvelleri göster/gizle" + +msgid "shortcuts.scale" +msgstr "Ölçeklendir" + +msgid "shortcuts.toggle-snap-guides" +msgstr "Kılavuzlara tuttur" + +msgid "shortcuts.toggle-layout-grid" +msgstr "Izgara düzeni ekle/kaldır" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.filter" +msgstr "Filtrele" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "Sırala" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-ruler-guides" +msgstr "Cetvel kılavuzlarına tuttur" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-guides" +msgstr "Kılavuzları gizle" + +msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" +msgstr "Izgara düzenini bul" + +msgid "workspace.layout_grid.editor.padding.expand" +msgstr "4 taraflı dolgu seçeneklerini göster" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.shared-library-btn" +msgstr "Kütüphaneyi bağla" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.unlink-library-btn" +msgstr "Kütüphanenin bağlantısını kes" + +#: src/app/main/ui/workspace/sidebar/assets/common.cljs +msgid "workspace.assets.sidebar.components" +msgid_plural "workspace.assets.sidebar.components" +msgstr[0] "1 bileşen" +msgstr[1] "%s bileşen" + +msgid "media.image.short" +msgstr "görsel" + +msgid "media.keep-aspect-ratio" +msgstr "En boy oranını koru" + +msgid "modals.move-shared-confirm.message" +msgid_plural "modals.move-shared-confirm.message" +msgstr[0] "Bu kütüphaneyi taşımak istediğinizden emin misiniz?" +msgstr[1] "Bu kütüphaneleri taşımak istediğinizden emin misiniz?" + +msgid "modals.move-shared-confirm.title" +msgid_plural "modals.move-shared-confirm.title" +msgstr[0] "Kütüphaneyi taşı" +msgstr[1] "Kütüphaneleri taşı" + +msgid "onboarding.team-modal.team-definition" +msgstr "Takım nedir?" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs +msgid "settings.select-this-color" +msgstr "Bu biçimi kullanan ögeleri seç" + +msgid "shortcuts.toggle-snap-ruler-guide" +msgstr "Cetvel kılavuzlarına tuttur" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-ruler-guides" +msgstr "Cetvel kılavuzlarına tutturmayı devre dışı bırak" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-guides" +msgstr "Kılavuzları göster" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-grid" +msgstr "Izgara düzenini kaldır" + +#, markdown +msgid "workspace.top-bar.view-only" +msgstr "**Kodu incele** ( Yalnızca Görüntüle)" -- Gitee From c754e606acb6172d5c4a0dcb60855af6a424d80c Mon Sep 17 00:00:00 2001 From: Stas Haas Date: Thu, 25 Apr 2024 08:26:45 +0000 Subject: [PATCH 0460/1266] :globe_with_meridians: Add translations for: German. Currently translated at 99.7% (1376 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/ --- frontend/translations/de.po | 115 ++++++++++++++++++++++++++++++++++-- 1 file changed, 111 insertions(+), 4 deletions(-) diff --git a/frontend/translations/de.po b/frontend/translations/de.po index d549ac6db..2f2944694 100644 --- a/frontend/translations/de.po +++ b/frontend/translations/de.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-24 12:55+0000\n" -"Last-Translator: Anonymous \n" +"PO-Revision-Date: 2024-04-25 13:07+0000\n" +"Last-Translator: Stas Haas \n" "Language-Team: German \n" "Language: de\n" @@ -1052,7 +1052,6 @@ msgstr "Verbindungsfehler, URL ist nicht erreichbar" msgid "errors.webhooks.invalid-uri" msgstr "Die URL erfüllt nicht die Validierungskriterien." -#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Die letzte Übertragung war nicht erfolgreich." @@ -3286,7 +3285,6 @@ msgstr "Interaktionen beim Klicken anzeigen" msgid "viewer.header.sitemap" msgstr "Sitemap" -#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Die letzte Übertragung war erfolgreich." @@ -5717,3 +5715,112 @@ msgstr "" msgid "workspace.context-menu.grid-track.column.add-after" msgstr "1 Spalte rechts einfügen" + +msgid "modals.move-shared-confirm.title" +msgid_plural "modals.move-shared-confirm.title" +msgstr[0] "Bibliothek verschieben" +msgstr[1] "Bibliotheken verschieben" + +msgid "modals.move-shared-confirm.accept" +msgid_plural "modals.move-shared-confirm.accept" +msgstr[0] "Verschieben" +msgstr[1] "Verschieben" + +msgid "shortcuts.toggle-guides" +msgstr "Hilfslinien anzeigen / ausblenden" + +msgid "shortcuts.scale" +msgstr "Skalieren" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.filter" +msgstr "Filtern" + +#: src/app/main/ui/workspace/sidebar/assets/common.cljs +msgid "workspace.assets.sidebar.components" +msgid_plural "workspace.assets.sidebar.components" +msgstr[0] "1 Komponente" +msgstr[1] "% Komponenten" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.unlink-library-btn" +msgstr "Bibliothek trennen" + +msgid "media.keep-aspect-ratio" +msgstr "Seitenverhältnis beibehalten" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "In mein Konto einloggen" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-tagline" +msgstr "" +"Penpot ist das kostenlose Open-Source-Design-Tool für die Zusammenarbeit von " +"Design und Code" + +msgid "modals.move-shared-confirm.message" +msgid_plural "modals.move-shared-confirm.message" +msgstr[0] "Sind Sie sicher, dass Sie diese Bibliothek verschieben wollen?" +msgstr[1] "Sind Sie sicher, dass Sie diese Bibliotheken verschieben wollen?" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs +msgid "settings.select-this-color" +msgstr "Elemente mit diesem Stil auswählen" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-grid" +msgstr "Grid-Layout entfernen" + +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "Auth-Provider für dieses Profil nicht erlaubt" + +msgid "onboarding.team-modal.team-definition" +msgstr "Was ist ein Team?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-one" +msgstr "Keine" + +msgid "shortcuts.toggle-rulers" +msgstr "Lineale anzeigen / ausblenden" + +msgid "shortcuts.toggle-snap-guides" +msgstr "An Hilfslinien ausrichten" + +msgid "shortcuts.toggle-layout-grid" +msgstr "Grid-Layout hinzufügen/entfernen" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "Sortieren" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-guides" +msgstr "Hilfslinien ausblenden" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-guides" +msgstr "Hilfslinien anzeigen" + +msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" +msgstr "Grid-Layout lokalisieren" + +msgid "workspace.layout_grid.editor.padding.expand" +msgstr "4-seitige Abstandsoptionen anzeigen" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.shared-library-btn" +msgstr "Bibliothek verknüpfen" + +#, markdown +msgid "workspace.top-bar.view-only" +msgstr "**Code inspizieren** (nur ansehen)" + +msgid "media.image.short" +msgstr "img" + +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "Domain nicht zulässig" -- Gitee From 3cb6c501d3d2900172822f57d125185eb4b23601 Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Thu, 25 Apr 2024 07:03:12 +0000 Subject: [PATCH 0461/1266] :globe_with_meridians: Add translations for: Hebrew. Currently translated at 98.9% (1364 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/ --- frontend/translations/he.po | 65 ++++++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/frontend/translations/he.po b/frontend/translations/he.po index 88d49995d..ad10c702c 100644 --- a/frontend/translations/he.po +++ b/frontend/translations/he.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-24 13:04+0000\n" +"PO-Revision-Date: 2024-04-25 13:07+0000\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew \n" @@ -5504,3 +5504,66 @@ msgstr "יצירת שטח" msgid "workspace.context-menu.grid-cells.create-board" msgstr "יצירת לוח" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "כניסה לחשבון שלי" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-tagline" +msgstr "Penpot הוא כלי בקוד פתוח לשיתוף עיצוב וקוד" + +msgid "modals.move-shared-confirm.message" +msgid_plural "modals.move-shared-confirm.message" +msgstr[0] "להעביר את הספרייה הזאת?" +msgstr[1] "להעביר את הספריות האלו?" +msgstr[2] "להעביר את הספריות האלו?" +msgstr[3] "להעביר את הספריות האלו?" + +msgid "onboarding.team-modal.team-definition" +msgstr "מה זה צוות?" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs +msgid "settings.select-this-color" +msgstr "בחירת פריטים שמשתמשים בסגנון הזה" + +msgid "shortcuts.toggle-guides" +msgstr "הצגת / הסתרת קווים מנחים" + +msgid "shortcuts.scale" +msgstr "התאמת גודל" + +msgid "shortcuts.toggle-layout-grid" +msgstr "הוספת/הסרת פריסת רשת" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "מיון" + +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "ספק האימות לא מורשה לפרופיל הזה" + +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "שם התחום לא מורשה" + +msgid "modals.move-shared-confirm.title" +msgid_plural "modals.move-shared-confirm.title" +msgstr[0] "העברת ספרייה" +msgstr[1] "העברת ספריות" +msgstr[2] "העברת ספריות" +msgstr[3] "העברת ספריות" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-one" +msgstr "אין" + +msgid "shortcuts.toggle-rulers" +msgstr "הצגת / הסתרת סרגלים" + +msgid "shortcuts.toggle-snap-guides" +msgstr "הצמדה לקווים מנחים" + +msgid "shortcuts.toggle-snap-ruler-guide" +msgstr "הצמדה לקווים מנחים סרגלים" -- Gitee From 4b05551ecca78c7dd7b463f4d882ebc86e00cfd4 Mon Sep 17 00:00:00 2001 From: Edgars Andersons Date: Thu, 25 Apr 2024 06:26:12 +0000 Subject: [PATCH 0462/1266] :globe_with_meridians: Add translations for: Latvian. Currently translated at 100.0% (1379 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/ --- frontend/translations/lv.po | 129 ++++++++++++++++++++++++++++++++++-- 1 file changed, 125 insertions(+), 4 deletions(-) diff --git a/frontend/translations/lv.po b/frontend/translations/lv.po index 1571281be..133140de6 100644 --- a/frontend/translations/lv.po +++ b/frontend/translations/lv.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-24 12:55+0000\n" -"Last-Translator: Anonymous \n" +"PO-Revision-Date: 2024-04-25 13:07+0000\n" +"Last-Translator: Edgars Andersons \n" "Language-Team: Latvian \n" "Language: lv\n" @@ -1034,7 +1034,6 @@ msgstr "Savienojuma kļūda, URL nav sasniedzams" msgid "errors.webhooks.invalid-uri" msgstr "URL neiztur pārbaudi." -#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Pēdējā piegāde nebija veiksmīga." @@ -3265,7 +3264,6 @@ msgstr "Rādīt mijiedarbības pēc klikšķa" msgid "viewer.header.sitemap" msgstr "Vietnes karte" -#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Pēdējā piegāde bija veiksmīga." @@ -5564,3 +5562,126 @@ msgstr "" #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.loading" msgstr "Ielādē…" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "Pieteikties manā kontā" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-tagline" +msgstr "" +"Penpot ir bezmaksas atvērtā pirmkoda dizaina rīks dizaina un koda sadarbībai" + +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "Autentifikācijas nodrošinātājs nav atļauts šim profilam" + +msgid "shortcuts.toggle-rulers" +msgstr "Rādīt/paslēpt mērjoslas" + +msgid "shortcuts.toggle-snap-guides" +msgstr "Pievilkt pie vadlīnijām" + +msgid "shortcuts.toggle-guides" +msgstr "Rādīt/paslēpt vadlīnijas" + +msgid "shortcuts.toggle-snap-ruler-guide" +msgstr "Pievilkt pie mērjoslu vadlīnijām" + +msgid "shortcuts.toggle-layout-grid" +msgstr "Pievienot/noņemt režģa izkārtojumu" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-ruler-guides" +msgstr "Atspējot pievilkšanu mērjoslu vadlīnijām" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-ruler-guides" +msgstr "Pievilkt pie mērjoslu vadlīnijām" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-guides" +msgstr "Parādīt vadlīnijas" + +msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" +msgstr "Norādīt režģa izkārtojumu" + +msgid "workspace.layout_grid.editor.padding.expand" +msgstr "Rādīt četrpusējas atbīdes iespējas" + +#, markdown +msgid "workspace.top-bar.view-only" +msgstr "**Apskata kodu** (tikai skatīšana)" + +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "Domēns nav atļauts" + +msgid "modals.move-shared-confirm.accept" +msgid_plural "modals.move-shared-confirm.accept" +msgstr[0] "Pārvietot" +msgstr[1] "Pārvietot" +msgstr[2] "Pārvietot" + +msgid "modals.move-shared-confirm.message" +msgid_plural "modals.move-shared-confirm.message" +msgstr[0] "Vai tiešām pārvietot šīs bibliotēkas?" +msgstr[1] "Vai tiešām pārvietot šīs bibliotēkas?" +msgstr[2] "Vai tiešām pārvietot šīs bibliotēkas?" + +msgid "modals.move-shared-confirm.title" +msgid_plural "modals.move-shared-confirm.title" +msgstr[0] "Pārvietot bibliotēkas" +msgstr[1] "Pārvietot bibliotēkas" +msgstr[2] "Pārvietot bibliotēkas" + +msgid "onboarding.team-modal.team-definition" +msgstr "Kas ir komanda?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-one" +msgstr "Neviens" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs +msgid "settings.select-this-color" +msgstr "Atlasīt vienumus, kas izmanto šo stilu" + +msgid "shortcuts.scale" +msgstr "Mērogot" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.filter" +msgstr "Atlasīt" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "Kārtot" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-guides" +msgstr "Paslēpt vadlīnijas" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.shared-library-btn" +msgstr "Savienot bibliotēku" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.unlink-library-btn" +msgstr "Atvienot bibliotēku" + +#: src/app/main/ui/workspace/sidebar/assets/common.cljs +msgid "workspace.assets.sidebar.components" +msgid_plural "workspace.assets.sidebar.components" +msgstr[0] "%s sastāvdaļu" +msgstr[1] "%s sastāvdaļa" +msgstr[2] "%s sastāvdaļas" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-grid" +msgstr "Noņemt režģa izkārtojumu" + +msgid "media.image.short" +msgstr "att." + +msgid "media.keep-aspect-ratio" +msgstr "Paturēt samēru" -- Gitee From 5394fce632980d1bd7b08636a6b45cc75afc902f Mon Sep 17 00:00:00 2001 From: Stephan Paternotte Date: Wed, 24 Apr 2024 14:32:02 +0000 Subject: [PATCH 0463/1266] :globe_with_meridians: Add translations for: Dutch. Currently translated at 100.0% (1379 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/ --- frontend/translations/nl.po | 128 ++++++++++++++++++++++++++++++++++-- 1 file changed, 122 insertions(+), 6 deletions(-) diff --git a/frontend/translations/nl.po b/frontend/translations/nl.po index 51bf23696..8a7dd127a 100644 --- a/frontend/translations/nl.po +++ b/frontend/translations/nl.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-24 12:55+0000\n" -"Last-Translator: Anonymous \n" +"PO-Revision-Date: 2024-04-25 13:07+0000\n" +"Last-Translator: Stephan Paternotte \n" "Language-Team: Dutch \n" "Language: nl\n" @@ -1055,7 +1055,6 @@ msgstr "Verbindingsfout, URL niet bereikbaar" msgid "errors.webhooks.invalid-uri" msgstr "URL komt niet door de validatie." -#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Laatste levering was niet succesvol." @@ -1112,7 +1111,6 @@ msgid "feedback.title" msgstr "E-mail" #: src/app/main/ui/settings/feedback.cljs -#, fuzzy msgid "feedback.twitter-go-to" msgstr "Ga naar X" @@ -1121,7 +1119,6 @@ msgid "feedback.twitter-subtitle1" msgstr "Hier om te helpen met je technische vragen." #: src/app/main/ui/settings/feedback.cljs -#, fuzzy msgid "feedback.twitter-title" msgstr "X-ondersteuningsaccount" @@ -3287,7 +3284,6 @@ msgstr "Interacties tonen bij aanklikken" msgid "viewer.header.sitemap" msgstr "Sitemap" -#, fuzzy msgid "webhooks.last-delivery.success" msgstr "De laatste levering was succesvol." @@ -5529,3 +5525,123 @@ msgstr "Donker thema inschakelen" msgid "workspace.context-menu.grid-track.column.duplicate" msgstr "Kolom dupliceren" + +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "Domein niet toegestaan" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-one" +msgstr "Geen" + +msgid "shortcuts.toggle-snap-guides" +msgstr "Uitlijnen op hulpijnen" + +msgid "shortcuts.scale" +msgstr "Schaal" + +msgid "shortcuts.toggle-layout-grid" +msgstr "Raster-layout toevoegen/verwijderen" + +msgid "shortcuts.toggle-rulers" +msgstr "Linialen tonen/verbergen" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.filter" +msgstr "Filteren" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "Sorteren" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-ruler-guides" +msgstr "Uitlijnen op liniaal-hulplijnen" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.unlink-library-btn" +msgstr "Bibliotheekverbinding verbreken" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "Log in op mijn account" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-ruler-guides" +msgstr "Uitlijnen op liniaal-hulplijnen deactiveren" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-guides" +msgstr "Hulplijnen weergeven" + +msgid "workspace.layout_grid.editor.padding.expand" +msgstr "4-zijdige opvulopties weergeven" + +#, markdown +msgid "workspace.top-bar.view-only" +msgstr "**Code inspecteren** (alleen weergave)" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-tagline" +msgstr "" +"Penpot is de gratis open-source ontwerptool voor samenwerking op het gebied " +"van ontwerp en code" + +msgid "modals.move-shared-confirm.accept" +msgid_plural "modals.move-shared-confirm.accept" +msgstr[0] "Verplaatsen" +msgstr[1] "Verplaatsen" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-guides" +msgstr "Hulplijnen verbergen" + +msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" +msgstr "Raster-layout tonen" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.shared-library-btn" +msgstr "Bibliotheek verbinden" + +msgid "media.image.short" +msgstr "img" + +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "Auth-provider is niet toegestaan voor dit profiel" + +msgid "modals.move-shared-confirm.message" +msgid_plural "modals.move-shared-confirm.message" +msgstr[0] "Weet je zeker dat je deze bibliotheek wilt verplaatsen?" +msgstr[1] "Weet je zeker dat je deze bibliotheken wilt verplaatsen?" + +#: src/app/main/ui/workspace/sidebar/assets/common.cljs +msgid "workspace.assets.sidebar.components" +msgid_plural "workspace.assets.sidebar.components" +msgstr[0] "1 component" +msgstr[1] "%s componenten" + +msgid "modals.move-shared-confirm.title" +msgid_plural "modals.move-shared-confirm.title" +msgstr[0] "Bibliotheek verplaatsen" +msgstr[1] "Bibliotheken verplaatsen" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-grid" +msgstr "Raster-layout verwijderen" + +msgid "onboarding.team-modal.team-definition" +msgstr "Wat is een team?" + +msgid "media.keep-aspect-ratio" +msgstr "Verhoudingen behouden" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs +msgid "settings.select-this-color" +msgstr "Selecteer items in deze stijl" + +msgid "shortcuts.toggle-guides" +msgstr "Hulplijnen tonen/verbergen" + +msgid "shortcuts.toggle-snap-ruler-guide" +msgstr "Uitlijnen op liniaal-hulplijnen" -- Gitee From 13619175699bc9d07adc1ee83ac2d9b41b616777 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Fri, 26 Apr 2024 04:37:34 +0000 Subject: [PATCH 0464/1266] :globe_with_meridians: Add translations for: Spanish. Currently translated at 99.8% (1377 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/ --- frontend/translations/es.po | 43 +++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/frontend/translations/es.po b/frontend/translations/es.po index 3c20441f5..35d8de3bf 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-24 12:55+0000\n" -"Last-Translator: Anonymous \n" +"PO-Revision-Date: 2024-04-26 04:53+0000\n" +"Last-Translator: Alejandro Alonso \n" "Language-Team: Spanish \n" "Language: es\n" @@ -5372,3 +5372,42 @@ msgstr "Crear area" msgid "workspace.context-menu.grid-cells.create-board" msgstr "Crear tablero" + +#: src/app/main/data/common.cljs +msgid "notifications.by-code.upgrade-version" +msgstr "Una nueva versión está disponible, por favor actualiza la página" + +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Tu biblioteca está vacía. Una vez que se agregue como Biblioteca Compartida, " +"los recursos que crees estarán disponibles para ser utilizados entre el " +"resto de tus archivos. ¿Estás seguro de que deseas publicarlo?" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Cargando…" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-guides" +msgstr "Mostrar guías" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "El fichero tiene un número de versión incompatible" + +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Detectada funcionalidad incompatible '%s'" + +msgid "errors.validation" +msgstr "Error de validación" + +msgid "errors.paste-data-validation" +msgstr "Datos inválidos en el portapapeles" + +msgid "labels.discard" +msgstr "Descartar" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "ver todos los cambios" -- Gitee From ee6245d2d1f19c6287063f39998745dfc29a8dcb Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 26 Apr 2024 08:58:42 +0200 Subject: [PATCH 0465/1266] Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ --- frontend/translations/af.po | 84 - frontend/translations/ar.po | 1449 +---------------- frontend/translations/cs.po | 579 +------ frontend/translations/de.po | 523 +----- frontend/translations/es.po | 126 +- frontend/translations/es_419.po | 158 -- frontend/translations/eu.po | 4 +- frontend/translations/fa.po | 4 +- frontend/translations/fr.po | 645 +------- frontend/translations/ha.po | 2536 ++---------------------------- frontend/translations/he.po | 391 +---- frontend/translations/id.po | 209 +-- frontend/translations/ig.po | 785 +++++---- frontend/translations/lv.po | 407 +---- frontend/translations/ms.po | 1471 +++++++++-------- frontend/translations/nl.po | 346 +--- frontend/translations/pl.po | 8 +- frontend/translations/pt_BR.po | 4 +- frontend/translations/pt_PT.po | 238 +-- frontend/translations/ro.po | 4 +- frontend/translations/tr.po | 884 +---------- frontend/translations/yo.po | 1017 ++++++------ frontend/translations/zh_CN.po | 525 +------ frontend/translations/zh_Hant.po | 4 +- 24 files changed, 1844 insertions(+), 10557 deletions(-) diff --git a/frontend/translations/af.po b/frontend/translations/af.po index 28d9148cd..55c10b660 100644 --- a/frontend/translations/af.po +++ b/frontend/translations/af.po @@ -11,86 +11,6 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.1-dev\n" -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "30 dae" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.add-shared" -msgstr "Voeg by as Gedeelde Biblioteek" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-not-expire" -msgstr "Die token het nie 'n verval datum nie" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-gitlab-submit" -msgstr "GitLab" - -msgid "common.share-link.placeholder" -msgstr "Deelbare skakel sal hier verskyn" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-title" -msgstr "Wagwoord vergeet?" - -msgid "common.share-link.current-tag" -msgstr "(huidige)" - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.invalid-token-error" -msgstr "Die hersteltoken is ongeldig." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "Genereer nuwe token" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "auth.notifications.team-invitation-accepted" -msgstr "Het suksesvol by die span aangesluit" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.title" -msgstr "Span saam!" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "180 dae" - -msgid "dashboard.export-frames" -msgstr "Voer borde as PDF uit" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-profile" -msgstr "Wil jy dit net probeer?" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-submit" -msgstr "Herstel Wagwoord" - -#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs -msgid "dashboard.copy-suffix" -msgstr "(kopieer)" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "Die naam word vereis" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.create-new-team" -msgstr "Skep 'n nuwe span" - -msgid "common.share-link.destroy-link" -msgstr "Vernietig skakel" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.copied-success" -msgstr "Token gekopieer" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.info" -msgstr "Gaan stap deur Penpot en leer sy hoofkenmerke ken." - #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" msgstr "Reeds 'n rekening?" @@ -139,10 +59,6 @@ msgstr "Meld hier aan" msgid "auth.login-submit" msgstr "Meld aan" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "Wonderlik om jou weer te sien!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" diff --git a/frontend/translations/ar.po b/frontend/translations/ar.po index 23b395643..2ec16828b 100644 --- a/frontend/translations/ar.po +++ b/frontend/translations/ar.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 12:55+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Arabic \n" +"Language-Team: Arabic " +"\n" "Language: ar\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -2267,9 +2267,6 @@ msgstr "قفل\\فتح" msgid "shortcuts.toggle-lock-size" msgstr "قفل النسب" -msgid "shortcuts.toggle-rules" -msgstr "إظهار\\إخفاء المسطرة" - msgid "shortcuts.toggle-textpalette" msgstr "تبديل لوحة النص" @@ -4306,1445 +4303,3 @@ msgstr "تحديث" msgid "workspace.viewport.click-to-close-path" msgstr "انقر لتغلق المسار" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-out" -msgstr "خارج" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.move" -msgstr "تحريك (%s)" - -#: src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.empty-palette" -msgstr "لا يوجد أنماط اللون في مكتبتك" - -msgid "workspace.options.component.copy" -msgstr "النسخ" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interactions" -msgstr "التفاعلات" - -msgid "workspace.undo.entry.multiple.circle" -msgstr "دوائر" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-action" -msgstr "فعل" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-center" -msgstr "المركز السفلي" - -msgid "workspace.shape.menu.transform-to-path" -msgstr "تحويل الى المسار" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-push" -msgstr "دفع" - -msgid "workspace.options.inspect" -msgstr "Inspectفحص" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-center" -msgstr "المركز العلوي" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.multiply" -msgstr "تضاعف" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.letter-spacing" -msgstr "تباعد الحروف" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.direction-rtl" -msgstr "RTL" - -msgid "workspace.options.component.create-annotation" -msgstr "إنشاء حاشية" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-auto-width" -msgstr "العرض التلقائي" - -msgid "workspace.options.shadow-options.color" -msgstr "لون الظل" - -msgid "viewer.header.inspect-section" -msgstr "التفحص (%s)" - -msgid "workspace.shape.menu.flatten" -msgstr "تسطيح" - -msgid "workspace.header.menu.hide-pixel-grid" -msgstr "إخفاء تشبيك اللوحة" - -msgid "workspace.undo.entry.multiple.page" -msgstr "صفحات" - -msgid "shortcuts.ungroup" -msgstr "فك التجميع" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.empty" -msgstr "لا يوجد تغييرات في التاريخ الى الآن" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin-simple" -msgstr "هامش بسيط" - -msgid "workspace.undo.entry.multiple.rect" -msgstr "مستطيلات" - -msgid "shortcuts.zoom-selected" -msgstr "كبر المحدد" - -msgid "workspace.options.grid.params.color" -msgstr "لون" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.group" -msgstr "مجموعة" - -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs -msgid "workspace.options.size-presets" -msgstr "الإعدادات المسبقة للحجم" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin" -msgstr "هامش" - -msgid "workspace.options.opacity" -msgstr "العتامة" - -msgid "workspace.options.component.edit-annotation" -msgstr "تحرير حاشية" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.file" -msgstr "الملف" - -msgid "workspace.undo.entry.multiple.media" -msgstr "الأصول الرسومية" - -msgid "workspace.options.show-in-viewer" -msgstr "أظهر في وضع العرض" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.lowercase" -msgstr "أحرف صغيرة" - -msgid "workspace.undo.entry.multiple.group" -msgstr "مجموعات" - -msgid "workspace.shape.menu.create-multiple-components" -msgstr "إنشاء عناصر جديدة" - -#, fuzzy -msgid "webhooks.last-delivery.success" -msgstr "محاذاة المركز الأفقي" - -msgid "workspace.options.stroke-width" -msgstr "عرض الضرب" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-out" -msgstr "خفف خارج" - -msgid "workspace.options.x" -msgstr "X محور" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-self" -msgstr "الذات" - -msgid "workspace.shape.menu.path" -msgstr "طريق" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.offsety" -msgstr "Y" - -msgid "workspace.focus.focus-mode" -msgstr "وضع التركيز" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-ms" -msgstr "القوائم" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.right" -msgstr "يمين" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.ellipse" -msgstr "الشكل البيضاوي (%s)" - -msgid "workspace.sidebar.layers.groups" -msgstr "مجموعات" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "مستطيل" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-left" -msgstr "أعلى اليسار" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.color-palette" -msgstr "لوحة اللون (%s)" - -msgid "workspace.undo.entry.multiple.frame" -msgstr "لوحة" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-min-h" -msgstr "الحد الأدنى للطول" - -msgid "workspace.path.actions.add-node" -msgstr "أضف العقدة (%s)" - -msgid "workspace.options.component.main" -msgstr "أصل" - -msgid "workspace.undo.entry.single.frame" -msgstr "لوحة" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow-starts" -msgstr "جاري التخطيط" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-position" -msgstr "موضع" - -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.more-colors" -msgstr "المزيد من الألوان" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-bottom" -msgstr "محاذاة الأسفل" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.new" -msgstr "جديد %s" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.create-artboard-from-selection" -msgstr "تحديد محتوى اللوحة" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-top-right" -msgstr "أعلى اليمين" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-in" -msgstr "داخل" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay" -msgstr "تبديل التراكب" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow" -msgstr "سهم المثلث" - -msgid "workspace.undo.entry.multiple.curve" -msgstr "منحنيات" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-guides" -msgstr "إبطال الفرقعة للخ\\وط الإرشادية" - -msgid "workspace.path.actions.snap-nodes" -msgstr "كسر العقد (%s)" - -msgid "workspace.undo.entry.multiple.multiple" -msgstr "أشياء" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-slide" -msgstr "انزلاق" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-min-w" -msgstr "الحد الأدنى للعرض" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-min-h" -msgstr "الحد الأدنو للارتفاع" - -msgid "workspace.sidebar.layers.masks" -msgstr "قناعات" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.screen" -msgstr "شاشة" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "رؤية جميع التغييرات" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.inner-shadow" -msgstr "التظليل الداخلي" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.frame" -msgstr "لوحة (%s)" - -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "لا يوجد أنماط الكتابة في مكتبتك" - -#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.paste" -msgstr "معجون" - -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.selection-fill" -msgstr "اختر نوع الملأ" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-middle" -msgstr "محاذاة الوسط" - -msgid "viewer.breaking-change.description" -msgstr "" -"وصف كسر التغييرThis shareable link is no longer valid. Create a new one or " -"ask the owner for a new one.هذا الرابط القابل للمشاركة لم يعد صالحا.صمم " -"جديدا أو اسأل مالكه للجديد" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-background" -msgstr "إضافة تراكب الخلفية" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.unknown" -msgstr "انتهت العملية %s" - -msgid "shortcuts.zoom-lense-increase" -msgstr "زيادة عدسة التكبير" - -msgid "workspace.shape.menu.add-grid" -msgstr "إضافة تخطيط التشبيك" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-complete" -msgstr "تم التصدير" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-delay" -msgstr "تأخير" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.luminosity" -msgstr "لمعان" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flip-vertical" -msgstr "التوجيه الرئسي" - -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.position" -msgstr "الموضع" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square" -msgstr "مربع" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-justify" -msgstr "تعديل (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.space-between" -msgstr "التباعد بين" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.uppercase" -msgstr "الأحرف الكبيرة" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom" -msgstr "تكبير" - -msgid "workspace.options.component.annotation" -msgstr "حاشية" - -msgid "shortcuts.toggle-layers" -msgstr "تبديل الطبقات" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-preserve-scroll" -msgstr "حفظ موضع التمرير" - -msgid "workspace.undo.entry.single.typography" -msgstr "أصل الكتابة" - -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.selection-color" -msgstr "الألوان المختارة" - -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.more-lib-colors" -msgstr "المزيد من ألوان المكتبة" - -msgid "workspace.header.menu.disable-snap-pixel-grid" -msgstr "إبطال الفرقعة للبكسل" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in" -msgstr "خفف داخل" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.solid" -msgstr "صلب" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.delete" -msgstr "محذوف %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.top" -msgstr "أعلى" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius.single-corners" -msgstr "زوايا مستقلة" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.dotted" -msgstr "منقط" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-artboard-names" -msgstr "إخفاء أسماء البورد" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.backward" -msgstr "أرسل الى الخلف" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.select-a-shape" -msgstr "اختر الشكل أو اللوحة لجر الإتصال الى لوحة أو شكل آخر" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke" -msgstr "ضرب" - -msgid "workspace.layout_grid.editor.title" -msgstr "تحرير التشبيك" - -msgid "workspace.undo.entry.single.page" -msgstr "صفحة" - -#: src/app/main/ui/dashboard/team.cljs -msgid "team.webhooks.max-length" -msgstr "يجب الا يزيد اسم الويبهوك على 2048 حرفا" - -msgid "workspace.sidebar.layers.images" -msgstr "صور" - -msgid "workspace.header.menu.show-pixel-grid" -msgstr "Show pixel grid" - -msgid "workspace.header.menu.undo" -msgstr "الإلغاء" - -msgid "workspace.undo.entry.single.color" -msgstr "أصل اللون" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.line-height" -msgstr "ارتفاع الخط" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.ungroup" -msgstr "فك التجميع" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-auto-height" -msgstr "الإرتفاع التلقائي" - -msgid "workspace.focus.focus-on" -msgstr "تشغيل التركيز" - -msgid "viewer.header.comments-section" -msgstr "التعليقات (%s)" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.unlock" -msgstr "الغاء القفل" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-bottom-right" -msgstr "أسفل اليمين" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay" -msgstr "فتح التراكب" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-dissolve" -msgstr "تذوب" - -msgid "workspace.undo.entry.single.rect" -msgstr "مستطيل" - -msgid "shortcuts.toggle-visibility" -msgstr "أظهر\\أخف" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-full-screen" -msgstr "تكبير الشاشة" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.cut" -msgstr "قطع" - -msgid "workspace.header.menu.disable-scale-content" -msgstr "Disable proportional scale" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-object-slow" -msgstr "التصدير بطيء بشكل غير متوقع" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.lock" -msgstr "إغلاق" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.modify" -msgstr "معدل %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin-all" -msgstr "جميع النواحي" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.strikethrough" -msgstr "الإضراب من خلال(%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.reset-overrides" -msgstr "إعادة ضبط التجاوزات" - -msgid "workspace.undo.entry.multiple.typography" -msgstr "أصول الكتابة" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-center" -msgstr "محاذاة المركز (%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.text-palette" -msgstr "الكتابات (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.titlecase" -msgstr "Title case" - -msgid "workspace.sidebar.layers.frames" -msgstr "لوحات" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fit" -msgstr "تقليص المقياس للتناسب" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-object-error" -msgstr "Export failed" - -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.hsv" -msgstr "HSV" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.delete-flow-start" -msgstr "حذف المخطط" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-left" -msgstr "اأسفل اليسار" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "الماس" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-offset-effect" -msgstr "تأثير الإزاحة" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.mixed" -msgstr "مختلط" - -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgba" -msgstr "RGBA" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row" -msgstr "الصف" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to" -msgstr "الإنتقال الى" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.inner" -msgstr "داخل" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.underline" -msgstr "تسطير (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay-dest" -msgstr "إغلاق التراكب: %s" - -msgid "workspace.header.menu.redo" -msgstr "إعادة" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.detach-instance" -msgstr "فصل المثال" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-right" -msgstr "محاذاة اليمين (%s)" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-textpalette" -msgstr "أظهر لوخة أسلوب الخط" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flip-horizontal" -msgstr "Flip horizontal" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.hard-light" -msgstr "ضوء الثابت" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-max-w" -msgstr "أقصى عرض" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column-reverse" -msgstr "العموج العكسي" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.front" -msgstr "النقل الى الأمام" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-center" -msgstr "مركز" - -msgid "workspace.undo.entry.single.multiple" -msgstr "عنصر" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.add-interaction" -msgstr "انقر على زر +لإضافة التفاعلات" - -msgid "workspace.shape.menu.difference" -msgstr "الفارق" - -msgid "workspace.assets.duplicate-main" -msgstr "انسخ الأصل" - -msgid "workspace.undo.entry.multiple.path" -msgstr "مسارات" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-right" -msgstr "أسفل اليمين" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show-main" -msgstr "أظهر المكون الرئيسي" - -msgid "shortcuts.v-distribute" -msgstr "النشر عموديا" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.grid-title" -msgstr "تشبيك" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.offsetx" -msgstr "X" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.none" -msgstr "لا شيء" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.exclusion" -msgstr "الإستبعاد" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.title" -msgstr "تاريخ" - -msgid "workspace.options.recent-fonts" -msgstr "مؤخر" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-textpalette" -msgstr "إخفاء لوحة أسلوب خط" - -msgid "workspace.undo.entry.single.component" -msgstr "component" - -msgid "workspace.assets.local-library" -msgstr "المكتبة المحلية" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.unmask" -msgstr "كشف القناع" - -msgid "shortcuts.toggle-textpalette" -msgstr "تبديل لوحة النص" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-top" -msgstr "محاذاة أعلى" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-pressing" -msgstr "حين الضغط" - -msgid "workspace.sidebar.collapse" -msgstr "انهيار الشريط الجانبي" - -msgid "workspace.options.height" -msgstr "طول" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.update-main" -msgstr "تحديث العنصر الرئيسي" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flow-start" -msgstr "بداية المخطط" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.remove-flex" -msgstr "إزالة تخطيط المنحنى" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow-start" -msgstr "إضافة المخطط" - -msgid "workspace.sidebar.layers.components" -msgstr "العناصر" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease" -msgstr "خفف" - -#: src/app/main/ui/workspace/sidebar/options/menus/svg_attrs.cljs, src/app/main/ui/inspect/attributes/svg.cljs -msgid "workspace.sidebar.options.svg-attrs.title" -msgstr "السمات المستوردةSVG" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.comments" -msgstr "تعليقات (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-none" -msgstr "لا شيء" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.lighten" -msgstr "تفتيح" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "workspace.options.export-multiple" -msgstr "تحديد المصدر" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.hide" -msgstr "إخفاء" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.retry" -msgstr "أعد المحاولة" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-relative-to" -msgstr "بالنسبة الى" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.update-components-in-bulk" -msgstr "تحديث العناصر الرئيسية" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.sidebar.history" -msgstr "التاريخ (%s)" - -msgid "workspace.options.clip-content" -msgstr "محتوى المقطع" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.path" -msgstr "مسار (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius.all-corners" -msgstr "كل الزوايا" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-right" -msgstr "أعلى اليمين" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.select-layer" -msgstr "اختيار الطبقة" - -msgid "workspace.undo.entry.single.image" -msgstr "صورة" - -msgid "workspace.shape.menu.intersection" -msgstr "التفاعلات" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-trigger" -msgstr "مشغل" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.shortcuts" -msgstr "الإختصار (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding" -msgstr "حشوة" - -msgid "title.team-webhooks" -msgstr "خطافات الويب - %s - Penpot" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library-updates" -msgstr "تحديث المكتبة" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.none" -msgstr "لا شيء" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-none" -msgstr "(غير مهيء)" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing" -msgstr "تخفيف" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "المثلث" - -msgid "workspace.path.actions.draw-nodes" -msgstr "جر العقدة (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row-reverse" -msgstr "الصف العكسي" - -msgid "workspace.undo.entry.single.media" -msgstr "أصل الرسومات" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.packed" -msgstr "معباة" - -msgid "workspace.header.menu.enable-snap-pixel-grid" -msgstr "تمكين الفرقعة للبكسل" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-enter" -msgstr "إدخال الفأرة" - -msgid "workspace.undo.entry.single.circle" -msgstr "دائرة" - -msgid "viewer.header.interactions-section" -msgstr "التفاعلات (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title.group" -msgstr "ظل المجموعة" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title.group" -msgstr "طبقات المجموعة" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.reset-zoom" -msgstr "إعادة ضبط" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.assets" -msgstr "أصول" - -msgid "workspace.assets.open-library" -msgstr "افتح ملف المكتب" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title-selection" -msgstr "نص الإختيار" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "مكتبة مشتركة" - -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.size" -msgstr "مقاس" - -msgid "workspace.undo.entry.multiple.component" -msgstr "عناصر" - -msgid "workspace.focus.selection" -msgstr "تحديد" - -msgid "workspace.path.actions.merge-nodes" -msgstr "دمج العقد (%s)" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.create-component" -msgstr "إنشاء نعصر" - -msgid "workspace.undo.entry.multiple.color" -msgstr "أصول اللون" - -msgid "workspace.header.menu.enable-scale-content" -msgstr "تمكين المقياس النسبي" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.group-stroke" -msgstr "ضرب المجموعة" - -msgid "workspace.shape.menu.union" -msgstr "اتحاد" - -msgid "workspace.shape.menu.thumbnail-set" -msgstr "تعيين كصورة مصغرة" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fill" -msgstr "مقياس الملأ" - -msgid "workspace.sidebar.layers.texts" -msgstr "نصوص" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-left" -msgstr "محاذاة (%s)" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.dismiss" -msgstr "رفض" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.duplicate" -msgstr "ينسخ" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "مزيد من المعلومات" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.forward" -msgstr "النقل الى الأمام" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-hovering" -msgstr "حين التحوم" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show" -msgstr "العرض" - -msgid "workspace.shape.menu.hide-ui" -msgstr "أظهر أو إخف UI" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.center" -msgstr "مركز" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-manual" -msgstr "يدوي" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.sidebar.layers" -msgstr "الطبقات" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-leave" -msgstr "إخراج الفأرة" - -msgid "workspace.assets.typography.text-styles" -msgstr "أسلوب خط النص" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker" -msgstr "معلم الدائرة" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-min-w" -msgstr "الحد الأدنى للعرض" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.gap" -msgstr "فجوة" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker" -msgstr "معلم المربع" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column" -msgstr "عمود" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation" -msgstr "الرسومات المتحركة" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.drop-shadow" -msgstr "إسقاط الظل" - -msgid "workspace.undo.entry.single.curve" -msgstr "منحنى" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.overlay" -msgstr "تراكب" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in-out" -msgstr "خفف داخل و خارج" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-guides" -msgstr "الفرقعة للخطوط الإرشادية" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-linear" -msgstr "خطي" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-on-click" -msgstr "بعد النقر" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to-dest" -msgstr "انتقال الى: %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.spread" -msgstr "الانتشار" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.bottom" -msgstr "أسفل" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-duration" -msgstr "مدة" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.advanced-ops" -msgstr "خيارات متقدمة" - -msgid "shortcuts.toggle-zoom-style" -msgstr "تبديل أسلوب التكبير" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-outside" -msgstr "عطل إذا نقر في الخارج" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.blur" -msgstr "تطميس" - -msgid "workspace.path.actions.separate-nodes" -msgstr "فصل العقد (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.selection-stroke" -msgstr "ضرب الإختيار" - -#: src/app/main/ui/workspace/sidebar/options.cljs -msgid "workspace.options.prototype" -msgstr "النموذج المبدئي" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.use-play-button" -msgstr "استعمل زر التشغيل أعلاه لتشغيل منظر النموذج المبدئي." - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.hue" -msgstr "مسحة" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-artboard-names" -msgstr "أظهر أسماء البورد" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.dashed" -msgstr "متقطع" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.left" -msgstr "شمال" - -msgid "workspace.shape.menu.thumbnail-remove" -msgstr "أطهر الصورة المصغرة" - -msgid "shortcuts.toggle-layout-flex" -msgstr "أضف\\أزل ثني التخطيط" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.space-around" -msgstr "التباعد حول" - -msgid "workspace.options.width" -msgstr "عرض" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.rect" -msgstr "مستطيل (%s)" - -msgid "workspace.undo.entry.single.group" -msgstr "مجموعة" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-max-w" -msgstr "أقصى عرض" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.sitemap" -msgstr "خريطة الموقع" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-bottom-left" -msgstr "أسفل اليسار" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay" -msgstr "إغلاق التراكب" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker" -msgstr "معلم الماس" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.soft-light" -msgstr "ضوء خافت" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding-simple" -msgstr "حشوة بسيطة" - -msgid "workspace.shape.menu.create-annotation" -msgstr "إنشاء تعليق توضيحي" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-selected" -msgstr "تكبير" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay-dest" -msgstr "فتح التراكب: %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-url" -msgstr "رابط مفتوح" - -msgid "workspace.path.actions.delete-node" -msgstr "احذف العقدة (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-destination" -msgstr "وجهة" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.go-main" -msgstr "انتقل الى ملف العنصر الأصلي" - -msgid "shortcuts.undo" -msgstr "الغاء" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "سهم" - -msgid "workspace.path.actions.make-curve" -msgstr "الى المنحنى (%s)" - -msgid "workspace.options.search-font" -msgstr "البخث عن نوع الخط" - -msgid "workspace.path.actions.move-nodes" -msgstr "نقل العقد (%s)" - -msgid "workspace.path.actions.join-nodes" -msgstr "صل العقد (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-url" -msgstr "الرابط المفتوح" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.move" -msgstr "المكونات المعدلة" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title.multiple" -msgstr "الطبقات المحددة" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.direction-ltr" -msgstr "LTR" - -#: src/app/main/ui/dashboard/team.cljs -msgid "title.team-invitations" -msgstr "الدعوات - %s - Penpot" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.delete" -msgstr "حذف" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show-in-assets" -msgstr "العرض في لوحة الاصول" - -msgid "workspace.undo.entry.multiple.shape" -msgstr "أشكال" - -msgid "workspace.options.interaction-auto" -msgstr "تلقائي" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title.multiple" -msgstr "ظلال الإختيار" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-prev-screen" -msgstr "الشاشة السابقة" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.text" -msgstr "نص (%s)" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.copy" -msgstr "انسخ" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.curve" -msgstr "منحنى (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding-all" -msgstr "جميع النواحي" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title" -msgstr "نص" - -msgid "shortcuts.underline" -msgstr "الخط التحتي" - -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgb-complementary" -msgstr "RGB مكملات" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.edit" -msgstr "التحرير" - -msgid "shortcuts.unmask" -msgstr "كشف القناع" - -msgid "workspace.options.y" -msgstr "Y محور" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.round" -msgstr "دائري" - -msgid "shortcuts.toggle-lock" -msgstr "قفل\\فتح" - -msgid "viewer.breaking-change.message" -msgstr "آسف" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title" -msgstr "طبقة" - -msgid "workspace.undo.entry.multiple.text" -msgstr "نصوص" - -msgid "workspace.sidebar.layers.shapes" -msgstr "بسومات" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.add-flow-start" -msgstr "إضافة المخطط" - -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.show-fill-on-export" -msgstr "أظهر في المصدر" - -msgid "shortcuts.toggle-lock-size" -msgstr "قفل النسب" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-max-h" -msgstr "أقصى ارتفاع" - -msgid "workspace.shape.menu.restore-main" -msgstr "استعادة العنصر الرئيسي" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.saturation" -msgstr "التشبع" - -msgid "workspace.sidebar.expand" -msgstr "توسيع الشريط الجانبي" - -#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.mask" -msgstr "قناع" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay-dest" -msgstr "تبديل التراكب: %s" - -msgid "workspace.path.actions.make-corner" -msgstr "الى الزاوية (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "الدائرة" - -msgid "workspace.options.stroke-color" -msgstr "لون الضرب" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.outer" -msgstr "خارج" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-top-left" -msgstr "أعلى الشمال" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.normal" -msgstr "عادي" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.preferences" -msgstr "التفضيلات" - -msgid "workspace.shape.menu.exclude" -msgstr "استبعاد" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.rotation" -msgstr "دوران" - -msgid "shortcuts.zoom-lense-decrease" -msgstr "تنقيص عدسة التكبير" - -msgid "workspace.undo.entry.single.shape" -msgstr "شكل" - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "workspace.sidebar.sitemap" -msgstr "صفحات" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.view" -msgstr "المنظر" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.detach-instances-in-bulk" -msgstr "فصل الامثلة" - -msgid "workspace.focus.focus-off" -msgstr "تعطيل التركيز" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "title.settings.access-tokens" -msgstr "رموز الوصول للحساب" - -msgid "workspace.options.radius" -msgstr "نصف القطر" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.back" -msgstr "أرسل الى الخلف" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow" -msgstr "سهم الخط" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.edit" -msgstr "تحرير" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fit-all" -msgstr "التكبير لتناسب الجميع" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-after-delay" -msgstr "بعد التأخير" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-max-h" -msgstr "أقصى ارتفاع" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title" -msgstr "الظل" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.help-info" -msgstr "المساعدة و المعلومة" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title-group" -msgstr "نص للمجموعة" - -msgid "workspace.undo.entry.single.text" -msgstr "نص" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.grow-fixed" -msgstr "مثبت" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.image" -msgstr "صورة (%s)" - -msgid "workspace.undo.entry.single.path" -msgstr "مسار" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.add-flex" -msgstr "إضافة تخطيط الثني" diff --git a/frontend/translations/cs.po b/frontend/translations/cs.po index d0944cd96..8d7f51983 100644 --- a/frontend/translations/cs.po +++ b/frontend/translations/cs.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 12:55+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Czech \n" +"Language-Team: Czech " +"\n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -4985,10 +4985,6 @@ msgstr "Text (%s)" msgid "workspace.toolbar.text-palette" msgstr "Typografie (%s)" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Režim kontroly** (Pouze zobrazení)" - msgid "workspace.top-bar.read-only.done" msgstr "Hotovo" @@ -5125,574 +5121,3 @@ msgstr "Aktualizace" msgid "workspace.viewport.click-to-close-path" msgstr "Kliknutím zavřete cestu" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-never" -msgstr "Nikdy" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "Platnost vypršela %s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.no-expiration" -msgstr "Žádné datum vypršení platnosti" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Soubor má nekompatibilní číslo verze" - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Zjištěna nekompatibilní funkce '%s'" - -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Nenastaveno" - -msgid "labels.discard" -msgstr "Zahodit" - -msgid "labels.share" -msgstr "Sdílet" - -msgid "labels.search" -msgstr "Hledat" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.submit-label" -msgstr "Vytvořit token" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.scd-message" -msgid_plural "modals.delete-shared-confirm.activated.scd-message" -msgstr[0] "Tato knihovna je aktivována zde: " -msgstr[1] "Tyto knihovny jsou aktivovány zde: " -msgstr[2] "Tyto knihovny jsou aktivovány zde: " - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Vytvořte tým a odešlete pozvánky" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Vytvořte tým bez pozvánek" - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Vytvořte tým" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Budete moci pozvat později" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "31-50" - -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Pokračujte ve vytváření týmu" - -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Začněte bez týmu" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Později budete moci vytvořit tým." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Canva" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Odpojit" - -#: src/app/main/ui/dashboard/team.cljs -msgid "team.webhooks.max-length" -msgstr "Název webhooku musí obsahovat maximálně 2048 znaků." - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom" -msgstr "Přiblížení" - -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Upravit mřížku" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Odejít" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library-updates" -msgstr "AKTUALIZACE KNIHOVNY" - -msgid "workspace.options.component.swap" -msgstr "Vyměnit komponent" - -msgid "workspace.options.component.swap.empty" -msgstr "V této knihovně zatím nejsou žádné položky" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Flow" - -msgid "workspace.top-bar.read-only.done" -msgstr "Hotovo" - -msgid "media.image" -msgstr "Obrázek" - -msgid "media.solid" -msgstr "Plná" - -msgid "media.linear" -msgstr "Lineární" - -msgid "media.radial" -msgstr "Radiální" - -msgid "media.gradient" -msgstr "Přechod" - -msgid "media.choose-image" -msgstr "Vyberte obrázek" - -msgid "workspace.options.guides.title" -msgstr "Vodítka" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Při vytváření nového účtu souhlasíte s našimi [smluvními podmínkami](%s) a [" -"zásadami ochrany soukromí](%s)." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.copied-success" -msgstr "Zkopírovaný token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"Osobní přístupové tokeny fungují jako alternativa k našemu systému ověřování " -"přihlašovacích údajů/hesel a lze je použít k tomu, aby aplikaci umožnily " -"přístup k internímu rozhraní Penpot API" - -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Zdá se, že existuje nesoulad mezi povolenými funkcemi a funkcemi souboru, " -"který se pokoušíte otevřít. Před otevřením souboru je třeba provést migraci " -"pro '%s'." - -msgid "errors.validation" -msgstr "Chyba ověření" - -msgid "errors.paste-data-validation" -msgstr "Neplatná data ve schránce" - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Pokračovat bez týmu" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Vytvořte tým a pozvěte" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Adobe XD" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "Vývojář" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Figma" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "InVision" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "Zanechte zpětnou vazbu pro můj týmový projekt" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "Další" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "Jiné (upřesněte)" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "Pracuji na osobním projektu" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "Předchozí" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "Jak plánujete používat Penpot?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "Jaká je vaše role?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "Vyberte možnost" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "Jaká je velikost vašeho týmu?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "Vyzkoušejte Penpot, abyste zjistili, zda je vhodný pro tým " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"Vaše zpětná vazba nám pomůže porozumět vašim zvykům a preferencím, abychom " -"mohli i nadále dělat Penpot užitečným nástrojem." - -msgid "shortcuts.text-align-center" -msgstr "Zarovnat na střed" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Lokalizovat" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Hotovo" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "zobrazit všechny změny" - -msgid "workspace.options.component.annotation" -msgstr "Anotace" - -msgid "workspace.shape.menu.create-multiple-components" -msgstr "Vytvořte více komponent" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Vaše knihovna je prázdná. Po přidání jako sdílená knihovna budou položky, " -"které vytvoříte, k dispozici pro použití se zbytkem vašich souborů. Opravdu " -"ji chcete publikovat?" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.copy-token" -msgstr "Kopírovat token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.label" -msgstr "Jméno" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.placeholder" -msgstr "Název může pomoci zjistit, k čemu token slouží" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.message" -msgstr "Opravdu chcete tento token smazat?" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.title" -msgstr "Smazat token" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "" -"Aktiva, která již byla v tomto souboru použita, tam zůstanou (nebude porušen " -"žádný návrh)." -msgstr[1] "" -"Aktiva, která již byla v těchto souborech použita, tam zůstanou (nebude " -"porušen žádný návrh)." -msgstr[2] "" -"Aktiva, která již byla v těchto souborech použita, tam zůstanou (nebude " -"porušen žádný návrh)." - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "Název musí obsahovat maximálně 250 znaků." - -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "Název musí obsahovat jiný znak než mezeru." - -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-not-empty" -msgstr "Heslo musí obsahovat jiný znak než mezeru." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.no-access-tokens" -msgstr "Zatím nemáte žádné tokeny." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "Přístupový token byl úspěšně vytvořen." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expires-on" -msgstr "Platnost vyprší %s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-60-days" -msgstr "60 dní" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "30 dní" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "180 dní" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-90-days" -msgstr "90 dní" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "Jméno je povinné" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-expire" -msgstr "Platnost tokenu vyprší %s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-not-expire" -msgstr "Token nemá žádné datum vypršení platnosti" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.access-tokens" -msgstr "Přístupové tokeny" - -msgid "workspace.options.component.edit-annotation" -msgstr "Upravit anotaci" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "Začněte pracovat na mém projektu" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "Žádný" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "... drátové modely, cesty a toky uživatelů, navigační stromy atd." - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.no-files-message" -msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "Není aktivován v žádném souboru." -msgstr[1] "Nejsou aktivovány v žádném souboru." -msgstr[2] "Nejsou aktivovány v žádném souboru." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "Generovat nový token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "" -"Pro vygenerování nového tokenu stiskněte tlačítko \"Vygenerovat nový token\"." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "Osobní přístupové tokeny" - -msgid "errors.cannot-upload" -msgstr "Nelze nahrát soubor médií." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.expiration-date.label" -msgstr "Datum vypršení platnosti" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.accept" -msgstr "Smazat token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.title" -msgstr "Vygenerujte přístupový token" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "Designer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Zakladatel / viceprezident" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "Pusťme se do toho!" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "Jsem freelancer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "Produktový nebo projektový manažer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Marketing" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "Více než 50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Sketch" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "Start" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "Před použitím Penpot on-premise si to vyzkoušejte" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "Práce v konceptech" - -msgid "shortcuts.select-parent-layer" -msgstr "Vybrat nadřazenou vrstvu" - -msgid "workspace.options.component.copy" -msgstr "Kopírovat" - -msgid "workspace.options.component.main" -msgstr "Hlavní" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Kruh" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Diamant" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Šipka" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Obdélník" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Trojúhelník" - -msgid "workspace.shape.menu.add-grid" -msgstr "Přidat rozvržení mřížky" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "Více informací" - -msgid "modals.delete-component-annotation.message" -msgstr "Opravdu chcete smazat tuto anotaci?" - -msgid "modals.delete-component-annotation.title" -msgstr "Smazat anotaci" - -msgid "modals.publish-empty-library.title" -msgstr "Publikovat prázdnou knihovnu" - -msgid "modals.publish-empty-library.accept" -msgstr "Publikovat" - -msgid "modals.publish-empty-library.message" -msgstr "Vaše knihovna je prázdná. Opravdu to chcete publikovat?" - -msgid "shortcuts.text-align-justify" -msgstr "Zarovnat do bloku" - -msgid "shortcuts.text-align-left" -msgstr "Zarovnat vlevo" - -msgid "shortcuts.text-align-right" -msgstr "Zarovnat vpravo" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "title.settings.access-tokens" -msgstr "Profil – Přístupové tokeny" - -msgid "workspace.assets.open-library" -msgstr "Otevřete soubor knihovny" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "Sdílená knihovna" - -#: src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.empty-palette" -msgstr "Ve vaší knihovně zatím nejsou žádné barevné styly" - -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "Ve vaší knihovně zatím nejsou žádné typografické styly" - -msgid "workspace.options.component.create-annotation" -msgstr "Vytvořte anotaci" - -msgid "workspace.shape.menu.create-annotation" -msgstr "Vytvořit anotaci" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "Jak byste nejlépe popsali své zkušenosti s prací na..." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "Zjistěte více o Penpot" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "Získejte kód z mého týmového projektu " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "...branding, ilustrace, marketing atd." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "Hodně" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "... design rozhraní, vizuální aktiva, návrhové systémy atd." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.some" -msgstr "Nějaké" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "S jakým designovým nástrojem máte více zkušeností?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "11-30" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "Student nebo učitel" - -msgid "workspace.layout_grid.editor.title" -msgstr "Úprava mřížky" - -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "K dispozici je nová verze, obnovte prosím stránku" diff --git a/frontend/translations/de.po b/frontend/translations/de.po index 2f2944694..a4736304a 100644 --- a/frontend/translations/de.po +++ b/frontend/translations/de.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-25 13:07+0000\n" "Last-Translator: Stas Haas \n" -"Language-Team: German \n" +"Language-Team: German " +"\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -64,6 +64,12 @@ msgstr "Hier anmelden" msgid "auth.login-submit" msgstr "Anmelden" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-tagline" +msgstr "" +"Penpot ist das kostenlose Open-Source-Design-Tool für die Zusammenarbeit " +"von Design und Code" + #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -3121,6 +3127,12 @@ msgstr "Auswahl sperren" msgid "shortcuts.toggle-lock-size" msgstr "Seitenverhältnis sperren/entsperren" +msgid "shortcuts.toggle-rulers" +msgstr "Lineale anzeigen / ausblenden" + +msgid "shortcuts.toggle-snap-guides" +msgstr "An Hilfslinien ausrichten" + msgid "shortcuts.toggle-textpalette" msgstr "Textpalette ein-/ausblenden" @@ -5177,10 +5189,6 @@ msgstr "Text (%s)" msgid "workspace.toolbar.text-palette" msgstr "Typografien (%s)" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Inspektionsmodus** (nur Ansicht)" - msgid "workspace.top-bar.read-only.done" msgstr "Fertig" @@ -5321,506 +5329,3 @@ msgstr "Aktualisieren" msgid "workspace.viewport.click-to-close-path" msgstr "Klicken Sie, um den Pfad zu schließen" - -msgid "workspace.options.component.copy" -msgstr "Kopie" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "Developer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "Produkt- oder Projektmanager" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Marketing" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "Ich arbeite an einem persönlichen Projekt" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Rechteck" - -msgid "workspace.options.component.main" -msgstr "Hauptkomponente" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "Ich bin ein Freelancer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Figma" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "...Branding, Illustrationen, Marketingmaterialien, usw." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.some" -msgstr "Einige" - -msgid "workspace.layout_grid.editor.title" -msgstr "Raster bearbeiten" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "Mehr als 50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "Weiter" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "Wie groß ist Ihr Team?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "... Wireframes, User Journeys & Flows, Navigationsbäume usw." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "Viel" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "Start" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Diamant" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "Wie wollen Sie Penpot nutzen?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "Wählen Sie eine Option" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "Designer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "Keine" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Adobe XD" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Trennen" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Sketch" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Dreieck" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.no-files-message" -msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "Es ist in keiner Datei aktiviert." -msgstr[1] "Sie sind in keiner Datei aktiviert." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "Sonstiges (bitte angeben)" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "Testen Sie Penpot, um zu sehen, ob es für das Team geeignet ist " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "Schüler oder Lehrer" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "Feedback für mein Team-Projekt hinterlassen" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "31-50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "InVision" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Canva" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "Mehr über Penpot erfahren" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "Zurück" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "Mit der Arbeit an meinem Projekt beginnen" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Pfeil" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "Mit welchem Design-Tool haben Sie mehr Erfahrung?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "Was ist Ihre Rolle?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Gründer/VP" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Kreis" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "11-30" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "... Interface-Design, visuelle Assets, Designsysteme usw." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "Arbeiten an Konzeptideen" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"Ihr Feedback wird uns helfen, Ihre Gewohnheiten und Vorlieben zu verstehen, " -"damit wir Penpot weiterhin zu einem nützlichen und angenehmen Werkzeug " -"machen können." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "" -"Wie würden Sie Ihre Erfahrungen bei der Arbeit an … am besten beschreiben?" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "Geteilte Bibliothek" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "Testen Sie Penpot, bevor Sie es auf einem eigenen Server verwenden" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "Code aus meinem Teamprojekt erhalten " - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "" -"Assets, die bereits in dieser Datei verwendet wurden, bleiben dort erhalten (" -"das Design bleibt erhalten)." -msgstr[1] "" -"Assets, die bereits in diesen Dateien verwendet wurden, bleiben dort " -"erhalten (das Design bleibt erhalten)." - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Ihre Bibliothek ist leer. Sobald es als Geteilte Bibliothek hinzugefügt " -"wurde, können die von Ihnen erstellten Assets in den übrigen Dateien " -"verwendet werden. Sind Sie sicher, dass Sie es veröffentlichen möchten?" - -msgid "media.radial" -msgstr "Radial" - -msgid "workspace.top-bar.read-only.done" -msgstr "Fertig" - -msgid "media.image" -msgstr "Bild" - -msgid "media.linear" -msgstr "Linear" - -msgid "media.gradient" -msgstr "Verlauf" - -msgid "media.solid" -msgstr "Einfarbig" - -msgid "media.choose-image" -msgstr "Bild auswählen" - -msgid "workspace.options.guides.title" -msgstr "Hilfslinien" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Die Datei hat eine inkompatible Versionsnummer" - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Inkompatible Funktion '%s' erkannt" - -msgid "errors.validation" -msgstr "Validierungsfehler" - -msgid "errors.paste-data-validation" -msgstr "Ungültige Daten in der Zwischenablage" - -msgid "labels.search" -msgstr "Suchen" - -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Ohne Team starten" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Sie können später ein Team erstellen." - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Ohne Team fortsetzen" - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Team erstellen und Einladungen versenden" - -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Mit der Erstellung eines Teams fortsetzen" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Team ohne Einladungen erstellen" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Team erstellen & einladen" - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Team erstellen" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Sie können später einladen" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Fertig" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Beenden" - -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Grid bearbeiten" - -msgid "workspace.options.component.swap" -msgstr "Komponente austauschen" - -msgid "workspace.options.component.swap.empty" -msgstr "Es gibt noch keine Assets in dieser Bibliothek" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Wenn Sie ein neues Konto erstellen, stimmen Sie unseren " -"[Nutzungsbedingungen](%s) und [Datenschutzrichtlinien](%s) zu." - -msgid "labels.share" -msgstr "Teilen" - -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Nicht gesetzt" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Lokalisieren" - -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Es scheint eine Nichtübereinstimmung zwischen den aktivierten Funktionen und " -"den Funktionen der Datei zu geben. Die Migrationen für '%s' müssen " -"durchgeführt werden, bevor die Datei geöffnet werden kann." - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Flow" - -msgid "workspace.header.menu.toggle-dark-theme" -msgstr "Zum dunklen Theme wechseln" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.loading" -msgstr "Laden…" - -msgid "workspace.context-menu.grid-track.column.delete" -msgstr "Spalte löschen" - -msgid "workspace.context-menu.grid-track.column.delete-shapes" -msgstr "Spalte und Formen löschen" - -msgid "workspace.context-menu.grid-track.row.duplicate" -msgstr "Zeile duplizieren" - -msgid "workspace.context-menu.grid-track.row.delete" -msgstr "Zeile löschen" - -msgid "workspace.context-menu.grid-track.row.delete-shapes" -msgstr "Zeile und Formen löschen" - -msgid "workspace.context-menu.grid-cells.merge" -msgstr "Zellen zusammenführen" - -msgid "workspace.context-menu.grid-cells.area" -msgstr "Bereich erstellen" - -msgid "workspace.context-menu.grid-cells.create-board" -msgstr "Board erstellen" - -msgid "workspace.context-menu.grid-track.column.add-before" -msgstr "1 Spalte links einfügen" - -msgid "shortcuts.toggle-theme" -msgstr "Theme ändern" - -msgid "workspace.header.menu.toggle-light-theme" -msgstr "Zum hellen Theme wechseln" - -msgid "workspace.context-menu.grid-track.column.duplicate" -msgstr "Spalte duplizieren" - -msgid "workspace.context-menu.grid-track.row.add-after" -msgstr "1 Zeile unterhalb einfügen" - -msgid "workspace.context-menu.grid-track.row.add-before" -msgstr "1 Zeile oberhalb einfügen" - -msgid "dashboard.import.analyze-error.components-v2" -msgstr "" -"Datei mit Komponenten v2 aktiviert, aber dieses Team unterstützt es noch " -"nicht." - -msgid "workspace.context-menu.grid-track.column.add-after" -msgstr "1 Spalte rechts einfügen" - -msgid "modals.move-shared-confirm.title" -msgid_plural "modals.move-shared-confirm.title" -msgstr[0] "Bibliothek verschieben" -msgstr[1] "Bibliotheken verschieben" - -msgid "modals.move-shared-confirm.accept" -msgid_plural "modals.move-shared-confirm.accept" -msgstr[0] "Verschieben" -msgstr[1] "Verschieben" - -msgid "shortcuts.toggle-guides" -msgstr "Hilfslinien anzeigen / ausblenden" - -msgid "shortcuts.scale" -msgstr "Skalieren" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.filter" -msgstr "Filtern" - -#: src/app/main/ui/workspace/sidebar/assets/common.cljs -msgid "workspace.assets.sidebar.components" -msgid_plural "workspace.assets.sidebar.components" -msgstr[0] "1 Komponente" -msgstr[1] "% Komponenten" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.unlink-library-btn" -msgstr "Bibliothek trennen" - -msgid "media.keep-aspect-ratio" -msgstr "Seitenverhältnis beibehalten" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-account-title" -msgstr "In mein Konto einloggen" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-tagline" -msgstr "" -"Penpot ist das kostenlose Open-Source-Design-Tool für die Zusammenarbeit von " -"Design und Code" - -msgid "modals.move-shared-confirm.message" -msgid_plural "modals.move-shared-confirm.message" -msgstr[0] "Sind Sie sicher, dass Sie diese Bibliothek verschieben wollen?" -msgstr[1] "Sind Sie sicher, dass Sie diese Bibliotheken verschieben wollen?" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs -msgid "settings.select-this-color" -msgstr "Elemente mit diesem Stil auswählen" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.remove-grid" -msgstr "Grid-Layout entfernen" - -#: src/app/main/data/users.cljs -msgid "errors.auth-provider-not-allowed" -msgstr "Auth-Provider für dieses Profil nicht erlaubt" - -msgid "onboarding.team-modal.team-definition" -msgstr "Was ist ein Team?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.never-used-one" -msgstr "Keine" - -msgid "shortcuts.toggle-rulers" -msgstr "Lineale anzeigen / ausblenden" - -msgid "shortcuts.toggle-snap-guides" -msgstr "An Hilfslinien ausrichten" - -msgid "shortcuts.toggle-layout-grid" -msgstr "Grid-Layout hinzufügen/entfernen" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.sort" -msgstr "Sortieren" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-guides" -msgstr "Hilfslinien ausblenden" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-guides" -msgstr "Hilfslinien anzeigen" - -msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" -msgstr "Grid-Layout lokalisieren" - -msgid "workspace.layout_grid.editor.padding.expand" -msgstr "4-seitige Abstandsoptionen anzeigen" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.shared-library-btn" -msgstr "Bibliothek verknüpfen" - -#, markdown -msgid "workspace.top-bar.view-only" -msgstr "**Code inspizieren** (nur ansehen)" - -msgid "media.image.short" -msgstr "img" - -#: src/app/main/data/users.cljs -msgid "errors.email-domain-not-allowed" -msgstr "Domain nicht zulässig" diff --git a/frontend/translations/es.po b/frontend/translations/es.po index 35d8de3bf..46b7dd8fc 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -1,15 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-26 04:53+0000\n" +"PO-Revision-Date: 2024-04-26 07:03+0000\n" "Last-Translator: Alejandro Alonso \n" -"Language-Team: Spanish \n" +"Language-Team: Spanish " +"\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.5.1-dev\n" +"X-Generator: Weblate 5.5.1\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -1048,7 +1048,6 @@ msgstr "Error de conexion, la url no es alcanzable" msgid "errors.webhooks.invalid-uri" msgstr "La URL no pasa la validación." -#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Hubo un problema en el último envío." @@ -3266,7 +3265,6 @@ msgstr "Mostrar interacciones al hacer click" msgid "viewer.header.sitemap" msgstr "Mapa del sitio" -#, fuzzy msgid "webhooks.last-delivery.success" msgstr "El último envío fue correcto." @@ -3619,6 +3617,10 @@ msgstr "Seleccionar todo" msgid "workspace.header.menu.show-artboard-names" msgstr "Mostrar nombres de tableros" +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-guides" +msgstr "Mostrar guías" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-palette" msgstr "Mostrar paleta de colores" @@ -5299,115 +5301,3 @@ msgstr "Actualizar" msgid "workspace.viewport.click-to-close-path" msgstr "Pulsar para cerrar la ruta" - -#, markdown -msgid "workspace.top-bar.view-only" -msgstr "**Inspeccionando código** (View only)" - -msgid "workspace.top-bar.read-only.done" -msgstr "Hecho" - -msgid "media.image" -msgstr "Imagen" - -msgid "media.image.short" -msgstr "img" - -msgid "media.solid" -msgstr "Sólido" - -msgid "media.linear" -msgstr "Linear" - -msgid "media.radial" -msgstr "Radial" - -msgid "media.gradient" -msgstr "Gradiente" - -msgid "media.choose-image" -msgstr "Elegir imagen" - -msgid "media.keep-aspect-ratio" -msgstr "Mantener la proporción" - -msgid "workspace.options.guides.title" -msgstr "Guías" - -msgid "workspace.context-menu.grid-track.column.duplicate" -msgstr "Duplicar columna" - -msgid "workspace.context-menu.grid-track.column.add-before" -msgstr "Añadir 1 columna a la izquierda" - -msgid "workspace.context-menu.grid-track.column.add-after" -msgstr "Añadir 1 columna a la derecha" - -msgid "workspace.context-menu.grid-track.column.delete" -msgstr "Borrar columna" - -msgid "workspace.context-menu.grid-track.column.delete-shapes" -msgstr "Borrar columna con el contenido" - -msgid "workspace.context-menu.grid-track.row.duplicate" -msgstr "Duplicar fila" - -msgid "workspace.context-menu.grid-track.row.add-before" -msgstr "Añadir 1 fila encima" - -msgid "workspace.context-menu.grid-track.row.add-after" -msgstr "Añadir 1 fila debajo" - -msgid "workspace.context-menu.grid-track.row.delete" -msgstr "Borrar fila" - -msgid "workspace.context-menu.grid-track.row.delete-shapes" -msgstr "Borrar fila con el contenido" - -msgid "workspace.context-menu.grid-cells.merge" -msgstr "Fusionar celdas" - -msgid "workspace.context-menu.grid-cells.area" -msgstr "Crear area" - -msgid "workspace.context-menu.grid-cells.create-board" -msgstr "Crear tablero" - -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "Una nueva versión está disponible, por favor actualiza la página" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Tu biblioteca está vacía. Una vez que se agregue como Biblioteca Compartida, " -"los recursos que crees estarán disponibles para ser utilizados entre el " -"resto de tus archivos. ¿Estás seguro de que deseas publicarlo?" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.loading" -msgstr "Cargando…" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-guides" -msgstr "Mostrar guías" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "El fichero tiene un número de versión incompatible" - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Detectada funcionalidad incompatible '%s'" - -msgid "errors.validation" -msgstr "Error de validación" - -msgid "errors.paste-data-validation" -msgstr "Datos inválidos en el portapapeles" - -msgid "labels.discard" -msgstr "Descartar" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "ver todos los cambios" diff --git a/frontend/translations/es_419.po b/frontend/translations/es_419.po index 7ed31990e..dd1380c28 100644 --- a/frontend/translations/es_419.po +++ b/frontend/translations/es_419.po @@ -59,10 +59,6 @@ msgstr "Inicie sesión aquí" msgid "auth.login-submit" msgstr "Iniciar sesión" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-title" -msgstr "¡Qué bueno verte de nuevo!" - #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -413,160 +409,6 @@ msgstr "" msgid "dashboard.export-binary-multi" msgstr "Descargar %s archivos Penpot (.penpot)" -#: src/app/main/ui/auth/register.cljs -msgid "auth.already-have-account" -msgstr "¿Ya tienes una cuenta?" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.check-your-email" -msgstr "" -"Revise su correo electrónico y haga clic en el enlace para verificar y " -"comenzar a usar Penpot." - -#: src/app/main/ui/auth/register.cljs -msgid "auth.demo-warning" -msgstr "" -"Este es un servicio DEMO, NO LO UTILICE para trabajos reales, los proyectos " -"se borrarán periódicamente." - -#: src/app/main/ui/auth/register.cljs -msgid "auth.fullname" -msgstr "Nombre completo" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-google-submit" -msgstr "Google" - -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "El nombre debe contener algún carácter distinto al del espacio." - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "El nombre debe contener como máximo 250 caracteres." - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.recovery-token-sent" -msgstr "" -"El enlace de recuperación de contraseña ha sido enviado a su bandeja de " -"entrada de su correo electrónico." - -#: src/app/main/ui/auth/verify_token.cljs -msgid "auth.notifications.team-invitation-accepted" -msgstr "Se unió al equipo con éxito" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-subtitle" -msgstr "Le enviaremos un correo electrónico con instrucciones" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-subtitle" -msgstr "Es gratis, es de código abierto" - -msgid "auth.terms-of-service" -msgstr "Términos de servicio" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Al crear una nueva cuenta, acepta nuestros [terms of service](%s) y nuestra [" -"privacy policy](%s)." - -msgid "common.share-link.confirm-deletion-link-description" -msgstr "" -"¿Estás seguro de que deseas eliminar este enlace? Si lo haces ya no estará " -"disponible para nadie" - -msgid "common.share-link.link-copied-success" -msgstr "Enlace copiado exitosamente" - -msgid "common.share-link.manage-ops" -msgstr "Administrar permisos" - -msgid "common.share-link.placeholder" -msgstr "El enlace para compartir aparecerá aquí" - -msgid "common.share-link.team-members" -msgstr "Solo miembros del equipo" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-title" -msgstr "Crea una cuenta" - -msgid "common.share-link.title" -msgstr "Compartir prototipos" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.text" -msgstr "" -"Penpot está destinado a equipos. Invite a miembros a trabajar juntos en " -"proyectos y archivos" - -msgid "common.unpublish" -msgstr "Despublicar" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.title" -msgstr "¡En equipo!" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.info" -msgstr "" -"Aprenda los conceptos básicos en Penpot mientras se divierte con este " -"tutorial práctico." - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.start" -msgstr "Iniciar el tutorial" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.info" -msgstr "Date un paseo por Penpot y conoce sus principales características." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "Presione el botón \"Generar nuevo token\" para generar uno." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "Generar nuevo token" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "El nombre es requerido" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "Expirado el %s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "Tokens de acceso personal" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"Los tokens de acceso personal funcionan como una alternativa a nuestro " -"sistema de autenticación de inicio de sesión/contraseña y pueden usarse para " -"permitir que una aplicación acceda a la API interna de Penpot" - -#: src/app/main/data/dashboard.cljs, src/app/main/data/dashboard.cljs -msgid "dashboard.copy-suffix" -msgstr "(copiar)" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.create-new-team" -msgstr "Crear nuevo equipo" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to-link" -msgstr "Información sobre cómo configurar las exportaciones en Penpot." - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.no-elements" -msgstr "No hay elementos con configuración de exportación." - msgid "dashboard.export-frames" msgstr "Exportar tableros como PDF" diff --git a/frontend/translations/eu.po b/frontend/translations/eu.po index 14019c8a6..4db439f6e 100644 --- a/frontend/translations/eu.po +++ b/frontend/translations/eu.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 12:55+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Basque \n" +"Language-Team: Basque " +"\n" "Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" diff --git a/frontend/translations/fa.po b/frontend/translations/fa.po index ba5f00c96..abbbc8c5b 100644 --- a/frontend/translations/fa.po +++ b/frontend/translations/fa.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 12:55+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Persian \n" +"Language-Team: Persian " +"\n" "Language: fa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" diff --git a/frontend/translations/fr.po b/frontend/translations/fr.po index af086c394..91571b084 100644 --- a/frontend/translations/fr.po +++ b/frontend/translations/fr.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 12:55+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: French \n" +"Language-Team: French " +"\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -5044,644 +5044,3 @@ msgstr "Actualiser" msgid "workspace.viewport.click-to-close-path" msgstr "Cliquez pour fermer le chemin" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "Développeur" - -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "Une nouvelle version est disponible, merci de rafraîchir la page" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Figma" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "Beaucoup" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "Comment décririez-vous votre expérience de travail sur..." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Adobe XD" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "31-50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Canevas" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "En découvrir plus à propos de Penpot" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "Quel est l'outil de design avec lequel vous avez plus d'expérience?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "11-30" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "Je travaille sur un projet personnel" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "Quelle est la taille de votre équipe ?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "Comment comptez-vous utiliser Penpot ?" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "Bibliothèque partagée" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "Autres (préciser)" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "Étudiant ou enseignant" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "Essayer Penpot avant de l'utiliser en local" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "Travailler sur des idées de concept" - -#: src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.empty-palette" -msgstr "Il n'y a pas encore de styles de couleur dans votre bibliothèque" - -msgid "workspace.options.component.copy" -msgstr "Copier" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interactions" -msgstr "Interactions" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-center" -msgstr "Centré en bas" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"Vos retours nous aideront à comprendre vos habitudes et préférences afin que " -"nous puissions continuer à améliorer Penpot." - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-push" -msgstr "Pousser" - -msgid "workspace.options.inspect" -msgstr "Inspecter" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "Gestionnaire de produit ou de projet" - -msgid "workspace.options.component.create-annotation" -msgstr "Créer une note" - -msgid "viewer.header.inspect-section" -msgstr "Inspecter (%s)" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Marketing" - -msgid "workspace.options.opacity" -msgstr "Opacité" - -msgid "workspace.options.component.edit-annotation" -msgstr "Éditer une note" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "Obtenir le code du projet de mon équipe " - -msgid "workspace.options.show-in-viewer" -msgstr "Montrer en mode spectateur" - -msgid "workspace.shape.menu.create-multiple-components" -msgstr "Créer plusieurs composants" - -#, fuzzy -msgid "webhooks.last-delivery.success" -msgstr "Le dernier envoi a réussi." - -msgid "workspace.options.stroke-width" -msgstr "Largeur du tracé" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-out" -msgstr "Ease out" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-self" -msgstr "soi" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-ms" -msgstr "ms" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Rectangle" - -msgid "workspace.options.component.main" -msgstr "Principal" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow-starts" -msgstr "Départs des flux" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-position" -msgstr "Position" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "Je suis freelance" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-in" -msgstr "Dans" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay" -msgstr "Activer/désactiver la superposition" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow" -msgstr "Flèche triangle" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-slide" -msgstr "Glissement" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "Voir tous les changements" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "...image de marque, illustrations, supports marketing, etc." - -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "Il n'y a pas encore de styles typographiques dans votre bibliothèque" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-background" -msgstr "Ajouter une superposition d'arrière-plan" - -msgid "workspace.sidebar.layers.search" -msgstr "Rechercher des calques" - -msgid "shortcuts.zoom-lense-increase" -msgstr "Augmenter le zoom" - -msgid "workspace.shape.menu.add-grid" -msgstr "Ajouter grid layout" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-delay" -msgstr "Délai" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square" -msgstr "Carré" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.space-between" -msgstr "espace entre" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom" -msgstr "Zoom" - -msgid "workspace.options.component.annotation" -msgstr "Note" - -#: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs -msgid "workspace.options.more-lib-colors" -msgstr "Plus de couleurs de la bibliothèque" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in" -msgstr "Ease in" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.some" -msgstr "Un peu" - -msgid "workspace.layout_grid.editor.title" -msgstr "Édition de la grille" - -msgid "workspace.header.menu.undo" -msgstr "Annuler" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "Plus que 50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "Suivant" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay" -msgstr "Ouvrir la superposition" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-dissolve" -msgstr "Dissolution" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "" -"... wireframes, parcours et flux utilisateurs, arborescence de navigation, " -"etc." - -msgid "workspace.header.menu.disable-scale-content" -msgstr "Désactiver l'échelle proportionnelle" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "Commencer" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.text-palette" -msgstr "Polices (%s)" - -msgid "workspace.sidebar.layers.frames" -msgstr "Plans de travail" - -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.hsv" -msgstr "HSV" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.delete-flow-start" -msgstr "Supprimer le départ du flux" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Diamant" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-offset-effect" -msgstr "Effet de décalage" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row" -msgstr "Ligne" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to" -msgstr "Naviguer vers" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay-dest" -msgstr "Fermer la superposition : %s" - -msgid "workspace.header.menu.redo" -msgstr "Répéter" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column-reverse" -msgstr "Colonne inversée" - -msgid "workspace.assets.duplicate-main" -msgstr "Dupliquer le principal" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "Sélectionnez une option" - -msgid "workspace.options.recent-fonts" -msgstr "Récentes" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-pressing" -msgstr "En appuyant" - -msgid "workspace.sidebar.collapse" -msgstr "Réduire la barre latérale" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "Designer" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flow-start" -msgstr "Départ du flux" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "Aucune" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "C'est parti !" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.remove-flex" -msgstr "Retirer flex layout" - -msgid "workspace.sidebar.layers.components" -msgstr "Composants" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease" -msgstr "Ease" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Détacher" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Sketch" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-relative-to" -msgstr "Relatif à" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.update-components-in-bulk" -msgstr "Mettre à jour les composants" - -msgid "workspace.options.clip-content" -msgstr "Tronquer le contenu" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.select-layer" -msgstr "Sélectionner le calque" - -msgid "workspace.shape.menu.intersection" -msgstr "Intersection" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding" -msgstr "Marge intérieure" - -msgid "title.team-webhooks" -msgstr "Webhooks - %s - Penpot" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library-updates" -msgstr "MISES À JOUR DE LA BIBLIOTHÈQUE" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing" -msgstr "Easing" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Triangle" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row-reverse" -msgstr "Ligne inversée" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "workspace.options.export-object" -msgid_plural "workspace.options.export-object" -msgstr[0] "Exporter 1 élément" -msgstr[1] "Exporter %s éléments" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.packed" -msgstr "compacté" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-enter" -msgstr "Entrée de la souris" - -msgid "workspace.assets.open-library" -msgstr "Ouvrir le fichier de la bibliothèque" - -msgid "workspace.header.menu.enable-scale-content" -msgstr "Activer l'échelle proportionnelle" - -msgid "workspace.shape.menu.thumbnail-set" -msgstr "Définir comme miniature" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "Plus d'information" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-hovering" -msgstr "En survolant" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-manual" -msgstr "Manuel" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-leave" -msgstr "Sortie de la souris" - -msgid "workspace.assets.typography.text-styles" -msgstr "Styles de texte" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker" -msgstr "Marqueur cercle" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.gap" -msgstr "Gap" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker" -msgstr "Marqueur carré" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column" -msgstr "Colonne" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation" -msgstr "Animation" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "Tester Penpot pour voir si ça convient à mon équipe " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "Laisser un commentaire sur mon projet d'équipe" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in-out" -msgstr "Ease in out" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-linear" -msgstr "Linéaire" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-on-click" -msgstr "Au clic" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to-dest" -msgstr "Naviguer vers : %s" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "InVision" - -msgid "workspace.shape.menu.thumbnail-remove" -msgstr "Retirer la miniature" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.space-around" -msgstr "espace autour" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "Précédent" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay" -msgstr "Fermer la superposition" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker" -msgstr "Marqueur diamant" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding-simple" -msgstr "Marge intérieure simple" - -msgid "workspace.shape.menu.create-annotation" -msgstr "Créer une note" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay-dest" -msgstr "Ouvrir la superposition : %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-destination" -msgstr "Destination" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "Commencer à travailler sur mon projet" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Flèche" - -msgid "workspace.options.search-font" -msgstr "Rechercher une police" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "Quel est votre rôle ?" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show-in-assets" -msgstr "Afficher dans le panneau des ressources" - -msgid "workspace.options.interaction-auto" -msgstr "automatique" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Votre bibliothèque est vide. Une fois ajoutées comme Bibliothèque Partagée, " -"les ressources que vous créez seront utilisables dans vos autres fichiers. " -"Voulez-vous vraiment les publier ?" - -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgb-complementary" -msgstr "Complémentaire en RVB" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.round" -msgstr "Rond" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Fondateur/Direction" - -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.show-fill-on-export" -msgstr "Afficher à l'export" - -msgid "workspace.shape.menu.restore-main" -msgstr "Rétablir le composant principal" - -msgid "workspace.sidebar.expand" -msgstr "Ouvrir la barre latérale" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay-dest" -msgstr "Activer/désactiver la superposition : %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Cercle" - -msgid "workspace.options.stroke-color" -msgstr "Couleur du tracé" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "... design d'interface, éléments visuels, systèmes de conception, etc." - -msgid "shortcuts.zoom-lense-decrease" -msgstr "Diminuer le zoom" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "title.settings.access-tokens" -msgstr "Profil - Jetons d'accès" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow" -msgstr "Flèche de ligne" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-after-delay" -msgstr "Après un délai" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.add-flex" -msgstr "Ajouter flex layout" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Le numéro de version du fichier est incompatible" - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Fonctionnalité incompatible détectée '%s'" - -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Il semble y avoir une incompatibilité entre les fonctionnalités actives et " -"celles du fichier que tentez d'ouvrir. Vous devez activer les migrations " -"pour '%s' avant de pouvoir ouvrir le fichier." diff --git a/frontend/translations/ha.po b/frontend/translations/ha.po index 0da5ad95e..61c9c2de3 100644 --- a/frontend/translations/ha.po +++ b/frontend/translations/ha.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 12:55+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Hausa \n" +"Language-Team: Hausa " +"\n" "Language: ha\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -111,8 +111,24 @@ msgstr "an aika maka da saqon matakan da za a bi domin dawo da lambar tsaronka." msgid "auth.notifications.team-invitation-accepted" msgstr "ka zama dan tawaga" -msgid "shortcut-subsection.shape" -msgstr "Siffa" +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs +msgid "auth.password" +msgstr "lambar tsaro" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-length-hint" +msgstr "aqalla a sami alamoni 8" + +msgid "auth.privacy-policy" +msgstr "matakan kaxaita" + +#: src/app/main/ui/auth/recovery_request.cljs +msgid "auth.recovery-request-subtitle" +msgstr "za mu aika maka da saqon qa'idoji ta imel" + +#: src/app/main/ui/auth/recovery.cljs +msgid "auth.recovery-submit" +msgstr "canza lambar tsaro" #: src/app/main/ui/auth/register.cljs msgid "auth.register-subtitle" @@ -507,107 +523,8 @@ msgstr "kula da rubutu" msgid "dashboard.import.progress.upload-data" msgstr "xora bayani akan sabis (%s/%s)" -msgid "shortcuts.draw-curve" -msgstr "Ratse" - -#: src/app/main/ui/workspace/comments.cljs -msgid "labels.all" -msgstr "duk" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.file" -msgstr "fayil" - -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.hsla" -msgstr "HSLA" - -#: src/app/main/ui/auth/register.cljs -msgid "errors.registration-disabled" -msgstr "rigitar ba ta yi ba." - -msgid "workspace.undo.entry.multiple.media" -msgstr "kadarar zane" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "sami lambar kowane aiki " - -msgid "workspace.options.show-in-viewer" -msgstr "fito da kaurin sosai" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.lowercase" -msgstr "yanayin kasa" - -#: src/app/main/ui/settings/password.cljs -msgid "errors.password-invalid-confirmation" -msgstr "tabbata labar tsaro ta yi daidai" - -msgid "workspace.undo.entry.multiple.group" -msgstr "rukunis" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.updates" -msgstr "sabuntawa" - -msgid "dashboard.export-frames" -msgstr "Allon fitarwa na PDF" - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "modals.delete-page.title" -msgstr "goge shafi" - -#: src/app/main/ui/static.cljs -msgid "labels.service-unavailable.main-message" -msgstr "ba sabis" - -msgid "shortcuts.opacity-2" -msgstr "Saita dishi dishi zuwa kashi 20" - -msgid "workspace.shape.menu.create-multiple-components" -msgstr "kirkiri abubuwa da yawa" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.rename-group" -msgstr "sake sunan kungiyar" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-profile" -msgstr "ka na son gwadawa ne kawai?" - -#, fuzzy -msgid "webhooks.last-delivery.success" -msgstr "Sakon karshe ya isa." - -msgid "shortcuts.bool-intersection" -msgstr "ma'aunin abubuwa daban daban" - -msgid "workspace.options.stroke-width" -msgstr "gigciye fadin" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-out" -msgstr "sauki waje" - -#: src/app/main/ui/static.cljs -msgid "labels.not-found.desc-message" -msgstr "babu wannan fagen, ko ba ka da izinin shiga." - -msgid "workspace.options.x" -msgstr "X layi" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.members" -msgstr "mambobi" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "dashboard.notifications.email-verified-successfully" -msgstr "an tantance adireshinka na imel" - -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.show-interactions" -msgstr "Nuna hulda" +msgid "dashboard.import.progress.upload-media" +msgstr "xora kundaye: %s" #: src/app/main/ui/dashboard/team.cljs msgid "dashboard.invite-profile" @@ -2025,2358 +1942,102 @@ msgstr "" "Webhooks hanyar sanar da manhajoji da addireshi intanet idan wani ya faru a " "Penpot. za a tura maka da saqon talla URLs ka samar da." -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.text-palette" -msgstr "rubutub rubutu (%s)" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.hint1" +msgstr "" +"kai ne mai wannan tawagar. zabi wani memba da za ya iya inganta wa mai shi " +"kafin ka fita." -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.titlecase" -msgstr "yanayin lakani" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.promote-and-leave" +msgstr "inganta sannan ka bari" -msgid "workspace.sidebar.layers.frames" -msgstr "allo" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.select-member-to-promote" +msgstr "zavi memba domin havakawa" -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fit" -msgstr "dace - ja sikeli ya dace da shi" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.title" +msgstr "kafin ka fita" -#: src/app/main/ui/dashboard/files.cljs -msgid "title.dashboard.files" -msgstr "%s - Tukunyar aje biro" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.accept" +msgstr "barin tawaga" -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.exporting-object-error" -msgstr "An gaza fitarwa" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.message" +msgstr "ka tabbata ka na son barin wannan tawagar?" -#: src/app/main/ui/alert.cljs -msgid "ds.alert-ok" -msgstr "haka" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.title" +msgstr "barin tawaga" -msgid "shortcuts.escape" -msgstr "kubuta" +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.nudge-title" +msgstr "adadin jan hankali" -msgid "shortcuts.copy" -msgstr "kwafi" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.accept" +msgstr "canza wurin mallaka" -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.hsv" -msgstr "HSV" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.hint" +msgstr "" +"idan ka canza wurin mallaka, ba za ka iya sauya matsayin shugaba ba, " +"gazawar wasu dokokin wannan tawaagar. " -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.delete-flow-start" -msgstr "goge kwararar farko" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.message" +msgstr "kai ke da wannan tawagar yanzu. ka tabbata kana son yin %s sabon mai tawaga?" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-left" -msgstr "kasa hagu" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.promote-owner-confirm.title" +msgstr "mallakar tawaga" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "mai daraja" +msgid "modals.publish-empty-library.accept" +msgstr "wallafa" -msgid "dashboard.export.detail" -msgstr "*akwai sassan,hotuna,launuka,da/kozane-zane." +msgid "modals.publish-empty-library.message" +msgstr "ba komai a taskarka. ka na son wallafa ta?" + +msgid "modals.publish-empty-library.title" +msgstr "wallafa taska maras komai" #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.hint" -msgstr "" -"idan ka aje a wurin ajiyar tawaga, turken kundin xakin ajiyar za ya kasance " -"za a iya amfani da shi a sauran kundaye." +msgid "modals.remove-shared-confirm.accept" +msgstr "cire taskar shiye-shirye" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-offset-effect" -msgstr "cire tasiri" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.hint" +msgstr "" +"idan ba ka cire taskar shirye-shirye ba, kundin taskar na wannan kundin zai " +"tsaya kasancewar za ka iya amfani da shi a cikin kundayenka." -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to" -msgstr "tura a" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.message" +msgstr "cire “%s” a taskar shirye-shirye" -msgid "modals.create-webhook.title" -msgstr "qirqirar webhook" +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.small-nudge" +msgstr "qaramin jan hankali" -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.rgba" -msgstr "RGBA" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.accept" +msgid_plural "modals.unpublish-shared-confirm.accept" +msgstr[0] "maras wallafa" +msgstr[1] "maras wallafa" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.mixed" -msgstr "gauraya" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.message" +msgid_plural "modals.unpublish-shared-confirm.message" +msgstr[0] "ka tabbata ka na son rufe taskar nan?" +msgstr[1] "ka tabbata ka na son rufe taskokin nan?" -msgid "shortcuts.detach-component" -msgstr "rarraba abubuwan da su ke a ware" - -msgid "shortcuts.reset-zoom" -msgstr "zake zukowa" - -msgid "onboarding-v2.welcome.desc3" -msgstr "" -"wurin da za ka san yadda za ka hada-hannu da fassara, neman fasali, manyan " -"gudunmawa, magance matsala…" - -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.hright" -msgstr "Daidaita dama (%s)" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.status" -msgstr "daraja" - -msgid "common.share-link.permissions-can-comment" -msgstr "sharhi" - -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgba" -msgstr "RGBA" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row" -msgstr "jerawa" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to" -msgstr "kewayawa zuwa" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "ya kake tunanin aiki da fenfot?" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.inner" -msgstr "ciki" - -msgid "onboarding-v2.before-start.desc1" -msgstr "" -"ya kamata kasan akwai kayayyaki da yawa da za su iya taimaka maka ka sami " -"damar fara aiki da fenfot, kamar jagoran mai amfani tasharmu ta youtub." - -msgid "shortcut-subsection.general-viewer" -msgstr "gamayya" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-members" -msgstr "mambobin tawaga" - -#: src/app/main/data/dashboard.cljs -msgid "dashboard.new-file-prefix" -msgstr "sabon kundi" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-expire" -msgstr "lambar tsaron za ta gama aiki %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.underline" -msgstr "ja layi (%s)" - -msgid "onboarding.choice.team-up.create-team-desc" -msgstr "bayan ka yi wa tawagarka suna, za ka iya gaiyato mutane ku hadu." - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to" -msgstr "" -"za ka iya daidaita kayan zanenka ta hanyar (amfani da madannin qasa sashen " -"dama)." - -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.accept" -msgstr "goge fira" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.success-duplicate-project" -msgstr "an kwafi aikinka" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.cancel" -msgstr "sokewa" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay-dest" -msgstr "kulle mai rufi %s" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.accept" -msgstr "goge alama" - -#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.your-penpot" -msgstr "fenfot na ka" - -msgid "shortcuts.bring-forward" -msgstr "tura gaba" - -msgid "workspace.header.menu.redo" -msgstr "sake" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.detach-instance" -msgstr "raba yanayin abin" - -msgid "shortcuts.opacity-9" -msgstr "Seta dish dishi zuwa 90" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-right" -msgstr "jera dama (%s)" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-textpalette" -msgstr "Nuna launukan tsarin rubutu" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flip-horizontal" -msgstr "kifa ta tsaye" - -msgid "labels.continue" -msgstr "ci gaba" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.hard-light" -msgstr "Haske mai muya" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.layout-item-max-w" -msgstr "fadi mafi yawa" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.management" -msgstr "shuwagabannin tawaga" - -msgid "inspect.tabs.code.selected.component" -msgstr "bangare" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column-reverse" -msgstr "sake shafi" - -msgid "dashboard.download-standard-file" -msgstr "sauke cikakken kundi(.svg + .json)" - -#: src/app/main/ui/static.cljs -msgid "labels.internal-error.desc-message" -msgstr "" -"an sami matsala. sake gwadawa idan matsalar ba ta kauce ba, tuntubi sashen " -"taimako." - -msgid "labels.font-variants" -msgstr "salo" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.title" -msgstr "kafin ka fita" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.front" -msgstr "kawo zuwa gaba" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-center" -msgstr "tsakiya" - -#: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "errors.unexpected-error" -msgstr "afkuwar kuskuren da ba a zata ba." - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.no-shared-libraries-available" -msgstr "Babu rababbun ma'adanai wanda aka samu" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.square" -msgstr "murabba'i" - -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.fullscreen" -msgstr "Cika fuskar" - -msgid "workspace.undo.entry.single.multiple" -msgstr "wani abu" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.role" -msgstr "matsayi" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.add-interaction" -msgstr "Danna wannan madannin + domin saka hulda." - -msgid "workspace.shape.menu.difference" -msgstr "bambanci" - -msgid "workspace.assets.duplicate-main" -msgstr "maimaita ainihin" - -msgid "shortcuts.fit-all" -msgstr "fitar da abubuwan da zai dace da ko wane abu" - -msgid "workspace.undo.entry.multiple.path" -msgstr "hanya" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-right" -msgstr "kasa dama" - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.duplicate" -msgstr "maimaita" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show-main" -msgstr "nuna ainihin wurin" - -msgid "onboarding-v2.before-start.desc2.title" -msgstr "xanjagora" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "ta ya za ka bayyana kwarewarka akai..." - -msgid "shortcut-subsection.zoom-viewer" -msgstr "Zukowa" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.remove-shared" -msgstr "cire matattarar kundate" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "dauki wanda kake so" - -msgid "shortcuts.v-distribute" -msgstr "Rarraba ta tsaye" - -msgid "common.share-link.page-shared" -msgid_plural "common.share-link.page-shared" -msgstr[0] "tura shafi 1" -msgstr[1] "%s an tura shafi" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.grid-title" -msgstr "Akwati" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.offsetx" -msgstr "X" - -#: src/app/main/ui/settings/feedback.cljs -#, fuzzy -msgid "feedback.twitter-go-to" -msgstr "je ka tiwita" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.none" -msgstr "ba komai" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.exclusion" -msgstr "warewa" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.title" -msgstr "labari" - -msgid "workspace.options.recent-fonts" -msgstr "da dimi dimi" - -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.new-email" -msgstr "sabon imel" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.search-shared-libraries" -msgstr "Duba rabbaun ma'adanai" - -msgid "shortcuts.text-align-left" -msgstr "jera hagu" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.register-subtitle" -msgstr "kyauta ne,an buxe hanyar samu" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-textpalette" -msgstr "boye launukan yanayin tsarin rubutu" - -msgid "labels.view-only" -msgstr "gani kaxai" - -msgid "workspace.undo.entry.single.component" -msgstr "bangarori" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.row" -msgstr "layuka" - -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.upload-all" -msgstr "xora duka" - -msgid "inspect.attributes.typography.text-transform.none" -msgstr "babu" - -msgid "workspace.assets.local-library" -msgstr "dakin karatun gida" - -msgid "shortcuts.move-fast-right" -msgstr "matsa dama da sauri" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.unmask" -msgstr "bude takunkumi" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-submit" -msgstr "shiga ciki" - -msgid "shortcuts.toggle-textpalette" -msgstr "Juya zuwa launukan rubutu" - -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.update-team" -msgstr "sabunta tawaga" - -#: src/app/main/ui/workspace/sidebar/options/page.cljs -msgid "workspace.options.canvas-background" -msgstr "bayan zane" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.align-top" -msgstr "jerin sama" - -msgid "shortcuts.font-size-dec" -msgstr "rage girman rubutu" - -msgid "dashboard.webhooks.empty.add-one" -msgstr "danna qasa \"sanya webhook\" qara xaya." - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.default-team-name" -msgstr "manhajar fenfot" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-pressing" -msgstr "yayin dannawa" - -msgid "shortcuts.open-dashboard" -msgstr "tafi gaban allon" - -#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.profile-is-muted" -msgstr "bayananka su na da imel maras motsi (baiyana matsaloli)." - -msgid "shortcuts.start-measure" -msgstr "fara aunawa" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.center" -msgstr "Tsakiya" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.submit-label" -msgstr "yi sabuwar alama" - -msgid "workspace.sidebar.collapse" -msgstr "ruguza a'ajiyar bayani" - -msgid "common.share-link.permissions-can-inspect" -msgstr "iya bincka lamba" - -msgid "workspace.options.height" -msgstr "Tsawo" - -msgid "shortcuts.draw-ellipse" -msgstr "siffar kwai" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "ma su tsarawa" - -#, markdown -msgid "dashboard.fonts.hero-text1" -msgstr "" -"duk wani adireshi da ka xora a nan dangin font ne a wannan tawagar za a sami " -"kundayen da ke xauke da kayan rubutu. Da fontfont iri daya ne ake kasawa**" -"gwaurayen font**. Za ka iya xora font ta waxannan hanyoyin: **TTF, OTF and " -"WOFF** (xaya kawai ake buqata)." - -#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/files.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.drafts" -msgstr "adana" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "title.dashboard.projects" -msgstr "tsare tsare - %s - Mazubin biruka" - -#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs -msgid "labels.retry" -msgstr "sake gwadawa" - -msgid "modals.delete-webhook.title" -msgstr "gogewa webhook" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.update-main" -msgstr "sabunta ainihin wurin" - -msgid "shortcuts.draw-path" -msgstr "Hanya" - -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.code.selected.multiple" -msgstr "%s zavavve" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.flow-start" -msgstr "fara malala" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "babu" - -msgid "inspect.attributes.typography.text-transform.titlecase" -msgstr "yadda ake rubuta batu" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "za mu fara!" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.remove-flex" -msgstr "cire sassaukan tsari" - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "modals.delete-page.body" -msgstr "ka tabbata kana son goge wannan shafin?" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow-start" -msgstr "Gudun farko" - -msgid "shortcuts.move" -msgstr "matsa" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.message" -msgstr "ka tabbata kana son goge wannan kundin?" - -msgid "shortcuts.opacity-3" -msgstr "Seta dashi dashi zuwa kashi 50" - -msgid "common.share-link.team-members" -msgstr "memba kaxai" - -msgid "workspace.sidebar.layers.components" -msgstr "bangare" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease" -msgstr "sauki" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.placeholder" -msgstr "sunan zai iya taimakawa wajen sanin menene alama" - -#: src/app/main/ui/settings/password.cljs -msgid "labels.confirm-password" -msgstr "tabbatar da lambar tsaro" - -#: src/app/main/ui/workspace/sidebar/options/menus/svg_attrs.cljs, src/app/main/ui/inspect/attributes/svg.cljs -msgid "workspace.sidebar.options.svg-attrs.title" -msgstr "shigo da shi SVG halaye" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to-link" -msgstr "bayanin yadda ake fitarwa daga fenfot" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.comments" -msgstr "ra'ayi (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation-none" -msgstr "Babu" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.columns" -msgstr "shafi" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.accept" -msgstr "canza wurin mallaka" - -msgid "workspace.viewport.click-to-close-path" -msgstr "latsa kusa da hanya" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Adobe XD" - -msgid "labels.close" -msgstr "rufewa" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.lighten" -msgstr "kara masa haske" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "workspace.options.export-multiple" -msgstr "Fitar da zababbun" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "cire" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.hide" -msgstr "boye" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "zana" - -#: src/app/main/ui/settings/change_email.cljs -msgid "errors.email-invalid-confirmation" -msgstr "tabbata imel xinka ya yi daidai" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.title" -msgstr "Fitar da zavi" - -msgid "onboarding-v2.welcome.desc2.title" -msgstr "hulxa da kai cikin mutane" - -msgid "dashboard.import.progress.process-page" -msgstr "fejin kasuwar duniya: %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.set-default" -msgstr "saita a tsoho" - -#: src/app/main/errors.cljs -msgid "errors.feature-mismatch" -msgstr "" -"tamkar ka buxe wani kundi da ke da muhimmanci '%s' bayar da dama qarin da ka " -"yi ma fenfot xinka bai karbu ba ko ba zai yi aiki ba." - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs, src/app/main/ui/workspace/header.cljs -msgid "workspace.options.retry" -msgstr "sake" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-palette" -msgstr "nuna launukan kala" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-relative-to" -msgstr "alaka zuwa" - -msgid "errors.webhooks.ssl-validation" -msgstr "kuskure kan farfaxo da SSL." - -msgid "shortcuts.create-component" -msgstr "samar da abubuwa iri- iri" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.update-components-in-bulk" -msgstr "sabunta ainihin wurin" - -msgid "auth.terms-privacy-agreement" -msgstr "" -"lokacin qirqirar kundi, sai ka amincewa da yanayi aikin da " -"qa'idojinmuqa'idoji." - -msgid "modals.delete-font-variant.title" -msgstr "goge salon font" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.sidebar.history" -msgstr "labari (%s)" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.no-libraries-need-sync" -msgstr "Babu rabben ma'adanai da suke bukatar sabuntawa" - -#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "workspace.options.blur-options.title" -msgstr "Dishi dishi" - -msgid "dashboard.export.options.all.title" -msgstr "fitar da manhajar tura kundi" - -msgid "workspace.options.clip-content" -msgstr "Matse abun ciki" - -#: src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.editor" -msgstr "maigyara" - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.new-password" -msgstr "sanya sabuwar lambar tsaro" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.path" -msgstr "hanya (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius.all-corners" -msgstr "duka kwanar" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-right" -msgstr "sama dama" - -#: src/app/main/ui/settings/feedback.cljs -msgid "labels.sending" -msgstr "aikawa…" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.select-layer" -msgstr "zabi shimfida" - -msgid "workspace.undo.entry.single.image" -msgstr "hoto" - -msgid "workspace.shape.menu.intersection" -msgstr "mahada" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-trigger" -msgstr "Jawo" - -#: src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/files.cljs -msgid "dashboard.new-file" -msgstr "+ sabon kundi" - -#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/auth.cljs -msgid "title.default" -msgstr "Mazubin biruka - Tsara yanci ga tawaga" - -#: src/app/main/ui/alert.cljs -msgid "ds.alert-title" -msgstr "natsu" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.shortcuts" -msgstr "yanke (%s)" - -#: src/app/main/ui/inspect/attributes/shadow.cljs -msgid "inspect.attributes.shadow" -msgstr "inuwa" - -msgid "common.share-link.title" -msgstr "fenfot" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding" -msgstr "filla filla" - -msgid "shortcuts.toggle-history" -msgstr "Danna tarihi" - -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.select-ui-theme" -msgstr "zaven batu" - -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.duplicate" -msgstr "kwafi" - -msgid "title.team-webhooks" -msgstr "gidan yanar gizo - %s - Mazubin biruka" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library-updates" -msgstr "sabunta ma'adana" - -#: src/app/main/ui/dashboard/team.cljs -#, markdown -msgid "labels.no-invitations-hint" -msgstr "danna **gayyato mutane** wurin da ake nemo mutane a wannan tawaga." - -msgid "inspect.tabs.code.selected.mask" -msgstr "marfi" - -msgid "modals.edit-webhook.submit-label" -msgstr "gyara webhook" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.options.text-options.none" -msgstr "babu" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-rules" -msgstr "boye ma'auni" - -msgid "dashboard.webhooks.create.success" -msgstr "an gina Webhook." - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.go-to-edit" -msgstr "tafi zuwa salon dakin karatu don a tace" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.confirm" -msgstr "haka, goge asusu" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.no-matches-for" -msgstr "Babu daidaituwa da aka samu na “%s“" - -msgid "shortcuts.move-unit-right" -msgstr "Matsa da sashin dama" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.projects" -msgstr "aiyuka" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.verification-email-sent" -msgstr "mun aika maka da saqon tantancewa ta imel" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.your-name" -msgstr "sunanka" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout" -msgstr "shiri" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-none" -msgstr "(ba'a saita ba )" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing" -msgstr "saukakawa" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Triangle" - -msgid "workspace.path.actions.draw-nodes" -msgstr "zane da kauri (%s)" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-scale-text" -msgstr "bada damar sikelin rubutu" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row-reverse" -msgstr "jera sauyin fasali" - -msgid "errors.email-spam-or-permanent-bounces" -msgstr "saqonni marasa amfani na imel «%s»." - -msgid "labels.add-custom-font" -msgstr "inganta font" - -#: src/app/main/ui/dashboard/libraries.cljs -msgid "title.dashboard.shared-libraries" -msgstr "Rababban dakin karatu- %s - Mazubin biruka" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "workspace.options.export-object" -msgid_plural "workspace.options.export-object" -msgstr[0] "Fitarwa 1 Sashi" -msgstr[1] "Fitarwa %s sashi-sashi" - -msgid "errors.bad-font" -msgstr "ba za a iya xora fonts %s ba" - -msgid "shortcuts.align-bottom" -msgstr "tsarin kasa" - -msgid "shortcuts.align-top" -msgstr "tsarin sama" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.message" -msgstr "sabunta sashe a babbar taska" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.profile-not-verified" -msgstr "ba a tantance bayananka ba,sai an tantance a ci gaba." - -#: src/app/main/ui/inspect/attributes/layout.cljs, src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.radius" -msgstr "tsakiya" - -msgid "workspace.undo.entry.single.media" -msgstr "kadarar zanen hotuna" - -#: src/app/main/ui/settings/feedback.cljs -#, fuzzy -msgid "feedback.twitter-title" -msgstr "wurin karvar qorafin tiwita" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.packed" -msgstr "cushe" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.label" -msgstr "suna" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-style" -msgstr "tsarin salo" - -msgid "dashboard.import.analyze-error" -msgstr "kash! mun gaza shigo da kundinka" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.recovery-request-subtitle" -msgstr "za mu aika maka da saqon qa'idoji ta imel" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.no-files-message" -msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "ba zai yi aiki a kowane kundi ba." -msgstr[1] "ba za su yi aiki a kowane kundi ba." - -#: src/app/main/ui/settings/password.cljs -msgid "title.settings.password" -msgstr "Nambobin sirri - Mazubin biruka" - -msgid "workspace.header.menu.enable-snap-pixel-grid" -msgstr "Bda damar tsinkewa zuwa akwatin pixel" - -msgid "shortcuts.add-comment" -msgstr "Bayyana Ra'ayi" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-enter" -msgstr "linzamin kwamfuter ya shiga" - -msgid "workspace.undo.entry.single.circle" -msgstr "da'ira" - -msgid "labels.back" -msgstr "baya" - -msgid "viewer.header.interactions-section" -msgstr "Hulda (%s)" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.forgot-password" -msgstr "ka manta lambar tsaro?" - -msgid "shortcut-subsection.tools" -msgstr "Kayan aiki" - -#: src/app/main/ui/auth/recovery_request.cljs -msgid "auth.notifications.recovery-token-sent" -msgstr "an aika maka da saqon matakan da za a bi domin dawo da lambar tsaronka." - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title.group" -msgstr "rukunin inuwa" - -msgid "modals.publish-empty-library.message" -msgstr "ba komai a taskarka. ka na son wallafa ta?" - -#: src/app/main/ui/workspace/comments.cljs -msgid "labels.only-yours" -msgstr "naka kawai" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title.group" -msgstr "rukunin shafi" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.reset-zoom" -msgstr "Kara saitawa" - -msgid "shortcuts.opacity-7" -msgstr "Saita dishi dishi zuwa kashi 70" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.assets" -msgstr "kadara" - -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.width" -msgstr "faxi" - -msgid "shortcuts.snap-pixel-grid" -msgstr "yanke zuwa ga akwatin pixel" - -#: src/app/main/ui/auth/login.cljs -msgid "errors.ldap-disabled" -msgstr "LDAP ya gaza tantancewa." - -msgid "workspace.assets.open-library" -msgstr "bude fiyal din dakin karatu" - -#: src/app/main/data/workspace/libraries.cljs, src/app/main/ui/components/color_bullet.cljs -msgid "workspace.gradients.linear" -msgstr "a layi mikakke" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title-selection" -msgstr "zababbun rubutu" - -msgid "modals.delete-component-annotation.title" -msgstr "goge bayani" - -msgid "shortcuts.select-parent-layer" -msgstr "zabi ainihin shafi" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.promote-and-leave" -msgstr "inganta sannan ka bari" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.libraries.text.multiple-typography" -msgstr "Rubutun rubutu dayawa" - -msgid "dashboard.import.progress.upload-media" -msgstr "xora kundaye: %s" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-multi-confirm.accept" -msgstr "goge kundaye" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "rababben dakin karatu" - -msgid "labels.share-prototype" -msgstr "tura manhajar rubutu" - -msgid "shortcuts.export-shapes" -msgstr "samar da sabbabbin abubuwa" - -#: src/app/main/ui/dashboard/team.cljs -msgid "notifications.invitation-link-copied" -msgstr "kwafar hanyar gayya" - -#: src/app/main/ui/settings/password.cljs -msgid "dashboard.notifications.password-saved" -msgstr "an tsare maka shaidar tsaro!" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.group-name" -msgstr "sunan kungiya" - -msgid "shortcuts.search-placeholder" -msgstr "takaitaccen sako yanken" - -msgid "inspect.tabs.code.selected.svg-raw" -msgstr "SVG" - -#: src/app/main/ui/workspace/sidebar/options/shapes/frame.cljs, src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.size" -msgstr "girma" - -msgid "workspace.undo.entry.multiple.component" -msgstr "bangare" - -msgid "workspace.focus.selection" -msgstr "zaba" - -msgid "workspace.path.actions.merge-nodes" -msgstr "hade kauri (%s)" - -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.info" -msgstr "" -"za mu aika maka da imel ta wannan imel xin “%s” domin tantance shaidarka." - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.remove-member" -msgstr "cire mamba" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.create-component" -msgstr "kirkiri abubuwa" - -msgid "common.publish" -msgstr "wallafawa" - -msgid "shortcuts.select-next" -msgstr "zabi wani shafi" - -msgid "workspace.undo.entry.multiple.color" -msgstr "kadarar kala" - -#: src/app/main/ui/settings/options.cljs -msgid "title.settings.options" -msgstr "Saiti - Mazubin biruka" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.no-invitations" -msgstr "ba saqon da ba a buxa ba." - -msgid "workspace.header.menu.enable-scale-content" -msgstr "bada damar sikelin rabo" - -msgid "modals.delete-font-variant.message" -msgstr "" -"ka tabbata kana son goge wannan salon font din? ba zai xoru ba idan an yi " -"amfani da shi a kundi." - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.group-stroke" -msgstr "Ja layi a rukuni" - -msgid "workspace.shape.menu.union" -msgstr "hadakan" - -msgid "workspace.shape.menu.thumbnail-set" -msgstr "kara kamar girman babban yatsa" - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.recovery-submit" -msgstr "canza lambar tsaro" - -#: src/app/main/ui/confirm.cljs -msgid "ds.confirm-cancel" -msgstr "goge" - -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.download" -msgstr "sauke hanyar hoto" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-fill" -msgstr "cike - cika sikeli" - -msgid "errors.bad-font-plural" -msgstr "ba za a iya xora fonts %s ba" - -msgid "inspect.empty.help" -msgstr "domin neman qarin bayani game da fenfot a tuntubi sashen agaji" - -msgid "workspace.sidebar.layers.texts" -msgstr "rubutu" - -#: src/app/main/ui/settings/profile.cljs -msgid "title.settings.profile" -msgstr "Karin bayani - Mazubin biruka" - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.delete" -msgstr "goge" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.text-align-left" -msgstr "jera hagu (%s)" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.your-account" -msgstr "fagenka" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.dismiss" -msgstr "watsar" - -#: src/app/main/ui/settings/feedback.cljs -msgid "title.settings.feedback" -msgstr "bada martani - Mazubin biruka" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.duplicate" -msgstr "maimaita" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.change-email" -msgstr "canza imel" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.title" -msgstr "gogewar tawaga" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "bayanai masu yawa" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.forward" -msgstr "kawo ta gaba" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.title" -msgstr "imel" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.font-size" -msgstr "girma" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.message" -msgstr "" -"kai ke da wannan tawagar yanzu. ka tabbata kana son yin %s sabon mai tawaga?" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-palette" -msgstr "farantin launuka" - -msgid "shortcuts.group" -msgstr "rukuni" - -msgid "auth.privacy-policy" -msgstr "matakan kaxaita" - -#: src/app/main/ui/auth/recovery.cljs -msgid "auth.notifications.password-changed-successfully" -msgstr "ka canza lambar tsaro" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-while-hovering" -msgstr "yayin shawagi" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show" -msgstr "nuna" - -msgid "workspace.shape.menu.hide-ui" -msgstr "nuna / boye UI" - -msgid "shortcuts.move-fast-up" -msgstr "Matsa sama da sauri" - -#: src/app/main/data/dashboard.cljs -msgid "dashboard.new-project-prefix" -msgstr "sabon aiki" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.center" -msgstr "tsakiya" - -#: src/app/main/ui/dashboard/team.cljs -msgid "title.team-settings" -msgstr "Saiti - %s - Mazubin biruka" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-manual" -msgstr "Yi da kanka" - -msgid "labels.save" -msgstr "ajiye" - -msgid "dashboard.import.progress.process-media" -msgstr "kammala aiki" - -#: src/app/main/ui/confirm.cljs -msgid "ds.confirm-ok" -msgstr "haka" - -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "dole suna ya qumshi waxansu alamimon rubutu, sannan tazara." - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.message" -msgstr "ka tabbata kana son goge wannan aikin?" - -msgid "shortcuts.line-height-inc" -msgstr "kara tsawon layi" - -msgid "onboarding-v2.before-start.desc2" -msgstr "" -"cikakken bayanin yadda za a yi amfani da fenfot. daga rubutu zuwa tsara ko " -"rarraba iri." - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.sidebar.layers" -msgstr "shafi" - -msgid "shortcuts.select-all" -msgstr "zabi duka" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.graphics" -msgstr "%s zane zane" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-mouse-leave" -msgstr "linzamin kwamfutar ya fita" - -msgid "labels.log-or-sign" -msgstr "yi ko shiga" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "idan akwai qari (bayyana)" - -msgid "workspace.assets.typography.text-styles" -msgstr "salon rubutu" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker" -msgstr "da'irar kasuwa" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.searching-for" -msgstr "neman “%s“…" - -msgid "inspect.attributes.typography.text-decoration.none" -msgstr "babu" - -msgid "labels.discard" -msgstr "vatar" - -msgid "shortcuts.font-size-inc" -msgstr "kara gaban yanayi" - -msgid "common.share-link.permissions-pages" -msgstr "tura shafuka" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-min-w" -msgstr "fadi mafi kankanta" - -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.hcenter" -msgstr "Daidaita tsakiya a kwance (%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.gap" -msgstr "Gibi" - -msgid "inspect.tabs.code.selected.group" -msgstr "qungiya" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker" -msgstr "murabba'in kasuwa" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.column" -msgstr "shafi" - -#: src/app/main/ui/comments.cljs -msgid "labels.delete-comment-thread" -msgstr "goge rubutu" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-animation" -msgstr "hotuna masu motsi" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.drop-shadow" -msgstr "ajiye inuwa" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "jaraba fenfot ka ga ko ta yi daidai da tawaga " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "malami ko dalibi" - -msgid "workspace.undo.entry.single.curve" -msgstr "lankwasa" - -#: src/app/main/ui/static.cljs -msgid "labels.not-found.main-message" -msgstr "alama!" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.overlay" -msgstr "mai rufi" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" - -msgid "onboarding.team-modal.create-team" -msgstr "yin tawaga" - -msgid "dashboard.import.progress.process-colors" -msgstr "aikin rini" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.create-demo-account" -msgstr "qirqiri taskar gwaji" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.title" -msgstr "ma'aunin karvuwar aiki" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.margin" -msgstr "gefe" - -msgid "onboarding-v2.welcome.title" -msgstr "barka da zuwa fenfot!" - -#, permanent -msgid "inspect.attributes.stroke.alignment.center" -msgstr "tsakiya" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "dashboard.notifications.email-changed-successfully" -msgstr "ka zamanantar da adireshinka na imel" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "barin aikin tawaga" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.accept" -msgstr "qara yin wurin ajiyar tawaga" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-ease-in-out" -msgstr "sauki ciki waje" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-guides" -msgstr "Tsinke zuwa mai jagora" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-easing-linear" -msgstr "mikakke" - -#: src/app/main/ui/inspect/attributes/blur.cljs -msgid "inspect.attributes.blur.value" -msgstr "muhimmanci" - -msgid "common.share-link.manage-ops" -msgstr "amincewar shugaba" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.start" -msgstr "fara jagoranci" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-on-click" -msgstr "da an danna" - -msgid "onboarding.choice.team-up.invite-members" -msgstr "gayyato mambobi" - -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.hdistribute" -msgstr "rarraba filin kwance (%s)" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-length-hint" -msgstr "aqalla a sami alamoni 8" - -msgid "modals.delete-webhook.message" -msgstr "ka tabbata ka na son goge webhook?" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.title" -msgstr "goge kundi" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.title" -msgstr "goge aikin" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-navigate-to-dest" -msgstr "kewayawa zywa: %s" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.selected-count" -msgid_plural "workspace.assets.selected-count" -msgstr[0] "%s" -msgstr[1] "%s zababbun abubuwan" - -msgid "dashboard.libraries-and-templates.import-error" -msgstr "akwai matsala wurin shigo da fejin talla. fejin tallar ba ya xauko." - -# SECTIONS -msgid "shortcut-section.basics" -msgstr "shikashikai" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-go-to" -msgstr "je ka taskar fenfot" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.libraries-and-templates" -msgstr "taskoki & allunan talla" - -#: src/app/main/ui/auth/login.cljs -msgid "errors.wrong-credentials" -msgstr "kuskuren imel ko lambar tsaro." - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.spread" -msgstr "bazu" - -msgid "shortcuts.open-inspect" -msgstr "tafi sashin da 'yan kallo za su duba" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.info" -msgstr "ka san dokokin fenfot lokacin da ka ke tare da masoya koyarwa." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "31-50" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.bottom" -msgstr "kasa" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-duration" -msgstr "tsahon lokaci" - -msgid "shortcuts.go-to-libs" -msgstr "ta fi zuwa rabbabben ma'ajiya" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.advanced-ops" -msgstr "zabi na ci gaba" - -#: src/app/main/ui/settings/change_email.cljs -msgid "notifications.validation-email-sent" -msgstr "an aika da imel din tantancewa %s. bincika imel xinka!" - -msgid "shortcuts.toggle-zoom-style" -msgstr "Danna salon zukowa" - -msgid "shortcut-subsection.zoom-workspace" -msgstr "Zukowa" - -msgid "shortcuts.increase-zoom" -msgstr "zuko ciki" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-outside" -msgstr "rufe yayin matsewa ta waje" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.blur" -msgstr "dishi dishi" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.no-access-tokens" -msgstr "ba ka da wasu lambobin tsaro yanzu." - -msgid "workspace.path.actions.separate-nodes" -msgstr "raba kauri (%s)" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.title-search" -msgstr "neman sakamako" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "teburin aiki" - -#: src/app/main/ui/workspace.cljs -msgid "labels.reload-file" -msgstr "qara dora kundi" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.font-id" -msgstr "tsarin haruffa" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.selection-stroke" -msgstr "gigciye zabi" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"lambarka ta shiga na a matsayin zabin hanyar shiga/lambar tsaronmuza a iya " -"amfani tsarin tantancewa,domin shiga manhajar cikin fenfot API" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.title" -msgstr "mallakar tawaga" - -msgid "dashboard.import" -msgstr "shigo da kundin fenfot" - -#: src/app/main/ui/workspace/sidebar/options.cljs -msgid "workspace.options.prototype" -msgstr "samfur" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.constraints.right" -msgstr "dama" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.success-delete-project" -msgstr "ka goge aikinka" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.team-hero.text" -msgstr "fenfot ta menbobin tawaga ce. kirawo kowa domin yin aiki tarekundaye" - -#: src/app/main/ui/auth/recovery.cljs -msgid "profile.recovery.go-to-login" -msgstr "je ka hanyar shiga" - -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.theme-change" -msgstr "batun UI" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.use-play-button" -msgstr "yi amfani da madanneta ta sama ki tafi da samfuri." - -msgid "modals.delete-font.message" -msgstr "" -"ka tabbata kana son goge wannan font xin ? ba zai yi aiki ba idan an yi " -"amfani da shi a kundi." - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.hue" -msgstr "Haske haske" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-artboard-names" -msgstr "Nuna sunayen allo" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.save-error" -msgstr "an samu kuskure wajen adanawa" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke.dashed" -msgstr "layin raba abu" - -msgid "common.share-link.all-users" -msgstr "duk fenfot" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "mallakar lambobin shiga na sirri" - -#: src/app/main/ui/settings/password.cljs -msgid "dashboard.password-change" -msgstr "sauya lambar tsaro" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Canva" - -#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs -msgid "workspace.options.fill" -msgstr "Cikawa" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.left" -msgstr "hagu" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "qara samun bayanin fenfot" - -msgid "workspace.shape.menu.thumbnail-remove" -msgstr "cire girman babban danyatsa" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.width" -msgstr "fadi" - -msgid "inspect.empty.select" -msgstr "zabar zubi, hukumar masu sa ido akan bangarorinsu da lambobinsu" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expires-on" -msgstr "gama aiki kan %s" - -msgid "shortcuts.toggle-layout-flex" -msgstr "Tara/fitar da lankwasashhiyar shimfida" - -msgid "labels.or" -msgstr "ko" - -msgid "onboarding.choice.team-up.roles" -msgstr "gayyata tare da bayar da matsayi:" - -msgid "labels.font-providers" -msgstr "ma su fenfot" - -msgid "shortcuts.italic" -msgstr "juya zuwa kwantaccen rubuyu" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.space-around" -msgstr "kewayayyen sarrari" - -msgid "errors.webhooks.timeout" -msgstr "dakatarwa" - -msgid "errors.profile-blocked" -msgstr "bayanan a rufe suke" - -msgid "workspace.options.width" -msgstr "fadi" - -msgid "shortcuts.letter-spacing-dec" -msgstr "rage filin harafin" - -#, fuzzy -msgid "errors.webhooks.last-delivery" -msgstr "saqon qarshe bai je ba." - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-move-files" -msgstr "an tura kundayenka" - -msgid "shortcut-subsection.general-dashboard" -msgstr "gamayya" - -#: src/app/main/ui/settings/password.cljs -msgid "errors.password-too-short" -msgstr "lambar tsaro dole ta kai yawan alamu 8" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.title" -msgstr "ka tabbata ka na son goge asusunka?" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.tutorial-hero.title" -msgstr "jagoranci" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.rect" -msgstr "Rectangle (%s)" - -msgid "labels.continue-with" -msgstr "ci gaba da" - -msgid "inspect.attributes.typography.text-transform.lowercase" -msgstr "qananan baqaqe" - -msgid "workspace.undo.entry.single.group" -msgstr "rukuni" - -msgid "inspect.attributes.stroke.style.dotted" -msgstr "xige-xige" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout-item.title.layout-item-max-w" -msgstr "fadi mafi yawa" - -msgid "shortcuts.align-right" -msgstr "tsarin dama" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "can baya" - -msgid "modals.invite-member.emails" -msgstr "imel, rabawar waqafi" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.sitemap" -msgstr "taswirar wuri" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-dynamic-alignment" -msgstr "kashe daidaitawa mai canjawa" - -#: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs -msgid "workspace.options.radius-bottom-left" -msgstr "kasan hagu" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.right" -msgstr "Dama" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-close-overlay" -msgstr "kulle mai rufi" - -msgid "errors.invite-invalid.info" -msgstr "za a iya soke gayyata ko ta ki aiki." - -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.fonts-added" -msgid_plural "dashboard.fonts.fonts-added" -msgstr[0] "an qara font 1" -msgstr[1] "%s an qara fonts da yawa" - -msgid "modals.create-webhook.submit-label" -msgstr "qirqirar webhook" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "" -"danna maddanin qasa\"danna qasa\n" -"emo sabuwar lambar tsaro\" samar da wani." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.title" -msgstr "goge alama" - -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.vtop" -msgstr "Daidaita sama(%s)" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.viewer" -msgstr "ma su kallo" - -msgid "shortcuts.toggle-alignment" -msgstr "Danna a jere" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.invite-profile" -msgstr "neman mutane" - -#: src/app/main/ui/dashboard/grid.cljs -#, markdown -msgid "dashboard.empty-placeholder-drafts" -msgstr "" -"nan za a sami kundayen da aka sanya a taska. gwada sanya na ka kundin \"a " -"taskirarmumaginar kundi](https://manhajar fenfot/taskokin maginar kundaye." -"html)." - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker" -msgstr "darajar kasuwa" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.blend-mode.soft-light" -msgstr "haske mai sauki" - -msgid "shortcuts.decrease-zoom" -msgstr "fito da shi waje" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding-simple" -msgstr "sassaukan ciko" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.gutter" -msgstr "mahada" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.group" -msgstr "rukuni" - -msgid "dashboard.webhooks.update.success" -msgstr "sabunta Webhook." - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-github-submit" -msgstr "matattarar manazarta" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.letter-spacing" -msgstr "tazarar harafi" - -msgid "inspect.tabs.code.selected.text" -msgstr "rubutu" - -msgid "shortcuts.opacity-4" -msgstr "Saita dishi dishi zuwa kashi 40" - -#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "workspace.options.blur-options.title.multiple" -msgstr "zabin dishi dishi" - -msgid "shortcuts.align-vcenter" -msgstr "tsarin tsakiya a tsaye" - -msgid "workspace.shape.menu.create-annotation" -msgstr "kirkiri hoto mai motsi" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom-selected" -msgstr "zuko zababbe" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.message" -msgstr "" -"ka tabbata kana son goge wannan tawagar? Duk aiyukanka na kundayen da suka " -"danganci tawagar za su yi gogewar dindindin." - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay-dest" -msgstr "bude mai rufi: %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type" -msgstr "Nau'i" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-url" -msgstr "bude URL" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.delete-invitation" -msgstr "goge gayyata" - -msgid "workspace.path.actions.delete-node" -msgstr "goge kauri (%s)" - -msgid "shortcuts.letter-spacing-inc" -msgstr "kara filin harafin" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-destination" -msgstr "makoma" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-google-submit" -msgstr "Gugul" - -msgid "onboarding.newsletter.acceptance-message" -msgstr "" -"an aika maka da saqon buqatar biya, za mu aika maka da saqon imel tabbatar " -"da shi." - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.go-main" -msgstr "tafi ainihin wurin fal" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "fara aiki na" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.delete-team" -msgstr "goge tawaga" - -msgid "shortcuts.draw-frame" -msgstr "Allo" - -msgid "shortcuts.text-align-center" -msgstr "jera tsakiya" - -msgid "shortcuts.undo" -msgstr "Cire" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "mashi" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.accept" -msgstr "sabunta" - -#: src/app/main/ui/workspace/sidebar/align.cljs -msgid "workspace.align.vcenter" -msgstr "Daidaita a kwance tsakiya (%s)" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.twitter-subtitle1" -msgstr "tambayoyin da ke buqatar amsa." - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.remove-account" -msgstr "ka na son cire taskarka?" - -msgid "labels.font-family" -msgstr "ire-iren font" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.viewer" -msgstr "yanayin kallo (%s)" - -msgid "workspace.path.actions.make-curve" -msgstr "Ta lankwasa (%s)" - -msgid "workspace.options.search-font" -msgstr "nemo jerin harufa" - -msgid "onboarding.team-modal.create-team-feature-3" -msgstr "aiyukan shugaba" - -msgid "workspace.path.actions.move-nodes" -msgstr "tafi da kauri (%s)" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-title" -msgstr "dangin fenfot" - -msgid "workspace.path.actions.join-nodes" -msgstr "hada kauri (%s)" - -msgid "shortcuts.merge-nodes" -msgstr "hada da kauri" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "wane kayan zane ka fi iya aiki da shi?" - -msgid "shortcuts.bool-difference" -msgstr "ma'auni mabanbanci" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-url" -msgstr "URL" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "ka sami lambar tsaron da aka yi." - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.community" -msgstr "matattara" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.move" -msgstr "motsa abun" - -#: src/app/main/ui/workspace/sidebar/options/menus/layer.cljs -msgid "workspace.options.layer-options.title.multiple" -msgstr "dayawa" - -msgid "shortcuts.make-corner" -msgstr "kirkiri kwana" - -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.show-your-comments" -msgstr "bayyana na ka ra’ayin" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "mi ne ne matsayinka?" - -#: src/app/main/ui/workspace/sidebar/options/menus/typography.cljs -msgid "workspace.assets.typography.letter-spacing" -msgstr "fili a tsakanin haruffa" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.direction-ltr" -msgstr "LTR" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.shared-libraries" -msgstr "taskoki" - -#: src/app/main/ui/dashboard/team.cljs -msgid "title.team-invitations" -msgstr "Gayyata - %s - Mazubin biruka" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.pin-unpin" -msgstr "rufewa/buxewa" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.num-of-files" -msgid_plural "labels.num-of-files" -msgstr[0] "kundi 1" -msgstr[1] "kundaye %s" - -msgid "labels.custom-fonts" -msgstr "kwalliya da fenfot" - -#: src/app/main/ui/dashboard/comments.cljs -msgid "labels.comments" -msgstr "yabo" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.height" -msgstr "tsawo" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.delete" -msgstr "goge" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.show-in-assets" -msgstr "nuna ta kusuwar kadara" - -msgid "workspace.undo.entry.multiple.shape" -msgstr "siffa" - -#: src/app/main/ui/inspect/right_sidebar.cljs -msgid "inspect.tabs.info" -msgstr "bayani" - -msgid "workspace.options.interaction-auto" -msgstr "da kanshi" - -msgid "onboarding.team-modal.create-team-feature-2" -msgstr "ma su yin shiri dayawa lokaci xaya" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"xakin ba komai. wurin ajiyar tawaga, turken da ka yi za ya yi aiki a sauran " -"kundaye. ka tabbata kai ne ka ke son wallafa shi?" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.dashboard" -msgstr "dashbod" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.title.multiple" -msgstr "inuwar zabi" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.save-settings" -msgstr "wurin ajiyar saiti" - -#: src/app/main/errors.cljs -msgid "errors.max-quote-reached" -msgstr "kammala adadin '%s' madogara. gyara." - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-prev-screen" -msgstr "allon daya gabata" - -msgid "labels.active" -msgstr "mai amfani" - -msgid "shortcuts.text-align-right" -msgstr "jera dama" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.add" -msgstr "tarawa" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.text-decoration" -msgstr "kwalliyar rubutu" - -msgid "dashboard.import.import-warning" -msgstr "wasu kundayen na dauke da abubuwan da ba su da amfani." - -#: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs -msgid "errors.media-type-mismatch" -msgstr "hoton da aka sanya bai yi daidai da kundin da ake son faxaxawa ba." - -msgid "shortcuts.opacity-0" -msgstr "Saita dishi dishi zuwa kashi 100" - -msgid "shortcuts.clear-undo" -msgstr "goge sake" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.text" -msgstr "rubutu (%s)" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.update" -msgstr "sabintawas" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.copy" -msgstr "kwafi" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.curve" -msgstr "kwana(%s)" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.padding-all" -msgstr "duka gefan" - -#: src/app/main/ui/workspace/sidebar/options/menus/text.cljs -msgid "workspace.options.text-options.title" -msgstr "rubutu" - -#: src/app/main/ui/inspect.cljs, src/app/main/ui/viewer.cljs -msgid "viewer.empty-state" -msgstr "Babu allon da aka samu a wannan fejin." - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.file-library" -msgstr "Ma'adanar fiyal" - -msgid "inspect.tabs.code.selected.path" -msgstr "hanya" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.left" -msgstr "hagu" - -msgid "shortcut-subsection.navigation-workspace" -msgstr "shawagi" - -msgid "shortcuts.bool-union" -msgstr "ma'auni hadaka" - -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.submit" -msgstr "sake imel" - -#: src/app/main/errors.cljs -msgid "errors.feature-not-supported" -msgstr "sassa '%s' ba za su yi aiki ba." - -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.rename-team" -msgstr "sake suna tawaga" - -#: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "workspace.options.blur-options.title.group" -msgstr "rukuni" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.team-projects" -msgstr "aiyukan tawaga" - -msgid "shortcuts.underline" -msgstr "Danna ta layi a kasa" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-never" -msgstr "bai yiwuwa" - -#: src/app/main/ui/workspace/colorpicker.cljs -msgid "workspace.libraries.colors.rgb-complementary" -msgstr "Jituwar RGB" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.option.edit" -msgstr "Tace" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.message" -msgstr "ka tabbata kana son cire wannan memban a wannan tawaar?" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component.hint" -msgstr "" -"ka kusa sabunta sashe a babbar taska. wannan za ya iya aiki a sauran " -"kundayen da ke amfani da ita." - -#: src/app/main/ui/static.cljs -msgid "labels.internal-error.main-message" -msgstr "kuskuren ciki" - -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.title" -msgstr "sake imel xinka" - -msgid "shortcut-subsection.modify-layers" -msgstr "gyara shimfida" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.release-notes" -msgstr "bayar da bayani" - -msgid "shortcuts.unmask" -msgstr "Cire takunkumi" - -msgid "workspace.options.y" -msgstr "Y layi" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.message" -msgstr "cire “%s” a taskar shirye-shirye" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.round" -msgstr "da'ira" - -msgid "shortcuts.toggle-lock" -msgstr "Rufe/bude" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs -msgid "auth.password" -msgstr "lambar tsaro" - -msgid "viewer.breaking-change.message" -msgstr "Sannu!" - -msgid "shortcut-subsection.panels" -msgstr "allon sarrarfav naura" - -msgid "inspect.tabs.code.selected.circle" -msgstr "da'ira" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.info" -msgstr "idan ka cire asusunka za ka iya rasa aikin da ka kammala." - -msgid "dashboard.loading-fonts" -msgstr "xora abin adonka …" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.hint1" -msgstr "" -"kai ne mai wannan tawagar. zabi wani memba da za ya iya inganta wa mai shi " -"kafin ka fita." - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.promote-and-leave" -msgstr "inganta sannan ka bari" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.select-member-to-promote" -msgstr "zavi memba domin havakawa" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.title" -msgstr "kafin ka fita" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-confirm.accept" -msgstr "barin tawaga" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-confirm.message" -msgstr "ka tabbata ka na son barin wannan tawagar?" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-confirm.title" -msgstr "barin tawaga" - -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.nudge-title" -msgstr "adadin jan hankali" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.accept" -msgstr "canza wurin mallaka" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.hint" -msgstr "" -"idan ka canza wurin mallaka, ba za ka iya sauya matsayin shugaba ba, " -"gazawar wasu dokokin wannan tawaagar. " - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.message" -msgstr "kai ke da wannan tawagar yanzu. ka tabbata kana son yin %s sabon mai tawaga?" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.promote-owner-confirm.title" -msgstr "mallakar tawaga" - -msgid "modals.publish-empty-library.accept" -msgstr "wallafa" - -msgid "modals.publish-empty-library.message" -msgstr "ba komai a taskarka. ka na son wallafa ta?" - -msgid "modals.publish-empty-library.title" -msgstr "wallafa taska maras komai" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.accept" -msgstr "cire taskar shiye-shirye" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.hint" -msgstr "" -"idan ba ka cire taskar shirye-shirye ba, kundin taskar na wannan kundin zai " -"tsaya kasancewar za ka iya amfani da shi a cikin kundayenka." - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.message" -msgstr "cire “%s” a taskar shirye-shirye" - -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.small-nudge" -msgstr "qaramin jan hankali" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.accept" -msgid_plural "modals.unpublish-shared-confirm.accept" -msgstr[0] "maras wallafa" -msgstr[1] "maras wallafa" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.message" -msgid_plural "modals.unpublish-shared-confirm.message" -msgstr[0] "ka tabbata ka na son rufe taskar nan?" -msgstr[1] "ka tabbata ka na son rufe taskokin nan?" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.title" -msgid_plural "modals.unpublish-shared-confirm.title" -msgstr[0] "rufe taska" -msgstr[1] "rufe taskoki" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.title" +msgid_plural "modals.unpublish-shared-confirm.title" +msgstr[0] "rufe taska" +msgstr[1] "rufe taskoki" #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs msgid "modals.update-remote-component-in-bulk.hint" @@ -5173,9 +2834,6 @@ msgstr "Rufe/bude" msgid "shortcuts.toggle-lock-size" msgstr "Rufe rabo" -msgid "shortcuts.toggle-rules" -msgstr "Nuna / boye magwaji" - msgid "shortcuts.toggle-textpalette" msgstr "Juya zuwa launukan rubutu" diff --git a/frontend/translations/he.po b/frontend/translations/he.po index ad10c702c..ba1ffe02e 100644 --- a/frontend/translations/he.po +++ b/frontend/translations/he.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-25 13:07+0000\n" "Last-Translator: Yaron Shahrabani \n" -"Language-Team: Hebrew \n" +"Language-Team: Hebrew " +"\n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -61,6 +61,10 @@ msgstr "כניסה מכאן" msgid "auth.login-submit" msgstr "כניסה" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-tagline" +msgstr "Penpot הוא כלי בקוד פתוח לשיתוף עיצוב וקוד" + #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -3041,6 +3045,15 @@ msgstr "נעילת הנבחרים" msgid "shortcuts.toggle-lock-size" msgstr "נעילת יחס" +msgid "shortcuts.toggle-rulers" +msgstr "הצגת / הסתרת סרגלים" + +msgid "shortcuts.toggle-snap-guides" +msgstr "הצמדה לקווים מנחים" + +msgid "shortcuts.toggle-snap-ruler-guide" +msgstr "הצמדה לקווים מנחים סרגלים" + msgid "shortcuts.toggle-textpalette" msgstr "החלפת לוח טקסט" @@ -5057,10 +5070,6 @@ msgstr "טקסט (%s)" msgid "workspace.toolbar.text-palette" msgstr "טיפוגרפיות (%s)" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**מצב חקירה** (צפייה בלבד)" - msgid "workspace.top-bar.read-only.done" msgstr "בוצע" @@ -5197,373 +5206,3 @@ msgstr "עדכון" msgid "workspace.viewport.click-to-close-path" msgstr "לחיצה תסגור את הנתיב" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "אפשר להתנסות לפני שימוש ב־Penpot אצלך בעבודה" - -msgid "dashboard.import.import-message" -msgid_plural "dashboard.import.import-message" -msgstr[0] "קובץ יובא בהצלחה." -msgstr[1] "%s קבצים יובאו בהצלחה." -msgstr[2] "%s קבצים יובאו בהצלחה." -msgstr[3] "%s קבצים יובאו בהצלחה." - -msgid "modals.delete-component-annotation.message" -msgstr "למחוק את הסימון הזה?" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.scd-message" -msgid_plural "modals.delete-shared-confirm.activated.scd-message" -msgstr[0] "הספרייה הזאת מופעלת כאן: " -msgstr[1] "הספריות האלו מופעלות כאן: " -msgstr[2] "הספריות האלו מופעלות כאן: " -msgstr[3] "הספריות האלו מופעלות כאן: " - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.no-files-message" -msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "לא מופעל באף קובץ." -msgstr[1] "לא מופעלים באף קובץ." -msgstr[2] "לא מופעלים באף קובץ." -msgstr[3] "לא מופעלים באף קובץ." - -msgid "modals.delete-component-annotation.title" -msgstr "מחיקת סימון" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "לבדוק את Penpot ולראות אם הוא מתאים לצוות שלי " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "סטודנט/ית או מרצה" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "להשאיר משוב למיזם הצוותי שלי" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"אסימוני גישה אישיים הם דרך חלופית למערכת אימות הכניסה/סיסמה שלנו ומאפשרים " -"ליישום לגשת ל־API הפנימי של Penpot" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "נא ללחוץ על הכפתור „יצירת אסימון חדש” כדי ליצור אחד חדש." - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"הספרייה שלך ריקה. לאחר שנוספה כתיקייה משותפת, הנכסים שנוצרים על ידיך יהיו " -"זמינים לצד שאר הקבצים שלך. לפרסם אותה?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "… עיצוב מנשק, נכסים חזותיים, מערכות עיצוב, וכו׳." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "עבודה עם רעיונות למימוש" - -msgid "workspace.options.component.copy" -msgstr "העתקה" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"המשוב שלך יסייע לנו להבין מה הם ההרגלים וההעדפות שלך כדי שנוכל להמשיך להפוך " -"את Penpot לכלי מהנה ושימושי." - -msgid "workspace.options.component.create-annotation" -msgstr "יצירת הסבר" - -msgid "workspace.options.component.edit-annotation" -msgstr "עריכת הסבר" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "הורדת הקוד מהמיזם הצוותי שלי " - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "מרובע" - -msgid "workspace.options.component.main" -msgstr "ראשי" - -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "עדיין אין סוגי טיפוגרפיה בספרייה שלך" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "נכסים שכבר נעשה בהם שימוש בקובץ הזה יישארו שם (אף עיצוב לא ייפגע)." -msgstr[1] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." -msgstr[2] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." -msgstr[3] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." - -msgid "workspace.options.component.annotation" -msgstr "הסבר" - -msgid "workspace.layout_grid.editor.title" -msgstr "רשת עריכה" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "… תרשימי מתאר, סיפורי ותהליכי משתמשים, עצי ניווט ועוד." - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "יהלום" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "ניתוק" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "משולש" - -msgid "workspace.shape.menu.create-annotation" -msgstr "יצירת הסבר" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "חץ" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "מייסד/סגן נשיא" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "עיגול" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"עצם יצירת חשבון חדש מהווה הסכמה ל[תנאי השירות](%s) ול[מדיניות הפרטיות](%s) " -"שלנו." - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "מספר גרסת הקובץ לא תואם" - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "התגלתה יכולת לא תואמת ‚%s’" - -msgid "labels.share" -msgstr "שיתוף" - -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "להמשיך ביצירת צוות" - -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "להתחיל בלי צוות" - -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "עריכת רשת" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "יציאה מהמערכת" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "איתור" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "בוצע" - -msgid "workspace.top-bar.read-only.done" -msgstr "בוצע" - -msgid "workspace.options.guides.title" -msgstr "קווים מנחים" - -msgid "media.linear" -msgstr "קווי" - -msgid "media.radial" -msgstr "מעגלי" - -msgid "media.gradient" -msgstr "מדרג" - -msgid "media.choose-image" -msgstr "בחירת תמונה" - -msgid "shortcuts.toggle-theme" -msgstr "החלפת ערכת עיצוב" - -msgid "workspace.header.menu.toggle-dark-theme" -msgstr "החלפה לערכת עיצוב כהה" - -msgid "workspace.context-menu.grid-track.column.add-before" -msgstr "הוספת עמודה משמאל" - -msgid "workspace.context-menu.grid-track.column.delete-shapes" -msgstr "מחיקת עמודה וצורות" - -msgid "workspace.context-menu.grid-track.row.duplicate" -msgstr "שכפול שורה" - -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"נראה שאין התאמ בין היכולות הפעילות לבין הקובץ שניסית לפתוח. יש להחיל הסבות " -"עבור ‚%s’ לפני שיתאפשר לפתוח את הקובץ הזה." - -msgid "workspace.header.menu.toggle-light-theme" -msgstr "החלפה לערכת עיצוב בהירה" - -msgid "workspace.options.component.swap" -msgstr "החלפת רכיב" - -msgid "workspace.options.component.swap.empty" -msgstr "עדיין אין נכסים בתיקייה הזאת" - -msgid "dashboard.import.analyze-error.components-v2" -msgstr "קובץ עם רכיבים בגרסה 2 מופעל אך הצוות הזה לא תומך בזה עדיין." - -msgid "errors.validation" -msgstr "שגיאת אימות" - -msgid "errors.paste-data-validation" -msgstr "נתונים שגויים בלוח הגזירים" - -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "ביטול הגדרה" - -msgid "labels.search" -msgstr "חיפוש" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "אפשר ליצור צוות בהמשך." - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "להמשיך בלי צוות" - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "ליצור צוות ולשלוח הזמנות" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "ליצור צוות בלי לשלוח הזמנות" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "ליצור צוות ולהזמין" - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "ליצור צוות" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "אפשר להזמין בהמשך" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.loading" -msgstr "בטעינה…" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "זרימה" - -msgid "media.image" -msgstr "תמונה" - -msgid "media.solid" -msgstr "אחיד" - -msgid "workspace.context-menu.grid-track.column.duplicate" -msgstr "שכפול עמודה" - -msgid "workspace.context-menu.grid-track.column.add-after" -msgstr "הוספת עמודה מימין" - -msgid "workspace.context-menu.grid-track.column.delete" -msgstr "מחיקת עמודה" - -msgid "workspace.context-menu.grid-track.row.add-before" -msgstr "הוספת שורה למעלה" - -msgid "workspace.context-menu.grid-track.row.add-after" -msgstr "הוספת שורה מתחת" - -msgid "workspace.context-menu.grid-track.row.delete" -msgstr "מחיקת שורה" - -msgid "workspace.context-menu.grid-track.row.delete-shapes" -msgstr "מחיקת שורה וצורות" - -msgid "workspace.context-menu.grid-cells.merge" -msgstr "מיזוג תאים" - -msgid "workspace.context-menu.grid-cells.area" -msgstr "יצירת שטח" - -msgid "workspace.context-menu.grid-cells.create-board" -msgstr "יצירת לוח" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-account-title" -msgstr "כניסה לחשבון שלי" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-tagline" -msgstr "Penpot הוא כלי בקוד פתוח לשיתוף עיצוב וקוד" - -msgid "modals.move-shared-confirm.message" -msgid_plural "modals.move-shared-confirm.message" -msgstr[0] "להעביר את הספרייה הזאת?" -msgstr[1] "להעביר את הספריות האלו?" -msgstr[2] "להעביר את הספריות האלו?" -msgstr[3] "להעביר את הספריות האלו?" - -msgid "onboarding.team-modal.team-definition" -msgstr "מה זה צוות?" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs -msgid "settings.select-this-color" -msgstr "בחירת פריטים שמשתמשים בסגנון הזה" - -msgid "shortcuts.toggle-guides" -msgstr "הצגת / הסתרת קווים מנחים" - -msgid "shortcuts.scale" -msgstr "התאמת גודל" - -msgid "shortcuts.toggle-layout-grid" -msgstr "הוספת/הסרת פריסת רשת" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.sort" -msgstr "מיון" - -#: src/app/main/data/users.cljs -msgid "errors.auth-provider-not-allowed" -msgstr "ספק האימות לא מורשה לפרופיל הזה" - -#: src/app/main/data/users.cljs -msgid "errors.email-domain-not-allowed" -msgstr "שם התחום לא מורשה" - -msgid "modals.move-shared-confirm.title" -msgid_plural "modals.move-shared-confirm.title" -msgstr[0] "העברת ספרייה" -msgstr[1] "העברת ספריות" -msgstr[2] "העברת ספריות" -msgstr[3] "העברת ספריות" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.never-used-one" -msgstr "אין" - -msgid "shortcuts.toggle-rulers" -msgstr "הצגת / הסתרת סרגלים" - -msgid "shortcuts.toggle-snap-guides" -msgstr "הצמדה לקווים מנחים" - -msgid "shortcuts.toggle-snap-ruler-guide" -msgstr "הצמדה לקווים מנחים סרגלים" diff --git a/frontend/translations/id.po b/frontend/translations/id.po index e4e1ea468..276c9c831 100644 --- a/frontend/translations/id.po +++ b/frontend/translations/id.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 12:55+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Indonesian \n" +"Language-Team: Indonesian " +"\n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -5024,10 +5024,6 @@ msgstr "Teks (%s)" msgid "workspace.toolbar.text-palette" msgstr "Tipografi (%s)" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Mode inspeksi** (Hanya Tampilan)" - msgid "workspace.top-bar.read-only.done" msgstr "Selesai" @@ -5164,204 +5160,3 @@ msgstr "Perbarui" msgid "workspace.viewport.click-to-close-path" msgstr "Klik untuk menutup jalur" - -msgid "workspace.options.component.copy" -msgstr "Salin" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Persegi panjang" - -msgid "workspace.options.component.main" -msgstr "Utama" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Berlian" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Copot" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Segitiga" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Tanda panah" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Pustaka Anda saat ini kosong. Ketika ditambahkan sebagai Pustaka Terbagi, " -"aset yang Anda buat akan tersedia untuk digunakan bersama dengan berkas " -"Anda. Apakah Anda yakin ingin menerbitkannya?" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Lingkaran" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Ketika membuat akun baru, Anda menyetujui [persyaratan layanan](%s) dan [" -"kebijakan privasi](%s) kami." - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Berkas memiliki nomor versi tidak kompatibel" - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Fitur '%s' tidak kompatibel terdeteksi" - -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Tidak ditetapkan" - -msgid "labels.share" -msgstr "Bagikan" - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Buat tim dan kirim undangan" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Cari lokasi" - -msgid "workspace.options.component.swap" -msgstr "Ganti komponen" - -msgid "media.gradient" -msgstr "Gradien" - -msgid "media.choose-image" -msgstr "Pilih gambar" - -msgid "media.solid" -msgstr "Padat" - -msgid "media.linear" -msgstr "Linear" - -msgid "media.radial" -msgstr "Radial" - -msgid "dashboard.import.analyze-error.components-v2" -msgstr "Berkas dengan komponen v2 diaktifkan tetapi tim ini belum mendukungnya." - -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Sepertinya ada ketidakcocokan antara fitur yang diaktifkan dengan fitur " -"berkas yang sedang Anda buka. Migrasi untuk '%s' harus diterapkan sebelum " -"berkasnya dapat dibuka." - -msgid "errors.validation" -msgstr "Kesalahan Validasi" - -msgid "errors.paste-data-validation" -msgstr "Data tidak valid dalam papan klip" - -msgid "labels.search" -msgstr "Cari" - -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Lanjutkan membuat tim" - -msgid "shortcuts.toggle-theme" -msgstr "Ubah tema" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Selesai" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Keluar" - -msgid "workspace.top-bar.read-only.done" -msgstr "Selesai" - -msgid "media.image" -msgstr "Gambar" - -msgid "workspace.options.guides.title" -msgstr "Panduan" - -msgid "workspace.context-menu.grid-track.row.delete" -msgstr "Hapus baris" - -msgid "workspace.context-menu.grid-track.row.delete-shapes" -msgstr "Hapus baris dan bentuk" - -msgid "workspace.context-menu.grid-cells.merge" -msgstr "Gabungkan sel" - -msgid "workspace.context-menu.grid-cells.area" -msgstr "Buat area" - -msgid "workspace.context-menu.grid-cells.create-board" -msgstr "Buat papan" - -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Mulai tanpa tim" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Anda nanti akan dapat membuat tim." - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Lanjutkan tanpa tim" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Buat tim tanpa mengundang" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Buat tim & undang" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Anda nanti akan dapat mengundang" - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Buat tim" - -msgid "workspace.header.menu.toggle-light-theme" -msgstr "Ubah ke tema terang" - -msgid "workspace.header.menu.toggle-dark-theme" -msgstr "Ubah ke tema gelap" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.loading" -msgstr "Memuat…" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Alur" - -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Sunting kisi" - -msgid "workspace.options.component.swap.empty" -msgstr "Belum ada aset dalam pustaka ini" - -msgid "workspace.context-menu.grid-track.column.duplicate" -msgstr "Gandakan kolom" - -msgid "workspace.context-menu.grid-track.column.add-before" -msgstr "Tambah 1 kolom ke kiri" - -msgid "workspace.context-menu.grid-track.column.add-after" -msgstr "Tambah 1 kolom ke kanan" - -msgid "workspace.context-menu.grid-track.column.delete" -msgstr "Hapus kolom" - -msgid "workspace.context-menu.grid-track.column.delete-shapes" -msgstr "Hapus kolom dan bentuk" - -msgid "workspace.context-menu.grid-track.row.duplicate" -msgstr "Gandakan baris" - -msgid "workspace.context-menu.grid-track.row.add-before" -msgstr "Tambah 1 baris di atas" - -msgid "workspace.context-menu.grid-track.row.add-after" -msgstr "Tambah 1 baris di bawah" diff --git a/frontend/translations/ig.po b/frontend/translations/ig.po index 2bbc09546..5c5ea3353 100644 --- a/frontend/translations/ig.po +++ b/frontend/translations/ig.po @@ -2,334 +2,18 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 12:55+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Igbo " -"\n" +"Language-Team: Igbo " +"\n" "Language: ig\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.5.1-dev\n" -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-github-submit" -msgstr "Obi Git" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-gitlab-submit" -msgstr "Ụlọ nchọcha Git" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-google-submit" -msgstr "Gọgụlụ" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-with-ldap-submit" -msgstr "LDAP" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.no-expiration" -msgstr "Enweghị ụbọchị mmebi" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "Ọdịmara nkeonwe" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-expire" -msgstr "Ọdịmara ga-emebi na%s" - -msgid "dashboard.fonts.deleted-placeholder" -msgstr "Mkpụrụ edemede na-efu efu" - -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.upload-all" -msgstr "Bugo ha niile" - -msgid "dashboard.import.progress.process-media" -msgstr "Nhazi mgbasa ozi" - -msgid "dashboard.import.progress.process-page" -msgstr "Nhazi ihu akwụkwọ : %s" - -msgid "dashboard.import.progress.process-typographies" -msgstr "Nhazi akara nkụpụta" - -msgid "dashboard.import.progress.upload-data" -msgstr "Ibugo njatụle n'ebe nkesa (%s/%s)" - -msgid "dashboard.libraries-and-templates" -msgstr "Ọba ederede gasị & ndebiri" - -msgid "dashboard.libraries-and-templates.explore" -msgstr "Nyocha ọtụtụ n'ime ha ma mara etu ị ga-esi tinye ọnụ" - -msgid "dashboard.libraries-and-templates.import-error" -msgstr "E nwere nsogbu ibu aba ndebiri . E bubataghị ndebiri." - -#: src/app/main/ui/dashboard/libraries.cljs -msgid "dashboard.libraries-title" -msgstr "Ọba ederede gasị" - -msgid "dashboard.options" -msgstr "Nhọrọ gasị" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dashboard.projects-title" -msgstr "Arụmarụ" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.search-placeholder" -msgstr "Chọọ…" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.searching-for" -msgstr "Na-achọ “%s“…" - -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.select-ui-language" -msgstr "Họrọ asụsụ UI" - -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.theme-change" -msgstr "Isiokwu UI" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.title-search" -msgstr "Chọọ risọltụ gasị" - -#: src/app/main/ui/confirm.cljs, src/app/main/ui/confirm.cljs -msgid "ds.confirm-title" -msgstr "Ọ doro gị anya ?" - -msgid "errors.auth.unable-to-login" -msgstr "Ọ dị ka enyochaghị gị ma ọ bụ na oge agwụla ." - -msgid "errors.bad-font" -msgstr "E nweghị ike bugo %s mkpụrụ edide" - -msgid "errors.bad-font-plural" -msgstr "E nweghị ike bugo %s mkpụrụ edide" - -msgid "errors.cannot-upload" -msgstr "E nweghị ike ị ugo ederede ." - -#: src/app/main/data/workspace.cljs -msgid "errors.clipboard-not-implemented" -msgstr "Your browser cannot do this operation" - -msgid "errors.profile-blocked" -msgstr "A gbachiri nchịkọta agbachi" - -#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.profile-is-muted" -msgstr "" -"Nchịkọta gị lnwere ozi-n mechiri emechi(akụkọ ozi-n adịghị mma ma ọ bụ nwere " -"oké bịaghachiri ).\")." - -#: src/app/main/ui/auth/register.cljs -msgid "errors.registration-disabled" -msgstr "Ndebanye merụrụ emerụ ugbu a." - -msgid "errors.team-leave.owner-cant-leave" -msgstr "O wee enweghị ike ịhapụ otu, ị ga-enyegharịrị ọrụ onwee." - -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.unexpected-token" -msgstr "Ọdịmara amaghị ama" - -#: src/app/main/ui/inspect/attributes/blur.cljs -msgid "inspect.attributes.blur.value" -msgstr "Uru" - -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.hex" -msgstr "HEX" - -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.hsla" -msgstr "HSLA" - -#: src/app/main/ui/inspect/attributes/common.cljs -msgid "inspect.attributes.color.rgba" -msgstr "RGBA" - -#: src/app/main/ui/inspect/attributes/stroke.cljs -msgid "inspect.attributes.stroke" -msgstr "Akara" - -#, permanent -msgid "inspect.attributes.stroke.alignment.center" -msgstr "Etiti" - -msgid "labels.font-providers" -msgstr "Ndị na-enye mkpụrụ edide" - -msgid "labels.font-variants" -msgstr "Ụdịdị gasị" - -msgid "labels.fonts" -msgstr "Mkpụrụ edide gasị" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.github-repo" -msgstr "Ọ a Github" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.libraries-and-templates" -msgstr "Ọba ederede na Ndebiri gasị" - -msgid "labels.log-or-sign" -msgstr "Banye ma ọ bụ debanye" - -#: src/app/main/ui/dashboard/team.cljs -#, markdown -msgid "labels.no-invitations-hint" -msgstr "Pịa mpị**kpọọ ndị mmadụ ** ịkpọọ ndị mmadụ n'otu a." - -#: src/app/main/ui/static.cljs -msgid "labels.not-found.desc-message" -msgstr "" -"Ihu akwụkwọ a nwere ike ọ gaghị adị ma ọ bụ ị nweghị ikikere inweta ya ." - -#: src/app/main/ui/static.cljs -msgid "labels.not-found.main-message" -msgstr "E wuu !" - -#: src/app/main/ui/settings/password.cljs -msgid "labels.old-password" -msgstr "Akara mpịbanye ochie" - -#: src/app/main/ui/workspace/comments.cljs -msgid "labels.only-yours" -msgstr "Sọọsọ nke gị" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.pending-invitation" -msgstr "Na-echere" - -#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.rename" -msgstr "Nyegharịa aha" - -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.rename-team" -msgstr "Nyegharịa otu" - -#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs -msgid "labels.retry" -msgstr "Nwagharịa" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.role" -msgstr "Ọrụ" - -msgid "labels.save" -msgstr "Dokwa" - -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.settings" -msgstr "Ntọala" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.shared-libraries" -msgstr "Ọba ederede" - -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.show-all-comments" -msgstr "Gosi nkwupụta niile" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.unpublish-multi-files" -msgstr "%s ederede ebipụtaghị" - -msgid "labels.upload" -msgstr "Bugo" - -msgid "modals.delete-font.title" -msgstr "Na-ehichapụ mkpụrụ edide" - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "modals.delete-page.body" -msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ ihu akwụkwọ a?" - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "modals.delete-page.title" -msgstr "Hichapụ ihu akwụkwọ" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.accept" -msgstr "Hichapụ arụmarụ" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.message" -msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ arụmarụ ?" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "modals.delete-project-confirm.title" -msgstr "Hichapụ arụmarụ" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "notifications.profile-deletion-not-allowed" -msgstr "" -"I nweghị ike ị hichapụ nchịkọta gị . Nyegharịa ya ndị otu gị tupu ị ganihu" - -#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs -msgid "notifications.profile-saved" -msgstr "E dọkwara nchịkọta nke ọma" - -#: src/app/main/ui/settings/change_email.cljs -msgid "notifications.validation-email-sent" -msgstr "Ozi nnyocha n zigara na%s. Mepe ozi n gị !" - -msgid "onboarding-v2.before-start.desc1" -msgstr "" -"I kwesịrị ịma na e nwere ọtụtụ ihe e ji arụ ọrụ dị inwere gị iji bido n'ite " -"mkpịsị , dị ka ntuziaka onye ọrụ na ọwa YouTube anyị l." - -msgid "onboarding-v2.before-start.desc2" -msgstr "" -"Ozi banyere etu esi eji ite mkpịsị arụ ọrụ uju. Site na ime atụtụ ga na " -"nhazi ma ọ bụ nkesa esereese ." - -msgid "onboarding-v2.before-start.title" -msgstr "Tupu i bido" - -msgid "onboarding-v2.newsletter.news" -msgstr "" -"Zitere m akụkọ banyere ite mkpịsị (ozi edemonye gasị, Nkụzi ihe onyonyo, " -"nkirigarị...)." - -msgid "onboarding.choice.team-up.invite-members" -msgstr "Kpọta ndị otu" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "Kedu ngwa ọrụ nse ị ka mara eji arụ ọrụ ?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "Iri na otu ruo na iri atọ" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "Abụọ ruo na iri" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "Kedụ ka Ị ga-esi kọwaa ọfụma ihe ndị ị hụrụ ịrụ ọrụ na..." - -msgid "shortcuts.paste" -msgstr "Nyado" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.color-palette" -msgstr "Agba[ Palette (Na narị)" - #: src/app/main/ui/auth/register.cljs msgid "auth.check-your-email" -msgstr "" -"Nyoo ozi- n gị ma pịa na njikọ inyocha ma bido jiri ite mkpịsị rụwa ọrụ ." +msgstr "Nyoo ozi- n gị ma pịa na njikọ inyocha ma bido jiri ite mkpịsị rụwa ọrụ ." #: src/app/main/ui/auth/recovery.cljs msgid "auth.confirm-password" @@ -369,6 +53,22 @@ msgstr "Banye ebe a" msgid "auth.login-submit" msgstr "Banye" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-github-submit" +msgstr "Obi Git" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-gitlab-submit" +msgstr "Ụlọ nchọcha Git" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-google-submit" +msgstr "Gọgụlụ" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-with-ldap-submit" +msgstr "LDAP" + #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-oidc-submit" msgstr "Mepe ID" @@ -381,10 +81,6 @@ msgstr "Aha ga-enweriri ụfọdụ mkpụrụ edemede karịa oghere ." msgid "auth.name.too-long" msgstr "Aha ga-enweriri ọ karịa mkpụrụ okwu narị abụọ na iri ise" -#: src/app/main/ui/auth/login.cljs -msgid "auth.register" -msgstr "E nweghị ebe Ntinye ihe ma kịta?" - #: src/app/main/ui/auth/recovery.cljs msgid "auth.new-password" msgstr "Pinye akara mpịbanye ọhụrụ" @@ -436,6 +132,10 @@ msgstr "Chefuru akara mpịbanye ?" msgid "auth.recovery-submit" msgstr "Gbanye akara mpịbanye." +#: src/app/main/ui/auth/login.cljs +msgid "auth.register" +msgstr "E nweghị ebe Ntinye ihe ma kịta?" + #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.register-submit" msgstr "Mepee ebe Ntinye ihe" @@ -591,6 +291,14 @@ msgstr "Mebiri na%s" msgid "dashboard.access-tokens.expires-on" msgstr "Na-emebi na%s" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.no-expiration" +msgstr "Enweghị ụbọchị mmebi" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "Ọdịmara nkeonwe" + #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.personal.description" msgstr "" @@ -598,6 +306,10 @@ msgstr "" "mpịbanye e nwere ike iji usoro mbinye aka kwe ka ngwa nweta ndịnime ite " "mkpịsị API" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "Ọdịmara ga-emebi na%s" + #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.token-will-not-expire" msgstr "Ọdịmara enweghị ụbọchị mmebi" @@ -645,8 +357,8 @@ msgstr "Mee o yiri %s ederede" msgid "dashboard.empty-placeholder-drafts" msgstr "" "Ederede a tinyere n'ọba ederede ga-apụta ebe a. Gbalịa ikesa ma ọ bụ tinye " -"site n'[Ọba ederede na ndebiri anyị ](https://itemkpịsị.app/ọba ederede gasị-" -"ndebiri gasị.html)." +"site n'[Ọba ederede na ndebiri anyị ](https://itemkpịsị.app/ọba ederede " +"gasị-ndebiri gasị.html)." msgid "dashboard.export-binary-multi" msgstr "Butuo %s ederede ite mkpịsị (.penpot)" @@ -687,8 +399,7 @@ msgid "dashboard.export-standard-multi" msgstr "Buto %s ederede tozuru etozu (.svg + .json)" msgid "dashboard.export.detail" -msgstr "" -"* Nwere Ike ịgụnye ngwa , esereese gasị, agwụgwara na/ma ọ bụ akara nkụpụta." +msgstr "* Nwere Ike ịgụnye ngwa , esereese gasị, agwụgwara na/ma ọ bụ akara nkụpụta." msgid "dashboard.export.options.all.message" msgstr "" @@ -709,6 +420,9 @@ msgstr "Tinye ihe nnwe ọba ederede nkekọrịta n'ime ọ a ederede." msgid "dashboard.export.title" msgstr "Ederede mbupu gasị" +msgid "dashboard.fonts.deleted-placeholder" +msgstr "Mkpụrụ edemede na-efu efu" + #: src/app/main/ui/dashboard/fonts.cljs msgid "dashboard.fonts.dismiss-all" msgstr "Gbasaa ha niile" @@ -716,10 +430,15 @@ msgstr "Gbasaa ha niile" msgid "dashboard.fonts.empty-placeholder" msgstr "Mkpụrụ edemede ndị ị bugoro ga-apụta ebe." +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.upload-all" +msgstr "Bugo ha niile" + #, markdown msgid "dashboard.fonts.warning-text" msgstr "" -"Anyị chọpụtara nsogbu nwere ike ịpụta na mkpụrụ edide gị gbasara ntụ kwụ ọtọ " +"Anyị chọpụtara nsogbu nwere ike ịpụta na mkpụrụ edide gị gbasara ntụ kwụ " +"ọtọ " msgid "dashboard.import.analyze-error" msgstr "Ewuu! Anyị enweghị ike bubata ederede a" @@ -736,6 +455,18 @@ msgstr "Nhazi agwụgwara gasị" msgid "dashboard.import.progress.process-components" msgstr "Nhazi ngwa gasị" +msgid "dashboard.import.progress.process-media" +msgstr "Nhazi mgbasa ozi" + +msgid "dashboard.import.progress.process-page" +msgstr "Nhazi ihu akwụkwọ : %s" + +msgid "dashboard.import.progress.process-typographies" +msgstr "Nhazi akara nkụpụta" + +msgid "dashboard.import.progress.upload-data" +msgstr "Ibugo njatụle n'ebe nkesa (%s/%s)" + msgid "dashboard.import.progress.upload-media" msgstr "Ibugo ederede : %s" @@ -747,6 +478,19 @@ msgstr "Kpọta mmadụ" msgid "dashboard.leave-team" msgstr "Hapụ otu" +msgid "dashboard.libraries-and-templates" +msgstr "Ọba ederede gasị & ndebiri" + +msgid "dashboard.libraries-and-templates.explore" +msgstr "Nyocha ọtụtụ n'ime ha ma mara etu ị ga-esi tinye ọnụ" + +msgid "dashboard.libraries-and-templates.import-error" +msgstr "E nwere nsogbu ibu aba ndebiri . E bubataghị ndebiri." + +#: src/app/main/ui/dashboard/libraries.cljs +msgid "dashboard.libraries-title" +msgstr "Ọba ederede gasị" + #: src/app/main/ui/dashboard/grid.cljs msgid "dashboard.loading-files" msgstr "Mbụbata ederede gị …" @@ -758,10 +502,6 @@ msgstr "mbubata mkpụrụ edemede gị …" msgid "dashboard.move-to" msgstr "Ga na" -#: src/app/main/ui/auth/verify_token.cljs -msgid "dashboard.notifications.email-changed-successfully" -msgstr "Adreesị ozi - n gị ahazigharịala gara nke ọma" - #: src/app/main/ui/dashboard/file_menu.cljs msgid "dashboard.move-to-multi" msgstr "Buga %s ederede gasị na" @@ -794,6 +534,10 @@ msgstr "Ọ nweghị ihe ndabara e nwetara maka “%s“" msgid "dashboard.no-projects-placeholder" msgstr "Arụmarụ a kụdoro ga-apụta ebe a" +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-changed-successfully" +msgstr "Adreesị ozi - n gị ahazigharịala gara nke ọma" + #: src/app/main/ui/auth/verify_token.cljs msgid "dashboard.notifications.email-verified-successfully" msgstr "E nyochala adreesị ozi - n gị nke ọma" @@ -810,6 +554,9 @@ msgstr "%s Ndị otu" msgid "dashboard.open-in-new-tab" msgstr "Mepe ederede na tabụ ọhụrụ" +msgid "dashboard.options" +msgstr "Nhọrọ gasị" + #: src/app/main/ui/settings/password.cljs msgid "dashboard.password-change" msgstr "Gbanwee akara mpịbanye" @@ -818,6 +565,10 @@ msgstr "Gbanwee akara mpịbanye" msgid "dashboard.pin-unpin" msgstr "Nọmba /Wepụ nọmba" +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.projects-title" +msgstr "Arụmarụ" + #: src/app/main/ui/settings/profile.cljs msgid "dashboard.remove-account" msgstr "Chọọ iwepu ebe Ntinye ihe gị ?" @@ -830,6 +581,18 @@ msgstr "Wepụ dị ka ọba ederede nkekọrịta" msgid "dashboard.save-settings" msgstr "Dokwa ntọala" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.search-placeholder" +msgstr "Chọọ…" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.searching-for" +msgstr "Na-achọ “%s“…" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-language" +msgstr "Họrọ asụsụ UI" + #: src/app/main/ui/dashboard/project_menu.cljs msgid "dashboard.success-duplicate-project" msgstr "E megharịala arụmarụ gị nke ọma\"" @@ -854,6 +617,14 @@ msgstr "Ndị otu" msgid "dashboard.team-projects" msgstr "Arụmarụ otu" +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.theme-change" +msgstr "Isiokwu UI" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.title-search" +msgstr "Chọọ risọltụ gasị" + #: src/app/main/ui/dashboard/search.cljs msgid "dashboard.type-something" msgstr "Pinye ịchọ risọltụ" @@ -893,10 +664,6 @@ msgstr "Pịa mpị \"Tinye nko-ududọ \" ịtinye otu ." msgid "dashboard.webhooks.empty.no-webhooks" msgstr "E nweghị Nko-ududọ e ebere ruo ugbu a ." -msgid "errors.email-spam-or-permanent-bounces" -msgstr "" -"E nwela ozi nkọwa na ozi-n«%s» dị ka ozi abaghị uru ma ọ bụ mbịaghachigide." - msgid "dashboard.webhooks.update.success" msgstr "Ahazigharịrị nko-ududọ nke ọma ." @@ -928,6 +695,26 @@ msgstr "Kagbuo" msgid "ds.confirm-ok" msgstr "Okay" +#: src/app/main/ui/confirm.cljs, src/app/main/ui/confirm.cljs +msgid "ds.confirm-title" +msgstr "Ọ doro gị anya ?" + +msgid "errors.auth.unable-to-login" +msgstr "Ọ dị ka enyochaghị gị ma ọ bụ na oge agwụla ." + +msgid "errors.bad-font" +msgstr "E nweghị ike bugo %s mkpụrụ edide" + +msgid "errors.bad-font-plural" +msgstr "E nweghị ike bugo %s mkpụrụ edide" + +msgid "errors.cannot-upload" +msgstr "E nweghị ike ị ugo ederede ." + +#: src/app/main/data/workspace.cljs +msgid "errors.clipboard-not-implemented" +msgstr "Your browser cannot do this operation" + #: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs msgid "errors.email-already-exists" msgstr "E jibuola ozi - n rụọ ọrụ" @@ -951,6 +738,9 @@ msgstr "Debanye aha ozi-n dabara adaba" msgid "errors.email-invalid-confirmation" msgstr "Ozi-n nnabata ga-adabrịrị" +msgid "errors.email-spam-or-permanent-bounces" +msgstr "E nwela ozi nkọwa na ozi-n«%s» dị ka ozi abaghị uru ma ọ bụ mbịaghachigide." + #: src/app/main/errors.cljs msgid "errors.feature-mismatch" msgstr "" @@ -998,16 +788,36 @@ msgstr "" "Nchịkọta gị nwere ozi-n mechiri emechi (akụkọ ozi-n adịghị mma ma ọ bụ " "nwere oké bịaghachiri )." +msgid "errors.profile-blocked" +msgstr "A gbachiri nchịkọta agbachi" + +#: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.profile-is-muted" +msgstr "" +"Nchịkọta gị lnwere ozi-n mechiri emechi(akụkọ ozi-n adịghị mma ma ọ bụ " +"nwere oké bịaghachiri ).\")." + +#: src/app/main/ui/auth/register.cljs +msgid "errors.registration-disabled" +msgstr "Ndebanye merụrụ emerụ ugbu a." + msgid "errors.team-leave.insufficient-members" msgstr "Ndị otu ezughị okè ịhapụ otu, ọ nyere ike na ị chọrọ ihichapụ ya ." msgid "errors.team-leave.member-does-not-exists" msgstr "Onye otu ị na-achọ inye adịghị ." +msgid "errors.team-leave.owner-cant-leave" +msgstr "O wee enweghị ike ịhapụ otu, ị ga-enyegharịrị ọrụ onwee." + #: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs msgid "errors.unexpected-error" msgstr "Ndejo atughị anya ya pụtara ." +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.unexpected-token" +msgstr "Ọdịmara amaghị ama" + msgid "errors.webhooks.connection" msgstr "Mmejọ, e nwetaghị URL" @@ -1069,13 +879,29 @@ msgstr "Gaa na Twita" msgid "feedback.twitter-subtitle1" msgstr "Ebe inyere gị aka n'ajụjụ nkà gị ." -#: src/app/main/ui/settings/password.cljs -msgid "generic.error" -msgstr "Mmehie apụtala" +#: src/app/main/ui/settings/password.cljs +msgid "generic.error" +msgstr "Mmehie apụtala" + +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur" +msgstr "Inyogo" + +#: src/app/main/ui/inspect/attributes/blur.cljs +msgid "inspect.attributes.blur.value" +msgstr "Uru" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hex" +msgstr "HEX" + +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.hsla" +msgstr "HSLA" -#: src/app/main/ui/inspect/attributes/blur.cljs -msgid "inspect.attributes.blur" -msgstr "Inyogo" +#: src/app/main/ui/inspect/attributes/common.cljs +msgid "inspect.attributes.color.rgba" +msgstr "RGBA" #: src/app/main/ui/inspect/attributes/fill.cljs msgid "inspect.attributes.fill" @@ -1105,6 +931,18 @@ msgstr "Ogo" msgid "inspect.attributes.layout.left" msgstr "Aka ekpe" +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.rotation" +msgstr "Ntụgharị" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.top" +msgstr "Elu" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.width" +msgstr "Uhie" + #: src/app/main/ui/inspect/attributes/shadow.cljs msgid "inspect.attributes.shadow" msgstr "Oninyo" @@ -1113,6 +951,14 @@ msgstr "Oninyo" msgid "inspect.attributes.size" msgstr "Nhazi na ọnọdụ" +#: src/app/main/ui/inspect/attributes/stroke.cljs +msgid "inspect.attributes.stroke" +msgstr "Akara" + +#, permanent +msgid "inspect.attributes.stroke.alignment.center" +msgstr "Etiti" + #, permanent msgid "inspect.attributes.stroke.alignment.inner" msgstr "Ime" @@ -1124,18 +970,6 @@ msgstr "Ezi" msgid "inspect.attributes.stroke.style.dotted" msgstr "Atụrụ kpọm kpọm" -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.rotation" -msgstr "Ntụgharị" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.top" -msgstr "Elu" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.width" -msgstr "Uhie" - msgid "inspect.attributes.stroke.style.mixed" msgstr "Gwakọtara" @@ -1165,11 +999,6 @@ msgstr "Nhazi mkpụrụ edide" msgid "inspect.attributes.typography.letter-spacing" msgstr "Ndesa mkpụrụ edemede" -msgid "inspect.empty.help" -msgstr "" -"Ị chọọ ị ma ihe ndị ọzọ maka nnyocha esereese, gaa n'ebe enyemaka ite mkpịsị " -"r" - #: src/app/main/ui/inspect/attributes/text.cljs msgid "inspect.attributes.typography.line-height" msgstr "Ogo akara" @@ -1200,6 +1029,11 @@ msgstr "Mkpụrụ edemede isiokwu" msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Mkpụrụ edemede nnukwu" +msgid "inspect.empty.help" +msgstr "" +"Ị chọọ ị ma ihe ndị ọzọ maka nnyocha esereese, gaa n'ebe enyemaka ite " +"mkpịsị r" + #: src/app/main/ui/inspect/right_sidebar.cljs msgid "inspect.tabs.code" msgstr "Akara" @@ -1373,6 +1207,19 @@ msgstr "Zigara nzaghachi" msgid "labels.font-family" msgstr "Ezinụlọ mkpụrụ edide" +msgid "labels.font-providers" +msgstr "Ndị na-enye mkpụrụ edide" + +msgid "labels.font-variants" +msgstr "Ụdịdị gasị" + +msgid "labels.fonts" +msgstr "Mkpụrụ edide gasị" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.github-repo" +msgstr "Ọ a Github" + #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs msgid "labels.give-feedback" msgstr "Nye nzaghachi" @@ -1396,8 +1243,7 @@ msgstr "Mkpụrụ edide gasị ewubere" #: src/app/main/ui/static.cljs msgid "labels.internal-error.desc-message" -msgstr "" -"Ihe ọjọọ mere . Biko, rụgharịa ọrụ ma ọ bụ na nsogbu aka dị , kpọọ nkwado ." +msgstr "Ihe ọjọọ mere . Biko, rụgharịa ọrụ ma ọ bụ na nsogbu aka dị , kpọọ nkwado ." #: src/app/main/ui/static.cljs msgid "labels.internal-error.main-message" @@ -1411,6 +1257,13 @@ msgstr "Akwụkwọ ịkpọ ọkụ gasị" msgid "labels.language" msgstr "Asụsụ" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.libraries-and-templates" +msgstr "Ọba ederede na Ndebiri gasị" + +msgid "labels.log-or-sign" +msgstr "Banye ma ọ bụ debanye" + #: src/app/main/ui/settings.cljs, src/app/main/ui/dashboard/sidebar.cljs msgid "labels.logout" msgstr "Pụọ" @@ -1435,6 +1288,27 @@ msgstr "E jidere unu niile! Ngosi nkwupụta ọhụrụ ga-apụta ebe a ." msgid "labels.no-invitations" msgstr "E nweghị ọkụ na-echere" +#: src/app/main/ui/dashboard/team.cljs +#, markdown +msgid "labels.no-invitations-hint" +msgstr "Pịa mpị**kpọọ ndị mmadụ ** ịkpọọ ndị mmadụ n'otu a." + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.desc-message" +msgstr "Ihu akwụkwọ a nwere ike ọ gaghị adị ma ọ bụ ị nweghị ikikere inweta ya ." + +#: src/app/main/ui/static.cljs +msgid "labels.not-found.main-message" +msgstr "E wuu !" + +#: src/app/main/ui/settings/password.cljs +msgid "labels.old-password" +msgstr "Akara mpịbanye ochie" + +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.only-yours" +msgstr "Sọọsọ nke gị" + msgid "labels.or" msgstr "ma ọ bụ" @@ -1446,6 +1320,10 @@ msgstr "Onye nwe" msgid "labels.password" msgstr "Akara mpịbanye" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.pending-invitation" +msgstr "Na-echere" + #: src/app/main/ui/settings/sidebar.cljs msgid "labels.profile" msgstr "Nchịkọta" @@ -1470,6 +1348,25 @@ msgstr "Wepu" msgid "labels.remove-member" msgstr "Wepụ onye otu" +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.rename" +msgstr "Nyegharịa aha" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.rename-team" +msgstr "Nyegharịa otu" + +#: src/app/main/ui/static.cljs, src/app/main/ui/static.cljs, src/app/main/ui/static.cljs +msgid "labels.retry" +msgstr "Nwagharịa" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.role" +msgstr "Ọrụ" + +msgid "labels.save" +msgstr "Dokwa" + msgid "labels.search-font" msgstr "Chọọ mkpụrụ edide" @@ -1481,6 +1378,18 @@ msgstr "Ziga" msgid "labels.sending" msgstr "Na-eziga…" +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.settings" +msgstr "Ntọala" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.shared-libraries" +msgstr "Ọba ederede" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-all-comments" +msgstr "Gosi nkwupụta niile" + msgid "labels.show-comments-list" msgstr "Gosi ndepụta nkwupụta gasị" @@ -1488,22 +1397,29 @@ msgstr "Gosi ndepụta nkwupụta gasị" msgid "labels.show-your-comments" msgstr "Gosi nanị nkwupụta gị gasị" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.status" +msgstr "Ọnọdụ" + #: src/app/main/ui/dashboard/sidebar.cljs msgid "labels.tutorials" msgstr "Nkuzi" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.unpublish-multi-files" +msgstr "%s ederede ebipụtaghị" + #: src/app/main/ui/settings/profile.cljs msgid "labels.update" msgstr "Hazigharịa" -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.status" -msgstr "Ọnọdụ" - #: src/app/main/ui/dashboard/team_form.cljs msgid "labels.update-team" msgstr "Hazigharịa otu" +msgid "labels.upload" +msgstr "Bugo" + msgid "labels.upload-custom-fonts" msgstr "Bugo ederede gasị ahaziri" @@ -1532,12 +1448,6 @@ msgstr "(gị)" msgid "labels.your-account" msgstr "Akara mbata gị" -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.info" -msgstr "" -"Site na iwepu ebe ntinye ihe gị, arụmarụ gị gasị ugbu a naebe nchekwa ga-" -"efu ." - #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Na-ebupụta onyinyo …" @@ -1614,6 +1524,12 @@ msgstr "Kagbuo ma dobe ebe ntinye ihe m" msgid "modals.delete-account.confirm" msgstr "Eee, hichapụ ebe ntinye ihe m" +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.info" +msgstr "" +"Site na iwepu ebe ntinye ihe gị, arụmarụ gị gasị ugbu a naebe nchekwa " +"ga-efu ." + #: src/app/main/ui/settings/delete_account.cljs msgid "modals.delete-account.title" msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ ebe ntinye ihe gị?" @@ -1652,6 +1568,29 @@ msgstr "Na-ehichapụ ederede" msgid "modals.delete-file-multi-confirm.title" msgstr "Na-ehichapụ ederede %s" +msgid "modals.delete-font.title" +msgstr "Na-ehichapụ mkpụrụ edide" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.body" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ ihu akwụkwọ a?" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "modals.delete-page.title" +msgstr "Hichapụ ihu akwụkwọ" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.accept" +msgstr "Hichapụ arụmarụ" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.message" +msgstr "Ọ kara gị obi na ị chọrọ ị hichapụ arụmarụ ?" + +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "modals.delete-project-confirm.title" +msgstr "Hichapụ arụmarụ" + #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.delete-team-confirm.accept" msgstr "Hichapụ otu" @@ -1707,16 +1646,6 @@ msgstr "Ụfọdụ ozi n sitere na ndị ugbu a A gaghị e ịga akwụkwọ msgid "modals.invite-team-member.title" msgstr "kpọta ndị otu n'otu a" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.hint1" -msgstr "" -"Gị bụ onye nwee otu a, . Biko, họrọ onye otu ọzọ maka ịkwalite gana onye " -"nweeya tupu ị hapụ ." - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.promote-and-leave" -msgstr "Kwalite ma hapụ" - #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.leave-and-close-confirm.hint" msgstr "" @@ -1732,6 +1661,16 @@ msgstr "" "I nweghị ike ịhapụ otu ma ọ bụrụ na e nweghị onye otu ọzọ akwalitere ga na " "onye nwe ya . Ị nwere ike chọọ ị hichapụ otu ." +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.hint1" +msgstr "" +"Gị bụ onye nwee otu a, . Biko, họrọ onye otu ọzọ maka ịkwalite gana onye " +"nweeya tupu ị hapụ ." + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.promote-and-leave" +msgstr "Kwalite ma hapụ" + #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.leave-and-reassign.select-member-to-promote" msgstr "Họrọ onye otu maka ịkwalite" @@ -1788,8 +1727,8 @@ msgstr "Wepụ dịka ọba ederede ekekoritara" #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.remove-shared-confirm.hint" msgstr "" -"Ozugbo e wepụrụ dị ka ọba ederede ekekoritara, ọba ederede ederede a ga-" -"akwụsị dị n'ime ederede ndị ọzọ gasị e ji rụọ ọrụ" +"Ozugbo e wepụrụ dị ka ọba ederede ekekoritara, ọba ederede ederede a " +"ga-akwụsị dị n'ime ederede ndị ọzọ gasị e ji rụọ ọrụ" #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.remove-shared-confirm.message" @@ -1821,6 +1760,28 @@ msgstr "Kagbuo" msgid "notifications.by-code.upgrade-version" msgstr "A new version is available, please refresh the page" +#: src/app/main/ui/settings/delete_account.cljs +msgid "notifications.profile-deletion-not-allowed" +msgstr "I nweghị ike ị hichapụ nchịkọta gị . Nyegharịa ya ndị otu gị tupu ị ganihu" + +#: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs +msgid "notifications.profile-saved" +msgstr "E dọkwara nchịkọta nke ọma" + +#: src/app/main/ui/settings/change_email.cljs +msgid "notifications.validation-email-sent" +msgstr "Ozi nnyocha n zigara na%s. Mepe ozi n gị !" + +msgid "onboarding-v2.before-start.desc1" +msgstr "" +"I kwesịrị ịma na e nwere ọtụtụ ihe e ji arụ ọrụ dị inwere gị iji bido n'ite " +"mkpịsị , dị ka ntuziaka onye ọrụ na ọwa YouTube anyị l." + +msgid "onboarding-v2.before-start.desc2" +msgstr "" +"Ozi banyere etu esi eji ite mkpịsị arụ ọrụ uju. Site na ime atụtụ ga na " +"nhazi ma ọ bụ nkesa esereese ." + msgid "onboarding-v2.before-start.desc2.title" msgstr "Mkpanaka" @@ -1830,17 +1791,22 @@ msgstr "Ị nwere ike ikiri amụmamụ anyị na amụmamụ nke ndị obodo an msgid "onboarding-v2.before-start.desc3.title" msgstr "Amụmamụ onyonyo" +msgid "onboarding-v2.before-start.title" +msgstr "Tupu i bido" + msgid "onboarding-v2.newsletter.desc" msgstr "" "Debanye aha n'akụkụ ozi ite mkpịsị iji nọrọ gam gam na ngwa ahịa aaga n'ihu " "mwulite na akụkọ ụwa." +msgid "onboarding-v2.newsletter.news" +msgstr "" +"Zitere m akụkọ banyere ite mkpịsị (ozi edemonye gasị, Nkụzi ihe onyonyo, " +"nkirigarị...)." + msgid "onboarding-v2.newsletter.privacy1" msgstr "Anyị na-eche banyere nzochi onwe, ebe a inwere ike ịgụ..... anyị " -msgid "onboarding.team-modal.create-team-feature-5" -msgstr "% narị efu!" - msgid "onboarding-v2.newsletter.privacy2" msgstr "" "Anyị ga e zitere ozi n bara uru sọọsọ . Ị nwere ike idepu aha oge ọ bụla " @@ -1848,13 +1814,14 @@ msgstr "" msgid "onboarding-v2.newsletter.updates" msgstr "" -"Zitere m nhazigharị ngwa ahịa (a gwara ọhụrụ gasị , ihe ndị ewepụta gasịrị , " -"ndo ị gasị..)." +"Zitere m nhazigharị ngwa ahịa (a gwara ọhụrụ gasị , ihe ndị ewepụta gasịrị " +", ndo ị gasị..)." msgid "onboarding-v2.welcome.desc1" msgstr "" -"Ite mkpịsị bụ nsina ghere oghe ma bụrụ nke Kaleidos nakwa ndị obodo rụrụ Ebe " -"ọtụtụ mmadụ nyewegoroa onwe anyị aka..Onye ọ bụla nwere arụkọrịtasite na :" +"Ite mkpịsị bụ nsina ghere oghe ma bụrụ nke Kaleidos nakwa ndị obodo rụrụ " +"Ebe ọtụtụ mmadụ nyewegoroa onwe anyị aka..Onye ọ bụla nwere arụkọrịtasite " +"na :" msgid "onboarding-v2.welcome.desc2" msgstr "" @@ -1873,6 +1840,9 @@ msgstr "I nye ha otu gị aha , I nwere ike ị kpọta ndị mmadụ ka ha sony msgid "onboarding.choice.team-up.create-team-placeholder" msgstr "Denye aha otu" +msgid "onboarding.choice.team-up.invite-members" +msgstr "Kpọta ndị otu" + msgid "onboarding.choice.team-up.invite-members-info" msgstr "" "Cheta ka itinye onye ọ bụla Ndị nzụlite, ndị nrụpụta, ndị njikwa... dị iche " @@ -1885,8 +1855,7 @@ msgid "onboarding.newsletter.accept" msgstr "Eee, debanye aha" msgid "onboarding.newsletter.acceptance-message" -msgstr "" -"E zigala arịrịọ ndenye aha gị , anyị ga-ezi tara gị ozi - n iji nabata ya" +msgstr "E zigala arịrịọ ndenye aha gị , anyị ga-ezi tara gị ozi - n iji nabata ya" msgid "onboarding.newsletter.title" msgstr "Chọrọ inweta ozi ite mkpịsị ?" @@ -1911,6 +1880,9 @@ msgstr "Njikwa ọrụ" msgid "onboarding.team-modal.create-team-feature-4" msgstr "Ndị otu enweghị njedebe" +msgid "onboarding.team-modal.create-team-feature-5" +msgstr "% narị efu!" + msgid "onboarding.templates.subtitle" msgstr "Ụfọdụ ndebiri nọ ebe a." @@ -1921,6 +1893,18 @@ msgstr "Bido osise" msgid "profile.recovery.go-to-login" msgstr "Gaa na mbanye" +#: src/app/main/ui/onboarding/questions.cljs +msgid "question.design-tool-more-experienced-with" +msgstr "Kedu ngwa ọrụ nse ị ka mara eji arụ ọrụ ?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.11-30" +msgstr "Iri na otu ruo na iri atọ" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "Abụọ ruo na iri" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.31-50" msgstr "Iri atọ na otu ruo na iri ise" @@ -1937,6 +1921,10 @@ msgstr "Ngwa nrụkọrịta ọrụ Adobe" msgid "questions.canva" msgstr "Kanva" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "Kedụ ka Ị ga-esi kọwaa ọfụma ihe ndị ị hụrụ ịrụ ọrụ na..." + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.developer" msgstr "Onye nrụpụta" @@ -2060,8 +2048,8 @@ msgstr "Na-arụ ọrụ n'echiche ihe" #: src/app/main/ui/onboarding/questions.cljs msgid "questions.your-feedback-will-help-us" msgstr "" -"Nzaghachi gị ga-enyere anyị aka ịghọta ihe agwa na mmasị gị bụ Ka anyị ga na-" -"eme Ite mkpịsị ụdị ngwa ọrụ bara uru dị ụtọ ." +"Nzaghachi gị ga-enyere anyị aka ịghọta ihe agwa na mmasị gị bụ Ka anyị ga " +"na-eme Ite mkpịsị ụdị ngwa ọrụ bara uru dị ụtọ ." msgid "shortcuts.bring-backward" msgstr "Wega ebe azụ" @@ -2072,6 +2060,9 @@ msgstr "Mkpị" msgid "shortcuts.letter-spacing-inc" msgstr "Leta mmụba oghere" +msgid "shortcuts.paste" +msgstr "Nyado" + msgid "shortcuts.text-align-left" msgstr "Dozie akaekpe" @@ -2091,6 +2082,10 @@ msgstr "Gbanye nlekwasa anya" msgid "workspace.shape.menu.create-multiple-components" msgstr "Mee ọtụtụ akọrọngwa ga" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.color-palette" +msgstr "Agba[ Palette (Na narị)" + #: src/app/main/data/workspace/libraries.cljs msgid "workspace.updates.there-are-updates" msgstr "E nwegasịrị nhazizigharị nime ọba ederede ga e kere eke" diff --git a/frontend/translations/lv.po b/frontend/translations/lv.po index 133140de6..cb09b0747 100644 --- a/frontend/translations/lv.po +++ b/frontend/translations/lv.po @@ -2,14 +2,14 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-25 13:07+0000\n" "Last-Translator: Edgars Andersons \n" -"Language-Team: Latvian \n" +"Language-Team: Latvian " +"\n" "Language: lv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= " -"19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 " +"<= 19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" "X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs @@ -65,6 +65,10 @@ msgstr "Pieteikties šeit" msgid "auth.login-submit" msgstr "Pieteikties" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-tagline" +msgstr "Penpot ir bezmaksas atvērtā pirmkoda dizaina rīks dizaina un koda sadarbībai" + #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -3102,6 +3106,15 @@ msgstr "Slēgt / Atslēgt" msgid "shortcuts.toggle-lock-size" msgstr "Slēgt proporcijas" +msgid "shortcuts.toggle-rulers" +msgstr "Rādīt/paslēpt mērjoslas" + +msgid "shortcuts.toggle-snap-guides" +msgstr "Pievilkt pie vadlīnijām" + +msgid "shortcuts.toggle-snap-ruler-guide" +msgstr "Pievilkt pie mērjoslu vadlīnijām" + msgid "shortcuts.toggle-textpalette" msgstr "Pārslēgt teksta paleti" @@ -5159,10 +5172,6 @@ msgstr "Teksts (%s)" msgid "workspace.toolbar.text-palette" msgstr "Burtu stili un veidi (%s)" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Apskatīšana** (tikai skatīt)" - msgid "workspace.top-bar.read-only.done" msgstr "Darīts" @@ -5303,385 +5312,3 @@ msgstr "Atjaunināt" msgid "workspace.viewport.click-to-close-path" msgstr "Jānoklikšķina, lai aizvērtu ceļu" - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Noteikta nesaderīga iespēja '%s'" - -msgid "errors.paste-data-validation" -msgstr "Starpliktuvē ir nederīgi dati" - -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Turpināt komandas izveidošanu" - -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Uzsākt bez komandas" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Komandu būs iespējams izveidot vēlāk." - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Turpināt bez komandas" - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Izveidot komandu un nosūtīt uzaicinājumus" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Izveidot komandu un uzaicināt" - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Izveidot komandu" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Uzaicināt būs iespējams vēlāk" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "Izstrādātājs" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Iziet" - -msgid "media.image" -msgstr "Attēls" - -msgid "media.solid" -msgstr "Viengabalains" - -msgid "media.linear" -msgstr "Līnijveida" - -msgid "media.radial" -msgstr "Radiāls" - -msgid "media.gradient" -msgstr "Pāreja" - -msgid "media.choose-image" -msgstr "Izvēlēties attēlu" - -msgid "workspace.options.guides.title" -msgstr "Vadotnes" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Datnei ir nesaderīgs versijas numurs" - -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Izskatās, ka ir nesaderība starp iespējotajām iespējām un iespējām datnē, " -"kuru tiek mēģināts atvērt. Jāpiemēro '%s' migrācijas, pirms datne var tikt " -"atvērta." - -msgid "errors.validation" -msgstr "Pārbaudes kļūda" - -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Atiestatīt" - -msgid "labels.share" -msgstr "Kopīgot" - -msgid "labels.search" -msgstr "Meklēt" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Ar jauna konta izveidošanu tiek piekrists mūsu [pakalpojuma noteikumiem](%s) " -"un [privātuma nosacījumiem](%s)." - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Izveidot komandu bez uzaicināšanas" - -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Labot režģi" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Noteikt atrašanās vietu" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Darīts" - -msgid "workspace.options.component.swap" -msgstr "Mijmainīt sastāvdaļu" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Plūsma" - -msgid "workspace.top-bar.read-only.done" -msgstr "Darīts" - -msgid "workspace.options.component.swap.empty" -msgstr "Šajā bibliotēkā vēl nav līdzekļu" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Bulta" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Trijstūris" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Taisnstūris" - -msgid "workspace.assets.duplicate-main" -msgstr "Divkāršot galveno" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "Modelētājs" - -msgid "dashboard.import.import-message" -msgid_plural "dashboard.import.import-message" -msgstr[0] "%s datņu tika veiksmīgi ievietotas." -msgstr[1] "%s datne tika veiksmīgi ievietota." -msgstr[2] "%s datnes tika veiksmīgi ievietotas." - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Bibliotēka ir tukša. Tiklīdz tā būs pievienota kā koplietojama bibliotēka, " -"izveidotie līdzekļi būs pieejami izmantošanai pārējos failos. Vai tiešām " -"padarīt to pieejamu?" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Atdalīt" - -msgid "workspace.options.component.copy" -msgstr "Ievietot starpliktuvē" - -msgid "workspace.options.component.main" -msgstr "Galvenais" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Aplis" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Dimants" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "" -"Līdzekļi, kas jau tiek izmantoti šajā datnē, paliks tajā (dizains netiks " -"salauzts)." -msgstr[1] "" -"Līdzeklis, kas jau tiek izmantots šajā datnē, paliks tajā (dizains netiks " -"salauzts)." -msgstr[2] "" -"Līdzekļi, kas jau tiek izmantoti šajā datnē, paliks tajā (dizains netiks " -"salauzts)." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Tirgvedība" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Dibinātājs/viceprezidents" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "Produktu vai projektu vadītājs" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "Kāda ir ieņemamā loma?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "Students vai pasniedzējs" - -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "Ir pieejama jauna versija, lūgums atsvaidzināt lapu" - -msgid "workspace.layout_grid.editor.title" -msgstr "Režģa labošana" - -msgid "shortcuts.toggle-theme" -msgstr "Mainīt izskatu" - -msgid "workspace.header.menu.toggle-light-theme" -msgstr "Pārslēgties uz gaišo izskatu" - -msgid "workspace.header.menu.toggle-dark-theme" -msgstr "Pārslēgties uz tumšo izskatu" - -msgid "workspace.context-menu.grid-track.column.duplicate" -msgstr "Divkāršota sleja" - -msgid "workspace.context-menu.grid-track.column.delete" -msgstr "Izdzēst sleju" - -msgid "workspace.context-menu.grid-track.column.delete-shapes" -msgstr "Izdzēst slejas un apveidus" - -msgid "workspace.context-menu.grid-track.row.duplicate" -msgstr "Divkāršot rindu" - -msgid "workspace.context-menu.grid-track.row.add-before" -msgstr "Pievienot 1 rindu virs" - -msgid "workspace.context-menu.grid-track.column.add-after" -msgstr "Pievienot 1 sleju pa labi" - -msgid "workspace.context-menu.grid-track.column.add-before" -msgstr "Pievienot 1 sleju pa kreisi" - -msgid "workspace.context-menu.grid-track.row.add-after" -msgstr "Pievienot 1 rindu zem" - -msgid "workspace.context-menu.grid-track.row.delete" -msgstr "Izdzēst rindu" - -msgid "workspace.context-menu.grid-track.row.delete-shapes" -msgstr "Izdzēst rindu un apveidus" - -msgid "workspace.context-menu.grid-cells.merge" -msgstr "Apvienot šūnas" - -msgid "workspace.context-menu.grid-cells.area" -msgstr "Izveidot laukumu" - -msgid "workspace.context-menu.grid-cells.create-board" -msgstr "Izveidot plātni" - -msgid "dashboard.import.analyze-error.components-v2" -msgstr "" -"Datne ar v2 sastāvdaļām ir aktivizēta, bet šī komanda to vēl neatbalsta." - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.loading" -msgstr "Ielādē…" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-account-title" -msgstr "Pieteikties manā kontā" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-tagline" -msgstr "" -"Penpot ir bezmaksas atvērtā pirmkoda dizaina rīks dizaina un koda sadarbībai" - -#: src/app/main/data/users.cljs -msgid "errors.auth-provider-not-allowed" -msgstr "Autentifikācijas nodrošinātājs nav atļauts šim profilam" - -msgid "shortcuts.toggle-rulers" -msgstr "Rādīt/paslēpt mērjoslas" - -msgid "shortcuts.toggle-snap-guides" -msgstr "Pievilkt pie vadlīnijām" - -msgid "shortcuts.toggle-guides" -msgstr "Rādīt/paslēpt vadlīnijas" - -msgid "shortcuts.toggle-snap-ruler-guide" -msgstr "Pievilkt pie mērjoslu vadlīnijām" - -msgid "shortcuts.toggle-layout-grid" -msgstr "Pievienot/noņemt režģa izkārtojumu" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-ruler-guides" -msgstr "Atspējot pievilkšanu mērjoslu vadlīnijām" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-ruler-guides" -msgstr "Pievilkt pie mērjoslu vadlīnijām" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-guides" -msgstr "Parādīt vadlīnijas" - -msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" -msgstr "Norādīt režģa izkārtojumu" - -msgid "workspace.layout_grid.editor.padding.expand" -msgstr "Rādīt četrpusējas atbīdes iespējas" - -#, markdown -msgid "workspace.top-bar.view-only" -msgstr "**Apskata kodu** (tikai skatīšana)" - -#: src/app/main/data/users.cljs -msgid "errors.email-domain-not-allowed" -msgstr "Domēns nav atļauts" - -msgid "modals.move-shared-confirm.accept" -msgid_plural "modals.move-shared-confirm.accept" -msgstr[0] "Pārvietot" -msgstr[1] "Pārvietot" -msgstr[2] "Pārvietot" - -msgid "modals.move-shared-confirm.message" -msgid_plural "modals.move-shared-confirm.message" -msgstr[0] "Vai tiešām pārvietot šīs bibliotēkas?" -msgstr[1] "Vai tiešām pārvietot šīs bibliotēkas?" -msgstr[2] "Vai tiešām pārvietot šīs bibliotēkas?" - -msgid "modals.move-shared-confirm.title" -msgid_plural "modals.move-shared-confirm.title" -msgstr[0] "Pārvietot bibliotēkas" -msgstr[1] "Pārvietot bibliotēkas" -msgstr[2] "Pārvietot bibliotēkas" - -msgid "onboarding.team-modal.team-definition" -msgstr "Kas ir komanda?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.never-used-one" -msgstr "Neviens" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs -msgid "settings.select-this-color" -msgstr "Atlasīt vienumus, kas izmanto šo stilu" - -msgid "shortcuts.scale" -msgstr "Mērogot" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.filter" -msgstr "Atlasīt" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.sort" -msgstr "Kārtot" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-guides" -msgstr "Paslēpt vadlīnijas" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.shared-library-btn" -msgstr "Savienot bibliotēku" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.unlink-library-btn" -msgstr "Atvienot bibliotēku" - -#: src/app/main/ui/workspace/sidebar/assets/common.cljs -msgid "workspace.assets.sidebar.components" -msgid_plural "workspace.assets.sidebar.components" -msgstr[0] "%s sastāvdaļu" -msgstr[1] "%s sastāvdaļa" -msgstr[2] "%s sastāvdaļas" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.remove-grid" -msgstr "Noņemt režģa izkārtojumu" - -msgid "media.image.short" -msgstr "att." - -msgid "media.keep-aspect-ratio" -msgstr "Paturēt samēru" diff --git a/frontend/translations/ms.po b/frontend/translations/ms.po index 0cd908439..060bdec12 100644 --- a/frontend/translations/ms.po +++ b/frontend/translations/ms.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 12:55+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Malay \n" +"Language-Team: Malay " +"\n" "Language: ms\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -399,9 +399,194 @@ msgstr "Eksport papan sebagai PDF" msgid "dashboard.export-frames.title" msgstr "Eksport sebagai PDF" +msgid "dashboard.export-multi" +msgstr "Eksport fail Penpot %s" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-multiple.selected" +msgstr "%s daripada %s elemen dipilih" + +#: src/app/main/ui/workspace/header.cljs +msgid "dashboard.export-shapes" +msgstr "Eksport" + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to" +msgstr "" +"Anda boleh menambah tetapan eksport ke elemen daripada sifat reka bentuk " +"(di bahagian bawah bar sisi kanan)." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.how-to-link" +msgstr "Maklumat cara untuk menetapkan eksport di Penpot." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.no-elements" +msgstr "Tiada unsur dengan tetapan eksport." + +#: src/app/main/ui/export.cljs +msgid "dashboard.export-shapes.title" +msgstr "Eksport Pemilihan" + +msgid "dashboard.export-standard-multi" +msgstr "Muat turun %s fail standard (.svg + .json)" + +msgid "dashboard.export.detail" +msgstr "* Mungkin termasuk komponen, grafik, warna dan/atau tipografi." + +msgid "dashboard.export.explain" +msgstr "" +"Satu atau lebih fail yang anda ingin eksport menggunakan perpustakaan " +"kongsi. Apa yang anda mahu lakukan dengan aset mereka*?" + +msgid "dashboard.export.options.all.message" +msgstr "" +"fail dengan perpustakaan kongsi akan disertakan dalam eksport, mengekalkan " +"hubungannya." + +msgid "dashboard.export.options.all.title" +msgstr "Eksport perpustakaan kongsi" + +msgid "dashboard.export.options.detach.message" +msgstr "" +"Perpustakaan kongsi tidak akan disertakan dalam eksport dan tiada aset akan " +"ditambahkan ke perpustakaan. " + +msgid "dashboard.export.options.detach.title" +msgstr "Anggap aset perpustakaan kongsi sebagai objek asas" + +msgid "dashboard.export.options.merge.message" +msgstr "" +"Fail anda akan dieksport dengan semua aset luaran digabungkan ke dalam " +"pustaka fail." + +msgid "dashboard.export.options.merge.title" +msgstr "Sertakan aset perpustakaan kongsi dalam pustaka fail" + +msgid "dashboard.export.title" +msgstr "Eksport fail" + +msgid "dashboard.fonts.deleted-placeholder" +msgstr "Fon hilang" + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.dismiss-all" +msgstr "Tolak semua" + +msgid "dashboard.fonts.empty-placeholder" +msgstr "Fon tersuai yang anda muat naik akan dipaparkan di sini." + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.fonts-added" +msgid_plural "dashboard.fonts.fonts-added" +msgstr[0] "%s fon ditambah" + +#, markdown +msgid "dashboard.fonts.hero-text1" +msgstr "" +"Sebarang fon web yang anda muat naik di sini akan ditambahkan pada senarai " +"keluarga fon yang tersedia pada sifat teks fail pasukan ini. Fon dengan " +"nama keluarga fon yang sama akan dikumpulkan sebagai **keluarga fon " +"tunggal**. Anda boleh memuat naik fon dengan format berikut: **TTF, OTF dan " +"WOFF** (hanya satu sahaja diperlukan)." + +#, markdown +msgid "dashboard.fonts.hero-text2" +msgstr "" +"Anda hanya perlu memuat naik fon yang anda miliki atau mempunyai lesen " +"untuk digunakan dalam Penpot. Ketahui lebih lanjut dalam bahagian Hak " +"kandungan [Syarat Perkhidmatan Penpot](https://penpot.app/terms.html). Anda " +"juga mungkin ingin membaca tentang [pelesenan " +"fon](https://www.typography.com/faq)." + +#: src/app/main/ui/dashboard/fonts.cljs +msgid "dashboard.fonts.upload-all" +msgstr "Muat naik semua" + +#, markdown +msgid "dashboard.fonts.warning-text" +msgstr "" +"Kami telah mengesan kemungkinan masalah dalam fon anda yang berkaitan " +"dengan metrik menegak untuk sistem pengendalian yang berbeza. Untuk " +"menyemaknya, anda boleh menggunakan perkhidmatan metrik menegak fon seperti " +"[ini](https://vertical-metrics.netlify.app/). Selain itu, kami mengesyorkan " +"menggunakan [Transfonter](https://transfonter.org/) untuk menjana fon web " +"dan membetulkan ralat. " + +msgid "dashboard.import" +msgstr "Import fail Penpot" + +msgid "dashboard.import.analyze-error" +msgstr "Alamak! Kami tidak dapat mengimport fail ini" + +msgid "dashboard.import.analyze-error.components-v2" +msgstr "" +"Fail dengan komponen v2 diaktifkan tetapi pasukan ini belum menyokongnya " +"lagi." + +msgid "dashboard.import.import-error" +msgstr "Terdapat masalah mengimport fail. Fail tidak diimport." + +msgid "dashboard.import.import-message" +msgid_plural "dashboard.import.import-message" +msgstr[0] "%s fail telah berjaya diimport." + +msgid "dashboard.import.import-warning" +msgstr "Sesetengah fail mengandungi objek tidak sah telah dialih keluar." + +msgid "dashboard.import.progress.process-colors" +msgstr "memproses warna" + +msgid "dashboard.import.progress.process-components" +msgstr "Memproses komponen" + +msgid "dashboard.import.progress.process-media" +msgstr "Memproses media" + +msgid "dashboard.import.progress.process-page" +msgstr "Memproses halaman: %s" + +msgid "dashboard.import.progress.process-typographies" +msgstr "Memproses tipografi" + +msgid "dashboard.import.progress.upload-data" +msgstr "Memuat naik data ke pelayan (%s/%s)" + +msgid "dashboard.import.progress.upload-media" +msgstr "Memuat naik fail: %s" + +#: src/app/main/ui/dashboard/team.cljs +msgid "dashboard.invite-profile" +msgstr "Jemput orang ramai" + +#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.leave-team" +msgstr "Tinggalkan pasukan" + +msgid "dashboard.libraries-and-templates" +msgstr "Perpustakaan & Templat" + +msgid "dashboard.libraries-and-templates.explore" +msgstr "Terokai lebih banyak daripada mereka dan ketahui cara untuk menyumbang" + +msgid "dashboard.libraries-and-templates.import-error" +msgstr "Terdapat masalah mengimport templat. Templat tidak diimport." + +#: src/app/main/ui/dashboard/libraries.cljs +msgid "dashboard.libraries-title" +msgstr "Perpustakaan" + +#: src/app/main/ui/dashboard/grid.cljs +msgid "dashboard.loading-files" +msgstr "memuatkan fail anda…" + msgid "dashboard.loading-fonts" msgstr "memuatkan fon anda…" +#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.move-to" +msgstr "Berpindah ke" + #: src/app/main/ui/dashboard/file_menu.cljs msgid "dashboard.move-to-multi" msgstr "Pindahkan fail %s ke" @@ -430,6 +615,18 @@ msgstr "Projek Baharu" msgid "dashboard.no-matches-for" msgstr "Tiada padanan ditemui untuk \"%s\"" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.no-projects-placeholder" +msgstr "Projek yang disemat akan muncul di sini" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-changed-successfully" +msgstr "Alamat e-mel anda telah berjaya dikemas kini" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "dashboard.notifications.email-verified-successfully" +msgstr "Alamat e-mel anda telah berjaya disahkan" + #: src/app/main/ui/settings/password.cljs msgid "dashboard.notifications.password-saved" msgstr "Kata laluan berjaya disimpan!" @@ -449,6 +646,38 @@ msgstr "Pilihan" msgid "dashboard.password-change" msgstr "Tukar kata laluan" +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.pin-unpin" +msgstr "Semat/Nyahsemat" + +#: src/app/main/ui/dashboard/projects.cljs +msgid "dashboard.projects-title" +msgstr "Projek" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.remove-account" +msgstr "Mahu mengalih keluar akaun anda?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.remove-shared" +msgstr "Alih keluar sebagai Pustaka Dikongsi" + +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.save-settings" +msgstr "Simpan tetapan" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "dashboard.search-placeholder" +msgstr "Cari…" + +#: src/app/main/ui/dashboard/search.cljs +msgid "dashboard.searching-for" +msgstr "Mencari \"%s\"…" + +#: src/app/main/ui/settings/options.cljs +msgid "dashboard.select-ui-language" +msgstr "Pilih Bahasa UI" + #: src/app/main/ui/settings/options.cljs msgid "dashboard.select-ui-theme" msgstr "Pilih tema" @@ -540,33 +769,88 @@ msgstr "" "dimaklumkan apabila acara tertentu berlaku di Penpot. Kami akan menghantar " "permintaan POST ke setiap URL yang anda berikan." +msgid "dashboard.webhooks.empty.add-one" +msgstr "Tekan butang \"Tambah webhook\" untuk menambahnya." + +msgid "dashboard.webhooks.empty.no-webhooks" +msgstr "Tiada webhook dibuat setakat ini." + +msgid "dashboard.webhooks.update.success" +msgstr "Webhook berjaya dikemas kini." + #: src/app/main/ui/settings.cljs msgid "dashboard.your-account-title" msgstr "Akaun anda" -msgid "errors.bad-font" -msgstr "Fon %s tidak dapat dimuatkan" +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-email" +msgstr "E-mel" -msgid "errors.cannot-upload" -msgstr "Tidak boleh memuat naik fail media." +#: src/app/main/ui/settings/profile.cljs +msgid "dashboard.your-name" +msgstr "Nama anda" -#: src/app/main/data/workspace.cljs -msgid "errors.clipboard-not-implemented" -msgstr "Pelayar anda tidak dapat melakukan operasi ini" +#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.your-penpot" +msgstr "Penpot anda" -#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs -msgid "errors.email-already-exists" -msgstr "E-mel sudah digunakan" +#: src/app/main/ui/alert.cljs +msgid "ds.alert-ok" +msgstr "Ok" -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.email-already-validated" -msgstr "E-mel sudah disahkan." +#: src/app/main/ui/alert.cljs +msgid "ds.alert-title" +msgstr "Perhatian" -msgid "errors.email-as-password" -msgstr "Anda tidak boleh menggunakan e-mel sebagai kata laluan" +#: src/app/main/ui/confirm.cljs +msgid "ds.component-subtitle" +msgstr "Komponen untuk dikemas kini:" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs -msgid "errors.email-has-permanent-bounces" +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-cancel" +msgstr "Batal" + +#: src/app/main/ui/confirm.cljs +msgid "ds.confirm-ok" +msgstr "Ok" + +#: src/app/main/ui/confirm.cljs, src/app/main/ui/confirm.cljs +msgid "ds.confirm-title" +msgstr "Adakah anda pasti?" + +#: src/app/main/ui/auth/login.cljs +msgid "errors.auth-provider-not-configured" +msgstr "Pembekal pengesahan tidak dikonfigurasikan." + +msgid "errors.auth.unable-to-login" +msgstr "Nampaknya anda belum disahkan atau sesi telah tamat tempoh." + +msgid "errors.bad-font" +msgstr "Fon %s tidak dapat dimuatkan" + +msgid "errors.bad-font-plural" +msgstr "Fon %s tidak dapat dimuatkan" + +msgid "errors.cannot-upload" +msgstr "Tidak boleh memuat naik fail media." + +#: src/app/main/data/workspace.cljs +msgid "errors.clipboard-not-implemented" +msgstr "Pelayar anda tidak dapat melakukan operasi ini" + +#: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/change_email.cljs +msgid "errors.email-already-exists" +msgstr "E-mel sudah digunakan" + +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.email-already-validated" +msgstr "E-mel sudah disahkan." + +msgid "errors.email-as-password" +msgstr "Anda tidak boleh menggunakan e-mel sebagai kata laluan" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs +msgid "errors.email-has-permanent-bounces" msgstr "E-mel «%s» mempunyai banyak laporan lantunan kekal." #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs @@ -587,8 +871,8 @@ msgstr "" "penpot semasa tidak menyokongnya atau menyahdayakannya." #: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Fail mempunyai nombor versi yang tidak serasi" +msgid "errors.feature-not-supported" +msgstr "Ciri '%s' tidak disokong." #: src/app/main/errors.cljs msgid "errors.file-feature-mismatch" @@ -597,14 +881,6 @@ msgstr "" "yang anda cuba buka. Migrasi untuk '%s' perlu digunakan sebelum fail boleh " "dibuka." -#: src/app/main/errors.cljs -msgid "errors.feature-not-supported" -msgstr "Ciri '%s' tidak disokong." - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Ciri tidak serasi '%s' dikesan" - #: src/app/main/ui/auth/verify_token.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.generic" msgstr "Sesuatu yang tidak kena telah berlaku." @@ -654,6 +930,9 @@ msgstr "Kata laluan pengesahan mesti sepadan" msgid "errors.password-too-short" msgstr "Kata laluan hendaklah sekurang-kurangnya 8 aksara" +msgid "errors.paste-data-validation" +msgstr "Data tidak sah dalam papan klip" + msgid "errors.profile-blocked" msgstr "Profil disekat" @@ -667,6 +946,10 @@ msgstr "" msgid "errors.registration-disabled" msgstr "Pendaftaran dilumpuhkan pada masa ini." +#: src/app/main/errors.cljs +msgid "errors.team-feature-mismatch" +msgstr "Ciri tidak serasi '%s' dikesan" + msgid "errors.team-leave.insufficient-members" msgstr "" "Ahli tidak mencukupi untuk meninggalkan pasukan, anda mungkin mahu " @@ -684,6 +967,17 @@ msgstr "" msgid "errors.unexpected-error" msgstr "Ralat yang tidak dijangka berlaku." +#: src/app/main/ui/auth/verify_token.cljs +msgid "errors.unexpected-token" +msgstr "Token tidak diketahui" + +msgid "errors.validation" +msgstr "Ralat Pengesahan" + +#: src/app/main/errors.cljs +msgid "errors.version-not-supported" +msgstr "Fail mempunyai nombor versi yang tidak serasi" + msgid "errors.webhooks.connection" msgstr "Ralat sambungan, URL tidak dapat dicapai" @@ -697,6 +991,9 @@ msgstr "Penghantaran terakhir tidak berjaya." msgid "errors.webhooks.ssl-validation" msgstr "Ralat pada pengesahan SSL." +msgid "errors.webhooks.timeout" +msgstr "Masa tamat" + msgid "errors.webhooks.unexpected" msgstr "Ralat yang tidak dijangka semasa mengesahkan" @@ -711,12 +1008,6 @@ msgstr "E-mel atau kata laluan tidak betul." msgid "errors.wrong-old-password" msgstr "Kata laluan lama tidak betul" -msgid "errors.validation" -msgstr "Ralat Pengesahan" - -msgid "errors.paste-data-validation" -msgstr "Data tidak sah dalam papan klip" - #: src/app/main/ui/settings/feedback.cljs msgid "feedback.description" msgstr "Penerangan" @@ -731,6 +1022,20 @@ msgstr "" "Kami berbesar hati anda berada disini. Jika anda memerlukan bantuan, sila " "cari sebelum anda menyiarkan siaran baharu." +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.discourse-title" +msgstr "Komuniti Penpot" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subject" +msgstr "Subjek" + +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.subtitle" +msgstr "" +"Sila terangkan sebab e-mel anda, nyatakan sama ada isu, idea atau keraguan. " +"Seorang ahli pasukan kami akan menjawab secepat mungkin." + #: src/app/main/ui/settings/feedback.cljs msgid "feedback.title" msgstr "E-mel" @@ -781,6 +1086,10 @@ msgstr "Isi" msgid "inspect.attributes.image.download" msgstr "Muat turun sumber gambar" +#: src/app/main/ui/inspect/attributes/image.cljs +msgid "inspect.attributes.image.height" +msgstr "Tinggi" + #: src/app/main/ui/inspect/attributes/image.cljs msgid "inspect.attributes.image.width" msgstr "Lebar" @@ -793,10 +1102,6 @@ msgstr "Susun atur" msgid "inspect.attributes.layout.height" msgstr "Tinggi" -#: src/app/main/ui/inspect/attributes/image.cljs -msgid "inspect.attributes.image.height" -msgstr "Tinggi" - #: src/app/main/ui/inspect/attributes/layout.cljs msgid "inspect.attributes.layout.left" msgstr "kiri" @@ -809,6 +1114,18 @@ msgstr "Jejari" msgid "inspect.attributes.layout.rotation" msgstr "Putaran" +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.top" +msgstr "Atas" + +#: src/app/main/ui/inspect/attributes/layout.cljs +msgid "inspect.attributes.layout.width" +msgstr "Lebar" + +#: src/app/main/ui/inspect/attributes/shadow.cljs +msgid "inspect.attributes.shadow" +msgstr "Bayang" + #: src/app/main/ui/inspect/attributes/layout.cljs msgid "inspect.attributes.size" msgstr "Ukuran dan kedudukan" @@ -862,6 +1179,10 @@ msgstr "Saiz huruf" msgid "inspect.attributes.typography.font-style" msgstr "Gaya Huruf" +#: src/app/main/ui/inspect/attributes/text.cljs +msgid "inspect.attributes.typography.font-weight" +msgstr "Berat Huruf" + #: src/app/main/ui/inspect/attributes/text.cljs msgid "inspect.attributes.typography.letter-spacing" msgstr "Jarak Huruf" @@ -880,6 +1201,9 @@ msgstr "Tiada" msgid "inspect.attributes.typography.text-decoration.strikethrough" msgstr "Tembus" +msgid "inspect.attributes.typography.text-decoration.underline" +msgstr "Garis bawah" + #: src/app/main/ui/inspect/attributes/text.cljs #, fuzzy msgid "inspect.attributes.typography.text-transform" @@ -891,12 +1215,12 @@ msgstr "Huruf Kecil" msgid "inspect.attributes.typography.text-transform.none" msgstr "Tiada" -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Nyahset" - msgid "inspect.attributes.typography.text-transform.titlecase" msgstr "Huruf Tajuk" +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Nyahset" + msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Huruf Besar" @@ -947,6 +1271,9 @@ msgstr "Laluan" msgid "inspect.tabs.code.selected.rect" msgstr "Segi empat tepat" +msgid "inspect.tabs.code.selected.svg-raw" +msgstr "SVG" + msgid "inspect.tabs.code.selected.text" msgstr "Teks" @@ -965,6 +1292,9 @@ msgstr "Terima" msgid "labels.access-tokens" msgstr "Token capaian" +msgid "labels.active" +msgstr "Aktif" + msgid "labels.add-custom-font" msgstr "Tambah fon tersuai" @@ -972,6 +1302,10 @@ msgstr "Tambah fon tersuai" msgid "labels.admin" msgstr "Pentadbir" +#: src/app/main/ui/workspace/comments.cljs +msgid "labels.all" +msgstr "Semua" + msgid "labels.and" msgstr "dan" @@ -1013,10 +1347,21 @@ msgstr "Teruskan" msgid "labels.continue-with" msgstr "Teruskan dengan" +msgid "labels.continue-with-penpot" +msgstr "Anda boleh meneruskan dengan akaun Penpot" + #: src/app/main/ui/dashboard/team.cljs msgid "labels.copy-invitation-link" msgstr "Salin pautan" +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "labels.create" +msgstr "Cipta" + +#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs +msgid "labels.create-team" +msgstr "Cipta pasukan baharu" + #: src/app/main/ui/dashboard/team_form.cljs msgid "labels.create-team.placeholder" msgstr "Masukkan nama pasukan baharu" @@ -1070,6 +1415,9 @@ msgstr "Penyunting" msgid "labels.expired-invitation" msgstr "Tamat tempoh" +msgid "labels.export" +msgstr "Eksport" + #: src/app/main/ui/settings/feedback.cljs msgid "labels.feedback-disabled" msgstr "Maklum balas dilumpuhkan" @@ -1101,6 +1449,10 @@ msgstr "Beri maklum balas" msgid "labels.go-back" msgstr "Pergi balik" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.help-center" +msgstr "Pusat Bantuan" + #: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs msgid "labels.hide-resolved-comments" msgstr "Sembunyikan komen yang diselesaikan" @@ -1111,6 +1463,12 @@ msgstr "tidak aktif" msgid "labels.installed-fonts" msgstr "Fon yang dipasang" +#: src/app/main/ui/static.cljs +msgid "labels.internal-error.desc-message" +msgstr "" +"Sesuatu yang buruk telah berlaku. Sila cuba semula operasi dan jika masalah " +"berterusan, hubungi sokongan." + #: src/app/main/ui/static.cljs msgid "labels.internal-error.main-message" msgstr "Ralat Dalaman" @@ -1146,14 +1504,26 @@ msgstr "Ahli" msgid "labels.new-password" msgstr "Kata laluan baharu" +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs +msgid "labels.no-comments-available" +msgstr "" +"Anda telah melihat semua yang baru! Pemberitahuan ulasan baharu akan " +"dipaparkan di sini." + #: src/app/main/ui/dashboard/team.cljs msgid "labels.no-invitations" msgstr "Tiada jemputan tertunda." +#: src/app/main/ui/dashboard/team.cljs +#, markdown +msgid "labels.no-invitations-hint" +msgstr "Klik butang **Jemput orang** untuk menjemput orang ke pasukan ini." + #: src/app/main/ui/static.cljs msgid "labels.not-found.desc-message" msgstr "" -"Halaman ini mungkin tidak wujud atau anda tiada kebenaran untuk mengaksesnya." +"Halaman ini mungkin tidak wujud atau anda tiada kebenaran untuk " +"mengaksesnya." #: src/app/main/ui/static.cljs msgid "labels.not-found.main-message" @@ -1188,10 +1558,47 @@ msgstr "atau" msgid "labels.owner" msgstr "Pemilik" +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.password" +msgstr "Kata laluan" + +#: src/app/main/ui/dashboard/team.cljs +#, fuzzy +msgid "labels.pending-invitation" +msgstr "Belum selesai" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.profile" +msgstr "Profil" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.projects" +msgstr "Projek" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.release-notes" +msgstr "Nota keluaran" + +#: src/app/main/ui/workspace.cljs +msgid "labels.reload-file" +msgstr "Muat semula fail" + +#: src/app/main/ui/workspace/libraries.cljs, src/app/main/ui/dashboard/team.cljs +msgid "labels.remove" +msgstr "Alih keluar" + +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.remove-member" +msgstr "Buang ahli" + #: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "labels.rename" msgstr "Namakan semula" +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.rename-team" +msgstr "Namakan semula pasukan" + #: src/app/main/ui/dashboard/team.cljs msgid "labels.resend-invitation" msgstr "Hantar semula jemputan" @@ -1207,6 +1614,9 @@ msgstr "Peranan" msgid "labels.save" msgstr "Simpan" +msgid "labels.search" +msgstr "Cari" + msgid "labels.search-font" msgstr "Cari fon" @@ -1226,12 +1636,16 @@ msgstr "Kami sedang menjalankan penyelenggaraan berjadual pada sistem kami." msgid "labels.service-unavailable.main-message" msgstr "Perkhidmatan Tidak Tersedia" -msgid "labels.share-prototype" -msgstr "Kongsi prototaip" +#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.settings" +msgstr "Tetapan" msgid "labels.share" msgstr "Kongsi" +msgid "labels.share-prototype" +msgstr "Kongsi prototaip" + #: src/app/main/ui/dashboard/sidebar.cljs msgid "labels.shared-libraries" msgstr "Perpustakaan" @@ -1247,9 +1661,35 @@ msgstr "Paparkan senarai komen" msgid "labels.show-your-comments" msgstr "Paparkan komen anda sahaja" +#: src/app/main/ui/dashboard/team.cljs +msgid "labels.status" +msgstr "Status" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.tutorials" +msgstr "Tutorial" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "labels.unpublish-multi-files" +msgstr "Nyahterbitkan %s fail" + +#: src/app/main/ui/settings/profile.cljs +msgid "labels.update" +msgstr "Kemas kini" + +#: src/app/main/ui/dashboard/team_form.cljs +msgid "labels.update-team" +msgstr "Kemas kini pasukan" + +msgid "labels.upload" +msgstr "Muat naik" + msgid "labels.upload-custom-fonts" msgstr "Muat naik fon tersuai" +msgid "labels.uploading" +msgstr "Memuat naik…" + msgid "labels.view-only" msgstr "LIHAT SAHAJA" @@ -1268,17 +1708,30 @@ msgstr "Tulis komen baharu" msgid "labels.you" msgstr "(anda)" -msgid "labels.search" -msgstr "Cari" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.your-account" +msgstr "Akaun anda" #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "media.loading" msgstr "Memuatkan gambar…" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm-empty.hint" +msgstr "" +"Pustaka anda kosong. Setelah ditambahkan sebagai Pustaka Dikongsi, aset " +"yang anda buat akan tersedia untuk digunakan antara fail anda yang lain. " +"Adakah anda pasti mahu menerbitkannya?" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.accept" msgstr "Tambah sebagai Pustaka Kongsi" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.add-shared-confirm.hint" +msgstr "" +"Setelah ditambahkan sebagai Pustaka Kongsi, aset pustaka fail ini akan " +"tersedia untuk digunakan antara fail anda yang lain." + #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.add-shared-confirm.message" msgstr "Tambah “%s” sebagai Pustaka Kongsi" @@ -1288,6 +1741,10 @@ msgstr "Tambah “%s” sebagai Pustaka Kongsi" msgid "modals.big-nudge" msgstr "Anjakan besar" +#: src/app/main/ui/settings/change_email.cljs +msgid "modals.change-email.confirm-email" +msgstr "Sahkan e-mel baharu" + #: src/app/main/ui/settings/change_email.cljs msgid "modals.change-email.info" msgstr "" @@ -1342,6 +1799,14 @@ msgstr "URL muatan" msgid "modals.create-webhook.url.placeholder" msgstr "https://example.com/postreceive" +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.accept" +msgstr "Padam token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "modals.delete-acces-token.message" +msgstr "Adakah anda pasti mahu memadamkan token ini?" + #: src/app/main/ui/settings/access-tokens.cljs msgid "modals.delete-acces-token.title" msgstr "Padam token" @@ -1350,6 +1815,30 @@ msgstr "Padam token" msgid "modals.delete-account.cancel" msgstr "Batal dan kekalkan akaun saya" +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.confirm" +msgstr "Ya, padam akaun saya" + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.info" +msgstr "" +"Dengan mengalih keluar akaun anda, anda akan kehilangan semua projek dan " +"arkib semasa anda." + +#: src/app/main/ui/settings/delete_account.cljs +msgid "modals.delete-account.title" +msgstr "Adakah anda pasti mahu memadam akaun anda?" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.accept" +msgstr "Padam perbualan" + +#: src/app/main/ui/comments.cljs +msgid "modals.delete-comment-thread.message" +msgstr "" +"Adakah anda pasti mahu memadamkan perbualan ini? Semua komen dalam urutan " +"ini akan dipadamkan." + #: src/app/main/ui/comments.cljs msgid "modals.delete-comment-thread.title" msgstr "Padam perbualan" @@ -1364,6 +1853,10 @@ msgstr "Padam anotasi" msgid "modals.delete-file-confirm.accept" msgstr "Padam fail" +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-file-confirm.message" +msgstr "Adakah anda pasti mahu memadamkan fail ini?" + #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-file-confirm.title" msgstr "Memadam fail" @@ -1382,8 +1875,8 @@ msgstr "Memadamkan %s fail" msgid "modals.delete-font-variant.message" msgstr "" -"Adakah anda pasti mahu memadamkan gaya fon ini? Ia tidak akan dimuatkan jika " -"digunakan dalam fail." +"Adakah anda pasti mahu memadamkan gaya fon ini? Ia tidak akan dimuatkan " +"jika digunakan dalam fail." msgid "modals.delete-font-variant.title" msgstr "Memadam gaya fon" @@ -1441,6 +1934,10 @@ msgid "modals.delete-shared-confirm.title" msgid_plural "modals.delete-shared-confirm.title" msgstr[0] "Memadam fail" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.delete-team-confirm.accept" +msgstr "Padam pasukan" + #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.delete-team-confirm.message" msgstr "" @@ -1451,6 +1948,10 @@ msgstr "" msgid "modals.delete-team-confirm.title" msgstr "Memadam pasukan" +#: src/app/main/ui/dashboard/team.cljs +msgid "modals.delete-team-member-confirm.accept" +msgstr "Padam ahli" + #: src/app/main/ui/dashboard/team.cljs msgid "modals.delete-team-member-confirm.message" msgstr "Adakah anda pasti mahu memadamkan ahli ini daripada pasukan?" @@ -1459,6 +1960,13 @@ msgstr "Adakah anda pasti mahu memadamkan ahli ini daripada pasukan?" msgid "modals.delete-team-member-confirm.title" msgstr "Padam ahli pasukan" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "" +"Aset yang telah digunakan dalam fail ini akan kekal di sana (tiada reka " +"bentuk akan rosak)." + msgid "modals.delete-webhook.accept" msgstr "Padam cangkuk web (webhook)" @@ -1505,6 +2013,12 @@ msgstr "" "Anda tidak boleh meninggalkan pasukan jika tiada ahli lain untuk dinaikkan " "pangkat kepada pemilik. Anda mungkin mahu memadamkan pasukan." +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-and-reassign.hint1" +msgstr "" +"Anda adalah pemilik pasukan ini. Sila pilih ahli lain untuk dinaikkan " +"pangkat kepada pemilik sebelum anda pergi." + #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.leave-and-reassign.promote-and-leave" msgstr "Naik pangkat dan tinggalkan" @@ -1513,6 +2027,15 @@ msgstr "Naik pangkat dan tinggalkan" msgid "modals.leave-and-reassign.select-member-to-promote" msgstr "Pilih ahli untuk dinaikkan pangkat" +#: src/app/main/ui/dashboard/sidebar.cljs +#, fuzzy +msgid "modals.leave-and-reassign.title" +msgstr "Sebelum anda pergi" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "modals.leave-confirm.accept" +msgstr "Tinggalkan pasukan" + #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.leave-confirm.message" msgstr "Adakah anda pasti mahu meninggalkan pasukan ini?" @@ -1538,8 +2061,8 @@ msgstr "" #: src/app/main/ui/dashboard/team.cljs msgid "modals.promote-owner-confirm.message" msgstr "" -"Anda adalah pemilik semasa pasukan ini. Adakah anda pasti mahu menjadikan %s " -"pemilik baharu pasukan?" +"Anda adalah pemilik semasa pasukan ini. Adakah anda pasti mahu menjadikan " +"%s pemilik baharu pasukan?" #: src/app/main/ui/dashboard/team.cljs msgid "modals.promote-owner-confirm.title" @@ -1554,12 +2077,20 @@ msgstr "Pustaka anda kosong. Adakah anda pasti mahu menerbitkannya?" msgid "modals.publish-empty-library.title" msgstr "Terbitkan perpustakaan kosong" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.accept" +msgstr "Alih keluar sebagai Pustaka Kongsi" + #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.remove-shared-confirm.hint" msgstr "" "Setelah dialih keluar sebagai Pustaka Kongsi, Pustaka Fail fail ini akan " "berhenti tersedia untuk digunakan di antara fail anda yang lain." +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.message" +msgstr "Alih keluar \"%s\" sebagai Pustaka Kongsi" + #: src/app/main/ui/workspace/nudge.cljs msgid "modals.small-nudge" msgstr "Anjakan kecil" @@ -1574,6 +2105,11 @@ msgid "modals.unpublish-shared-confirm.message" msgid_plural "modals.unpublish-shared-confirm.message" msgstr[0] "Adakah anda pasti mahu menyahterbitkan perpustakaan ini?" +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.unpublish-shared-confirm.title" +msgid_plural "modals.unpublish-shared-confirm.title" +msgstr[0] "Nyahterbit pustaka" + #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs msgid "modals.update-remote-component-in-bulk.hint" msgstr "" @@ -1666,9 +2202,14 @@ msgstr "" msgid "onboarding-v2.newsletter.privacy1" msgstr "Kami mengambil berat tentang privasi, di sini anda boleh membaca. " -msgid "onboarding-v2.newsletter.updates" +msgid "onboarding-v2.newsletter.privacy2" msgstr "" -"Hantar kepada saya kemas kini produk (ciri baharu, keluaran, pembetulan...)." +"Kami hanya akan menghantar e-mel yang berkaitan kepada anda. Anda boleh " +"berhenti melanggan pada bila-bila masa melalui pautan nyahlanggan dalam " +"mana-mana surat berita kami." + +msgid "onboarding-v2.newsletter.updates" +msgstr "Hantar kepada saya kemas kini produk (ciri baharu, keluaran, pembetulan...)." msgid "onboarding-v2.welcome.desc1" msgstr "" @@ -1681,6 +2222,9 @@ msgstr "" "Ruang awam untuk belajar, berkongsi dan membincangkan tentang Penpot, masa " "kini dan masa depannya dengan seluruh Komuniti dan pasukan teras Penpot." +msgid "onboarding-v2.welcome.desc2.title" +msgstr "Mengambil bahagian dalam Komuniti" + msgid "onboarding-v2.welcome.desc3" msgstr "" "Di mana anda akan menemui cara untuk bekerjasama dengan terjemahan, " @@ -1692,24 +2236,35 @@ msgstr "Panduan memberi sumbangan" msgid "onboarding-v2.welcome.title" msgstr "Selamat datang ke Penpot!" -msgid "onboarding.choice.team-up.create-team-placeholder" -msgstr "Masukkan nama pasukan" - msgid "onboarding.choice.team-up.continue-creating-team" msgstr "Teruskan mencipta pasukan" -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Mulakan tanpa pasukan" +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Teruskan tanpa pasukan" -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Anda boleh membuat pasukan kemudian." +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Buat pasukan & jemput" -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Buat pasukan tanpa menjemput" +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Buat pasukan dan hantar jemputan" msgid "onboarding.choice.team-up.create-team-and-send-invites-description" msgstr "Anda boleh menjemput kemudian" +msgid "onboarding.choice.team-up.create-team-desc" +msgstr "" +"Selepas menamakan pasukan anda, anda akan dapat menjemput orang untuk " +"menyertai." + +msgid "onboarding.choice.team-up.create-team-placeholder" +msgstr "Masukkan nama pasukan" + +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Cipta pasukan" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Buat pasukan tanpa menjemput" + msgid "onboarding.choice.team-up.invite-members" msgstr "Jemput ahli" @@ -1721,6 +2276,12 @@ msgstr "" msgid "onboarding.choice.team-up.roles" msgstr "Jemput dengan peranan:" +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Mulakan tanpa pasukan" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Anda boleh membuat pasukan kemudian." + msgid "onboarding.newsletter.accept" msgstr "Ya, langgan" @@ -1738,6 +2299,11 @@ msgstr "Ingin menerima berita Penpot?" msgid "onboarding.team-modal.create-team" msgstr "Cipta pasukan" +msgid "onboarding.team-modal.create-team-desc" +msgstr "" +"Pasukan membolehkan anda bekerjasama dengan pengguna Penpot lain yang " +"bekerja dalam fail dan projek yang sama." + msgid "onboarding.team-modal.create-team-feature-1" msgstr "Fail dan projek tanpa had" @@ -1774,6 +2340,10 @@ msgstr "Alat reka bentuk yang manakah anda mempunyai lebih banyak pengalaman?" msgid "questions.11-30" msgstr "11-30" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.2-10" +msgstr "2-10" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.31-50" msgstr "31-50" @@ -1792,8 +2362,7 @@ msgstr "Canva" #: src/app/main/ui/onboarding/questions.cljs msgid "questions.describe-your-experience-working-on" -msgstr "" -"Bagaimanakah cara terbaik anda menerangkan pengalaman anda bekerja pada..." +msgstr "Bagaimanakah cara terbaik anda menerangkan pengalaman anda bekerja pada..." #: src/app/main/ui/onboarding/questions.cljs msgid "questions.designer" @@ -1811,10 +2380,18 @@ msgstr "Ketahui lebih lanjut tentang Penpot" msgid "questions.figma" msgstr "Figma" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.founder" +msgstr "Pengasas/VP" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.freelancer" msgstr "Saya seorang pekerja bebas (freelancer)" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Dapatkan kod daripada projek pasukan saya " + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.interface-design-visual-assets-design-systems" msgstr "... reka bentuk antara muka, aset visual, sistem reka bentuk, dsb." @@ -1835,10 +2412,18 @@ msgstr "Mari mulakan!" msgid "questions.manager" msgstr "Pengurus Produk atau Projek" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.marketing" +msgstr "Pemasaran" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.more-than-50" msgstr "Lebih daripada 50" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.next" +msgstr "Seterusnya" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.none" msgstr "Tiada" @@ -1855,6 +2440,18 @@ msgstr "Saya sedang menjalankan projek peribadi" msgid "questions.previous" msgstr "Sebelumnya" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.questions-how-are-you-planning-to-use-penpot" +msgstr "Bagaimanakah anda merancang untuk menggunakan Penpot?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.role" +msgstr "Apakah peranan anda?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Pilih pilihan" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.sketch" msgstr "Sketch" @@ -1907,6 +2504,10 @@ msgstr "" msgid "settings.detach" msgstr "Tanggalkan" +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, src/app/main/ui/workspace/sidebar/options/menus/blur.cljs +msgid "settings.multiple" +msgstr "Bercampur" + # SECTIONS msgid "shortcut-section.basics" msgstr "Asas" @@ -1939,6 +2540,9 @@ msgstr "Menu utama" msgid "shortcut-subsection.modify-layers" msgstr "Ubah suai lapisan" +msgid "shortcut-subsection.navigation-dashboard" +msgstr "Navigasi" + msgid "shortcut-subsection.navigation-viewer" msgstr "Navigasi" @@ -2014,12 +2618,12 @@ msgstr "Persimpangan Boolean" msgid "shortcuts.bool-union" msgstr "Kesatuan Boolean" -msgid "shortcuts.bring-backward" -msgstr "Hantar ke belakang" - msgid "shortcuts.bring-back" msgstr "Hantar ke paling belakang" +msgid "shortcuts.bring-backward" +msgstr "Hantar ke belakang" + msgid "shortcuts.bring-forward" msgstr "Bawa ke hadapan" @@ -2038,9 +2642,72 @@ msgstr "Cipta komponen" msgid "shortcuts.create-new-project" msgstr "Buat baharu" +msgid "shortcuts.cut" +msgstr "Potong" + msgid "shortcuts.decrease-zoom" msgstr "Zum keluar" +msgid "shortcuts.delete" +msgstr "Padam" + +msgid "shortcuts.delete-node" +msgstr "Padamkan nod" + +msgid "shortcuts.detach-component" +msgstr "Tanggalkan komponen" + +msgid "shortcuts.draw-curve" +msgstr "Lengkung" + +msgid "shortcuts.draw-ellipse" +msgstr "elips" + +msgid "shortcuts.draw-frame" +msgstr "Papan" + +msgid "shortcuts.draw-nodes" +msgstr "Lukis laluan" + +msgid "shortcuts.draw-path" +msgstr "Laluan" + +msgid "shortcuts.draw-rect" +msgstr "Segi empat tepat" + +msgid "shortcuts.draw-text" +msgstr "Teks" + +msgid "shortcuts.duplicate" +msgstr "Pendua" + +msgid "shortcuts.escape" +msgstr "Batal" + +msgid "shortcuts.export-shapes" +msgstr "Eksport bentuk" + +msgid "shortcuts.fit-all" +msgstr "Zum untuk muat semua" + +msgid "shortcuts.flip-horizontal" +msgstr "Terbalikkan secara mendatar" + +msgid "shortcuts.flip-vertical" +msgstr "Terbalikkan secara menegak" + +msgid "shortcuts.font-size-dec" +msgstr "Kurangkan saiz fon" + +msgid "shortcuts.font-size-inc" +msgstr "Tambah saiz fon" + +msgid "shortcuts.go-to-drafts" +msgstr "Pergi ke draf" + +msgid "shortcuts.go-to-libs" +msgstr "Pergi ke perpustakaan kongsi" + msgid "shortcuts.go-to-search" msgstr "Cari" @@ -2070,671 +2737,3 @@ msgstr "Kurangkan jarak huruf" msgid "shortcuts.letter-spacing-inc" msgstr "Penambahan jarak huruf" - -msgid "dashboard.export-multi" -msgstr "Eksport fail Penpot %s" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-multiple.selected" -msgstr "%s daripada %s elemen dipilih" - -#: src/app/main/ui/workspace/header.cljs -msgid "dashboard.export-shapes" -msgstr "Eksport" - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to" -msgstr "" -"Anda boleh menambah tetapan eksport ke elemen daripada sifat reka bentuk (di " -"bahagian bawah bar sisi kanan)." - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.how-to-link" -msgstr "Maklumat cara untuk menetapkan eksport di Penpot." - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.no-elements" -msgstr "Tiada unsur dengan tetapan eksport." - -#: src/app/main/ui/export.cljs -msgid "dashboard.export-shapes.title" -msgstr "Eksport Pemilihan" - -msgid "dashboard.export-standard-multi" -msgstr "Muat turun %s fail standard (.svg + .json)" - -msgid "dashboard.export.detail" -msgstr "* Mungkin termasuk komponen, grafik, warna dan/atau tipografi." - -msgid "dashboard.export.explain" -msgstr "" -"Satu atau lebih fail yang anda ingin eksport menggunakan perpustakaan " -"kongsi. Apa yang anda mahu lakukan dengan aset mereka*?" - -msgid "dashboard.export.options.all.message" -msgstr "" -"fail dengan perpustakaan kongsi akan disertakan dalam eksport, mengekalkan " -"hubungannya." - -msgid "dashboard.export.options.all.title" -msgstr "Eksport perpustakaan kongsi" - -msgid "dashboard.export.options.detach.message" -msgstr "" -"Perpustakaan kongsi tidak akan disertakan dalam eksport dan tiada aset akan " -"ditambahkan ke perpustakaan. " - -msgid "dashboard.export.options.detach.title" -msgstr "Anggap aset perpustakaan kongsi sebagai objek asas" - -msgid "dashboard.export.options.merge.message" -msgstr "" -"Fail anda akan dieksport dengan semua aset luaran digabungkan ke dalam " -"pustaka fail." - -msgid "dashboard.export.options.merge.title" -msgstr "Sertakan aset perpustakaan kongsi dalam pustaka fail" - -msgid "dashboard.export.title" -msgstr "Eksport fail" - -msgid "dashboard.fonts.deleted-placeholder" -msgstr "Fon hilang" - -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.dismiss-all" -msgstr "Tolak semua" - -msgid "dashboard.fonts.empty-placeholder" -msgstr "Fon tersuai yang anda muat naik akan dipaparkan di sini." - -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.fonts-added" -msgid_plural "dashboard.fonts.fonts-added" -msgstr[0] "%s fon ditambah" - -#, markdown -msgid "dashboard.fonts.hero-text1" -msgstr "" -"Sebarang fon web yang anda muat naik di sini akan ditambahkan pada senarai " -"keluarga fon yang tersedia pada sifat teks fail pasukan ini. Fon dengan nama " -"keluarga fon yang sama akan dikumpulkan sebagai **keluarga fon tunggal**. " -"Anda boleh memuat naik fon dengan format berikut: **TTF, OTF dan WOFF** (" -"hanya satu sahaja diperlukan)." - -#: src/app/main/ui/dashboard/fonts.cljs -msgid "dashboard.fonts.upload-all" -msgstr "Muat naik semua" - -#, markdown -msgid "dashboard.fonts.warning-text" -msgstr "" -"Kami telah mengesan kemungkinan masalah dalam fon anda yang berkaitan dengan " -"metrik menegak untuk sistem pengendalian yang berbeza. Untuk menyemaknya, " -"anda boleh menggunakan perkhidmatan metrik menegak fon seperti [ini](https" -"://vertical-metrics.netlify.app/). Selain itu, kami mengesyorkan menggunakan " -"[Transfonter](https://transfonter.org/) untuk menjana fon web dan " -"membetulkan ralat. " - -msgid "dashboard.import" -msgstr "Import fail Penpot" - -msgid "dashboard.import.analyze-error" -msgstr "Alamak! Kami tidak dapat mengimport fail ini" - -#: src/app/main/ui/dashboard/team.cljs -#, fuzzy -msgid "labels.pending-invitation" -msgstr "Belum selesai" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.profile" -msgstr "Profil" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.projects" -msgstr "Projek" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.release-notes" -msgstr "Nota keluaran" - -#: src/app/main/ui/workspace.cljs -msgid "labels.reload-file" -msgstr "Muat semula fail" - -#: src/app/main/ui/workspace/libraries.cljs, src/app/main/ui/dashboard/team.cljs -msgid "labels.remove" -msgstr "Alih keluar" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.remove-member" -msgstr "Buang ahli" - -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.rename-team" -msgstr "Namakan semula pasukan" - -#: src/app/main/ui/dashboard/team.cljs -msgid "labels.status" -msgstr "Status" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.tutorials" -msgstr "Tutorial" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "labels.unpublish-multi-files" -msgstr "Nyahterbitkan %s fail" - -#: src/app/main/ui/settings/profile.cljs -msgid "labels.update" -msgstr "Kemas kini" - -#: src/app/main/ui/dashboard/team_form.cljs -msgid "labels.update-team" -msgstr "Kemas kini pasukan" - -msgid "labels.upload" -msgstr "Muat naik" - -msgid "labels.uploading" -msgstr "Memuat naik…" - -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.message" -msgstr "" -"Adakah anda pasti mahu memadamkan perbualan ini? Semua komen dalam urutan " -"ini akan dipadamkan." - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.confirm" -msgstr "Ya, padam akaun saya" - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.info" -msgstr "" -"Dengan mengalih keluar akaun anda, anda akan kehilangan semua projek dan " -"arkib semasa anda." - -#: src/app/main/ui/settings/delete_account.cljs -msgid "modals.delete-account.title" -msgstr "Adakah anda pasti mahu memadam akaun anda?" - -#: src/app/main/ui/comments.cljs -msgid "modals.delete-comment-thread.accept" -msgstr "Padam perbualan" - -msgid "shortcut-subsection.navigation-dashboard" -msgstr "Navigasi" - -msgid "shortcuts.duplicate" -msgstr "Pendua" - -msgid "shortcuts.escape" -msgstr "Batal" - -msgid "shortcuts.export-shapes" -msgstr "Eksport bentuk" - -msgid "shortcuts.fit-all" -msgstr "Zum untuk muat semua" - -msgid "shortcuts.flip-horizontal" -msgstr "Terbalikkan secara mendatar" - -msgid "shortcuts.flip-vertical" -msgstr "Terbalikkan secara menegak" - -msgid "shortcuts.font-size-dec" -msgstr "Kurangkan saiz fon" - -#, markdown -msgid "dashboard.fonts.hero-text2" -msgstr "" -"Anda hanya perlu memuat naik fon yang anda miliki atau mempunyai lesen untuk " -"digunakan dalam Penpot. Ketahui lebih lanjut dalam bahagian Hak kandungan [" -"Syarat Perkhidmatan Penpot](https://penpot.app/terms.html). Anda juga " -"mungkin ingin membaca tentang [pelesenan fon](https://www.typography.com/" -"faq)." - -msgid "dashboard.import.analyze-error.components-v2" -msgstr "" -"Fail dengan komponen v2 diaktifkan tetapi pasukan ini belum menyokongnya " -"lagi." - -msgid "dashboard.import.progress.process-components" -msgstr "Memproses komponen" - -msgid "dashboard.import.progress.process-media" -msgstr "Memproses media" - -#: src/app/main/ui/dashboard/grid.cljs -msgid "dashboard.loading-files" -msgstr "memuatkan fail anda…" - -#: src/app/main/ui/dashboard/project_menu.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.move-to" -msgstr "Berpindah ke" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.no-projects-placeholder" -msgstr "Projek yang disemat akan muncul di sini" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "dashboard.notifications.email-changed-successfully" -msgstr "Alamat e-mel anda telah berjaya dikemas kini" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "dashboard.notifications.email-verified-successfully" -msgstr "Alamat e-mel anda telah berjaya disahkan" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.pin-unpin" -msgstr "Semat/Nyahsemat" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.remove-account" -msgstr "Mahu mengalih keluar akaun anda?" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dashboard.projects-title" -msgstr "Projek" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.remove-shared" -msgstr "Alih keluar sebagai Pustaka Dikongsi" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.search-placeholder" -msgstr "Cari…" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.save-settings" -msgstr "Simpan tetapan" - -#: src/app/main/ui/confirm.cljs -msgid "ds.component-subtitle" -msgstr "Komponen untuk dikemas kini:" - -#: src/app/main/ui/dashboard/search.cljs -msgid "dashboard.searching-for" -msgstr "Mencari \"%s\"…" - -#: src/app/main/ui/settings/options.cljs -msgid "dashboard.select-ui-language" -msgstr "Pilih Bahasa UI" - -msgid "dashboard.import.import-error" -msgstr "Terdapat masalah mengimport fail. Fail tidak diimport." - -msgid "dashboard.import.import-message" -msgid_plural "dashboard.import.import-message" -msgstr[0] "%s fail telah berjaya diimport." - -msgid "dashboard.import.import-warning" -msgstr "Sesetengah fail mengandungi objek tidak sah telah dialih keluar." - -msgid "dashboard.import.progress.process-colors" -msgstr "memproses warna" - -msgid "dashboard.import.progress.process-page" -msgstr "Memproses halaman: %s" - -msgid "dashboard.import.progress.process-typographies" -msgstr "Memproses tipografi" - -msgid "dashboard.import.progress.upload-data" -msgstr "Memuat naik data ke pelayan (%s/%s)" - -msgid "dashboard.import.progress.upload-media" -msgstr "Memuat naik fail: %s" - -#: src/app/main/ui/dashboard/team.cljs -msgid "dashboard.invite-profile" -msgstr "Jemput orang ramai" - -#: src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "dashboard.leave-team" -msgstr "Tinggalkan pasukan" - -msgid "dashboard.libraries-and-templates" -msgstr "Perpustakaan & Templat" - -msgid "dashboard.libraries-and-templates.explore" -msgstr "Terokai lebih banyak daripada mereka dan ketahui cara untuk menyumbang" - -msgid "dashboard.libraries-and-templates.import-error" -msgstr "Terdapat masalah mengimport templat. Templat tidak diimport." - -#: src/app/main/ui/dashboard/libraries.cljs -msgid "dashboard.libraries-title" -msgstr "Perpustakaan" - -msgid "dashboard.webhooks.empty.no-webhooks" -msgstr "Tiada webhook dibuat setakat ini." - -msgid "dashboard.webhooks.empty.add-one" -msgstr "Tekan butang \"Tambah webhook\" untuk menambahnya." - -msgid "dashboard.webhooks.update.success" -msgstr "Webhook berjaya dikemas kini." - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.your-email" -msgstr "E-mel" - -#: src/app/main/ui/settings/profile.cljs -msgid "dashboard.your-name" -msgstr "Nama anda" - -#: src/app/main/ui/dashboard/search.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/libraries.cljs, src/app/main/ui/dashboard/projects.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.your-penpot" -msgstr "Penpot anda" - -#: src/app/main/ui/alert.cljs -msgid "ds.alert-ok" -msgstr "Ok" - -#: src/app/main/ui/alert.cljs -msgid "ds.alert-title" -msgstr "Perhatian" - -#: src/app/main/ui/confirm.cljs -msgid "ds.confirm-cancel" -msgstr "Batal" - -#: src/app/main/ui/confirm.cljs -msgid "ds.confirm-ok" -msgstr "Ok" - -#: src/app/main/ui/confirm.cljs, src/app/main/ui/confirm.cljs -msgid "ds.confirm-title" -msgstr "Adakah anda pasti?" - -#: src/app/main/ui/auth/login.cljs -msgid "errors.auth-provider-not-configured" -msgstr "Pembekal pengesahan tidak dikonfigurasikan." - -msgid "errors.auth.unable-to-login" -msgstr "Nampaknya anda belum disahkan atau sesi telah tamat tempoh." - -msgid "errors.bad-font-plural" -msgstr "Fon %s tidak dapat dimuatkan" - -#: src/app/main/ui/auth/verify_token.cljs -msgid "errors.unexpected-token" -msgstr "Token tidak diketahui" - -msgid "errors.webhooks.timeout" -msgstr "Masa tamat" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.discourse-title" -msgstr "Komuniti Penpot" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.subject" -msgstr "Subjek" - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.subtitle" -msgstr "" -"Sila terangkan sebab e-mel anda, nyatakan sama ada isu, idea atau keraguan. " -"Seorang ahli pasukan kami akan menjawab secepat mungkin." - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.top" -msgstr "Atas" - -#: src/app/main/ui/inspect/attributes/layout.cljs -msgid "inspect.attributes.layout.width" -msgstr "Lebar" - -#: src/app/main/ui/inspect/attributes/shadow.cljs -msgid "inspect.attributes.shadow" -msgstr "Bayang" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-weight" -msgstr "Berat Huruf" - -msgid "inspect.attributes.typography.text-decoration.underline" -msgstr "Garis bawah" - -msgid "inspect.tabs.code.selected.svg-raw" -msgstr "SVG" - -msgid "labels.active" -msgstr "Aktif" - -#: src/app/main/ui/workspace/comments.cljs -msgid "labels.all" -msgstr "Semua" - -#: src/app/main/ui/static.cljs -msgid "labels.internal-error.desc-message" -msgstr "" -"Sesuatu yang buruk telah berlaku. Sila cuba semula operasi dan jika masalah " -"berterusan, hubungi sokongan." - -msgid "labels.continue-with-penpot" -msgstr "Anda boleh meneruskan dengan akaun Penpot" - -msgid "labels.export" -msgstr "Eksport" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "labels.create" -msgstr "Cipta" - -#: src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/dashboard/team_form.cljs -msgid "labels.create-team" -msgstr "Cipta pasukan baharu" - -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/dashboard/comments.cljs -msgid "labels.no-comments-available" -msgstr "" -"Anda telah melihat semua yang baru! Pemberitahuan ulasan baharu akan " -"dipaparkan di sini." - -#: src/app/main/ui/dashboard/team.cljs -#, markdown -msgid "labels.no-invitations-hint" -msgstr "Klik butang **Jemput orang** untuk menjemput orang ke pasukan ini." - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.help-center" -msgstr "Pusat Bantuan" - -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.password" -msgstr "Kata laluan" - -#: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/team.cljs, src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.settings" -msgstr "Tetapan" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.accept" -msgstr "Padam token" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-file-confirm.message" -msgstr "Adakah anda pasti mahu memadamkan fail ini?" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.message" -msgstr "Adakah anda pasti mahu memadamkan token ini?" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-and-reassign.hint1" -msgstr "" -"Anda adalah pemilik pasukan ini. Sila pilih ahli lain untuk dinaikkan " -"pangkat kepada pemilik sebelum anda pergi." - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.delete-team-confirm.accept" -msgstr "Padam pasukan" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.your-account" -msgstr "Akaun anda" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Pustaka anda kosong. Setelah ditambahkan sebagai Pustaka Dikongsi, aset yang " -"anda buat akan tersedia untuk digunakan antara fail anda yang lain. Adakah " -"anda pasti mahu menerbitkannya?" - -#: src/app/main/ui/dashboard/team.cljs -msgid "modals.delete-team-member-confirm.accept" -msgstr "Padam ahli" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "" -"Aset yang telah digunakan dalam fail ini akan kekal di sana (tiada reka " -"bentuk akan rosak)." - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.add-shared-confirm.hint" -msgstr "" -"Setelah ditambahkan sebagai Pustaka Kongsi, aset pustaka fail ini akan " -"tersedia untuk digunakan antara fail anda yang lain." - -#: src/app/main/ui/settings/change_email.cljs -msgid "modals.change-email.confirm-email" -msgstr "Sahkan e-mel baharu" - -#: src/app/main/ui/dashboard/sidebar.cljs -#, fuzzy -msgid "modals.leave-and-reassign.title" -msgstr "Sebelum anda pergi" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "modals.leave-confirm.accept" -msgstr "Tinggalkan pasukan" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.accept" -msgstr "Alih keluar sebagai Pustaka Kongsi" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.message" -msgstr "Alih keluar \"%s\" sebagai Pustaka Kongsi" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.title" -msgid_plural "modals.unpublish-shared-confirm.title" -msgstr[0] "Nyahterbit pustaka" - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Teruskan tanpa pasukan" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Pemasaran" - -msgid "onboarding-v2.welcome.desc2.title" -msgstr "Mengambil bahagian dalam Komuniti" - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Buat pasukan dan hantar jemputan" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "Seterusnya" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Buat pasukan & jemput" - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Cipta pasukan" - -msgid "onboarding.choice.team-up.create-team-desc" -msgstr "" -"Selepas menamakan pasukan anda, anda akan dapat menjemput orang untuk " -"menyertai." - -msgid "onboarding-v2.newsletter.privacy2" -msgstr "" -"Kami hanya akan menghantar e-mel yang berkaitan kepada anda. Anda boleh " -"berhenti melanggan pada bila-bila masa melalui pautan nyahlanggan dalam mana-" -"mana surat berita kami." - -msgid "onboarding.team-modal.create-team-desc" -msgstr "" -"Pasukan membolehkan anda bekerjasama dengan pengguna Penpot lain yang " -"bekerja dalam fail dan projek yang sama." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Pengasas/VP" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "Dapatkan kod daripada projek pasukan saya " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "Bagaimanakah anda merancang untuk menggunakan Penpot?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "Apakah peranan anda?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "Pilih pilihan" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, src/app/main/ui/workspace/sidebar/options/menus/layer.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/typography.cljs, src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs, src/app/main/ui/workspace/sidebar/options/menus/blur.cljs -msgid "settings.multiple" -msgstr "Bercampur" - -msgid "shortcuts.cut" -msgstr "Potong" - -msgid "shortcuts.delete" -msgstr "Padam" - -msgid "shortcuts.draw-curve" -msgstr "Lengkung" - -msgid "shortcuts.delete-node" -msgstr "Padamkan nod" - -msgid "shortcuts.font-size-inc" -msgstr "Tambah saiz fon" - -msgid "shortcuts.go-to-drafts" -msgstr "Pergi ke draf" - -msgid "shortcuts.go-to-libs" -msgstr "Pergi ke perpustakaan kongsi" - -msgid "shortcuts.detach-component" -msgstr "Tanggalkan komponen" - -msgid "shortcuts.draw-ellipse" -msgstr "elips" - -msgid "shortcuts.draw-frame" -msgstr "Papan" - -msgid "shortcuts.draw-nodes" -msgstr "Lukis laluan" - -msgid "shortcuts.draw-path" -msgstr "Laluan" - -msgid "shortcuts.draw-text" -msgstr "Teks" - -msgid "shortcuts.draw-rect" -msgstr "Segi empat tepat" diff --git a/frontend/translations/nl.po b/frontend/translations/nl.po index 8a7dd127a..1e8762061 100644 --- a/frontend/translations/nl.po +++ b/frontend/translations/nl.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-25 13:07+0000\n" "Last-Translator: Stephan Paternotte \n" -"Language-Team: Dutch \n" +"Language-Team: Dutch " +"\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -64,6 +64,12 @@ msgstr "Hier inloggen" msgid "auth.login-submit" msgstr "Inloggen" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-tagline" +msgstr "" +"Penpot is de gratis open-source ontwerptool voor samenwerking op het gebied " +"van ontwerp en code" + #: src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -3120,6 +3126,15 @@ msgstr "Vergrendelen/ontgrendelen" msgid "shortcuts.toggle-lock-size" msgstr "Proporties vergrendelen" +msgid "shortcuts.toggle-rulers" +msgstr "Linialen tonen/verbergen" + +msgid "shortcuts.toggle-snap-guides" +msgstr "Uitlijnen op hulpijnen" + +msgid "shortcuts.toggle-snap-ruler-guide" +msgstr "Uitlijnen op liniaal-hulplijnen" + msgid "shortcuts.toggle-textpalette" msgstr "Tekstpalet in/uitschakelen" @@ -5178,10 +5193,6 @@ msgstr "Tekst (%s)" msgid "workspace.toolbar.text-palette" msgstr "Typografie (%s)" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "** Inspectiemodus ** (alleen bekijken)" - msgid "workspace.top-bar.read-only.done" msgstr "Klaar" @@ -5322,326 +5333,3 @@ msgstr "Bijwerken" msgid "workspace.viewport.click-to-close-path" msgstr "Klik om het pad te sluiten" - -msgid "workspace.options.component.copy" -msgstr "Kopiëren" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Rechthoek" - -msgid "workspace.options.component.main" -msgstr "Hoofd" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Ruit" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Ontkoppelen" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Driehoek" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Pijl" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Je bibliotheek is leeg. Eenmaal toegevoegd als Gedeelde Bibliotheek, zijn de " -"assets die je aanmaakt beschikbaar voor gebruik in de rest van je bestanden. " -"Weet je zeker dat je dit wilt publiceren??" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Cirkel" - -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Doorgaan met team aanmaken" - -msgid "workspace.options.guides.title" -msgstr "Hulplijnen" - -msgid "media.choose-image" -msgstr "Afbeelding kiezen" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Met het aanmaken van een nieuw account ga je akkoord met onze " -"[servicevoorwaarden] (%s) en [privacybeleid] (%s)." - -msgid "workspace.options.component.swap.empty" -msgstr "Er zijn nog geen assets in deze bibliotheek" - -msgid "media.solid" -msgstr "Solide" - -msgid "workspace.top-bar.read-only.done" -msgstr "Klaar" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Team aanmaken & uitnodigen" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Klaar" - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Doorgaan zonder team" - -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Uitschakelen" - -msgid "errors.validation" -msgstr "Validatiefout" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Sluiten" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Bestand heeft een incompatibel versienummer" - -msgid "workspace.options.component.swap" -msgstr "Component uitwisselen" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Team aanmaken zonder uitnodigingen" - -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Het lijkt erop dat er een discrepantie bestaat tussen de ingeschakelde " -"functies en de functies van het bestand dat je probeert te openen. Er moeten " -"migraties voor '%s' worden toegepast voordat het bestand kan worden geopend." - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Team aanmaken" - -msgid "media.linear" -msgstr "Lineair" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Stroomdiagram" - -msgid "labels.search" -msgstr "Zoeken" - -msgid "media.image" -msgstr "Afbeelding" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Je kunt later een team samenstellen." - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Team aanmaken en uitnodigingen versturen" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Lokaliseren" - -msgid "media.gradient" -msgstr "Verloop" - -msgid "labels.share" -msgstr "Delen" - -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Raster bewerken" - -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Zonder team beginnen" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Je kunt later uitnodigen" - -msgid "media.radial" -msgstr "Radiaal" - -msgid "errors.paste-data-validation" -msgstr "Ongeldige gegevens op klembord" - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Incompatibele functie '%s' gedetecteerd" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.loading" -msgstr "Laden…" - -msgid "workspace.context-menu.grid-track.column.add-before" -msgstr "Links 1 kolom toevoegen" - -msgid "workspace.context-menu.grid-track.row.duplicate" -msgstr "Rij dupliceren" - -msgid "workspace.context-menu.grid-track.row.add-before" -msgstr "Boven 1 rij toevoegen" - -msgid "workspace.context-menu.grid-track.row.add-after" -msgstr "Onder 1 rij toevoegen" - -msgid "workspace.context-menu.grid-track.row.delete" -msgstr "Rij verwijderen" - -msgid "workspace.context-menu.grid-track.row.delete-shapes" -msgstr "Rij en vormen verwijderen" - -msgid "workspace.context-menu.grid-cells.merge" -msgstr "Cellen samenvoegen" - -msgid "workspace.context-menu.grid-cells.area" -msgstr "Gebied aanmaken" - -msgid "workspace.context-menu.grid-cells.create-board" -msgstr "Bord aanmaken" - -msgid "workspace.context-menu.grid-track.column.add-after" -msgstr "Rechts 1 kolom toevoegen" - -msgid "workspace.context-menu.grid-track.column.delete" -msgstr "Kolom verwijderen" - -msgid "workspace.context-menu.grid-track.column.delete-shapes" -msgstr "Kolom en vormen verwijderen" - -msgid "dashboard.import.analyze-error.components-v2" -msgstr "" -"Bestand met componenten v2 geactiveerd, maar dit team ondersteunt dit nog " -"niet." - -msgid "shortcuts.toggle-theme" -msgstr "Thema veranderen" - -msgid "workspace.header.menu.toggle-light-theme" -msgstr "Licht thema inschakelen" - -msgid "workspace.header.menu.toggle-dark-theme" -msgstr "Donker thema inschakelen" - -msgid "workspace.context-menu.grid-track.column.duplicate" -msgstr "Kolom dupliceren" - -#: src/app/main/data/users.cljs -msgid "errors.email-domain-not-allowed" -msgstr "Domein niet toegestaan" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.never-used-one" -msgstr "Geen" - -msgid "shortcuts.toggle-snap-guides" -msgstr "Uitlijnen op hulpijnen" - -msgid "shortcuts.scale" -msgstr "Schaal" - -msgid "shortcuts.toggle-layout-grid" -msgstr "Raster-layout toevoegen/verwijderen" - -msgid "shortcuts.toggle-rulers" -msgstr "Linialen tonen/verbergen" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.filter" -msgstr "Filteren" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.sort" -msgstr "Sorteren" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-ruler-guides" -msgstr "Uitlijnen op liniaal-hulplijnen" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.unlink-library-btn" -msgstr "Bibliotheekverbinding verbreken" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-account-title" -msgstr "Log in op mijn account" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-ruler-guides" -msgstr "Uitlijnen op liniaal-hulplijnen deactiveren" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-guides" -msgstr "Hulplijnen weergeven" - -msgid "workspace.layout_grid.editor.padding.expand" -msgstr "4-zijdige opvulopties weergeven" - -#, markdown -msgid "workspace.top-bar.view-only" -msgstr "**Code inspecteren** (alleen weergave)" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-tagline" -msgstr "" -"Penpot is de gratis open-source ontwerptool voor samenwerking op het gebied " -"van ontwerp en code" - -msgid "modals.move-shared-confirm.accept" -msgid_plural "modals.move-shared-confirm.accept" -msgstr[0] "Verplaatsen" -msgstr[1] "Verplaatsen" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-guides" -msgstr "Hulplijnen verbergen" - -msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" -msgstr "Raster-layout tonen" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.shared-library-btn" -msgstr "Bibliotheek verbinden" - -msgid "media.image.short" -msgstr "img" - -#: src/app/main/data/users.cljs -msgid "errors.auth-provider-not-allowed" -msgstr "Auth-provider is niet toegestaan voor dit profiel" - -msgid "modals.move-shared-confirm.message" -msgid_plural "modals.move-shared-confirm.message" -msgstr[0] "Weet je zeker dat je deze bibliotheek wilt verplaatsen?" -msgstr[1] "Weet je zeker dat je deze bibliotheken wilt verplaatsen?" - -#: src/app/main/ui/workspace/sidebar/assets/common.cljs -msgid "workspace.assets.sidebar.components" -msgid_plural "workspace.assets.sidebar.components" -msgstr[0] "1 component" -msgstr[1] "%s componenten" - -msgid "modals.move-shared-confirm.title" -msgid_plural "modals.move-shared-confirm.title" -msgstr[0] "Bibliotheek verplaatsen" -msgstr[1] "Bibliotheken verplaatsen" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.remove-grid" -msgstr "Raster-layout verwijderen" - -msgid "onboarding.team-modal.team-definition" -msgstr "Wat is een team?" - -msgid "media.keep-aspect-ratio" -msgstr "Verhoudingen behouden" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs -msgid "settings.select-this-color" -msgstr "Selecteer items in deze stijl" - -msgid "shortcuts.toggle-guides" -msgstr "Hulplijnen tonen/verbergen" - -msgid "shortcuts.toggle-snap-ruler-guide" -msgstr "Uitlijnen op liniaal-hulplijnen" diff --git a/frontend/translations/pl.po b/frontend/translations/pl.po index 859eb8d2c..951ad648d 100644 --- a/frontend/translations/pl.po +++ b/frontend/translations/pl.po @@ -2,14 +2,14 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 12:55+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Polish \n" +"Language-Team: Polish " +"\n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " -"|| n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && " +"(n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Weblate 5.5.1-dev\n" #: src/app/main/ui/auth/register.cljs diff --git a/frontend/translations/pt_BR.po b/frontend/translations/pt_BR.po index 2d187bf09..b2eee4944 100644 --- a/frontend/translations/pt_BR.po +++ b/frontend/translations/pt_BR.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 12:55+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Portuguese (Brazil) \n" +"Language-Team: Portuguese (Brazil) " +"\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" diff --git a/frontend/translations/pt_PT.po b/frontend/translations/pt_PT.po index c5a6de7c9..b7c914757 100644 --- a/frontend/translations/pt_PT.po +++ b/frontend/translations/pt_PT.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 12:55+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Portuguese (Portugal) \n" +"Language-Team: Portuguese (Portugal) " +"\n" "Language: pt_PT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -402,8 +402,8 @@ msgstr "Duplicar %s ficheiros" msgid "dashboard.empty-placeholder-drafts" msgstr "" "Os ficheiros adicionados às Bibliotecas irão aparecer aqui. Experimenta " -"adicionar os teus ficheiros ou experimenta algumas das nossas [Bibliotecas e " -"templates](https://penpot.app/libraries-templates.html)." +"adicionar os teus ficheiros ou experimenta algumas das nossas [Bibliotecas " +"e templates](https://penpot.app/libraries-templates.html)." msgid "dashboard.export-binary-multi" msgstr "Descarrega %s ficheiros Penpot (.penpot)" @@ -5051,10 +5051,6 @@ msgstr "Texto (%s)" msgid "workspace.toolbar.text-palette" msgstr "Tipografias (%s)" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**Modo de inspeção** (Somente leitura)" - msgid "workspace.top-bar.read-only.done" msgstr "Feito" @@ -5240,229 +5236,3 @@ msgstr "Clica para fechar o caminho" #~ msgid "workspace.options.layout.direction.left" #~ msgstr "Linha" - -msgid "workspace.options.component.copy" -msgstr "Cópia" - -msgid "dashboard.import.import-message" -msgid_plural "dashboard.import.import-message" -msgstr[0] "1 ficheiro foi importado com sucesso." -msgstr[1] "%s ficheiros foram importados com sucesso." - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.accept" -msgid_plural "modals.unpublish-shared-confirm.accept" -msgstr[0] "Cancelar publicação" -msgstr[1] "Cancelar publicações" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Retângulo" - -msgid "workspace.options.component.main" -msgstr "Principal" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Diamante" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Desacoplar" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Triângulo" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Seta" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"A tua biblioteca está vazia. Assim que ela seja adicionada como uma " -"biblioteca partilhada, os recursos que criares nela estarão disponíveis para " -"serem usados nos teus outros ficheiros. Tens a certeza que queres publicá-la?" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Círculo" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-delete-file" -msgid_plural "dashboard.success-delete-file" -msgstr[0] "O teu ficheiro foi apagado com sucesso" -msgstr[1] "Os teus ficheiros foram apagados com sucesso" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-duplicate-file" -msgid_plural "dashboard.success-delete-file" -msgstr[0] "O teu ficheiro foi duplicado com sucesso" -msgstr[1] "Os teus ficheiros foram duplicados com sucesso" - -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Continuar criação de equipa" - -msgid "workspace.options.guides.title" -msgstr "Guias" - -msgid "media.choose-image" -msgstr "Escolher imagem" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Ao criar uma nova conta, concordas com os nossos [termos de serviço](%s) e [" -"política de privacidade](%s)." - -msgid "workspace.options.component.swap.empty" -msgstr "Ainda não existem recursos nesta biblioteca" - -msgid "media.solid" -msgstr "Sólido" - -msgid "workspace.top-bar.read-only.done" -msgstr "Feito" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Criar equipa e convidar" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Feito" - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Continuar sem equipa" - -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Sem atribuição" - -msgid "errors.validation" -msgstr "Erro de validação" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Sair" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "O ficheiro tem um número de versão incompatível" - -msgid "workspace.options.component.swap" -msgstr "Trocar de componente" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Criar equipa sem convidar" - -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Parece que existem discrepâncias entre as funcionalidades ativadas e as " -"funcionalidades do ficheiro que estás a tentar abrir. Será necessário " -"aplicar migrações para '%s' antes de poder abrir o ficheiro." - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Criar equipa" - -msgid "media.linear" -msgstr "Linear" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Fluxo" - -msgid "labels.search" -msgstr "Pesquisar" - -msgid "media.image" -msgstr "Imagem" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Poderás criar uma equipa mais tarde." - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Criar equipa e enviar convites" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Localizar" - -msgid "media.gradient" -msgstr "Gradiente" - -msgid "labels.share" -msgstr "Partilhar" - -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Editar grelha" - -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Começar sem equipa" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Poderás enviar convites mais tarde" - -msgid "media.radial" -msgstr "Radial" - -msgid "errors.paste-data-validation" -msgstr "Dados inválidos na área de transferência" - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Funcionalidade incompatível '%s' detetada" - -msgid "shortcuts.toggle-theme" -msgstr "Mudar tema" - -msgid "workspace.header.menu.toggle-light-theme" -msgstr "Mudar para tema claro" - -msgid "workspace.context-menu.grid-track.column.duplicate" -msgstr "Duplicar coluna" - -msgid "workspace.context-menu.grid-track.column.add-before" -msgstr "Adicionar 1 coluna à esquerda" - -msgid "workspace.context-menu.grid-track.column.add-after" -msgstr "Adicionar 1 coluna à direita" - -msgid "workspace.context-menu.grid-track.column.delete" -msgstr "Eliminar coluna" - -msgid "workspace.context-menu.grid-cells.area" -msgstr "Criar área" - -msgid "workspace.context-menu.grid-track.column.delete-shapes" -msgstr "Apagar coluna e conteúdos" - -msgid "workspace.context-menu.grid-track.row.duplicate" -msgstr "Duplicar fila" - -msgid "workspace.context-menu.grid-track.row.add-before" -msgstr "Adicionar 1 fila acima" - -msgid "workspace.context-menu.grid-track.row.delete" -msgstr "Apagar fila" - -msgid "workspace.context-menu.grid-track.row.delete-shapes" -msgstr "Apagar fila e conteúdos" - -msgid "workspace.context-menu.grid-cells.merge" -msgstr "Unir células" - -msgid "workspace.context-menu.grid-cells.create-board" -msgstr "Criar prancheta" - -msgid "workspace.header.menu.toggle-dark-theme" -msgstr "Alterar para tema escuro" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.loading" -msgstr "A carregar…" - -msgid "dashboard.import.analyze-error.components-v2" -msgstr "" -"Ficheiro exportado com componentes v2 mas a equipa atual ainda não os " -"suporta." - -msgid "workspace.context-menu.grid-track.row.add-after" -msgstr "Adicionar 1 fila abaixo" diff --git a/frontend/translations/ro.po b/frontend/translations/ro.po index eec4e9541..bd69468e9 100644 --- a/frontend/translations/ro.po +++ b/frontend/translations/ro.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 12:55+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Romanian \n" +"Language-Team: Romanian " +"\n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" diff --git a/frontend/translations/tr.po b/frontend/translations/tr.po index ffc732db9..4c189ef09 100644 --- a/frontend/translations/tr.po +++ b/frontend/translations/tr.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-25 13:07+0000\n" "Last-Translator: Oğuz Ersen \n" -"Language-Team: Turkish \n" +"Language-Team: Turkish " +"\n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -64,6 +64,12 @@ msgstr "Buradan oturum açın" msgid "auth.login-submit" msgstr "Oturum aç" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-tagline" +msgstr "" +"Penpot, tasarım ve kod işbirliği için özgür ve açık kaynaklı tasarım " +"aracıdır" + #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" msgstr "GitHub" @@ -3089,6 +3095,15 @@ msgstr "Seçileni kilitle" msgid "shortcuts.toggle-lock-size" msgstr "Oranları kilitle" +msgid "shortcuts.toggle-rulers" +msgstr "Cetvelleri göster/gizle" + +msgid "shortcuts.toggle-snap-guides" +msgstr "Kılavuzlara tuttur" + +msgid "shortcuts.toggle-snap-ruler-guide" +msgstr "Cetvel kılavuzlarına tuttur" + msgid "shortcuts.toggle-textpalette" msgstr "Metin paletini değiştir" @@ -5146,10 +5161,6 @@ msgstr "Metin (%s)" msgid "workspace.toolbar.text-palette" msgstr "Tipografiler (%s)" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**İnceleme modu** (Yalnızca görüntüle)" - msgid "workspace.top-bar.read-only.done" msgstr "Bitti" @@ -5348,864 +5359,3 @@ msgstr "Yolu kapatmak için tıklayın" #~ msgid "workspace.options.layout-item.title.min-w" #~ msgstr "Asgari genişlik" - -msgid "shortcuts.bold" -msgstr "Kalın yazı aç/kapat" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "Penpot'u fiziksel bir sunucuda kullanmadan önce deneyin" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "Konsept fikirler üzerinde çalışmak" - -#: src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.empty-palette" -msgstr "Kütüphanenizde henüz renk stili yok" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "30 gün" - -msgid "workspace.options.component.copy" -msgstr "Kopyala" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "" -"Geri bildiriminiz, Penpot'u kullanışlı ve eğlenceli bir araç haline " -"getirmeye devam edebilmemiz için alışkanlıklarınızı ve tercihlerinizi " -"anlamamıza yardımcı olacaktır." - -msgid "modals.invite-member.repeated-invitation" -msgstr "" -"Bazı e-posta adresleri mevcut takım üyelerine aittir. Davetleri " -"gönderilmeyecektir." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "Geliştirici" - -msgid "shortcuts.align-justify" -msgstr "İki yana yasla" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "Ürün veya Proje yöneticisi" - -msgid "workspace.options.component.create-annotation" -msgstr "Bir açıklama oluştur" - -#, markdown -msgid "dashboard.fonts.warning-text" -msgstr "" -"İşletim sistemlerinin farklı dikey metriklerine ilişkin olarak yazı " -"tiplerinizde olası bir sorun tespit ettik. Bu durumu kontrol etmek için [" -"bunun gibi](https://vertical-metrics.netlify.app/) yazı tipi dikey metrik " -"hizmetlerini kullanabilirsiniz. Ayrıca web yazı tipleri oluşturmak ve " -"hataları düzeltmek için [Transfonter](https://transfonter.org/) kullanmanızı " -"öneririz. " - -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "Yeni bir sürüm mevcut, lütfen sayfayı yenileyin" - -msgid "modals.delete-component-annotation.message" -msgstr "Bu açıklamayı silmek istediğinize emin misiniz?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "Pazarlama" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "180 gün" - -msgid "workspace.options.component.edit-annotation" -msgstr "Bir açıklamayı düzenle" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "Takım projemin kodunu al " - -msgid "workspace.shape.menu.create-multiple-components" -msgstr "Çoklu bileşen oluştur" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "Kendi projem üzerinde çalışıyorum" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Dikdörtgen" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "İsim gereklidir" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.scd-message" -msgid_plural "modals.delete-shared-confirm.activated.scd-message" -msgstr[0] "Bu kütüphane burada etkinleştirildi: " -msgstr[1] "Bu kütüphaneler burada etkinleştirildiler: " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "Serbest çalışıyorum" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.copied-success" -msgstr "Belirteç kopyalandı" - -msgid "modals.publish-empty-library.title" -msgstr "Boş kütüphaneyi yayınla" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Figma" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "tüm değişiklikleri gör" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "...marka çalışması, çizimler, pazarlama materyalleri, vb." - -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "Kütüphanenizde henüz tipografi stili yok" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-90-days" -msgstr "90 gün" - -msgid "shortcuts.zoom-lense-increase" -msgstr "Görüntüyü büyült" - -msgid "workspace.shape.menu.add-grid" -msgstr "Izgara düzeni ekle" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-unpublish-shared-confirm.activated.hint" -msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" -msgstr[0] "" -"Bu dosyada daha önce kullanılmış olan varlıklar orada kalmaya devam edecek (" -"hiçbir tasarım bozulmayacak)." -msgstr[1] "" -"Bu dosyalarda daha önce kullanılmış olan varlıklar orada kalmaya devam " -"edecek (hiçbir tasarım bozulmayacak)." - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom" -msgstr "Yakınlaştırma" - -msgid "workspace.options.component.annotation" -msgstr "Açıklama" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.some" -msgstr "Biraz" - -msgid "shortcuts.text-align-justify" -msgstr "İki yana yasla" - -msgid "workspace.layout_grid.editor.title" -msgstr "Düzenleme ızgarası" - -#: src/app/main/ui/dashboard/team.cljs -msgid "team.webhooks.max-length" -msgstr "Webhook adı en fazla 2048 karakter içermelidir." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "%s tarihinde sona erdi" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.expiration-date.label" -msgstr "Sona erme tarihi" - -msgid "workspace.header.menu.undo" -msgstr "Geri al" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "50'den fazla" - -#: src/app/main/ui/inspect/attributes/text.cljs -msgid "inspect.attributes.typography.font-weight" -msgstr "Yazı Tipi Kalınlığı" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-not-empty" -msgstr "Parola boşluk dışında bir karakter içermelidir." - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "Sonraki" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "Takımınızın büyüklüğü nedir?" - -msgid "shortcuts.toggle-visibility" -msgstr "Göster / Gizle" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "" -"... taslak çizimler, kullanıcı deneyimi yol haritası ve akışları, gezinme " -"menüsü, vb." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-60-days" -msgstr "60 gün" - -msgid "workspace.header.menu.disable-scale-content" -msgstr "Orantılı ölçeklendirmeyi devre dışı bırak" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "Çok fazla" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "Başla" - -msgid "shortcuts.align-center" -msgstr "Ortala" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "Elmas" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "Penpot'u nasıl kullanmayı planlıyorsunuz?" - -msgid "workspace.header.menu.redo" -msgstr "Tekrarla" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.describe-your-experience-working-on" -msgstr "... üzerinde çalışma deneyiminizi en iyi nasıl tarif edersiniz?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "Bir seçenek belirleyin" - -msgid "shortcuts.text-align-left" -msgstr "Sola hizala" - -msgid "shortcuts.font-size-dec" -msgstr "Yazı boyutunu azalt" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "Tasarımcı" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "Hiçbiri" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "Haydi başlayalım!" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Adobe XD" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, -msgid "settings.detach" -msgstr "Çıkar" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Sketch" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.library-updates" -msgstr "KÜTÜPHANE GÜNCELLEMELERİ" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "Üçgen" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.label" -msgstr "İsim" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.no-files-message" -msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "Hiçbir dosyada etkinleştirilmedi." -msgstr[1] "Hiçbir dosyada etkinleştirilmediler." - -msgid "modals.publish-empty-library.message" -msgstr "Kütüphaneniz boş. Yine de yayınlamak istediğinizden emin misiniz?" - -msgid "workspace.assets.open-library" -msgstr "Kütüphane dosyasını aç" - -msgid "modals.delete-component-annotation.title" -msgstr "Açıklamayı sil" - -msgid "shortcuts.select-parent-layer" -msgstr "Ana katmanı seç" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "Paylaşılan kütüphane" - -msgid "shortcuts.select-next" -msgstr "Sonraki katmanı seç" - -msgid "workspace.header.menu.enable-scale-content" -msgstr "Orantılı ölçeklendirmeyi etkinleştir" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "Daha fazla bilgi" - -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "İsim boşluk dışında bir karakter içermelidir." - -msgid "shortcuts.line-height-inc" -msgstr "Satır yüksekliğini artır" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "Diğer (lütfen belirtiniz)" - -msgid "labels.discard" -msgstr "At" - -msgid "shortcuts.font-size-inc" -msgstr "Yazı boyutunu artır" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "Penpot'un takımınız için uygun olup olmadığını görmek için test edin " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "Öğrenci veya öğretmen" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "Takımımın projesi için geri bildirim bırakın" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "31-50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "InVision" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Canva" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "Penpot'u daha fazla keşfedin" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expires-on" -msgstr "%s tarihinde sona eriyor" - -msgid "shortcuts.italic" -msgstr "İtalik yazı aç/kapat" - -msgid "shortcuts.letter-spacing-dec" -msgstr "Harf aralığını azalt" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "Önceki" - -msgid "workspace.shape.menu.create-annotation" -msgstr "Açıklama oluştur" - -msgid "shortcuts.letter-spacing-inc" -msgstr "Harf aralığını artır" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "Projem üzerinde çalışmaya başla" - -msgid "shortcuts.text-align-center" -msgstr "Ortaya hizala" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "Ok" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "Hangi tasarım aracını daha iyi kullanıyorsunuz?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "Göreviniz nedir?" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "" -"Kütüphaneniz boş. Paylaşılan Kütüphane olarak eklendiğinde, oluşturduğunuz " -"varlıklar diğer dosyalarınız arasında kullanılabilir olacak. Yayınlamak " -"istediğinizden emin misiniz?" - -msgid "shortcuts.text-align-right" -msgstr "Sağa hizala" - -msgid "shortcuts.underline" -msgstr "Alt çizgiyi aç/kapat" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-never" -msgstr "Asla" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "Kurucu/Başkan Yardımcısı" - -msgid "modals.publish-empty-library.accept" -msgstr "Yayınla" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.no-expiration" -msgstr "Süresiz" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "İsim en fazla 250 karakter içermelidir." - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "Daire" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "11-30" - -msgid "shortcut-subsection.text-editor" -msgstr "Metinler" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "... kullanıcı arayüzü tasarımı, görsel öğeler, tasarım sistemleri, vb." - -msgid "shortcuts.zoom-lense-decrease" -msgstr "Görüntüyü küçült" - -msgid "shortcuts.line-height-dec" -msgstr "Satır yüksekliğini azalt" - -msgid "shortcuts.select-prev" -msgstr "Önceki katmanı seç" - -msgid "shortcuts.line-through" -msgstr "Üstü çizili yazı aç/kapat" - -msgid "errors.cannot-upload" -msgstr "Medya dosyası yüklenemedi." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.message" -msgstr "Bu belirteci silmek istediğinizden emin misiniz?" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.access-tokens" -msgstr "Erişim belirteçleri" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-not-expire" -msgstr "Belirtecin sona erme tarihi yok" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "Yeni belirteç oluştur" - -msgid "workspace.options.component.main" -msgstr "Ana bileşen" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-expire" -msgstr "Belirtecin süresi %s tarihinde sona erecek" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.accept" -msgstr "Belirteci sil" - -msgid "workspace.assets.duplicate-main" -msgstr "Ana bileşeni çoğalt" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.submit-label" -msgstr "Belirteç oluştur" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.placeholder" -msgstr "Adı, belirtecin ne için olduğunu bilmenize yardımcı olabilir" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.no-access-tokens" -msgstr "Şu ana kadar hiç belirteciniz yok." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "" -"Kişisel erişim belirteçleri, oturum açma/parola kimlik doğrulama sistemimize " -"alternatif olarak işlev görür ve bir uygulamanın dahili Penpot API'sine " -"erişmesine izin vermek için kullanılabilir" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "Kişisel erişim belirteçleri" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "Bir belirteç oluşturmak için \"Yeni belirteç oluştur\" düğmesine basın." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.title" -msgstr "Belirteci sil" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "Erişim belirteci başarıyla oluşturuldu." - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.title" -msgstr "Erişim belirteci oluştur" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.copy-token" -msgstr "Belirteci kopyala" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "title.settings.access-tokens" -msgstr "Profil - Erişim belirteçleri" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "" -"Bir hesap oluştururken, [koşullarımızı](%s) ve [gizlilik politikamızı](%s) " -"kabul etmiş sayılırsınız." - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-delete-file" -msgid_plural "dashboard.success-delete-file" -msgstr[0] "Dosyanız başarıyla silindi" -msgstr[1] "Dosyalarınız başarıyla silindi" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "Dosyanın uyumsuz bir sürüm numarası var" - -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "" -"Etkinleştirilen özellikler ile açmaya çalıştığınız dosyanın özellikleri " -"arasında bir uyumsuzluk var gibi görünüyor. Dosyanın açılabilmesi için önce " -"'%s' için geçişlerin uygulanması gerekiyor." - -msgid "errors.validation" -msgstr "Doğrulama Hatası" - -msgid "errors.paste-data-validation" -msgstr "Panoda geçersiz veri" - -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "Ayarlanmadı" - -msgid "labels.share" -msgstr "Paylaş" - -msgid "labels.search" -msgstr "Ara" - -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "Takım olmadan başlayın" - -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "Takım oluşturmaya devam edin" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "Daha sonra bir takım oluşturabileceksiniz." - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "Takım olmadan devam edin" - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "Takım oluşturun ve davet gönderin" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "Davet etmeden takım oluşturun" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "Takım oluşturun ve davet edin" - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "Takım oluşturun" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "Daha sonra davet edebileceksiniz" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "Bul" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "Bitti" - -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "Izgarayı düzenle" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "Çıkış" - -msgid "workspace.options.component.swap" -msgstr "Bileşeni değiştir" - -msgid "workspace.options.component.swap.empty" -msgstr "Bu kütüphanede henüz varlık yok" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "Akış" - -msgid "workspace.top-bar.read-only.done" -msgstr "Bitti" - -msgid "media.image" -msgstr "Görsel" - -msgid "media.solid" -msgstr "Katı" - -msgid "media.linear" -msgstr "Doğrusal" - -msgid "media.radial" -msgstr "Işınsal" - -msgid "media.gradient" -msgstr "Değişim" - -msgid "media.choose-image" -msgstr "Görsel seç" - -msgid "workspace.options.guides.title" -msgstr "Kılavuzlar" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.unpublish-shared-confirm.accept" -msgid_plural "modals.unpublish-shared-confirm.accept" -msgstr[0] "Yayından kaldır" -msgstr[1] "Yayından kaldır" - -msgid "dashboard.import.import-message" -msgid_plural "dashboard.import.import-message" -msgstr[0] "1 dosya başarıyla içeri aktarıldı." -msgstr[1] "%s dosya başarıyla içeri aktarıldı." - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-duplicate-file" -msgid_plural "dashboard.success-delete-file" -msgstr[0] "Dosyanız başarıyla kopyalandı" -msgstr[1] "Dosyalarınız başarıyla kopyalandı" - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "Uyumsuz '%s' özelliği algılandı" - -#: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs -msgid "workspace.options.export-object" -msgid_plural "workspace.options.export-object" -msgstr[0] "1 ögeyi dışa aktar" -msgstr[1] "%s ögeyi dışa aktar" - -msgid "shortcuts.toggle-theme" -msgstr "Temayı değiştir" - -msgid "workspace.header.menu.toggle-light-theme" -msgstr "Açık temaya geç" - -msgid "workspace.header.menu.toggle-dark-theme" -msgstr "Koyu temaya geç" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.loading" -msgstr "Yükleniyor…" - -msgid "workspace.context-menu.grid-track.column.add-before" -msgstr "Sola 1 sütun ekle" - -msgid "workspace.context-menu.grid-track.column.add-after" -msgstr "Sağa 1 sütun ekle" - -msgid "workspace.context-menu.grid-track.column.delete" -msgstr "Sütunu sil" - -msgid "workspace.context-menu.grid-track.column.delete-shapes" -msgstr "Sütun ve şekilleri sil" - -msgid "workspace.context-menu.grid-track.row.duplicate" -msgstr "Yinelenen satır" - -msgid "workspace.context-menu.grid-track.row.delete" -msgstr "Satırı sil" - -msgid "workspace.context-menu.grid-cells.merge" -msgstr "Hücreleri birleştir" - -msgid "workspace.context-menu.grid-cells.area" -msgstr "Alan oluştur" - -msgid "workspace.context-menu.grid-cells.create-board" -msgstr "Çalışma yüzeyi oluştur" - -msgid "dashboard.import.analyze-error.components-v2" -msgstr "" -"Bileşenler v2 ile dosya etkinleştirildi ancak bu takım henüz bunu " -"desteklemiyor." - -msgid "workspace.context-menu.grid-track.column.duplicate" -msgstr "Yinelenen sütun" - -msgid "workspace.context-menu.grid-track.row.add-before" -msgstr "Yukarıya 1 satır ekle" - -msgid "workspace.context-menu.grid-track.row.add-after" -msgstr "Aşağıya 1 satır ekle" - -msgid "workspace.context-menu.grid-track.row.delete-shapes" -msgstr "Satır ve şekilleri sil" - -#: src/app/main/data/users.cljs -msgid "errors.email-domain-not-allowed" -msgstr "Etki alanına izin verilmiyor" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-account-title" -msgstr "Hesabımda oturum aç" - -#: src/app/main/ui/auth/login.cljs -msgid "auth.login-tagline" -msgstr "" -"Penpot, tasarım ve kod işbirliği için özgür ve açık kaynaklı tasarım aracıdır" - -#: src/app/main/data/users.cljs -msgid "errors.auth-provider-not-allowed" -msgstr "Kimlik doğrulama sağlayıcısına bu profil için izin verilmiyor" - -msgid "modals.move-shared-confirm.accept" -msgid_plural "modals.move-shared-confirm.accept" -msgstr[0] "Taşı" -msgstr[1] "Taşı" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.never-used-one" -msgstr "Hiçbiri" - -msgid "shortcuts.toggle-guides" -msgstr "Kılavuzları göster/gizle" - -msgid "shortcuts.toggle-rulers" -msgstr "Cetvelleri göster/gizle" - -msgid "shortcuts.scale" -msgstr "Ölçeklendir" - -msgid "shortcuts.toggle-snap-guides" -msgstr "Kılavuzlara tuttur" - -msgid "shortcuts.toggle-layout-grid" -msgstr "Izgara düzeni ekle/kaldır" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.filter" -msgstr "Filtrele" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.sort" -msgstr "Sırala" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.enable-snap-ruler-guides" -msgstr "Cetvel kılavuzlarına tuttur" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.hide-guides" -msgstr "Kılavuzları gizle" - -msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" -msgstr "Izgara düzenini bul" - -msgid "workspace.layout_grid.editor.padding.expand" -msgstr "4 taraflı dolgu seçeneklerini göster" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.shared-library-btn" -msgstr "Kütüphaneyi bağla" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.unlink-library-btn" -msgstr "Kütüphanenin bağlantısını kes" - -#: src/app/main/ui/workspace/sidebar/assets/common.cljs -msgid "workspace.assets.sidebar.components" -msgid_plural "workspace.assets.sidebar.components" -msgstr[0] "1 bileşen" -msgstr[1] "%s bileşen" - -msgid "media.image.short" -msgstr "görsel" - -msgid "media.keep-aspect-ratio" -msgstr "En boy oranını koru" - -msgid "modals.move-shared-confirm.message" -msgid_plural "modals.move-shared-confirm.message" -msgstr[0] "Bu kütüphaneyi taşımak istediğinizden emin misiniz?" -msgstr[1] "Bu kütüphaneleri taşımak istediğinizden emin misiniz?" - -msgid "modals.move-shared-confirm.title" -msgid_plural "modals.move-shared-confirm.title" -msgstr[0] "Kütüphaneyi taşı" -msgstr[1] "Kütüphaneleri taşı" - -msgid "onboarding.team-modal.team-definition" -msgstr "Takım nedir?" - -#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs -msgid "settings.select-this-color" -msgstr "Bu biçimi kullanan ögeleri seç" - -msgid "shortcuts.toggle-snap-ruler-guide" -msgstr "Cetvel kılavuzlarına tuttur" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.disable-snap-ruler-guides" -msgstr "Cetvel kılavuzlarına tutturmayı devre dışı bırak" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.menu.show-guides" -msgstr "Kılavuzları göster" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.remove-grid" -msgstr "Izgara düzenini kaldır" - -#, markdown -msgid "workspace.top-bar.view-only" -msgstr "**Kodu incele** ( Yalnızca Görüntüle)" diff --git a/frontend/translations/yo.po b/frontend/translations/yo.po index 3d7b0e925..183625c52 100644 --- a/frontend/translations/yo.po +++ b/frontend/translations/yo.po @@ -2,327 +2,15 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 13:04+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Yoruba \n" +"Language-Team: Yoruba " +"\n" "Language: yo\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.5.1-dev\n" -#: src/app/main/ui/auth/register.cljs -msgid "auth.login-here" -msgstr "wọlé síbí" - -msgid "common.publish" -msgstr "ìgbéjáde" - -#: src/app/main/ui/dashboard/projects.cljs -msgid "dasboard.walkthrough-hero.start" -msgstr "bẹ̀rẹ̀ ìrìn kiri" - -msgid "dashboard.import" -msgstr "gbé àwọn fáìlì pẹ́ńpọtì wọlé" - -msgid "dashboard.import.analyze-error" -msgstr "ooho! a kò lè gbé fáìlì yìí wọlé" - -msgid "dashboard.import.import-error" -msgstr "wàhálà wà láti gbé kan wà láti gbé fáìlì wọlé . fáìlì kò wọlé." - -#: src/app/main/ui/dashboard/libraries.cljs -msgid "dashboard.libraries-title" -msgstr "yàrá ìkàwé" - -#: src/app/main/ui/dashboard/project_menu.cljs -msgid "dashboard.success-duplicate-project" -msgstr "a ti ṣe ẹ̀dà iṣẹ́ àgbéṣe rẹ dáadáa" - -#: src/app/main/ui/dashboard/grid.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-move-file" -msgstr "a ti gbé fáìlì rẹ kúro dáadáa" - -#: src/app/main/ui/dashboard/file_menu.cljs -msgid "dashboard.success-move-files" -msgstr "a ti gbé àwọn fáìlì rẹ kúrò dáadáa" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs -msgid "errors.email-invalid" -msgstr "Tẹ àti wọlé pẹ̀lú ímeèlì tó wúlo jọ̀wọ́" - -msgid "errors.webhooks.timeout" -msgstr "Àkókò ti lọ" - -msgid "inspect.tabs.code.selected.circle" -msgstr "Àyíká" - -msgid "inspect.tabs.code.selected.component" -msgstr "Ẹ̀yà" - -msgid "inspect.tabs.code.selected.curve" -msgstr "Igun" - -msgid "inspect.tabs.code.selected.frame" -msgstr "Bọ́ọ̀dù" - -msgid "inspect.tabs.code.selected.group" -msgstr "Ẹgbẹ́" - -msgid "inspect.tabs.code.selected.image" -msgstr "Àwòrán" - -msgid "inspect.tabs.code.selected.mask" -msgstr "Ìbòjú" - -msgid "labels.and" -msgstr "àti" - -msgid "labels.share-prototype" -msgstr "Pín àwọn ohun tí a ti kọ tẹ́lẹ̀" - -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.shared-libraries" -msgstr "Yàrá ìkáwe" - -#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs -msgid "labels.show-all-comments" -msgstr "Fi gbogbo kọ́mẹ́ǹtì hàn" - -msgid "labels.show-comments-list" -msgstr "Fi àkójọ àwọn kọ́mẹ́ǹtì hàn" - -msgid "modals.delete-webhook.message" -msgstr "Ṣe ó dá ọ lójú pé o fẹ́ pa ìkọ́-wẹ́bù yìí rẹ́?" - -msgid "modals.publish-empty-library.accept" -msgstr "Kọ ọ́ jáde" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "Mọ́kànlélọ́gbọ̀n-Àádọ́ta" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "O ´ pọ̀jù" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Àdòbí XD" - -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.share.copy-link" -msgstr "Da línkì kọ̀" - -#: src/app/main/ui/viewer/header.cljs -msgid "viewer.header.show-interactions" -msgstr "Ifihan Ibaraenisépọ̀" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "wò gbògbò awọn ayípàdà" - -#: src/app/main/ui/workspace/libraries.cljs -msgid "workspace.libraries.updates" -msgstr "Awọn ímùdojúiwọn" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.add-interaction" -msgstr "Tẹ amí + làtí fi íbàràénisépọ̀ kun" - -#: src/app/main/ui/workspace/sidebar/options.cljs -msgid "workspace.options.design" -msgstr "Ónirú" - -msgid "workspace.options.height" -msgstr "Gíga" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-on-click" -msgstr "Tẹ orí" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay" -msgstr "Ṣíìtẹ̀lé ìlànà" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-open-overlay-dest" -msgstr "Ṣí ìtẹ̀lé ìlànà: %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-relative-to" -msgstr "Ìbátan sí" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-self" -msgstr "Tìkara" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay" -msgstr "Àyípadà ìtẹ̀lé ìlànà" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-toggle-overlay-dest" -msgstr "Àyípadà ìtẹ̀lé ìlànà: %s" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-trigger" -msgstr "Okùnfà" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-url" -msgstr "URL" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row" -msgstr "Ilà ìbú" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.direction.row-reverse" -msgstr "Ilà ìbú yíyípadà" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.gap" -msgstr "Àlàfo" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs -msgid "workspace.options.layout.left" -msgstr "Òsì" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin" -msgstr "Etí ìwé" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin-all" -msgstr "Gbogbo àwọn àwòrán" - -#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs -msgid "workspace.options.layout.margin-simple" -msgstr "Etí ìwé ẹyọ" - -msgid "workspace.options.shadow-options.color" -msgstr "Àwọ̀ òjíjí" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.forward" -msgstr "Mú wá sọ́wọ́ iwájú" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.front" -msgstr "Mú wá sí wájú" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.go-main" -msgstr "Lọ sí olórí fáìlì àkóónú" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.group" -msgstr "Àwùjọ" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.hide" -msgstr "Tọ́jú" - -msgid "workspace.shape.menu.hide-ui" -msgstr "Fihàn/ Tọ́jú UI" - -msgid "workspace.shape.menu.intersection" -msgstr "Ìkòríta" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.lock" -msgstr "Tì" - -#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.mask" -msgstr "Ìbòjú" - -#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.paste" -msgstr "lẹ̀mọ́" - -msgid "workspace.shape.menu.path" -msgstr "Ipa ọ̀nà" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.remove-flex" -msgstr "Yọ àrọ ètò ìrísí kúrò" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.unlock" -msgstr "Ṣíí" - -#: src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.unmask" -msgstr "Sí ìbòjú" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "workspace.shape.menu.update-components-in-bulk" -msgstr "Mímú àwọn ọ̀rọ̀ àkóónú pàtàkì dójú ìwọ̀n" - -msgid "workspace.sidebar.collapse" -msgstr "Wó òpó ègbẹ́" - -msgid "workspace.sidebar.expand" -msgstr "Fẹ òpó ẹ̀gbẹ́" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.sidebar.history" -msgstr "Ìtàn (%s)" - -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.sidebar.layers" -msgstr "Àwọn ìpele" - -msgid "workspace.sidebar.layers.components" -msgstr "Àwọn àkóónú" - -msgid "workspace.sidebar.layers.frames" -msgstr "Àwọn pátákó" - -#: src/app/main/ui/workspace/sidebar/options/menus/svg_attrs.cljs, src/app/main/ui/inspect/attributes/svg.cljs -msgid "workspace.sidebar.options.svg-attrs.title" -msgstr "Gbígbé àwọn ànímọ́ SVG wọlé wá" - -#: src/app/main/ui/workspace/sidebar/sitemap.cljs -msgid "workspace.sidebar.sitemap" -msgstr "Àwọn abala" - -#: src/app/main/ui/workspace/sidebar/history.cljs -msgid "workspace.undo.entry.new" -msgstr "Titun %s" - -msgid "workspace.undo.entry.single.circle" -msgstr "Àyíká" - -msgid "workspace.undo.entry.single.color" -msgstr "Ohun àmúṣọrọ̀ àwọ̀" - -msgid "workspace.undo.entry.single.component" -msgstr "Àkóónú" - -msgid "workspace.undo.entry.single.curve" -msgstr "Ẹkọ̀rọ̀" - -msgid "workspace.undo.entry.single.frame" -msgstr "Pátákó" - -msgid "workspace.undo.entry.single.group" -msgstr "Àkójọ" - -msgid "workspace.undo.entry.single.image" -msgstr "Àwòrán" - -msgid "workspace.undo.entry.single.media" -msgstr "Ohun àmúṣọrọ̀ èyà àwòrán" - -msgid "workspace.undo.entry.single.multiple" -msgstr "Ohun" - -msgid "workspace.undo.entry.single.page" -msgstr "Ojú awẹ́" - #: src/app/main/ui/auth/register.cljs msgid "auth.check-your-email" msgstr "" @@ -359,6 +47,10 @@ msgstr "gbàgbé ọ̀rọ̀-ìgbaniwọlé ?" msgid "auth.fullname" msgstr "orúkọ lẹ́kùnn-ún-rẹ́rẹ́" +#: src/app/main/ui/auth/register.cljs +msgid "auth.login-here" +msgstr "wọlé síbí" + #: src/app/main/ui/auth/login.cljs msgid "auth.login-submit" msgstr "wọlé" @@ -469,8 +161,8 @@ msgstr "òfin ibiṣẹ́" msgid "auth.terms-privacy-agreement" msgstr "" -"\"nígbà, tí o bá ń ṣẹ̀dá àkáùntí tuntun ,o gbọ́dọ̀ gba àwọn òfin ibiṣẹ́ àti " -"àṣírí rẹ́`." +"\"nígbà, tí o bá ń ṣẹ̀dá àkáùntí tuntun ,o gbọ́dọ̀ gba àwọn òfin ibiṣẹ́ " +"àti àṣírí rẹ́`." #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" @@ -480,6 +172,9 @@ msgstr "a ti fi ìjẹ́rìísí ránsẹ́ sínú ímeèlì rẹ" msgid "branding-illustrations-marketing-pieces" msgstr ".. ìyàsọ́tọ, àpèjúwe,títajà nǹkan, abbl." +msgid "common.publish" +msgstr "ìgbéjáde" + msgid "common.share-link.all-users" msgstr "gbogbo àwọn tó ń lo pẹ́ńpọtì" @@ -536,8 +231,8 @@ msgstr "kẹ́gbẹ́ ṣera wọn lọ́kan" #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.tutorial-hero.info" msgstr "" -"\"kọ́ nípa kókó bi pẹ́ńpọtì nígbàtí ò ń dára rẹ láraya nípa fífi àwon ọwọ́ " -"rẹ ṣe “ “ìdánilẹ́kọ̀ọ́ ." +"\"kọ́ nípa kókó bi pẹ́ńpọtì nígbàtí ò ń dára rẹ láraya nípa fífi àwon " +"ọwọ́ rẹ ṣe “ “ìdánilẹ́kọ̀ọ́ ." #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.tutorial-hero.start" @@ -551,6 +246,10 @@ msgstr "gbọ́wọ́ lórí idánilẹ́kọ̀ọ́" msgid "dasboard.walkthrough-hero.info" msgstr "rìn kàákiri pẹ́ńpọti kí o lè mọ kókó àwẹn ẹ̀yà ara rẹ̀." +#: src/app/main/ui/dashboard/projects.cljs +msgid "dasboard.walkthrough-hero.start" +msgstr "bẹ̀rẹ̀ ìrìn kiri" + #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.walkthrough-hero.title" msgstr "wò ó bí o ṣe ń rìn kiri" @@ -565,8 +264,7 @@ msgstr "ṣe àyẹ̀wò àmì tókìnnì tí o ṣẹ̀dá bó ṣeyẹ." #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.empty.add-one" -msgstr "" -"tẹ bọ́tìnnì \" ṣe ìpilẹ̀sẹ̀ àmì tókìnnì tuntun\" láti ṣe ìpilẹ̀sẹ̀ òmíràn." +msgstr "tẹ bọ́tìnnì \" ṣe ìpilẹ̀sẹ̀ àmì tókìnnì tuntun\" láti ṣe ìpilẹ̀sẹ̀ òmíràn." #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.empty.no-access-tokens" @@ -616,8 +314,8 @@ msgstr "àmì tokìnnì ìwọlé ti ara ẹni" msgid "dashboard.access-tokens.personal.description" msgstr "" "Iṣẹ́ àmì tókìnì ìwọlé ti ara ẹni dàbì ọ̀nà kejí tí a le gbà wọlé/ ọ̀rọ̀- " -"agbaniwọle a lè lo ìfàsẹ sí ètò láti gbaye fún ohun èlò à tì wọlé pẹ́ń" -"pọtì ti abẹ́nú api" +"agbaniwọle a lè lo ìfàsẹ sí ètò láti gbaye fún ohun èlò à tì wọlé " +"pẹ́ńpọtì ti abẹ́nú api" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.token-will-expire" @@ -669,8 +367,8 @@ msgstr "ṣe ẹ̀dà %s fáìlì" #, markdown msgid "dashboard.empty-placeholder-drafts" msgstr "" -"\"\" fáìlí tí a dàpọ̀ mọ yàrá ìkàwé á hàn níbí yìí. gbìyànjú láti má a pín " -"àwon fáìlì rẹ̀ tàbí ṣàfikún láti ibi [yàrá ìkàwé wa àti àwòṣe " +"\"\" fáìlí tí a dàpọ̀ mọ yàrá ìkàwé á hàn níbí yìí. gbìyànjú láti má a " +"pín àwon fáìlì rẹ̀ tàbí ṣàfikún láti ibi [yàrá ìkàwé wa àti àwòṣe " "](https://penpot.app/libraries-templates.html)." msgid "dashboard.export-binary-multi" @@ -759,11 +457,11 @@ msgstr "àwọn fọ́ǹtì tí o ọpulóòdù yó hàn níbí." #, markdown msgid "dashboard.fonts.hero-text1" msgstr "" -"èyíkéyìí wẹ́bù fọ́ǹtì tí o bá ti ọpulóòdù níbí ni á di àkópọ̀ mọ́ ẹbí fọ́ǹ" -"tì àwọn ọ̀rọ̀ ohun ìní tí o wà nínú àwọn fáìlì ẹgbẹ́. Fọ́ǹtì pẹ̀lú u " -"orúkọ ẹbi fọ́ǹtì kanna la ó dàpọ̀ mọ́ ẹgbẹ́ bí i**ẹbí fọ́ǹtì kan soso**. O " -"lè ọpulóòdù fọ́ǹtì pẹ̀lú àwọn ìlànà wọ̀nyí: **TTF, OTF and WOFF** (ẹyọ kan " -"péré la ó nílò)." +"èyíkéyìí wẹ́bù fọ́ǹtì tí o bá ti ọpulóòdù níbí ni á di àkópọ̀ mọ́ ẹbí " +"fọ́ǹtì àwọn ọ̀rọ̀ ohun ìní tí o wà nínú àwọn fáìlì ẹgbẹ́. Fọ́ǹtì " +"pẹ̀lú u orúkọ ẹbi fọ́ǹtì kanna la ó dàpọ̀ mọ́ ẹgbẹ́ bí i**ẹbí fọ́ǹtì kan " +"soso**. O lè ọpulóòdù fọ́ǹtì pẹ̀lú àwọn ìlànà wọ̀nyí: **TTF, OTF and " +"WOFF** (ẹyọ kan péré la ó nílò)." #, markdown msgid "dashboard.fonts.hero-text2" @@ -782,11 +480,20 @@ msgid "dashboard.fonts.warning-text" msgstr "" "a ti ṣàwárí àwọn ohun tí ó le fa wàhálà nínú àwọn fọ́ǹtì ìlànà olóòro " "oríṣiríṣi àwọn ètò tó wà fún ìṣesí ọ̀nà ẹ̀rọ. láti ṣe àyẹ̀wò rẹ̀ o lè " -"lofont vertical metrics services like ìlànà fọ́ǹtì olóòró fún àwọn iṣẹ́ ọ̀" -"nà ẹ̀rọ bí i [èyí èkínní](https://mẹ́tíríkì ìlànà olóòró.netlify .app/). Ní " -"àfikún, a rẹkọmẹ́ǹdì lílo[tíráńsìfọtà(https://tíráńsìfọtà.org/) láti " +"lofont vertical metrics services like ìlànà fọ́ǹtì olóòró fún àwọn iṣẹ́ " +"ọ̀nà ẹ̀rọ bí i [èyí èkínní](https://mẹ́tíríkì ìlànà olóòró.netlify .app/). " +"Ní àfikún, a rẹkọmẹ́ǹdì lílo[tíráńsìfọtà(https://tíráńsìfọtà.org/) láti " "pilẹ̀ṣẹ̀ àwọn wẹ́bù fọ́ǹtì láti túnṣeàsìṣe. " +msgid "dashboard.import" +msgstr "gbé àwọn fáìlì pẹ́ńpọtì wọlé" + +msgid "dashboard.import.analyze-error" +msgstr "ooho! a kò lè gbé fáìlì yìí wọlé" + +msgid "dashboard.import.import-error" +msgstr "wàhálà wà láti gbé kan wà láti gbé fáìlì wọlé . fáìlì kò wọlé." + msgid "dashboard.import.import-warning" msgstr "àwọn fáìlì tí ó ní nǹkan tí kò fẹsẹ múlẹ̀ ti di yíyọ kúro." @@ -828,6 +535,10 @@ msgstr "ṣe ìwákiri ọ̀pọ̀ wọn kí o sì mọ bí ó ṣe sojúṣe ti msgid "dashboard.libraries-and-templates.import-error" msgstr "wàhálà wà fún gbígbé tẹ́ńpílétì wọlé. tẹ́ńpílétì kò wọlé." +#: src/app/main/ui/dashboard/libraries.cljs +msgid "dashboard.libraries-title" +msgstr "yàrá ìkàwé" + #: src/app/main/ui/dashboard/grid.cljs msgid "dashboard.loading-files" msgstr "ṣe ìkójọpọ̀ àwọn fáìlí rẹ …" @@ -942,6 +653,18 @@ msgstr "fi gbogbo àwn fáìlì hàn" msgid "dashboard.success-delete-project" msgstr "iṣẹ́ àgbéṣe rẹ ti parẹ́ dáadáa" +#: src/app/main/ui/dashboard/project_menu.cljs +msgid "dashboard.success-duplicate-project" +msgstr "a ti ṣe ẹ̀dà iṣẹ́ àgbéṣe rẹ dáadáa" + +#: src/app/main/ui/dashboard/grid.cljs, src/app/main/ui/dashboard/sidebar.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-file" +msgstr "a ti gbé fáìlì rẹ kúro dáadáa" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-move-files" +msgstr "a ti gbé àwọn fáìlì rẹ kúrò dáadáa" + #: src/app/main/ui/dashboard/project_menu.cljs msgid "dashboard.success-move-project" msgstr "a ti gbé iṣẹ́ àgbéṣe rẹ kúrò dáadáa" @@ -995,9 +718,9 @@ msgstr "a ti ṣẹ̀dá ìkọ́-wẹ́bù dáadáa ." msgid "dashboard.webhooks.description" msgstr "" -"àwọn ìkọ́-wẹ́bù jẹ́ ọ̀nà tó rọrùn láti fi ààyè sílẹ̀ fún àwọn ààyè ayélujára " -"mìíràn àti awọn ápù ṣe filọ́ tí àwọn ìṣẹ̀lẹ̀ kan bá ní pẹ́ńpọtì’’ a ó fi " -"ìbéèrè ráńṣẹ́ sí ọ̀kọ̀kan wọn tí urls tó o pèsè." +"àwọn ìkọ́-wẹ́bù jẹ́ ọ̀nà tó rọrùn láti fi ààyè sílẹ̀ fún àwọn ààyè " +"ayélujára mìíràn àti awọn ápù ṣe filọ́ tí àwọn ìṣẹ̀lẹ̀ kan bá ní " +"pẹ́ńpọtì’’ a ó fi ìbéèrè ráńṣẹ́ sí ọ̀kọ̀kan wọn tí urls tó o pèsè." msgid "dashboard.webhooks.empty.add-one" msgstr "tẹ bọ́tínnì \"fikún ìkọ́- wẹ́bù\" láti fì kan sí i." @@ -1076,13 +799,16 @@ msgstr "o kò le lo ímeèlì rẹ gẹ́gẹ́ bí ọ̀rọ̀ ìgbaniwọlé" msgid "errors.email-has-permanent-bounces" msgstr "Ímeèlì «%s» ti ní ìjábọ̀ ọ̀pọ̀ọlọpọ̀ ìta-bọn-ọ̀n ti pẹ́." +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs +msgid "errors.email-invalid" +msgstr "Tẹ àti wọlé pẹ̀lú ímeèlì tó wúlo jọ̀wọ́" + #: src/app/main/ui/settings/change_email.cljs msgid "errors.email-invalid-confirmation" msgstr "Ímeèlì tí a ti mọ̀dájú gbọ́dọ̀ báramu" msgid "errors.email-spam-or-permanent-bounces" -msgstr "" -"Ímeèlì ti «%s» ń jábọ̀ gẹ́gẹ́ bí i awúrúju tàbí ìta-bọ̀n-ọnọǹ tipẹ́." +msgstr "Ímeèlì ti «%s» ń jábọ̀ gẹ́gẹ́ bí i awúrúju tàbí ìta-bọ̀n-ọnọǹ tipẹ́." #: src/app/main/errors.cljs msgid "errors.feature-not-supported" @@ -1129,27 +855,25 @@ msgstr "Ijẹ́rìísí ọ̀rọ̀ ìgbaniwọlé rẹ gbọ́dọ̀ báramu" msgid "errors.password-too-short" msgstr "Ọ̀rọ̀ ìgbaniwọlé kò gbọdọ̀ dín ní lẹ́tà mẹ́jọ" -msgid "errors.team-leave.insufficient-members" -msgstr "kí àwọn ọmọ ẹgbẹ́ tí kò péye fi ẹgbẹ́ sílẹ̀, àbí bóyá o fẹ́ paárẹ́ ni ." - -msgid "errors.team-leave.member-does-not-exists" -msgstr "Kòsí ọmọ ẹgbẹ́ tí o fẹ́ yàn ." - msgid "errors.profile-blocked" msgstr "Ti dínà mọ́ pírófáìlì" #: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/settings/change_email.cljs, src/app/main/ui/dashboard/team.cljs msgid "errors.profile-is-muted" -msgstr "" -"Ímeèlì pírófáìlì rẹ ti ní ìdákẹ́ (ìjábọ̀ àwúrúju tàbí ìtabọ̀n-ọ̀n tó ga)." +msgstr "Ímeèlì pírófáìlì rẹ ti ní ìdákẹ́ (ìjábọ̀ àwúrúju tàbí ìtabọ̀n-ọ̀n tó ga)." #: src/app/main/ui/auth/register.cljs msgid "errors.registration-disabled" msgstr "Ìforúkọ-sílẹ̀ kò ṣe é ṣe lọ́wọ́lọ́wọ́." +msgid "errors.team-leave.insufficient-members" +msgstr "kí àwọn ọmọ ẹgbẹ́ tí kò péye fi ẹgbẹ́ sílẹ̀, àbí bóyá o fẹ́ paárẹ́ ni ." + +msgid "errors.team-leave.member-does-not-exists" +msgstr "Kòsí ọmọ ẹgbẹ́ tí o fẹ́ yàn ." + msgid "errors.team-leave.owner-cant-leave" -msgstr "" -"Oní nǹkan kò le fi ẹgbẹ́ sílẹ̀ , o gbọ́dọ̀ tún ṣe àtúnyàn iṣẹ́ oní nǹkan." +msgstr "Oní nǹkan kò le fi ẹgbẹ́ sílẹ̀ , o gbọ́dọ̀ tún ṣe àtúnyàn iṣẹ́ oní nǹkan." #: src/app/main/data/media.cljs, src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs msgid "errors.unexpected-error" @@ -1172,6 +896,9 @@ msgstr "Èyí tí a fijíṣẹ́ kẹ́yìn kò dára." msgid "errors.webhooks.ssl-validation" msgstr "Àsìṣe nínú ìfẹwọ́sí SSL ." +msgid "errors.webhooks.timeout" +msgstr "Àkókò ti lọ" + msgid "errors.webhooks.unexpected" msgstr "Unexpected error on validating àsìṣe àìròtẹ́lẹ̀ lórí ìfọwọ́sí" @@ -1197,12 +924,8 @@ msgstr "Lọ ibi àpérò pẹ́ńpọtì" #: src/app/main/ui/settings/feedback.cljs msgid "feedback.discourse-subtitle1" msgstr "" -"Inú wa dùn láti rí ẹ níbí. Tí o bá nílò ìrànlọ́wọ, please search before you " -"jọ̀wọ́ ṣàwárí kí o tó firáńṣẹ́." - -#: src/app/main/ui/settings/feedback.cljs -msgid "feedback.title" -msgstr "Ímeèlì" +"Inú wa dùn láti rí ẹ níbí. Tí o bá nílò ìrànlọ́wọ, please search before " +"you jọ̀wọ́ ṣàwárí kí o tó firáńṣẹ́." #: src/app/main/ui/settings/feedback.cljs msgid "feedback.discourse-title" @@ -1215,10 +938,14 @@ msgstr "Kókó-ọ̀rọ̀" #: src/app/main/ui/settings/feedback.cljs msgid "feedback.subtitle" msgstr "" -"Jọ̀wọ́ ṣàpèjúwe ìdí tó wà fún ímeèlì rẹ, ṣàfihàn tì àríyànjiyàn bá wà, le jẹ́" -" èrò tàbí síṣe iyèméjì. Ìkan lára àwọn ọmọ ẹgbẹ́ wa yóò dáhùn láìpẹ́ " +"Jọ̀wọ́ ṣàpèjúwe ìdí tó wà fún ímeèlì rẹ, ṣàfihàn tì àríyànjiyàn bá wà, le " +"jẹ́ èrò tàbí síṣe iyèméjì. Ìkan lára àwọn ọmọ ẹgbẹ́ wa yóò dáhùn láìpẹ́ " "láìjìnnà." +#: src/app/main/ui/settings/feedback.cljs +msgid "feedback.title" +msgstr "Ímeèlì" + #: src/app/main/ui/settings/feedback.cljs #, fuzzy msgid "feedback.twitter-go-to" @@ -1413,6 +1140,27 @@ msgstr "Yan ìrísí, bọ́ọ̀dù tàbí ẹgbẹ́ láti lọ ṣe ìbẹ̀w msgid "inspect.tabs.code" msgstr "Kóòdù" +msgid "inspect.tabs.code.selected.circle" +msgstr "Àyíká" + +msgid "inspect.tabs.code.selected.component" +msgstr "Ẹ̀yà" + +msgid "inspect.tabs.code.selected.curve" +msgstr "Igun" + +msgid "inspect.tabs.code.selected.frame" +msgstr "Bọ́ọ̀dù" + +msgid "inspect.tabs.code.selected.group" +msgstr "Ẹgbẹ́" + +msgid "inspect.tabs.code.selected.image" +msgstr "Àwòrán" + +msgid "inspect.tabs.code.selected.mask" +msgstr "Ìbòjú" + #: src/app/main/ui/inspect/right_sidebar.cljs msgid "inspect.tabs.code.selected.multiple" msgstr "%s Ti yàn" @@ -1455,6 +1203,9 @@ msgstr "Alábòjútó" msgid "labels.all" msgstr "Gbogbo ẹ̀" +msgid "labels.and" +msgstr "àti" + msgid "labels.back" msgstr "Padá" @@ -1472,9 +1223,6 @@ msgstr "Ọ̀nà-àbáwọle búburú" msgid "labels.cancel" msgstr "Párẹ́" -msgid "labels.font-family" -msgstr "Ẹbí fọ́ǹtì" - msgid "labels.close" msgstr "Tì í" @@ -1575,6 +1323,9 @@ msgstr "Èsì kò siṣẹ́" msgid "labels.feedback-sent" msgstr "Èsì ti lọ" +msgid "labels.font-family" +msgstr "Ẹbí fọ́ǹtì" + msgid "labels.font-providers" msgstr "Àwọn Olùpèṣè fọ́ǹtì" @@ -1612,8 +1363,8 @@ msgstr "Fi àwọn fọ́ǹtì sí orí ẹ̀rọ" #: src/app/main/ui/static.cljs msgid "labels.internal-error.desc-message" msgstr "" -"Nǹkan bíburú ti ṣẹlè. Jọ̀wọ́ ṣe àtúnṣe iṣẹ́ náà àti pé tí wàhálà bá sì tẹ̀ " -"síwájú, ké sí olùbásọ̀rọ̀." +"Nǹkan bíburú ti ṣẹlè. Jọ̀wọ́ ṣe àtúnṣe iṣẹ́ náà àti pé tí wàhálà bá sì " +"tẹ̀ síwájú, ké sí olùbásọ̀rọ̀." #: src/app/main/ui/static.cljs msgid "labels.internal-error.main-message" @@ -1686,18 +1437,10 @@ msgstr "tàbí" msgid "labels.owner" msgstr "Oníǹkan" -#: src/app/main/ui/dashboard/sidebar.cljs -msgid "labels.projects" -msgstr "Àwọn iṣẹ́ àgbéṣe" - #: src/app/main/ui/settings/sidebar.cljs, src/app/main/ui/dashboard/sidebar.cljs msgid "labels.password" msgstr "Ọ̀rọ̀ ìgbaniwọlé" -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.release-notes" -msgstr "Fi àkọsílẹ̀ rẹ sílẹ̀" - #: src/app/main/ui/dashboard/team.cljs msgid "labels.pending-invitation" msgstr "Ńńdúró" @@ -1706,6 +1449,14 @@ msgstr "Ńńdúró" msgid "labels.profile" msgstr "Pírófáìlì" +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.projects" +msgstr "Àwọn iṣẹ́ àgbéṣe" + +#: src/app/main/ui/settings/sidebar.cljs +msgid "labels.release-notes" +msgstr "Fi àkọsílẹ̀ rẹ sílẹ̀" + #: src/app/main/ui/workspace.cljs msgid "labels.reload-file" msgstr "Tún gbé fáìlì sí i" @@ -1764,6 +1515,20 @@ msgstr "Sáfísì kòsí" msgid "labels.settings" msgstr "Àwọn ètò" +msgid "labels.share-prototype" +msgstr "Pín àwọn ohun tí a ti kọ tẹ́lẹ̀" + +#: src/app/main/ui/dashboard/sidebar.cljs +msgid "labels.shared-libraries" +msgstr "Yàrá ìkáwe" + +#: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs +msgid "labels.show-all-comments" +msgstr "Fi gbogbo kọ́mẹ́ǹtì hàn" + +msgid "labels.show-comments-list" +msgstr "Fi àkójọ àwọn kọ́mẹ́ǹtì hàn" + #: src/app/main/ui/workspace/comments.cljs, src/app/main/ui/viewer/header.cljs msgid "labels.show-your-comments" msgstr "Fi àwọn kọ́mẹ́ǹtì tìrẹ nìkan hàn" @@ -2038,6 +1803,9 @@ msgstr "Yọ ọmọ ẹgbẹ́ kúrò" msgid "modals.delete-webhook.accept" msgstr "Pa ìkọ́-wẹ́bù rẹ́" +msgid "modals.delete-webhook.message" +msgstr "Ṣe ó dá ọ lójú pé o fẹ́ pa ìkọ́-wẹ́bù yìí rẹ́?" + msgid "modals.delete-webhook.title" msgstr "Pa ìkọ́- wẹ́bù rẹ́" @@ -2066,20 +1834,17 @@ msgstr "Pe àwọn ọmọ ẹgbẹ́ sínú ẹgbẹ́" #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.leave-and-close-confirm.hint" msgstr "" -"Gẹ́gẹ́ bí o ṣe jẹ́ ìwọ nìkan ni ọmọ ẹgbẹ́ nínú ẹgbẹ́ yìí, a ó yọ ẹgbẹ́ kúrò " -"pẹ̀lú iṣẹ́ àgbéṣe rẹ̀ àti àwọn fáìlì." +"Gẹ́gẹ́ bí o ṣe jẹ́ ìwọ nìkan ni ọmọ ẹgbẹ́ nínú ẹgbẹ́ yìí, a ó yọ ẹgbẹ́ " +"kúrò pẹ̀lú iṣẹ́ àgbéṣe rẹ̀ àti àwọn fáìlì." #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.leave-and-close-confirm.message" msgstr "Ṣé ó dá ọ lójú pé o fẹ́ kúrò nínú %s ẹgbẹ́?" -msgid "modals.publish-empty-library.title" -msgstr "Gbé yàrá ìkàwé tó ṣófìfo jáde" - msgid "modals.leave-and-reassign.forbidden" msgstr "" -"O kò lè kúrò nínú ẹgbẹ́ tí kò bá sí ọmọ ẹgbẹ́ mìíràn tó ní ìgbéga sí oní ǹǹ" -"kan. O lè fẹ́ pa ẹgbẹ́ rẹ́." +"O kò lè kúrò nínú ẹgbẹ́ tí kò bá sí ọmọ ẹgbẹ́ mìíràn tó ní ìgbéga sí oní " +"ǹǹkan. O lè fẹ́ pa ẹgbẹ́ rẹ́." #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.leave-and-reassign.hint1" @@ -2116,10 +1881,6 @@ msgstr "Ń fi ẹgbẹ́ sílẹ̀" msgid "modals.nudge-title" msgstr "Fi kún iye tó jẹ́" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.remove-shared-confirm.accept" -msgstr "Yọ ọ́ kúrò gẹ́gẹ́ bí i yàrá ìkàwé pípín" - #: src/app/main/ui/dashboard/team.cljs msgid "modals.promote-owner-confirm.accept" msgstr "Gbé ẹni tó ni nǹkan" @@ -2127,8 +1888,8 @@ msgstr "Gbé ẹni tó ni nǹkan" #: src/app/main/ui/dashboard/team.cljs msgid "modals.promote-owner-confirm.hint" msgstr "" -"Tí o bá gbé ẹni tí ó ni nǹkan, o ó yìí ojúṣe rẹ pada sí Alábòjútó, losing " -"àwọn ìgbà láàyè díẹ̀ á wà fún ẹgbẹ́ yìí. " +"Tí o bá gbé ẹni tí ó ni nǹkan, o ó yìí ojúṣe rẹ pada sí Alábòjútó, losing " +" àwọn ìgbà láàyè díẹ̀ á wà fún ẹgbẹ́ yìí. " #: src/app/main/ui/dashboard/team.cljs msgid "modals.promote-owner-confirm.message" @@ -2140,9 +1901,19 @@ msgstr "" msgid "modals.promote-owner-confirm.title" msgstr "Ẹni tó ni ẹgbẹ́ tuntun" +msgid "modals.publish-empty-library.accept" +msgstr "Kọ ọ́ jáde" + msgid "modals.publish-empty-library.message" msgstr "Yàrá ìkàwé rẹ ṣófìfo. Ṣé ó dá ọ lójú pé o fẹ́ kọ ọ́ jáde?" +msgid "modals.publish-empty-library.title" +msgstr "Gbé yàrá ìkàwé tó ṣófìfo jáde" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.remove-shared-confirm.accept" +msgstr "Yọ ọ́ kúrò gẹ́gẹ́ bí i yàrá ìkàwé pípín" + #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "modals.remove-shared-confirm.hint" msgstr "" @@ -2153,6 +1924,16 @@ msgstr "" msgid "modals.remove-shared-confirm.message" msgstr "Yọ ọ́ kúrò“%s” gẹ́gẹ́ bí yàrá ìkàwé pípín" +#: src/app/main/ui/workspace/nudge.cljs +msgid "modals.small-nudge" +msgstr "Fọwọ́ làn-ań díẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "modals.update-remote-component-in-bulk.hint" +msgstr "" +"O ṣetán láti mú àwọn ẹ̀yà irin iṣẹ́ dé ojú ìwọ̀n ní yàrá ìkàwé pípín. Èyí " +"le fa wàhálà fún àwọn fáìlì mìíràn tí ó ń lò ó." + #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs msgid "modals.update-remote-component-in-bulk.message" msgstr "Mú àwọn ẹ̀yà irin iṣẹ́ dójú ìwọ̀n nínú iyàram ìkàwé pípín" @@ -2175,16 +1956,6 @@ msgstr "" msgid "modals.update-remote-component.message" msgstr "Mú ẹ̀yà iyàrá ìkàwé pípín kan dójú ìwọ̀n" -#: src/app/main/ui/workspace/nudge.cljs -msgid "modals.small-nudge" -msgstr "Fọwọ́ làn-ań díẹ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs -msgid "modals.update-remote-component-in-bulk.hint" -msgstr "" -"O ṣetán láti mú àwọn ẹ̀yà irin iṣẹ́ dé ojú ìwọ̀n ní yàrá ìkàwé pípín. Èyí " -"le fa wàhálà fún àwọn fáìlì mìíràn tí ó ń lò ó." - #: src/app/main/data/common.cljs msgid "notifications.by-code.upgrade-version" msgstr "Ẹ̀yà tuntun ti wà, jọ̀wọ́ tún sọ ọ́ jí" @@ -2197,16 +1968,9 @@ msgstr "Ìfipè tí a fi ránńṣẹ́ ti lọ dáadáa" msgid "notifications.invitation-link-copied" msgstr "ti ṣe àdàkọ ìfipè ọ̀nà ìtọ́ka sí" -msgid "onboarding-v2.welcome.desc2" -msgstr "" -"Ìkẹ́kọ̀ọ́ ìta gbangba, pín-in kí ẹ sì jí ròrò nípa Pẹ́ńpọtì, ibi tó wà " -"lọ́wọ́lọ́wọ́ ọ̀jọ́ iwájú pẹ̀lú gbogbo agbègbè àti ìmójútó ẹgbẹ́ pẹ́ńpọtì " -". ." - #: src/app/main/ui/settings/delete_account.cljs msgid "notifications.profile-deletion-not-allowed" -msgstr "" -"O kò le è yọ pírófáìlì rẹ kúro. Ṣe àtún yàn àwọn ẹgbẹ́ kí o tó tẹ̀ síwájú." +msgstr "O kò le è yọ pírófáìlì rẹ kúro. Ṣe àtún yàn àwọn ẹgbẹ́ kí o tó tẹ̀ síwájú." #: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs msgid "notifications.profile-saved" @@ -2218,9 +1982,9 @@ msgstr "Verification email sent to %s. Check your email!" msgid "onboarding-v2.before-start.desc1" msgstr "" -"O ní láti mọ̀ pé oríṣiríṣi ohu ohun èlò ló wà láti ràn ọ́ lọ́wọ́ láti rí gbà " -"bẹ̀rẹ̀ pẹ̀lú Pẹ́ńpọtì, gẹ́gẹ́ bí ohun èlò ìtọ́nisọ́nà àti yútuùbù wa fún " -"ìlànà ìbáni sọ̀rọ̀." +"O ní láti mọ̀ pé oríṣiríṣi ohu ohun èlò ló wà láti ràn ọ́ lọ́wọ́ láti rí " +"gbà bẹ̀rẹ̀ pẹ̀lú Pẹ́ńpọtì, gẹ́gẹ́ bí ohun èlò ìtọ́nisọ́nà àti yútuùbù wa " +"fún ìlànà ìbáni sọ̀rọ̀." msgid "onboarding-v2.before-start.desc2" msgstr "" @@ -2246,8 +2010,8 @@ msgstr "" msgid "onboarding-v2.newsletter.news" msgstr "" -"Fí ìròyìn ránńṣẹ́ sí mi nípa Pẹ́ńpọtì (àwọn bulọ́ọ̀gì,àwọn fídiò ìbáṣepọ̀, " -"àwọn sísàn wọlé...)." +"Fí ìròyìn ránńṣẹ́ sí mi nípa Pẹ́ńpọtì (àwọn bulọ́ọ̀gì,àwọn fídiò " +"ìbáṣepọ̀, àwọn sísàn wọlé...)." msgid "onboarding-v2.newsletter.privacy1" msgstr "Ìfi pamọ́ jẹ wá lógún, ní bí o le kà nípa wa " @@ -2265,16 +2029,19 @@ msgstr "" msgid "onboarding-v2.welcome.desc1" msgstr "" "Pẹ́ńpọtì ni orísun ìṣílẹ̀kùn àti pe Kálẹidòsìló ṣe é àti àwọn agbègbè, Ní " -"bi ọ̀pọ̀lọpọ̀ àwọn ènìyàn ti ran ara wọn lọ́wọ́ tẹ́lẹ̀ . Gbgbo wọn ló lè ṣe " -"àjùmọ̀ṣenípa:" +"bi ọ̀pọ̀lọpọ̀ àwọn ènìyàn ti ran ara wọn lọ́wọ́ tẹ́lẹ̀ . Gbgbo wọn ló lè " +"ṣe àjùmọ̀ṣenípa:" -msgid "onboarding-v2.welcome.desc3" +msgid "onboarding-v2.welcome.desc2" msgstr "" -"Ibi tí a ó ti ri bí a ó ti ṣe àjùmọ̀ṣepọ̀ pẹ̀lú àwọn ìtumọ̀, àwọn ìbéèrè ẹ̀" -"yà ara ẹ̀rọ, ìmójútó síṣe ojúṣe, ìṣọdẹ kòkòrò…" +"Ìkẹ́kọ̀ọ́ ìta gbangba, pín-in kí ẹ sì jí ròrò nípa Pẹ́ńpọtì, ibi tó wà " +"lọ́wọ́lọ́wọ́ ọ̀jọ́ iwájú pẹ̀lú gbogbo agbègbè àti ìmójútó ẹgbẹ́ pẹ́ńpọtì . " +" ." -msgid "onboarding.welcome.alt" -msgstr "Pẹ́ńpọtì" +msgid "onboarding-v2.welcome.desc3" +msgstr "" +"Ibi tí a ó ti ri bí a ó ti ṣe àjùmọ̀ṣepọ̀ pẹ̀lú àwọn ìtumọ̀, àwọn ìbéèrè " +"ẹ̀yà ara ẹ̀rọ, ìmójútó síṣe ojúṣe, ìṣọdẹ kòkòrò…" msgid "onboarding-v2.welcome.desc3.title" msgstr "Sísojúṣe ìtọ́sẹ́nà" @@ -2320,9 +2087,9 @@ msgstr "Ṣẹ̀dá ẹgbẹ́ kan" msgid "onboarding.team-modal.create-team-desc" msgstr "" -"A team allows you to collaborate with other Penpot users working in the Ẹgbẹ́" -" kan yí ó gbà ọ́ láyè láti lè siṣẹ́pọ̀ pẹ̀lú àwọn onílò pẹ́ńpọti tí ó siṣẹ́ " -"nínú àwọn fáìlì àti àwọn iṣẹ́ àgbéṣe kan náà ." +"A team allows you to collaborate with other Penpot users working in the " +"Ẹgbẹ́ kan yí ó gbà ọ́ láyè láti lè siṣẹ́pọ̀ pẹ̀lú àwọn onílò pẹ́ńpọti tí ó " +"siṣẹ́ nínú àwọn fáìlì àti àwọn iṣẹ́ àgbéṣe kan náà ." msgid "onboarding.team-modal.create-team-feature-1" msgstr "Àwọn fáìlì àti àwọn iṣẹ́ àgbéṣe tí kò lópin" @@ -2345,6 +2112,9 @@ msgstr "Àwọn àwòṣe díẹ̀ nìyí níbí." msgid "onboarding.templates.title" msgstr "Bẹ̀rẹ̀ sí ṣe ẹ̀yà alárà" +msgid "onboarding.welcome.alt" +msgstr "Pẹ́ńpọtì" + #: src/app/main/ui/auth/recovery.cljs msgid "profile.recovery.go-to-login" msgstr "Lọ láti wọlé" @@ -2361,6 +2131,18 @@ msgstr "Mọ́kànlá-Ọgbọ̀n" msgid "questions.2-10" msgstr "Méjì – mẹ́wàá" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.31-50" +msgstr "Mọ́kànlélọ́gbọ̀n-Àádọ́ta" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.a-lot" +msgstr "O ´ pọ̀jù" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.adobe-xd" +msgstr "Àdòbí XD" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.canva" msgstr "Káńfà" @@ -2395,6 +2177,10 @@ msgstr "Olùdásílẹ̀/VP" msgid "questions.freelancer" msgstr "Oníṣẹ́ ni mí" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.get-the-code-from-my-team-project" +msgstr "Gba kóòdù láti inú iṣẹ́ àgbéṣe mi " + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.interface-design-visual-assets-design-systems" msgstr "... wíwò ètò ọnà , ìrírí àwọn ohun ìní, àwọn ètò ọnà, abbl." @@ -2411,10 +2197,6 @@ msgstr "Fi èsì sílẹ̀ fún iṣẹ́ àgbéṣe ẹgbẹ́ mi" msgid "questions.lets-get-started" msgstr "Ẹjẹ́ 'ká bẹ̀rẹ̀ !" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "Gba kóòdù láti inú iṣẹ́ àgbéṣe mi " - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.manager" msgstr "Ohun títà tàbí iṣẹ́ àgbéṣe Olùṣàkóso" @@ -2431,18 +2213,10 @@ msgstr "Ju àádọ́ta lọ" msgid "questions.next" msgstr "Èyí tó kàn" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.select-option" -msgstr "Ṣe àṣàyàn" - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.none" msgstr "Kòsí" -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Yàwòrán" - #: src/app/main/ui/onboarding/questions.cljs msgid "questions.other" msgstr "Òmíìràn(ní pàtó)" @@ -2459,6 +2233,14 @@ msgstr "Tàtẹ̀yìn wá" msgid "questions.questions-how-are-you-planning-to-use-penpot" msgstr "Báwo lo ṣe ń gbèrò lórí bí o ṣe lo pẹ́ńpọtì?" +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.select-option" +msgstr "Ṣe àṣàyàn" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.sketch" +msgstr "Yàwòrán" + #: src/app/main/ui/onboarding/questions.cljs msgid "questions.some" msgstr "Díẹ̀" @@ -3041,6 +2823,14 @@ msgstr "Ibaraenisépọ̀" msgid "viewer.header.interactions-section" msgstr "Awọ̀n Ibaraenisépọ̀ (%s)" +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.share.copy-link" +msgstr "Da línkì kọ̀" + +#: src/app/main/ui/viewer/header.cljs +msgid "viewer.header.show-interactions" +msgstr "Ifihan Ibaraenisépọ̀" + #: src/app/main/ui/viewer/header.cljs msgid "viewer.header.sitemap" msgstr "Áwòran átọ̀kà ílẹ̀" @@ -3433,6 +3223,18 @@ msgstr "%s awọn íwè itẹ̀wé" msgid "workspace.libraries.update" msgstr "ímùdojúiwọn" +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.libraries.update.see-all-changes" +msgstr "wò gbògbò awọn ayípàdà" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.updates" +msgstr "Awọn ímùdojúiwọn" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.add-interaction" +msgstr "Tẹ amí + làtí fi íbàràénisépọ̀ kun" + #: src/app/main/ui/workspace/sidebar/options/menus/blur.cljs msgid "workspace.options.blur-options.title" msgstr "Baìbaì" @@ -3501,6 +3303,10 @@ msgstr "Ókè" msgid "workspace.options.constraints.topbottom" msgstr "Ókè ati Ídí" +#: src/app/main/ui/workspace/sidebar/options.cljs +msgid "workspace.options.design" +msgstr "Ónirú" + #: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, src/app/main/ui/inspect/exports.cljs msgid "workspace.options.export" msgstr "Sí ilẹ́ òkèeré" @@ -3521,14 +3327,6 @@ msgstr "Gbígbè okeere …" msgid "workspace.options.exporting-object-error" msgstr "Gbígbè okeere kuna" -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.bottom" -msgstr "ìsàlẹ̀" - -#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs -msgid "workspace.options.grid.params.type.center" -msgstr "Àárín" - #: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs msgid "workspace.options.fill" msgstr "Kún" @@ -3588,6 +3386,14 @@ msgstr "Ìwọ̀n" msgid "workspace.options.grid.params.type" msgstr "Irú" +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.bottom" +msgstr "ìsàlẹ̀" + +#: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs +msgid "workspace.options.grid.params.type.center" +msgstr "Àárín" + #: src/app/main/ui/workspace/sidebar/options/menus/frame_grid.cljs msgid "workspace.options.grid.params.type.left" msgstr "Òsì" @@ -3628,6 +3434,9 @@ msgstr "Ẹ̀kún ẹgbẹ́" msgid "workspace.options.group-stroke" msgstr "Ẹgba ẹgbẹ́" +msgid "workspace.options.height" +msgstr "Gíga" + msgid "workspace.options.inspect" msgstr "Ṣàyẹ̀wò" @@ -3722,26 +3531,6 @@ msgstr "Inú" msgid "workspace.options.interaction-mouse-enter" msgstr "Atọ́ka ìwọnú" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-left" -msgstr "Ìsàlẹ̀ òsì" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-bottom-right" -msgstr "Ìsàḷ̀ẹ̀ ọ̀tún" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-center" -msgstr "Àárín" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-manual" -msgstr "Aláfọwóṣe" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-center" -msgstr "Àárín òkè" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-mouse-leave" msgstr "Atọ́ka kíkúrò" @@ -3762,14 +3551,22 @@ msgstr "Lílo kiri sí: %s" msgid "workspace.options.interaction-none" msgstr "(Akò ṣètò)" -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-pos-top-left" -msgstr "Òkè òsì" - #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-offset-effect" msgstr "Ipa àìṣedédé" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-on-click" +msgstr "Tẹ orí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay" +msgstr "Ṣíìtẹ̀lé ìlànà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-open-overlay-dest" +msgstr "Ṣí ìtẹ̀lé ìlànà: %s" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-open-url" msgstr "Ṣí URL" @@ -3782,21 +3579,69 @@ msgstr "Jáde" msgid "workspace.options.interaction-pos-bottom-center" msgstr "Àáriń ìsàlẹ̀" +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-left" +msgstr "Ìsàlẹ̀ òsì" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-bottom-right" +msgstr "Ìsàḷ̀ẹ̀ ọ̀tún" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-center" +msgstr "Àárín" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-manual" +msgstr "Aláfọwóṣe" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-center" +msgstr "Àárín òkè" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-pos-top-left" +msgstr "Òkè òsì" + #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-pos-top-right" msgstr "Òkè ọ̀tún" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-position" -msgstr "Ipò" +msgid "workspace.options.interaction-position" +msgstr "Ipò" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-preserve-scroll" +msgstr "Ṣe ìtọ́jú ipò àyílọ" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-prev-screen" +msgstr "Aṣàfihàn àtẹ̀yìnwá" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-relative-to" +msgstr "Ìbátan sí" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-self" +msgstr "Tìkara" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay" +msgstr "Àyípadà ìtẹ̀lé ìlànà" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.interaction-toggle-overlay-dest" +msgstr "Àyípadà ìtẹ̀lé ìlànà: %s" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-preserve-scroll" -msgstr "Ṣe ìtọ́jú ipò àyílọ" +msgid "workspace.options.interaction-trigger" +msgstr "Okùnfà" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.interaction-prev-screen" -msgstr "Aṣàfihàn àtẹ̀yìnwá" +msgid "workspace.options.interaction-url" +msgstr "URL" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.interaction-while-hovering" @@ -3934,6 +3779,34 @@ msgstr "Ìlà òòró" msgid "workspace.options.layout.direction.column-reverse" msgstr "Ìlà òòró yíyípadà" +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row" +msgstr "Ilà ìbú" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.direction.row-reverse" +msgstr "Ilà ìbú yíyípadà" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.gap" +msgstr "Àlàfo" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs +msgid "workspace.options.layout.left" +msgstr "Òsì" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin" +msgstr "Etí ìwé" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin-all" +msgstr "Gbogbo àwọn àwòrán" + +#: src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +msgid "workspace.options.layout.margin-simple" +msgstr "Etí ìwé ẹyọ" + #: src/app/main/ui/workspace/sidebar/options/menus/layout.cljs msgid "workspace.options.layout.packed" msgstr "tí wọn dì" @@ -4008,30 +3881,6 @@ msgstr "Òkè ọ̀tún" msgid "workspace.options.radius.all-corners" msgstr "Àwọn gbogbo igun" -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.blur" -msgstr "Rẹ́súrẹ́sú" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.drop-shadow" -msgstr "Da òjìjí" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.inner-shadow" -msgstr "Òjìjí inú" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.offsetx" -msgstr "X" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.offsety" -msgstr "Y" - -#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs -msgid "workspace.options.shadow-options.spread" -msgstr "Tànkálẹ̀" - #: src/app/main/ui/workspace/sidebar/options/menus/measures.cljs msgid "workspace.options.radius.single-corners" msgstr "Àwọn igun olómìnira" @@ -4068,6 +3917,33 @@ msgstr "Ìmúṣẹ tí a yàn" msgid "workspace.options.selection-stroke" msgstr "Ipò ìlù tí a yàn" +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.blur" +msgstr "Rẹ́súrẹ́sú" + +msgid "workspace.options.shadow-options.color" +msgstr "Àwọ̀ òjíjí" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.drop-shadow" +msgstr "Da òjìjí" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.inner-shadow" +msgstr "Òjìjí inú" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsetx" +msgstr "X" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsety" +msgstr "Y" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.spread" +msgstr "Tànkálẹ̀" + #: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs msgid "workspace.options.shadow-options.title" msgstr "Òjìjí" @@ -4076,10 +3952,6 @@ msgstr "Òjìjí" msgid "workspace.options.shadow-options.title.group" msgstr "Àwùjọ òjìjí" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker" -msgstr "Àmì alápoméjì" - #: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs msgid "workspace.options.shadow-options.title.multiple" msgstr "Òjìjí tí a yàn" @@ -4123,14 +3995,6 @@ msgstr "Dáyámọ́ǹdì" msgid "workspace.options.stroke-cap.line-arrow" msgstr "Ọfà ìlà" -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "Onígun mẹ́rin" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow" -msgstr "Ofà onígun mẹ́ta" - #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.line-arrow-short" msgstr "Ofà" @@ -4147,6 +4011,18 @@ msgstr "Yíká" msgid "workspace.options.stroke-cap.square" msgstr "Alápoméjì" +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker" +msgstr "Àmì alápoméjì" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Onígun mẹ́rin" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow" +msgstr "Ofà onígun mẹ́ta" + #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs msgid "workspace.options.stroke-cap.triangle-arrow-short" msgstr "Onígun mẹ́ta" @@ -4404,6 +4280,51 @@ msgstr "Ìyí padà olóòró" msgid "workspace.shape.menu.flow-start" msgstr "Ìbẹ̀rè ìṣàn" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.forward" +msgstr "Mú wá sọ́wọ́ iwájú" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.front" +msgstr "Mú wá sí wájú" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.go-main" +msgstr "Lọ sí olórí fáìlì àkóónú" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.group" +msgstr "Àwùjọ" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.hide" +msgstr "Tọ́jú" + +msgid "workspace.shape.menu.hide-ui" +msgstr "Fihàn/ Tọ́jú UI" + +msgid "workspace.shape.menu.intersection" +msgstr "Ìkòríta" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.lock" +msgstr "Tì" + +#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.mask" +msgstr "Ìbòjú" + +#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.paste" +msgstr "lẹ̀mọ́" + +msgid "workspace.shape.menu.path" +msgstr "Ipa ọ̀nà" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-flex" +msgstr "Yọ àrọ ètò ìrísí kúrò" + #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.reset-overrides" msgstr "Ṣe àtúnṣe ìdojúkọ" @@ -4443,6 +4364,38 @@ msgstr "Ṣe àìkójọ" msgid "workspace.shape.menu.union" msgstr "Ìbáṣepò" +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.unlock" +msgstr "Ṣíí" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.unmask" +msgstr "Sí ìbòjú" + +#: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/sidebar/options/menus/component.cljs, src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.update-components-in-bulk" +msgstr "Mímú àwọn ọ̀rọ̀ àkóónú pàtàkì dójú ìwọ̀n" + +msgid "workspace.sidebar.collapse" +msgstr "Wó òpó ègbẹ́" + +msgid "workspace.sidebar.expand" +msgstr "Fẹ òpó ẹ̀gbẹ́" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.sidebar.history" +msgstr "Ìtàn (%s)" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.sidebar.layers" +msgstr "Àwọn ìpele" + +msgid "workspace.sidebar.layers.components" +msgstr "Àwọn àkóónú" + +msgid "workspace.sidebar.layers.frames" +msgstr "Àwọn pátákó" + msgid "workspace.sidebar.layers.groups" msgstr "Àkójọ" @@ -4461,6 +4414,14 @@ msgstr "Àwọn ìrísí" msgid "workspace.sidebar.layers.texts" msgstr "Àwọn àyọkà" +#: src/app/main/ui/workspace/sidebar/options/menus/svg_attrs.cljs, src/app/main/ui/inspect/attributes/svg.cljs +msgid "workspace.sidebar.options.svg-attrs.title" +msgstr "Gbígbé àwọn ànímọ́ SVG wọlé wá" + +#: src/app/main/ui/workspace/sidebar/sitemap.cljs +msgid "workspace.sidebar.sitemap" +msgstr "Àwọn abala" + #: src/app/main/ui/workspace/header.cljs msgid "workspace.sitemap" msgstr "Máàpù ojú ìlà" @@ -4489,10 +4450,6 @@ msgstr "Àlàfo (%s)" msgid "workspace.toolbar.frame" msgstr "Pátákó (%s)" -#: src/app/main/ui/workspace/left_toolbar.cljs -msgid "workspace.toolbar.text" -msgstr "Àyọkà (%s)" - #: src/app/main/ui/workspace/left_toolbar.cljs msgid "workspace.toolbar.image" msgstr "Àwòrán(%s)" @@ -4513,6 +4470,10 @@ msgstr "Onígun mẹ́rin (%s)" msgid "workspace.toolbar.shortcuts" msgstr "Àwón ọ̀nà àbùjá (%s)" +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.text" +msgstr "Àyọkà (%s)" + #: src/app/main/ui/workspace/left_toolbar.cljs msgid "workspace.toolbar.text-palette" msgstr "Àwọn ohun ìtẹ̀wé (%s)" @@ -4542,12 +4503,6 @@ msgstr "Àwọn ohun àmúṣọrọ̀ àwọ̀" msgid "workspace.undo.entry.multiple.component" msgstr "Àkóónú" -msgid "workspace.undo.entry.multiple.multiple" -msgstr "Àwọn ǹǹkan" - -msgid "workspace.undo.entry.multiple.page" -msgstr "Àwọn ojú awé" - msgid "workspace.undo.entry.multiple.curve" msgstr "Àwọn ẹkọ̀rọ̀" @@ -4560,6 +4515,12 @@ msgstr "Àwọn àkójọ" msgid "workspace.undo.entry.multiple.media" msgstr "Àwọn ohun ìyì àwòrán" +msgid "workspace.undo.entry.multiple.multiple" +msgstr "Àwọn ǹǹkan" + +msgid "workspace.undo.entry.multiple.page" +msgstr "Àwọn ojú awé" + msgid "workspace.undo.entry.multiple.path" msgstr "Àwọn ẹ̀bá ọ̀nà" @@ -4575,6 +4536,40 @@ msgstr "Àwọn àyọkà" msgid "workspace.undo.entry.multiple.typography" msgstr "Àwọn ohun ìyì ìwé títẹ̀" +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.new" +msgstr "Titun %s" + +msgid "workspace.undo.entry.single.circle" +msgstr "Àyíká" + +msgid "workspace.undo.entry.single.color" +msgstr "Ohun àmúṣọrọ̀ àwọ̀" + +msgid "workspace.undo.entry.single.component" +msgstr "Àkóónú" + +msgid "workspace.undo.entry.single.curve" +msgstr "Ẹkọ̀rọ̀" + +msgid "workspace.undo.entry.single.frame" +msgstr "Pátákó" + +msgid "workspace.undo.entry.single.group" +msgstr "Àkójọ" + +msgid "workspace.undo.entry.single.image" +msgstr "Àwòrán" + +msgid "workspace.undo.entry.single.media" +msgstr "Ohun àmúṣọrọ̀ èyà àwòrán" + +msgid "workspace.undo.entry.single.multiple" +msgstr "Ohun" + +msgid "workspace.undo.entry.single.page" +msgstr "Ojú awẹ́" + msgid "workspace.undo.entry.single.path" msgstr "Pópó ònà" diff --git a/frontend/translations/zh_CN.po b/frontend/translations/zh_CN.po index 8fd68a73a..4771a1534 100644 --- a/frontend/translations/zh_CN.po +++ b/frontend/translations/zh_CN.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 13:04+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Chinese (Simplified) \n" +"Language-Team: Chinese (Simplified) " +"\n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -4823,10 +4823,6 @@ msgstr "文本(%s)" msgid "workspace.toolbar.text-palette" msgstr "排字式样 (%s)" -#, markdown -msgid "workspace.top-bar.read-only" -msgstr "**检查模式**(不可编辑)" - msgid "workspace.top-bar.read-only.done" msgstr "完成" @@ -4963,520 +4959,3 @@ msgstr "更新" msgid "workspace.viewport.click-to-close-path" msgstr "单击以闭合路径" - -msgid "workspace.layout_grid.editor.top-bar.locate" -msgstr "定位" - -msgid "workspace.layout_grid.editor.top-bar.done" -msgstr "完成" - -msgid "workspace.layout_grid.editor.options.edit-grid" -msgstr "编辑网格" - -msgid "workspace.layout_grid.editor.options.exit" -msgstr "退出" - -#: src/app/main/ui/workspace/textpalette.cljs -msgid "workspace.libraries.colors.empty-typography-palette" -msgstr "你的库中还没有排版风格" - -msgid "workspace.options.component.swap.empty" -msgstr "你的库中还没有素材" - -#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs -msgid "workspace.options.flows.flow" -msgstr "流程" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.diamond-marker-short" -msgstr "钻石" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.line-arrow-short" -msgstr "箭头" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.square-marker-short" -msgstr "矩形" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.triangle-arrow-short" -msgstr "三角形" - -msgid "workspace.top-bar.read-only.done" -msgstr "完成" - -msgid "media.solid" -msgstr "纯色" - -msgid "media.linear" -msgstr "线性" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.no-access-tokens" -msgstr "你目前还没有令牌。" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.errors-required-name" -msgstr "名称是必填项" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-180-days" -msgstr "180天" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-30-days" -msgstr "30天" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-60-days" -msgstr "60天" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-90-days" -msgstr "90天" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expiration-never" -msgstr "从不" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expired-on" -msgstr "已经于%s到期" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal" -msgstr "个人访问令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-expire" -msgstr "令牌将于%s到期" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.expires-on" -msgstr "将于%s到期" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.no-expiration" -msgstr "无到期时限" - -#: src/app/main/errors.cljs -msgid "errors.version-not-supported" -msgstr "文件具有不兼容的版本号" - -#: src/app/main/errors.cljs -msgid "errors.file-feature-mismatch" -msgstr "看起来当前启用的功能,与正在打开的文件所依赖的功能不匹配。在打开文件前,需要" -"应用对“%s”修改。" - -#: src/app/main/errors.cljs -msgid "errors.team-feature-mismatch" -msgstr "检测到不兼容功能“%s”" - -msgid "errors.validation" -msgstr "验证错误" - -msgid "errors.paste-data-validation" -msgstr "剪切板中为无效数据" - -msgid "inspect.attributes.typography.text-transform.unset" -msgstr "取消设置" - -msgid "labels.share" -msgstr "分享" - -msgid "labels.search" -msgstr "搜索" - -msgid "modals.add-shared-confirm-empty.hint" -msgstr "你的库是空白的。一旦添加为共享库,此文档库中的素材就可被用于你的其他文档中。" -"你确定要发布它吗?" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.copy-token" -msgstr "复制令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.expiration-date.label" -msgstr "到期时间" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.label" -msgstr "名称" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.name.placeholder" -msgstr "名称可以帮你记住令牌的用途" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.submit-label" -msgstr "创建令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.create-access-token.title" -msgstr "生成访问令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.title" -msgstr "删除令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.message" -msgstr "你确定想要删除这个令牌吗?" - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.scd-message" -msgid_plural "modals.delete-shared-confirm.activated.scd-message" -msgstr[0] "该库被以下文档使用: " -msgstr[1] "这些库被以下文档使用: " - -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs -msgid "modals.delete-shared-confirm.activated.no-files-message" -msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "" -msgstr[1] "" - -msgid "modals.publish-empty-library.accept" -msgstr "发布" - -msgid "modals.publish-empty-library.message" -msgstr "你的库是空白的。你确定想要发布它?" - -msgid "modals.publish-empty-library.title" -msgstr "发布空白库" - -#: src/app/main/data/common.cljs -msgid "notifications.by-code.upgrade-version" -msgstr "有新版本可用,请刷新页面" - -msgid "onboarding.choice.team-up.continue-creating-team" -msgstr "继续创建团队" - -msgid "onboarding.choice.team-up.start-without-a-team-description" -msgstr "你可以稍后再创建团队。" - -msgid "onboarding.choice.team-up.start-without-a-team" -msgstr "以个人身份开始" - -msgid "onboarding.choice.team-up.continue-without-a-team" -msgstr "以个人身份继续" - -msgid "onboarding.choice.team-up.create-team-and-send-invites" -msgstr "创建团队并发送邀请" - -msgid "onboarding.choice.team-up.create-team-without-inviting" -msgstr "创建团队但暂不邀请" - -msgid "onboarding.choice.team-up.create-team-and-invite" -msgstr "创建团队 & 邀请" - -msgid "onboarding.choice.team-up.create-team-without-invite" -msgstr "创建团队" - -msgid "onboarding.choice.team-up.create-team-and-send-invites-description" -msgstr "你可以稍后再邀请成员" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.interface-design-visual-assets-design-systems" -msgstr "...界面设计,视觉素材,设计系统等。" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.none" -msgstr "无" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.other" -msgstr "其他(请注明)" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.personal-project" -msgstr "我在做个人项目" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.previous" -msgstr "前一项" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.questions-how-are-you-planning-to-use-penpot" -msgstr "你计划用Penpot做什么?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.sketch" -msgstr "Sketch" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start-to-work-on-my-project" -msgstr "开始着手我的项目" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.student-teacher" -msgstr "学生/教师" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.start" -msgstr "开始" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.test-penpot-to-see-if-its-a-fit-for-team" -msgstr "试用Penpot,来看它是否适合团队 " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.try-out-before-using-penpot-on-premise" -msgstr "在本地部署Penpot前进行试用" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.work-in-concept-ideas" -msgstr "从事概念构想的工作" - -#: src/app/main/ui/dashboard/team.cljs -msgid "team.webhooks.max-length" -msgstr "Webhook的名称最多包含2048个字符。" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "title.settings.access-tokens" -msgstr "个人资料 — 访问令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.token-will-not-expire" -msgstr "令牌无到期时限" - -msgid "workspace.shape.menu.add-grid" -msgstr "添加网格布局" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.leave-feedback-for-my-team-project" -msgstr "给我的团队项目做反馈" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "branding-illustrations-marketing-pieces" -msgstr "品牌设计、插图、营销物料等。" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.a-lot" -msgstr "非常多" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "...线框图,用户轨迹和用户流程,导航树等。" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "question.design-tool-more-experienced-with" -msgstr "你最熟悉哪个设计工具?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.invision" -msgstr "InVision" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.31-50" -msgstr "31-50" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.more-than-50" -msgstr "50以上" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.freelancer" -msgstr "我是一名自由职业者" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.2-10" -msgstr "2-10" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.copied-success" -msgstr "已复制令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create" -msgstr "生成新令牌" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.empty.add-one" -msgstr "点击“生成新令牌”按钮来生成一个。" - -msgid "labels.discard" -msgstr "丢弃" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.founder" -msgstr "创始人/副总裁" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.figma" -msgstr "Figma" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.get-the-code-from-my-team-project" -msgstr "从我的团队项目获得邀请码 " - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.lets-get-started" -msgstr "让我们开始吧!" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.marketing" -msgstr "市场营销" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.next" -msgstr "下一项" - -msgid "shortcuts.text-align-center" -msgstr "水平居中" - -msgid "shortcuts.text-align-left" -msgstr "靠左对齐" - -msgid "shortcuts.text-align-justify" -msgstr "两端对齐" - -msgid "workspace.options.component.annotation" -msgstr "注释" - -msgid "workspace.options.component.copy" -msgstr "复制" - -msgid "workspace.options.component.create-annotation" -msgstr "创建注释" - -#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs -msgid "workspace.options.stroke-cap.circle-marker-short" -msgstr "圆形" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.updates.more-info" -msgstr "更多信息" - -msgid "modals.delete-component-annotation.message" -msgstr "你确定想要删除这个注释?" - -msgid "workspace.shape.menu.create-annotation" -msgstr "创建注释" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.adobe-xd" -msgstr "Adobe XD" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.canva" -msgstr "Canva" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "modals.delete-acces-token.accept" -msgstr "删除令牌" - -msgid "modals.delete-component-annotation.title" -msgstr "删除注释" - -#: src/app/main/ui/workspace/colorpalette.cljs -msgid "workspace.libraries.colors.empty-palette" -msgstr "你的库中还没有颜色风格" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.11-30" -msgstr "11-30" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.designer" -msgstr "设计师" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.developer" -msgstr "开发者" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.discover-more-about-penpot" -msgstr "深入了解Penpot的精彩之处" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.manager" -msgstr "产品经理/项目经理" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.role" -msgstr "你是哪种身份?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.team-size" -msgstr "你的团队有多少人?" - -#: src/app/main/ui/onboarding/questions.cljs -msgid "questions.your-feedback-will-help-us" -msgstr "你的反馈将帮助我们更好地理解你的习惯和偏好,以便我们不断改进Penpot,使其成为" -"一个有用且好用的工具。" - -msgid "shortcuts.select-parent-layer" -msgstr "选择上级图层" - -msgid "shortcuts.text-align-right" -msgstr "靠右对齐" - -#: src/app/main/data/workspace/libraries.cljs -msgid "workspace.libraries.update.see-all-changes" -msgstr "查看所有修改" - -msgid "workspace.assets.open-library" -msgstr "打开库文档" - -msgid "workspace.options.component.edit-annotation" -msgstr "编辑注释" - -msgid "workspace.shape.menu.create-multiple-components" -msgstr "创建多个组件" - -#: src/app/main/ui/workspace/sidebar/assets.cljs -msgid "workspace.assets.shared-library" -msgstr "共享库" - -#: src/app/main/ui/workspace/header.cljs -msgid "workspace.header.zoom" -msgstr "缩放" - -msgid "workspace.layout_grid.editor.title" -msgstr "编辑网格" - -msgid "media.radial" -msgstr "径向" - -msgid "media.gradient" -msgstr "渐变" - -msgid "media.choose-image" -msgstr "选择图片" - -msgid "media.image" -msgstr "图片" - -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.not-all-space" -msgstr "姓名必须包含一些空格以外的字符。" - -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs -msgid "auth.name.too-long" -msgstr "姓名最多包含250个字符。" - -#: src/app/main/ui/auth/register.cljs -msgid "auth.password-not-empty" -msgstr "密码必须包含一些空格以外的字符。" - -#: src/app/main/ui/auth/register.cljs -#, markdown -msgid "auth.terms-privacy-agreement-md" -msgstr "创建新账号,即代表你同意我们的[服务条例](%s)和[隐私政策](%s)。" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.create.success" -msgstr "成功创建访问令牌。" - -#: src/app/main/ui/settings/access-tokens.cljs -msgid "dashboard.access-tokens.personal.description" -msgstr "个人访问令牌可被理解为密码认证的代替选项,常用于允许(第三方)应用访问Penpot" -"内部API" - -msgid "errors.cannot-upload" -msgstr "无法上传该媒体文件。" - -#: src/app/main/ui/settings/sidebar.cljs -msgid "labels.access-tokens" -msgstr "访问令牌" diff --git a/frontend/translations/zh_Hant.po b/frontend/translations/zh_Hant.po index 6fe709570..5f14d51cb 100644 --- a/frontend/translations/zh_Hant.po +++ b/frontend/translations/zh_Hant.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 13:04+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Chinese (Traditional) \n" +"Language-Team: Chinese (Traditional) " +"\n" "Language: zh_Hant\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" -- Gitee From 6901acb37e79974f132146b60b85cdb031e9025f Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Thu, 25 Apr 2024 19:50:22 +0200 Subject: [PATCH 0466/1266] :bug: Fix ungrouping detach components --- frontend/src/app/main/data/workspace/groups.cljs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/frontend/src/app/main/data/workspace/groups.cljs b/frontend/src/app/main/data/workspace/groups.cljs index c3a403269..bbda31ecc 100644 --- a/frontend/src/app/main/data/workspace/groups.cljs +++ b/frontend/src/app/main/data/workspace/groups.cljs @@ -143,18 +143,12 @@ (map-indexed vector) (filter #(#{(:id group)} (second %))) (ffirst) - inc) - - ;; Shapes that are in a component (including root) must be detached, - ;; because cannot be easyly synchronized back to the main component. - shapes-to-detach (filter ctk/in-component-copy? - (cfh/get-children-with-self objects (:id group)))] + inc)] (-> (pcb/empty-changes it page-id) (pcb/with-objects objects) (pcb/change-parent parent-id children index-in-parent) - (pcb/remove-objects [(:id group)]) - (pcb/update-shapes (map :id shapes-to-detach) ctk/detach-shape)))) + (pcb/remove-objects [(:id group)])))) (defn remove-frame-changes [it page-id frame objects] -- Gitee From 1026f5b972f25e0593478abb1c2aa1a5fc521910 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Wed, 24 Apr 2024 15:41:12 +0200 Subject: [PATCH 0467/1266] :wrench: Change common tests runner to kaocha --- .circleci/config.yml | 2 +- common/deps.edn | 8 ++------ common/test/common_tests/geom_point_test.cljc | 2 +- common/tests.edn | 4 ++++ 4 files changed, 8 insertions(+), 8 deletions(-) create mode 100644 common/tests.edn diff --git a/.circleci/config.yml b/.circleci/config.yml index e1a6e629f..18d7cf5d7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -93,7 +93,7 @@ jobs: working_directory: "./common" command: | yarn test - clojure -X:dev:test :patterns '["common-tests.*-test"]' + clojure -M:dev:test - run: name: "frontend tests" diff --git a/common/deps.edn b/common/deps.edn index b014882f9..704021288 100644 --- a/common/deps.edn +++ b/common/deps.edn @@ -76,12 +76,8 @@ :ns-default build} :test - {:extra-paths ["test"] - :extra-deps - {io.github.cognitect-labs/test-runner - {:git/tag "v0.5.1" :git/sha "dfb30dd"}} - :main-opts ["-m" "cognitect.test-runner"] - :exec-fn cognitect.test-runner.api/test} + {:main-opts ["-m" "kaocha.runner"] + :extra-deps {lambdaisland/kaocha {:mvn/version "1.88.1376"}}} :shadow-cljs {:main-opts ["-m" "shadow.cljs.devtools.cli"]} diff --git a/common/test/common_tests/geom_point_test.cljc b/common/test/common_tests/geom_point_test.cljc index 0490e1d02..6ba7239f0 100644 --- a/common/test/common_tests/geom_point_test.cljc +++ b/common/test/common_tests/geom_point_test.cljc @@ -203,7 +203,7 @@ (t/is (mth/close? 1.5 (:x rs))) (t/is (mth/close? 3.5 (:y rs))))) -(t/deftest transform-point +(t/deftest ^:kaocha/skip transform-point ;;todo ) diff --git a/common/tests.edn b/common/tests.edn new file mode 100644 index 000000000..9f487a7ea --- /dev/null +++ b/common/tests.edn @@ -0,0 +1,4 @@ +#kaocha/v1 + {:tests [{:id :unit + :test-paths ["test"]}] + :kaocha/reporter [kaocha.report/dots]} -- Gitee From dde89e60ddf30005287e2f56868729e1b4bc1fee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Thu, 18 Apr 2024 18:10:00 +0200 Subject: [PATCH 0468/1266] :white_check_mark: Add new helper functions for common tests --- backend/src/app/rpc/commands/files_create.clj | 41 +- common/src/app/common/files/builder.cljc | 2 +- common/src/app/common/files/changes.cljc | 2 +- common/src/app/common/types/color.cljc | 17 + common/src/app/common/types/file.cljc | 33 +- common/src/app/common/types/page.cljc | 6 +- common/src/app/common/types/typography.cljc | 21 +- .../test/common_tests/helpers/components.cljc | 146 ------- common/test/common_tests/helpers/files.cljc | 362 +++++++++++----- common/test/common_tests/helpers/ids_map.cljc | 36 ++ common/test/common_tests/record_test.cljc | 1 - common/test/common_tests/types_file_test.cljc | 401 ++++++++++-------- 12 files changed, 586 insertions(+), 482 deletions(-) delete mode 100644 common/test/common_tests/helpers/components.cljc create mode 100644 common/test/common_tests/helpers/ids_map.cljc diff --git a/backend/src/app/rpc/commands/files_create.clj b/backend/src/app/rpc/commands/files_create.clj index cc15830d4..ab386eca0 100644 --- a/backend/src/app/rpc/commands/files_create.clj +++ b/backend/src/app/rpc/commands/files_create.clj @@ -6,13 +6,10 @@ (ns app.rpc.commands.files-create (:require - [app.common.data :as d] [app.common.data.macros :as dm] [app.common.features :as cfeat] - [app.common.files.defaults :refer [version]] [app.common.schema :as sm] [app.common.types.file :as ctf] - [app.common.uuid :as uuid] [app.config :as cf] [app.db :as db] [app.features.fdata :as feat.fdata] @@ -40,7 +37,7 @@ (defn create-file [{:keys [::db/conn] :as cfg} {:keys [id name project-id is-shared revn - modified-at deleted-at create-page + modified-at deleted-at create-page page-id ignore-sync-until features] :or {is-shared false revn 0 create-page true} :as params}] @@ -51,23 +48,17 @@ (binding [pmap/*tracked* (pmap/create-tracked) cfeat/*current* features] - (let [id (or id (uuid/next)) - - data (if create-page - (ctf/make-file-data id) - (ctf/make-file-data id nil)) - - file {:id id - :project-id project-id - :name name - :revn revn - :is-shared is-shared - :version version - :data data - :features features - :ignore-sync-until ignore-sync-until - :modified-at modified-at - :deleted-at deleted-at} + (let [file (ctf/make-file {:id id + :project-id project-id + :name name + :revn revn + :is-shared is-shared + :features features + :ignore-sync-until ignore-sync-until + :modified-at modified-at + :deleted-at deleted-at + :create-page create-page + :page-id page-id}) file (if (contains? features "fdata/objects-map") (feat.fdata/enable-objects-map file) @@ -75,9 +66,7 @@ file (if (contains? features "fdata/pointer-map") (feat.fdata/enable-pointer-map file) - file) - - file (d/without-nils file)] + file)] (db/insert! conn :file (-> file @@ -86,9 +75,9 @@ {::db/return-keys false}) (when (contains? features "fdata/pointer-map") - (feat.fdata/persist-pointers! cfg id)) + (feat.fdata/persist-pointers! cfg (:id file))) - (->> (assoc params :file-id id :role :owner) + (->> (assoc params :file-id (:id file) :role :owner) (create-file-role! conn)) (db/update! conn :project diff --git a/common/src/app/common/files/builder.cljc b/common/src/app/common/files/builder.cljc index c30a2e8c8..f5519f736 100644 --- a/common/src/app/common/files/builder.cljc +++ b/common/src/app/common/files/builder.cljc @@ -147,7 +147,7 @@ [file data] (dm/assert! (nil? (:current-component-id file))) (let [page-id (or (:id data) (uuid/next)) - page (-> (ctp/make-empty-page page-id "Page 1") + page (-> (ctp/make-empty-page {:id page-id :name "Page 1"}) (d/deep-merge data))] (-> file (commit-change diff --git a/common/src/app/common/files/changes.cljc b/common/src/app/common/files/changes.cljc index 978cc8edf..a82ab947c 100644 --- a/common/src/app/common/files/changes.cljc +++ b/common/src/app/common/files/changes.cljc @@ -578,7 +578,7 @@ (ex/raise :type :conflict :hint "id+name or page should be provided, never both")) (let [page (if (and (string? name) (uuid? id)) - (ctp/make-empty-page id name) + (ctp/make-empty-page {:id id :name name}) page)] (ctpl/add-page data page))) diff --git a/common/src/app/common/types/color.cljc b/common/src/app/common/types/color.cljc index 7bded1492..111343d58 100644 --- a/common/src/app/common/types/color.cljc +++ b/common/src/app/common/types/color.cljc @@ -13,6 +13,7 @@ [app.common.types.color.generic :as-alias color-generic] [app.common.types.color.gradient :as-alias color-gradient] [app.common.types.color.gradient.stop :as-alias color-gradient-stop] + [app.common.uuid :as uuid] [clojure.test.check.generators :as tgen])) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -105,6 +106,22 @@ ;; HELPERS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; --- factory + +(defn make-color + [{:keys [id name path value color opacity ref-id ref-file gradient image]}] + (-> {:id (or id (uuid/next)) + :name (or name color "Black") + :path path + :value value + :color (or color "#000000") + :opacity (or opacity 1) + :ref-id ref-id + :ref-file ref-file + :gradient gradient + :image image} + (d/without-nils))) + ;; --- fill (defn fill->shape-color diff --git a/common/src/app/common/types/file.cljc b/common/src/app/common/types/file.cljc index 0c5fbf572..d12b759df 100644 --- a/common/src/app/common/types/file.cljc +++ b/common/src/app/common/types/file.cljc @@ -9,6 +9,7 @@ [app.common.data :as d] [app.common.data.macros :as dm] [app.common.features :as cfeat] + [app.common.files.defaults :refer [version]] [app.common.files.helpers :as cfh] [app.common.geom.point :as gpt] [app.common.geom.shapes :as gsh] @@ -78,7 +79,7 @@ ([file-id page-id] (let [page (when (some? page-id) - (ctp/make-empty-page page-id "Page 1"))] + (ctp/make-empty-page {:id page-id :name "Page 1"}))] (cond-> (assoc empty-file-data :id file-id) (some? page-id) @@ -87,6 +88,34 @@ (contains? cfeat/*current* "components/v2") (assoc-in [:options :components-v2] true))))) +(defn make-file + [{:keys [id project-id name revn is-shared features + ignore-sync-until modified-at deleted-at + create-page page-id] + :or {is-shared false revn 0 create-page true}}] + + (let [id (or id (uuid/next)) + + data (if create-page + (if page-id + (make-file-data id page-id) + (make-file-data id)) + (make-file-data id nil)) + + file {:id id + :project-id project-id + :name name + :revn revn + :is-shared is-shared + :version version + :data data + :features features + :ignore-sync-until ignore-sync-until + :modified-at modified-at + :deleted-at deleted-at}] + + (d/without-nils file))) + ;; Helpers (defn file-data @@ -457,7 +486,7 @@ (gpt/point 0 0) (ctn/shapes-seq library-page))] [file-data (:id library-page) position]) - (let [library-page (ctp/make-empty-page (uuid/next) "Main components")] + (let [library-page (ctp/make-empty-page {:id (uuid/next) :name "Main components"})] [(ctpl/add-page file-data library-page) (:id library-page) (gpt/point 0 0)])))) (defn- absorb-components diff --git a/common/src/app/common/types/page.cljc b/common/src/app/common/types/page.cljc index 6c1d427df..0b2038928 100644 --- a/common/src/app/common/types/page.cljc +++ b/common/src/app/common/types/page.cljc @@ -69,10 +69,10 @@ :name "Root Frame"})}}) (defn make-empty-page - [id name] + [{:keys [id name]}] (-> empty-page-data - (assoc :id id) - (assoc :name name))) + (assoc :id (or id (uuid/next))) + (assoc :name (or name "Page 1")))) ;; --- Helpers for flow diff --git a/common/src/app/common/types/typography.cljc b/common/src/app/common/types/typography.cljc index 4fe5c9565..6e216020a 100644 --- a/common/src/app/common/types/typography.cljc +++ b/common/src/app/common/types/typography.cljc @@ -6,8 +6,10 @@ (ns app.common.types.typography (:require + [app.common.data :as d] [app.common.schema :as sm] - [app.common.text :as txt])) + [app.common.text :as txt] + [app.common.uuid :as uuid])) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; SCHEMA @@ -36,6 +38,23 @@ ;; HELPERS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defn make-typography + [{:keys [id name path font-id font-family font-variant-id font-size + font-weight font-style line-height letter-spacing text-transform]}] + (-> {:id (or id (uuid/next)) + :name (or name "Typography 1") + :path path + :font-id (or font-id "sourcesanspro") + :font-family (or font-family "sourcesanspro") + :font-variant-id (or font-variant-id "regular") + :font-size (or font-size "14") + :font-weight (or font-weight "480") + :font-style (or font-style "normal") + :line-height (or line-height "1.2") + :letter-spacing (or letter-spacing "0") + :text-transform (or text-transform "none")} + (d/without-nils))) + (defn uses-library-typographies? "Check if the shape uses any typography in the given library." [shape library-id] diff --git a/common/test/common_tests/helpers/components.cljc b/common/test/common_tests/helpers/components.cljc deleted file mode 100644 index 523438c44..000000000 --- a/common/test/common_tests/helpers/components.cljc +++ /dev/null @@ -1,146 +0,0 @@ -;; This Source Code Form is subject to the terms of the Mozilla Public -;; License, v. 2.0. If a copy of the MPL was not distributed with this -;; file, You can obtain one at http://mozilla.org/MPL/2.0/. -;; -;; Copyright (c) KALEIDOS INC - -(ns common-tests.helpers.components - (:require - [app.common.files.helpers :as cfh] - [app.common.types.component :as ctk] - [app.common.types.container :as ctn] - [app.common.types.file :as ctf] - [clojure.test :as t])) - -;; ---- Helpers to manage libraries and synchronization - -(defn check-instance-root - [shape] - (t/is (some? (:shape-ref shape))) - (t/is (some? (:component-id shape))) - (t/is (= (:component-root shape) true))) - -(defn check-instance-subroot - [shape] - (t/is (some? (:shape-ref shape))) - (t/is (some? (:component-id shape))) - (t/is (nil? (:component-root shape)))) - -(defn check-instance-child - [shape] - (t/is (some? (:shape-ref shape))) - (t/is (nil? (:component-id shape))) - (t/is (nil? (:component-file shape))) - (t/is (nil? (:component-root shape)))) - -(defn check-instance-inner - [shape] - (if (some? (:component-id shape)) - (check-instance-subroot shape) - (check-instance-child shape))) - -(defn check-noninstance - [shape] - (t/is (nil? (:shape-ref shape))) - (t/is (nil? (:component-id shape))) - (t/is (nil? (:component-file shape))) - (t/is (nil? (:component-root shape))) - (t/is (nil? (:remote-synced? shape))) - (t/is (nil? (:touched shape)))) - -(defn check-from-file - [shape file] - (t/is (= (:component-file shape) - (:id file)))) - -(defn resolve-instance - "Get the shape with the given id and all its children, and - verify that they are a well constructed instance tree." - [page root-inst-id] - (let [root-inst (ctn/get-shape page root-inst-id) - shapes-inst (cfh/get-children-with-self (:objects page) - root-inst-id)] - (check-instance-root (first shapes-inst)) - (run! check-instance-inner (rest shapes-inst)) - - shapes-inst)) - -(defn resolve-noninstance - "Get the shape with the given id and all its children, and - verify that they are not a component instance." - [page root-inst-id] - (let [root-inst (ctn/get-shape page root-inst-id) - shapes-inst (cfh/get-children-with-self (:objects page) - root-inst-id)] - (run! check-noninstance shapes-inst) - - shapes-inst)) - -(defn resolve-instance-and-main - "Get the shape with the given id and all its children, and also - the main component and all its shapes." - [page root-inst-id libraries] - (let [root-inst (ctn/get-shape page root-inst-id) - - component (ctf/get-component libraries (:component-file root-inst) (:component-id root-inst)) - - shapes-inst (cfh/get-children-with-self (:objects page) root-inst-id) - shapes-main (cfh/get-children-with-self (:objects component) (:shape-ref root-inst)) - - unique-refs (into #{} (map :shape-ref) shapes-inst) - - main-exists? (fn [shape] - (let [component-shape - (ctn/get-component-shape (:objects page) shape) - - component - (ctf/get-component libraries (:component-file component-shape) (:component-id component-shape)) - - main-shape - (ctn/get-shape component (:shape-ref shape))] - - (t/is (some? main-shape))))] - - ;; Validate that the instance tree is well constructed - (check-instance-root (first shapes-inst)) - (run! check-instance-inner (rest shapes-inst)) - (t/is (= (count shapes-inst) - (count shapes-main) - (count unique-refs))) - (run! main-exists? shapes-inst) - - [shapes-inst shapes-main component])) - -(defn resolve-instance-and-main-allow-dangling - "Get the shape with the given id and all its children, and also - the main component and all its shapes. Allows shapes with the - corresponding component shape missing." - [page root-inst-id libraries] - (let [root-inst (ctn/get-shape page root-inst-id) - - component (ctf/get-component libraries (:component-file root-inst) (:component-id root-inst)) - - shapes-inst (cfh/get-children-with-self (:objects page) root-inst-id) - shapes-main (cfh/get-children-with-self (:objects component) (:shape-ref root-inst)) - - unique-refs (into #{} (map :shape-ref) shapes-inst) - - main-exists? (fn [shape] - (let [component-shape - (ctn/get-component-shape (:objects page) shape) - - component - (ctf/get-component libraries (:component-file component-shape) (:component-id component-shape)) - - main-shape - (ctn/get-shape component (:shape-ref shape))] - - (t/is (some? main-shape))))] - - ;; Validate that the instance tree is well constructed - (check-instance-root (first shapes-inst)) - - [shapes-inst shapes-main component])) - - - diff --git a/common/test/common_tests/helpers/files.cljc b/common/test/common_tests/helpers/files.cljc index 3f27d7021..306d2ef81 100644 --- a/common/test/common_tests/helpers/files.cljc +++ b/common/test/common_tests/helpers/files.cljc @@ -6,150 +6,278 @@ (ns common-tests.helpers.files (:require + [app.common.data.macros :as dm] [app.common.features :as ffeat] + [app.common.files.changes :as cfc] + [app.common.files.helpers :as cfh] + [app.common.files.validate :as cfv] [app.common.geom.point :as gpt] + [app.common.pprint :refer [pprint]] + [app.common.types.color :as ctc] [app.common.types.colors-list :as ctcl] [app.common.types.components-list :as ctkl] [app.common.types.container :as ctn] [app.common.types.file :as ctf] + [app.common.types.page :as ctp] [app.common.types.pages-list :as ctpl] [app.common.types.shape :as cts] [app.common.types.shape-tree :as ctst] - [app.common.types.typographies-list :as ctyl] - [app.common.uuid :as uuid])) + [app.common.types.typographies-list :as cttl] + [app.common.types.typography :as ctt] + [common-tests.helpers.ids-map :as thi])) -(defn- make-file-data - [file-id page-id] +;; ----- Files + +(defn sample-file + [label & {:keys [page-label name] :as params}] (binding [ffeat/*current* #{"components/v2"}] - (ctf/make-file-data file-id page-id))) + (let [params (cond-> params + label + (assoc :id (thi/new-id! label)) -(def ^:private idmap (atom {})) + page-label + (assoc :page-id (thi/new-id! page-label)) -(defn reset-idmap! - [next] - (reset! idmap {}) - (next)) + (nil? name) + (assoc :name "Test file")) -(defn id - [label] - (get @idmap label)) + file (-> (ctf/make-file (dissoc params :page-label)) + (assoc :features #{"components/v2"})) -(defn sample-file - ([file-id page-id] (sample-file file-id page-id nil)) - ([file-id page-id props] - (merge {:id file-id - :name (get props :name "File1") - :data (make-file-data file-id page-id)} - props))) + page (-> file + :data + (ctpl/pages-seq) + (first))] + + (with-meta file + {:current-page-id (:id page)})))) + +(defn validate-file! + ([file] (validate-file! file {})) + ([file libraries] + (cfv/validate-file-schema! file) + (cfv/validate-file! file libraries))) + +(defn apply-changes + [file changes] + (let [file' (ctf/update-file-data file #(cfc/process-changes % (:redo-changes changes) true))] + (validate-file! file') + file')) + +(declare current-page-id) +(declare get-page) + +(defn dump-file + [file & {:keys [page-label libraries] :as params}] + (let [params (-> params + (or {:show-ids true :show-touched true}) + (dissoc page-label libraries)) + page (if (some? page-label) + (:id (get-page file page-label)) + (current-page-id file)) + libraries (or libraries {})] + + (ctf/dump-tree file page libraries params))) + +(defn pprint-file + [file & {:keys [level length] :or {level 10 length 1000}}] + (pprint file {:level level :length length})) + +;; ----- Pages + +(defn sample-page + [label & {:keys [] :as params}] + (ctp/make-empty-page (assoc params :id (thi/new-id! label)))) + +(defn add-sample-page + [file label & {:keys [] :as params}] + (let [page (sample-page label params)] + (-> file + (ctf/update-file-data #(ctpl/add-page % page)) + (vary-meta assoc :current-page-id (:id page))))) + +(defn get-page + [file label] + (ctpl/get-page (:data file) (thi/id label))) + +(defn current-page-id + [file] + (:current-page-id (meta file))) + +(defn current-page + [file] + (ctpl/get-page (:data file) (current-page-id file))) + +(defn switch-to-page + [file label] + (vary-meta file assoc :current-page-id (thi/id label))) + +;; ----- Shapes (defn sample-shape - [file label type page-id props] - (ctf/update-file-data - file - (fn [file-data] - (let [frame-id (get props :frame-id uuid/zero) - parent-id (get props :parent-id uuid/zero) - shape (cts/setup-shape - (-> {:type type - :width 1 - :height 1} - (merge props)))] - - (swap! idmap assoc label (:id shape)) + [label & {:keys [type] :as params}] + (let [params (cond-> params + label + (assoc :id (thi/new-id! label)) + + (nil? type) + (assoc :type :rect))] + + (cts/setup-shape params))) + +(defn add-sample-shape + [file label & {:keys [parent-label] :as params}] + (let [page (current-page file) + shape (sample-shape label (dissoc params :parent-label)) + parent-id (when parent-label + (thi/id parent-label)) + parent (when parent-id + (ctst/get-shape page parent-id)) + frame-id (if (cfh/frame-shape? parent) + (:id parent) + (:frame-id parent))] + (ctf/update-file-data + file + (fn [file-data] (ctpl/update-page file-data - page-id + (:id page) #(ctst/add-shape (:id shape) shape % frame-id parent-id - 0 + nil true)))))) -(defn sample-component - [file label page-id shape-id] - (ctf/update-file-data - file - (fn [file-data] - (let [page (ctpl/get-page file-data page-id) - - [component-shape component-shapes updated-shapes] - (ctn/make-component-shape (ctn/get-shape page shape-id) - (:objects page) - (:id file) - true)] - - (swap! idmap assoc label (:id component-shape)) - (-> file-data - (ctpl/update-page page-id - #(reduce (fn [page shape] (ctst/set-shape page shape)) - % - updated-shapes)) - (ctkl/add-component {:id (:id component-shape) - :name (:name component-shape) - :path "" - :main-instance-id shape-id - :main-instance-page page-id - :shapes component-shapes})))))) - -(defn sample-instance - [file label page-id library component-id] - (ctf/update-file-data - file - (fn [file-data] - (let [[instance-shape instance-shapes] - (ctn/make-component-instance (ctpl/get-page file-data page-id) - (ctkl/get-component (:data library) component-id) - (:data library) - (gpt/point 0 0) - true)] - - (swap! idmap assoc label (:id instance-shape)) - (-> file-data - (ctpl/update-page page-id - #(reduce (fn [page shape] - (ctst/add-shape (:id shape) - shape - page - uuid/zero - (:parent-id shape) - 0 - true)) - % - instance-shapes))))))) +(defn get-shape + [file label & {:keys [page-label]}] + (let [page (if page-label + (get-page file page-label) + (current-page file))] + (ctst/get-shape page (thi/id label)))) + +(defn get-shape-by-id + [file id & {:keys [page-label]}] + (let [page (if page-label + (get-page file page-label) + (current-page file))] + (ctst/get-shape page id))) + +;; ----- Components + +(defn make-component + [file label root-label] + (let [page (current-page file) + root (get-shape file root-label)] + + (dm/assert! + "Need that root is already a frame" + (cfh/frame-shape? root)) + + (let [[_new-root _new-shapes updated-shapes] + (ctn/convert-shape-in-component root (:objects page) (:id file)) + + updated-root (first updated-shapes)] ; Can't use new-root because it has a new id + + (thi/set-id! label (:component-id updated-root)) + + (ctf/update-file-data + file + (fn [file-data] + (as-> file-data $ + (reduce (fn [file-data shape] + (ctpl/update-page file-data + (:id page) + #(update % :objects assoc (:id shape) shape))) + $ + updated-shapes) + (ctkl/add-component $ + {:id (:component-id updated-root) + :name (:name updated-root) + :main-instance-id (:id updated-root) + :main-instance-page (:id page) + :shapes updated-shapes}))))))) + +(defn get-component + [file label] + (ctkl/get-component (:data file) (thi/id label))) + +(defn get-component-by-id + [file id] + (ctkl/get-component (:data file) id)) + +(defn instantiate-component + [file component-label copy-root-label & {:keys [parent-label library] :as params}] + (let [page (current-page file) + library (or library file) + component (get-component library component-label) + parent-id (when parent-label + (thi/id parent-label)) + parent (when parent-id + (ctst/get-shape page parent-id)) + frame-id (if (cfh/frame-shape? parent) + (:id parent) + (:frame-id parent)) + + [copy-root copy-shapes] + (ctn/make-component-instance page + component + (:data library) + (gpt/point 100 100) + true + {:force-id (thi/new-id! copy-root-label) + :force-frame-id frame-id}) + + copy-root' (cond-> copy-root + (some? parent) + (assoc :parent-id parent-id) + + (some? frame-id) + (assoc :frame-id frame-id) + + (and (some? parent) (ctn/in-any-component? (:objects page) parent)) + (dissoc :component-root))] + + (ctf/update-file-data + file + (fn [file-data] + (as-> file-data $ + (ctpl/update-page $ + (:id page) + #(ctst/add-shape (:id copy-root') + copy-root' + % + frame-id + parent-id + nil + true)) + (reduce (fn [file-data shape] + (ctpl/update-page file-data + (:id page) + #(ctst/add-shape (:id shape) + shape + % + (:parent-id shape) + (:frame-id shape) + nil + true))) + $ + (remove #(= (:id %) (:did copy-root')) copy-shapes))))))) (defn sample-color - [file label props] - (ctf/update-file-data - file - (fn [file-data] - (let [id (uuid/next) - props (merge {:id id - :name "Color 1" - :color "#000000" - :opacity 1} - props)] - (swap! idmap assoc label id) - (ctcl/add-color file-data props))))) + [label & {:keys [] :as params}] + (ctc/make-color (assoc params :id (thi/new-id! label)))) + +(defn add-sample-color + [file label & {:keys [] :as params}] + (let [color (sample-color label params)] + (ctf/update-file-data file #(ctcl/add-color % color)))) (defn sample-typography - [file label props] - (ctf/update-file-data - file - (fn [file-data] - (let [id (uuid/next) - props (merge {:id id - :name "Typography 1" - :font-id "sourcesanspro" - :font-family "sourcesanspro" - :font-size "14" - :font-style "normal" - :font-variant-id "regular" - :font-weight "400" - :line-height "1.2" - :letter-spacing "0" - :text-transform "none"} - props)] - (swap! idmap assoc label id) - (ctyl/add-typography file-data props))))) + [label & {:keys [] :as params}] + (ctt/make-typography (assoc params :id (thi/new-id! label)))) +(defn add-sample-typography + [file label & {:keys [] :as params}] + (let [typography (sample-typography label params)] + (ctf/update-file-data file #(cttl/add-typography % typography)))) diff --git a/common/test/common_tests/helpers/ids_map.cljc b/common/test/common_tests/helpers/ids_map.cljc new file mode 100644 index 000000000..dc196598d --- /dev/null +++ b/common/test/common_tests/helpers/ids_map.cljc @@ -0,0 +1,36 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns common-tests.helpers.ids-map + (:require + [app.common.uuid :as uuid])) + +;; ---- Helpers to manage ids as known identifiers + +(def ^:private idmap (atom {})) + +(defn reset-idmap! [] + (reset! idmap {})) + +(defn set-id! + [label id] + (swap! idmap assoc label id)) + +(defn new-id! + [label] + (let [id (uuid/next)] + (set-id! label id) + id)) + +(defn id + [label] + (get @idmap label)) + +(defn test-fixture + ;; Ensure that each test starts with a clean ids map + [f] + (reset-idmap!) + (f)) diff --git a/common/test/common_tests/record_test.cljc b/common/test/common_tests/record_test.cljc index 64532078b..cbf62d021 100644 --- a/common/test/common_tests/record_test.cljc +++ b/common/test/common_tests/record_test.cljc @@ -27,7 +27,6 @@ (t/testing "unknown assoc" (let [o (assoc o :c 176)] - (prn o) (t/is (= 1 (:a o))) (t/is (= 2 (:b o))) (t/is (= 176 (:c o))))) diff --git a/common/test/common_tests/types_file_test.cljc b/common/test/common_tests/types_file_test.cljc index c95ea3893..1e316bc78 100644 --- a/common/test/common_tests/types_file_test.cljc +++ b/common/test/common_tests/types_file_test.cljc @@ -7,201 +7,234 @@ (ns common-tests.types-file-test (:require [app.common.data :as d] - [app.common.geom.point :as gpt] + [app.common.files.changes-builder :as pcb] + [app.common.files.libraries-helpers :as cflh] [app.common.text :as txt] [app.common.types.colors-list :as ctcl] [app.common.types.component :as ctk] [app.common.types.components-list :as ctkl] - [app.common.types.container :as ctn] [app.common.types.file :as ctf] [app.common.types.pages-list :as ctpl] - [app.common.types.shape :as cts] - [app.common.types.shape-tree :as ctst] [app.common.types.typographies-list :as ctyl] - [app.common.uuid :as uuid] - [clojure.pprint :refer [pprint]] [clojure.test :as t] - [common-tests.helpers.components :as thk] [common-tests.helpers.files :as thf] - [cuerdas.core :as str])) - -(t/use-fixtures :each thf/reset-idmap!) - -#_(t/deftest test-absorb-components - (let [library-id (uuid/custom 1 1) - library-page-id (uuid/custom 2 2) - file-id (uuid/custom 3 3) - file-page-id (uuid/custom 4 4) - - library (-> (thf/sample-file library-id library-page-id {:is-shared true}) - (thf/sample-shape :group1 - :group - library-page-id - {:name "Group1"}) - (thf/sample-shape :shape1 - :rect - library-page-id - {:name "Rect1" - :parent-id (thf/id :group1)}) - (thf/sample-component :component1 - library-page-id - (thf/id :group1))) - - file (-> (thf/sample-file file-id file-page-id) - (thf/sample-instance :instance1 - file-page-id - library - (thf/id :component1))) - - absorbed-file (ctf/update-file-data - file - #(ctf/absorb-assets % (:data library))) - - pages (ctpl/pages-seq (ctf/file-data absorbed-file)) - components (ctkl/components-seq (ctf/file-data absorbed-file)) - shapes-1 (ctn/shapes-seq (first pages)) - shapes-2 (ctn/shapes-seq (second pages)) - - [[p-group p-shape] [c-group1 c-shape1] component1] - (thk/resolve-instance-and-main - (first pages) - (:id (second shapes-1)) - {file-id absorbed-file}) - - [[lp-group lp-shape] [c-group2 c-shape2] component2] - (thk/resolve-instance-and-main - (second pages) - (:id (second shapes-2)) - {file-id absorbed-file})] - - ;; Uncomment to debug - - ;; (println "\n===== library") - ;; (ctf/dump-tree (:data library) - ;; library-page-id - ;; {} - ;; true) - - ;; (println "\n===== file") - ;; (ctf/dump-tree (:data file) - ;; file-page-id - ;; {library-id library} - ;; true) - - ;; (println "\n===== absorbed file") - ;; (println (str "\n<" (:name (first pages)) ">")) - ;; (ctf/dump-tree (:data absorbed-file) - ;; (:id (first pages)) - ;; {file-id absorbed-file} - ;; false) - ;; (println (str "\n<" (:name (second pages)) ">")) - ;; (ctf/dump-tree (:data absorbed-file) - ;; (:id (second pages)) - ;; {file-id absorbed-file} - ;; false) - - (t/is (= (count pages) 2)) - (t/is (= (:name (first pages)) "Page 1")) - (t/is (= (:name (second pages)) "Main components")) - - (t/is (= (count components) 1)) - - (t/is (= (:name p-group) "Group1")) - (t/is (ctk/instance-of? p-group file-id (:id component1))) - (t/is (not (:main-instance? p-group))) - (t/is (not (ctk/main-instance-of? (:id p-group) file-page-id component1))) - (t/is (ctk/is-main-of? c-group1 p-group)) - - (t/is (= (:name p-shape) "Rect1")) - (t/is (ctk/is-main-of? c-shape1 p-shape)))) - + [common-tests.helpers.ids-map :as thi])) + +(t/use-fixtures :each thi/test-fixture) + +(t/deftest test-create-file + (let [f1 (thf/sample-file :file1) + f2 (thf/sample-file :file2 :page-label :page1) + f3 (thf/sample-file :file3 :name "testing file") + f4 (-> (thf/sample-file :file4 :page-label :page2) + (thf/add-sample-page :page3 :name "testing page") + (thf/add-sample-shape :shape1)) + f5 (-> f4 + (thf/add-sample-shape :shape2) + (thf/switch-to-page :page2) + (thf/add-sample-shape :shape3 :name "testing shape" :width 100)) + s1 (thf/get-shape f4 :shape1) + s2 (thf/get-shape f5 :shape2 :page-label :page3) + s3 (thf/get-shape f5 :shape3)] + + ;; (thf/pprint-file f4) + + (t/is (= (:name f1) "Test file")) + (t/is (= (:name f3) "testing file")) + (t/is (= (:id f2) (thi/id :file2))) + (t/is (= (:id f4) (thi/id :file4))) + (t/is (= (-> f4 :data :pages-index vals first :id) (thi/id :page2))) + (t/is (= (-> f4 :data :pages-index vals first :name) "Page 1")) + (t/is (= (-> f4 :data :pages-index vals second :id) (thi/id :page3))) + (t/is (= (-> f4 :data :pages-index vals second :name) "testing page")) + + (t/is (= (:id (thf/current-page f2)) (thi/id :page1))) + (t/is (= (:id (thf/current-page f4)) (thi/id :page3))) + (t/is (= (:id (thf/current-page f5)) (thi/id :page2))) + + (t/is (= (:id s1) (thi/id :shape1))) + (t/is (= (:name s1) "Rectangle")) + (t/is (= (:id s2) (thi/id :shape2))) + (t/is (= (:name s2) "Rectangle")) + (t/is (= (:id s3) (thi/id :shape3))) + (t/is (= (:name s3) "testing shape")) + (t/is (= (:width s3) 100)) + (t/is (= (:width (:selrect s3)) 100)))) + +(t/deftest test-create-components + (let [f1 (-> (thf/sample-file :file1) + (thf/add-sample-shape :main-root :type :frame) + (thf/add-sample-shape :main-child :parent-label :main-root) + (thf/make-component :component1 :main-root) + (thf/instantiate-component :component1 :copy-root))] + + #_(thf/dump-file f1) + #_(thf/pprint-file f4) + + (t/is (= (:name f1) "Test file")))) + +(t/deftest test-add-component-from-single-shape + (let [; Setup + file (-> (thf/sample-file :file1) + (thf/add-sample-shape :shape1 :type :frame)) + + page (thf/current-page file) + shape1 (thf/get-shape file :shape1) + + ; Action + [_ component-id changes] + (cflh/generate-add-component (pcb/empty-changes) + [shape1] + (:objects page) + (:id page) + (:id file) + true + nil + nil) + + file' (thf/apply-changes file changes) + + ; Get + component (thf/get-component-by-id file' component-id) + root (thf/get-shape-by-id file' (:main-instance-id component))] + + ; Check + (t/is (some? component)) + (t/is (some? root)) + (t/is (= (:component-id root) (:id component))))) + +(t/deftest test-absorb-components + (let [; Setup + library (-> (thf/sample-file :library + :is-shared true) + (thf/add-sample-shape :main-root + :type :frame + :name "Frame1") + (thf/add-sample-shape :rect1 + :type :rect + :name "Rect1" + :parent-label :main-root) + (thf/make-component :component1 :main-root)) + + file (-> (thf/sample-file :file) + (thf/instantiate-component :component1 + :copy-root + :library library)) + + ; Action + file' (ctf/update-file-data + file + #(ctf/absorb-assets % (:data library))) + + _ (thf/validate-file! file') + + ; Get + pages' (ctpl/pages-seq (ctf/file-data file')) + components' (ctkl/components-seq (ctf/file-data file')) + component' (first components') + + copy-root' (thf/get-shape file' :copy-root) + main-root' (ctf/get-ref-shape (ctf/file-data file') component' copy-root')] + + ; Check + (t/is (= (count pages') 2)) + (t/is (= (:name (first pages')) "Page 1")) + (t/is (= (:name (second pages')) "Main components")) + + (t/is (= (count components') 1)) + + (t/is (ctk/instance-of? copy-root' (:id file') (:id component'))) + (t/is (ctk/is-main-of? main-root' copy-root' true)) + (t/is (ctk/main-instance-of? (:id main-root') (:id (second pages')) component')))) (t/deftest test-absorb-colors - (let [library-id (uuid/custom 1 1) - library-page-id (uuid/custom 2 2) - file-id (uuid/custom 3 3) - file-page-id (uuid/custom 4 4) - - library (-> (thf/sample-file library-id library-page-id {:is-shared true}) - (thf/sample-color :color1 {:name "Test color" - :color "#abcdef"})) - - file (-> (thf/sample-file file-id file-page-id) - (thf/sample-shape :shape1 - :rect - file-page-id - {:name "Rect1" - :fills [{:fill-color "#abcdef" - :fill-opacity 1 - :fill-color-ref-id (thf/id :color1) - :fill-color-ref-file library-id}]})) - - absorbed-file (ctf/update-file-data - file - #(ctf/absorb-assets % (:data library))) - - colors (ctcl/colors-seq (ctf/file-data absorbed-file)) - page (ctpl/get-page (ctf/file-data absorbed-file) file-page-id) - shape1 (ctn/get-shape page (thf/id :shape1)) - fill (first (:fills shape1))] - - (t/is (= (count colors) 1)) - (t/is (= (:id (first colors)) (thf/id :color1))) - (t/is (= (:name (first colors)) "Test color")) - (t/is (= (:color (first colors)) "#abcdef")) - - (t/is (= (:fill-color fill) "#abcdef")) - (t/is (= (:fill-color-ref-id fill) (thf/id :color1))) - (t/is (= (:fill-color-ref-file fill) file-id)))) + (let [; Setup + library (-> (thf/sample-file :library + :name "Test library" + :is-shared true) + (thf/add-sample-color :color1 {:name "Test color" + :color "#abcdef"})) + + file (-> (thf/sample-file :file + :name "Test file") + (thf/add-sample-shape :shape1 + :type :rect + :name "Rect1" + :fills [{:fill-color "#abcdef" + :fill-opacity 1 + :fill-color-ref-id (thi/id :color1) + :fill-color-ref-file (thi/id :library)}])) + + ; Action + file' (ctf/update-file-data + file + #(ctf/absorb-assets % (:data library))) + + _ (thf/validate-file! file') + + ; Get + colors' (ctcl/colors-seq (ctf/file-data file')) + shape1' (thf/get-shape file' :shape1) + fill' (first (:fills shape1'))] + + ; Check + (t/is (= (count colors') 1)) + (t/is (= (:id (first colors')) (thi/id :color1))) + (t/is (= (:name (first colors')) "Test color")) + (t/is (= (:color (first colors')) "#abcdef")) + + (t/is (= (:fill-color fill') "#abcdef")) + (t/is (= (:fill-color-ref-id fill') (thi/id :color1))) + (t/is (= (:fill-color-ref-file fill') (:id file'))))) (t/deftest test-absorb-typographies - (let [library-id (uuid/custom 1 1) - library-page-id (uuid/custom 2 2) - file-id (uuid/custom 3 3) - file-page-id (uuid/custom 4 4) - - library (-> (thf/sample-file library-id library-page-id {:is-shared true}) - (thf/sample-typography :typography1 {:name "Test typography"})) - - file (-> (thf/sample-file file-id file-page-id) - (thf/sample-shape :shape1 - :text - file-page-id - {:name "Text1" - :content {:type "root" - :children [{:type "paragraph-set" - :children [{:type "paragraph" - :key "67uep" - :children [{:text "Example text" - :typography-ref-id (thf/id :typography1) - :typography-ref-file library-id - :line-height "1.2" - :font-style "normal" - :text-transform "none" - :text-align "left" - :font-id "sourcesanspro" - :font-family "sourcesanspro" - :font-size "14" - :font-weight "400" - :font-variant-id "regular" - :text-decoration "none" - :letter-spacing "0" - :fills [{:fill-color "#000000" - :fill-opacity 1}]}]}]}]}})) - absorbed-file (ctf/update-file-data - file - #(ctf/absorb-assets % (:data library))) - - typographies (ctyl/typographies-seq (ctf/file-data absorbed-file)) - page (ctpl/get-page (ctf/file-data absorbed-file) file-page-id) - - shape1 (ctn/get-shape page (thf/id :shape1)) - text-node (d/seek #(some? (:text %)) (txt/node-seq (:content shape1)))] - - (t/is (= (count typographies) 1)) - (t/is (= (:id (first typographies)) (thf/id :typography1))) - (t/is (= (:name (first typographies)) "Test typography")) - - (t/is (= (:typography-ref-id text-node) (thf/id :typography1))) - (t/is (= (:typography-ref-file text-node) file-id)))) + (let [; Setup + library (-> (thf/sample-file :library + :name "Test library" + :is-shared true) + (thf/add-sample-typography :typography1 {:name "Test typography"})) + + file (-> (thf/sample-file :file + :name "Test file") + (thf/add-sample-shape :shape1 + :type :text + :name "Text1" + :content {:type "root" + :children [{:type "paragraph-set" + :children [{:type "paragraph" + :key "67uep" + :children [{:text "Example text" + :typography-ref-id (thi/id :typography1) + :typography-ref-file (thi/id :library) + :line-height "1.2" + :font-style "normal" + :text-transform "none" + :text-align "left" + :font-id "sourcesanspro" + :font-family "sourcesanspro" + :font-size "14" + :font-weight "400" + :font-variant-id "regular" + :text-decoration "none" + :letter-spacing "0" + :fills [{:fill-color "#000000" + :fill-opacity 1}]}]}]}]})) + ; Action + file' (ctf/update-file-data + file + #(ctf/absorb-assets % (:data library))) + + _ (thf/validate-file! file') + + ; Get + typographies' (ctyl/typographies-seq (ctf/file-data file')) + shape1' (thf/get-shape file' :shape1) + text-node' (d/seek #(some? (:text %)) (txt/node-seq (:content shape1')))] + + (t/is (= (count typographies') 1)) + (t/is (= (:id (first typographies')) (thi/id :typography1))) + (t/is (= (:name (first typographies')) "Test typography")) + + (t/is (= (:typography-ref-id text-node') (thi/id :typography1))) + (t/is (= (:typography-ref-file text-node') (:id file'))))) -- Gitee From 22939aa689847b2a55d919608feb592fa1dbb120 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Fri, 26 Apr 2024 11:55:56 +0200 Subject: [PATCH 0469/1266] :bug: Fix inspect permission on shared prototype for owners --- frontend/src/app/main/ui/viewer/header.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/viewer/header.cljs b/frontend/src/app/main/ui/viewer/header.cljs index 77460f0b6..abf81479f 100644 --- a/frontend/src/app/main/ui/viewer/header.cljs +++ b/frontend/src/app/main/ui/viewer/header.cljs @@ -332,7 +332,7 @@ :title (tr "viewer.header.comments-section" (sc/get-tooltip :open-comments))} i/comments]) - (when (or (= (:type permissions) :membership) + (when (or (:in-team permissions) (and (= (:type permissions) :share-link) (= (:who-inspect permissions) "all"))) [:button {:on-click go-to-inspect -- Gitee From bebdc78ce6d34b38058f2badfd6f0523115185e3 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 25 Apr 2024 15:35:53 +0200 Subject: [PATCH 0470/1266] :bug: Fix problem with exporter texts --- frontend/src/app/main/ui/shapes/export.cljs | 6 +++++- frontend/src/app/main/ui/shapes/shape.cljs | 7 +++++++ frontend/src/app/worker/import/parser.cljs | 20 ++++++++++++++++---- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/frontend/src/app/main/ui/shapes/export.cljs b/frontend/src/app/main/ui/shapes/export.cljs index d10378e19..8ac2387e8 100644 --- a/frontend/src/app/main/ui/shapes/export.cljs +++ b/frontend/src/app/main/ui/shapes/export.cljs @@ -122,7 +122,11 @@ (add! :stroke-cap-end))) (cond-> text? - (-> (add! :grow-type) + (-> (add! :x) + (add! :y) + (add! :width) + (add! :height) + (add! :grow-type) (add! :content (comp json/encode uuid->string)) (add! :position-data (comp json/encode uuid->string)))) diff --git a/frontend/src/app/main/ui/shapes/shape.cljs b/frontend/src/app/main/ui/shapes/shape.cljs index cbda63671..e0ab37c45 100644 --- a/frontend/src/app/main/ui/shapes/shape.cljs +++ b/frontend/src/app/main/ui/shapes/shape.cljs @@ -94,6 +94,13 @@ (obj/unset! "disable-shadows?") (obj/set! "ref" ref) (obj/set! "id" (dm/fmt "shape-%" shape-id)) + + ;; TODO: This is added for backward compatibility. + (cond-> (and (cfh/text-shape? shape) (empty? (:position-data shape))) + (-> (obj/set! "x" (:x shape)) + (obj/set! "y" (:y shape)) + (obj/set! "width" (:width shape)) + (obj/set! "height" (:height shape)))) (obj/set! "style" styles)) wrapper-props diff --git a/frontend/src/app/worker/import/parser.cljs b/frontend/src/app/worker/import/parser.cljs index a0da1e60d..fab4075ca 100644 --- a/frontend/src/app/worker/import/parser.cljs +++ b/frontend/src/app/worker/import/parser.cljs @@ -272,9 +272,21 @@ (def has-position? #{:frame :rect :image :text}) (defn parse-position - [props svg-data] - (let [values (->> (select-keys svg-data [:x :y :width :height]) - (d/mapm (fn [_ val] (d/parse-double val))))] + [props node svg-data] + (let [x (get-meta node :x d/parse-double) + y (get-meta node :y d/parse-double) + width (get-meta node :width d/parse-double) + height (get-meta node :height d/parse-double) + + values (->> (select-keys svg-data [:x :y :width :height]) + (d/mapm (fn [_ val] (d/parse-double val)))) + + values + (cond-> values + (some? x) (assoc :x x) + (some? y) (assoc :y y) + (some? width) (assoc :width width) + (some? height) (assoc :height height))] (d/merge props values))) (defn parse-circle @@ -392,7 +404,7 @@ center (gpt/point center-x center-y)] (cond-> props (has-position? type) - (parse-position svg-data) + (parse-position node svg-data) (= type :svg-raw) (add-svg-position node) -- Gitee From 3a71068a4868d4a76132fb7501dab1a7b93c0e56 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Fri, 26 Apr 2024 12:16:05 +0200 Subject: [PATCH 0471/1266] :bug: Add warning when font cannot be found --- frontend/src/app/main/fonts.cljs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/fonts.cljs b/frontend/src/app/main/fonts.cljs index a17201124..31949e7fe 100644 --- a/frontend/src/app/main/fonts.cljs +++ b/frontend/src/app/main/fonts.cljs @@ -133,7 +133,10 @@ (defn- fetch-gfont-css [url] (->> (http/send! {:method :get :uri url :mode :cors :response-type :text}) - (rx/map :body))) + (rx/map :body) + (rx/catch (fn [err] + (.warn js/console "Cannot find the font" (obj/get err "message")) + (rx/empty))))) (defmethod load-font :google [{:keys [id ::on-loaded] :as font}] -- Gitee From ff4e27a1d5154ad7f671ba3a19f253f6fe7da7eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Thu, 25 Apr 2024 16:57:37 +0200 Subject: [PATCH 0472/1266] :white_check_mark: Add composition helpers --- .../common_tests/helpers/compositions.cljc | 42 +++++++++++++++++++ common/test/common_tests/types_file_test.cljc | 37 ++++------------ 2 files changed, 51 insertions(+), 28 deletions(-) create mode 100644 common/test/common_tests/helpers/compositions.cljc diff --git a/common/test/common_tests/helpers/compositions.cljc b/common/test/common_tests/helpers/compositions.cljc new file mode 100644 index 000000000..6306fc51a --- /dev/null +++ b/common/test/common_tests/helpers/compositions.cljc @@ -0,0 +1,42 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns common-tests.helpers.compositions + (:require + [common-tests.helpers.files :as thf])) + +(defn add-rect + [file rect-label] + (thf/add-sample-shape file rect-label + :type :rect + :name "Rect1")) + +(defn add-frame + [file frame-label] + (thf/add-sample-shape file frame-label + :type :frame + :name "Frame1")) + +(defn add-frame-with-child + [file frame-label child-label] + (-> file + (add-frame frame-label) + (thf/add-sample-shape child-label + :type :rect + :name "Rect1" + :parent-label frame-label))) + +(defn add-simple-component + [file component-label root-label child-label] + (-> file + (add-frame-with-child root-label child-label) + (thf/make-component component-label root-label))) + +(defn add-simple-component-with-copy + [file component-label main-root-label main-child-label copy-root-label] + (-> file + (add-simple-component component-label main-root-label main-child-label) + (thf/instantiate-component component-label copy-root-label))) diff --git a/common/test/common_tests/types_file_test.cljc b/common/test/common_tests/types_file_test.cljc index 1e316bc78..04b76b565 100644 --- a/common/test/common_tests/types_file_test.cljc +++ b/common/test/common_tests/types_file_test.cljc @@ -17,6 +17,7 @@ [app.common.types.pages-list :as ctpl] [app.common.types.typographies-list :as ctyl] [clojure.test :as t] + [common-tests.helpers.compositions :as tho] [common-tests.helpers.files :as thf] [common-tests.helpers.ids-map :as thi])) @@ -63,10 +64,7 @@ (t/deftest test-create-components (let [f1 (-> (thf/sample-file :file1) - (thf/add-sample-shape :main-root :type :frame) - (thf/add-sample-shape :main-child :parent-label :main-root) - (thf/make-component :component1 :main-root) - (thf/instantiate-component :component1 :copy-root))] + (tho/add-simple-component-with-copy :component1 :main-root :main-child :copy-root))] #_(thf/dump-file f1) #_(thf/pprint-file f4) @@ -105,21 +103,11 @@ (t/deftest test-absorb-components (let [; Setup - library (-> (thf/sample-file :library - :is-shared true) - (thf/add-sample-shape :main-root - :type :frame - :name "Frame1") - (thf/add-sample-shape :rect1 - :type :rect - :name "Rect1" - :parent-label :main-root) - (thf/make-component :component1 :main-root)) + library (-> (thf/sample-file :library :is-shared true) + (tho/add-simple-component :component1 :main-root :rect1)) file (-> (thf/sample-file :file) - (thf/instantiate-component :component1 - :copy-root - :library library)) + (thf/instantiate-component :component1 :copy-root :library library)) ; Action file' (ctf/update-file-data @@ -149,14 +137,11 @@ (t/deftest test-absorb-colors (let [; Setup - library (-> (thf/sample-file :library - :name "Test library" - :is-shared true) + library (-> (thf/sample-file :library :is-shared true) (thf/add-sample-color :color1 {:name "Test color" :color "#abcdef"})) - file (-> (thf/sample-file :file - :name "Test file") + file (-> (thf/sample-file :file) (thf/add-sample-shape :shape1 :type :rect :name "Rect1" @@ -189,13 +174,10 @@ (t/deftest test-absorb-typographies (let [; Setup - library (-> (thf/sample-file :library - :name "Test library" - :is-shared true) + library (-> (thf/sample-file :library :is-shared true) (thf/add-sample-typography :typography1 {:name "Test typography"})) - file (-> (thf/sample-file :file - :name "Test file") + file (-> (thf/sample-file :file) (thf/add-sample-shape :shape1 :type :text :name "Text1" @@ -237,4 +219,3 @@ (t/is (= (:typography-ref-id text-node') (thi/id :typography1))) (t/is (= (:typography-ref-file text-node') (:id file'))))) - -- Gitee From 40e43fd5016993089986b4fd0c5566f99d1e885d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Fri, 26 Apr 2024 12:28:52 +0200 Subject: [PATCH 0473/1266] :recycle: Reorganize tests by level --- .../logic/logic_comp_creation_test.cljc | 45 +++++++++++++++++++ .../types_libraries_test.cljc} | 34 +------------- 2 files changed, 46 insertions(+), 33 deletions(-) create mode 100644 common/test/common_tests/logic/logic_comp_creation_test.cljc rename common/test/common_tests/{types_file_test.cljc => types/types_libraries_test.cljc} (88%) diff --git a/common/test/common_tests/logic/logic_comp_creation_test.cljc b/common/test/common_tests/logic/logic_comp_creation_test.cljc new file mode 100644 index 000000000..577bef06f --- /dev/null +++ b/common/test/common_tests/logic/logic_comp_creation_test.cljc @@ -0,0 +1,45 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns common-tests.logic.logic-comp-creation-test + (:require + [app.common.files.changes-builder :as pcb] + [app.common.files.libraries-helpers :as cflh] + [clojure.test :as t] + [common-tests.helpers.files :as thf] + [common-tests.helpers.ids-map :as thi])) + +(t/use-fixtures :each thi/test-fixture) + +(t/deftest test-add-component-from-single-shape + (let [; Setup + file (-> (thf/sample-file :file1) + (thf/add-sample-shape :shape1 :type :frame)) + + page (thf/current-page file) + shape1 (thf/get-shape file :shape1) + + ; Action + [_ component-id changes] + (cflh/generate-add-component (pcb/empty-changes) + [shape1] + (:objects page) + (:id page) + (:id file) + true + nil + nil) + + file' (thf/apply-changes file changes) + + ; Get + component (thf/get-component-by-id file' component-id) + root (thf/get-shape-by-id file' (:main-instance-id component))] + + ; Check + (t/is (some? component)) + (t/is (some? root)) + (t/is (= (:component-id root) (:id component))))) diff --git a/common/test/common_tests/types_file_test.cljc b/common/test/common_tests/types/types_libraries_test.cljc similarity index 88% rename from common/test/common_tests/types_file_test.cljc rename to common/test/common_tests/types/types_libraries_test.cljc index 04b76b565..0eab0db07 100644 --- a/common/test/common_tests/types_file_test.cljc +++ b/common/test/common_tests/types/types_libraries_test.cljc @@ -4,11 +4,9 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns common-tests.types-file-test +(ns common-tests.types.types-libraries-test (:require [app.common.data :as d] - [app.common.files.changes-builder :as pcb] - [app.common.files.libraries-helpers :as cflh] [app.common.text :as txt] [app.common.types.colors-list :as ctcl] [app.common.types.component :as ctk] @@ -71,36 +69,6 @@ (t/is (= (:name f1) "Test file")))) -(t/deftest test-add-component-from-single-shape - (let [; Setup - file (-> (thf/sample-file :file1) - (thf/add-sample-shape :shape1 :type :frame)) - - page (thf/current-page file) - shape1 (thf/get-shape file :shape1) - - ; Action - [_ component-id changes] - (cflh/generate-add-component (pcb/empty-changes) - [shape1] - (:objects page) - (:id page) - (:id file) - true - nil - nil) - - file' (thf/apply-changes file changes) - - ; Get - component (thf/get-component-by-id file' component-id) - root (thf/get-shape-by-id file' (:main-instance-id component))] - - ; Check - (t/is (some? component)) - (t/is (some? root)) - (t/is (= (:component-id root) (:id component))))) - (t/deftest test-absorb-components (let [; Setup library (-> (thf/sample-file :library :is-shared true) -- Gitee From a8fae53564600c0a4004f4d4288595570f1d0509 Mon Sep 17 00:00:00 2001 From: AzazelN28 Date: Wed, 24 Apr 2024 16:07:47 +0200 Subject: [PATCH 0474/1266] :bug: color palette sorting --- common/src/app/common/colors.cljc | 23 +++++++++++++++++++ .../ui/workspace/colorpicker/libraries.cljs | 8 +------ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/common/src/app/common/colors.cljc b/common/src/app/common/colors.cljc index 69de60bd5..1f34903a4 100644 --- a/common/src/app/common/colors.cljc +++ b/common/src/app/common/colors.cljc @@ -274,6 +274,13 @@ (catch #?(:clj Throwable :cljs :default) _cause [0 0 0]))) +(defn hex->lum + [color] + (let [[r g b] (hex->rgb color)] + (mth/sqrt (+ (* 0.241 r) + (* 0.691 g) + (* 0.068 b))))) + (defn- int->hex "Convert integer to hex string" [v] @@ -455,3 +462,19 @@ :else [r g (inc b)])) + +(defn reduce-range + [value range] + (/ (mth/floor (* value range)) range)) + +(defn sort-colors + [a b] + (let [[ah _ av] (hex->hsv (:color a)) + [bh _ bv] (hex->hsv (:color b)) + ah (reduce-range (/ ah 60) 8) + bh (reduce-range (/ bh 60) 8) + av (/ av 255) + bv (/ bv 255) + a (+ (* ah 100) (* av 10)) + b (+ (* bh 100) (* bv 10))] + (compare a b))) diff --git a/frontend/src/app/main/ui/workspace/colorpicker/libraries.cljs b/frontend/src/app/main/ui/workspace/colorpicker/libraries.cljs index 9bb4f067e..1c3ef0ed8 100644 --- a/frontend/src/app/main/ui/workspace/colorpicker/libraries.cljs +++ b/frontend/src/app/main/ui/workspace/colorpicker/libraries.cljs @@ -54,13 +54,7 @@ get-sorted-colors (mf/use-fn (fn [colors] - (sort (fn [a b] - (let [[ah _ al] (c/hex->hsl (:color a)) - [bh _ bl] (c/hex->hsl (:color b)) - a (+ (* ah 100) (* al 99)) - b (+ (* bh 100) (* bl 99))] - (compare a b))) - (into [] (filter check-valid-color?) colors)))) + (sort c/sort-colors (into [] (filter check-valid-color?) colors)))) toggle-palette (mf/use-fn -- Gitee From d956f7c72c0a61fa7159d7965bd0fc79a6237795 Mon Sep 17 00:00:00 2001 From: Yamila Moreno Date: Tue, 30 Apr 2024 12:21:28 +0200 Subject: [PATCH 0475/1266] Update README.md update penpot fest information --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 64b9649bc..52171b8c9 100644 --- a/README.md +++ b/README.md @@ -43,8 +43,7 @@ Penpot is available on browser and [self host](https://penpot.app/self-host). It Penpot’s latest [huge release 2.0](https://penpot.app/dev-diaries), takes the platform to a whole new level. This update introduces the ground-breaking [CSS Grid Layout feature](https://penpot.app/penpot-2.0), a complete UI redesign, a new Components system, and much more. Plus, it's faster and more accessible. -🎇 **Penpot Fest is back!** Our design, code & Open Source event is happening in Barcelona | June 5-7th. [Get your tickets](https://www.eventbrite.es/e/penpot-fest-2024-tickets-859331883797) to join other designers and developers from open-source communities and beyond. -Check out the highlights from [Penpot Fest 2023 edition](https://www.youtube.com/watch?v=sOpLZaK5mDc)! +🎇 **Penpot Fest** is our design, code & Open Source event. Check out the highlights from [Penpot Fest 2023 edition](https://www.youtube.com/watch?v=sOpLZaK5mDc)! ## Table of contents ## -- Gitee From f84cd933a8fb7147e4c4136beced8fe9249db6a1 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 30 Apr 2024 09:45:27 +0200 Subject: [PATCH 0476/1266] :sparkles: Swap and reset generate changes tests --- common/test/cases/swap-and-reset.penpot | Bin 0 -> 17080 bytes .../logic/swap_and_reset_test.cljc | 176 ++++++++++++++++++ 2 files changed, 176 insertions(+) create mode 100644 common/test/cases/swap-and-reset.penpot create mode 100644 common/test/common_tests/logic/swap_and_reset_test.cljc diff --git a/common/test/cases/swap-and-reset.penpot b/common/test/cases/swap-and-reset.penpot new file mode 100644 index 0000000000000000000000000000000000000000..d8ea3188a46b8883eb8f57ffaf42a293dcec5433 GIT binary patch literal 17080 zcmX9_1zc0#+aDo}k}d%qA)*osVt}-i0*+FU919rD7$wrFG}0x~B@!y#O8giKA|j2_ z0wN$S@LvA!K0CYj+!ObS@AI7JKKG1*;YuV5^UCHU=>I&yG7flR}AfL);TB>4d|NqNH;m;kEX-CS|5Bu@MVk5ZlvXm^~%#i<0z&mG4Kup{Au!xDfh zk>CQH?Xh1l3Jj1SIS_GZtb`}d!xiL;cEK(1nBY7~5DY*$#M1}u4nezOApiw95)tR^ zDnd_k@N%(pMH8Gi7-vXm`vp2WH#vj z$^GLcS_bJOyCOTr6z$sVTe1=*uK$wW=nqpc{D9hqzO*(><0z?_dp`Zy)gxeKtrK$s94RVXZd6L>>>5YhMDodIU$1~ zgX0kv_h!ik$B`U_@OK;q(B#-3$~XjE291-;epYEI4MoVx!DKMfHR`|B7Z?&G&7N{z z;C7mTC3s2z*dXGt`$MlJ-HC1hKZpDc%!V<+-oaFVey*wc5xGBK;0D06Jxj=8^=0<{O0dktXK--ir$ZyVvfF(H` ztAs!KpuNJCGK@L^l!|nB|8j&Y1{cW@~}P9_QvFb#YFyNtObUVIVSsEHmv3 zoA&dC`^~$%5nM^0g{u_HAW-RY=`x6p1Q?Si-i_$8wZPmT+^G!1=nn5lQ>Z0P`0o080|iZWt#|64A{G zV0e+j*|Tto9^>ZhM*JbH#pvda#t=w;6rP0}^nkF8KSS;CF~QBj)U?|QsZxLb910Nf z3QK?%qKXagc37~+h5fFdRoCnu>IWVwfFQ?J)+0q!_M9KMQn5^@LuJJm5~DK$I7YkL zJLAaW7!p~^XoUb5YQ{sSWRynXYU#4kig8Zq zva!I>5E-ROMrrGol2P~d56Gwo)5HZjd!n0<1i=@FUARnemGCCud~ie#2?7b{BHt`M3Gg#}j0EgaRREwffG!MfZ}Gwnl2JB=OWXTqQTh3iGYXKKB%CiGjAPZvlnd8R zMTQ-#CN3lR$ui=KN-D>yQ6!Ywv1(Ep0EMKq$dtT1G75+GBDqNbWQ)%Nx5PLQoUwrJ z#TS?W4500aXm@~X9EpqyVQ?n6;v{BZl5l_?iFv>|yPyH)!!E9nQ4tq+mY8*QbEQW+ z6YO1QopJadfJ0;Qbn_x&aGn6>0K5>M;HD9>KGIMqvp1SZK>r}(?7f`PL@W;DM!f8d zBav`K3C|0_xY|!ap?I_l!P$?D3bC;HvHI#GvAki|tkJ4~*q-uK<|Y19SmO2Bz|+ z2=Tw;yQf7)JvoCvUbz7MMTuNMdEI?raKi+mp`&J?tqC#F(KUu>>FQ|;3JTKG>!Y1; z5Htkquth~hk#p*90Nm`+?m#@_DJG-N?SO9L*?(T4eG>FBA2teBh zz`Zlhm(3F}^*LaPB(i$~qP#FSz{&YY0K+f*o0p60DVL*{Cy9XfyHIQs9vCA5z~#b0 z0R3=4JhNC_T#T|SD#C!sC^t|^2|zdOnrV7TNzuiK5;Cgv!ef*Jt(8D|4U{(^0Jyam zt@UKo+l%A-3y(lXHIPxw7u8lWs_kM>2hh2TjOzK=M@IEuH2hb#kADrmD3L!jodM_V zIgcR_F#y?8#$ob`#$m0%_ZJZA0INO`KrYEs!W#et&f#M47XX2)7saR(0Cb@ua8NQT zB&!%50#Y@a=rk$>AbdD6aRF31A`U-13cxfKCJ8adIRoYaAvxe60MGzy!$CCM-2Ld` zK+{F^10WJuZGa#MLXVJy+;s!MDP(jJ4ME(1)dq;ea6%9_S67^mvmZoS5~53j0AA0_ z84Ce$iHZkkApp3v1aNt-2vn7Ts)`}tC)JD{&>iO&A0tBPvf(el$Qn0OEj9 z>VW;i0071^7lZ+UPGrqGBQSu!nmU-^okPoEy`^Q4((X7JL7cY((c$zor*Q39HC)lF z!zUQhag>>_EFB@3nc@6{6{4z$K$0P+n@Zjb>N{4C?*0yV&ZiLc3x(q&&?;JgwH z=pHz}0q+mZV*qE5BOa>?sm=o7^ab9CIGe&{z5xbk{^=0l(Zh2trl167ms3K**COlcme3K$FQ8p;OjV?$edS zkzmj@l$rpr${0g2^`K)_g$vmntLiO-dTm{lgYTP`TrA-ig)B)bJX933S-b$~hYyjn z7br1dQ8ZyOz4`xzyLjrFuP!(y?;}oGaW;0WTwigu>uBI1-MP!C+;vc6b~TAq#~9 zpux%Ev3QJ(9TY1kBZ~w=Odv+b*ui9_?Vtz@QU+~@#Le4zVVrQJ1BTOCyWiGK~KPw1Rn^pntCS#m)2ft6g&opGCa)KSICJQ3a9BRKv;m&n}f+<|~ zDF#*VVqHu#Dn<$SOD`u0{VR;O2^+hdTDz&&;cPhh{ED(s{RCE{mP*sko)l_I8)5(v z-1t2e@baK7ui+**xn^s#eF%RrlRH6|<@s4@#V4rgf}N9A$#y&q(br<2-T#!FliW<%YhDVxl^TuH$;c*~nh;A5Pvt zU$fBg(pwXbkXw;Z+ROa5+SWg)JL|fqVEhYF494hNqg!pt#2()r`75Sxc;8mp z2vN*(yB0Rz@!WyLBDz|O5=$ADCfGPRIn{j_n|!Ep9ZdDYOxhEF8kd}MN+auDNVp=0 zb_Tz1D^pi9i!PUrqxm5v_TzxoJFDay?F($}bah%T^x55?^txZJ2IpaU6LFUr6@L)J z;Hkf&p4Cy#CHTf~9UPU})KzT>K;o?>`3ALkoDN}(q?Z-t2kXrWd=KyBU3roti)8!^ zuj){tqkGjcl;bxM>9@OFZs64@Xv5V_^70zO@$7$mn~}?G5RNvtZjV;_AV%|0~W(IYC6>I2nNgoaDSUd!^&CJmL0SDV!enTCsMYu;Fr znwlgjdj0xpnYO1QJYdAms1hrD``MpH@S-fGylWz+De5NuR!CEvrDNGW10J40M?zMU zRdVWHjY(_!*UNr}Dn0ox0`r2b$D3RR7PncycXSnZzru#srv2yTX(`n`>&b zUr<0dFFaGMD>#Jy6>l)PGCYQra<<@SqNe&RBPVlby~L)Pt>n#{ATRiJZ`-QR9-}%1 zl~8Jyo>(x&Im3vLa|5{zA%$L+VBEo)t?KtHak9>0TrUdv8X6jcOmF1| zGCoOL2b({4iT{#H`-PFAYq)-R^p3Tj#7CCMUu(M3IQUP5LNCK}SZGQvKebup(HjUj zTR7?C6g`ucR5UbO)}=r=saQ@Y`LHNH4)Yp_sE_r_dDhiGov)!?#&I4rFXk#BNn z($;f}SzND@T#uEY7lHGpRywk-GxAYD3!ol*5;#$h7&p~>jrr7iLket0hivXAlej6` zp0L>RN_TpYHzgz_-v8E^5Y@Xgdtm#Re23{o;_O#Qj4vhaw6dAwxd*{>bjEwQMl)lk z#pm-kuX<+58XH&bn@Q#3)GP%{?qYA>*Vg`MI1+Er%rJXkV}C34*ijj`c#s+cVkn&| za1eKJvk5#lvR=H-7=HWd?OeTf>U%mYCQCblZg1XIC24Ln(F+$~U=J zmmf7W%qh4E1=G<{4X!%P)31B$kGDHl$_klqf>F|^9%4L}D&BQ(xDiSCdAbw z?2$Ih0{r!@M2Nw6b&%1UHSxaIpNKyigXuPRD6XbMYrnV4^WJ>N=}pRZ9#apmpr?rb zqR7Tb{Y_3z+xzLaS`WI>vAu81oTewd&R_K3+!BdKyk`lv)(ZQcnNHnxuA`yRvw9RE zDWrGjYKN@wz=O3b?P1da?<3qy=_$}Olp*s9;Prne*Xee@St$A3tT>j=(Xug2)nO@h z76h$na(t%<{JMg8pA!_b6MB^<9#pd4{Dz9{YxH&Z2p3Q5r*qTc+l}^k7DLv(e5ADIw7Vpg?QCad_54J&QXEs?> zLWwf*-Xh&|w!Fvf|GrK0j>>m${NBvPVT*^dD&}mSAas~gLsdIJcdQ?H&c)vqqT*&L zX=&NQ>pyDfX&T|a^^w=kevLI)T1Y{E#3txu^Gvc)0-mNnH95f)RT{wboBQ-#){7hI zS7(1!Q6zIJ#e1wiQeuEI)D3Hq6xFy z6%|1#5`)vWmK6srvSsR{EHDc-h{Eyn z>~E1fd-wA`3zKRhK<}JsawG^si+nFr#k#yihmx%YEcLn4+%Ao0^+dl+P!eDxL+R zO?A<<_$SG|QflVi{pCznzEmFJGnqBl66Uyb?^V|w6aXUzS?r@zT|>`9>aSO(ua30S#(X= z8NEz+<+-LT&Y`0&_`p-}%`W$K4xyWaJ9f*2kQk%1q@w7&Wew{Use8{IQXzy#yFZt8 zLp(;SAL}H3_>{M(VO@GdZ^JoNq~|n$z%?muUP%zA~g_eAm`a2!HI@ zkN7Yv8oOX0J)p5NdtFbBIX7VsUh5>HJ9T;OrS6#`^LA9hT7pK`eDm^hujkgCysfiF z=3EQPZ`or?N^JsmqPxaDP~Ce7=ETSXF(ol-YegmU8&|gu(<`5s=;$zX8i%5aL?329BuvE4_nCs z3U`p_r+@9@?0o2=eBitX#kA?og=IP~6Z#u<^Nt3i950>bQPO}z|MV3P>HAEhK9FqpE~r}O#v~)gq4-m?vJLQHfRBX|_C65Q;4( zou8e`tiAmUD$1TK!{my;+Z0mzxM-GkM0Lk{c4Tt$$=7Fuc)Azs1O?2V^5eN!uhW(q z;w_yhcHw7LEnp~k@A!1%I4LQqVe_)4y@Xgx&nNI(_T>yx35z& z4z@~BhYFOGcU;y;`u(;#6uf(WZ@%j0NXkI;=T#ml_s6iLmrto7V!t|S!e{xPiO!;MKPj@R}c30-`p!6P3Sr!d;NK-xt{%$r_E4Uj~EqUyE;))ay@~2q4qWtKM-<+ z6ozRtQQ2td80&eal!zxTk)ROgI4wR|4vVnc;kB{RAK4D@bw7oNM=dR?42xR*!K#0! zGZP`s5qZTuOs}h1d*MCEfIxWS9#0b*vXYg3CC|(H$xpUwcD(r2M#&1X{}g(pr}~xSvWIXFxSjuF`eW(N zpugU68@u+j{ITT?^7p5ry=4{hbJB59`K3)SHo#L(t9HeZ;He_knI0i;hCw6$5OHFy zf{H~u5CPt*eUjDO+-%NcJZEgOq-Hg4-{^8@S3w^NMf zjp5xnGF%3YPQz1{HuN`ItJ%|rZV0Y@-fjNma$htd0Xg&AC)8$u4#SJN^x~z0m!st1 z@yjG^Ii0H@)F4)*Zb8^~^Ba+0uD^D=ha=)3#SWbHR*+Dj72kIvm!q4v2C_eW7|SH6 z5dub~JmkB))sG)_LLcgKmVNZ7t&`?qH1GtiR~>sV{M+Nu&pGBn zg(A2PiXuYzX?8YLmik7#Nwzqn(k=Z$HL&-+nzK%W$*;#b;YMln2{+X;>OYzD1%h8i zJTK7X&`(h3D!R_1xKaL!{vT}tik8W_cmC4b@Dkk&Jv=-t`27Lzf%;SVfULT3d4_vI zLFbI-2SbL78_tt|->F4E3@cenf7HXvnR6sUc&-fU*~-52xou?^7A7IV^!_((YK*jT z9@IXhR`y&Ac$x$gyq*`>B$&M=+oSaBglsMi5=|sQxnHxV92S~bBel+hEx21)b_A9i z|L7Vn8dO;}_5aeRr_UzYY1GznYGmvRyz8e5jzaMACl`%CuQ5tQQh$)3>5Z}dWXx>y z-pqDdjCq%p%G>Ti*M|+LY@C^vk-yWW-{BQR^LS%p=(Bg9{7dfWe(Ea_qT8M5eJeV+ zx3?#jsaG&EV#sxt{3g8jv8tg%dqTkqPl?C7kT~9N$pWA1eGi|_+kf&|&E@x?BCRZX z-sq8b>D2UQDww=`I48`Zc`Z!Pb69#i7|(OQLztxfR>z|gMoZh{JCv2Zryll3fY)68 z$2moIxPD++ufzi&M*-5+G`L%>ZW~Gk!{YHW(lA*ddyj+Su(D8`oiql4m4nLJA!RXm zJPrqwk(b6nu`*~`J6SndG*(^)kA-9LSUEfb36rOcp_KVjOV7>D%{kO>lq6s$vWuy%9^3WJj*cwUN+w$mK3f67P2|+_RL841U zn#ho#_jR!>MgJX-Aki|?XgMH(g8|aLNI3))E)T=Y<8V;8og7kH4j~U@c5oPZq%7PH z0k^ZWLr5dh^73*r@-SIhyfhq6P3yP*asYU%LiH)9>z;)nhvwFOyBui&UPXyBwHS)? zYlL^Fm)5G{K3$ng`q(-P{`~kxGrHsc_bOG?ANOke+>iTAt!u~a=cf1kjOPLZeD;PI zC_mFNy8ipkLZfJ{20~j?JWCFuW})E|p#%&6DBwZ6s|p1}*(9H{($F4te@*xxWi_5U zGyd((kLj85#7FH=!I;T(*iM9B7F5C*pMFb(-0my+@9Na%dp*$?M6bQq|E8UJ^Z@_xFuOO9;YWnVsPml`EJ`t(^PbxY;j-pNGSQ=d@&tDgoZCMsGL zl>>dffAZo@7H5~ITx^VsZ>Oi*3?3hs&?EM){;8TW$T)gxZSX)PWod-9JNBM`_;MJO zo7*OfzW#B*-3-=!`6u_oYlS`qMXK?HCxIcc;p@eAY|Gcxe|?UMvd%-B5dDoFbenOj zb(?v7!;8dbJ1hi>#Bw5m2Q=O8MvwPf+TCWEFQ5-|L}K~uPk^RW`IQ@Fcd2IkJUaDjv6h0&mV1#8KsBZuv`=odehe=P66|JT$~c_ZPUE`3XO{GP(^ zpPL0_=F5%!-`vOf-vv?coQs^EuQAEk^fG7kArAjWo+9$*$|OSmg%bu5XVT%%Y-)W} z!?$;0w<4k2xA!kcL#^|+XIMl7Kh9FH_6{Q2`MN*6`K}1*_Vw%a(a1RD^ryWGL>z~% zVD=8XtzhuN67L)n`sbq!0Ty)YorM-by?@W!sDxtE?VrjebpN~b&Xq}q;rgn$3{*~D z9s@(-VK^vK4ljqsBXM#_7!odxmqo~8(NGK$jsb9sL1NL;NNEH@P8x%kk%t1mFqoX3 zJk8M}V0VVyDEj*}g}D|wCKmj?DsF@_!6a|k07QfN>b0lz_vmkNq~0r_-R7bupqPJb zYKC6jRV&D6&`EEgL}*?z)Row!3DtR0gO>g(ZOnN6tD$GSQ;&Skf&;=oOW$e#cz?ZW z&*psZwBx0xId{N@_ld$GisBX|jM64RHu&veBAsVGr3q-1I$1KGaz{)RvQ&Nv@rv?k zR1s}iupa#%0izN}DEAU4B=J9sV9Nd?P)JJo6|$z^C2-LWS3U@SQx$@%pz$=crl2fu zy(9(%BEx9R*to%PFB4|cxrw_A3|5O(k8E> zl2B42nxhaxqkf;kXR7Ad9y25(dUjzw7f7t7a_L( zrAknI<)b&Q&f_uao}RnClCOGt8L`!608LjGR+ExgbCmqKfKI&&eF;hF>GovR<>&W+ zTYAKE%?aDI`i8{DGMYSk#3z^NC&UiSn3K(S;`$q;1v1)nRD9t|IN zcHo!!k-=_r?LWH0XdAsZvszx6tZ75&7Qa~oK`7t~{(-MuyY`{C*KXxguB)1$a`m^b zU+2HqVpcaczW&^vct`;-BrsIl*ci(&ad95{J1aqPfV4>@okx$-_h*1NKL-9DF@uT%`uNUpif# zoO+(I-yrp&%BTQE#d~k9t*JRW{yGnSdVZ$#b78@&9)?6l7Zr&_pT3^Hw_>7vL5jXz z{X}AJZd^sht<8_OA63tf6l(uDIPm#ZHpFyhp1?04Fy_6%!OguM{|ZG53}|?Na(t{X z+v-=S=DV|~+Yl6+nUSIT`0*7Q8k)wqPe(RfK&RZ6#Yc~$jjsVR&~S5;sS2>U;4qc>90(+kVWbbJ^i6j%T) zR?VEZz~(3F?fVA?VBV@*@dkjB_Aj6P`9byX-#->^?v?jL78Vxod~|BdTieuEj&2Z?gA(( z96LEVdABZyx3_=C{gDDwTXT(_y)c`h_GW%{wSi*bb=lXuN97l+DO@QkEYz5?628n8 zb3}5b?f2Q0IQYSS0_DyXjpZFnYfODLF9LyKZ^tGn@H|!rGPJ?T>C2GDpOWf z_0_qWkjc=^Cl=2TDL;?n>+0as?E%?0?pU%X0(LQ;Q&5`PNKmzm zeHU~d$jHP*7!-YKX%q}JrN{mx7QTBYvw2c*7-1^zW!e68VyWF33}`a0%huPI2YBWJ z)6v23AWy9eT;zP(|67EU`}Udu3+a!? za|jpaYGCibRs~*M?l%9QYx5^4H9Ra zy#lVMLE58qf(PN?qUk-f_jACna^6Ok-fp0zHu`-GRs6^SNqo+kGn#5aL3z_BAS2ff z5Y9*XPiz0Z23&HBGT8tIxMaIaE2O1|!K(jRUBj1V07Gj-J)4QQ0k2-oTyLxg_-L~( zd8;PCn-j;QCT^C1LQJaWbE>E59aO6abA{^*DgP7uv*(s%!bjDAhl2tm4VS~>W#Dp9 z83Y;*gjYCuI93`5lLq#&$suLrWpHw`(lS^C9x5k;mH}F@P>j5+w7fi29*7R180yEe z!1@MDQhki0rgqSn$phbe`=ek^EW~+^Q)#-5LNkay<@p7eF@9K=wu=2SoHQ61rj0>&LY-N*S}XiUawd` zHE~b&gKmGXw;iJW$#UDlW~<-sESZXl^WX8wi6N3dZFEig;n;)sI>~Qe$Zzodm-D&Y zMGmG_yU;l5s0wc4!3d%6TxNN?0e^%T+6b(N)~wv}H?ZyL>FIJ# ztD+3nwBqI$;xgZCmdvR%QdwXPjSMeFrk}@%bgA4B743cE@1OayX_m*v))L9XuNNU$ zq?Dp?a3(s<;Hrq!*jf?q$0$`-oA8=_7k@m{K&Sx+Mb!nJ>fF-b|7Ki zG2usW0##hxBfZha>Cw?$Z`q^zP(nHF2{H0a>D^l7MEKCb`JM0o7+9OHCXO`ei0u5; zI93Li5X!fRe!F5($Hexy{o5~FL>BnOBo}(GHMa<#lcn9XYR+Hj?NVc^hNduqoKnL` zTA>WHBI@`*ss6~^PXs0d(Ww1jksgso&0pMt%^~>(R|0zte`mpBQ+j4*=Gt$Ksaz6I z(sBO6M4a{beym_wuDkEqAQDG$RO(`tgei_X5~)%2F&Y#b%3Ye!m{WhF+H~yumftw^ zzctd6jsH$oELp40M}+;h*SD3EKfhd&G<%U~t<2y4hI$F}w1YEDmsM}{t&CsHnKP>s zritEBCZRFQ98W=Bh}R%&uwA) zCzO*LTFMXFtMB?stf+$p%)9$69%o5y7s=DMei7zyoX`+om&-d3NU1bE%nz}hcVndT zfA2bT$nWdwkoCw7iTh2YEA^|72UGD$NoXcUMkbko=A$olRSCD)KK&ImF>P{S z-4%)MTbPRFZ?cG!ddLj-y>y0MOJ06ApO@B}Z@(wJXKNzkJYT)4Ixih|7cP@LfOWD? zHleD3XrzVOgtTm*EHvdz80mMtOWT_$z5hPU%z5~|GvD}RhT|_c1}R0b>+JLGg~9TM zCzV2GN}n z$*AV*X7~Mpox;*sAWlYO?PO#yFdP;GY=V`?z>%^@oSnQZ7K^~*xMqlg}BFk_+yf6YsUt*6o%bN70Jk; zrX1H{d~lskRCNB$N9*5~|1Cv07iQuy(m?o*L;`f70nY~qw(r8wb{J`C7!(JPhml3Y zWMOjhNMO%^EL;YG!vFz342^~3aR?b;#{pso33xy`^WkTMz_DqvmbDwoL2U>;728Hm z_SYEF@=3n*dfK&?x6yyH{j_a--ad%gmq~d}f%c!C%Diva<-@^8hf>OLtC8w5-;h}~ z*yV~eNR}@DJydL1#r0@BTNE3|LcSwiLFR{7)E|*$k3$_qJ;YA8V}O?U`PGi!Zalv$ zxY;7andH!br1Ofxa<75$b02i`Qn6#`6R2F$bu`~t^!{LCf5z=sZV23i!4l4(T z+Q|YNneAlpNIdwh{Cl>adms?lf5{@i+2Rpr$3ei<=l$=&l7BTwVciv~4UVU@BGLuV zL`4W+ij#{2-dd?W7yWR^y>HH4arsO_T__c0KKah*tBCi{5~o7eLx!`mwCci3afTUp z$E%EAm7i`L{Py2!&)way*K<5*a+;i6)=evHJ@E)UcslDDf786TZ}-lV`A!PLScR#L zH*)jUSN}xMI`yJ%`rq4}HJpKLDalUIec^lIgE@%_m%3UQjiq!#50*d1aL--4devJ@ z&sy@!Dp4GGk;FCP)i&yVSf4WdI#jIsXYgh4b&x12#x_Un`3H|&W?Q3&Y2kBMB0VHC z^|&;+!MyJGA@+DYo8}-NkTvLgUPWrIz7MiQR%TvnnCAXoTRZaM1+u2lKXGh7q)_(tpL}RxRF{OG+BoOAQm14@7h)B%;6Umf1tn7-f^vSuJ_Y z_&%7ap?_5G-tR;EM@B|ghkLNj$x-io|NB=V?!S&??2%##VY1VNLbJTJ>orj__S1jI zWo)YOaiOdYsQ)*w*Vh;?Uv9tlUezkGj14ItAby&`VR&%+`M%evctLcTsoj@h!3fro z`4h+7cS1?gy?X1L>a~YGSmJ8Jb1s_hk z{vPYGqM*;uC~>UlnPJW(++iqC(9SLs=w+4L9S#(dNrzTx1^%a z&>Hg;*0Bf{tJH}Nap9-77B+LVuX6YWl*(_gIp0nAm=_sMMM`v>&kkttx@|HO-&7XH z;-B9o(^X9P80vxKHhnoYGUH;h^++EX@kcMQX!VoXonyWpF|z_Ov3ANd_4*R3XGNwF z@p_{|6^2mnJf+bfWa>`b@LqUA!sn{^yGwJPzpFj0Xf4CHM1Q9x5mJtn16Hje3Y5J& z40Sp!5O_0(IO>OiqpQJ_L&rcL@vHv4A5yyLWU{Z$g5Q3IsjjX*F_GPAYTJ4$T6<$` zEMnw)kR}WNnMQNL=>XiE18eDMw9U96NjpR|HN9yzeYX5&V`7m{5t^gTW#q+Nq_neo$@CWdSJ zBgXfKM40nK5YtEmM9`=(exZHuQ|9Pgv2Tly{3#f8Yn8cDvYkoddw5tVgPhj9fys+U z!_1gzX+U9!gOGd4BFOg>8l%P&ZIqnW&OghRN9kj(F{!!NB$OZ~=)j#X zRpnjLm5&E=5BD#9bx$rCo!B+WU$+>Riu7n)l)LGdjxVW8@0=y2xQ)GDzbB<_B%+Gt#WBWPbFQDftq`J-5mD-;gI$r*572dqI-FW9x zmuj;`^3)yg+}zx@QrpRN!Rt5PElAwu8dxFRN=?4%haIIeWV;q6K*V#?MBcK+pzb@aFWL^MvLT30ai^1c+jI1_#U$a;m-j`A4j^NkQDp*y z#0*Np04+uLYx>D=p_ z+dBGJtrBXWjzVPF+Co!~N>X9O!9kxJari@(MNIG7=4fjw&>i8Y4U`OItkLo zOgq1O9L*rR^s++8+hw-(sHd~+-vd*IX}Xyj4~$VlZvq#?r7H20IIw=s`Sva{V}tg7 zPjHN5d!ql&#=n0&w&hl1>Whg5CK7`a%%;m|sQM5}{f+-Fvj{8bar0HfT`iBr%Jr*< zhW7S1yh}{-vc7pP|IzD?f1y#^sGK;sL?*sb9p?Ya$kov7)A_t_;qffAgcyT8L43BH zYcfrr*AuNbN)ax!Ex#(o!N}n6@ZSxe1_YQh`1^forGQ(WISrN%rztiiIh7cfL>N15 zgA?N8l-ytD`3n4^pM%HViT-Ux`}m{UC%f7V`r=-d41D0qdzY!2N1dhqG?aT z!pmXhAb;|%z|jIE_EqYXis|3#Cf8iWo)Yb#45UD)o=k91@~;*zkdZeVjQCn_*WNXN zuRl;PT{*CQ5isoVs#BEFJH0}vaEZpk{LKfYUt-TIp!lVHfuEX&i*A1p4$e#eGx%EA zQ5zqhA41oG$YftHU)+45>BnNB`lCtMD!HzJWeUxk?kB~_w0B+{D^_#pMPbdoJ?)Mi zyD!$!C#^sClhy5w_-*Fd-+_;&@Z6BO^E$$n(cys{x0FxWtmDm2b}sBsL>pA4MjvpP zpH1%gNY;B+-w$FnBrF?vNseFQ`Z+Y@jbRjV%05F z)!-gwK-1q(l&P8QZg&aIF>lR}Qtjowk9Jnvj}~Yts96q+sjHQawjuD2l;ZQN6x3(T6iFUjU8%$%f^yv*m_kP1PrDs z38Y%t^%J-pwFhjX`DdxJzU!t!M=A7T7%M_)MJY7ubuhOy?glR%B?u(+xpa)&3GzJp zx$iCD>KX{V)%B6WcJzPMROwq<-r?TriAq?P3Ob#7a};t@GBryjj;H{pIa#kATy?t?|>PZ1Nsre5Nh&RLGcH z0`3(ywZ)y;Y?oBdHysF2#~GtHGrxbLSyF9={YBF-Ck6NVC}b?xcp8{gew!<^xoh(v zM$f9Y|0|PghYj}EbIlT0_Y+{MN8&%7u(KWKHD`ZkviJV}^`4oX{igEG{v@Gq;mOmd zmUDq8eS7Xf9n~-WDw&(MqF6JVr$*P_y1Kf4>q|I)9CY5NG7hAICC}R*VGT+bnp-|B z$=RGfnF%;rY7Sg(ZsD#2?pE;T{87+Z%)#1d!a7O$bbB zJHeTmB8g#LWo60CtN+YxbN=S+LR0*gY3Hzy3p7iX1|L%ssqc!Gl5MFUQ{N4YCkKHz zma`epy)6C0D$5EAQtsxegIQTwd0AO?vx=zT^eoS5U@XgGy@zbU!@lDEXhsb+mOe2Y zi(oj5I#^H$_^7K_O4Gn6=N^NWJ3^^Kw44q2mghZJL-x^BRS`m-pOq;{cCgq--8IVm z%W}D*KbJt6JeM=Xp?cd_H(&g688rQ#Gz(4{2&1c{z8`7uo88~EbG-b!sOq*Hbh=z! zE5G=$426At;#JVVT&J@-y}aCVZpqjc$8ay1KTp%XP~{&nI9FQrPonh2btyD@DCT!d zaH;Z5`3EPhJ)pl%{EO>$t9uDJHiP5;9N+NnACbv5 z_a9u>|4`;op0HF@cmKXT?D4MxdAbk!?0c)ibQ92@N{`~ne!Nqfx^c2~i{c;A+?|X9 z=V!w4c~}Z<%zp^3tqP$VJSW31?O<)QyZ`!kKxa3}BV7 zo~i2!|K^AJs>-h3eRVpoimNNi5srwZ+qj=0lF}iuLdcGJ9W48j=2lEEPq0yF`DWQV zZa`JNue2F$Sp6PLyb%Zg+Ds+ll=g^GnFCwMpf3s;D9~XK*ps99H+k=EU@Rt<{dLEt ze7}Z;$AarZJU>I8xL~xQss)ufs`3F)j>Q(}^3K#p2z8{{F zUn?reFPpp-|E_I6PW?&`{b1})(OQ?%QLT3ux zSiH0AWSY4SY{Y+JzP%;8S75ZR8K~AapJe`gmg0%NjIw256{Y_1s}z=yAV`^)YV=pC zsTNrh>$MagHL;ACitMU%uKoGQO9EYC_a0mkotOF3a`snZEc32q?{3JHnr2p$e-|WZ zF@?YF)m-h)Ld6o!D{t-6?XN*Zj}v3w%*Ad=>_k{HRRISHQU8vvOY_mF_7R;s53;Sm z`c5ddN#J1$3p7W6Ik@_(JnV`rRS_qOit7(4skLC3V)LkG`}Z~=`f)9ZF+ zzXfCrPMNeqr4xAqx^4=q=#L4|!YTy~+NlLRDUCRWu~i;d%&IgBK3uW=oc0o_GU|L26}f^VO`GJm!V>~?Nb?fFT`+UE`(Y% zxy=6k5;4tQHIl`m=tMS>LAtj#@O<~!C&}O4h5j&$nh1V$2Z~xsC4D9y}W6Nov3G5&W=w`3%2)p8~(N}nNuhOZt z){V5}Y4q`xee(EHFx&7?t5YO@;pT3*${U{ovCBnYP z$Ffs>6>kvt9lvf^@y@4eQSMjjJBxi$R|f@ELP0Qr%C)Z?LtG!9>wRZlzL~RN-1?v~ z_SXS;4ej;|;#9R#ml2`Ou%PuT{E?EtCiL;W+ItYmEm?T8u$7R>X$SKC+R4)A;&I(V z_L;QQpLN`m>ERMPE%{xfSC>D~KXc(JxQhI!t=G&EEHIeXhdj)Jmpr^}^})1p`$nwI zn&k(PdsY%*S!Vj>ye;il25;T%tV%#3DMlLpUgxG7tVikvJV!e6QAYf&tqtCZFg;Y* zUoEZu^}Y)Bi0!?kU;cI1low;~w5d6I5fggc>3vZJ21z5~=AxBf28&3`#HnSY2Fzyc8hfIYy9#x zqW{XzYGo5juIIU=9CMesoKJwht)S?Wm?`l8yNpSZ98Q@R6)la&m*({O*b4gGB=$F0 zyp4~#RLyYj{r}#mwsiE%2 (thf/sample-file :file1) + (thc/add-simple-component-with-copy :component-1 :component-1-main-root :component-1-main-child :component-1-copy-root) + (thc/add-simple-component :component-2 :component-2-root :component-2-child)) + + component-1-copy-root (thf/get-shape file :component-1-copy-root) + component-1 (thf/get-component file :component-1) + component-2 (thf/get-component file :component-2) + page (thf/current-page file) + + ;; Action + [new-shape all-parents changes] + (cflh/generate-component-swap (pcb/empty-changes) + (:objects page) + component-1-copy-root + (:data file) + page + {(:id file) file} + (:id component-2) + 0 + nil + {}) + + file' (thf/apply-changes file changes) + + ;; Get + swapped (thf/get-shape-by-id file' (:id new-shape))] + + ;; Check + (t/is (not= (:component-id component-1-copy-root) (:component-id swapped))) + (t/is (= (:id component-2) (:component-id swapped))) + (t/is (= (:id file) (:component-file swapped))))) + +(t/deftest test-swap-nested + (let [;; Setup + file + (-> (thf/sample-file :file1) + (thc/add-simple-component :component-1 :component-1-main-root :component-1-main-child) + (thc/add-frame :component-container) + (thf/instantiate-component :component-1 :component-1-copy-root :parent-label :component-container) + (thf/make-component :component-container-main :component-container) + (thf/instantiate-component :component-container-main :component-container-instance) + (thc/add-simple-component :component-2 :component-2-main-root :component-2-main-child)) + + page (thf/current-page file) + component-1 (thf/get-component file :component-1) + component-2 (thf/get-component file :component-2) + component-3 (thf/get-component file :component-3) + + copy + (->> + (thf/get-shape file :component-container-instance) + :shapes + first + (thf/get-shape-by-id file)) + + libraries {(:id file) file} + + ;; Action + [new-shape all-parents changes] + (cflh/generate-component-swap (pcb/empty-changes) + (:objects page) + copy + (:data file) + page + libraries + (:id component-2) + 0 + nil + {}) + + file' (thf/apply-changes file changes) + libraries' {(:id file') file'} + page' (thf/current-page file') + + ;; Get + swapped (thf/get-shape-by-id file' (:id new-shape)) + component-1-copy-root (thf/get-shape file' :component-1-copy-root) + slot (-> (ctf/find-swap-slot swapped + page' + file' + libraries') + (ctk/build-swap-slot-group))] + + ;; Check + (t/is (not= (:component-id copy) (:component-id swapped))) + (t/is (= (:id component-2) (:component-id swapped))) + (t/is (= (:id file) (:component-file swapped))) + (t/is (contains? (:touched swapped) slot)) + (t/is (= (ctk/get-swap-slot swapped) (:id component-1-copy-root))))) + +(t/deftest test-swap-and-reset-override + (let [;; Setup + file + (-> (thf/sample-file :file1) + (thc/add-simple-component :component-1 :component-1-main-root :component-1-main-child) + (thc/add-frame :component-container) + (thf/instantiate-component :component-1 :component-1-copy-root :parent-label :component-container) + (thf/make-component :component-container-main :component-container) + (thf/instantiate-component :component-container-main :component-container-instance) + (thc/add-simple-component :component-2 :component-2-main-root :component-2-main-child)) + + page (thf/current-page file) + component-1 (thf/get-component file :component-1) + component-2 (thf/get-component file :component-2) + + copy + (->> + (thf/get-shape file :component-container-instance) + :shapes + first + (thf/get-shape-by-id file)) + + ;; Action + [new-shape all-parents changes-swap] + (cflh/generate-component-swap (pcb/empty-changes) + (:objects page) + copy + (:data file) + page + {(:id file) file} + (:id component-2) + 0 + nil + {}) + + file-swap (thf/apply-changes file changes-swap) + page-swap (thf/current-page file-swap) + + changes + (cflh/generate-reset-component (pcb/empty-changes) + file-swap + {(:id file-swap) file-swap} + page-swap + (:id new-shape) + true) + + file' (thf/apply-changes file changes) + page' (thf/current-page file') + ;; Get + reset + (->> + (thf/get-shape file' :component-container-instance) + :shapes + first + (thf/get-shape-by-id file')) + + component-1-copy-root (thf/get-shape file' :component-1-copy-root)] + + ;; Check + (t/is (= (:id component-1) (:component-id reset))) + (t/is (nil? (ctk/get-swap-slot reset))))) -- Gitee From f3549424873326c7daaa38afdaeefe992ee9fa75 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Mon, 29 Apr 2024 16:37:21 +0200 Subject: [PATCH 0477/1266] :recycle: Components refactor: generator for relocate shapes (and tests) --- .../app/common/files/libraries_helpers.cljc | 186 ++++++++++++++++ .../common_tests/helpers/compositions.cljc | 12 +- common/test/common_tests/helpers/debug.cljc | 33 +++ common/test/common_tests/helpers/files.cljc | 92 +++++--- common/test/common_tests/helpers/ids_map.cljc | 6 + .../logic/comp_remove_swap_slots_test.cljc | 194 +++++++++++++++++ frontend/src/app/main/data/workspace.cljs | 205 +----------------- 7 files changed, 499 insertions(+), 229 deletions(-) create mode 100644 common/test/common_tests/helpers/debug.cljc create mode 100644 common/test/common_tests/logic/comp_remove_swap_slots_test.cljc diff --git a/common/src/app/common/files/libraries_helpers.cljc b/common/src/app/common/files/libraries_helpers.cljc index d700237d2..5aa612a52 100644 --- a/common/src/app/common/files/libraries_helpers.cljc +++ b/common/src/app/common/files/libraries_helpers.cljc @@ -2098,3 +2098,189 @@ (cond-> changes (some? swap-slot) (generate-sync-head file-full libraries container id components-v2 true)))) + +(defn generate-relocate-shapes [changes objects parents parent-id page-id to-index ids] + (let [groups-to-delete + (loop [current-id (first parents) + to-check (rest parents) + removed-id? (set ids) + result #{}] + + (if-not current-id + ;; Base case, no next element + result + + (let [group (get objects current-id)] + (if (and (not= :frame (:type group)) + (not= current-id parent-id) + (empty? (remove removed-id? (:shapes group)))) + + ;; Adds group to the remove and check its parent + (let [to-check (concat to-check [(cfh/get-parent-id objects current-id)])] + (recur (first to-check) + (rest to-check) + (conj removed-id? current-id) + (conj result current-id))) + + ;; otherwise recur + (recur (first to-check) + (rest to-check) + removed-id? + result))))) + + groups-to-unmask + (reduce (fn [group-ids id] + ;; When a masked group loses its mask shape, because it's + ;; moved outside the group, the mask condition must be + ;; removed, and it must be converted to a normal group. + (let [obj (get objects id) + parent (get objects (:parent-id obj))] + (if (and (:masked-group parent) + (= id (first (:shapes parent))) + (not= (:id parent) parent-id)) + (conj group-ids (:id parent)) + group-ids))) + #{} + ids) + + + ;; TODO: Probably implementing this using loop/recur will + ;; be more efficient than using reduce and continuous data + ;; desturcturing. + + ;; Sets the correct components metadata for the moved shapes + ;; `shapes-to-detach` Detach from a component instance a shape that was inside a component and is moved outside + ;; `shapes-to-deroot` Removes the root flag from a component instance moved inside another component + ;; `shapes-to-reroot` Adds a root flag when a nested component instance is moved outside + [shapes-to-detach shapes-to-deroot shapes-to-reroot] + (reduce (fn [[shapes-to-detach shapes-to-deroot shapes-to-reroot] id] + (let [shape (get objects id) + parent (get objects parent-id) + component-shape (ctn/get-component-shape objects shape) + component-shape-parent (ctn/get-component-shape objects parent {:allow-main? true}) + root-parent (ctn/get-instance-root objects parent) + + detach? (and (ctk/in-component-copy-not-head? shape) + (not= (:id component-shape) + (:id component-shape-parent))) + deroot? (and (ctk/instance-root? shape) + root-parent) + reroot? (and (ctk/subinstance-head? shape) + (not component-shape-parent)) + + ids-to-detach (when detach? + (cons id (cfh/get-children-ids objects id)))] + + [(cond-> shapes-to-detach detach? (into ids-to-detach)) + (cond-> shapes-to-deroot deroot? (conj id)) + (cond-> shapes-to-reroot reroot? (conj id))])) + [[] [] []] + (->> ids + (mapcat #(ctn/get-child-heads objects %)) + (map :id))) + + shapes-to-unconstraint ids + + ordered-indexes (cfh/order-by-indexed-shapes objects ids) + shapes (map (d/getf objects) ordered-indexes) + parent (get objects parent-id) + component-main-parent (ctn/find-component-main objects parent false) + child-heads + (->> ordered-indexes + (mapcat #(ctn/get-child-heads objects %)) + (map :id))] + + (-> changes + (pcb/with-page-id page-id) + (pcb/with-objects objects) + + ;; Remove layout-item properties when moving a shape outside a layout + (cond-> (not (ctl/any-layout? parent)) + (pcb/update-shapes ordered-indexes ctl/remove-layout-item-data)) + + ;; Remove the hide in viewer flag + (cond-> (and (not= uuid/zero parent-id) (cfh/frame-shape? parent)) + (pcb/update-shapes ordered-indexes #(cond-> % (cfh/frame-shape? %) (assoc :hide-in-viewer true)))) + + ;; Remove the swap slots if it is moving to a different component + (pcb/update-shapes child-heads + (fn [shape] + (cond-> shape + (not= component-main-parent (ctn/find-component-main objects shape false)) + (ctk/remove-swap-slot)))) + + ;; Add component-root property when moving a component outside a component + (cond-> (not (ctn/get-instance-root objects parent)) + (pcb/update-shapes child-heads #(assoc % :component-root true))) + + ;; Move the shapes + (pcb/change-parent parent-id + shapes + to-index) + + ;; Remove empty groups + (pcb/remove-objects groups-to-delete) + + ;; Unmask groups whose mask have moved outside + (pcb/update-shapes groups-to-unmask + (fn [shape] + (assoc shape :masked-group false))) + + ;; Detach shapes moved out of their component + (pcb/update-shapes shapes-to-detach ctk/detach-shape) + + ;; Make non root a component moved inside another one + (pcb/update-shapes shapes-to-deroot + (fn [shape] + (assoc shape :component-root nil))) + + ;; Make root a subcomponent moved outside its parent component + (pcb/update-shapes shapes-to-reroot + (fn [shape] + (assoc shape :component-root true))) + + ;; Reset constraints depending on the new parent + (pcb/update-shapes shapes-to-unconstraint + (fn [shape] + (let [frame-id (if (= (:type parent) :frame) + (:id parent) + (:frame-id parent)) + moved-shape (assoc shape + :parent-id parent-id + :frame-id frame-id)] + (assoc shape + :constraints-h (gsh/default-constraints-h moved-shape) + :constraints-v (gsh/default-constraints-v moved-shape)))) + {:ignore-touched true}) + + ;; Fix the sizing when moving a shape + (pcb/update-shapes parents + (fn [parent] + (if (ctl/flex-layout? parent) + (cond-> parent + (ctl/change-h-sizing? (:id parent) objects (:shapes parent)) + (assoc :layout-item-h-sizing :fix) + + (ctl/change-v-sizing? (:id parent) objects (:shapes parent)) + (assoc :layout-item-v-sizing :fix)) + parent))) + + ;; Update grid layout + (cond-> (ctl/grid-layout? objects parent-id) + (pcb/update-shapes [parent-id] #(ctl/add-children-to-index % ids objects to-index))) + + (pcb/update-shapes parents + (fn [parent objects] + (cond-> parent + (ctl/grid-layout? parent) + (ctl/assign-cells objects))) + {:with-objects? true}) + + (pcb/reorder-grid-children parents) + + ;; If parent locked, lock the added shapes + (cond-> (:blocked parent) + (pcb/update-shapes ordered-indexes #(assoc % :blocked true))) + + ;; Resize parent containers that need to + (pcb/resize-parents parents)))) diff --git a/common/test/common_tests/helpers/compositions.cljc b/common/test/common_tests/helpers/compositions.cljc index 6306fc51a..e28526ee6 100644 --- a/common/test/common_tests/helpers/compositions.cljc +++ b/common/test/common_tests/helpers/compositions.cljc @@ -6,7 +6,8 @@ (ns common-tests.helpers.compositions (:require - [common-tests.helpers.files :as thf])) + [common-tests.helpers.files :as thf] + [common-tests.helpers.ids-map :as thi])) (defn add-rect [file rect-label] @@ -15,10 +16,11 @@ :name "Rect1")) (defn add-frame - [file frame-label] - (thf/add-sample-shape file frame-label - :type :frame - :name "Frame1")) + ([file frame-label & {:keys [parent-label]}] + (thf/add-sample-shape file frame-label + :type :frame + :name "Frame1" + :parent-label parent-label))) (defn add-frame-with-child [file frame-label child-label] diff --git a/common/test/common_tests/helpers/debug.cljc b/common/test/common_tests/helpers/debug.cljc new file mode 100644 index 000000000..984e47159 --- /dev/null +++ b/common/test/common_tests/helpers/debug.cljc @@ -0,0 +1,33 @@ +(ns common-tests.helpers.debug + (:require + [app.common.uuid :as uuid] + [common-tests.helpers.ids-map :as thi])) + +(defn dump-shape + "Dumps a shape, with each attribute in a line" + [shape] + (println "{") + (doseq [[k v] (sort shape)] + (when (some? v) + (println (str " " k " : " v)))) + (println "}")) + +(defn- stringify-keys [m keys] + (apply str (interpose ", " (map #(str % ": " (get m %)) keys)))) + +(defn dump-page + "Dumps the layer tree of the page. Prints the label of each shape, and the specified keys. + Example: (thd/dump-page (thf/current-page file) [:id :touched])" + ([page keys] + (dump-page page uuid/zero "" keys)) + ([page id padding keys] + (let [objects (vals (:objects page)) + root-objects (filter #(and + (= (:parent-id %) id) + (not= (:id %) id)) + objects)] + (doseq [val root-objects] + (println padding (thi/label (:id val)) + (when keys + (str "[" (stringify-keys val keys) "]"))) + (dump-page page (:id val) (str padding " ") keys))))) diff --git a/common/test/common_tests/helpers/files.cljc b/common/test/common_tests/helpers/files.cljc index 306d2ef81..bf605f5dc 100644 --- a/common/test/common_tests/helpers/files.cljc +++ b/common/test/common_tests/helpers/files.cljc @@ -9,12 +9,15 @@ [app.common.data.macros :as dm] [app.common.features :as ffeat] [app.common.files.changes :as cfc] + [app.common.files.changes-builder :as pcb] [app.common.files.helpers :as cfh] + [app.common.files.libraries-helpers :as cflh] [app.common.files.validate :as cfv] [app.common.geom.point :as gpt] [app.common.pprint :refer [pprint]] [app.common.types.color :as ctc] [app.common.types.colors-list :as ctcl] + [app.common.types.component :as ctk] [app.common.types.components-list :as ctkl] [app.common.types.container :as ctn] [app.common.types.file :as ctf] @@ -206,8 +209,16 @@ [file id] (ctkl/get-component (:data file) id)) +(defn set-child-label + [file shape-label child-idx label] + (let [id (-> (get-shape file shape-label) + :shapes + (nth child-idx))] + (when id + (thi/set-id! label id)))) + (defn instantiate-component - [file component-label copy-root-label & {:keys [parent-label library] :as params}] + [file component-label copy-root-label & {:keys [parent-label library children-labels] :as params}] (let [page (current-page file) library (or library file) component (get-component library component-label) @@ -236,33 +247,60 @@ (assoc :frame-id frame-id) (and (some? parent) (ctn/in-any-component? (:objects page) parent)) - (dissoc :component-root))] + (dissoc :component-root)) + file' (ctf/update-file-data + file + (fn [file-data] + (as-> file-data $ + (ctpl/update-page $ + (:id page) + #(ctst/add-shape (:id copy-root') + copy-root' + % + frame-id + parent-id + nil + true)) + (reduce (fn [file-data shape] + (ctpl/update-page file-data + (:id page) + #(ctst/add-shape (:id shape) + shape + % + (:parent-id shape) + (:frame-id shape) + nil + true))) + $ + (remove #(= (:id %) (:did copy-root')) copy-shapes)))))] + (when children-labels + (dotimes [idx (count children-labels)] + (set-child-label file' copy-root-label idx (nth children-labels idx)))) + file')) + + + +(defn component-swap + [file shape-label new-component-label new-shape-label & {:keys [library] :as params}] + (let [shape (get-shape file shape-label) + library (or library file) + libraries {(:id library) library} + page (current-page file) + objects (:objects page) + id-new-component (-> (get-component library new-component-label) + :id) + + ;; Store the properties that need to be maintained when the component is swapped + keep-props-values (select-keys shape ctk/swap-keep-attrs) + + + [new_shape _ changes] + (-> (pcb/empty-changes nil (:id page)) + (cflh/generate-component-swap objects shape (:data file) page libraries id-new-component 0 nil keep-props-values))] + + (thi/set-id! new-shape-label (:id new_shape)) + (apply-changes file changes))) - (ctf/update-file-data - file - (fn [file-data] - (as-> file-data $ - (ctpl/update-page $ - (:id page) - #(ctst/add-shape (:id copy-root') - copy-root' - % - frame-id - parent-id - nil - true)) - (reduce (fn [file-data shape] - (ctpl/update-page file-data - (:id page) - #(ctst/add-shape (:id shape) - shape - % - (:parent-id shape) - (:frame-id shape) - nil - true))) - $ - (remove #(= (:id %) (:did copy-root')) copy-shapes))))))) (defn sample-color [label & {:keys [] :as params}] diff --git a/common/test/common_tests/helpers/ids_map.cljc b/common/test/common_tests/helpers/ids_map.cljc index dc196598d..cec7242cf 100644 --- a/common/test/common_tests/helpers/ids_map.cljc +++ b/common/test/common_tests/helpers/ids_map.cljc @@ -34,3 +34,9 @@ [f] (reset-idmap!) (f)) + +(defn label [id] + (->> @idmap + (filter #(= id (val %))) + (map key) + (first))) diff --git a/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc b/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc new file mode 100644 index 000000000..5773b1df0 --- /dev/null +++ b/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc @@ -0,0 +1,194 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns common-tests.logic.comp-remove-swap-slots-test + (:require + [app.common.files.changes-builder :as pcb] + [app.common.files.libraries-helpers :as cflh] + [app.common.types.component :as ctk] + [app.common.uuid :as uuid] + [clojure.test :as t] + [common-tests.helpers.compositions :as tho] + [common-tests.helpers.files :as thf] + [common-tests.helpers.ids-map :as thi])) + +(t/use-fixtures :each thi/test-fixture) + + +;; Related .penpot file: common/test/cases/remove-swap-slots.penpot +(defn- setup-file + [] + ;; :frame-b1 [:id: 3aee2370-44e4-81c8-8004-46e56a459d70, :touched: ] + ;; :blue1 [:id: 3aee2370-44e4-81c8-8004-46e56a45fc55, :touched: #{:swap-slot-3aee2370-44e4-81c8-8004-46e56a459d75}] + ;; :green-copy [:id: 3aee2370-44e4-81c8-8004-46e56a45fc56, :touched: ] + ;; :blue-copy-in-green-copy [:id: 3aee2370-44e4-81c8-8004-46e56a4631a4, :touched: #{:swap-slot-3aee2370-44e4-81c8-8004-46e56a459d6f}] + ;; :frame-yellow [:id: 3aee2370-44e4-81c8-8004-46e56a459d73, :touched: ] + ;; :frame-green [:id: 3aee2370-44e4-81c8-8004-46e56a459d6c, :touched: ] + ;; :red-copy-green [:id: 3aee2370-44e4-81c8-8004-46e56a459d6f, :touched: ] + ;; :frame-blue [:id: 3aee2370-44e4-81c8-8004-46e56a459d69, :touched: ] + ;; :frame-b2 [:id: 3aee2370-44e4-81c8-8004-46e56a4631a5, :touched: ] + ;; :frame-red [:id: 3aee2370-44e4-81c8-8004-46e56a459d66, :touched: ] + + (-> (thf/sample-file :file1) + (tho/add-frame :frame-red) + (thf/make-component :red :frame-red) + (tho/add-frame :frame-blue) + (thf/make-component :blue :frame-blue) + (tho/add-frame :frame-green) + (thf/make-component :green :frame-green) + (thf/instantiate-component :red :red-copy-green :parent-label :frame-green) + (tho/add-frame :frame-b1) + (thf/make-component :b1 :frame-b1) + (tho/add-frame :frame-yellow :parent-label :frame-b1) + (thf/instantiate-component :red :red-copy :parent-label :frame-b1) + (thf/component-swap :red-copy :blue :blue1) + (thf/instantiate-component :green :green-copy :parent-label :frame-b1 :children-labels [:red-copy-in-green-copy]) + (thf/component-swap :red-copy-in-green-copy :blue :blue-copy-in-green-copy) + (tho/add-frame :frame-b2) + (thf/make-component :b2 :frame-b2))) + +(t/deftest test-keep-swap-slot-relocating-blue1-to-root + (let [;; ============================== Setup =============================== + file (setup-file) + page (thf/current-page file) + blue1 (thf/get-shape file :blue1) + + ;; ============================== Action ============================== + changes (cflh/generate-relocate-shapes (pcb/empty-changes nil) + (:objects page) + #{(:parent-id blue1)} ;; parents + uuid/zero ;; paremt-id + (:id page) ;; page-id + 0 ;; to-index + #{(:id blue1)}) ;; ids + file' (thf/apply-changes file changes) + + ;; ============================== Get ================================= + blue1' (thf/get-shape file' :blue1)] + + ;; ================================== Check =============================== + ;; blue1 had swap-id before move + (t/is (some? (ctk/get-swap-slot blue1))) + + ;; blue1 has not swap-id after move + (t/is (some? blue1')) + (t/is (nil? (ctk/get-swap-slot blue1'))))) + + +(t/deftest test-keep-swap-slot-relocating-blue1-to-b2 + (let [;; ============================== Setup =============================== + file (setup-file) + page (thf/current-page file) + blue1 (thf/get-shape file :blue1) + b2 (thf/get-shape file :frame-b2) + + + ;; ============================== Action ============================== + changes (cflh/generate-relocate-shapes (pcb/empty-changes nil) + (:objects page) + #{(:parent-id blue1)} ;; parents + (:id b2) ;; parent-id + (:id page) ;; page-id + 0 ;; to-index + #{(:id blue1)}) ;; ids + file' (thf/apply-changes file changes) + + ;; ============================== Get ================================= + blue1' (thf/get-shape file' :blue1)] + + ;; ================================== Check =============================== + ;; blue1 had swap-id before move + (t/is (some? (ctk/get-swap-slot blue1))) + + ;; blue1 has not swap-id after move + (t/is (some? blue1')) + (t/is (nil? (ctk/get-swap-slot blue1'))))) + +(t/deftest test-keep-swap-slot-relocating-yellow-to-root + (let [;; ============================== Setup =============================== + file (setup-file) + page (thf/current-page file) + blue1 (thf/get-shape file :blue1) + yellow (thf/get-shape file :frame-yellow) + + ;; ============================== Action ============================== + ;; Move blue1 into yellow + changes (cflh/generate-relocate-shapes (pcb/empty-changes nil) + (:objects page) + #{(:parent-id blue1)} ;; parents + (:id yellow) ;; parent-id + (:id page) ;; page-id + 0 ;; to-index + #{(:id blue1)}) ;; ids + + file' (thf/apply-changes file changes) + page' (thf/current-page file') + yellow' (thf/get-shape file' :frame-yellow) + + ;; Move yellow into root + changes' (cflh/generate-relocate-shapes (pcb/empty-changes nil) + (:objects page') + #{(:parent-id yellow')} ;; parents + uuid/zero ;; parent-id + (:id page') ;; page-id + 0 ;; to-index + #{(:id yellow')}) ;; ids + file'' (thf/apply-changes file' changes') + + ;; ============================== Get ================================= + blue1'' (thf/get-shape file'' :blue1)] + + ;; ================================== Check =============================== + ;; blue1 had swap-id before move + (t/is (some? (ctk/get-swap-slot blue1))) + + ;; blue1 has not swap-id after move + (t/is (some? blue1'')) + (t/is (nil? (ctk/get-swap-slot blue1''))))) + + +(t/deftest test-keep-swap-slot-relocating-yellow-to-b2 + (let [;; ============================== Setup =============================== + file (setup-file) + page (thf/current-page file) + blue1 (thf/get-shape file :blue1) + yellow (thf/get-shape file :frame-yellow) + + ;; ============================== Action ============================== + ;; Move blue1 into yellow + changes (cflh/generate-relocate-shapes (pcb/empty-changes nil) + (:objects page) + #{(:parent-id blue1)} ;; parents + (:id yellow) ;; parent-id + (:id page) ;; page-id + 0 ;; to-index + #{(:id blue1)}) ;; ids + + file' (thf/apply-changes file changes) + page' (thf/current-page file') + yellow' (thf/get-shape file' :frame-yellow) + b2' (thf/get-shape file' :frame-b2) + + ;; Move yellow into b2 + changes' (cflh/generate-relocate-shapes (pcb/empty-changes nil) + (:objects page') + #{(:parent-id yellow')} ;; parents + (:id b2') ;; parent-id + (:id page') ;; page-id + 0 ;; to-index + #{(:id yellow')}) ;; ids + file'' (thf/apply-changes file' changes') + + ;; ============================== Get ================================= + blue1'' (thf/get-shape file'' :blue1)] + + ;; ================================== Check =============================== + ;; blue1 had swap-id before move + (t/is (some? (ctk/get-swap-slot blue1))) + + ;; blue1 has not swap-id after move + (t/is (some? blue1'')) + (t/is (nil? (ctk/get-swap-slot blue1''))))) diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index 1f48ae4ed..52a09c8c9 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -13,6 +13,7 @@ [app.common.features :as cfeat] [app.common.files.changes-builder :as pcb] [app.common.files.helpers :as cfh] + [app.common.files.libraries-helpers :as cflh] [app.common.geom.align :as gal] [app.common.geom.point :as gpt] [app.common.geom.proportions :as gpp] @@ -786,112 +787,6 @@ ;; --- Change Shape Order (D&D Ordering) -(defn relocate-shapes-changes [it objects parents parent-id page-id to-index ids - groups-to-delete groups-to-unmask shapes-to-detach - shapes-to-reroot shapes-to-deroot shapes-to-unconstraint] - (let [ordered-indexes (cfh/order-by-indexed-shapes objects ids) - shapes (map (d/getf objects) ordered-indexes) - parent (get objects parent-id) - component-main-parent (ctn/find-component-main objects parent false) - child-heads - (->> ordered-indexes - (mapcat #(ctn/get-child-heads objects %)) - (map :id))] - - (-> (pcb/empty-changes it page-id) - (pcb/with-objects objects) - - ;; Remove layout-item properties when moving a shape outside a layout - (cond-> (not (ctl/any-layout? parent)) - (pcb/update-shapes ordered-indexes ctl/remove-layout-item-data)) - - ;; Remove the hide in viewer flag - (cond-> (and (not= uuid/zero parent-id) (cfh/frame-shape? parent)) - (pcb/update-shapes ordered-indexes #(cond-> % (cfh/frame-shape? %) (assoc :hide-in-viewer true)))) - - ;; Remove the swap slots if it is moving to a different component - (pcb/update-shapes child-heads - (fn [shape] - (cond-> shape - (not= component-main-parent (ctn/find-component-main objects shape false)) - (ctk/remove-swap-slot)))) - - ;; Add component-root property when moving a component outside a component - (cond-> (not (ctn/get-instance-root objects parent)) - (pcb/update-shapes child-heads #(assoc % :component-root true))) - - ;; Move the shapes - (pcb/change-parent parent-id - shapes - to-index) - - ;; Remove empty groups - (pcb/remove-objects groups-to-delete) - - ;; Unmask groups whose mask have moved outside - (pcb/update-shapes groups-to-unmask - (fn [shape] - (assoc shape :masked-group false))) - - ;; Detach shapes moved out of their component - (pcb/update-shapes shapes-to-detach ctk/detach-shape) - - ;; Make non root a component moved inside another one - (pcb/update-shapes shapes-to-deroot - (fn [shape] - (assoc shape :component-root nil))) - - ;; Make root a subcomponent moved outside its parent component - (pcb/update-shapes shapes-to-reroot - (fn [shape] - (assoc shape :component-root true))) - - ;; Reset constraints depending on the new parent - (pcb/update-shapes shapes-to-unconstraint - (fn [shape] - (let [frame-id (if (= (:type parent) :frame) - (:id parent) - (:frame-id parent)) - moved-shape (assoc shape - :parent-id parent-id - :frame-id frame-id)] - (assoc shape - :constraints-h (gsh/default-constraints-h moved-shape) - :constraints-v (gsh/default-constraints-v moved-shape)))) - {:ignore-touched true}) - - ;; Fix the sizing when moving a shape - (pcb/update-shapes parents - (fn [parent] - (if (ctl/flex-layout? parent) - (cond-> parent - (ctl/change-h-sizing? (:id parent) objects (:shapes parent)) - (assoc :layout-item-h-sizing :fix) - - (ctl/change-v-sizing? (:id parent) objects (:shapes parent)) - (assoc :layout-item-v-sizing :fix)) - parent))) - - ;; Update grid layout - (cond-> (ctl/grid-layout? objects parent-id) - (pcb/update-shapes [parent-id] #(ctl/add-children-to-index % ids objects to-index))) - - (pcb/update-shapes parents - (fn [parent objects] - (cond-> parent - (ctl/grid-layout? parent) - (ctl/assign-cells objects))) - {:with-objects? true}) - - (pcb/reorder-grid-children parents) - - ;; If parent locked, lock the added shapes - (cond-> (:blocked parent) - (pcb/update-shapes ordered-indexes #(assoc % :blocked true))) - - ;; Resize parent containers that need to - (pcb/resize-parents parents)))) - (defn relocate-shapes [ids parent-id to-index & [ignore-parents?]] (dm/assert! (every? uuid? ids)) @@ -913,97 +808,13 @@ all-parents (into #{parent-id} (map #(cfh/get-parent-id objects %)) ids) parents (if ignore-parents? #{parent-id} all-parents) - groups-to-delete - (loop [current-id (first parents) - to-check (rest parents) - removed-id? (set ids) - result #{}] - - (if-not current-id - ;; Base case, no next element - result - - (let [group (get objects current-id)] - (if (and (not= :frame (:type group)) - (not= current-id parent-id) - (empty? (remove removed-id? (:shapes group)))) - - ;; Adds group to the remove and check its parent - (let [to-check (concat to-check [(cfh/get-parent-id objects current-id)])] - (recur (first to-check) - (rest to-check) - (conj removed-id? current-id) - (conj result current-id))) - - ;; otherwise recur - (recur (first to-check) - (rest to-check) - removed-id? - result))))) - - groups-to-unmask - (reduce (fn [group-ids id] - ;; When a masked group loses its mask shape, because it's - ;; moved outside the group, the mask condition must be - ;; removed, and it must be converted to a normal group. - (let [obj (get objects id) - parent (get objects (:parent-id obj))] - (if (and (:masked-group parent) - (= id (first (:shapes parent))) - (not= (:id parent) parent-id)) - (conj group-ids (:id parent)) - group-ids))) - #{} - ids) - - ;; TODO: Probably implementing this using loop/recur will - ;; be more efficient than using reduce and continuous data - ;; desturcturing. - - ;; Sets the correct components metadata for the moved shapes - ;; `shapes-to-detach` Detach from a component instance a shape that was inside a component and is moved outside - ;; `shapes-to-deroot` Removes the root flag from a component instance moved inside another component - ;; `shapes-to-reroot` Adds a root flag when a nested component instance is moved outside - [shapes-to-detach shapes-to-deroot shapes-to-reroot] - (reduce (fn [[shapes-to-detach shapes-to-deroot shapes-to-reroot] id] - (let [shape (get objects id) - parent (get objects parent-id) - component-shape (ctn/get-component-shape objects shape) - component-shape-parent (ctn/get-component-shape objects parent {:allow-main? true}) - root-parent (ctn/get-instance-root objects parent) - - detach? (and (ctk/in-component-copy-not-head? shape) - (not= (:id component-shape) - (:id component-shape-parent))) - deroot? (and (ctk/instance-root? shape) - root-parent) - reroot? (and (ctk/subinstance-head? shape) - (not component-shape-parent)) - - ids-to-detach (when detach? - (cons id (cfh/get-children-ids objects id)))] - - [(cond-> shapes-to-detach detach? (into ids-to-detach)) - (cond-> shapes-to-deroot deroot? (conj id)) - (cond-> shapes-to-reroot reroot? (conj id))])) - [[] [] []] - (->> ids - (mapcat #(ctn/get-child-heads objects %)) - (map :id))) - - changes (relocate-shapes-changes it - objects - parents - parent-id - page-id - to-index - ids - groups-to-delete - groups-to-unmask - shapes-to-detach - shapes-to-reroot - shapes-to-deroot - ids) + changes (cflh/generate-relocate-shapes (pcb/empty-changes it) + objects + parents + parent-id + page-id + to-index + ids) undo-id (js/Symbol)] (rx/of (dwu/start-undo-transaction undo-id) -- Gitee From 5611fcfc2c36bfac1c7d8d081c159950329462c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Mon, 29 Apr 2024 15:12:43 +0200 Subject: [PATCH 0478/1266] :wrench: Add generator function for update-shapes --- .../app/common/files/libraries_helpers.cljc | 17 ++++++++++ .../src/app/main/data/workspace/changes.cljs | 31 +++++++++---------- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/common/src/app/common/files/libraries_helpers.cljc b/common/src/app/common/files/libraries_helpers.cljc index 5aa612a52..dc4c152ec 100644 --- a/common/src/app/common/files/libraries_helpers.cljc +++ b/common/src/app/common/files/libraries_helpers.cljc @@ -34,6 +34,23 @@ ;; Change this to :info :debug or :trace to debug this module, or :warn to reset to default (log/set-level! :warn) +(defn generate-update-shapes +[changes ids update-fn objects {:keys [attrs ignore-tree ignore-touched with-objects?]}] + (let [changes (reduce + (fn [changes id] + (let [opts {:attrs attrs + :ignore-geometry? (get ignore-tree id) + :ignore-touched ignore-touched + :with-objects? with-objects?}] + (pcb/update-shapes changes [id] update-fn (d/without-nils opts)))) + (-> changes + (pcb/with-objects objects)) + ids) + grid-ids (->> ids (filter (partial ctl/grid-layout? objects))) + changes (pcb/update-shapes changes grid-ids ctl/assign-cell-positions {:with-objects? true}) + changes (pcb/reorder-grid-children changes ids)] + changes)) + (declare generate-sync-container) (declare generate-sync-shape) (declare generate-sync-text-shape) diff --git a/frontend/src/app/main/data/workspace/changes.cljs b/frontend/src/app/main/data/workspace/changes.cljs index b2d595086..c1e0bb04f 100644 --- a/frontend/src/app/main/data/workspace/changes.cljs +++ b/frontend/src/app/main/data/workspace/changes.cljs @@ -12,6 +12,7 @@ [app.common.files.changes :as cpc] [app.common.files.changes-builder :as pcb] [app.common.files.helpers :as cph] + [app.common.files.libraries-helpers :as cflh] [app.common.logging :as log] [app.common.schema :as sm] [app.common.types.shape-tree :as ctst] @@ -74,23 +75,19 @@ (filter #(some update-layout-attr? (pcb/changed-attrs % objects update-fn {:attrs attrs :with-objects? with-objects?}))) (map :id)) - changes (reduce - (fn [changes id] - (let [opts {:attrs attrs - :ignore-geometry? (get ignore-tree id) - :ignore-touched ignore-touched - :with-objects? with-objects?}] - (pcb/update-shapes changes [id] update-fn (d/without-nils opts)))) - (-> (pcb/empty-changes it page-id) - (pcb/set-save-undo? save-undo?) - (pcb/set-stack-undo? stack-undo?) - (pcb/with-objects objects) - (cond-> undo-group - (pcb/set-undo-group undo-group))) - ids) - grid-ids (->> ids (filter (partial ctl/grid-layout? objects))) - changes (pcb/update-shapes changes grid-ids ctl/assign-cell-positions {:with-objects? true}) - changes (pcb/reorder-grid-children changes ids) + changes (-> (pcb/empty-changes it page-id) + (pcb/set-save-undo? save-undo?) + (pcb/set-stack-undo? stack-undo?) + (cflh/generate-update-shapes ids + update-fn + objects + {:attrs attrs + :ignore-tree ignore-tree + :ignore-touched ignore-touched + :with-objects? with-objects?}) + (cond-> undo-group + (pcb/set-undo-group undo-group))) + changes (add-undo-group changes state)] (rx/concat (if (seq (:redo-changes changes)) -- Gitee From a40afd5b638c505cb9c22127fc0c9addcac89f15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Mon, 29 Apr 2024 15:15:10 +0200 Subject: [PATCH 0479/1266] :white_check_mark: Add test for touched shapes --- .../app/common/files/libraries_helpers.cljc | 2 +- .../common_tests/helpers/compositions.cljc | 47 ++++++++------ common/test/common_tests/helpers/files.cljc | 31 ++++++--- ...test.cljc => component_creation_test.cljc} | 10 +-- .../logic/components_touched_test.cljc | 51 +++++++++++++++ .../types/types_libraries_test.cljc | 27 ++++---- .../src/app/main/data/workspace/changes.cljs | 1 - .../state_components_sync_test.cljs | 64 ------------------- 8 files changed, 122 insertions(+), 111 deletions(-) rename common/test/common_tests/logic/{logic_comp_creation_test.cljc => component_creation_test.cljc} (92%) create mode 100644 common/test/common_tests/logic/components_touched_test.cljc diff --git a/common/src/app/common/files/libraries_helpers.cljc b/common/src/app/common/files/libraries_helpers.cljc index dc4c152ec..617643b61 100644 --- a/common/src/app/common/files/libraries_helpers.cljc +++ b/common/src/app/common/files/libraries_helpers.cljc @@ -35,7 +35,7 @@ (log/set-level! :warn) (defn generate-update-shapes -[changes ids update-fn objects {:keys [attrs ignore-tree ignore-touched with-objects?]}] + [changes ids update-fn objects {:keys [attrs ignore-tree ignore-touched with-objects?]}] (let [changes (reduce (fn [changes id] (let [opts {:attrs attrs diff --git a/common/test/common_tests/helpers/compositions.cljc b/common/test/common_tests/helpers/compositions.cljc index e28526ee6..48e4fff7c 100644 --- a/common/test/common_tests/helpers/compositions.cljc +++ b/common/test/common_tests/helpers/compositions.cljc @@ -10,35 +10,44 @@ [common-tests.helpers.ids-map :as thi])) (defn add-rect - [file rect-label] + [file rect-label & {:keys [] :as params}] (thf/add-sample-shape file rect-label - :type :rect - :name "Rect1")) + (merge {:type :rect + :name "Rect1"} + params))) (defn add-frame - ([file frame-label & {:keys [parent-label]}] - (thf/add-sample-shape file frame-label - :type :frame - :name "Frame1" - :parent-label parent-label))) + [file frame-label & {:keys [] :as params}] + (thf/add-sample-shape file frame-label + (merge {:type :frame + :name "Frame1"} + params))) (defn add-frame-with-child - [file frame-label child-label] + [file frame-label child-label & {:keys [frame-params child-params]}] (-> file - (add-frame frame-label) + (add-frame frame-label frame-params) (thf/add-sample-shape child-label - :type :rect - :name "Rect1" - :parent-label frame-label))) + (merge {:type :rect + :name "Rect1" + :parent-label frame-label} + child-params)))) (defn add-simple-component - [file component-label root-label child-label] + [file component-label root-label child-label + & {:keys [component-params root-params child-params]}] (-> file - (add-frame-with-child root-label child-label) - (thf/make-component component-label root-label))) + (add-frame-with-child root-label child-label :frame-params root-params :child-params child-params) + (thf/make-component component-label root-label component-params))) (defn add-simple-component-with-copy - [file component-label main-root-label main-child-label copy-root-label] + [file component-label main-root-label main-child-label copy-root-label + & {:keys [component-params main-root-params main-child-params copy-root-params]}] (-> file - (add-simple-component component-label main-root-label main-child-label) - (thf/instantiate-component component-label copy-root-label))) + (add-simple-component component-label + main-root-label + main-child-label + :component-params component-params + :root-params main-root-params + :child-params main-child-params) + (thf/instantiate-component component-label copy-root-label copy-root-params))) diff --git a/common/test/common_tests/helpers/files.cljc b/common/test/common_tests/helpers/files.cljc index bf605f5dc..b6349636b 100644 --- a/common/test/common_tests/helpers/files.cljc +++ b/common/test/common_tests/helpers/files.cljc @@ -6,6 +6,7 @@ (ns common-tests.helpers.files (:require + [app.common.colors :as clr] [app.common.data.macros :as dm] [app.common.features :as ffeat] [app.common.files.changes :as cfc] @@ -169,7 +170,7 @@ ;; ----- Components (defn make-component - [file label root-label] + [file label root-label & {:keys [] :as params}] (let [page (current-page file) root (get-shape file root-label)] @@ -194,12 +195,12 @@ #(update % :objects assoc (:id shape) shape))) $ updated-shapes) - (ctkl/add-component $ - {:id (:component-id updated-root) - :name (:name updated-root) - :main-instance-id (:id updated-root) - :main-instance-page (:id page) - :shapes updated-shapes}))))))) + (ctkl/add-component $ (assoc params + :id (:component-id updated-root) + :name (:name updated-root) + :main-instance-id (:id updated-root) + :main-instance-page (:id page) + :shapes updated-shapes)))))))) (defn get-component [file label] @@ -306,7 +307,21 @@ [label & {:keys [] :as params}] (ctc/make-color (assoc params :id (thi/new-id! label)))) -(defn add-sample-color +(defn sample-fill-color + [& {:keys [fill-color fill-opacity] :as params}] + (let [params (cond-> params + (nil? fill-color) + (assoc :fill-color clr/black) + + (nil? fill-opacity) + (assoc :fill-opacity 1))] + params)) + +(defn sample-fills-color + [& {:keys [] :as params}] + [(sample-fill-color params)]) + +(defn add-sample-library-color [file label & {:keys [] :as params}] (let [color (sample-color label params)] (ctf/update-file-data file #(ctcl/add-color % color)))) diff --git a/common/test/common_tests/logic/logic_comp_creation_test.cljc b/common/test/common_tests/logic/component_creation_test.cljc similarity index 92% rename from common/test/common_tests/logic/logic_comp_creation_test.cljc rename to common/test/common_tests/logic/component_creation_test.cljc index 577bef06f..3e6499fb2 100644 --- a/common/test/common_tests/logic/logic_comp_creation_test.cljc +++ b/common/test/common_tests/logic/component_creation_test.cljc @@ -4,7 +4,7 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns common-tests.logic.logic-comp-creation-test +(ns common-tests.logic.component-creation-test (:require [app.common.files.changes-builder :as pcb] [app.common.files.libraries-helpers :as cflh] @@ -15,14 +15,14 @@ (t/use-fixtures :each thi/test-fixture) (t/deftest test-add-component-from-single-shape - (let [; Setup + (let [;; Setup file (-> (thf/sample-file :file1) (thf/add-sample-shape :shape1 :type :frame)) page (thf/current-page file) shape1 (thf/get-shape file :shape1) - ; Action + ;; Action [_ component-id changes] (cflh/generate-add-component (pcb/empty-changes) [shape1] @@ -35,11 +35,11 @@ file' (thf/apply-changes file changes) - ; Get + ;; Get component (thf/get-component-by-id file' component-id) root (thf/get-shape-by-id file' (:main-instance-id component))] - ; Check + ;; Check (t/is (some? component)) (t/is (some? root)) (t/is (= (:component-id root) (:id component))))) diff --git a/common/test/common_tests/logic/components_touched_test.cljc b/common/test/common_tests/logic/components_touched_test.cljc new file mode 100644 index 000000000..eedd84fd9 --- /dev/null +++ b/common/test/common_tests/logic/components_touched_test.cljc @@ -0,0 +1,51 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns common-tests.logic.components-touched-test + (:require + [app.common.files.changes-builder :as pcb] + [app.common.files.libraries-helpers :as cflh] + [clojure.test :as t] + [common-tests.helpers.compositions :as tho] + [common-tests.helpers.files :as thf] + [common-tests.helpers.ids-map :as thi])) + +(t/use-fixtures :each thi/test-fixture) + +(t/deftest test-touched-when-changing-attribute + (let [;; Setup + file (-> (thf/sample-file :file1) + (tho/add-simple-component-with-copy :component1 + :main-root + :main-child + :copy-root + :main-child-params {:fills (thf/sample-fills-color + :fill-color "#abcdef")})) + page (thf/current-page file) + copy-root (thf/get-shape file :copy-root) + + ;; Action + changes (cflh/generate-update-shapes (pcb/empty-changes nil (:id page)) + (:shapes copy-root) + #(assoc % :fills (thf/sample-fills-color + :fill-color "#fabada")) + (:objects page) + {}) + + file' (thf/apply-changes file changes) + + ;; Get + copy-root' (thf/get-shape file' :copy-root) + copy-child' (thf/get-shape-by-id file' (first (:shapes copy-root'))) + fills' (:fills copy-child') + fill' (first fills')] + + ;; Check + (t/is (= (count fills') 1)) + (t/is (= (:fill-color fill') "#fabada")) + (t/is (= (:fill-opacity fill') 1)) + (t/is (= (:touched copy-root') nil)) + (t/is (= (:touched copy-child') #{:fill-group})))) diff --git a/common/test/common_tests/types/types_libraries_test.cljc b/common/test/common_tests/types/types_libraries_test.cljc index 0eab0db07..d95232824 100644 --- a/common/test/common_tests/types/types_libraries_test.cljc +++ b/common/test/common_tests/types/types_libraries_test.cljc @@ -70,21 +70,21 @@ (t/is (= (:name f1) "Test file")))) (t/deftest test-absorb-components - (let [; Setup + (let [;; Setup library (-> (thf/sample-file :library :is-shared true) (tho/add-simple-component :component1 :main-root :rect1)) file (-> (thf/sample-file :file) (thf/instantiate-component :component1 :copy-root :library library)) - ; Action + ;; Action file' (ctf/update-file-data file #(ctf/absorb-assets % (:data library))) _ (thf/validate-file! file') - ; Get + ;; Get pages' (ctpl/pages-seq (ctf/file-data file')) components' (ctkl/components-seq (ctf/file-data file')) component' (first components') @@ -92,7 +92,7 @@ copy-root' (thf/get-shape file' :copy-root) main-root' (ctf/get-ref-shape (ctf/file-data file') component' copy-root')] - ; Check + ;; Check (t/is (= (count pages') 2)) (t/is (= (:name (first pages')) "Page 1")) (t/is (= (:name (second pages')) "Main components")) @@ -104,10 +104,10 @@ (t/is (ctk/main-instance-of? (:id main-root') (:id (second pages')) component')))) (t/deftest test-absorb-colors - (let [; Setup + (let [;; Setup library (-> (thf/sample-file :library :is-shared true) - (thf/add-sample-color :color1 {:name "Test color" - :color "#abcdef"})) + (thf/add-sample-library-color :color1 {:name "Test color" + :color "#abcdef"})) file (-> (thf/sample-file :file) (thf/add-sample-shape :shape1 @@ -118,19 +118,19 @@ :fill-color-ref-id (thi/id :color1) :fill-color-ref-file (thi/id :library)}])) - ; Action + ;; Action file' (ctf/update-file-data file #(ctf/absorb-assets % (:data library))) _ (thf/validate-file! file') - ; Get + ;; Get colors' (ctcl/colors-seq (ctf/file-data file')) shape1' (thf/get-shape file' :shape1) fill' (first (:fills shape1'))] - ; Check + ;; Check (t/is (= (count colors') 1)) (t/is (= (:id (first colors')) (thi/id :color1))) (t/is (= (:name (first colors')) "Test color")) @@ -141,7 +141,7 @@ (t/is (= (:fill-color-ref-file fill') (:id file'))))) (t/deftest test-absorb-typographies - (let [; Setup + (let [;; Setup library (-> (thf/sample-file :library :is-shared true) (thf/add-sample-typography :typography1 {:name "Test typography"})) @@ -169,18 +169,19 @@ :letter-spacing "0" :fills [{:fill-color "#000000" :fill-opacity 1}]}]}]}]})) - ; Action + ;; Action file' (ctf/update-file-data file #(ctf/absorb-assets % (:data library))) _ (thf/validate-file! file') - ; Get + ;; Get typographies' (ctyl/typographies-seq (ctf/file-data file')) shape1' (thf/get-shape file' :shape1) text-node' (d/seek #(some? (:text %)) (txt/node-seq (:content shape1')))] + ;; Check (t/is (= (count typographies') 1)) (t/is (= (:id (first typographies')) (thi/id :typography1))) (t/is (= (:name (first typographies')) "Test typography")) diff --git a/frontend/src/app/main/data/workspace/changes.cljs b/frontend/src/app/main/data/workspace/changes.cljs index c1e0bb04f..87dec4048 100644 --- a/frontend/src/app/main/data/workspace/changes.cljs +++ b/frontend/src/app/main/data/workspace/changes.cljs @@ -16,7 +16,6 @@ [app.common.logging :as log] [app.common.schema :as sm] [app.common.types.shape-tree :as ctst] - [app.common.types.shape.layout :as ctl] [app.common.uuid :as uuid] [app.main.data.workspace.state-helpers :as wsh] [app.main.data.workspace.undo :as dwu] diff --git a/frontend/test/frontend_tests/state_components_sync_test.cljs b/frontend/test/frontend_tests/state_components_sync_test.cljs index 4928ad74c..56581b29e 100644 --- a/frontend/test/frontend_tests/state_components_sync_test.cljs +++ b/frontend/test/frontend_tests/state_components_sync_test.cljs @@ -7,7 +7,6 @@ (ns frontend-tests.state-components-sync-test (:require [app.common.colors :as clr] - [app.common.types.file :as ctf] [app.main.data.workspace :as dw] [app.main.data.workspace.changes :as dch] [app.main.data.workspace.libraries :as dwl] @@ -24,69 +23,6 @@ ;; === Test touched ====================== -(t/deftest test-touched - (t/async done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1" - :fill-color clr/white - :fill-opacity 1}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)]) - (thp/instantiate-component :instance1 - (thp/id :component1))) - - [_group1 shape1'] - (thl/resolve-instance state (thp/id :instance1)) - - store (the/prepare-store state done - (fn [new-state] - ;; Uncomment to debug - ;; (ctf/dump-tree (get new-state :workspace-data) - ;; (get new-state :current-page-id) - ;; (get new-state :workspace-libraries) - ;; false true) - ;; Expected shape tree: - ;;; - ;; [Page] - ;; Root Frame - ;; Rect 1 - ;; Rect 1 - ;; Rect 1 #--> Rect 1 - ;; Rect 1* ---> Rect 1 - ;; #{:fill-group} - ;;; - ;; [Rect 1] - ;; page1 / Rect 1 - ;;; - (let [[[group shape1] [c-group c-shape1] _component] - (thl/resolve-instance-and-main - new-state - (thp/id :instance1))] - - (t/is (= (:name group) "Rect 1")) - (t/is (= (:touched group) nil)) - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:touched shape1) #{:fill-group})) - (t/is (= (:fill-color shape1) clr/test)) - (t/is (= (:fill-opacity shape1) 0.5)) - - (t/is (= (:name c-group) "Rect 1")) - (t/is (= (:touched c-group) nil)) - (t/is (= (:name c-shape1) "Rect 1")) - (t/is (= (:touched c-shape1) nil)) - (t/is (= (:fill-color c-shape1) clr/white)) - (t/is (= (:fill-opacity c-shape1) 1)))))] - - (ptk/emit! - store - (dch/update-shapes [(:id shape1')] - (fn [shape] - (merge shape {:fill-color clr/test - :fill-opacity 0.5}))) - :the/end)))) - (t/deftest test-touched-children-add (t/async done (let [state (-> thp/initial-state -- Gitee From 77d4901db10522d3d5fa2224838be15984709652 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Mon, 29 Apr 2024 18:40:09 +0200 Subject: [PATCH 0480/1266] :white_check_mark: Add more tests for touched --- .../common_tests/helpers/compositions.cljc | 32 ++- .../logic/components_touched_test.cljc | 136 ++++++++++-- .../state_components_sync_test.cljs | 195 ------------------ 3 files changed, 148 insertions(+), 215 deletions(-) diff --git a/common/test/common_tests/helpers/compositions.cljc b/common/test/common_tests/helpers/compositions.cljc index 48e4fff7c..d8b9cbe8b 100644 --- a/common/test/common_tests/helpers/compositions.cljc +++ b/common/test/common_tests/helpers/compositions.cljc @@ -6,8 +6,8 @@ (ns common-tests.helpers.compositions (:require - [common-tests.helpers.files :as thf] - [common-tests.helpers.ids-map :as thi])) + [app.common.data :as d] + [common-tests.helpers.files :as thf])) (defn add-rect [file rect-label & {:keys [] :as params}] @@ -51,3 +51,31 @@ :root-params main-root-params :child-params main-child-params) (thf/instantiate-component component-label copy-root-label copy-root-params))) + +(defn add-component-with-many-children + [file component-label root-label child-labels + & {:keys [component-params root-params child-params-list]}] + (as-> file $ + (add-frame $ root-label root-params) + (reduce (fn [file [label params]] + (thf/add-sample-shape file + label + (merge {:type :rect + :name "Rect1" + :parent-label root-label} + params))) + $ + (d/zip-all child-labels child-params-list)) + (thf/make-component $ component-label root-label component-params))) + +(defn add-component-with-many-children-and-copy + [file component-label root-label child-labels copy-root-label + & {:keys [component-params root-params child-params-list copy-root-params]}] + (-> file + (add-component-with-many-children component-label + root-label + child-labels + :component-params component-params + :root-params root-params + :child-params-list child-params-list) + (thf/instantiate-component component-label copy-root-label copy-root-params))) diff --git a/common/test/common_tests/logic/components_touched_test.cljc b/common/test/common_tests/logic/components_touched_test.cljc index eedd84fd9..45b11b59f 100644 --- a/common/test/common_tests/logic/components_touched_test.cljc +++ b/common/test/common_tests/logic/components_touched_test.cljc @@ -17,31 +17,33 @@ (t/deftest test-touched-when-changing-attribute (let [;; Setup - file (-> (thf/sample-file :file1) - (tho/add-simple-component-with-copy :component1 - :main-root - :main-child - :copy-root - :main-child-params {:fills (thf/sample-fills-color - :fill-color "#abcdef")})) - page (thf/current-page file) + file (-> (thf/sample-file :file1) + (tho/add-simple-component-with-copy :component1 + :main-root + :main-child + :copy-root + :main-child-params {:fills (thf/sample-fills-color + :fill-color "#abcdef")})) + page (thf/current-page file) copy-root (thf/get-shape file :copy-root) ;; Action - changes (cflh/generate-update-shapes (pcb/empty-changes nil (:id page)) - (:shapes copy-root) - #(assoc % :fills (thf/sample-fills-color - :fill-color "#fabada")) - (:objects page) - {}) + update-fn (fn [shape] + (assoc shape :fills (thf/sample-fills-color :fill-color "#fabada"))) + + changes (cflh/generate-update-shapes (pcb/empty-changes nil (:id page)) + (:shapes copy-root) + update-fn + (:objects page) + {}) - file' (thf/apply-changes file changes) + file' (thf/apply-changes file changes) ;; Get - copy-root' (thf/get-shape file' :copy-root) + copy-root' (thf/get-shape file' :copy-root) copy-child' (thf/get-shape-by-id file' (first (:shapes copy-root'))) - fills' (:fills copy-child') - fill' (first fills')] + fills' (:fills copy-child') + fill' (first fills')] ;; Check (t/is (= (count fills') 1)) @@ -49,3 +51,101 @@ (t/is (= (:fill-opacity fill') 1)) (t/is (= (:touched copy-root') nil)) (t/is (= (:touched copy-child') #{:fill-group})))) + +(t/deftest test-not-touched-when-adding-shape + (let [;; Setup + file (-> (thf/sample-file :file1) + (tho/add-simple-component-with-copy :component1 + :main-root + :main-child + :copy-root) + (thf/add-sample-shape :free-shape)) + + page (thf/current-page file) + + ;; Action + ;; IMPORTANT: as modifying copies structure is now forbidden, this action + ;; will not have any effect, and so the parent shape won't also be touched. + changes (cflh/generate-relocate-shapes (pcb/empty-changes) + (:objects page) + #{(thi/id :copy-root)} ; parents + (thi/id :copy-root) ; parent-id + (:id page) ; page-id + 0 ; to-index + #{(thi/id :free-shape)}) ; ids + + file' (thf/apply-changes file changes) + + ;; Get + copy-root' (thf/get-shape file' :copy-root) + copy-child' (thf/get-shape-by-id file' (first (:shapes copy-root')))] + + ;; Check + (t/is (= (:touched copy-root') nil)) + (t/is (= (:touched copy-child') nil)))) + +(t/deftest test-touched-when-deleting-shape + (let [;; Setup + file (-> (thf/sample-file :file1) + (tho/add-simple-component-with-copy :component1 + :main-root + :main-child + :copy-root)) + + page (thf/current-page file) + copy-root (thf/get-shape file :copy-root) + + ;; Action + ;; IMPORTANT: as modifying copies structure is now forbidden, this action will not + ;; delete the child shape, but hide it (thus setting the visibility group). + [_all-parents changes] + (cflh/generate-delete-shapes (pcb/empty-changes) + file + page + (:objects page) + (set (:shapes copy-root)) + {:components-v2 true}) + + file' (thf/apply-changes file changes) + + ;; Get + copy-root' (thf/get-shape file' :copy-root) + copy-child' (thf/get-shape-by-id file' (first (:shapes copy-root')))] + + ;; Check + (t/is (= (:touched copy-root') nil)) + (t/is (= (:touched copy-child') #{:visibility-group})))) + +(t/deftest test-not-touched-when-moving-shape + (let [;; Setup + file (-> (thf/sample-file :file1) + (tho/add-component-with-many-children-and-copy :component1 + :main-root + [:main-child1 :main-child2 :main-child3] + :copy-root) + (thf/add-sample-shape :free-shape)) + + page (thf/current-page file) + copy-root (thf/get-shape file :copy-root) + copy-child1 (thf/get-shape-by-id file (first (:shapes copy-root))) + + ;; Action + ;; IMPORTANT: as modifying copies structure is now forbidden, this action + ;; will not have any effect, and so the parent shape won't also be touched. + changes (cflh/generate-relocate-shapes (pcb/empty-changes) + (:objects page) + #{(thi/id :copy-root)} ; parents + (thi/id :copy-root) ; parent-id + (:id page) ; page-id + 2 ; to-index + #{(:id copy-child1)}) ; ids + + file' (thf/apply-changes file changes) + + ;; Get + copy-root' (thf/get-shape file' :copy-root) + copy-child' (thf/get-shape-by-id file' (first (:shapes copy-root')))] + + ;; Check + (t/is (= (:touched copy-root') nil)) + (t/is (= (:touched copy-child') nil)))) diff --git a/frontend/test/frontend_tests/state_components_sync_test.cljs b/frontend/test/frontend_tests/state_components_sync_test.cljs index 56581b29e..8ae88562a 100644 --- a/frontend/test/frontend_tests/state_components_sync_test.cljs +++ b/frontend/test/frontend_tests/state_components_sync_test.cljs @@ -23,201 +23,6 @@ ;; === Test touched ====================== -(t/deftest test-touched-children-add - (t/async done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1" - :fill-color clr/white - :fill-opacity 1}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)]) - (thp/instantiate-component :instance1 - (thp/id :component1)) - (thp/sample-shape :shape2 :circle - {:name "Circle 1"})) - - instance1 (thp/get-shape state :instance1) - shape2 (thp/get-shape state :shape2) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; [Page: Page 1] - ;; Root Frame - ;; {Rect 1} - ;; Rect1 - ;; Rect 1 #--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; Circle 1 - ;; - ;; [Component: Rect 1] core.cljs:200:23 - ;; --> [Page 1] Rect 1 - - (let [[[group shape1] [c-group c-shape1] _component] - (thl/resolve-instance-and-main-allow-dangling - new-state - (thp/id :instance1))] - - (t/is (= (:name group) "Rect 1")) - (t/is (nil? (:touched group))) - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:touched shape1) nil)) - (t/is (not= (:shape-ref shape1) nil)) - - (t/is (= (:name c-group) "Rect 1")) - (t/is (= (:touched c-group) nil)) - (t/is (= (:shape-ref c-group) nil)) - (t/is (= (:name c-shape1) "Rect 1")) - (t/is (= (:touched c-shape1) nil)) - (t/is (= (:shape-ref c-shape1) nil)))))] - - (ptk/emit! - store - (dw/relocate-shapes #{(:id shape2)} (:id instance1) 0) ;; We cant't change the structure of component copies, so this operation will do nothing - :the/end)))) - -(t/deftest test-touched-children-delete - (t/async done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1"}) - (thp/sample-shape :shape2 :rect - {:name "Rect 2"}) - (thp/make-component :main1 :component1 - [(thp/id :shape1) - (thp/id :shape2)]) - (thp/instantiate-component :instance1 - (thp/id :component1))) - - [_group1 shape1'] - (thl/resolve-instance state (thp/id :instance1)) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;;; - ;; [Page] - ;; Root Frame - ;; Component 1 - ;; Rect 1 - ;; Rect 2 - ;; Component 1 #--> Component 1 - ;; Rect 1* ---> Rect 1 - ;; #{:visibility-group} - ;; Rect 2 ---> Rect 2 - ;;; - ;; [Component 1] - ;; page1 / Component 1 - ;; - (let [[[group shape1 shape2] [c-group c-shape1 c-shape2] _component] - (thl/resolve-instance-and-main-allow-dangling - new-state - (thp/id :instance1))] - - (t/is (= (:name group) "Component 1")) - (t/is (= (:touched group) nil)) - (t/is (not= (:shape-ref group) nil)) - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:hidden shape1) true)) ; Instance shapes are not deleted but hidden - (t/is (= (:touched shape1) #{:visibility-group})) - (t/is (not= (:shape-ref shape1) nil)) - (t/is (= (:name shape2) "Rect 2")) - (t/is (= (:touched shape2) nil)) - (t/is (not= (:shape-ref shape2) nil)) - - (t/is (= (:name c-group) "Component 1")) - (t/is (= (:touched c-group) nil)) - (t/is (= (:shape-ref c-group) nil)) - (t/is (= (:name c-shape1) "Rect 1")) - (t/is (= (:touched c-shape1) nil)) - (t/is (= (:shape-ref c-shape1) nil)) - (t/is (= (:name c-shape2) "Rect 2")) - (t/is (= (:touched c-shape2) nil)) - (t/is (= (:shape-ref c-shape2) nil)))))] - - (ptk/emit! - store - (dwsh/delete-shapes #{(:id shape1')}) - :the/end)))) - -(t/deftest test-touched-children-move - (t/async done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1"}) - (thp/sample-shape :shape2 :rect - {:name "Rect 2"}) - (thp/sample-shape :shape3 :rect - {:name "Rect 3"}) - (thp/make-component :main1 :component1 - [(thp/id :shape1) - (thp/id :shape2) - (thp/id :shape3)]) - (thp/instantiate-component :instance1 - (thp/id :component1))) - - [group1' shape1'] - (thl/resolve-instance state (thp/id :instance1)) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; [Page: Page 1] - ;; Root Frame - ;; {Component 1} # - ;; Rect 1 - ;; Rect 2 - ;; Rect 3 - ;; Component 1 #--> Component 1 - ;; Rect 1 ---> Rect 1 - ;; Rect 2 ---> Rect 2 - ;; Rect 3 ---> Rect 3 - ;; - ;; ========= Local library - ;; - ;; [Component: Component 1] - ;; --> [Page 1] Component 1 - - (let [[[group shape1 shape2 shape3] - [c-group c-shape1 c-shape2 c-shape3] _component] - (thl/resolve-instance-and-main-allow-dangling - new-state - (thp/id :instance1))] - - (t/is (= (:name group) "Component 1")) - (t/is (nil? (:touched group))) - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:touched shape1) nil)) - (t/is (not= (:shape-ref shape1) nil)) - (t/is (= (:name shape2) "Rect 2")) - (t/is (= (:touched shape2) nil)) - (t/is (not= (:shape-ref shape2) nil)) - (t/is (= (:name shape3) "Rect 3")) - (t/is (= (:touched shape3) nil)) - (t/is (not= (:shape-ref shape3) nil)) - - (t/is (= (:name c-group) "Component 1")) - (t/is (= (:touched c-group) nil)) - (t/is (= (:shape-ref c-group) nil)) - (t/is (= (:name c-shape1) "Rect 1")) - (t/is (= (:touched c-shape1) nil)) - (t/is (= (:shape-ref c-shape1) nil)) - (t/is (= (:name c-shape2) "Rect 2")) - (t/is (= (:touched c-shape2) nil)) - (t/is (= (:shape-ref c-shape2) nil)) - (t/is (= (:name c-shape3) "Rect 3")) - (t/is (= (:touched c-shape3) nil)) - (t/is (= (:shape-ref c-shape3) nil)))))] - - (ptk/emit! - store - (dw/relocate-shapes #{(:id shape1')} (:id group1') 2) ;; We cant't change the structure of component copies, so this operation will do nothing - :the/end)))) - (t/deftest test-touched-from-lib (t/async done -- Gitee From bca8180aebb00f4a0e477455d4f975963f2ca403 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 30 Apr 2024 10:01:29 +0200 Subject: [PATCH 0481/1266] :bug: Fix duplicate component --- common/src/app/common/files/libraries_helpers.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/app/common/files/libraries_helpers.cljc b/common/src/app/common/files/libraries_helpers.cljc index 5aa612a52..2aceb35fd 100644 --- a/common/src/app/common/files/libraries_helpers.cljc +++ b/common/src/app/common/files/libraries_helpers.cljc @@ -166,7 +166,7 @@ [new-component-shape new-component-shapes ; <- null in components-v2 new-main-instance-shape new-main-instance-shapes] - (duplicate-component (:data library) component new-component-id)] + (duplicate-component component new-component-id (:data library))] (-> changes (pcb/with-page main-instance-page) -- Gitee From 0fc7d8529e58d76df111098faffe8c82e27a0d35 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 30 Apr 2024 10:38:58 +0200 Subject: [PATCH 0482/1266] :sparkles: Delete Bottle tutorial and walkthrough from onboarding dashboard --- .../src/app/main/ui/dashboard/projects.cljs | 117 +----------------- .../src/app/main/ui/dashboard/projects.scss | 86 ------------- 2 files changed, 1 insertion(+), 202 deletions(-) diff --git a/frontend/src/app/main/ui/dashboard/projects.cljs b/frontend/src/app/main/ui/dashboard/projects.cljs index cdd9304e9..11ab89f5d 100644 --- a/frontend/src/app/main/ui/dashboard/projects.cljs +++ b/frontend/src/app/main/ui/dashboard/projects.cljs @@ -7,15 +7,11 @@ (ns app.main.ui.dashboard.projects (:require-macros [app.main.style :as stl]) (:require - [app.common.data :as d] [app.common.geom.point :as gpt] - [app.config :as cf] [app.main.data.dashboard :as dd] [app.main.data.events :as ev] - [app.main.data.messages :as msg] [app.main.data.modal :as modal] [app.main.data.users :as du] - [app.main.errors :as errors] [app.main.refs :as refs] [app.main.store :as st] [app.main.ui.dashboard.grid :refer [line-grid]] @@ -100,80 +96,6 @@ (def builtin-templates (l/derived :builtin-templates st/state)) -(mf/defc tutorial-project - [{:keys [close-tutorial default-project-id] :as props}] - (let [state (mf/use-state {:status :waiting - :file nil}) - - templates (mf/deref builtin-templates) - template (d/seek #(= (:id %) "tutorial-for-beginners") templates) - - on-template-cloned-success - (mf/use-fn - (mf/deps default-project-id) - (fn [response] - (swap! state #(assoc % :status :success :file (:first response))) - (st/emit! (dd/go-to-workspace {:id (first response) :project-id default-project-id :name "tutorial"}) - (du/update-profile-props {:viewed-tutorial? true})))) - - on-template-cloned-error - (mf/use-fn - (fn [cause] - (swap! state assoc :status :error) - (errors/print-error! cause) - (st/emit! (msg/error (tr "dashboard.libraries-and-templates.import-error"))))) - - download-tutorial - (mf/use-fn - (mf/deps template default-project-id) - (fn [] - (let [mdata {:on-success on-template-cloned-success - :on-error on-template-cloned-error} - params {:project-id default-project-id - :template-id (:id template)}] - (swap! state #(assoc % :status :importing)) - (st/emit! (with-meta (dd/clone-template (with-meta params mdata)) - {::ev/origin "get-started-hero-block"})))))] - [:article {:class (stl/css :tutorial)} - [:div {:class (stl/css :thumbnail)}] - [:div {:class (stl/css :text)} - [:h2 {:class (stl/css :title)} (tr "dasboard.tutorial-hero.title")] - [:p {:class (stl/css :info)} (tr "dasboard.tutorial-hero.info")] - [:button {:class (stl/css :btn-primary :action) - :on-click download-tutorial} - (case (:status @state) - :waiting (tr "dasboard.tutorial-hero.start") - :importing [:span.loader i/loader-pencil] - :success "")]] - - [:button {:class (stl/css :close) - :on-click close-tutorial - :aria-label (tr "labels.close")} - close-icon]])) - -(mf/defc interface-walkthrough - {::mf/wrap [mf/memo]} - [{:keys [close-walkthrough] :as props}] - (let [handle-walkthrough-link - (fn [] - (st/emit! (ptk/event ::ev/event {::ev/name "show-walkthrough" - ::ev/origin "get-started-hero-block" - :section "dashboard"})))] - [:article {:class (stl/css :walkthrough)} - [:div {:class (stl/css :thumbnail)}] - [:div {:class (stl/css :text)} - [:h2 {:class (stl/css :title)} (tr "dasboard.walkthrough-hero.title")] - [:p {:class (stl/css :info)} (tr "dasboard.walkthrough-hero.info")] - [:a {:class (stl/css :btn-primary :action) - :href " https://design.penpot.app/walkthrough" - :target "_blank" - :on-click handle-walkthrough-link} - (tr "dasboard.walkthrough-hero.start")]] - [:button {:class (stl/css :close) - :on-click close-walkthrough - :aria-label (tr "labels.close")} - close-icon]])) - (mf/defc project-item [{:keys [project first? team files] :as props}] (let [locale (mf/deref i18n/locale) @@ -365,7 +287,7 @@ (l/derived :dashboard-recent-files st/state)) (mf/defc projects-section - [{:keys [team projects profile default-project-id] :as props}] + [{:keys [team projects profile] :as props}] (let [projects (->> (vals projects) (sort-by :modified-at) (reverse)) @@ -378,8 +300,6 @@ (:team-hero? props true) (not (:is-default team))) - tutorial-viewed? (:viewed-tutorial? props true) - walkthrough-viewed? (:viewed-walkthrough? props true) is-my-penpot (= (:default-team-id profile) (:id team)) team-id (:id team) @@ -391,28 +311,6 @@ (ptk/data-event ::ev/event {::ev/name "dont-show-team-up-hero" ::ev/origin "dashboard"})))) - close-tutorial - (mf/use-fn - (fn [] - (st/emit! (du/update-profile-props {:viewed-tutorial? true}) - (ptk/data-event ::ev/event {::ev/name "dont-show-tutorial" - ::ev/origin "get-started-hero" - :type "tutorial" - :section "dashboard"})))) - - close-walkthrough - (mf/use-fn - (fn [] - (st/emit! (du/update-profile-props {:viewed-walkthrough? true}) - (ptk/data-event ::ev/event {::ev/name "dont-show-walkthrough" - ::ev/origin "get-started-hero" - :type "walkthrough" - :section "dashboard"})))) - - show-hero? (and is-my-penpot - (or (not tutorial-viewed?) - (not walkthrough-viewed?))) - show-team-hero? (and (not is-my-penpot) team-hero?)] (mf/with-effect [team] @@ -433,22 +331,9 @@ (when team-hero? [:& team-hero {:team team :close-fn close-banner}]) - (when (and (contains? cf/flags :dashboard-templates-section) - show-hero?) - [:div {:class (stl/css :hero-projects)} - (when (and (not tutorial-viewed?) (:is-default team)) - [:& tutorial-project - {:close-tutorial close-tutorial - :default-project-id default-project-id}]) - - (when (and (not walkthrough-viewed?) (:is-default team)) - [:& interface-walkthrough - {:close-walkthrough close-walkthrough}])]) - [:div {:class (stl/css-case :dashboard-container true :no-bg true :dashboard-projects true - :with-hero show-hero? :with-team-hero show-team-hero?)} (for [{:keys [id] :as project} projects] (let [files (when recent-map diff --git a/frontend/src/app/main/ui/dashboard/projects.scss b/frontend/src/app/main/ui/dashboard/projects.scss index e3b57fba5..680b9ef32 100644 --- a/frontend/src/app/main/ui/dashboard/projects.scss +++ b/frontend/src/app/main/ui/dashboard/projects.scss @@ -20,7 +20,6 @@ height: calc(100vh - $s-64); } -.with-hero, .with-team-hero { height: calc(100vh - $s-280); } @@ -242,88 +241,3 @@ width: 0; } } - -.hero-projects { - display: grid; - grid-template-columns: 1fr 1fr; - grid-gap: $s-32; - margin: 0 $s-16 $s-16 $s-20; - - @media (max-width: 1366px) { - grid-template-columns: 1fr; - } - - .tutorial, - .walkthrough { - display: grid; - grid-template-columns: auto 1fr; - position: relative; - border-radius: $br-8; - min-height: $s-216; - background-color: $db-tertiary; - padding: $s-8; - - .thumbnail { - width: $s-200; - height: $s-200; - border-radius: $br-6; - padding: $s-32; - display: block; - background-color: var(--color-canvas); - } - - img { - border-radius: $br-4; - margin-bottom: 0; - width: $s-232; - } - - .text { - padding: $s-32; - display: flex; - flex-direction: column; - } - - .title { - color: $df-primary; - font-size: $fs-24; - font-weight: $fw400; - margin-bottom: $s-8; - } - .info { - flex: 1; - color: $df-secondary; - margin-bottom: $s-20; - font-size: $fs-16; - } - .invite { - height: $s-32; - } - .action { - width: $s-180; - height: $s-40; - } - } - .walkthrough { - .thumbnail { - background-image: url("/images/walkthrough-cover.png"); - background-position: center; - background-repeat: no-repeat; - background-size: cover; - } - } - .tutorial { - .thumbnail { - background-image: url("/images/hands-on-tutorial.png"); - background-position: center; - background-repeat: no-repeat; - background-size: cover; - } - .loader { - display: flex; - svg#loader-pencil { - width: $s-32; - } - } - } -} -- Gitee From de6d8ccbf981539fd61d2f110fafb368ccf0673c Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Tue, 30 Apr 2024 19:23:58 +0200 Subject: [PATCH 0483/1266] :white_check_mark: Small fix on components touched test --- .../test/common_tests/logic/components_touched_test.cljc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/common/test/common_tests/logic/components_touched_test.cljc b/common/test/common_tests/logic/components_touched_test.cljc index 45b11b59f..4d912a641 100644 --- a/common/test/common_tests/logic/components_touched_test.cljc +++ b/common/test/common_tests/logic/components_touched_test.cljc @@ -61,14 +61,15 @@ :copy-root) (thf/add-sample-shape :free-shape)) - page (thf/current-page file) + page (thf/current-page file) + copy-root (thf/get-shape file :copy-root) ;; Action ;; IMPORTANT: as modifying copies structure is now forbidden, this action ;; will not have any effect, and so the parent shape won't also be touched. changes (cflh/generate-relocate-shapes (pcb/empty-changes) (:objects page) - #{(thi/id :copy-root)} ; parents + #{(:parent-id copy-root)} ; parents (thi/id :copy-root) ; parent-id (:id page) ; page-id 0 ; to-index @@ -134,7 +135,7 @@ ;; will not have any effect, and so the parent shape won't also be touched. changes (cflh/generate-relocate-shapes (pcb/empty-changes) (:objects page) - #{(thi/id :copy-root)} ; parents + #{(:parent-id copy-child1)} ; parents (thi/id :copy-root) ; parent-id (:id page) ; page-id 2 ; to-index -- Gitee From a7eb70a8e0a0aee3e6a65feb098a9c220c1796e9 Mon Sep 17 00:00:00 2001 From: Geek Squirrel Date: Wed, 1 May 2024 10:07:38 +0200 Subject: [PATCH 0484/1266] :globe_with_meridians: Add translations for: Chinese (Simplified). Currently translated at 99.4% (1371 of 1379 strings) :globe_with_meridians: Add translations for: Chinese (Simplified). Currently translated at 95.5% (1317 of 1379 strings) Co-authored-by: Geek Squirrel Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/ Translation: Penpot/frontend --- frontend/translations/zh_CN.po | 293 ++++++++++++++++++++++++++++----- 1 file changed, 255 insertions(+), 38 deletions(-) diff --git a/frontend/translations/zh_CN.po b/frontend/translations/zh_CN.po index 4771a1534..4ecda6cc0 100644 --- a/frontend/translations/zh_CN.po +++ b/frontend/translations/zh_CN.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 13:04+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Chinese (Simplified) " -"\n" +"Language-Team: Chinese (Simplified) \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -76,11 +76,23 @@ msgstr "LDAP登录" msgid "auth.login-with-oidc-submit" msgstr "OpenID登录" -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, +#: src/app/main/ui/dashboard/team_form.cljs, +#: src/app/main/ui/onboarding/team_choice.cljs, +#: src/app/main/ui/settings/access_tokens.cljs, +#: src/app/main/ui/settings/feedback.cljs, +#: src/app/main/ui/settings/profile.cljs, +#: src/app/main/ui/workspace/sidebar/assets.cljs msgid "auth.name.not-all-space" msgstr "姓名必须包含一些空格以外的字符。" -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +#: src/app/main/ui/auth/register.cljs, +#: src/app/main/ui/dashboard/team_form.cljs, +#: src/app/main/ui/onboarding/team_choice.cljs, +#: src/app/main/ui/settings/access_tokens.cljs, +#: src/app/main/ui/settings/feedback.cljs, +#: src/app/main/ui/settings/profile.cljs, +#: src/app/main/ui/workspace/sidebar/assets.cljs msgid "auth.name.too-long" msgstr "姓名最多包含250个字符。" @@ -167,7 +179,6 @@ msgid "auth.terms-privacy-agreement" msgstr "创建账号意味着您认可我们的服务条例和隐私政策。" #: src/app/main/ui/auth/register.cljs -#, markdown msgid "auth.terms-privacy-agreement-md" msgstr "创建新账号,即代表你同意我们的[服务条例](%s)和[隐私政策](%s)。" @@ -333,7 +344,9 @@ msgstr "个人访问令牌" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.personal.description" -msgstr "个人访问令牌可被理解为密码认证的代替选项,常用于允许(第三方)应用访问Penpot内部API" +msgstr "" +"个人访问令牌可被理解为密码认证的代替选项,常用于允许(第三方)应用访问Penpot" +"内部API" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.token-will-expire" @@ -386,8 +399,8 @@ msgstr "复制 %s 个文件" #: src/app/main/ui/dashboard/grid.cljs msgid "dashboard.empty-placeholder-drafts" msgstr "" -"添加到库的文件将出现在这里。尝试分享你的文件或从我们的[库和模板](https://penpot.app/libraries-templates." -"html)添加。" +"添加到库的文件将出现在这里。尝试分享你的文件或从我们的[库和模板](https://" +"penpot.app/libraries-templates.html)添加。" msgid "dashboard.export-binary-multi" msgstr "下载 %s Penpot文件 (.penpot)" @@ -474,13 +487,15 @@ msgstr[1] "%s 个字体添加成功" msgid "dashboard.fonts.hero-text1" msgstr "" -"你在此上传的任何网络字体文件,将会被添加至本团队下文件的字体属性中的可用字体族列表中。拥有相同字体族名称的字体文件,将会按照字体族进行分组。你可以上传以" +"你在此上传的任何网络字体文件,将会被添加至本团队下文件的字体属性中的可用字体" +"族列表中。拥有相同字体族名称的字体文件,将会按照字体族进行分组。你可以上传以" "下格式的字体文件:**TTF,OTF和WOFF**(你只需要上传其中一种即可)。" msgid "dashboard.fonts.hero-text2" msgstr "" -"你应当只向Penpot上传你所拥有的字体,或是你持有使用许可的字体。点击[Penpot服务条例](https://penpot.app/terms." -"html)查看更多有关内容权利的章节。或许你也想了解一下[字体许可授权] (https://www.typography.com/faq)。" +"你应当只向Penpot上传你所拥有的字体,或是你持有使用许可的字体。点击[Penpot服务" +"条例](https://penpot.app/terms.html)查看更多有关内容权利的章节。或许你也想了" +"解一下[字体许可授权] (https://www.typography.com/faq)。" #: src/app/main/ui/dashboard/fonts.cljs msgid "dashboard.fonts.upload-all" @@ -488,9 +503,10 @@ msgstr "全部上传" msgid "dashboard.fonts.warning-text" msgstr "" -"我们在你的字体中检测到一个可能的问题,与不同操作系统的垂直度量有关。为了检查它,你可以使用字体垂直度量服务,如[这个](https://" -"vertical-metrics.netlify.app/)。此外,我们建议使用[Transfonter](https://transfonter." -"org/)来生成网络字体并修复错误。 " +"我们在你的字体中检测到一个可能的问题,与不同操作系统的垂直度量有关。为了检查" +"它,你可以使用字体垂直度量服务,如[这个](https://vertical-metrics.netlify." +"app/)。此外,我们建议使用[Transfonter](https://transfonter.org/)来生成网络字" +"体并修复错误。 " msgid "dashboard.import" msgstr "导入文件" @@ -747,7 +763,9 @@ msgid "dashboard.webhooks.create.success" msgstr "Webhook创建成功。" msgid "dashboard.webhooks.description" -msgstr "Webhooks是一种简单的方式,允许其他网站和应用程序在Penpot的某些事件发生时得到通知。我们将发送一个POST请求到你提供的每个URL。" +msgstr "" +"Webhooks是一种简单的方式,允许其他网站和应用程序在Penpot的某些事件发生时得到" +"通知。我们将发送一个POST请求到你提供的每个URL。" msgid "dashboard.webhooks.empty.add-one" msgstr "按“添加webhook”按钮添加一个。" @@ -855,7 +873,9 @@ msgstr "此邮箱[%s]已被标记为垃圾邮件或已被永久拉黑。" #: src/app/main/errors.cljs msgid "errors.feature-mismatch" -msgstr "看起来你正在打开一个启用了'%s'功能的文件,但当前penpot版本并不支持该功能或已将其禁用。" +msgstr "" +"看起来你正在打开一个启用了'%s'功能的文件,但当前penpot版本并不支持该功能或已" +"将其禁用。" #: src/app/main/errors.cljs msgid "errors.feature-not-supported" @@ -863,7 +883,9 @@ msgstr "不支持功能“%s”。" #: src/app/main/errors.cljs msgid "errors.file-feature-mismatch" -msgstr "看起来当前启用的功能,与正在打开的文件所依赖的功能不匹配。在打开文件前,需要应用对“%s”修改。" +msgstr "" +"看起来当前启用的功能,与正在打开的文件所依赖的功能不匹配。在打开文件前,需要" +"应用对“%s”修改。" #: src/app/main/ui/auth/verify_token.cljs, #: src/app/main/ui/settings/feedback.cljs, src/app/main/ui/dashboard/team.cljs @@ -965,7 +987,6 @@ msgstr "连接错误,无法访问 URL" msgid "errors.webhooks.invalid-uri" msgstr "网址未通过验证。" -#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "上次交付不成功。" @@ -1011,25 +1032,25 @@ msgstr "话题" #: src/app/main/ui/settings/feedback.cljs msgid "feedback.subtitle" -msgstr "请说明你发邮件的原因,详细说明这是一个问题反馈、一个点子还是一个疑问。我们会尽快回复。" +msgstr "" +"请说明你发邮件的原因,详细说明这是一个问题反馈、一个点子还是一个疑问。我们会" +"尽快回复。" #: src/app/main/ui/settings/feedback.cljs msgid "feedback.title" msgstr "电子邮件" #: src/app/main/ui/settings/feedback.cljs -#, fuzzy msgid "feedback.twitter-go-to" -msgstr "前往Twtter" +msgstr "前往X(原Twitter)" #: src/app/main/ui/settings/feedback.cljs msgid "feedback.twitter-subtitle1" msgstr "这里可以帮助您解决技术问题。" #: src/app/main/ui/settings/feedback.cljs -#, fuzzy msgid "feedback.twitter-title" -msgstr "Twtter支持帐号" +msgstr "X(原Twitter)支持帐号" #: src/app/main/ui/settings/password.cljs msgid "generic.error" @@ -1440,7 +1461,8 @@ msgstr "已安装字体" #: src/app/main/ui/static.cljs msgid "labels.internal-error.desc-message" -msgstr "发生了一些不妙的事。请尝试重新操作。如果问题仍然存在,请联系我们以取得支持。" +msgstr "" +"发生了一些不妙的事。请尝试重新操作。如果问题仍然存在,请联系我们以取得支持。" #: src/app/main/ui/static.cljs msgid "labels.internal-error.main-message" @@ -1502,8 +1524,8 @@ msgstr "哎呀!" #: src/app/main/ui/dashboard/team.cljs msgid "labels.num-of-files" msgid_plural "labels.num-of-files" -msgstr[0] "1 个文档" -msgstr[1] "共 %s 个文档" +msgstr[0] "共1个文档" +msgstr[1] "共%s个文档" msgid "labels.num-of-frames" msgid_plural "labels.num-of-frames" @@ -1713,7 +1735,9 @@ msgid "media.solid" msgstr "纯色" msgid "modals.add-shared-confirm-empty.hint" -msgstr "你的库是空白的。一旦添加为共享库,此文档库中的素材就可被用于你的其他文档中。你确定要发布它吗?" +msgstr "" +"你的库是空白的。一旦添加为共享库,此文档库中的素材就可被用于你的其他文档中。" +"你确定要发布它吗?" #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs @@ -1899,13 +1923,15 @@ msgid_plural "modals.delete-shared-confirm.accept" msgstr[0] "删除文件" msgstr[1] "批量删除文件" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +#: src/app/main/ui/workspace/header.cljs, +#: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-shared-confirm.activated.no-files-message" msgid_plural "modals.delete-shared-confirm.activated.no-files-message" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "没有文件引用它。" +msgstr[1] "没有文件引用它们。" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +#: src/app/main/ui/workspace/header.cljs, +#: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-shared-confirm.activated.scd-message" msgid_plural "modals.delete-shared-confirm.activated.scd-message" msgstr[0] "该库被以下文档使用: " @@ -1987,7 +2013,9 @@ msgid "modals.leave-and-close-confirm.message" msgstr "您确定要离开 %s 团队吗?" msgid "modals.leave-and-reassign.forbidden" -msgstr "如果不能推选另一个成员作为团队所有者,你就无法离开团队。你或许想要删除该团队。" +msgstr "" +"如果不能推选另一个成员作为团队所有者,你就无法离开团队。你或许想要删除该团" +"队。" #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.leave-and-reassign.hint1" @@ -2168,22 +2196,28 @@ msgid "onboarding-v2.newsletter.privacy1" msgstr "我们关心隐私,您可在此阅读我们的 " msgid "onboarding-v2.newsletter.privacy2" -msgstr "我们将仅发送与您有关的邮件,您可以随时在其中任意一封邮件中点击取消订阅。" +msgstr "" +"我们将仅发送与您有关的邮件,您可以随时在其中任意一封邮件中点击取消订阅。" msgid "onboarding-v2.newsletter.updates" msgstr "向我发送一些产品更新(新功能,新版本,新修复等)。" msgid "onboarding-v2.welcome.desc1" -msgstr "Penpot是由Kaleidos及社区共同开发的开源软件,许多人已经在社区中互相帮助。每个人都可以通过以下方式进行协作:" +msgstr "" +"Penpot是由Kaleidos及社区共同开发的开源软件,许多人已经在社区中互相帮助。每个" +"人都可以通过以下方式进行协作:" msgid "onboarding-v2.welcome.desc2" -msgstr "一个与整个社区和Penpot核心团队学习、分享和讨论Penpot及其现在和未来的公共空间。" +msgstr "" +"一个与整个社区和Penpot核心团队学习、分享和讨论Penpot及其现在和未来的公共空" +"间。" msgid "onboarding-v2.welcome.desc2.title" msgstr "参与到社区中" msgid "onboarding-v2.welcome.desc3" -msgstr "在这里,您将了解如何协作进行翻译、功能需求提出、核心代码贡献、BUG修复等…" +msgstr "" +"在这里,您将了解如何协作进行翻译、功能需求提出、核心代码贡献、BUG修复等…" msgid "onboarding-v2.welcome.desc3.title" msgstr "贡献指南" @@ -2429,7 +2463,9 @@ msgstr "从事概念构想的工作" #: src/app/main/ui/onboarding/questions.cljs msgid "questions.your-feedback-will-help-us" -msgstr "你的反馈将帮助我们更好地理解你的习惯和偏好,以便我们不断改进Penpot,使其成为一个有用且好用的工具。" +msgstr "" +"你的反馈将帮助我们更好地理解你的习惯和偏好,以便我们不断改进Penpot,使其成为" +"一个有用且好用的工具。" #: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs, @@ -3040,7 +3076,6 @@ msgstr "点击时显示交互" msgid "viewer.header.sitemap" msgstr "站点地图" -#, fuzzy msgid "webhooks.last-delivery.success" msgstr "上次交付成功。" @@ -4959,3 +4994,185 @@ msgstr "更新" msgid "workspace.viewport.click-to-close-path" msgstr "单击以闭合路径" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "登录我的账号" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.library-updates" +msgstr "共享库更新" + +msgid "workspace.options.component.swap" +msgstr "交换组件" + +msgid "workspace.options.guides.title" +msgstr "参考线" + +#: src/app/main/ui/workspace/header.cljs, +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "modals.delete-unpublish-shared-confirm.activated.hint" +msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" +msgstr[0] "" +"这个文件中被其他文件引用的素材依然在那(其他文件的现有设计不会被破坏)。" +msgstr[1] "" +"这些文件中被其他文件引用的素材依然在那(其他文件的现有设计不会被破坏)。" + +msgid "dashboard.import.analyze-error.components-v2" +msgstr "文件已启用“组件v2”功能,但这个团队尚未支持该功能。" + +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "切换到深色主题" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "切换到浅色主题" + +msgid "media.keep-aspect-ratio" +msgstr "保持宽高比" + +msgid "onboarding.team-modal.team-definition" +msgstr "团队是什么?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.describe-your-experience-working-on" +msgstr "对你经历的最好描述是:" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-one" +msgstr "都没用过" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs +msgid "settings.select-this-color" +msgstr "选择使用此样式的项目" + +msgid "shortcuts.toggle-snap-guides" +msgstr "吸附到参考线" + +msgid "shortcuts.toggle-snap-ruler-guide" +msgstr "吸附到标尺参考线" + +msgid "shortcuts.toggle-theme" +msgstr "更改主题" + +#: src/app/main/ui/workspace/sidebar/assets/common.cljs +msgid "workspace.assets.sidebar.components" +msgid_plural "workspace.assets.sidebar.components" +msgstr[0] "1个组件" +msgstr[1] "%s个组件" + +msgid "workspace.context-menu.grid-cells.area" +msgstr "新建区域" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "新建画板" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "合并网格" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "在右侧添加一列" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "删除此列及其内容" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "复制此列" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "在下方添加一行" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-ruler-guides" +msgstr "启用“吸附到标尺参考线”" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-guides" +msgstr "显示参考线" + +msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" +msgstr "定位网格布局" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.unlink-library-btn" +msgstr "断开共享库" + +msgid "workspace.top-bar.view-only" +msgstr "**检查代码**(仅查看)" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-tagline" +msgstr "Penpot是一款自由开源的设计工具,用于「设计」和「开发」协同" + +msgid "modals.move-shared-confirm.accept" +msgid_plural "modals.move-shared-confirm.accept" +msgstr[0] "移动" +msgstr[1] "移动" + +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "不允许使用此域名" + +msgid "modals.move-shared-confirm.message" +msgid_plural "modals.move-shared-confirm.message" +msgstr[0] "你确定要移动这个共享库吗?" +msgstr[1] "你确定要移动这些共享库吗?" + +msgid "modals.move-shared-confirm.title" +msgid_plural "modals.move-shared-confirm.title" +msgstr[0] "移动共享库" +msgstr[1] "移动共享库" + +msgid "shortcuts.toggle-guides" +msgstr "显示/隐藏参考线" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.filter" +msgstr "过滤器" + +msgid "shortcuts.toggle-layout-grid" +msgstr "添加/移除网格布局" + +msgid "shortcuts.toggle-rulers" +msgstr "显示/隐藏标尺" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "排序" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "在左侧添加一列" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-grid" +msgstr "移除网格布局" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "删除此列" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "复制此行" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "在上方添加一行" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "删除此行" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "删除此行及其内容" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-ruler-guides" +msgstr "禁用“吸附到标尺参考线”" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-guides" +msgstr "隐藏参考线" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "加载中…" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.shared-library-btn" +msgstr "连接共享库" -- Gitee From 71687593fdc4ffc17d67689b43a2998533a0ed42 Mon Sep 17 00:00:00 2001 From: Linerly Date: Wed, 1 May 2024 10:07:39 +0200 Subject: [PATCH 0485/1266] :globe_with_meridians: Add translations for: Indonesian. Currently translated at 100.0% (1379 of 1379 strings) Co-authored-by: Linerly Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/ Translation: Penpot/frontend --- frontend/translations/id.po | 230 ++++++++++++++++++++++++++++-------- 1 file changed, 181 insertions(+), 49 deletions(-) diff --git a/frontend/translations/id.po b/frontend/translations/id.po index 276c9c831..5c07ed71c 100644 --- a/frontend/translations/id.po +++ b/frontend/translations/id.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 12:55+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Indonesian " -"\n" +"Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -80,11 +80,23 @@ msgstr "LDAP" msgid "auth.login-with-oidc-submit" msgstr "OpenID Connect" -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, +#: src/app/main/ui/dashboard/team_form.cljs, +#: src/app/main/ui/onboarding/team_choice.cljs, +#: src/app/main/ui/settings/access_tokens.cljs, +#: src/app/main/ui/settings/feedback.cljs, +#: src/app/main/ui/settings/profile.cljs, +#: src/app/main/ui/workspace/sidebar/assets.cljs msgid "auth.name.not-all-space" msgstr "Nama harus berisi beberapa karakter selain spasi." -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +#: src/app/main/ui/auth/register.cljs, +#: src/app/main/ui/dashboard/team_form.cljs, +#: src/app/main/ui/onboarding/team_choice.cljs, +#: src/app/main/ui/settings/access_tokens.cljs, +#: src/app/main/ui/settings/feedback.cljs, +#: src/app/main/ui/settings/profile.cljs, +#: src/app/main/ui/workspace/sidebar/assets.cljs msgid "auth.name.too-long" msgstr "Nama harus berisi setidaknya 250 karakter." @@ -102,7 +114,8 @@ msgstr "Kata sandi berhasil diubah" #: src/app/main/ui/auth/recovery_request.cljs msgid "auth.notifications.profile-not-verified" -msgstr "Profil belum terverifikasi, harap verifikasi profil sebelum melanjutkan." +msgstr "" +"Profil belum terverifikasi, harap verifikasi profil sebelum melanjutkan." #: src/app/main/ui/auth/recovery_request.cljs msgid "auth.notifications.recovery-token-sent" @@ -173,7 +186,6 @@ msgstr "" "privasi kami." #: src/app/main/ui/auth/register.cljs -#, markdown msgid "auth.terms-privacy-agreement-md" msgstr "" "Ketika membuat akun baru, Anda menyetujui [persyaratan layanan](%s) dan " @@ -261,8 +273,8 @@ msgstr "Bersekutu!" #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.tutorial-hero.info" msgstr "" -"Pelajari dasarnya di Penpot sambil bersenang-senang dengan tutorial " -"langsung ini." +"Pelajari dasarnya di Penpot sambil bersenang-senang dengan tutorial langsung " +"ini." #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.tutorial-hero.start" @@ -403,8 +415,8 @@ msgstr "Gandakan % berkas" msgid "dashboard.empty-placeholder-drafts" msgstr "" "Berkas yang ditambahkan ke Pustaka akan muncul di sini. Coba membagikan " -"berkas Anda atau menambahkan dari [Pustaka & " -"templat](https://penpot.app/libraries-templates.html) kami." +"berkas Anda atau menambahkan dari [Pustaka & templat](https://penpot.app/" +"libraries-templates.html) kami." msgid "dashboard.export-binary-multi" msgstr "Unduh %s berkas Penpot (.penpot)" @@ -498,19 +510,19 @@ msgstr[0] "%s fon ditambahkan" msgid "dashboard.fonts.hero-text1" msgstr "" -"Fon web apa pun yang Anda unggah di sini akan ditambahkan ke daftar " -"keluarga fon yang tersedia di properti teks dari berkas dari tim ini. Fon " -"dengan nama keluarga fon yang sama akan dikelompokkan sebagai **keluarga " -"fon tunggal**. Anda dapat mengunggah fon dengan format berikut: **TTF, OTF, " -"dan WOFF** (hanya satu yang diperlukan)." +"Fon web apa pun yang Anda unggah di sini akan ditambahkan ke daftar keluarga " +"fon yang tersedia di properti teks dari berkas dari tim ini. Fon dengan nama " +"keluarga fon yang sama akan dikelompokkan sebagai **keluarga fon tunggal**. " +"Anda dapat mengunggah fon dengan format berikut: **TTF, OTF, dan WOFF** " +"(hanya satu yang diperlukan)." msgid "dashboard.fonts.hero-text2" msgstr "" "Anda seharusnya hanya mengunggah fon yang Anda miliki atau memiliki izin " "untuk menggunakannya dalam Penpot. Ketahui lebih lanjut dalam bagian Hak " -"konten (Content rights) dari [Ketentuan Layanan " -"Penpot](https://penpot.app/terms.html). Anda mungkin juga ingin membaca " -"tentang [lisensi fon](https://www.typography.com/faq)." +"konten (Content rights) dari [Ketentuan Layanan Penpot](https://penpot.app/" +"terms.html). Anda mungkin juga ingin membaca tentang [lisensi fon](https://" +"www.typography.com/faq)." #: src/app/main/ui/dashboard/fonts.cljs msgid "dashboard.fonts.upload-all" @@ -518,12 +530,12 @@ msgstr "Unggah semua" msgid "dashboard.fonts.warning-text" msgstr "" -"Kami telah mendeteksi masalah yang mungkin ada dalam fon Anda terkair " -"dengan metrik vertikal untuk berbagai sistem operasi. Supaya bisa " -"diperiksa, Anda dapat menggunakan layanan metrik vertikal fon seperti [yang " -"ini](https://vertical-metrics.netlify.app/). Sebagai tambahan, kami juga " -"menyarankan menggunakan [Transfonter](https://transfonter.org/) untuk " -"membuat fon web dan memperbaiki kesalahan. " +"Kami telah mendeteksi masalah yang mungkin ada dalam fon Anda terkair dengan " +"metrik vertikal untuk berbagai sistem operasi. Supaya bisa diperiksa, Anda " +"dapat menggunakan layanan metrik vertikal fon seperti [yang ini](https://" +"vertical-metrics.netlify.app/). Sebagai tambahan, kami juga menyarankan " +"menggunakan [Transfonter](https://transfonter.org/) untuk membuat fon web " +"dan memperbaiki kesalahan. " msgid "dashboard.import" msgstr "Impor berkas Penpot" @@ -532,7 +544,8 @@ msgid "dashboard.import.analyze-error" msgstr "Aduh! Kami tidak dapat mengimpor berkas ini" msgid "dashboard.import.analyze-error.components-v2" -msgstr "Berkas dengan komponen v2 diaktifkan tetapi tim ini belum mendukungnya." +msgstr "" +"Berkas dengan komponen v2 diaktifkan tetapi tim ini belum mendukungnya." msgid "dashboard.import.import-error" msgstr "Terdapat masalah saat mengimpor berkas. Berkasnya tidak terimpor." @@ -782,9 +795,8 @@ msgstr "Kaitan web berhasil dibuat." msgid "dashboard.webhooks.description" msgstr "" "Kaitan web (webhook) adalah cara yang sederhana untuk memperbolehkan situs " -"web dan aplikasi lain untuk diberi tahu ketika beberapa peristiwa terjadi " -"di Penpot. Kami mengirim permintaan POST untuk setiap URL yang Anda " -"sediakan." +"web dan aplikasi lain untuk diberi tahu ketika beberapa peristiwa terjadi di " +"Penpot. Kami mengirim permintaan POST untuk setiap URL yang Anda sediakan." msgid "dashboard.webhooks.empty.add-one" msgstr "Klik tombol \"Tambahkan kaitan web\" untuk menambahkan." @@ -946,8 +958,7 @@ msgstr "Sepertinya ini bukan gambar yang valid." #: src/app/main/ui/dashboard/team.cljs msgid "errors.member-is-muted" msgstr "" -"Profil yang Anda undang membisukan surel (laporan spam atau lompatan " -"tinggi)." +"Profil yang Anda undang membisukan surel (laporan spam atau lompatan tinggi)." #: src/app/main/ui/settings/password.cljs msgid "errors.password-invalid-confirmation" @@ -1013,7 +1024,6 @@ msgstr "Kesalahan koneksi, URL tidak dapat diraih" msgid "errors.webhooks.invalid-uri" msgstr "URL tidak melewati validasi." -#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Pengiriman terakhir tidak berhasil." @@ -1257,7 +1267,8 @@ msgid "inspect.empty.more-info" msgstr "Lebih banyak info tentang inspeksi" msgid "inspect.empty.select" -msgstr "Pilih bentuk, papan, atau grup untuk menginskpeksi properti dan kodenya" +msgstr "" +"Pilih bentuk, papan, atau grup untuk menginskpeksi properti dan kodenya" #: src/app/main/ui/inspect/right_sidebar.cljs msgid "inspect.tabs.code" @@ -1538,7 +1549,8 @@ msgstr "Kata sandi baru" #: src/app/main/ui/workspace/comments.cljs, #: src/app/main/ui/dashboard/comments.cljs msgid "labels.no-comments-available" -msgstr "Anda telah melihat semuanya! Notifikasi komentar baru akan muncul di sini." +msgstr "" +"Anda telah melihat semuanya! Notifikasi komentar baru akan muncul di sini." #: src/app/main/ui/dashboard/team.cljs msgid "labels.no-invitations" @@ -1551,8 +1563,7 @@ msgstr "Tekan tombol **Undang orang** untuk mengundang orang-orang ke tim ini." #: src/app/main/ui/static.cljs msgid "labels.not-found.desc-message" msgstr "" -"Laman ini mungkin tidak ada atau Anda tidak memiliki izin untuk " -"mengaksesnya." +"Laman ini mungkin tidak ada atau Anda tidak memiliki izin untuk mengaksesnya." #: src/app/main/ui/static.cljs msgid "labels.not-found.main-message" @@ -1968,12 +1979,14 @@ msgid "modals.delete-shared-confirm.accept" msgid_plural "modals.delete-shared-confirm.accept" msgstr[0] "Hapus berkas" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +#: src/app/main/ui/workspace/header.cljs, +#: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-shared-confirm.activated.no-files-message" msgid_plural "modals.delete-shared-confirm.activated.no-files-message" msgstr[0] "Tidak diaktifkan dalam berkas mana pun." -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +#: src/app/main/ui/workspace/header.cljs, +#: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-shared-confirm.activated.scd-message" msgid_plural "modals.delete-shared-confirm.activated.scd-message" msgstr[0] "Pustaka ini diaktifkan di sini: " @@ -2016,7 +2029,8 @@ msgstr "Apakah Anda yakin ingin mengeluarkan anggota ini dari tim?" msgid "modals.delete-team-member-confirm.title" msgstr "Keluarkan anggota tim" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +#: src/app/main/ui/workspace/header.cljs, +#: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-unpublish-shared-confirm.activated.hint" msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" msgstr[0] "" @@ -2047,8 +2061,8 @@ msgstr "Surel, dipisah dengan koma" msgid "modals.invite-member.repeated-invitation" msgstr "" -"Beberapa surel berasal dari anggota tim saat ini. Undangan mereka tidak " -"akan dikirim." +"Beberapa surel berasal dari anggota tim saat ini. Undangan mereka tidak akan " +"dikirim." #: src/app/main/ui/dashboard/team.cljs msgid "modals.invite-team-member.title" @@ -2110,8 +2124,8 @@ msgstr "Transfer kemilikan" #: src/app/main/ui/dashboard/team.cljs msgid "modals.promote-owner-confirm.hint" msgstr "" -"Jika Anda mentransfer kemilikan, Anda akan mengubah peran Anda ke Admin, " -"dan kehilangan beberapa izin pada tim ini. " +"Jika Anda mentransfer kemilikan, Anda akan mengubah peran Anda ke Admin, dan " +"kehilangan beberapa izin pada tim ini. " #: src/app/main/ui/dashboard/team.cljs msgid "modals.promote-owner-confirm.message" @@ -2262,7 +2276,8 @@ msgstr "" "pengembangan dan berita produk." msgid "onboarding-v2.newsletter.news" -msgstr "Kirimkan saya berita tentang Penpot (pos blog, tutorial video, siaran...)." +msgstr "" +"Kirimkan saya berita tentang Penpot (pos blog, tutorial video, siaran...)." msgid "onboarding-v2.newsletter.privacy1" msgstr "Kami peduli tentang privasi, di sini Anda dapat membaca " @@ -2292,8 +2307,8 @@ msgstr "Berpartisipasi dalam Komunitas" msgid "onboarding-v2.welcome.desc3" msgstr "" -"Di mana Anda akan menemukan cara berkolaborasi dengan terjemahan, " -"permintaan fitur, kontribusi inti, pemburuan kutu…" +"Di mana Anda akan menemukan cara berkolaborasi dengan terjemahan, permintaan " +"fitur, kontribusi inti, pemburuan kutu…" msgid "onboarding-v2.welcome.desc3.title" msgstr "Panduan berkontribusi" @@ -2427,7 +2442,8 @@ msgstr "Canva" #: src/app/main/ui/onboarding/questions.cljs msgid "questions.describe-your-experience-working-on" -msgstr "Bagaimana cara terbaik Anda menggambarkan pengalaman Anda mengerjakan..." +msgstr "" +"Bagaimana cara terbaik Anda menggambarkan pengalaman Anda mengerjakan..." #: src/app/main/ui/onboarding/questions.cljs msgid "questions.designer" @@ -3181,7 +3197,6 @@ msgstr "Tampilkan interaksi pada klik" msgid "viewer.header.sitemap" msgstr "Peta Situs" -#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Pengiriman terakhir berhasil." @@ -3241,7 +3256,8 @@ msgstr "Buat sebuah kelompok" #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.create-group-hint" -msgstr "Butir Anda akan dinamakan \"nama kelompok / nama butir\" secara otomatis" +msgstr "" +"Butir Anda akan dinamakan \"nama kelompok / nama butir\" secara otomatis" #: src/app/main/ui/workspace/sidebar/sitemap.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs, @@ -4429,7 +4445,8 @@ msgstr "Cari fon" #: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs msgid "workspace.options.select-a-shape" -msgstr "Pilih bentuk, papan, atau kelompok untuk menyeret koneksi ke papan lain." +msgstr "" +"Pilih bentuk, papan, atau kelompok untuk menyeret koneksi ke papan lain." #: src/app/main/ui/workspace/sidebar/options/menus/color_selection.cljs msgid "workspace.options.selection-color" @@ -5160,3 +5177,118 @@ msgstr "Perbarui" msgid "workspace.viewport.click-to-close-path" msgstr "Klik untuk menutup jalur" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "Masuk ke akun saya" + +msgid "media.image.short" +msgstr "gambar" + +msgid "media.keep-aspect-ratio" +msgstr "Jaga rasio aspek" + +msgid "modals.move-shared-confirm.title" +msgid_plural "modals.move-shared-confirm.title" +msgstr[0] "Pindahkan pustaka" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs +msgid "settings.select-this-color" +msgstr "Pilih item menggunakan gaya ini" + +msgid "shortcuts.toggle-layout-grid" +msgstr "Tambahkan/hapus tata letak kisi" + +msgid "shortcuts.toggle-rulers" +msgstr "Tampilkan / Sembunyikan penggaris" + +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "Penyedia autentikasi tidak diperbolehkan untuk profil ini" + +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "Domain tidak diperbolehkan" + +msgid "modals.move-shared-confirm.message" +msgid_plural "modals.move-shared-confirm.message" +msgstr[0] "Apakah Anda yakin ingin memindahkan pustaka ini?" + +msgid "shortcuts.toggle-guides" +msgstr "Tampilkan / Sembunyikan panduan" + +msgid "onboarding.team-modal.team-definition" +msgstr "Apa itu tim?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-one" +msgstr "Tidak ada" + +msgid "shortcuts.toggle-snap-guides" +msgstr "Pasang ke panduan" + +msgid "shortcuts.toggle-snap-ruler-guide" +msgstr "Pasang ke panduan penggaris" + +#: src/app/main/ui/workspace/sidebar/assets/common.cljs +msgid "workspace.assets.sidebar.components" +msgid_plural "workspace.assets.sidebar.components" +msgstr[0] "%s komponen" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-ruler-guides" +msgstr "Pasang ke panduan penggaris" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-guides" +msgstr "Sembunyikan panduan" + +msgid "workspace.layout_grid.editor.padding.expand" +msgstr "Tampilkan opsi bantalan 4 sisi" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-grid" +msgstr "Hapus tata letak kisi" + +msgid "shortcuts.scale" +msgstr "Skala" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-ruler-guides" +msgstr "Nonaktifkan pemasangan ke panduan penggaris" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-guides" +msgstr "Tampilkan panduan" + +msgid "workspace.top-bar.view-only" +msgstr "**Menginspeksi kode** (Hanya Lihat)" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.unlink-library-btn" +msgstr "Putuskan pustaka" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.filter" +msgstr "Penyaring" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "Urutkan" + +msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" +msgstr "Lokasi tata letak kisi" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.shared-library-btn" +msgstr "Hubungkan pustaka" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-tagline" +msgstr "" +"Penpot adalah peralatan desain bebas & bersumber terbuka untuk kolaborasi " +"Desain dan Kode" + +msgid "modals.move-shared-confirm.accept" +msgid_plural "modals.move-shared-confirm.accept" +msgstr[0] "Pindahkan" -- Gitee From a749519d8ef8b4c701e71e29782669e14d04b0e2 Mon Sep 17 00:00:00 2001 From: Stas Haas Date: Wed, 1 May 2024 10:07:41 +0200 Subject: [PATCH 0486/1266] :globe_with_meridians: Add translations for: German. Currently translated at 100.0% (1379 of 1379 strings) Co-authored-by: Stas Haas Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/ Translation: Penpot/frontend --- frontend/translations/de.po | 190 +++++++++++++++++++++--------------- 1 file changed, 109 insertions(+), 81 deletions(-) diff --git a/frontend/translations/de.po b/frontend/translations/de.po index a4736304a..124ef73e3 100644 --- a/frontend/translations/de.po +++ b/frontend/translations/de.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-25 13:07+0000\n" "Last-Translator: Stas Haas \n" -"Language-Team: German " -"\n" +"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -36,8 +36,8 @@ msgstr "Wollen Sie es einfach ausprobieren?" #: src/app/main/ui/auth/register.cljs msgid "auth.demo-warning" msgstr "" -"Das ist eine DEMO-VERSION, verwenden Sie es NICHT zum Arbeiten, die " -"Projekte werden regelmäßig gelöscht." +"Das ist eine DEMO-VERSION, verwenden Sie es NICHT zum Arbeiten, die Projekte " +"werden regelmäßig gelöscht." #: src/app/main/ui/auth/register.cljs, #: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs @@ -67,8 +67,8 @@ msgstr "Anmelden" #: src/app/main/ui/auth/login.cljs msgid "auth.login-tagline" msgstr "" -"Penpot ist das kostenlose Open-Source-Design-Tool für die Zusammenarbeit " -"von Design und Code" +"Penpot ist das kostenlose Open-Source-Design-Tool für die Zusammenarbeit von " +"Design und Code" #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs msgid "auth.login-with-github-submit" @@ -90,11 +90,23 @@ msgstr "LDAP" msgid "auth.login-with-oidc-submit" msgstr "OpenID" -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, +#: src/app/main/ui/dashboard/team_form.cljs, +#: src/app/main/ui/onboarding/team_choice.cljs, +#: src/app/main/ui/settings/access_tokens.cljs, +#: src/app/main/ui/settings/feedback.cljs, +#: src/app/main/ui/settings/profile.cljs, +#: src/app/main/ui/workspace/sidebar/assets.cljs msgid "auth.name.not-all-space" msgstr "Der Name darf keine Leerzeichen enthalten." -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +#: src/app/main/ui/auth/register.cljs, +#: src/app/main/ui/dashboard/team_form.cljs, +#: src/app/main/ui/onboarding/team_choice.cljs, +#: src/app/main/ui/settings/access_tokens.cljs, +#: src/app/main/ui/settings/feedback.cljs, +#: src/app/main/ui/settings/profile.cljs, +#: src/app/main/ui/workspace/sidebar/assets.cljs msgid "auth.name.too-long" msgstr "Der Name darf höchstens 250 Zeichen lang sein." @@ -118,7 +130,8 @@ msgstr "" #: src/app/main/ui/auth/recovery_request.cljs msgid "auth.notifications.recovery-token-sent" -msgstr "Der Link zur Wiederherstellung des Passworts wurde an Ihre E-Mail gesendet." +msgstr "" +"Der Link zur Wiederherstellung des Passworts wurde an Ihre E-Mail gesendet." #: src/app/main/ui/auth/verify_token.cljs msgid "auth.notifications.team-invitation-accepted" @@ -185,11 +198,10 @@ msgstr "" "und Datenschutzrichtlinien zu." #: src/app/main/ui/auth/register.cljs -#, markdown msgid "auth.terms-privacy-agreement-md" msgstr "" -"Wenn Sie ein neues Konto erstellen, stimmen Sie unseren " -"[Nutzungsbedingungen](%s) und [Datenschutzrichtlinien](%s) zu." +"Wenn Sie ein neues Konto erstellen, stimmen Sie unseren [Nutzungsbedingungen]" +"(%s) und [Datenschutzrichtlinien](%s) zu." #: src/app/main/ui/auth/register.cljs msgid "auth.verification-email-sent" @@ -287,7 +299,8 @@ msgstr "Praktisches Tutorial" #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.walkthrough-hero.info" -msgstr "Erkunden Sie Penpot um mehr über die wichtigsten Funktionen zu erfahren." +msgstr "" +"Erkunden Sie Penpot um mehr über die wichtigsten Funktionen zu erfahren." #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.walkthrough-hero.start" @@ -362,9 +375,9 @@ msgstr "Persönliche Zugangstoken" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.personal.description" msgstr "" -"Persönliche Zugangstoken stellen eine Alternative zu unserem " -"Login/Passwort-Authentifizierungssystem dar und können verwendet werden, um " -"einer Anwendung den Zugriff auf die interne Penpot-API zu ermöglichen" +"Persönliche Zugangstoken stellen eine Alternative zu unserem Login/Passwort-" +"Authentifizierungssystem dar und können verwendet werden, um einer Anwendung " +"den Zugriff auf die interne Penpot-API zu ermöglichen" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.token-will-expire" @@ -469,13 +482,12 @@ msgstr "* kann Komponenten, Grafiken, Farben und/oder Textstile enthalten." msgid "dashboard.export.explain" msgstr "" "Eine oder mehrere Dateien, die Sie exportieren möchten, verwenden geteilte " -"Bibliotheken. Was möchten Sie mit den Assets* aus diesen Bibliotheken " -"machen?" +"Bibliotheken. Was möchten Sie mit den Assets* aus diesen Bibliotheken machen?" msgid "dashboard.export.options.all.message" msgstr "" -"Dateien mit geteilten Bibliotheken werden exportiert, und ihre " -"Verknüpfungen bleiben erhalten." +"Dateien mit geteilten Bibliotheken werden exportiert, und ihre Verknüpfungen " +"bleiben erhalten." msgid "dashboard.export.options.all.title" msgstr "Geteilte Bibliotheken exportieren" @@ -520,18 +532,17 @@ msgstr[1] "%s Schriftarten hinzugefügt" msgid "dashboard.fonts.hero-text1" msgstr "" "Jede Webschriftart, die Sie hier hochladen, wird der Liste der Schriftarten " -"hinzugefügt, die in den Texteigenschaften der Dateien dieses Teams " -"verfügbar ist. Schriftarten mit dem gleichen Schriftfamilien-Namen werden " -"als **eine einzige Schriftfamilie** gruppiert. Sie können Schriftarten in " -"den folgenden Formaten hochladen: **TTF, OTF und WOFF** (nur eine wird " -"benötigt)." +"hinzugefügt, die in den Texteigenschaften der Dateien dieses Teams verfügbar " +"ist. Schriftarten mit dem gleichen Schriftfamilien-Namen werden als **eine " +"einzige Schriftfamilie** gruppiert. Sie können Schriftarten in den folgenden " +"Formaten hochladen: **TTF, OTF und WOFF** (nur eine wird benötigt)." msgid "dashboard.fonts.hero-text2" msgstr "" "Sie sollten nur Schriftarten hochladen, die Sie besitzen oder für die Sie " "eine Lizenz zur Verwendung in Penpot verfügen. Weitere Informationen finden " -"Sie im Abschnitt über Inhaltsrechte in den [Nutzungsbedingungen von " -"Penpot](https://penpot.app/terms.html). Mehr über die [Lizenzierung von " +"Sie im Abschnitt über Inhaltsrechte in den [Nutzungsbedingungen von Penpot]" +"(https://penpot.app/terms.html). Mehr über die [Lizenzierung von " "Schriftarten erfahren Sie hier](https://www.typography.com/faq)." #: src/app/main/ui/dashboard/fonts.cljs @@ -540,12 +551,12 @@ msgstr "Alle hochladen" msgid "dashboard.fonts.warning-text" msgstr "" -"Wir haben ein mögliches Problem in Ihren Schriften festgestellt, das mit " -"den vertikalen Metriken für verschiedene Betriebssysteme zusammenhängt. Um " -"dies zu überprüfen, können Sie Online-Dienste wie " -"[diesen](https://vertical-metrics.netlify.app/) verwenden. Außerdem " -"empfehlen wir die Verwendung von [Transfonter](https://transfonter.org/), " -"um Webfonts zu generieren und Fehler zu beheben. " +"Wir haben ein mögliches Problem in Ihren Schriften festgestellt, das mit den " +"vertikalen Metriken für verschiedene Betriebssysteme zusammenhängt. Um dies " +"zu überprüfen, können Sie Online-Dienste wie [diesen](https://vertical-" +"metrics.netlify.app/) verwenden. Außerdem empfehlen wir die Verwendung von " +"[Transfonter](https://transfonter.org/), um Webfonts zu generieren und " +"Fehler zu beheben. " msgid "dashboard.import" msgstr "Dateien importieren" @@ -560,8 +571,8 @@ msgstr "" msgid "dashboard.import.import-error" msgstr "" -"Beim Importieren der Datei ist ein Fehler aufgetreten. Die Datei wurde " -"nicht importiert." +"Beim Importieren der Datei ist ein Fehler aufgetreten. Die Datei wurde nicht " +"importiert." msgid "dashboard.import.import-message" msgstr "%s Dateien wurden erfolgreich importiert." @@ -799,7 +810,8 @@ msgid "dashboard.webhooks.active" msgstr "Aktiv" msgid "dashboard.webhooks.active.explain" -msgstr "Wenn dieser Hook ausgelöst wird, dann werden die Eventdetails übermittelt" +msgstr "" +"Wenn dieser Hook ausgelöst wird, dann werden die Eventdetails übermittelt" msgid "dashboard.webhooks.content-type" msgstr "Inhaltstyp" @@ -880,7 +892,8 @@ msgid "errors.auth-provider-not-configured" msgstr "Authentifizierungsanbieter ist nicht konfiguriert." msgid "errors.auth.unable-to-login" -msgstr "Anscheinend sind Sie nicht authentifiziert oder die Sitzung ist abgelaufen." +msgstr "" +"Anscheinend sind Sie nicht authentifiziert oder die Sitzung ist abgelaufen." msgid "errors.bad-font" msgstr "Die Schriftart %s konnte nicht geladen werden" @@ -916,7 +929,8 @@ msgstr "Domain nicht zulässig" #: src/app/main/ui/settings/change_email.cljs, #: src/app/main/ui/dashboard/team.cljs msgid "errors.email-has-permanent-bounces" -msgstr "Die E-Mail-Adresse «%s» hat viele permanente Unzustellbarkeitsberichte." +msgstr "" +"Die E-Mail-Adresse «%s» hat viele permanente Unzustellbarkeitsberichte." #: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, #: src/app/main/ui/auth/recovery_request.cljs @@ -944,8 +958,8 @@ msgstr "Die Funktion '%s' wird nicht unterstützt." #: src/app/main/errors.cljs msgid "errors.file-feature-mismatch" msgstr "" -"Es scheint eine Nichtübereinstimmung zwischen den aktivierten Funktionen " -"und den Funktionen der Datei zu geben. Die Migrationen für '%s' müssen " +"Es scheint eine Nichtübereinstimmung zwischen den aktivierten Funktionen und " +"den Funktionen der Datei zu geben. Die Migrationen für '%s' müssen " "durchgeführt werden, bevor die Datei geöffnet werden kann." #: src/app/main/ui/auth/verify_token.cljs, @@ -979,8 +993,7 @@ msgstr "Das Bild ist zu groß, um eingefügt zu werden." #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "errors.media-type-mismatch" msgstr "" -"Es scheint, dass der Bildinhalt nicht mit der Dateierweiterung " -"übereinstimmt." +"Es scheint, dass der Bildinhalt nicht mit der Dateierweiterung übereinstimmt." #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "errors.media-type-not-allowed" @@ -989,8 +1002,8 @@ msgstr "Es scheint, dass dies kein gültiges Bild ist." #: src/app/main/ui/dashboard/team.cljs msgid "errors.member-is-muted" msgstr "" -"In dem von Ihnen eingeladenen Profil sind E-Mails stummgeschaltet " -"(Spam-Berichte oder hohe Unzustellbarkeitsberichte)." +"In dem von Ihnen eingeladenen Profil sind E-Mails stummgeschaltet (Spam-" +"Berichte oder hohe Unzustellbarkeitsberichte)." #: src/app/main/ui/settings/password.cljs msgid "errors.password-invalid-confirmation" @@ -1032,8 +1045,8 @@ msgstr "Das Mitglied, das Sie zuzuordnen möchten, existiert nicht." msgid "errors.team-leave.owner-cant-leave" msgstr "" -"Der Besitzer kann das Team nicht verlassen, Sie müssen die Besitzerrolle " -"neu zuweisen." +"Der Besitzer kann das Team nicht verlassen, Sie müssen die Besitzerrolle neu " +"zuweisen." #: src/app/main/data/media.cljs, #: src/app/main/ui/workspace/sidebar/options/menus/exports.cljs, @@ -1106,8 +1119,8 @@ msgstr "Betreff" #: src/app/main/ui/settings/feedback.cljs msgid "feedback.subtitle" msgstr "" -"Bitte beschreiben Sie den Grund Ihrer E-Mail und geben Sie an, ob es sich " -"um ein Problem, eine Idee oder einem Bedenken handelt. Ein Mitglied unseres " +"Bitte beschreiben Sie den Grund Ihrer E-Mail und geben Sie an, ob es sich um " +"ein Problem, eine Idee oder einem Bedenken handelt. Ein Mitglied unseres " "Teams wird Ihnen so schnell wie möglich antworten." #: src/app/main/ui/settings/feedback.cljs @@ -1294,16 +1307,16 @@ msgstr "Großbuchstaben" msgid "inspect.empty.help" msgstr "" -"Für weitere Informationen zum Thema \"Auswerten von " -"Design-Spezifikationen\", besuchen Sie bitte das Penpot-Hilfezentrum" +"Für weitere Informationen zum Thema \"Auswerten von Design-" +"Spezifikationen\", besuchen Sie bitte das Penpot-Hilfezentrum" msgid "inspect.empty.more-info" msgstr "Weitere Informationen zur Inspektion" msgid "inspect.empty.select" msgstr "" -"Wählen Sie eine Form, ein Board oder eine Gruppe aus, um deren " -"Eigenschaften und Code zu überprüfen" +"Wählen Sie eine Form, ein Board oder eine Gruppe aus, um deren Eigenschaften " +"und Code zu überprüfen" #: src/app/main/ui/inspect/right_sidebar.cljs msgid "inspect.tabs.code" @@ -2030,13 +2043,15 @@ msgid_plural "modals.delete-shared-confirm.accept" msgstr[0] "Datei löschen" msgstr[1] "Dateien löschen" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +#: src/app/main/ui/workspace/header.cljs, +#: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-shared-confirm.activated.no-files-message" msgid_plural "modals.delete-shared-confirm.activated.no-files-message" msgstr[0] "Es ist in keiner Datei aktiviert." msgstr[1] "Sie sind in keiner Datei aktiviert." -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +#: src/app/main/ui/workspace/header.cljs, +#: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-shared-confirm.activated.scd-message" msgid_plural "modals.delete-shared-confirm.activated.scd-message" msgstr[0] "Diese Bibliothek ist hier aktiviert: " @@ -2076,13 +2091,15 @@ msgstr "Mitglied löschen" #: src/app/main/ui/dashboard/team.cljs msgid "modals.delete-team-member-confirm.message" -msgstr "Sind Sie sicher, dass Sie dieses Mitglied aus dem Team löschen möchten?" +msgstr "" +"Sind Sie sicher, dass Sie dieses Mitglied aus dem Team löschen möchten?" #: src/app/main/ui/dashboard/team.cljs msgid "modals.delete-team-member-confirm.title" msgstr "Teammitglied löschen" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +#: src/app/main/ui/workspace/header.cljs, +#: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-unpublish-shared-confirm.activated.hint" msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" msgstr[0] "" @@ -2135,8 +2152,8 @@ msgstr "Sind Sie sicher, dass Sie das %s-Team verlassen wollen?" msgid "modals.leave-and-reassign.forbidden" msgstr "" -"Sie können das Team nicht verlassen, wenn es kein anderes Mitglied gibt, " -"das Sie zum Besitzer ernennen können. Sie können das Team jedoch löschen." +"Sie können das Team nicht verlassen, wenn es kein anderes Mitglied gibt, das " +"Sie zum Besitzer ernennen können. Sie können das Team jedoch löschen." #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.leave-and-reassign.hint1" @@ -2192,12 +2209,13 @@ msgstr "Befördern" #: src/app/main/ui/dashboard/team.cljs msgid "modals.promote-owner-confirm.hint" msgstr "" -"Wenn Sie die Eigentümerschaft übertragen, ändern Sie Ihre Rolle in Admin " -"und verlieren einige Berechtigungen für dieses Team. " +"Wenn Sie die Eigentümerschaft übertragen, ändern Sie Ihre Rolle in Admin und " +"verlieren einige Berechtigungen für dieses Team. " #: src/app/main/ui/dashboard/team.cljs msgid "modals.promote-owner-confirm.message" -msgstr "Sind Sie sicher, dass Sie diesen Benutzer zum Eigentümer befördern wollen?" +msgstr "" +"Sind Sie sicher, dass Sie diesen Benutzer zum Eigentümer befördern wollen?" #: src/app/main/ui/dashboard/team.cljs msgid "modals.promote-owner-confirm.title" @@ -2223,9 +2241,8 @@ msgstr "Als gemeinsam genutzte Bibliothek entfernen" #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.remove-shared-confirm.hint" msgstr "" -"Sobald Sie diese Datai aus den geteilten Bibliotheken entfernen, steht " -"Ihnen die Bibliothek dieser Datei nicht mehr in anderen Dateien zur " -"Verfügung." +"Sobald Sie diese Datai aus den geteilten Bibliotheken entfernen, steht Ihnen " +"die Bibliothek dieser Datei nicht mehr in anderen Dateien zur Verfügung." #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs @@ -2247,8 +2264,10 @@ msgstr[1] "Veröffentlichung aufheben" #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.message" msgid_plural "modals.unpublish-shared-confirm.message" -msgstr[0] "Möchten Sie die Veröffentlichung dieser Bibliothek wirklich aufheben?" -msgstr[1] "Möchten Sie die Veröffentlichung dieser Bibliotheken wirklich aufheben?" +msgstr[0] "" +"Möchten Sie die Veröffentlichung dieser Bibliothek wirklich aufheben?" +msgstr[1] "" +"Möchten Sie die Veröffentlichung dieser Bibliotheken wirklich aufheben?" #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs @@ -2308,8 +2327,8 @@ msgstr "Einladungslink kopiert" #: src/app/main/ui/settings/delete_account.cljs msgid "notifications.profile-deletion-not-allowed" msgstr "" -"Sie können Ihr Profil nicht löschen. Weisen Sie Ihre Teams neu zu, bevor " -"Sie fortfahren." +"Sie können Ihr Profil nicht löschen. Weisen Sie Ihre Teams neu zu, bevor Sie " +"fortfahren." #: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs msgid "notifications.profile-saved" @@ -2321,9 +2340,8 @@ msgstr "Verifizierungs-E-Mail an %s gesendet. Prüfen Sie Ihren Posteingang!" msgid "onboarding-v2.before-start.desc1" msgstr "" -"Sie sollten wissen, dass es viele Ressourcen gibt, die Ihnen den Einstieg " -"in Penpot erleichtern, wie z. B. das Benutzerhandbuch und unseren " -"Youtube-Kanal." +"Sie sollten wissen, dass es viele Ressourcen gibt, die Ihnen den Einstieg in " +"Penpot erleichtern, wie z. B. das Benutzerhandbuch und unseren Youtube-Kanal." msgid "onboarding-v2.before-start.desc2" msgstr "" @@ -2383,8 +2401,8 @@ msgstr "Mitwirkung in der Community" msgid "onboarding-v2.welcome.desc3" msgstr "" -"Hier erfahren Sie, wie Sie bei Übersetzungen, Feature Requests, " -"Core-Entwicklung und der Fehlersuche helfen können…" +"Hier erfahren Sie, wie Sie bei Übersetzungen, Feature Requests, Core-" +"Entwicklung und der Fehlersuche helfen können…" msgid "onboarding-v2.welcome.desc3.title" msgstr "Leitfaden für Mitwirkende" @@ -2455,8 +2473,8 @@ msgstr "Ein Team erstellen" msgid "onboarding.team-modal.create-team-desc" msgstr "" -"In einem Team können Sie mit anderen Penpot-Nutzern zusammenarbeiten, die " -"an denselben Dateien und Projekten arbeiten." +"In einem Team können Sie mit anderen Penpot-Nutzern zusammenarbeiten, die an " +"denselben Dateien und Projekten arbeiten." msgid "onboarding.team-modal.create-team-feature-1" msgstr "Unbegrenzte Anzahl von Dateien und Projekten" @@ -2519,7 +2537,8 @@ msgstr "Canva" #: src/app/main/ui/onboarding/questions.cljs msgid "questions.describe-your-experience-working-on" -msgstr "Wie würden Sie Ihre Erfahrungen bei der Arbeit an … am besten beschreiben?" +msgstr "" +"Wie würden Sie Ihre Erfahrungen bei der Arbeit an … am besten beschreiben?" #: src/app/main/ui/onboarding/questions.cljs msgid "questions.designer" @@ -3357,8 +3376,8 @@ msgstr "Gruppe erstellen" #: src/app/main/ui/workspace/sidebar/assets.cljs msgid "workspace.assets.create-group-hint" msgstr "" -"Ihre Elemente werden automatisch nach diesem Schema benannt: \"Gruppenname " -"/ Elementname\"" +"Ihre Elemente werden automatisch nach diesem Schema benannt: \"Gruppenname / " +"Elementname\"" #: src/app/main/ui/workspace/sidebar/sitemap.cljs, #: src/app/main/ui/workspace/sidebar/assets.cljs, @@ -3815,8 +3834,7 @@ msgstr "Laden…" #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-libraries-need-sync" msgstr "" -"Es gibt keine gemeinsam genutzte Bibliotheken, die aktualisiert werden " -"müssen" +"Es gibt keine gemeinsam genutzte Bibliotheken, die aktualisiert werden müssen" #: src/app/main/ui/workspace/libraries.cljs msgid "workspace.libraries.no-matches-for" @@ -5192,7 +5210,6 @@ msgstr "Typografien (%s)" msgid "workspace.top-bar.read-only.done" msgstr "Fertig" -#, markdown msgid "workspace.top-bar.view-only" msgstr "**Code inspizieren** (nur ansehen)" @@ -5329,3 +5346,14 @@ msgstr "Aktualisieren" msgid "workspace.viewport.click-to-close-path" msgstr "Klicken Sie, um den Pfad zu schließen" + +msgid "shortcuts.toggle-snap-ruler-guide" +msgstr "An den Hilfslinien des Lineals ausrichten" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-ruler-guides" +msgstr "An den Hilfslinien des Lineals ausrichten deaktivieren" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-ruler-guides" +msgstr "An den Hilfslinien des Lineals ausrichten" -- Gitee From cd03794a093a955b490630cd88526f7dfb424eb6 Mon Sep 17 00:00:00 2001 From: Yaron Shahrabani Date: Wed, 1 May 2024 10:07:42 +0200 Subject: [PATCH 0487/1266] :globe_with_meridians: Add translations for: Hebrew. Currently translated at 100.0% (1379 of 1379 strings) Co-authored-by: Yaron Shahrabani Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/ Translation: Penpot/frontend --- frontend/translations/he.po | 168 +++++++++++++++++++++++++++--------- 1 file changed, 126 insertions(+), 42 deletions(-) diff --git a/frontend/translations/he.po b/frontend/translations/he.po index ba1ffe02e..28143f0cb 100644 --- a/frontend/translations/he.po +++ b/frontend/translations/he.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-25 13:07+0000\n" "Last-Translator: Yaron Shahrabani \n" -"Language-Team: Hebrew " -"\n" +"Language-Team: Hebrew \n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -18,7 +18,8 @@ msgstr "כבר יש לך חשבון?" #: src/app/main/ui/auth/register.cljs msgid "auth.check-your-email" -msgstr "נא לחפש בדוא״ל הנכנס שלך וללחוץ על הקישור כדי לאמת ולהתחיל להשתמש ב־Penpot." +msgstr "" +"נא לחפש בדוא״ל הנכנס שלך וללחוץ על הקישור כדי לאמת ולהתחיל להשתמש ב־Penpot." #: src/app/main/ui/auth/recovery.cljs msgid "auth.confirm-password" @@ -34,7 +35,8 @@ msgstr "מעניין אותך רק להתנסות?" #: src/app/main/ui/auth/register.cljs msgid "auth.demo-warning" -msgstr "זה שירות ניסיוני, לא להשתמש בו לעבודה אמתית, המיזמים יימחקו מדי פעם בפעם." +msgstr "" +"זה שירות ניסיוני, לא להשתמש בו לעבודה אמתית, המיזמים יימחקו מדי פעם בפעם." #: src/app/main/ui/auth/register.cljs, #: src/app/main/ui/auth/recovery_request.cljs, src/app/main/ui/auth/login.cljs @@ -85,11 +87,23 @@ msgstr "LDAP" msgid "auth.login-with-oidc-submit" msgstr "‎OpenID Connect" -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, +#: src/app/main/ui/dashboard/team_form.cljs, +#: src/app/main/ui/onboarding/team_choice.cljs, +#: src/app/main/ui/settings/access_tokens.cljs, +#: src/app/main/ui/settings/feedback.cljs, +#: src/app/main/ui/settings/profile.cljs, +#: src/app/main/ui/workspace/sidebar/assets.cljs msgid "auth.name.not-all-space" msgstr "השם חייב להכיל תווים שאינם רווחים." -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +#: src/app/main/ui/auth/register.cljs, +#: src/app/main/ui/dashboard/team_form.cljs, +#: src/app/main/ui/onboarding/team_choice.cljs, +#: src/app/main/ui/settings/access_tokens.cljs, +#: src/app/main/ui/settings/feedback.cljs, +#: src/app/main/ui/settings/profile.cljs, +#: src/app/main/ui/workspace/sidebar/assets.cljs msgid "auth.name.too-long" msgstr "השם חייב להכיל 250 תווים לכל היותר." @@ -176,7 +190,6 @@ msgid "auth.terms-privacy-agreement" msgstr "יצירת חשבון חדש מהווה את הסכמתך לתנאי השירות ולמדיניות הפרטיות." #: src/app/main/ui/auth/register.cljs -#, markdown msgid "auth.terms-privacy-agreement-md" msgstr "" "עצם יצירת חשבון חדש מהווה הסכמה ל[תנאי השירות](%s) ול[מדיניות הפרטיות](%s) " @@ -254,7 +267,8 @@ msgstr "ניהול צוות" #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.team-hero.text" -msgstr "Penpot מיועד לצוותים. אפשר להזמין חברים כדי לעבוד ביחד על מיזמים וקבצים" +msgstr "" +"Penpot מיועד לצוותים. אפשר להזמין חברים כדי לעבוד ביחד על מיזמים וקבצים" #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.team-hero.title" @@ -427,7 +441,8 @@ msgstr "ייצוא" #: src/app/main/ui/export.cljs msgid "dashboard.export-shapes.how-to" -msgstr "אפשר להוסיף הגדרות ייצוא לרכיבים ממאפייני העיצוב (מתחתית הסרגל שמשמאל)." +msgstr "" +"אפשר להוסיף הגדרות ייצוא לרכיבים ממאפייני העיצוב (מתחתית הסרגל שמשמאל)." #: src/app/main/ui/export.cljs msgid "dashboard.export-shapes.how-to-link" @@ -493,17 +508,17 @@ msgstr[3] "נוספו %s גופנים" msgid "dashboard.fonts.hero-text1" msgstr "" -"כל גופן דפדפן שיועלה כאן יתווסף לרשימת משפחת הגופנים שזמין במאפייני הטקסט " -"של הקבצים של הצוות הזה. גופנים מאותו שם של משפחת גופנים יקובצו תחת **משפחת " +"כל גופן דפדפן שיועלה כאן יתווסף לרשימת משפחת הגופנים שזמין במאפייני הטקסט של " +"הקבצים של הצוות הזה. גופנים מאותו שם של משפחת גופנים יקובצו תחת **משפחת " "גופנים יחידה**. ניתן להעלות גופנים מהסוגים הבאים: **TTF,‏ OTF ו־WOFF** (אחד " "הסוגים יספיק)." msgid "dashboard.fonts.hero-text2" msgstr "" "עליך להעלות גופנים בבעלותך או שיש לך רישיון להשתמש בהם ב־Penpot. ניתן למצוא " -"על כך מידע נוסף בסעיף זכויות התוכן של [תנאי השירות של " -"Penpot](https://penpot.app/terms.html). אפשר גם לקרוא גם על [רישוי " -"גופנים](https://www.typography.com/faq)." +"על כך מידע נוסף בסעיף זכויות התוכן של [תנאי השירות של Penpot](https://penpot." +"app/terms.html). אפשר גם לקרוא גם על [רישוי גופנים](https://www.typography." +"com/faq)." #: src/app/main/ui/dashboard/fonts.cljs msgid "dashboard.fonts.upload-all" @@ -512,9 +527,9 @@ msgstr "להעלות הכול" msgid "dashboard.fonts.warning-text" msgstr "" "זיהינו בעיה אפשרית בגודפים שלך ביחס למדדים אנכיים למערכת הפעלה שונות. כדי " -"לבדוק את זה אפשר להשתמש בשירות מדידות אנכיות של גופנים כגון " -"[זה]](https://vertical-metrics.netlify.app/). בנוסף, המלצתנו היא להשתמש " -"ב־[Transfonter](https://transfonter.org/) כדי לייצר גופני רשת ולתקן שגיאות. " +"לבדוק את זה אפשר להשתמש בשירות מדידות אנכיות של גופנים כגון [זה]](https://" +"vertical-metrics.netlify.app/). בנוסף, המלצתנו היא להשתמש ב־[Transfonter]" +"(https://transfonter.org/) כדי לייצר גופני רשת ולתקן שגיאות. " msgid "dashboard.import" msgstr "ייבוא קובצי Penpot" @@ -901,8 +916,8 @@ msgstr "כתובת הדוא״ל „%s” דווחה כספאם או שההודע #: src/app/main/errors.cljs msgid "errors.feature-mismatch" msgstr "" -"נראה שניסית לפתוח קובץ בו פעילה היכולת ‚%s’ אבל מנשק ה־Penpot שלך לא תומך " -"בה או שהיא מושבתת." +"נראה שניסית לפתוח קובץ בו פעילה היכולת ‚%s’ אבל מנשק ה־Penpot שלך לא תומך בה " +"או שהיא מושבתת." #: src/app/main/errors.cljs msgid "errors.feature-not-supported" @@ -952,7 +967,8 @@ msgstr "נראה כי זאת תמונה שגויה." #: src/app/main/ui/dashboard/team.cljs msgid "errors.member-is-muted" -msgstr "הודעות הדוא״ל לפרופיל שהזמנת מושתקות (דיווחים על דואר זבל או הרבה החזרות)." +msgstr "" +"הודעות הדוא״ל לפרופיל שהזמנת מושתקות (דיווחים על דואר זבל או הרבה החזרות)." #: src/app/main/ui/settings/password.cljs msgid "errors.password-invalid-confirmation" @@ -1287,7 +1303,7 @@ msgid "inspect.tabs.code.selected.path" msgstr "נתיב" msgid "inspect.tabs.code.selected.rect" -msgstr "ריבוע" +msgstr "מרובע" msgid "inspect.tabs.code.selected.svg-raw" msgstr "SVG" @@ -1963,7 +1979,8 @@ msgstr[1] "מחיקת קבצים" msgstr[2] "מחיקת קבצים" msgstr[3] "מחיקת קבצים" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +#: src/app/main/ui/workspace/header.cljs, +#: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-shared-confirm.activated.no-files-message" msgid_plural "modals.delete-shared-confirm.activated.no-files-message" msgstr[0] "לא מופעל באף קובץ." @@ -1971,7 +1988,8 @@ msgstr[1] "לא מופעלים באף קובץ." msgstr[2] "לא מופעלים באף קובץ." msgstr[3] "לא מופעלים באף קובץ." -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +#: src/app/main/ui/workspace/header.cljs, +#: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-shared-confirm.activated.scd-message" msgid_plural "modals.delete-shared-confirm.activated.scd-message" msgstr[0] "הספרייה הזאת מופעלת כאן: " @@ -2021,13 +2039,17 @@ msgstr "למחוק את החבר הזה מהצוות?" msgid "modals.delete-team-member-confirm.title" msgstr "למחוק חבר בצוות" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +#: src/app/main/ui/workspace/header.cljs, +#: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-unpublish-shared-confirm.activated.hint" msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" msgstr[0] "נכסים שכבר נעשה בהם שימוש בקובץ הזה יישארו שם (אף עיצוב לא ייפגע)." -msgstr[1] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." -msgstr[2] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." -msgstr[3] "נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." +msgstr[1] "" +"נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." +msgstr[2] "" +"נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." +msgstr[3] "" +"נכסים שכבר נעשה בהם שימוש בקבצים האלה יישארו שם (אף עיצוב לא ייפגע)." msgid "modals.delete-webhook.accept" msgstr "מחיקת התליה" @@ -2060,7 +2082,8 @@ msgstr "הזמנת חברים לצוות" #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.leave-and-close-confirm.hint" -msgstr "כיוון שאין עוד חברים בצוות הזה מלבדך, הצוות יימחק על כל המיזמים והקבצים שלו." +msgstr "" +"כיוון שאין עוד חברים בצוות הזה מלבדך, הצוות יימחק על כל המיזמים והקבצים שלו." #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.leave-and-close-confirm.message" @@ -2073,7 +2096,8 @@ msgstr "" #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.leave-and-reassign.hint1" -msgstr "הבעלות על הצוות הזה בידיך. נא לבחור מישהו כדי לקידום לבעלות בטרם עזיבתך." +msgstr "" +"הבעלות על הצוות הזה בידיך. נא לבחור מישהו כדי לקידום לבעלות בטרם עזיבתך." #: src/app/main/ui/dashboard/sidebar.cljs msgid "modals.leave-and-reassign.promote-and-leave" @@ -2153,8 +2177,8 @@ msgstr "הסרה כספריה משותפת" #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.remove-shared-confirm.hint" msgstr "" -"לאחר הסרה כספריה משותפת, ספריית הקבצים של הקובץ הזה לא תהיה זמינה עוד " -"לשימוש בקרב שאר הקבצים שלך." +"לאחר הסרה כספריה משותפת, ספריית הקבצים של הקובץ הזה לא תהיה זמינה עוד לשימוש " +"בקרב שאר הקבצים שלך." #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs @@ -2196,8 +2220,7 @@ msgstr[3] "ביטול פרסום ספריות" #: src/app/main/ui/workspace/context_menu.cljs msgid "modals.update-remote-component-in-bulk.hint" msgstr "" -"פעולה זו תעדכן רכיבים בספרייה משותפת. עשוי להשפיע על קבצים אחרים שמשתמשים " -"בה." +"פעולה זו תעדכן רכיבים בספרייה משותפת. עשוי להשפיע על קבצים אחרים שמשתמשים בה." #: src/app/main/ui/workspace/sidebar/options/menus/component.cljs, #: src/app/main/ui/workspace/context_menu.cljs @@ -2241,8 +2264,7 @@ msgstr "קישור ההזמנה הועתק" #: src/app/main/ui/settings/delete_account.cljs msgid "notifications.profile-deletion-not-allowed" msgstr "" -"אי אפשר למחוק את הפרופיל שלך. יש להקצות את הצוותים שלך מחדש בטרם המשך " -"בתהליך." +"אי אפשר למחוק את הפרופיל שלך. יש להקצות את הצוותים שלך מחדש בטרם המשך בתהליך." #: src/app/main/ui/settings/profile.cljs, src/app/main/ui/settings/options.cljs msgid "notifications.profile-saved" @@ -2254,11 +2276,12 @@ msgstr "הודעת האימות נשלחה בדוא״ל אל %s. נא לבדוק msgid "onboarding-v2.before-start.desc1" msgstr "" -"רצוי לדעת שיש מגוון משאבים זמינים לך כדי לסייע לך להתחיל להשתמש ב־Penpot " -"כמו המדריך למשתמשים וערוץ ה־YouTube שלנו." +"רצוי לדעת שיש מגוון משאבים זמינים לך כדי לסייע לך להתחיל להשתמש ב־Penpot כמו " +"המדריך למשתמשים וערוץ ה־YouTube שלנו." msgid "onboarding-v2.before-start.desc2" -msgstr "מידע מפורט על אופן השימוש ב־Penpot. החל מתכנון אבטיפוס ועד שיתוף עיצובים." +msgstr "" +"מידע מפורט על אופן השימוש ב־Penpot. החל מתכנון אבטיפוס ועד שיתוף עיצובים." msgid "onboarding-v2.before-start.desc2.title" msgstr "מדריך למשתמשים" @@ -2760,7 +2783,7 @@ msgid "shortcuts.draw-path" msgstr "נתיב" msgid "shortcuts.draw-rect" -msgstr "ריבוע" +msgstr "מרובע" msgid "shortcuts.draw-text" msgstr "טקסט" @@ -3167,8 +3190,7 @@ msgstr "%s‏ - Penpot" msgid "viewer.breaking-change.description" msgstr "" -"קישור זה לשיתוף אינו תקף עוד. נא ליצור אחד חדש או לבקש מהבעלים ליצור אחד " -"חדש." +"קישור זה לשיתוף אינו תקף עוד. נא ליצור אחד חדש או לבקש מהבעלים ליצור אחד חדש." msgid "viewer.breaking-change.message" msgstr "מתנצלים!" @@ -5169,7 +5191,7 @@ msgid "workspace.undo.entry.single.path" msgstr "נתיב" msgid "workspace.undo.entry.single.rect" -msgstr "ריבוע" +msgstr "מרובע" msgid "workspace.undo.entry.single.shape" msgstr "צורה" @@ -5206,3 +5228,65 @@ msgstr "עדכון" msgid "workspace.viewport.click-to-close-path" msgstr "לחיצה תסגור את הנתיב" + +msgid "media.image.short" +msgstr "תמונה" + +msgid "media.keep-aspect-ratio" +msgstr "שמירה על יחס גובה־רוחב" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.filter" +msgstr "סינון" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-ruler-guides" +msgstr "השבתת הצמדה לקווים מנחים סרגלים" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-ruler-guides" +msgstr "הצמדה לקווים מנחים סרגלים" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-guides" +msgstr "הסתרת קווים מנחים" + +msgid "workspace.layout_grid.editor.padding.expand" +msgstr "הצגת אפשרויות ריפוד עם 4 צדדים" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.unlink-library-btn" +msgstr "ניתוק ספרייה" + +msgid "workspace.top-bar.view-only" +msgstr "**חקירת קוד** (צפייה בלבד)" + +msgid "modals.move-shared-confirm.accept" +msgid_plural "modals.move-shared-confirm.accept" +msgstr[0] "העברה" +msgstr[1] "העברה" +msgstr[2] "העברה" +msgstr[3] "העברה" + +#: src/app/main/ui/workspace/sidebar/assets/common.cljs +msgid "workspace.assets.sidebar.components" +msgid_plural "workspace.assets.sidebar.components" +msgstr[0] "רכיב" +msgstr[1] "שני רכיבים" +msgstr[2] "%s רכיבים" +msgstr[3] "%s רכיבים" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-guides" +msgstr "הצגת קווים מנחים" + +msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" +msgstr "איתור פריסת הרשת" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.shared-library-btn" +msgstr "חיבור ספרייה" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-grid" +msgstr "הסרת פריסת רשת" -- Gitee From 43dd4ce45743aecb3d564e60b1828d927dbbaa08 Mon Sep 17 00:00:00 2001 From: TheScientistPT Date: Wed, 1 May 2024 10:07:43 +0200 Subject: [PATCH 0488/1266] :globe_with_meridians: Add translations for: Portuguese (Portugal). Currently translated at 98.5% (1359 of 1379 strings) Co-authored-by: TheScientistPT Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/ Translation: Penpot/frontend --- frontend/translations/pt_PT.po | 200 +++++++++++++++++++++++---------- 1 file changed, 140 insertions(+), 60 deletions(-) diff --git a/frontend/translations/pt_PT.po b/frontend/translations/pt_PT.po index b7c914757..7e7711f6a 100644 --- a/frontend/translations/pt_PT.po +++ b/frontend/translations/pt_PT.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "PO-Revision-Date: 2024-04-24 12:55+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Portuguese (Portugal) " -"\n" +"Language-Team: Portuguese (Portugal) \n" "Language: pt_PT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -80,11 +80,23 @@ msgstr "LDAP" msgid "auth.login-with-oidc-submit" msgstr "OpenID Connect" -#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, +#: src/app/main/ui/dashboard/team_form.cljs, +#: src/app/main/ui/onboarding/team_choice.cljs, +#: src/app/main/ui/settings/access_tokens.cljs, +#: src/app/main/ui/settings/feedback.cljs, +#: src/app/main/ui/settings/profile.cljs, +#: src/app/main/ui/workspace/sidebar/assets.cljs msgid "auth.name.not-all-space" msgstr "O nome deve conter pelo menos um caractere que não seja um espaço." -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +#: src/app/main/ui/auth/register.cljs, +#: src/app/main/ui/dashboard/team_form.cljs, +#: src/app/main/ui/onboarding/team_choice.cljs, +#: src/app/main/ui/settings/access_tokens.cljs, +#: src/app/main/ui/settings/feedback.cljs, +#: src/app/main/ui/settings/profile.cljs, +#: src/app/main/ui/workspace/sidebar/assets.cljs msgid "auth.name.too-long" msgstr "O nome deve conter um máximo de 250 caracteres." @@ -122,7 +134,8 @@ msgstr "Mínimo de 8 caracteres" #: src/app/main/ui/auth/register.cljs msgid "auth.password-not-empty" -msgstr "A palavra-passe deve conter pelo menos um caractere que não seja um espaço." +msgstr "" +"A palavra-passe deve conter pelo menos um caractere que não seja um espaço." msgid "auth.privacy-policy" msgstr "Política de privacidade" @@ -173,7 +186,6 @@ msgstr "" "política de privacidade." #: src/app/main/ui/auth/register.cljs -#, markdown msgid "auth.terms-privacy-agreement-md" msgstr "" "Ao criar uma nova conta, concordas com os nossos [termos de serviço](%s) e " @@ -195,8 +207,8 @@ msgstr "Todos os utilizadores Penpot" msgid "common.share-link.confirm-deletion-link-description" msgstr "" -"Tens a certeza de que queres remover este link? Se o fizeres, deixa de " -"ficar disponível para ninguém" +"Tens a certeza de que queres remover este link? Se o fizeres, deixa de ficar " +"disponível para ninguém" msgid "common.share-link.current-tag" msgstr "(atual)" @@ -252,8 +264,8 @@ msgstr "Gestão da equipa" #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.team-hero.text" msgstr "" -"O Penpot é destinado a equipas. Convida colegas para colaborarem em " -"projetos e ficheiros" +"O Penpot é destinado a equipas. Convida colegas para colaborarem em projetos " +"e ficheiros" #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.team-hero.title" @@ -261,7 +273,8 @@ msgstr "Trabalho de equipa!" #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.tutorial-hero.info" -msgstr "Aprende os básicos no Penpot enquanto divertes-te a praticar neste tutorial." +msgstr "" +"Aprende os básicos no Penpot enquanto divertes-te a praticar neste tutorial." #: src/app/main/ui/dashboard/projects.cljs msgid "dasboard.tutorial-hero.start" @@ -346,9 +359,9 @@ msgstr "Tokens de acesso pessoais" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.personal.description" msgstr "" -"Os tokens de acesso pessoais funcionam como uma alternativa ao nosso " -"sistema de autenticação de login/palavra-passe e podem ser usados para " -"permitir que uma aplicação tenha acesso à API interna do Penpot" +"Os tokens de acesso pessoais funcionam como uma alternativa ao nosso sistema " +"de autenticação de login/palavra-passe e podem ser usados para permitir que " +"uma aplicação tenha acesso à API interna do Penpot" #: src/app/main/ui/settings/access-tokens.cljs msgid "dashboard.access-tokens.token-will-expire" @@ -402,8 +415,8 @@ msgstr "Duplicar %s ficheiros" msgid "dashboard.empty-placeholder-drafts" msgstr "" "Os ficheiros adicionados às Bibliotecas irão aparecer aqui. Experimenta " -"adicionar os teus ficheiros ou experimenta algumas das nossas [Bibliotecas " -"e templates](https://penpot.app/libraries-templates.html)." +"adicionar os teus ficheiros ou experimenta algumas das nossas [Bibliotecas e " +"templates](https://penpot.app/libraries-templates.html)." msgid "dashboard.export-binary-multi" msgstr "Descarrega %s ficheiros Penpot (.penpot)" @@ -508,16 +521,15 @@ msgstr "" msgid "dashboard.fonts.hero-text2" msgstr "" -"Deves carregar tipos de letra que possuas or tenhas licença para utilizar " -"no Penpot. Sabe mais na secção de Direitos de Conteúdos dos [Termos de " -"serviço do Penpot](https://penpot.app/terms.html). Podes também ler mais " -"sobre [licenciamento de fontes](https://www.typography.com/faq)." +"Deves carregar tipos de letra que possuas or tenhas licença para utilizar no " +"Penpot. Sabe mais na secção de Direitos de Conteúdos dos [Termos de serviço " +"do Penpot](https://penpot.app/terms.html). Podes também ler mais sobre " +"[licenciamento de fontes](https://www.typography.com/faq)." #: src/app/main/ui/dashboard/fonts.cljs msgid "dashboard.fonts.upload-all" msgstr "Carregar tudo" -#, markdown msgid "dashboard.fonts.warning-text" msgstr "" "Detetámos um possível problema nas tuas fontes relacionado com métricas " @@ -538,7 +550,8 @@ msgstr "" "suporta." msgid "dashboard.import.import-error" -msgstr "Ocorreu um problema na importação do ficheiro. O ficheiro não foi importado." +msgstr "" +"Ocorreu um problema na importação do ficheiro. O ficheiro não foi importado." msgid "dashboard.import.import-message" msgid_plural "dashboard.import.import-message" @@ -886,7 +899,8 @@ msgstr "Não podes utilizar o teu e-mail como palavra-passe" msgid "errors.email-has-permanent-bounces" msgstr "O e-mail «%s» tem muitos relatórios de rejeição permanentes." -#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, src/app/main/ui/auth/recovery_request.cljs +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/auth/login.cljs, +#: src/app/main/ui/auth/recovery_request.cljs msgid "errors.email-invalid" msgstr "Por favor introduz um email válido" @@ -944,7 +958,8 @@ msgstr "A imagem é demasiado grande para ser inserida." #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "errors.media-type-mismatch" -msgstr "Parece que o conteúdo da imagem não corresponde à extensão do ficheiro." +msgstr "" +"Parece que o conteúdo da imagem não corresponde à extensão do ficheiro." #: src/app/main/data/workspace/persistence.cljs, src/app/main/data/media.cljs msgid "errors.media-type-not-allowed" @@ -953,8 +968,8 @@ msgstr "Parece que esta não é uma imagem válida." #: src/app/main/ui/dashboard/team.cljs msgid "errors.member-is-muted" msgstr "" -"O perfil que estás a convidar tem e-mails silenciados (relatórios de spam " -"ou devoluções altas)." +"O perfil que estás a convidar tem e-mails silenciados (relatórios de spam ou " +"devoluções altas)." #: src/app/main/ui/settings/password.cljs msgid "errors.password-invalid-confirmation" @@ -987,7 +1002,8 @@ msgid "errors.team-feature-mismatch" msgstr "Funcionalidade incompatível '%s' detetada" msgid "errors.team-leave.insufficient-members" -msgstr "Membros insuficientes para deixar a equipa, provavelmente queres eliminá-la." +msgstr "" +"Membros insuficientes para deixar a equipa, provavelmente queres eliminá-la." msgid "errors.team-leave.member-does-not-exists" msgstr "O membro que tentas atribuir não existe." @@ -1070,8 +1086,8 @@ msgstr "Assunto" msgid "feedback.subtitle" msgstr "" "Por favor descreve o motivo do teu e-mail, especificando se é um problema, " -"uma ideia, ou uma dúvida. Um membro da nossa equipa tentará responder o " -"mais rápido possível." +"uma ideia, ou uma dúvida. Um membro da nossa equipa tentará responder o mais " +"rápido possível." #: src/app/main/ui/settings/feedback.cljs msgid "feedback.title" @@ -1256,7 +1272,8 @@ msgid "inspect.attributes.typography.text-transform.uppercase" msgstr "Maiúsculas" msgid "inspect.empty.help" -msgstr "Se quiseres saber mais sobre a inspeção, visita o centro de ajuda do Penpot" +msgstr "" +"Se quiseres saber mais sobre a inspeção, visita o centro de ajuda do Penpot" msgid "inspect.empty.more-info" msgstr "Mais informações sobre a inspeção" @@ -1780,9 +1797,8 @@ msgstr "Sólido" msgid "modals.add-shared-confirm-empty.hint" msgstr "" "A tua biblioteca está vazia. Assim que ela seja adicionada como uma " -"biblioteca partilhada, os recursos que criares nela estarão disponíveis " -"para serem usados nos teus outros ficheiros. Tens a certeza que queres " -"publicá-la?" +"biblioteca partilhada, os recursos que criares nela estarão disponíveis para " +"serem usados nos teus outros ficheiros. Tens a certeza que queres publicá-la?" #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs @@ -1812,8 +1828,8 @@ msgstr "Verificar o novo e-mail" #: src/app/main/ui/settings/change_email.cljs msgid "modals.change-email.info" msgstr "" -"Vamos enviar um e‑mail para o teu endereço atual \"%s\" para verificar a " -"tua identidade." +"Vamos enviar um e‑mail para o teu endereço atual \"%s\" para verificar a tua " +"identidade." #: src/app/main/ui/settings/change_email.cljs msgid "modals.change-email.new-email" @@ -1898,8 +1914,8 @@ msgstr "Eliminar conversa" #: src/app/main/ui/comments.cljs msgid "modals.delete-comment-thread.message" msgstr "" -"Tens a certeza de que pretender eliminar esta conversa? Todos os " -"comentários neste tópico serão eliminados." +"Tens a certeza de que pretender eliminar esta conversa? Todos os comentários " +"neste tópico serão eliminados." #: src/app/main/ui/comments.cljs msgid "modals.delete-comment-thread.title" @@ -1937,8 +1953,8 @@ msgstr "Eliminando %s ficheiros" msgid "modals.delete-font-variant.message" msgstr "" -"Tens a certeza de que pretendes eliminar este estilo de fonte? Não " -"carregará se estiver a ser utilizado num ficheiro." +"Tens a certeza de que pretendes eliminar este estilo de fonte? Não carregará " +"se estiver a ser utilizado num ficheiro." msgid "modals.delete-font-variant.title" msgstr "Eliminando estilo de fonte" @@ -1978,13 +1994,15 @@ msgid_plural "modals.delete-shared-confirm.accept" msgstr[0] "Eliminar ficheiro" msgstr[1] "Eliminar ficheiros" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +#: src/app/main/ui/workspace/header.cljs, +#: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-shared-confirm.activated.no-files-message" msgid_plural "modals.delete-shared-confirm.activated.no-files-message" msgstr[0] "Não está ativa em nenhum ficheiro." msgstr[1] "Não estão ativas em nenhum ficheiro." -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +#: src/app/main/ui/workspace/header.cljs, +#: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-shared-confirm.activated.scd-message" msgid_plural "modals.delete-shared-confirm.activated.scd-message" msgstr[0] "Esta biblioteca está ativa aqui: " @@ -2030,7 +2048,8 @@ msgstr "Tens a certeza de que pretendes eliminar este membro da equipa?" msgid "modals.delete-team-member-confirm.title" msgstr "Eliminar membro da equipa" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +#: src/app/main/ui/workspace/header.cljs, +#: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.delete-unpublish-shared-confirm.activated.hint" msgid_plural "modals.delete-unpublish-shared-confirm.activated.hint" msgstr[0] "" @@ -2127,8 +2146,8 @@ msgstr "Transferir propriedade" #: src/app/main/ui/dashboard/team.cljs msgid "modals.promote-owner-confirm.hint" msgstr "" -"Se transferires a propriedade, vais alterar a tua função para " -"Administrador, perdendo algumas permissões sobre esta equipa. " +"Se transferires a propriedade, vais alterar a tua função para Administrador, " +"perdendo algumas permissões sobre esta equipa. " #: src/app/main/ui/dashboard/team.cljs msgid "modals.promote-owner-confirm.message" @@ -2158,9 +2177,9 @@ msgstr "Remover como Biblioteca Partilhada" #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.remove-shared-confirm.hint" msgstr "" -"Uma vez removida como Biblioteca Partilhada, a Biblioteca de Ficheiros " -"deste ficheiro deixarão de estar disponíveis para serem utilizados com o " -"resto dos teus ficheiros." +"Uma vez removida como Biblioteca Partilhada, a Biblioteca de Ficheiros deste " +"ficheiro deixarão de estar disponíveis para serem utilizados com o resto dos " +"teus ficheiros." #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs @@ -2171,7 +2190,8 @@ msgstr "Remover \"%s\" como Biblioteca Partilhada" msgid "modals.small-nudge" msgstr "Pequeno deslocamento" -#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +#: src/app/main/ui/workspace/header.cljs, +#: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.accept" msgid_plural "modals.unpublish-shared-confirm.accept" msgstr[0] "Cancelar publicação" @@ -2181,8 +2201,10 @@ msgstr[1] "Cancelar publicações" #: src/app/main/ui/dashboard/file_menu.cljs msgid "modals.unpublish-shared-confirm.message" msgid_plural "modals.unpublish-shared-confirm.message" -msgstr[0] "Tens a certeza de que queres cancelar a publicação desta biblioteca?" -msgstr[1] "Tens a certeza de que queres cancelar a publicação destas bibliotecas?" +msgstr[0] "" +"Tens a certeza de que queres cancelar a publicação desta biblioteca?" +msgstr[1] "" +"Tens a certeza de que queres cancelar a publicação destas bibliotecas?" #: src/app/main/ui/workspace/header.cljs, #: src/app/main/ui/dashboard/file_menu.cljs @@ -2289,8 +2311,8 @@ msgstr "Sua privacidade é importante para nós, saiba mais aqui " msgid "onboarding-v2.newsletter.privacy2" msgstr "" "Enviaremos apenas e-mails relevantes para você. Você pode cancelar a " -"inscrição a qualquer momento através do link de cancelamento de inscrição " -"em qualquer uma de nossas newsletter." +"inscrição a qualquer momento através do link de cancelamento de inscrição em " +"qualquer uma de nossas newsletter." msgid "onboarding-v2.newsletter.updates" msgstr "" @@ -2353,8 +2375,8 @@ msgstr "Convida membros" msgid "onboarding.choice.team-up.invite-members-info" msgstr "" -"Lembra-te em incluir todos. Programadores, designers, gestores... " -"acrescenta diversidade :)" +"Lembra-te em incluir todos. Programadores, designers, gestores... acrescenta " +"diversidade :)" msgid "onboarding.choice.team-up.roles" msgstr "Convidar com a função:" @@ -2569,7 +2591,8 @@ msgstr "Experimentar o Penpot antes de usar num servidor privado" #: src/app/main/ui/onboarding/questions.cljs msgid "questions.wireframes-user-journeys-flows-navigation-trees" -msgstr "...wireframes, jornadas e fluxos de utilizador, árvores de navegação, etc." +msgstr "" +"...wireframes, jornadas e fluxos de utilizador, árvores de navegação, etc." #: src/app/main/ui/onboarding/questions.cljs msgid "questions.work-in-concept-ideas" @@ -3149,8 +3172,8 @@ msgstr "%s - Penpot" msgid "viewer.breaking-change.description" msgstr "" -"Este link partilhável já não é válido. Cria uma nova ou pede ao " -"proprietário para um novo." +"Este link partilhável já não é válido. Cria uma nova ou pede ao proprietário " +"para um novo." msgid "viewer.breaking-change.message" msgstr "Desculpa!" @@ -3490,7 +3513,7 @@ msgstr "Ocultar grade de píxeis" #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-rules" -msgstr "Ocultar regras" +msgstr "Ocultar réguas" #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.hide-textpalette" @@ -3536,7 +3559,7 @@ msgstr "Mostrar grade de píxeis" #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-rules" -msgstr "Mostrar regras" +msgstr "Mostrar réguas" #: src/app/main/ui/workspace/header.cljs msgid "workspace.header.menu.show-textpalette" @@ -5188,6 +5211,61 @@ msgstr "Atualizar" msgid "workspace.viewport.click-to-close-path" msgstr "Clica para fechar o caminho" +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "Entrar na minha conta" + +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "Domínio não permitido" + +msgid "media.image.short" +msgstr "img" + +msgid "modals.move-shared-confirm.title" +msgid_plural "modals.move-shared-confirm.title" +msgstr[0] "Mover biblioteca" +msgstr[1] "Mover bibliotecas" + +msgid "onboarding.team-modal.team-definition" +msgstr "O que é uma equipa?" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-one" +msgstr "Nenhuma" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs +msgid "settings.select-this-color" +msgstr "Selecionar itens que usem este estilo" + +#: src/app/main/ui/workspace/sidebar/assets/common.cljs +msgid "workspace.assets.sidebar.components" +msgid_plural "workspace.assets.sidebar.components" +msgstr[0] "1 componente" +msgstr[1] "%s componentes" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "Ordenar" + +msgid "workspace.top-bar.view-only" +msgstr "**A inspecionar código** (Somente leitura)" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-tagline" +msgstr "" +"O Penpot é a ferramenta de desenho gratuita e de código aberto para " +"colaboração entre Design e Código" + +msgid "modals.move-shared-confirm.accept" +msgid_plural "modals.move-shared-confirm.accept" +msgstr[0] "Mover" +msgstr[1] "Mover" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.filter" +msgstr "Filtrar" + #~ msgid "dashboard.newsletter-title" #~ msgstr "Subscrição de Newsletter" @@ -5210,7 +5288,9 @@ msgstr "Clica para fechar o caminho" #~ msgstr "projeto no GitHub" #~ msgid "onboarding.slide.0.desc1" -#~ msgstr "Cria interfaces maravilhosas em colaboração com todos os membros da equipa." +#~ msgstr "" +#~ "Cria interfaces maravilhosas em colaboração com todos os membros da " +#~ "equipa." #~ msgid "onboarding.slide.1.desc1" #~ msgstr "Cria interações ricas para simular o comportamento do produto." -- Gitee From 4a74862bf5cfb18564cfd0f3c11b48c5d774b9f3 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 23 Apr 2024 14:52:57 +0200 Subject: [PATCH 0489/1266] :sparkles: Add viewport information to the plugin --- .../src/app/main/data/workspace/zoom.cljs | 50 ++++++++++-- frontend/src/app/plugins/api.cljs | 40 +++++++--- frontend/src/app/plugins/shape.cljs | 3 +- frontend/src/app/plugins/viewport.cljs | 79 +++++++++++++++++++ 4 files changed, 150 insertions(+), 22 deletions(-) create mode 100644 frontend/src/app/plugins/viewport.cljs diff --git a/frontend/src/app/main/data/workspace/zoom.cljs b/frontend/src/app/main/data/workspace/zoom.cljs index 379776ede..8672544fd 100644 --- a/frontend/src/app/main/data/workspace/zoom.cljs +++ b/frontend/src/app/main/data/workspace/zoom.cljs @@ -6,6 +6,8 @@ (ns app.main.data.workspace.zoom (:require + [app.common.data :as d] + [app.common.data.macros :as dm] [app.common.files.helpers :as cfh] [app.common.geom.align :as gal] [app.common.geom.matrix :as gmt] @@ -54,14 +56,20 @@ #(impl-update-zoom % center (fn [z] (max (/ z 1.3) 0.01))))))))) (defn set-zoom - [center scale] - (ptk/reify ::set-zoom - ptk/UpdateEvent - (update [_ state] - (update state :workspace-local - #(impl-update-zoom % center (fn [z] (-> (* z scale) - (max 0.01) - (min 200)))))))) + ([scale] + (set-zoom nil scale)) + ([center scale] + (ptk/reify ::set-zoom + ptk/UpdateEvent + (update [_ state] + (let [vp (dm/get-in state [:workspace-local :vbox]) + x (+ (:x vp) (/ (:width vp) 2)) + y (+ (:y vp) (/ (:height vp) 2)) + center (d/nilv center (gpt/point x y))] + (update state :workspace-local + #(impl-update-zoom % center (fn [z] (-> (* z scale) + (max 0.01) + (min 200)))))))))) (def reset-zoom (ptk/reify ::reset-zoom @@ -110,6 +118,32 @@ (assoc :zoom-inverse (/ 1 zoom)) (update :vbox merge srect))))))))))) +(defn fit-to-shapes + [ids] + (ptk/reify ::fit-to-shapes + ptk/UpdateEvent + (update [_ state] + (if (empty? ids) + state + (let [page-id (:current-page-id state) + objects (wsh/lookup-page-objects state page-id) + _ (prn "??" (->> ids (map #(get objects %)) (map :name))) + srect (->> ids + (map #(get objects %)) + (gsh/shapes->rect))] + + (update state :workspace-local + (fn [{:keys [vport] :as local}] + (let [srect (gal/adjust-to-viewport + vport srect + {:padding 40}) + zoom (/ (:width vport) + (:width srect))] + (-> local + (assoc :zoom zoom) + (assoc :zoom-inverse (/ 1 zoom)) + (update :vbox merge srect)))))))))) + (defn start-zooming [pt] (ptk/reify ::start-zooming ptk/WatchEvent diff --git a/frontend/src/app/plugins/api.cljs b/frontend/src/app/plugins/api.cljs index 51ed5155c..683d5677d 100644 --- a/frontend/src/app/plugins/api.cljs +++ b/frontend/src/app/plugins/api.cljs @@ -17,7 +17,8 @@ [app.plugins.events :as events] [app.plugins.file :as file] [app.plugins.page :as page] - [app.plugins.shape :as shape])) + [app.plugins.shape :as shape] + [app.plugins.viewport :as viewport])) ;; ;; PLUGINS PUBLIC API - The plugins will able to access this functions @@ -28,12 +29,30 @@ (map val) (map shape/data->shape-proxy))) +(defn create-shape + [type] + (let [page-id (:current-page-id @st/state) + page (dm/get-in @st/state [:workspace-data :pages-index page-id]) + shape (cts/setup-shape {:type :type + :x 0 :y 0 :width 100 :height 100}) + changes + (-> (cb/empty-changes) + (cb/with-page page) + (cb/with-objects (:objects page)) + (cb/add-object shape))] + (st/emit! (ch/commit-changes changes)) + (shape/data->shape-proxy shape))) + (deftype PenpotContext [] Object (addListener [_ type callback] (events/add-listener type callback)) + (getViewport + [_] + (viewport/create-proxy)) + (getFile [_] (file/data->file-proxy (:workspace-file @st/state) (:workspace-data @st/state))) @@ -70,19 +89,13 @@ "dark" (get-in @st/state [:profile :theme])))) + (createFrame + [_] + (create-shape :frame)) + (createRectangle [_] - (let [page-id (:current-page-id @st/state) - page (dm/get-in @st/state [:workspace-data :pages-index page-id]) - shape (cts/setup-shape {:type :rect - :x 0 :y 0 :width 100 :height 100}) - changes - (-> (cb/empty-changes) - (cb/with-page page) - (cb/with-objects (:objects page)) - (cb/add-object shape))] - (st/emit! (ch/commit-changes changes)) - (shape/data->shape-proxy shape)))) + (create-shape :rect))) (defn create-context [] @@ -90,4 +103,5 @@ (PenpotContext.) {:name "root" :get #(.getRoot ^js %)} {:name "currentPage" :get #(.getPage ^js %)} - {:name "selection" :get #(.getSelectedShapes ^js %)})) + {:name "selection" :get #(.getSelectedShapes ^js %)} + {:name "viewport" :get #(.getViewport ^js %)})) diff --git a/frontend/src/app/plugins/shape.cljs b/frontend/src/app/plugins/shape.cljs index 8a7aea836..1bcbea5dc 100644 --- a/frontend/src/app/plugins/shape.cljs +++ b/frontend/src/app/plugins/shape.cljs @@ -69,7 +69,8 @@ (clone [_] (.log js/console (clj->js _data))) (delete [_] (.log js/console (clj->js _data))) - (appendChild [_] (.log js/console (clj->js _data)))) + (appendChild [_ child] (.log js/console (clj->js _data))) + (insertChild [_ index child] (.log js/console (clj->js _data)))) (crc/define-properties! ShapeProxy diff --git a/frontend/src/app/plugins/viewport.cljs b/frontend/src/app/plugins/viewport.cljs new file mode 100644 index 000000000..c243d327a --- /dev/null +++ b/frontend/src/app/plugins/viewport.cljs @@ -0,0 +1,79 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.plugins.viewport + "RPC for plugins runtime." + (:require + [app.common.data.macros :as dm] + [app.common.geom.point :as gpt] + [app.common.record :as crc] + [app.common.record :as crc] + [app.common.uuid :as uuid] + [app.main.data.workspace.viewport :as dwv] + [app.main.data.workspace.zoom :as dwz] + [app.main.store :as st] + [app.plugins.page :as page] + [app.plugins.utils :refer [get-data-fn]] + [app.util.object :as obj])) + +(deftype ViewportProxy [] + Object + (zoomIntoView [_ shapes] + (let [ids + (->> shapes + (map (fn [v] + (if (string? v) + (uuid/uuid v) + (uuid/uuid (obj/get v "x"))))))] + (st/emit! (dwz/fit-to-shapes ids))))) + +(crc/define-properties! + ViewportProxy + {:name js/Symbol.toStringTag + :get (fn [] (str "ViewportProxy"))}) + +(defn create-proxy + [] + (crc/add-properties! + (ViewportProxy.) + {:name "center" + :get + (fn [_] + (let [vp (dm/get-in @st/state [:workspace-local :vbox]) + x (+ (:x vp) (/ (:width vp) 2)) + y (+ (:y vp) (/ (:height vp) 2))] + (.freeze js/Object #js {:x x :y y}))) + + :set + (fn [_ value] + (let [new-x (obj/get value "x") + new-y (obj/get value "y") + vb (dm/get-in @st/state [:workspace-local :vbox]) + old-x (+ (:x vb) (/ (:width vb) 2)) + old-y (+ (:y vb) (/ (:height vb) 2)) + delta-x (- new-x old-x) + delta-y (- new-y old-y) + to-position + {:x #(+ % delta-x) + :y #(+ % delta-y)}] + (st/emit! (dwv/update-viewport-position to-position))))} + + {:name "zoom" + :get + (fn [_] + (dm/get-in @st/state [:workspace-local :zoom])) + :set + (fn [_ value] + (let [z (dm/get-in @st/state [:workspace-local :zoom])] + (st/emit! (dwz/set-zoom (/ value z)))))} + + {:name "bounds" + :get + (fn [_] + (let [vport (dm/get-in @st/state [:workspace-local :vport])] + (.freeze js/Object (clj->js vport))))})) + + -- Gitee From 75d89653653868a046b0f1f9c5a5f88a8183a53a Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 24 Apr 2024 10:18:19 +0200 Subject: [PATCH 0490/1266] :sparkles: Add method to append children --- frontend/src/app/main/data/workspace.cljs | 1 + frontend/src/app/plugins/shape.cljs | 22 +++++++++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index 52a09c8c9..078f6c1a3 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -790,6 +790,7 @@ (defn relocate-shapes [ids parent-id to-index & [ignore-parents?]] (dm/assert! (every? uuid? ids)) + (dm/assert! (set? ids)) (dm/assert! (uuid? parent-id)) (dm/assert! (number? to-index)) diff --git a/frontend/src/app/plugins/shape.cljs b/frontend/src/app/plugins/shape.cljs index 1bcbea5dc..33148f752 100644 --- a/frontend/src/app/plugins/shape.cljs +++ b/frontend/src/app/plugins/shape.cljs @@ -12,10 +12,12 @@ [app.common.files.helpers :as cfh] [app.common.record :as crc] [app.common.text :as txt] + [app.common.uuid :as uuid] [app.main.data.workspace :as udw] [app.main.data.workspace.changes :as dwc] [app.main.store :as st] [app.plugins.utils :refer [get-data get-data-fn]] + [app.util.object :as obj] [cuerdas.core :as str])) (declare data->shape-proxy) @@ -69,8 +71,16 @@ (clone [_] (.log js/console (clj->js _data))) (delete [_] (.log js/console (clj->js _data))) - (appendChild [_ child] (.log js/console (clj->js _data))) - (insertChild [_ index child] (.log js/console (clj->js _data)))) + + (appendChild [self child] + (let [parent-id (get-data self :id) + child-id (uuid/uuid (obj/get child "id"))] + (st/emit! (udw/relocate-shapes #{ child-id } parent-id 0)))) + + (insertChild [self index child] + (let [parent-id (get-data self :id) + child-id (uuid/uuid (obj/get child "id"))] + (st/emit! (udw/relocate-shapes #{ child-id } parent-id index))))) (crc/define-properties! ShapeProxy @@ -117,9 +127,6 @@ (let [id (get-data self :id)] (st/emit! (dwc/update-shapes [id] #(assoc % :name value)))))} - {:name "children" - :get #(.getChildren ^js %)} - {:name "fills" :get #(get-state % :fills make-fills) ;;:set (fn [self value] (.log js/console self value)) @@ -130,6 +137,11 @@ ;;:set (fn [self value] (.log js/console self value)) }) + (cond-> (or (cfh/frame-shape? data) (cfh/group-shape? data) (cfh/svg-raw-shape? data) (cfh/bool-shape? data)) + (crc/add-properties! + {:name "children" + :get #(.getChildren ^js %)})) + (cond-> (cfh/text-shape? data) (crc/add-properties! {:name "characters" -- Gitee From 21d38a058bb6f6e3f23b8a8af4cd32863d90aa7f Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 29 Apr 2024 12:20:15 +0200 Subject: [PATCH 0491/1266] :sparkles: Add to plugin api: upload media, group and ungroup --- .../src/app/main/data/workspace/groups.cljs | 76 ++++++++++++------- .../src/app/main/data/workspace/media.cljs | 12 ++- frontend/src/app/plugins/api.cljs | 38 +++++++++- frontend/src/app/plugins/shape.cljs | 28 ++++--- frontend/src/app/plugins/utils.cljs | 41 +++++++++- frontend/src/app/plugins/viewport.cljs | 4 - 6 files changed, 148 insertions(+), 51 deletions(-) diff --git a/frontend/src/app/main/data/workspace/groups.cljs b/frontend/src/app/main/data/workspace/groups.cljs index 30046ecef..be758443e 100644 --- a/frontend/src/app/main/data/workspace/groups.cljs +++ b/frontend/src/app/main/data/workspace/groups.cljs @@ -15,6 +15,7 @@ [app.common.types.container :as ctn] [app.common.types.shape :as cts] [app.common.types.shape.layout :as ctl] + [app.common.uuid :as uuid] [app.main.data.workspace.changes :as dch] [app.main.data.workspace.selection :as dws] [app.main.data.workspace.state-helpers :as wsh] @@ -68,7 +69,7 @@ result))))))) (defn prepare-create-group - [changes objects page-id shapes base-name keep-name?] + [changes id objects page-id shapes base-name keep-name?] (let [frame-id (:frame-id (first shapes)) parent-id (:parent-id (first shapes)) gname (if (and keep-name? @@ -84,7 +85,8 @@ (cfh/get-position-on-parent objects) inc) - group (cts/setup-shape {:type :group + group (cts/setup-shape {:id id + :type :group :name gname :shapes (mapv :id shapes) :selrect selrect @@ -173,30 +175,43 @@ ;; GROUPS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(def group-selected - (ptk/reify ::group-selected +(defn group-shapes + [id ids & {:keys [change-selection?] :or {change-selection? false}}] + (ptk/reify ::group-shapes ptk/WatchEvent (watch [it state _] - (let [page-id (:current-page-id state) + (let [id (d/nilv id (uuid/next)) + page-id (:current-page-id state) objects (wsh/lookup-page-objects state page-id) - selected (->> (wsh/lookup-selected state) - (cfh/clean-loops objects) - (remove #(ctn/has-any-copy-parent? objects (get objects %)))) - shapes (shapes-for-grouping objects selected) + + shapes + (->> ids + (cfh/clean-loops objects) + (remove #(ctn/has-any-copy-parent? objects (get objects %))) + (shapes-for-grouping objects)) parents (into #{} (map :parent-id) shapes)] (when-not (empty? shapes) (let [[group changes] - (prepare-create-group (pcb/empty-changes it) objects page-id shapes "Group" false)] + (prepare-create-group (pcb/empty-changes it) id objects page-id shapes "Group" false)] (rx/of (dch/commit-changes changes) - (dws/select-shapes (d/ordered-set (:id group))) + (when change-selection? + (dws/select-shapes (d/ordered-set (:id group)))) (ptk/data-event :layout/update {:ids parents})))))))) -(def ungroup-selected - (ptk/reify ::ungroup-selected +(def group-selected + (ptk/reify ::group-selected + ptk/WatchEvent + (watch [_ state _] + (let [selected (wsh/lookup-selected state)] + (rx/of group-shapes nil selected))))) + +(defn ungroup-shapes + [ids & {:keys [change-selection?] :or {change-selection? false}}] + (ptk/reify ::ungroup-shapes ptk/WatchEvent (watch [it state _] - (let [page-id (:current-page-id state) - objects (wsh/lookup-page-objects state page-id) + (let [page-id (:current-page-id state) + objects (wsh/lookup-page-objects state page-id) prepare (fn [shape-id] @@ -213,35 +228,42 @@ (ctl/grid-layout? objects (:parent-id shape)) (pcb/update-shapes [(:parent-id shape)] ctl/assign-cells {:with-objects? true})))) - selected (->> (wsh/lookup-selected state) - (remove #(ctn/has-any-copy-parent? objects (get objects %))) - ;; components can't be ungrouped - (remove #(ctk/instance-head? (get objects %)))) - changes-list (sequence - (keep prepare) - selected) + ids (->> ids + (remove #(ctn/has-any-copy-parent? objects (get objects %))) + ;; components can't be ungrouped + (remove #(ctk/instance-head? (get objects %)))) + + changes-list (sequence (keep prepare) ids) parents (into #{} (comp (map #(cfh/get-parent objects %)) (keep :id)) - selected) + ids) child-ids (into (d/ordered-set) (mapcat #(dm/get-in objects [% :shapes])) - selected) + ids) changes {:redo-changes (vec (mapcat :redo-changes changes-list)) :undo-changes (vec (mapcat :undo-changes changes-list)) :origin it} undo-id (js/Symbol)] - (when-not (empty? selected) + (when-not (empty? ids) (rx/of (dwu/start-undo-transaction undo-id) (dch/commit-changes changes) (ptk/data-event :layout/update {:ids parents}) (dwu/commit-undo-transaction undo-id) - (dws/select-shapes child-ids))))))) + (when change-selection? + (dws/select-shapes child-ids)))))))) + +(def ungroup-selected + (ptk/reify ::ungroup-selected + ptk/WatchEvent + (watch [_ state _] + (let [selected (wsh/lookup-selected state)] + (rx/of (ungroup-shapes selected :change-selection? true)))))) (def mask-group (ptk/reify ::mask-group @@ -262,7 +284,7 @@ (= (:type (first shapes)) :group)) [first-shape (-> (pcb/empty-changes it page-id) (pcb/with-objects objects))] - (prepare-create-group (pcb/empty-changes it) objects page-id shapes "Mask" true)) + (prepare-create-group (pcb/empty-changes it) (uuid/next) objects page-id shapes "Mask" true)) changes (-> changes (pcb/update-shapes (:shapes group) diff --git a/frontend/src/app/main/data/workspace/media.cljs b/frontend/src/app/main/data/workspace/media.cljs index 693207d87..815619059 100644 --- a/frontend/src/app/main/data/workspace/media.cljs +++ b/frontend/src/app/main/data/workspace/media.cljs @@ -87,7 +87,17 @@ (->> (svg/upload-images svg-data file-id) (rx/map #(svg/add-svg-shapes (assoc svg-data :image-data %) position)))))) -(defn- process-uris + +(defn upload-media-url + [name file-id url] + (rp/cmd! + :create-file-media-object-from-url + {:name name + :file-id file-id + :url url + :is-local true})) + +(defn process-uris [{:keys [file-id local? name uris mtype on-image on-svg]}] (letfn [(svg-url? [url] (or (and mtype (= mtype "image/svg+xml")) diff --git a/frontend/src/app/plugins/api.cljs b/frontend/src/app/plugins/api.cljs index 683d5677d..5efaddfc9 100644 --- a/frontend/src/app/plugins/api.cljs +++ b/frontend/src/app/plugins/api.cljs @@ -13,12 +13,18 @@ [app.common.types.shape :as cts] [app.common.uuid :as uuid] [app.main.data.workspace.changes :as ch] + [app.main.data.workspace.groups :as dwg] + [app.main.data.workspace.media :as dwm] [app.main.store :as st] [app.plugins.events :as events] [app.plugins.file :as file] [app.plugins.page :as page] [app.plugins.shape :as shape] - [app.plugins.viewport :as viewport])) + [app.plugins.utils :as utils] + [app.plugins.viewport :as viewport] + [app.util.object :as obj] + [beicon.v2.core :as rx] + [promesa.core :as p])) ;; ;; PLUGINS PUBLIC API - The plugins will able to access this functions @@ -33,7 +39,7 @@ [type] (let [page-id (:current-page-id @st/state) page (dm/get-in @st/state [:workspace-data :pages-index page-id]) - shape (cts/setup-shape {:type :type + shape (cts/setup-shape {:type type :x 0 :y 0 :width 100 :height 100}) changes (-> (cb/empty-changes) @@ -89,13 +95,39 @@ "dark" (get-in @st/state [:profile :theme])))) + (uploadMediaUrl + [_ name url] + (let [file-id (get-in @st/state [:workspace-file :id])] + (p/create + (fn [resolve reject] + (->> (dwm/upload-media-url name file-id url) + (rx/map utils/to-js) + (rx/take 1) + (rx/subs! resolve reject)))))) + + (group + [_ shapes] + (let [page-id (:current-page-id @st/state) + id (uuid/next) + ids (into #{} (map #(get (obj/get % "_data") :id)) shapes)] + (st/emit! (dwg/group-shapes id ids)) + (shape/data->shape-proxy + (dm/get-in @st/state [:workspace-data :pages-index page-id :objects id])))) + + (ungroup + [_ group & rest] + (let [shapes (concat [group] rest) + ids (into #{} (map #(get (obj/get % "_data") :id)) shapes)] + (st/emit! (dwg/ungroup-shapes ids)))) + (createFrame [_] (create-shape :frame)) (createRectangle [_] - (create-shape :rect))) + (create-shape :rect)) + ) (defn create-context [] diff --git a/frontend/src/app/plugins/shape.cljs b/frontend/src/app/plugins/shape.cljs index 33148f752..56383e38a 100644 --- a/frontend/src/app/plugins/shape.cljs +++ b/frontend/src/app/plugins/shape.cljs @@ -16,9 +16,8 @@ [app.main.data.workspace :as udw] [app.main.data.workspace.changes :as dwc] [app.main.store :as st] - [app.plugins.utils :refer [get-data get-data-fn]] - [app.util.object :as obj] - [cuerdas.core :as str])) + [app.plugins.utils :as utils :refer [get-data get-data-fn]] + [app.util.object :as obj])) (declare data->shape-proxy) @@ -26,19 +25,13 @@ [fills] (.freeze js/Object - (apply array - (->> fills - ;; TODO: Transform explicitly instead of cljs->js? - (map #(clj->js % {:keyword-fn (fn [k] (str/camel (name k)))})))))) + (apply array (->> fills (map utils/to-js))))) (defn- make-strokes [strokes] (.freeze js/Object - (apply array - (->> strokes - ;; TODO: Transform explicitly instead of cljs->js? - (map #(clj->js % {:keyword-fn (fn [k] (str/camel (name k)))})))))) + (apply array (->> strokes (map utils/to-js))))) (defn- locate-shape [shape-id] @@ -64,7 +57,6 @@ (resize [self width height] - (let [id (get-data self :id)] (st/emit! (udw/update-dimensions [id] :width width) (udw/update-dimensions [id] :height height)))) @@ -99,7 +91,7 @@ :get (get-data-fn :id str)} {:name "type" - :get (get-data-fn :type)} + :get (get-data-fn :type name)} {:name "x" :get #(get-state % :x) @@ -129,12 +121,18 @@ {:name "fills" :get #(get-state % :fills make-fills) - ;;:set (fn [self value] (.log js/console self value)) + :set (fn [self value] + (let [id (get-data self :id) + value (mapv #(utils/from-js %) value)] + (st/emit! (dwc/update-shapes [id] #(assoc % :fills value))))) } {:name "strokes" :get #(get-state % :strokes make-strokes) - ;;:set (fn [self value] (.log js/console self value)) + :set (fn [self value] + (let [id (get-data self :id) + value (mapv #(utils/from-js %) value)] + (st/emit! (dwc/update-shapes [id] #(assoc % :strokes value))))) }) (cond-> (or (cfh/frame-shape? data) (cfh/group-shape? data) (cfh/svg-raw-shape? data) (cfh/bool-shape? data)) diff --git a/frontend/src/app/plugins/utils.cljs b/frontend/src/app/plugins/utils.cljs index 1b392d84c..32add7bfd 100644 --- a/frontend/src/app/plugins/utils.cljs +++ b/frontend/src/app/plugins/utils.cljs @@ -7,7 +7,13 @@ (ns app.plugins.utils "RPC for plugins runtime." (:require - [app.util.object :as obj])) + [app.common.data.macros :as dm] + [app.common.uuid :as uuid] + [app.util.object :as obj] + [cuerdas.core :as str])) + +(def uuid-regex + #"\w{8}-\w{4}-\w{4}-\w{4}-\w{12}") (defn get-data ([self attr] @@ -27,4 +33,37 @@ (fn [self] (get-data self attr transform-fn)))) +(defn from-js + "Converts the object back to js" + [obj] + (let [ret (js->clj obj {:keyword-fn (fn [k] (str/camel (name k)))})] + (reduce-kv + (fn [m k v] + (let [v (cond (map? v) + (from-js v) + + (and (string? v) (re-matches uuid-regex v)) + (uuid/uuid v) + + :else v)] + (assoc m (keyword (str/kebab k)) v))) + {} + ret))) + + +(defn to-js + "Converts to javascript an camelize the keys" + [obj] + (let [result + (reduce-kv + (fn [m k v] + (let [v (cond (object? v) (to-js v) + (uuid? v) (dm/str v) + :else v)] + (assoc m (str/camel (name k)) v))) + {} + obj)] + (clj->js result))) + + diff --git a/frontend/src/app/plugins/viewport.cljs b/frontend/src/app/plugins/viewport.cljs index c243d327a..8d647042a 100644 --- a/frontend/src/app/plugins/viewport.cljs +++ b/frontend/src/app/plugins/viewport.cljs @@ -8,15 +8,11 @@ "RPC for plugins runtime." (:require [app.common.data.macros :as dm] - [app.common.geom.point :as gpt] - [app.common.record :as crc] [app.common.record :as crc] [app.common.uuid :as uuid] [app.main.data.workspace.viewport :as dwv] [app.main.data.workspace.zoom :as dwz] [app.main.store :as st] - [app.plugins.page :as page] - [app.plugins.utils :refer [get-data-fn]] [app.util.object :as obj])) (deftype ViewportProxy [] -- Gitee From 67d48435e7f92fc87a2782fe618e54f85b8ef0d4 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 29 Apr 2024 15:43:48 +0200 Subject: [PATCH 0492/1266] :sparkles: Plugins create svg shapes --- common/src/app/common/svg/shapes_builder.cljc | 129 +++++++++--------- .../src/app/main/data/workspace/groups.cljs | 2 +- .../src/app/main/data/workspace/media.cljs | 9 ++ .../app/main/data/workspace/svg_upload.cljs | 89 ++++++------ frontend/src/app/plugins/api.cljs | 10 +- frontend/src/app/plugins/shape.cljs | 10 +- 6 files changed, 137 insertions(+), 112 deletions(-) diff --git a/common/src/app/common/svg/shapes_builder.cljc b/common/src/app/common/svg/shapes_builder.cljc index 619a81b94..41f25e1e2 100644 --- a/common/src/app/common/svg/shapes_builder.cljc +++ b/common/src/app/common/svg/shapes_builder.cljc @@ -22,6 +22,7 @@ [app.common.svg :as csvg] [app.common.svg.path :as path] [app.common.types.shape :as cts] + [app.common.uuid :as uuid] [cuerdas.core :as str])) (def default-rect @@ -78,67 +79,68 @@ (declare parse-svg-element) (defn create-svg-shapes - [svg-data {:keys [x y]} objects frame-id parent-id selected center?] - (let [[vb-x vb-y vb-width vb-height] (svg-dimensions svg-data) - - - unames (cfh/get-used-names objects) - svg-name (str/replace (:name svg-data) ".svg" "") - - svg-data (-> svg-data - (assoc :x (mth/round - (if center? - (- x vb-x (/ vb-width 2)) - x))) - (assoc :y (mth/round - (if center? - (- y vb-y (/ vb-height 2)) - y))) - (assoc :offset-x vb-x) - (assoc :offset-y vb-y) - (assoc :width vb-width) - (assoc :height vb-height) - (assoc :name svg-name)) - - [def-nodes svg-data] - (-> svg-data - (csvg/fix-default-values) - (csvg/fix-percents) - (csvg/extract-defs)) - - ;; In penpot groups have the size of their children. To - ;; respect the imported svg size and empty space let's create - ;; a transparent shape as background to respect the imported - ;; size - background - {:tag :rect - :attrs {:x (dm/str vb-x) - :y (dm/str vb-y) - :width (dm/str vb-width) - :height (dm/str vb-height) - :fill "none" - :id "base-background"} - :hidden true - :content []} - - svg-data (-> svg-data - (assoc :defs def-nodes) - (assoc :content (into [background] (:content svg-data)))) - - root-shape (create-svg-root frame-id parent-id svg-data) - root-id (:id root-shape) - - ;; Create the root shape - root-attrs (-> (:attrs svg-data) - (csvg/format-styles)) - - [_ children] - (reduce (partial create-svg-children objects selected frame-id root-id svg-data) - [unames []] - (d/enumerate (->> (:content svg-data) - (mapv #(csvg/inherit-attributes root-attrs %)))))] - - [root-shape children])) + ([svg-data pos objects frame-id parent-id selected center?] + (create-svg-shapes (uuid/next) svg-data pos objects frame-id parent-id selected center?)) + ([id svg-data {:keys [x y]} objects frame-id parent-id selected center?] + (let [[vb-x vb-y vb-width vb-height] (svg-dimensions svg-data) + + unames (cfh/get-used-names objects) + svg-name (str/replace (:name svg-data) ".svg" "") + + svg-data (-> svg-data + (assoc :x (mth/round + (if center? + (- x vb-x (/ vb-width 2)) + x))) + (assoc :y (mth/round + (if center? + (- y vb-y (/ vb-height 2)) + y))) + (assoc :offset-x vb-x) + (assoc :offset-y vb-y) + (assoc :width vb-width) + (assoc :height vb-height) + (assoc :name svg-name)) + + [def-nodes svg-data] + (-> svg-data + (csvg/fix-default-values) + (csvg/fix-percents) + (csvg/extract-defs)) + + ;; In penpot groups have the size of their children. To + ;; respect the imported svg size and empty space let's create + ;; a transparent shape as background to respect the imported + ;; size + background + {:tag :rect + :attrs {:x (dm/str vb-x) + :y (dm/str vb-y) + :width (dm/str vb-width) + :height (dm/str vb-height) + :fill "none" + :id "base-background"} + :hidden true + :content []} + + svg-data (-> svg-data + (assoc :defs def-nodes) + (assoc :content (into [background] (:content svg-data)))) + + root-shape (create-svg-root id frame-id parent-id svg-data) + root-id (:id root-shape) + + ;; Create the root shape + root-attrs (-> (:attrs svg-data) + (csvg/format-styles)) + + [_ children] + (reduce (partial create-svg-children objects selected frame-id root-id svg-data) + [unames []] + (d/enumerate (->> (:content svg-data) + (mapv #(csvg/inherit-attributes root-attrs %)))))] + + [root-shape children]))) (defn create-raw-svg [name frame-id {:keys [x y width height offset-x offset-y]} {:keys [attrs] :as data}] @@ -157,12 +159,13 @@ :svg-viewbox vbox}))) (defn create-svg-root - [frame-id parent-id {:keys [name x y width height offset-x offset-y attrs]}] + [id frame-id parent-id {:keys [name x y width height offset-x offset-y attrs]}] (let [props (-> (dissoc attrs :viewBox :view-box :xmlns) (d/without-keys csvg/inheritable-props) (csvg/attrs->props))] (cts/setup-shape - {:type :group + {:id id + :type :group :name name :frame-id frame-id :parent-id parent-id diff --git a/frontend/src/app/main/data/workspace/groups.cljs b/frontend/src/app/main/data/workspace/groups.cljs index be758443e..43bed0489 100644 --- a/frontend/src/app/main/data/workspace/groups.cljs +++ b/frontend/src/app/main/data/workspace/groups.cljs @@ -203,7 +203,7 @@ ptk/WatchEvent (watch [_ state _] (let [selected (wsh/lookup-selected state)] - (rx/of group-shapes nil selected))))) + (rx/of (group-shapes nil selected)))))) (defn ungroup-shapes [ids & {:keys [change-selection?] :or {change-selection? false}}] diff --git a/frontend/src/app/main/data/workspace/media.cljs b/frontend/src/app/main/data/workspace/media.cljs index 815619059..50105e9b0 100644 --- a/frontend/src/app/main/data/workspace/media.cljs +++ b/frontend/src/app/main/data/workspace/media.cljs @@ -459,3 +459,12 @@ (rx/tap on-success) (rx/catch on-error) (rx/finalize #(st/emit! (msg/hide-tag :media-loading))))))))) + +(defn create-svg-shape + [id name svg-string position] + (ptk/reify ::create-svg-shape + ptk/WatchEvent + (watch [_ _ _] + (->> (svg->clj [name svg-string]) + (rx/take 1) + (rx/map #(svg/add-svg-shapes id % position {:change-selection? false})))))) diff --git a/frontend/src/app/main/data/workspace/svg_upload.cljs b/frontend/src/app/main/data/workspace/svg_upload.cljs index fa159cf04..2517a73aa 100644 --- a/frontend/src/app/main/data/workspace/svg_upload.cljs +++ b/frontend/src/app/main/data/workspace/svg_upload.cljs @@ -13,6 +13,7 @@ [app.common.svg :as csvg] [app.common.svg.shapes-builder :as csvg.shapes-builder] [app.common.types.shape-tree :as ctst] + [app.common.uuid :as uuid] [app.main.data.workspace.changes :as dch] [app.main.data.workspace.selection :as dws] [app.main.data.workspace.state-helpers :as wsh] @@ -60,52 +61,58 @@ (rx/reduce conj {}))) (defn add-svg-shapes - [svg-data position] - (ptk/reify ::add-svg-shapes - ptk/WatchEvent - (watch [it state _] - (try - (let [page-id (:current-page-id state) - objects (wsh/lookup-page-objects state page-id) - frame-id (ctst/top-nested-frame objects position) - selected (wsh/lookup-selected state) - base (cfh/get-base-shape objects selected) + ([svg-data position] + (add-svg-shapes nil svg-data position nil)) - selected-id (first selected) - selected-frame? (and (= 1 (count selected)) - (= :frame (dm/get-in objects [selected-id :type]))) + ([id svg-data position {:keys [change-selection?] :or {change-selection? false}}] + (ptk/reify ::add-svg-shapes + ptk/WatchEvent + (watch [it state _] + (try + (let [id (d/nilv id (uuid/next)) + page-id (:current-page-id state) + objects (wsh/lookup-page-objects state page-id) + frame-id (ctst/top-nested-frame objects position) + selected (wsh/lookup-selected state) + base (cfh/get-base-shape objects selected) - parent-id (if (or selected-frame? (empty? selected)) - frame-id - (:parent-id base)) + selected-id (first selected) + selected-frame? (and (= 1 (count selected)) + (= :frame (dm/get-in objects [selected-id :type]))) - [new-shape new-children] - (csvg.shapes-builder/create-svg-shapes svg-data position objects frame-id parent-id selected true) + parent-id (if (or selected-frame? (empty? selected)) + frame-id + (:parent-id base)) - changes (-> (pcb/empty-changes it page-id) - (pcb/with-objects objects) - (pcb/add-object new-shape)) + [new-shape new-children] + (csvg.shapes-builder/create-svg-shapes id svg-data position objects frame-id parent-id selected true) - changes (reduce (fn [changes new-child] - (pcb/add-object changes new-child)) - changes - new-children) + changes (-> (pcb/empty-changes it page-id) + (pcb/with-objects objects) + (pcb/add-object new-shape)) - changes (pcb/resize-parents changes - (->> (:redo-changes changes) - (filter #(= :add-obj (:type %))) - (map :id) - (reverse) - (vec))) - undo-id (js/Symbol)] + changes (reduce (fn [changes new-child] + (pcb/add-object changes new-child)) + changes + new-children) - (rx/of (dwu/start-undo-transaction undo-id) - (dch/commit-changes changes) - (dws/select-shapes (d/ordered-set (:id new-shape))) - (ptk/data-event :layout/update {:ids [(:id new-shape)]}) - (dwu/commit-undo-transaction undo-id))) + changes (pcb/resize-parents changes + (->> (:redo-changes changes) + (filter #(= :add-obj (:type %))) + (map :id) + (reverse) + (vec))) + undo-id (js/Symbol)] + + (rx/of (dwu/start-undo-transaction undo-id) + (dch/commit-changes changes) + (when change-selection? + (dws/select-shapes (d/ordered-set (:id new-shape)))) + (ptk/data-event :layout/update {:ids [(:id new-shape)]}) + (dwu/commit-undo-transaction undo-id))) + + (catch :default cause + (js/console.log (.-stack cause)) + (rx/throw {:type :svg-parser + :data cause}))))))) - (catch :default cause - (js/console.log (.-stack cause)) - (rx/throw {:type :svg-parser - :data cause})))))) diff --git a/frontend/src/app/plugins/api.cljs b/frontend/src/app/plugins/api.cljs index 5efaddfc9..5c06da859 100644 --- a/frontend/src/app/plugins/api.cljs +++ b/frontend/src/app/plugins/api.cljs @@ -9,6 +9,7 @@ (:require [app.common.data.macros :as dm] [app.common.files.changes-builder :as cb] + [app.common.geom.point :as gpt] [app.common.record :as cr] [app.common.types.shape :as cts] [app.common.uuid :as uuid] @@ -127,7 +128,14 @@ (createRectangle [_] (create-shape :rect)) - ) + + (createShapeFromSvg + [_ svg-string] + (let [id (uuid/next) + page-id (:current-page-id @st/state)] + (st/emit! (dwm/create-svg-shape id "svg" svg-string (gpt/point 0 0))) + (shape/data->shape-proxy + (dm/get-in @st/state [:workspace-data :pages-index page-id :objects id]))))) (defn create-context [] diff --git a/frontend/src/app/plugins/shape.cljs b/frontend/src/app/plugins/shape.cljs index 56383e38a..27dc930c5 100644 --- a/frontend/src/app/plugins/shape.cljs +++ b/frontend/src/app/plugins/shape.cljs @@ -67,12 +67,12 @@ (appendChild [self child] (let [parent-id (get-data self :id) child-id (uuid/uuid (obj/get child "id"))] - (st/emit! (udw/relocate-shapes #{ child-id } parent-id 0)))) + (st/emit! (udw/relocate-shapes #{child-id} parent-id 0)))) (insertChild [self index child] (let [parent-id (get-data self :id) child-id (uuid/uuid (obj/get child "id"))] - (st/emit! (udw/relocate-shapes #{ child-id } parent-id index))))) + (st/emit! (udw/relocate-shapes #{child-id} parent-id index))))) (crc/define-properties! ShapeProxy @@ -124,16 +124,14 @@ :set (fn [self value] (let [id (get-data self :id) value (mapv #(utils/from-js %) value)] - (st/emit! (dwc/update-shapes [id] #(assoc % :fills value))))) - } + (st/emit! (dwc/update-shapes [id] #(assoc % :fills value)))))} {:name "strokes" :get #(get-state % :strokes make-strokes) :set (fn [self value] (let [id (get-data self :id) value (mapv #(utils/from-js %) value)] - (st/emit! (dwc/update-shapes [id] #(assoc % :strokes value))))) - }) + (st/emit! (dwc/update-shapes [id] #(assoc % :strokes value)))))}) (cond-> (or (cfh/frame-shape? data) (cfh/group-shape? data) (cfh/svg-raw-shape? data) (cfh/bool-shape? data)) (crc/add-properties! -- Gitee From e30c21a71f4cb58ba6865e3997aac7ca878cfec5 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 29 Apr 2024 17:07:01 +0200 Subject: [PATCH 0493/1266] :sparkles: Add relative positioning --- frontend/src/app/plugins/shape.cljs | 56 +++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/frontend/src/app/plugins/shape.cljs b/frontend/src/app/plugins/shape.cljs index 27dc930c5..e285efc9a 100644 --- a/frontend/src/app/plugins/shape.cljs +++ b/frontend/src/app/plugins/shape.cljs @@ -107,6 +107,62 @@ (let [id (get-data self :id)] (st/emit! (udw/update-position id {:y value}))))} + {:name "parentX" + :get (fn [self] + (let [page-id (:current-page-id @st/state) + parent-id (get-state self :parent-id) + parent-x (dm/get-in @st/state [:workspace-data :pages-index page-id :objects parent-id :x])] + (- (get-state self :x) parent-x))) + :set + (fn [self value] + (let [page-id (:current-page-id @st/state) + id (get-data self :id) + parent-id (get-state self :parent-id) + parent-x (dm/get-in @st/state [:workspace-data :pages-index page-id :objects parent-id :x])] + (st/emit! (udw/update-position id {:x (+ parent-x value)}))))} + + {:name "parentY" + :get (fn [self] + (let [page-id (:current-page-id @st/state) + parent-id (get-state self :parent-id) + parent-y (dm/get-in @st/state [:workspace-data :pages-index page-id :objects parent-id :y])] + (- (get-state self :y) parent-y))) + :set + (fn [self value] + (let [page-id (:current-page-id @st/state) + id (get-data self :id) + parent-id (get-state self :parent-id) + parent-y (dm/get-in @st/state [:workspace-data :pages-index page-id :objects parent-id :y])] + (st/emit! (udw/update-position id {:y (+ parent-y value)}))))} + + {:name "frameX" + :get (fn [self] + (let [page-id (:current-page-id @st/state) + frame-id (get-state self :frame-id) + frame-x (dm/get-in @st/state [:workspace-data :pages-index page-id :objects frame-id :x])] + (- (get-state self :x) frame-x))) + :set + (fn [self value] + (let [page-id (:current-page-id @st/state) + id (get-data self :id) + frame-id (get-state self :frame-id) + frame-x (dm/get-in @st/state [:workspace-data :pages-index page-id :objects frame-id :x])] + (st/emit! (udw/update-position id {:x (+ frame-x value)}))))} + + {:name "frameY" + :get (fn [self] + (let [page-id (:current-page-id @st/state) + frame-id (get-state self :frame-id) + frame-y (dm/get-in @st/state [:workspace-data :pages-index page-id :objects frame-id :y])] + (- (get-state self :y) frame-y))) + :set + (fn [self value] + (let [page-id (:current-page-id @st/state) + id (get-data self :id) + frame-id (get-state self :frame-id) + frame-y (dm/get-in @st/state [:workspace-data :pages-index page-id :objects frame-id :y])] + (st/emit! (udw/update-position id {:y (+ frame-y value)}))))} + {:name "width" :get #(get-state % :width)} -- Gitee From 9243ba937d99be869a8a7a57d45c2d02a5657292 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 30 Apr 2024 11:34:50 +0200 Subject: [PATCH 0494/1266] :sparkles: Add to plugins clone and remove --- .../app/main/data/workspace/selection.cljs | 112 ++++++++++-------- frontend/src/app/plugins/shape.cljs | 16 ++- frontend/src/app/plugins/utils.cljs | 28 +++-- frontend/src/app/plugins/viewport.cljs | 27 +++-- 4 files changed, 112 insertions(+), 71 deletions(-) diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index d13921687..b271f1ae6 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -723,62 +723,76 @@ (gpt/subtract new-pos pt-obj))))) +(defn duplicate-shapes + [ids & {:keys [move-delta? alt-duplication? change-selection? return-ref] + :or {move-delta? false alt-duplication? false change-selection? true return-ref nil}}] + (ptk/reify ::duplicate-shapes + ptk/WatchEvent + (watch [it state _] + (let [page (wsh/lookup-page state) + objects (:objects page) + ids (into #{} + (comp (map (d/getf objects)) + (filter #(ctk/allow-duplicate? objects %)) + (map :id)) + ids)] + (when (seq ids) + (let [obj (get objects (first ids)) + delta (if move-delta? + (calc-duplicate-delta obj state objects) + (gpt/point 0 0)) + + file-id (:current-file-id state) + libraries (wsh/get-libraries state) + library-data (wsh/get-file state file-id) + + changes (->> (prepare-duplicate-changes objects page ids delta it libraries library-data file-id) + (duplicate-changes-update-indices objects ids)) + + tags (or (:tags changes) #{}) + + changes (cond-> changes alt-duplication? (assoc :tags (conj tags :alt-duplication))) + + id-original (first ids) + + new-ids (->> changes + :redo-changes + (filter #(= (:type %) :add-obj)) + (filter #(ids (:old-id %))) + (map #(get-in % [:obj :id])) + (into (d/ordered-set))) + + id-duplicated (first new-ids) + + frames (into #{} + (map #(get-in objects [% :frame-id])) + ids) + undo-id (js/Symbol)] + + ;; Warning: This order is important for the focus mode. + (->> (rx/of + (dwu/start-undo-transaction undo-id) + (dch/commit-changes changes) + (when change-selection? + (select-shapes new-ids)) + (ptk/data-event :layout/update {:ids frames}) + (memorize-duplicated id-original id-duplicated) + (dwu/commit-undo-transaction undo-id)) + (rx/tap #(when (some? return-ref) + (reset! return-ref id-duplicated)))))))))) + (defn duplicate-selected ([move-delta?] (duplicate-selected move-delta? false)) ([move-delta? alt-duplication?] (ptk/reify ::duplicate-selected ptk/WatchEvent - (watch [it state _] + (watch [_ state _] (when (or (not move-delta?) (nil? (get-in state [:workspace-local :transform]))) - (let [page (wsh/lookup-page state) - objects (:objects page) - selected (->> (wsh/lookup-selected state) - (map (d/getf objects)) - (filter #(ctk/allow-duplicate? objects %)) - (map :id) - set)] - (when (seq selected) - (let [obj (get objects (first selected)) - delta (if move-delta? - (calc-duplicate-delta obj state objects) - (gpt/point 0 0)) - - file-id (:current-file-id state) - libraries (wsh/get-libraries state) - library-data (wsh/get-file state file-id) - - changes (->> (prepare-duplicate-changes objects page selected delta it libraries library-data file-id) - (duplicate-changes-update-indices objects selected)) - - tags (or (:tags changes) #{}) - - changes (cond-> changes alt-duplication? (assoc :tags (conj tags :alt-duplication))) - - id-original (first selected) - - new-selected (->> changes - :redo-changes - (filter #(= (:type %) :add-obj)) - (filter #(selected (:old-id %))) - (map #(get-in % [:obj :id])) - (into (d/ordered-set))) - - id-duplicated (first new-selected) - - frames (into #{} - (map #(get-in objects [% :frame-id])) - selected) - undo-id (js/Symbol)] - - ;; Warning: This order is important for the focus mode. - (rx/of - (dwu/start-undo-transaction undo-id) - (dch/commit-changes changes) - (select-shapes new-selected) - (ptk/data-event :layout/update {:ids frames}) - (memorize-duplicated id-original id-duplicated) - (dwu/commit-undo-transaction undo-id)))))))))) + (let [selected (wsh/lookup-selected state)] + (rx/of (duplicate-shapes selected + :move-delta? move-delta? + :alt-duplication? alt-duplication?)))))))) (defn change-hover-state [id value] diff --git a/frontend/src/app/plugins/shape.cljs b/frontend/src/app/plugins/shape.cljs index e285efc9a..b537109d7 100644 --- a/frontend/src/app/plugins/shape.cljs +++ b/frontend/src/app/plugins/shape.cljs @@ -15,6 +15,8 @@ [app.common.uuid :as uuid] [app.main.data.workspace :as udw] [app.main.data.workspace.changes :as dwc] + [app.main.data.workspace.selection :as dws] + [app.main.data.workspace.shapes :as dwsh] [app.main.store :as st] [app.plugins.utils :as utils :refer [get-data get-data-fn]] [app.util.object :as obj])) @@ -61,8 +63,18 @@ (st/emit! (udw/update-dimensions [id] :width width) (udw/update-dimensions [id] :height height)))) - (clone [_] (.log js/console (clj->js _data))) - (delete [_] (.log js/console (clj->js _data))) + (clone [self] + (let [id (get-data self :id) + page-id (:current-page-id @st/state) + ret-v (atom nil)] + (st/emit! (dws/duplicate-shapes #{id} :change-selection? false :return-ref ret-v)) + (let [new-id (deref ret-v) + shape (dm/get-in @st/state [:workspace-data :pages-index page-id :objects new-id])] + (data->shape-proxy shape)))) + + (remove [self] + (let [id (get-data self :id)] + (st/emit! (dwsh/delete-shapes #{id})))) (appendChild [self child] (let [parent-id (get-data self :id) diff --git a/frontend/src/app/plugins/utils.cljs b/frontend/src/app/plugins/utils.cljs index 32add7bfd..23d8f276a 100644 --- a/frontend/src/app/plugins/utils.cljs +++ b/frontend/src/app/plugins/utils.cljs @@ -8,12 +8,11 @@ "RPC for plugins runtime." (:require [app.common.data.macros :as dm] + [app.common.spec :as us] [app.common.uuid :as uuid] [app.util.object :as obj] - [cuerdas.core :as str])) - -(def uuid-regex - #"\w{8}-\w{4}-\w{4}-\w{4}-\w{12}") + [cuerdas.core :as str] + [promesa.core :as p])) (defn get-data ([self attr] @@ -42,7 +41,7 @@ (let [v (cond (map? v) (from-js v) - (and (string? v) (re-matches uuid-regex v)) + (and (string? v) (re-matches us/uuid-rx v)) (uuid/uuid v) :else v)] @@ -50,7 +49,6 @@ {} ret))) - (defn to-js "Converts to javascript an camelize the keys" [obj] @@ -65,5 +63,19 @@ obj)] (clj->js result))) - - +(defn result-p + "Creates a pair of atom+promise. The promise will be resolved when the atom gets a value. + We use this to return the promise to the library clients and resolve its value when a value is passed + to the atom" + [] + (let [ret-v (atom nil) + ret-p + (p/create + (fn [resolve _] + (add-watch + ret-v + ::watcher + (fn [_ _ _ value] + (remove-watch ret-v ::watcher) + (resolve value)))))] + [ret-v ret-p])) diff --git a/frontend/src/app/plugins/viewport.cljs b/frontend/src/app/plugins/viewport.cljs index 8d647042a..656a65674 100644 --- a/frontend/src/app/plugins/viewport.cljs +++ b/frontend/src/app/plugins/viewport.cljs @@ -9,6 +9,7 @@ (:require [app.common.data.macros :as dm] [app.common.record :as crc] + [app.common.spec :as us] [app.common.uuid :as uuid] [app.main.data.workspace.viewport :as dwv] [app.main.data.workspace.zoom :as dwz] @@ -46,16 +47,17 @@ :set (fn [_ value] (let [new-x (obj/get value "x") - new-y (obj/get value "y") - vb (dm/get-in @st/state [:workspace-local :vbox]) - old-x (+ (:x vb) (/ (:width vb) 2)) - old-y (+ (:y vb) (/ (:height vb) 2)) - delta-x (- new-x old-x) - delta-y (- new-y old-y) - to-position - {:x #(+ % delta-x) - :y #(+ % delta-y)}] - (st/emit! (dwv/update-viewport-position to-position))))} + new-y (obj/get value "y")] + (when (and (us/safe-number? new-x) (us/safe-number? new-y)) + (let [vb (dm/get-in @st/state [:workspace-local :vbox]) + old-x (+ (:x vb) (/ (:width vb) 2)) + old-y (+ (:y vb) (/ (:height vb) 2)) + delta-x (- new-x old-x) + delta-y (- new-y old-y) + to-position + {:x #(+ % delta-x) + :y #(+ % delta-y)}] + (st/emit! (dwv/update-viewport-position to-position))))))} {:name "zoom" :get @@ -63,8 +65,9 @@ (dm/get-in @st/state [:workspace-local :zoom])) :set (fn [_ value] - (let [z (dm/get-in @st/state [:workspace-local :zoom])] - (st/emit! (dwz/set-zoom (/ value z)))))} + (when (us/safe-number? value) + (let [z (dm/get-in @st/state [:workspace-local :zoom])] + (st/emit! (dwz/set-zoom (/ value z))))))} {:name "bounds" :get -- Gitee From fde0bcfd3e9583f74208f7755149a3962cabf8df Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Fri, 3 May 2024 13:44:31 +0200 Subject: [PATCH 0495/1266] :sparkles: Add grid layout options to context --- .../app/main/data/workspace/shape_layout.cljs | 18 +- frontend/src/app/plugins/grid.cljs | 162 ++++++++++++++++++ frontend/src/app/plugins/shape.cljs | 67 +++++--- frontend/src/app/plugins/utils.cljs | 38 ++-- 4 files changed, 245 insertions(+), 40 deletions(-) create mode 100644 frontend/src/app/plugins/grid.cljs diff --git a/frontend/src/app/main/data/workspace/shape_layout.cljs b/frontend/src/app/main/data/workspace/shape_layout.cljs index 37e40cf91..b3c0d513f 100644 --- a/frontend/src/app/main/data/workspace/shape_layout.cljs +++ b/frontend/src/app/main/data/workspace/shape_layout.cljs @@ -72,7 +72,7 @@ :layout-grid-columns []}) (defn get-layout-initializer - [type from-frame?] + [type from-frame? calculate-params?] (let [[initial-layout-data calculate-params] (case type :flex [initial-flex-layout flex/calculate-params] @@ -87,9 +87,11 @@ (cond-> (not from-frame?) (assoc :show-content true :hide-in-viewer true))) - params (calculate-params objects (cfh/get-immediate-children objects (:id shape)) shape)] + params (when calculate-params? + (calculate-params objects (cfh/get-immediate-children objects (:id shape)) shape))] (cond-> (merge shape params) - (= type :grid) (-> (ctl/assign-cells objects) ctl/reorder-grid-children)))))) + (= type :grid) + (-> (ctl/assign-cells objects) ctl/reorder-grid-children)))))) ;; Never call this directly but through the data-event `:layout/update` ;; Otherwise a lot of cycle dependencies could be generated @@ -124,7 +126,7 @@ (ptk/reify ::finalize)) (defn create-layout-from-id - [id type from-frame?] + [id type & {:keys [from-frame? calculate-params?] :or {from-frame? false calculate-params? true}}] (dm/assert! "expected uuid for `id`" (uuid? id)) @@ -135,7 +137,7 @@ (let [objects (wsh/lookup-page-objects state) parent (get objects id) undo-id (js/Symbol) - layout-initializer (get-layout-initializer type from-frame?)] + layout-initializer (get-layout-initializer type from-frame? calculate-params?)] (rx/of (dwu/start-undo-transaction undo-id) (dch/update-shapes [id] layout-initializer {:with-objects? true}) @@ -177,7 +179,7 @@ (dwse/select-shapes ordered-ids) (dwsh/create-artboard-from-selection new-shape-id parent-id group-index (:name (first selected-shapes))) (cl/remove-all-fills [new-shape-id] {:color clr/black :opacity 1}) - (create-layout-from-id new-shape-id type false) + (create-layout-from-id new-shape-id type) (dch/update-shapes [new-shape-id] #(assoc % :layout-item-h-sizing :auto :layout-item-v-sizing :auto)) (dch/update-shapes selected #(assoc % :layout-item-h-sizing :fix :layout-item-v-sizing :fix)) (dwsh/delete-shapes page-id selected) @@ -188,7 +190,7 @@ (rx/of (dwsh/create-artboard-from-selection new-shape-id) (cl/remove-all-fills [new-shape-id] {:color clr/black :opacity 1}) - (create-layout-from-id new-shape-id type false) + (create-layout-from-id new-shape-id type) (dch/update-shapes [new-shape-id] #(assoc % :layout-item-h-sizing :auto :layout-item-v-sizing :auto)) (dch/update-shapes selected #(assoc % :layout-item-h-sizing :fix :layout-item-v-sizing :fix)))) @@ -227,7 +229,7 @@ (rx/of (dwu/start-undo-transaction undo-id) (if (and single? is-frame?) - (create-layout-from-id (first selected) type true) + (create-layout-from-id (first selected) type :from-frame? true) (create-layout-from-selection type)) (dwu/commit-undo-transaction undo-id)))))) diff --git a/frontend/src/app/plugins/grid.cljs b/frontend/src/app/plugins/grid.cljs new file mode 100644 index 000000000..7dc46bc9e --- /dev/null +++ b/frontend/src/app/plugins/grid.cljs @@ -0,0 +1,162 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.plugins.grid + (:require + [app.common.data :as d] + [app.common.record :as crc] + [app.common.spec :as us] + [app.common.types.shape.layout :as ctl] + [app.main.data.workspace.shape-layout :as dwsl] + [app.main.store :as st] + [app.plugins.utils :as utils :refer [get-data get-state]])) + +(defn- make-tracks + [tracks] + (.freeze + js/Object + (apply array (->> tracks (map utils/to-js))))) + +(deftype GridLayout [_data] + Object + + (addRow + [self type value] + (let [id (get-data self :id) + type (keyword type)] + (st/emit! (dwsl/add-layout-track #{id} :row {:type type :value value})))) + + (addRowAtIndex + [self type value index] + (let [id (get-data self :id) + type (keyword type)] + (st/emit! (dwsl/add-layout-track #{id} :row {:type type :value value} index)))) + + (addColumn + [self type value] + (let [id (get-data self :id) + type (keyword type)] + (st/emit! (dwsl/add-layout-track #{id} :column {:type type :value value})))) + + (addColumnAtIndex + [self type value index] + (let [id (get-data self :id) + type (keyword type)] + (st/emit! (dwsl/add-layout-track #{id} :column {:type type :value value} index)))) + + (removeRow + [self index] + (let [id (get-data self :id)] + (st/emit! (dwsl/remove-layout-track #{id} :row index)))) + + (removeColumn + [self index] + (let [id (get-data self :id)] + (st/emit! (dwsl/remove-layout-track #{id} :column index)))) + + (setColumn + [self index type value] + (let [id (get-data self :id) + type (keyword type)] + (st/emit! (dwsl/change-layout-track #{id} :column index (d/without-nils {:type type :value value}))))) + + (setRow + [self index type value] + (let [id (get-data self :id) + type (keyword type)] + (st/emit! (dwsl/change-layout-track #{id} :row index (d/without-nils {:type type :value value}))))) + + (remove + [self] + (let [id (get-data self :id)] + (st/emit! (dwsl/remove-layout #{id}))))) + +(defn grid-layout-proxy + [data] + (-> (GridLayout. data) + (crc/add-properties! + {:name "dir" + :get #(get-state % :layout-grid-dir d/name) + :set + (fn [self value] + (let [id (get-data self :id) + value (keyword value)] + (when (contains? ctl/grid-direction-types value) + (st/emit! (dwsl/update-layout #{id} {:layout-grid-dir value})))))} + + {:name "rows" + :get #(get-state % :layout-grid-rows make-tracks)} + + {:name "columns" + :get #(get-state % :layout-grid-columns make-tracks)} + + {:name "alignItems" + :get #(get-state % :layout-align-items d/name) + :set + (fn [self value] + (let [id (get-data self :id) + value (keyword value)] + (when (contains? ctl/align-items-types value) + (st/emit! (dwsl/update-layout #{id} {:layout-align-items value})))))} + + {:name "alignContent" + :get #(get-state % :layout-align-content d/name) + :set + (fn [self value] + (let [id (get-data self :id) + value (keyword value)] + (when (contains? ctl/align-content-types value) + (st/emit! (dwsl/update-layout #{id} {:layout-align-content value})))))} + + {:name "justifyItems" + :get #(get-state % :layout-justify-items d/name) + :set + (fn [self value] + (let [id (get-data self :id) + value (keyword value)] + (when (contains? ctl/justify-items-types value) + (st/emit! (dwsl/update-layout #{id} {:layout-justify-items value})))))} + + {:name "justifyContent" + :get #(get-state % :layout-justify-content d/name) + :set + (fn [self value] + (let [id (get-data self :id) + value (keyword value)] + (when (contains? ctl/justify-content-types value) + (st/emit! (dwsl/update-layout #{id} {:layout-justify-content value})))))} + + {:name "rowGap" + :get #(:row-gap (get-state % :layout-gap)) + :set + (fn [self value] + (let [id (get-data self :id)] + (when (us/safe-int? value) + (st/emit! (dwsl/update-layout #{id} {:layout-gap {:row-gap value}})))))} + + {:name "columnGap" + :get #(:column-gap (get-state % :layout-gap)) + :set + (fn [self value] + (let [id (get-data self :id)] + (when (us/safe-int? value) + (st/emit! (dwsl/update-layout #{id} {:layout-gap {:column-gap value}})))))} + + {:name "verticalPadding" + :get #(:p1 (get-state % :layout-padding)) + :set + (fn [self value] + (let [id (get-data self :id)] + (when (us/safe-int? value) + (st/emit! (dwsl/update-layout #{id} {:layout-padding {:p1 value :p3 value}})))))} + + {:name "horizontalPadding" + :get #(:p2 (get-state % :layout-padding)) + :set + (fn [self value] + (let [id (get-data self :id)] + (when (us/safe-int? value) + (st/emit! (dwsl/update-layout #{id} {:layout-padding {:p2 value :p4 value}})))))}))) diff --git a/frontend/src/app/plugins/shape.cljs b/frontend/src/app/plugins/shape.cljs index b537109d7..e4b466b2e 100644 --- a/frontend/src/app/plugins/shape.cljs +++ b/frontend/src/app/plugins/shape.cljs @@ -7,7 +7,6 @@ (ns app.plugins.shape "RPC for plugins runtime." (:require - [app.common.data :as d] [app.common.data.macros :as dm] [app.common.files.helpers :as cfh] [app.common.record :as crc] @@ -16,9 +15,11 @@ [app.main.data.workspace :as udw] [app.main.data.workspace.changes :as dwc] [app.main.data.workspace.selection :as dws] + [app.main.data.workspace.shape-layout :as dwsl] [app.main.data.workspace.shapes :as dwsh] [app.main.store :as st] - [app.plugins.utils :as utils :refer [get-data get-data-fn]] + [app.plugins.grid :as grid] + [app.plugins.utils :as utils :refer [get-data get-data-fn get-state]] [app.util.object :as obj])) (declare data->shape-proxy) @@ -40,23 +41,8 @@ (let [page-id (:current-page-id @st/state)] (dm/get-in @st/state [:workspace-data :pages-index page-id :objects shape-id]))) -(defn- get-state - ([self attr] - (let [id (get-data self :id) - page-id (d/nilv (get-data self :page-id) (:current-page-id @st/state))] - (dm/get-in @st/state [:workspace-data :pages-index page-id :objects id attr]))) - ([self attr mapfn] - (-> (get-state self attr) - (mapfn)))) - -(deftype ShapeProxy [^:mutable #_:clj-kondo/ignore _data] +(deftype ShapeProxy [#_:clj-kondo/ignore _data] Object - (getChildren - [self] - (apply array (->> (get-state self :shapes) - (map locate-shape) - (map data->shape-proxy)))) - (resize [self width height] (let [id (get-data self :id)] @@ -76,6 +62,13 @@ (let [id (get-data self :id)] (st/emit! (dwsh/delete-shapes #{id})))) + ;; Only for frames + groups + booleans + (getChildren + [self] + (apply array (->> (get-state self :shapes) + (map locate-shape) + (map data->shape-proxy)))) + (appendChild [self child] (let [parent-id (get-data self :id) child-id (uuid/uuid (obj/get child "id"))] @@ -84,7 +77,16 @@ (insertChild [self index child] (let [parent-id (get-data self :id) child-id (uuid/uuid (obj/get child "id"))] - (st/emit! (udw/relocate-shapes #{child-id} parent-id index))))) + (st/emit! (udw/relocate-shapes #{child-id} parent-id index)))) + + ;; Only for frames + (addFlexLayout [self] + (let [id (get-data self :id)] + (st/emit! (dwsl/create-layout-from-id id :flex :from-frame? true :calculate-params? false)))) + + (addGridLayout [self] + (let [id (get-data self :id)] + (st/emit! (dwsl/create-layout-from-id id :grid :from-frame? true :calculate-params? false))))) (crc/define-properties! ShapeProxy @@ -206,6 +208,32 @@ {:name "children" :get #(.getChildren ^js %)})) + (cond-> (not (or (cfh/frame-shape? data) (cfh/group-shape? data) (cfh/svg-raw-shape? data) (cfh/bool-shape? data))) + (-> (obj/unset! "appendChild") + (obj/unset! "insertChild") + (obj/unset! "getChildren"))) + + (cond-> (cfh/frame-shape? data) + (-> (crc/add-properties! + {:name "grid" + :get + (fn [self] + (let [layout (get-state self :layout)] + (when (= :grid layout) + (grid/grid-layout-proxy data))))}) + + #_(crc/add-properties! + {:name "flex" + :get + (fn [self] + (let [layout (get-state self :layout)] + (when (= :flex layout) + (flex-layout-proxy data))))}))) + + (cond-> (not (cfh/frame-shape? data)) + (-> (obj/unset! "addGridLayout") + (obj/unset! "addFlexLayout"))) + (cond-> (cfh/text-shape? data) (crc/add-properties! {:name "characters" @@ -213,4 +241,3 @@ :set (fn [self value] (let [id (get-data self :id)] (st/emit! (dwc/update-shapes [id] #(txt/change-text % value)))))})))) - diff --git a/frontend/src/app/plugins/utils.cljs b/frontend/src/app/plugins/utils.cljs index 23d8f276a..35022c36e 100644 --- a/frontend/src/app/plugins/utils.cljs +++ b/frontend/src/app/plugins/utils.cljs @@ -7,9 +7,11 @@ (ns app.plugins.utils "RPC for plugins runtime." (:require + [app.common.data :as d] [app.common.data.macros :as dm] [app.common.spec :as us] [app.common.uuid :as uuid] + [app.main.store :as st] [app.util.object :as obj] [cuerdas.core :as str] [promesa.core :as p])) @@ -32,22 +34,34 @@ (fn [self] (get-data self attr transform-fn)))) +(defn get-state + ([self attr] + (let [id (get-data self :id) + page-id (d/nilv (get-data self :page-id) (:current-page-id @st/state))] + (dm/get-in @st/state [:workspace-data :pages-index page-id :objects id attr]))) + ([self attr mapfn] + (-> (get-state self attr) + (mapfn)))) + (defn from-js "Converts the object back to js" - [obj] - (let [ret (js->clj obj {:keyword-fn (fn [k] (str/camel (name k)))})] - (reduce-kv - (fn [m k v] - (let [v (cond (map? v) - (from-js v) + ([obj] + (from-js obj identity)) + ([obj vfn] + (let [ret (js->clj obj {:keyword-fn (fn [k] (str/camel (name k)))})] + (reduce-kv + (fn [m k v] + (let [k (keyword (str/kebab k)) + v (cond (map? v) + (from-js v) - (and (string? v) (re-matches us/uuid-rx v)) - (uuid/uuid v) + (and (string? v) (re-matches us/uuid-rx v)) + (uuid/uuid v) - :else v)] - (assoc m (keyword (str/kebab k)) v))) - {} - ret))) + :else (vfn k v))] + (assoc m k v))) + {} + ret)))) (defn to-js "Converts to javascript an camelize the keys" -- Gitee From 402b6d4f34fbc01315ad8ce627ce9e7d76e8b2c8 Mon Sep 17 00:00:00 2001 From: Louis Chance Date: Thu, 2 May 2024 13:29:41 +0000 Subject: [PATCH 0496/1266] :globe_with_meridians: Add translations for: French. Currently translated at 100.0% (1379 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/ --- frontend/translations/fr.po | 286 +++++++++++++++++++++++++++++++++++- 1 file changed, 278 insertions(+), 8 deletions(-) diff --git a/frontend/translations/fr.po b/frontend/translations/fr.po index 91571b084..2154077a9 100644 --- a/frontend/translations/fr.po +++ b/frontend/translations/fr.po @@ -1,15 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-24 12:55+0000\n" -"Last-Translator: Anonymous \n" -"Language-Team: French " -"\n" +"PO-Revision-Date: 2024-05-03 13:07+0000\n" +"Last-Translator: Louis Chance \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" -"X-Generator: Weblate 5.5.1-dev\n" +"X-Generator: Weblate 5.5.3\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -1021,7 +1021,6 @@ msgstr "Erreur de connexion, URL inaccessible" msgid "errors.webhooks.invalid-uri" msgstr "L'URL ne passe pas la validation." -#, fuzzy msgid "errors.webhooks.last-delivery" msgstr "Il y a eu une erreur dans le dernier envoi." @@ -3145,7 +3144,6 @@ msgstr "Afficher les interactions au clic" msgid "viewer.header.sitemap" msgstr "Plan du site" -#, fuzzy msgid "webhooks.last-delivery.success" msgstr "Le dernier envoi a réussi." @@ -4621,7 +4619,7 @@ msgid "workspace.shape.menu.add-flex" msgstr "Ajouter flex layout" msgid "workspace.shape.menu.add-grid" -msgstr "Ajouter grid layout" +msgstr "Ajouter disposition en grille" #: src/app/main/ui/workspace/context_menu.cljs msgid "workspace.shape.menu.back" @@ -5044,3 +5042,275 @@ msgstr "Actualiser" msgid "workspace.viewport.click-to-close-path" msgstr "Cliquez pour fermer le chemin" + +#: src/app/main/ui/workspace/sidebar/assets/common.cljs +msgid "workspace.assets.sidebar.components" +msgid_plural "workspace.assets.sidebar.components" +msgstr[0] "1 composant" +msgstr[1] "%s composants" + +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "" +"En créant un compte, vous acceptez nos [conditions d'utilisation](%s) et [" +"politique de confidentialité](%s)." + +msgid "modals.move-shared-confirm.message" +msgid_plural "modals.move-shared-confirm.message" +msgstr[0] "Êtes-vous sûr de vouloir déplacer cette librairie ?" +msgstr[1] "Êtes-vous sûr de vouloir déplacer ces librairies ?" + +msgid "modals.move-shared-confirm.title" +msgid_plural "modals.move-shared-confirm.title" +msgstr[0] "Déplacer librairie" +msgstr[1] "Déplacer librairies" + +msgid "onboarding.team-modal.team-definition" +msgstr "Qu'est-ce qu'une équipe ?" + +msgid "shortcuts.scale" +msgstr "Échelle" + +msgid "shortcuts.toggle-layout-grid" +msgstr "Ajouter / Retirer grid layout" + +msgid "workspace.context-menu.grid-cells.create-board" +msgstr "Créer un tableau" + +msgid "workspace.context-menu.grid-cells.merge" +msgstr "Fusionner les cellules" + +msgid "workspace.context-menu.grid-track.column.add-after" +msgstr "Ajouter une colonne à droite" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.enable-snap-ruler-guides" +msgstr "Aligner aux guides de règles" + +msgid "workspace.layout_grid.editor.options.edit-grid" +msgstr "Éditer la grille" + +msgid "workspace.layout_grid.editor.top-bar.locate" +msgstr "Montrer" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.remove-grid" +msgstr "Supprimer la disposition en grille" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.loading" +msgstr "Chargement…" + +msgid "inspect.attributes.typography.text-transform.unset" +msgstr "Non assigné" + +msgid "labels.share" +msgstr "Partager" + +msgid "labels.search" +msgstr "Rechercher" + +msgid "onboarding.choice.team-up.continue-creating-team" +msgstr "Continuer en créant une équipe" + +msgid "onboarding.choice.team-up.start-without-a-team" +msgstr "Commencer sans équipe" + +msgid "onboarding.choice.team-up.continue-without-a-team" +msgstr "Continuer sans équipe" + +msgid "onboarding.choice.team-up.create-team-and-send-invites" +msgstr "Créer une équipe et envoyer des invitations" + +msgid "onboarding.choice.team-up.start-without-a-team-description" +msgstr "Vous pourrez créer une équipe plus tard." + +msgid "onboarding.choice.team-up.create-team-and-invite" +msgstr "Créer une équipe et inviter" + +msgid "onboarding.choice.team-up.create-team-and-send-invites-description" +msgstr "Vous pourrez envoyer les invitations plus tard" + +msgid "onboarding.choice.team-up.create-team-without-invite" +msgstr "Créer l'équipe" + +msgid "onboarding.choice.team-up.create-team-without-inviting" +msgstr "Créer l'équipe sans inviter" + +msgid "workspace.layout_grid.editor.top-bar.done" +msgstr "Fait" + +msgid "workspace.layout_grid.editor.options.exit" +msgstr "Quitter" + +msgid "workspace.options.component.swap" +msgstr "Échanger composant" + +msgid "workspace.options.component.swap.empty" +msgstr "Cette librairie ne contient aucun élément pour le moment" + +#: src/app/main/ui/workspace/sidebar/options/menus/interactions.cljs +msgid "workspace.options.flows.flow" +msgstr "Flux" + +msgid "media.radial" +msgstr "Radial" + +msgid "media.choose-image" +msgstr "Choisir image" + +msgid "media.gradient" +msgstr "Gradient" + +msgid "workspace.options.guides.title" +msgstr "Guides" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "Connexion à mon compte" + +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "Domaine non autorisé" + +msgid "errors.paste-data-validation" +msgstr "Données du presse-papier invalides" + +msgid "errors.validation" +msgstr "Erreur de validation" + +msgid "media.image" +msgstr "Image" + +msgid "media.image.short" +msgstr "img" + +msgid "media.keep-aspect-ratio" +msgstr "Conserver le ratio" + +msgid "media.linear" +msgstr "Linéaire" + +msgid "media.solid" +msgstr "Solide" + +msgid "modals.move-shared-confirm.accept" +msgid_plural "modals.move-shared-confirm.accept" +msgstr[0] "Déplacer" +msgstr[1] "Déplacer" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "questions.never-used-one" +msgstr "Aucune" + +#: src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs +msgid "settings.select-this-color" +msgstr "Sélectionnez les éléments qui utilisent ce style" + +msgid "shortcuts.toggle-guides" +msgstr "Montrer / Cacher les guides" + +msgid "shortcuts.toggle-rulers" +msgstr "Montrer / Cacher les règles" + +msgid "shortcuts.toggle-snap-guides" +msgstr "Aligner selon les guides" + +msgid "shortcuts.toggle-snap-ruler-guide" +msgstr "Aligner selon les guides de règles" + +msgid "shortcuts.toggle-theme" +msgstr "Changer le thème" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.filter" +msgstr "Filtrer" + +#: src/app/main/ui/workspace/sidebar/assets.cljs +msgid "workspace.assets.sort" +msgstr "Trier" + +msgid "workspace.context-menu.grid-track.column.add-before" +msgstr "Ajouter une colonne à gauche" + +msgid "workspace.context-menu.grid-track.column.delete" +msgstr "Supprimer la colonne" + +msgid "workspace.context-menu.grid-track.column.delete-shapes" +msgstr "Supprimer la colonne et le contenu" + +msgid "workspace.context-menu.grid-track.column.duplicate" +msgstr "Dupliquer la colonne" + +msgid "workspace.context-menu.grid-track.row.add-after" +msgstr "Ajouter une rangée en-dessous" + +msgid "workspace.context-menu.grid-track.row.add-before" +msgstr "Ajouter une rangée au-dessus" + +msgid "workspace.context-menu.grid-track.row.delete" +msgstr "Supprimer la rangée" + +msgid "workspace.context-menu.grid-track.row.delete-shapes" +msgstr "Supprimer la rangée et son contenu" + +msgid "workspace.context-menu.grid-track.row.duplicate" +msgstr "Dupliquer la rangée" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.disable-snap-ruler-guides" +msgstr "Désactiver l'alignement aux guides de règles" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.show-guides" +msgstr "Montrer les guides" + +msgid "workspace.header.menu.toggle-dark-theme" +msgstr "Basculer vers le thème sombre" + +msgid "workspace.header.menu.toggle-light-theme" +msgstr "Basculer vers le thème clair" + +msgid "workspace.layout_grid.editor.padding.expand" +msgstr "Montrer les options de marge intérieure sur les 4 côtés" + +msgid "workspace.layout_grid.editor.top-bar.locate.tooltip" +msgstr "Montrer la disposition en grille" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.shared-library-btn" +msgstr "Connecter librairie" + +#: src/app/main/ui/workspace/libraries.cljs +msgid "workspace.libraries.unlink-library-btn" +msgstr "Déconnecter librairie" + +msgid "workspace.top-bar.read-only.done" +msgstr "Fait" + +#, markdown +msgid "workspace.top-bar.view-only" +msgstr "**Inspection du code** (Vue uniquement)" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-tagline" +msgstr "" +"Penpot est l'outil de design libre et open-source pour la collaboration " +"entre Design et Développement" + +msgid "dashboard.import.analyze-error.components-v2" +msgstr "" +"Fichier avec composants v2 activé mais n'est pas encore supporté par cette " +"équipe." + +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "Le fournisseur d'authentification n'est pas autorisé pour ce profil" + +#: src/app/main/ui/workspace/header.cljs +msgid "workspace.header.menu.hide-guides" +msgstr "Cacher les guides" + +msgid "workspace.context-menu.grid-cells.area" +msgstr "Créer une zone" -- Gitee From 5f560426fad3fef273ff6c9797463b9fb3393d38 Mon Sep 17 00:00:00 2001 From: Stas Haas Date: Thu, 2 May 2024 12:47:03 +0000 Subject: [PATCH 0497/1266] :globe_with_meridians: Add translations for: Russian. Currently translated at 57.5% (794 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/ --- frontend/translations/ru.po | 136 ++++++++++++++++++++++++++++++++++-- 1 file changed, 132 insertions(+), 4 deletions(-) diff --git a/frontend/translations/ru.po b/frontend/translations/ru.po index 8ec32ba61..d893474ed 100644 --- a/frontend/translations/ru.po +++ b/frontend/translations/ru.po @@ -1,15 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-01-23 15:01+0000\n" +"PO-Revision-Date: 2024-05-03 13:07+0000\n" "Last-Translator: Stas Haas \n" -"Language-Team: Russian " -"\n" +"Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.5.3\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -3025,3 +3025,131 @@ msgstr "Обновить" msgid "workspace.viewport.click-to-close-path" msgstr "Нажмите для замыкания контура" + +msgid "workspace.undo.entry.multiple.multiple" +msgstr "объекты" + +msgid "workspace.undo.entry.single.page" +msgstr "страница" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.copied-success" +msgstr "Токен скопирован" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsetx" +msgstr "X" + +#: src/app/main/ui/workspace/sidebar/options/menus/fill.cljs +msgid "workspace.options.show-fill-on-export" +msgstr "Показать в экспорте" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.circle-marker-short" +msgstr "Круг" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow" +msgstr "Треугольная стрела" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.square-marker-short" +msgstr "Прямоугольник" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.lock" +msgstr "Заблокировать" + +#: src/app/main/ui/workspace/sidebar/history.cljs +msgid "workspace.undo.entry.new" +msgstr "Новый: %s" + +msgid "workspace.undo.entry.multiple.group" +msgstr "группы" + +msgid "workspace.undo.entry.single.component" +msgstr "компонент" + +msgid "workspace.undo.entry.single.circle" +msgstr "круг" + +msgid "workspace.undo.entry.single.multiple" +msgstr "объект" + +#: src/app/main/data/workspace/libraries.cljs +msgid "workspace.updates.more-info" +msgstr "Дополнительная информация" + +msgid "workspace.top-bar.read-only.done" +msgstr "Готово" + +#: src/app/main/ui/workspace/left_toolbar.cljs +msgid "workspace.toolbar.shortcuts" +msgstr "Сочетание клавиш (%s)" + +msgid "workspace.sidebar.layers.shapes" +msgstr "Формы" + +msgid "workspace.undo.entry.multiple.page" +msgstr "страницы" + +msgid "workspace.shape.menu.intersection" +msgstr "Пересечь" + +#: src/app/main/ui/workspace/sidebar/options/menus/shadow.cljs +msgid "workspace.options.shadow-options.offsety" +msgstr "Y" + +#: src/app/main/ui/workspace/sidebar/options/menus/stroke.cljs +msgid "workspace.options.stroke-cap.triangle-arrow-short" +msgstr "Треугольник" + +msgid "workspace.undo.entry.multiple.shape" +msgstr "формы" + +msgid "workspace.undo.entry.multiple.circle" +msgstr "круги" + +#: src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.unlock" +msgstr "Paзблокировать" + +msgid "workspace.sidebar.collapse" +msgstr "Свернуть боковую панель" + +msgid "workspace.options.width" +msgstr "Ширина" + +#: src/app/main/ui/workspace/context_menu.cljs, src/app/main/ui/workspace/context_menu.cljs +msgid "workspace.shape.menu.paste" +msgstr "Вставить" + +msgid "workspace.undo.entry.single.shape" +msgstr "форма" + +msgid "workspace.undo.entry.single.text" +msgstr "текст" + +msgid "workspace.undo.entry.single.image" +msgstr "изображение" + +msgid "workspace.undo.entry.multiple.text" +msgstr "тексты" + +msgid "workspace.sidebar.layers.texts" +msgstr "Тексты" + +msgid "workspace.sidebar.layers.masks" +msgstr "Маски" + +msgid "workspace.sidebar.layers.images" +msgstr "Изображения" + +msgid "workspace.sidebar.layers.groups" +msgstr "Группы" + +msgid "workspace.sidebar.expand" +msgstr "Расширить боковую панель" + +msgid "workspace.shape.menu.union" +msgstr "Суммировать" -- Gitee From f575650379fa44ceccd87776b2a0b91cc0cd4a61 Mon Sep 17 00:00:00 2001 From: Andy Li Date: Sat, 4 May 2024 08:16:25 +0000 Subject: [PATCH 0498/1266] :globe_with_meridians: Add translations for: Chinese (Traditional). Currently translated at 46.7% (644 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/ --- frontend/translations/zh_Hant.po | 136 +++++++++++++++++++++++++++++-- 1 file changed, 131 insertions(+), 5 deletions(-) diff --git a/frontend/translations/zh_Hant.po b/frontend/translations/zh_Hant.po index 5f14d51cb..695a21a59 100644 --- a/frontend/translations/zh_Hant.po +++ b/frontend/translations/zh_Hant.po @@ -1,15 +1,15 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-04-24 13:04+0000\n" -"Last-Translator: Anonymous \n" -"Language-Team: Chinese (Traditional) " -"\n" +"PO-Revision-Date: 2024-05-05 05:07+0000\n" +"Last-Translator: Andy Li \n" +"Language-Team: Chinese (Traditional) \n" "Language: zh_Hant\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.5.1-dev\n" +"X-Generator: Weblate 5.5.3\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -2316,3 +2316,129 @@ msgstr "更新" msgid "workspace.viewport.click-to-close-path" msgstr "點擊以關閉路徑" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-never" +msgstr "從不" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-60-days" +msgstr "60 天" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-not-expire" +msgstr "權杖沒有到期時間" + +#: src/app/main/ui/auth/register.cljs +#, markdown +msgid "auth.terms-privacy-agreement-md" +msgstr "當你創立新的帳號,代表你同意我們的 [服務條款](%s) 與 [隱私權政策](%s)。" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-180-days" +msgstr "180 天" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-30-days" +msgstr "30 天" + +#, fuzzy +msgid "dashboard.export.options.all.message" +msgstr "使用了共用資料庫的檔案將被包含在匯出內,並保持他們的連結關係。" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create" +msgstr "產生新的 Token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.no-access-tokens" +msgstr "你目前還沒有 Tokens。" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.empty.add-one" +msgstr "按下\"產生新 Token\" 按鈕來產生一個。" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.create.success" +msgstr "已成功建立 Access Token。" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.no-expiration" +msgstr "沒有到期時間" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.copied-success" +msgstr "已複製 Token" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.errors-required-name" +msgstr "名稱是必填的" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.token-will-expire" +msgstr "權杖將於 %s 到期" + +msgid "dashboard.export.options.merge.title" +msgstr "將共享資料庫的內容加入檔案資料庫" + +#: src/app/main/ui/settings/team-form.cljs, src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.not-all-space" +msgstr "名稱內必須包含空白以外的文字。" + +#: src/app/main/ui/auth/register.cljs, src/app/main/ui/dashboard/team_form.cljs, src/app/main/ui/onboarding/team_choice.cljs, src/app/main/ui/settings/access_tokens.cljs, src/app/main/ui/settings/feedback.cljs, src/app/main/ui/settings/profile.cljs, src/app/main/ui/workspace/sidebar/assets.cljs +msgid "auth.name.too-long" +msgstr "名稱最多包含 250 個字元。" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expiration-90-days" +msgstr "90 天" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expires-on" +msgstr "將於 %s 過期" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.expired-on" +msgstr "已於 %s 過期" + +#: src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.success-delete-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "已成功刪除您的檔案" + +#: src/app/main/ui/dashboard/file_menu.cljs +#, fuzzy +msgid "dashboard.success-duplicate-file" +msgid_plural "dashboard.success-delete-file" +msgstr[0] "已成功為您的檔案建立副本" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-account-title" +msgstr "登入我的帳號" + +#: src/app/main/ui/auth/login.cljs +msgid "auth.login-tagline" +msgstr "Penpot 是用於設計與開發協作,免費且開源的設計工具" + +#: src/app/main/ui/onboarding/questions.cljs +msgid "branding-illustrations-marketing-pieces" +msgstr "...品牌設計、插畫、行銷素材等。" + +#: src/app/main/ui/auth/register.cljs +msgid "auth.password-not-empty" +msgstr "密碼必須包含空白以外的字元。" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal" +msgstr "個人存取權杖" + +msgid "dashboard.export.options.detach.message" +msgstr "共用資料庫將不包含在匯出檔案內,且資產不會被加入資料庫。 " + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.remove-shared" +msgstr "不再作為共用資料庫" + +#: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs +msgid "dashboard.unpublish-shared" +msgstr "取消發佈資料庫" -- Gitee From 7117ea1f7ec195f3662548c636844156247d6074 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Fri, 3 May 2024 15:00:51 +0200 Subject: [PATCH 0499/1266] :bug: Fix style scoping problem with imported SVG --- CHANGES.md | 1 + frontend/src/app/main/ui/context.cljs | 1 + frontend/src/app/main/ui/shapes/group.cljs | 31 +++++++++++++------- frontend/src/app/main/ui/shapes/svg_raw.cljs | 13 +++++++- 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 3df22277a..70ca6e42c 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -10,6 +10,7 @@ ### :bug: Bugs fixed - Fix color palette sorting [Taiga Issue #7458](https://tree.taiga.io/project/penpot/issue/7458) +- Fix style scoping problem with imported SVG [Taiga #7671](https://tree.taiga.io/project/penpot/issue/7671) ## 2.0.1 diff --git a/frontend/src/app/main/ui/context.cljs b/frontend/src/app/main/ui/context.cljs index bfe0fa6ee..1aa4b532b 100644 --- a/frontend/src/app/main/ui/context.cljs +++ b/frontend/src/app/main/ui/context.cljs @@ -17,6 +17,7 @@ (def current-page-id (mf/create-context nil)) (def current-file-id (mf/create-context nil)) (def current-vbox (mf/create-context nil)) +(def current-svg-root-id (mf/create-context nil)) (def active-frames (mf/create-context nil)) (def render-thumbnails (mf/create-context nil)) diff --git a/frontend/src/app/main/ui/shapes/group.cljs b/frontend/src/app/main/ui/shapes/group.cljs index 8b3ad40ce..e2b3fdd35 100644 --- a/frontend/src/app/main/ui/shapes/group.cljs +++ b/frontend/src/app/main/ui/shapes/group.cljs @@ -17,6 +17,7 @@ (mf/fnc group-shape {::mf/wrap-props false} [props] + (let [shape (unchecked-get props "shape") childs (unchecked-get props "childs") render-id (mf/use-ctx muc/render-id) @@ -36,21 +37,31 @@ mask-props (if ^boolean masked-group? #js {:mask (mask-url render-id mask)} - #js {})] + #js {}) + + current-svg-root-id (mf/use-ctx muc/current-svg-root-id) + + ;; We need to create a "scope" for svg classes. The root of the imported SVG (first group) will + ;; be stored in the context. When rendering the styles we add its id as prefix. + [svg-wrapper svg-wrapper-props] + (if (and (contains? shape :svg-attrs) (not current-svg-root-id)) + [(mf/provider muc/current-svg-root-id) #js {:value (:id shape)}] + [mf/Fragment #js {}])] ;; We need to separate mask and clip into two because a bug in ;; Firefox breaks when the group has clip+mask+foreignObject ;; Clip and mask separated will work in every platform Firefox ;; bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1734805 - [:> wrapper clip-props - [:> wrapper mask-props - (when ^boolean masked-group? - [:& render-mask {:mask mask}]) - - (for [item childs] - [:& shape-wrapper - {:shape item - :key (dm/str (dm/get-prop item :id))}])]])))) + [:> svg-wrapper svg-wrapper-props + [:> wrapper clip-props + [:> wrapper mask-props + (when ^boolean masked-group? + [:& render-mask {:mask mask}]) + + (for [item childs] + [:& shape-wrapper + {:shape item + :key (dm/str (dm/get-prop item :id))}])]]])))) diff --git a/frontend/src/app/main/ui/shapes/svg_raw.cljs b/frontend/src/app/main/ui/shapes/svg_raw.cljs index 49578d08d..2c8b57bce 100644 --- a/frontend/src/app/main/ui/shapes/svg_raw.cljs +++ b/frontend/src/app/main/ui/shapes/svg_raw.cljs @@ -104,9 +104,20 @@ svg-root? (and (map? content) (= tag :svg)) svg-tag? (map? content) svg-leaf? (string? content) - valid-tag? (contains? csvg/svg-tags tag)] + valid-tag? (contains? csvg/svg-tags tag) + + current-svg-root-id (mf/use-ctx muc/current-svg-root-id) + + ;; We need to create a "scope" for svg classes. The root of the imported SVG (first group) will + ;; be stored in the context and with this we scoped the styles: + style-content + (when (= tag :style) + (dm/str "#shape-" current-svg-root-id "{ " (->> shape :content :content (str/join "\n")) " }"))] (cond + (= tag :style) + [:style style-content] + ^boolean svg-root? [:& svg-root {:shape shape} (for [item childs] -- Gitee From ca7f17efd1d2b9eaf98af68788875d6cf3532f99 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 6 May 2024 12:01:39 +0200 Subject: [PATCH 0500/1266] :sparkles: Add items to grid cells --- common/src/app/common/types/shape/layout.cljc | 36 +++++++++++++------ .../app/main/data/workspace/svg_upload.cljs | 1 - .../app/main/data/workspace/transforms.cljs | 23 ++++++++---- .../src/app/main/data/workspace/zoom.cljs | 1 - frontend/src/app/plugins/grid.cljs | 15 ++++++-- 5 files changed, 55 insertions(+), 21 deletions(-) diff --git a/common/src/app/common/types/shape/layout.cljc b/common/src/app/common/types/shape/layout.cljc index d6c1178bd..7f5e6e83a 100644 --- a/common/src/app/common/types/shape/layout.cljc +++ b/common/src/app/common/types/shape/layout.cljc @@ -1281,6 +1281,21 @@ (let [cells+index (d/enumerate cells)] (d/seek #(in-cell? (second %) row column) cells+index))) +(defn free-cell-shapes + "Removes the shape-ids from the cells previously assigned." + [parent shape-ids] + (let [shape-ids (set shape-ids)] + (letfn [(free-cells + [cells] + (reduce-kv + (fn [m k v] + (if (some shape-ids (:shapes v)) + (assoc-in m [k :shapes] []) + m)) + cells + cells))] + (update parent :layout-grid-cells free-cells)))) + (defn push-into-cell "Push the shapes into the row/column cell and moves the rest" [parent shape-ids row column] @@ -1295,16 +1310,17 @@ ;; Move shift the `shapes` attribute between cells (->> (range start-index (inc to-index)) (map vector shape-ids) - (reduce (fn [[parent cells] [shape-id idx]] - ;; If the shape to put in a cell is the same that is already in the cell we do nothing - (if (= shape-id (get-in parent [:layout-grid-cells (get-in cells [idx :id]) :shapes 0])) - [parent cells] - (let [[parent cells] (free-cell-push parent cells idx)] - [(update-in parent [:layout-grid-cells (get-in cells [idx :id])] - assoc :position :manual - :shapes [shape-id]) - cells]))) - [parent cells]) + (reduce + (fn [[parent cells] [shape-id idx]] + ;; If the shape to put in a cell is the same that is already in the cell we do nothing + (if (= shape-id (get-in parent [:layout-grid-cells (get-in cells [idx :id]) :shapes 0])) + [parent cells] + (let [[parent cells] (free-cell-push parent cells idx)] + [(update-in parent [:layout-grid-cells (get-in cells [idx :id])] + assoc :position :manual + :shapes [shape-id]) + cells]))) + [parent cells]) (first))) parent))) diff --git a/frontend/src/app/main/data/workspace/svg_upload.cljs b/frontend/src/app/main/data/workspace/svg_upload.cljs index 2517a73aa..d81d8ecb3 100644 --- a/frontend/src/app/main/data/workspace/svg_upload.cljs +++ b/frontend/src/app/main/data/workspace/svg_upload.cljs @@ -112,7 +112,6 @@ (dwu/commit-undo-transaction undo-id))) (catch :default cause - (js/console.log (.-stack cause)) (rx/throw {:type :svg-parser :data cause}))))))) diff --git a/frontend/src/app/main/data/workspace/transforms.cljs b/frontend/src/app/main/data/workspace/transforms.cljs index 05289294d..4fc56d2ce 100644 --- a/frontend/src/app/main/data/workspace/transforms.cljs +++ b/frontend/src/app/main/data/workspace/transforms.cljs @@ -831,7 +831,7 @@ :ignore-constraints false :ignore-snap-pixel true})))))) -(defn- move-shapes-to-frame +(defn move-shapes-to-frame [ids frame-id drop-index [row column :as cell]] (ptk/reify ::move-shapes-to-frame ptk/WatchEvent @@ -923,24 +923,32 @@ changes (-> (pcb/empty-changes it page-id) (pcb/with-objects objects) + ;; Remove layout-item properties when moving a shape outside a layout (cond-> (not (ctl/any-layout? objects frame-id)) (pcb/update-shapes moving-shapes-ids ctl/remove-layout-item-data)) + ;; Remove the swap slots if it is moving to a different component - (pcb/update-shapes child-heads - (fn [shape] - (cond-> shape - (not= component-main-frame (ctn/find-component-main objects shape false)) - (ctk/remove-swap-slot)))) + (pcb/update-shapes + child-heads + (fn [shape] + (cond-> shape + (not= component-main-frame (ctn/find-component-main objects shape false)) + (ctk/remove-swap-slot)))) + ;; Remove component-root property when moving a shape inside a component (cond-> (ctn/get-instance-root objects frame) (pcb/update-shapes moving-shapes-children-ids #(dissoc % :component-root))) + ;; Add component-root property when moving a component outside a component (cond-> (not (ctn/get-instance-root objects frame)) (pcb/update-shapes child-heads #(assoc % :component-root true))) + (pcb/update-shapes moving-shapes-ids #(cond-> % (cfh/frame-shape? %) (assoc :hide-in-viewer true))) (pcb/update-shapes shape-ids-to-detach ctk/detach-shape) (pcb/change-parent frame-id moving-shapes drop-index) + + ;; Change the grid cell in a grid layout (cond-> (ctl/grid-layout? objects frame-id) (-> (pcb/update-shapes [frame-id] @@ -948,7 +956,8 @@ (-> frame ;; Assign the cell when pushing into a specific grid cell (cond-> (some? cell) - (-> (ctl/push-into-cell moving-shapes-ids row column) + (-> (ctl/free-cell-shapes moving-shapes-ids) + (ctl/push-into-cell moving-shapes-ids row column) (ctl/assign-cells objects))) (ctl/assign-cell-positions objects))) {:with-objects? true}) diff --git a/frontend/src/app/main/data/workspace/zoom.cljs b/frontend/src/app/main/data/workspace/zoom.cljs index 8672544fd..6499f93a2 100644 --- a/frontend/src/app/main/data/workspace/zoom.cljs +++ b/frontend/src/app/main/data/workspace/zoom.cljs @@ -127,7 +127,6 @@ state (let [page-id (:current-page-id state) objects (wsh/lookup-page-objects state page-id) - _ (prn "??" (->> ids (map #(get objects %)) (map :name))) srect (->> ids (map #(get objects %)) (gsh/shapes->rect))] diff --git a/frontend/src/app/plugins/grid.cljs b/frontend/src/app/plugins/grid.cljs index 7dc46bc9e..07cb39c9a 100644 --- a/frontend/src/app/plugins/grid.cljs +++ b/frontend/src/app/plugins/grid.cljs @@ -10,9 +10,13 @@ [app.common.record :as crc] [app.common.spec :as us] [app.common.types.shape.layout :as ctl] + [app.common.uuid :as uuid] [app.main.data.workspace.shape-layout :as dwsl] + [app.main.data.workspace.transforms :as dwt] [app.main.store :as st] - [app.plugins.utils :as utils :refer [get-data get-state]])) + [app.plugins.utils :as utils :refer [get-data get-state]] + [app.util.object :as obj] + [potok.v2.core :as ptk])) (defn- make-tracks [tracks] @@ -72,7 +76,14 @@ (remove [self] (let [id (get-data self :id)] - (st/emit! (dwsl/remove-layout #{id}))))) + (st/emit! (dwsl/remove-layout #{id})))) + + (appendChild + [self child row column] + (let [parent-id (get-data self :id) + child-id (uuid/uuid (obj/get child "id"))] + (st/emit! (dwt/move-shapes-to-frame #{child-id} parent-id nil [row column]) + (ptk/data-event :layout/update {:ids [parent-id]}))))) (defn grid-layout-proxy [data] -- Gitee From 7280dfd3f7353fe136c8c1ba39fbe02b2a1a2675 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Mon, 6 May 2024 15:37:21 +0200 Subject: [PATCH 0501/1266] :sparkles: Tests for remove swap slot on move shapes to frame --- .../app/common/files/libraries_helpers.cljc | 128 +++++++++++++++ .../logic/comp_remove_swap_slots_test.cljc | 146 +++++++++++++++++- .../app/main/data/workspace/transforms.cljs | 133 +--------------- 3 files changed, 278 insertions(+), 129 deletions(-) diff --git a/common/src/app/common/files/libraries_helpers.cljc b/common/src/app/common/files/libraries_helpers.cljc index 9ac32219f..6df368eb6 100644 --- a/common/src/app/common/files/libraries_helpers.cljc +++ b/common/src/app/common/files/libraries_helpers.cljc @@ -2301,3 +2301,131 @@ ;; Resize parent containers that need to (pcb/resize-parents parents)))) + + +(defn generate-move-shapes-to-frame + [changes ids frame-id page-id objects drop-index [row column :as cell]] + (let [lookup (d/getf objects) + frame (get objects frame-id) + layout? (:layout frame) + + component-main-frame (ctn/find-component-main objects frame false) + + shapes (->> ids + (cfh/clean-loops objects) + (keep lookup) + ;;remove shapes inside copies, because we can't change the structure of copies + (remove #(ctk/in-component-copy? (get objects (:parent-id %))))) + + moving-shapes + (cond->> shapes + (not layout?) + (remove #(= (:frame-id %) frame-id)) + + layout? + (remove #(and (= (:frame-id %) frame-id) + (not= (:parent-id %) frame-id)))) + + ordered-indexes (cfh/order-by-indexed-shapes objects (map :id moving-shapes)) + moving-shapes (map (d/getf objects) ordered-indexes) + + all-parents + (reduce (fn [res id] + (into res (cfh/get-parent-ids objects id))) + (d/ordered-set) + ids) + + find-all-empty-parents + (fn recursive-find-empty-parents [empty-parents] + (let [all-ids (into empty-parents ids) + contains? (partial contains? all-ids) + xform (comp (map lookup) + (filter cfh/group-shape?) + (remove #(->> (:shapes %) (remove contains?) seq)) + (map :id)) + parents (into #{} xform all-parents)] + (if (= empty-parents parents) + empty-parents + (recursive-find-empty-parents parents)))) + + empty-parents + ;; Any empty parent whose children are moved to another frame should be deleted + (if (empty? moving-shapes) + #{} + (into (d/ordered-set) (find-all-empty-parents #{}))) + + ;; Not move absolute shapes that won't change parent + moving-shapes + (->> moving-shapes + (remove (fn [shape] + (and (ctl/position-absolute? shape) + (= frame-id (:parent-id shape)))))) + + frame-component + (ctn/get-component-shape objects frame) + + shape-ids-to-detach + (reduce (fn [result shape] + (if (and (some? shape) (ctk/in-component-copy-not-head? shape)) + (let [shape-component (ctn/get-component-shape objects shape)] + (if (= (:id frame-component) (:id shape-component)) + result + (into result (cfh/get-children-ids-with-self objects (:id shape))))) + result)) + #{} + moving-shapes) + + moving-shapes-ids + (map :id moving-shapes) + + moving-shapes-children-ids + (->> moving-shapes-ids + (mapcat #(cfh/get-children-ids-with-self objects %))) + + child-heads + (->> moving-shapes-ids + (mapcat #(ctn/get-child-heads objects %)) + (map :id))] + (-> changes + (pcb/with-page-id page-id) + (pcb/with-objects objects) + + ;; Remove layout-item properties when moving a shape outside a layout + (cond-> (not (ctl/any-layout? objects frame-id)) + (pcb/update-shapes moving-shapes-ids ctl/remove-layout-item-data)) + + ;; Remove the swap slots if it is moving to a different component + (pcb/update-shapes + child-heads + (fn [shape] + (cond-> shape + (not= component-main-frame (ctn/find-component-main objects shape false)) + (ctk/remove-swap-slot)))) + + ;; Remove component-root property when moving a shape inside a component + (cond-> (ctn/get-instance-root objects frame) + (pcb/update-shapes moving-shapes-children-ids #(dissoc % :component-root))) + + ;; Add component-root property when moving a component outside a component + (cond-> (not (ctn/get-instance-root objects frame)) + (pcb/update-shapes child-heads #(assoc % :component-root true))) + + (pcb/update-shapes moving-shapes-ids #(cond-> % (cfh/frame-shape? %) (assoc :hide-in-viewer true))) + (pcb/update-shapes shape-ids-to-detach ctk/detach-shape) + (pcb/change-parent frame-id moving-shapes drop-index) + + ;; Change the grid cell in a grid layout + (cond-> (ctl/grid-layout? objects frame-id) + (-> (pcb/update-shapes + [frame-id] + (fn [frame objects] + (-> frame + ;; Assign the cell when pushing into a specific grid cell + (cond-> (some? cell) + (-> (ctl/free-cell-shapes moving-shapes-ids) + (ctl/push-into-cell moving-shapes-ids row column) + (ctl/assign-cells objects))) + (ctl/assign-cell-positions objects))) + {:with-objects? true}) + (pcb/reorder-grid-children [frame-id]))) + (pcb/remove-objects empty-parents)))) diff --git a/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc b/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc index 5773b1df0..ede14008d 100644 --- a/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc +++ b/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc @@ -60,7 +60,7 @@ changes (cflh/generate-relocate-shapes (pcb/empty-changes nil) (:objects page) #{(:parent-id blue1)} ;; parents - uuid/zero ;; paremt-id + uuid/zero ;; parent-id (:id page) ;; page-id 0 ;; to-index #{(:id blue1)}) ;; ids @@ -77,6 +77,34 @@ (t/is (some? blue1')) (t/is (nil? (ctk/get-swap-slot blue1'))))) +(t/deftest test-keep-swap-slot-move-blue1-to-root + (let [;; ============================== Setup =============================== + file (setup-file) + page (thf/current-page file) + blue1 (thf/get-shape file :blue1) + + ;; ============================== Action ============================== + changes (cflh/generate-move-shapes-to-frame (pcb/empty-changes nil) + #{(:id blue1)} ;; ids + uuid/zero ;; frame-id + (:id page) ;; page-id + (:objects page) ;; objects + 0 ;; drop-index + nil) ;; cell + + file' (thf/apply-changes file changes) + + ;; ============================== Get ================================= + blue1' (thf/get-shape file' :blue1)] + + ;; ================================== Check =============================== + ;; blue1 had swap-id before move + (t/is (some? (ctk/get-swap-slot blue1))) + + ;; blue1 has not swap-id after move + (t/is (some? blue1')) + (t/is (nil? (ctk/get-swap-slot blue1'))))) + (t/deftest test-keep-swap-slot-relocating-blue1-to-b2 (let [;; ============================== Setup =============================== @@ -107,6 +135,36 @@ (t/is (some? blue1')) (t/is (nil? (ctk/get-swap-slot blue1'))))) +(t/deftest test-keep-swap-slot-move-blue1-to-b2 + (let [;; ============================== Setup =============================== + file (setup-file) + page (thf/current-page file) + blue1 (thf/get-shape file :blue1) + b2 (thf/get-shape file :frame-b2) + + + ;; ============================== Action ============================== + changes (cflh/generate-move-shapes-to-frame (pcb/empty-changes nil) + #{(:id blue1)} ;; ids + (:id b2) ;; frame-id + (:id page) ;; page-id + (:objects page) ;; objects + 0 ;; drop-index + nil) ;; cell + + file' (thf/apply-changes file changes) + + ;; ============================== Get ================================= + blue1' (thf/get-shape file' :blue1)] + + ;; ================================== Check =============================== + ;; blue1 had swap-id before move + (t/is (some? (ctk/get-swap-slot blue1))) + + ;; blue1 has not swap-id after move + (t/is (some? blue1')) + (t/is (nil? (ctk/get-swap-slot blue1'))))) + (t/deftest test-keep-swap-slot-relocating-yellow-to-root (let [;; ============================== Setup =============================== file (setup-file) @@ -149,6 +207,48 @@ (t/is (some? blue1'')) (t/is (nil? (ctk/get-swap-slot blue1''))))) +(t/deftest test-keep-swap-slot-move-yellow-to-root + (let [;; ============================== Setup =============================== + file (setup-file) + page (thf/current-page file) + blue1 (thf/get-shape file :blue1) + yellow (thf/get-shape file :frame-yellow) + + ;; ============================== Action ============================== + ;; Move blue1 into yellow + changes (cflh/generate-move-shapes-to-frame (pcb/empty-changes nil) + #{(:id blue1)} ;; ids + (:id yellow) ;; frame-id + (:id page) ;; page-id + (:objects page) ;; objects + 0 ;; drop-index + nil) ;; cell + + file' (thf/apply-changes file changes) + page' (thf/current-page file') + yellow' (thf/get-shape file' :frame-yellow) + + ;; Move yellow into root + changes' (cflh/generate-move-shapes-to-frame (pcb/empty-changes nil) + #{(:id yellow')} ;; ids + uuid/zero ;; frame-id + (:id page') ;; page-id + (:objects page') ;; objects + 0 ;; drop-index + nil) ;; cell + file'' (thf/apply-changes file' changes') + + ;; ============================== Get ================================= + blue1'' (thf/get-shape file'' :blue1)] + + ;; ================================== Check =============================== + ;; blue1 had swap-id before move + (t/is (some? (ctk/get-swap-slot blue1))) + + ;; blue1 has not swap-id after move + (t/is (some? blue1'')) + (t/is (nil? (ctk/get-swap-slot blue1''))))) + (t/deftest test-keep-swap-slot-relocating-yellow-to-b2 (let [;; ============================== Setup =============================== @@ -192,3 +292,47 @@ ;; blue1 has not swap-id after move (t/is (some? blue1'')) (t/is (nil? (ctk/get-swap-slot blue1''))))) + +(t/deftest test-keep-swap-slot-move-yellow-to-b2 + (let [;; ============================== Setup =============================== + file (setup-file) + page (thf/current-page file) + blue1 (thf/get-shape file :blue1) + yellow (thf/get-shape file :frame-yellow) + + ;; ============================== Action ============================== + ;; Move blue1 into yellow + changes (cflh/generate-move-shapes-to-frame (pcb/empty-changes nil) + #{(:id blue1)} ;; ids + (:id yellow) ;; frame-id + (:id page) ;; page-id + (:objects page) ;; objects + 0 ;; drop-index + nil) ;; cell + + file' (thf/apply-changes file changes) + page' (thf/current-page file') + yellow' (thf/get-shape file' :frame-yellow) + b2' (thf/get-shape file' :frame-b2) + + ;; Move yellow into b2 + changes' (cflh/generate-move-shapes-to-frame (pcb/empty-changes nil) + #{(:id yellow')} ;; ids + (:id b2') ;; frame-id + (:id page') ;; page-id + (:objects page') ;; objects + 0 ;; drop-index + nil) ;; cell + + file'' (thf/apply-changes file' changes') + + ;; ============================== Get ================================= + blue1'' (thf/get-shape file'' :blue1)] + + ;; ================================== Check =============================== + ;; blue1 had swap-id before move + (t/is (some? (ctk/get-swap-slot blue1))) + + ;; blue1 has not swap-id after move + (t/is (some? blue1'')) + (t/is (nil? (ctk/get-swap-slot blue1''))))) diff --git a/frontend/src/app/main/data/workspace/transforms.cljs b/frontend/src/app/main/data/workspace/transforms.cljs index 4fc56d2ce..310a79c58 100644 --- a/frontend/src/app/main/data/workspace/transforms.cljs +++ b/frontend/src/app/main/data/workspace/transforms.cljs @@ -11,6 +11,7 @@ [app.common.data.macros :as dm] [app.common.files.changes-builder :as pcb] [app.common.files.helpers :as cfh] + [app.common.files.libraries-helpers :as cflh] [app.common.geom.matrix :as gmt] [app.common.geom.modifiers :as gm] [app.common.geom.point :as gpt] @@ -832,137 +833,13 @@ :ignore-snap-pixel true})))))) (defn move-shapes-to-frame - [ids frame-id drop-index [row column :as cell]] + [ids frame-id drop-index cell] (ptk/reify ::move-shapes-to-frame ptk/WatchEvent (watch [it state _] - (let [page-id (:current-page-id state) - objects (wsh/lookup-page-objects state page-id) - lookup (d/getf objects) - frame (get objects frame-id) - layout? (:layout frame) - - component-main-frame (ctn/find-component-main objects frame false) - - shapes (->> ids - (cfh/clean-loops objects) - (keep lookup) - ;;remove shapes inside copies, because we can't change the structure of copies - (remove #(ctk/in-component-copy? (get objects (:parent-id %))))) - - moving-shapes - (cond->> shapes - (not layout?) - (remove #(= (:frame-id %) frame-id)) - - layout? - (remove #(and (= (:frame-id %) frame-id) - (not= (:parent-id %) frame-id)))) - - ordered-indexes (cfh/order-by-indexed-shapes objects (map :id moving-shapes)) - moving-shapes (map (d/getf objects) ordered-indexes) - - all-parents - (reduce (fn [res id] - (into res (cfh/get-parent-ids objects id))) - (d/ordered-set) - ids) - - find-all-empty-parents - (fn recursive-find-empty-parents [empty-parents] - (let [all-ids (into empty-parents ids) - contains? (partial contains? all-ids) - xform (comp (map lookup) - (filter cfh/group-shape?) - (remove #(->> (:shapes %) (remove contains?) seq)) - (map :id)) - parents (into #{} xform all-parents)] - (if (= empty-parents parents) - empty-parents - (recursive-find-empty-parents parents)))) - - empty-parents - ;; Any empty parent whose children are moved to another frame should be deleted - (if (empty? moving-shapes) - #{} - (into (d/ordered-set) (find-all-empty-parents #{}))) - - ;; Not move absolute shapes that won't change parent - moving-shapes - (->> moving-shapes - (remove (fn [shape] - (and (ctl/position-absolute? shape) - (= frame-id (:parent-id shape)))))) - - frame-component - (ctn/get-component-shape objects frame) - - shape-ids-to-detach - (reduce (fn [result shape] - (if (and (some? shape) (ctk/in-component-copy-not-head? shape)) - (let [shape-component (ctn/get-component-shape objects shape)] - (if (= (:id frame-component) (:id shape-component)) - result - (into result (cfh/get-children-ids-with-self objects (:id shape))))) - result)) - #{} - moving-shapes) - - moving-shapes-ids - (map :id moving-shapes) - - moving-shapes-children-ids - (->> moving-shapes-ids - (mapcat #(cfh/get-children-ids-with-self objects %))) - - child-heads - (->> moving-shapes-ids - (mapcat #(ctn/get-child-heads objects %)) - (map :id)) - - changes - (-> (pcb/empty-changes it page-id) - (pcb/with-objects objects) - - ;; Remove layout-item properties when moving a shape outside a layout - (cond-> (not (ctl/any-layout? objects frame-id)) - (pcb/update-shapes moving-shapes-ids ctl/remove-layout-item-data)) - - ;; Remove the swap slots if it is moving to a different component - (pcb/update-shapes - child-heads - (fn [shape] - (cond-> shape - (not= component-main-frame (ctn/find-component-main objects shape false)) - (ctk/remove-swap-slot)))) - - ;; Remove component-root property when moving a shape inside a component - (cond-> (ctn/get-instance-root objects frame) - (pcb/update-shapes moving-shapes-children-ids #(dissoc % :component-root))) - - ;; Add component-root property when moving a component outside a component - (cond-> (not (ctn/get-instance-root objects frame)) - (pcb/update-shapes child-heads #(assoc % :component-root true))) - - (pcb/update-shapes moving-shapes-ids #(cond-> % (cfh/frame-shape? %) (assoc :hide-in-viewer true))) - (pcb/update-shapes shape-ids-to-detach ctk/detach-shape) - (pcb/change-parent frame-id moving-shapes drop-index) - - ;; Change the grid cell in a grid layout - (cond-> (ctl/grid-layout? objects frame-id) - (-> (pcb/update-shapes - [frame-id] - (fn [frame objects] - (-> frame - ;; Assign the cell when pushing into a specific grid cell - (cond-> (some? cell) - (-> (ctl/free-cell-shapes moving-shapes-ids) - (ctl/push-into-cell moving-shapes-ids row column) - (ctl/assign-cells objects))) - (ctl/assign-cell-positions objects))) - {:with-objects? true}) - (pcb/reorder-grid-children [frame-id]))) - (pcb/remove-objects empty-parents))] + (let [page-id (:current-page-id state) + objects (wsh/lookup-page-objects state page-id) + changes (cflh/generate-move-shapes-to-frame (pcb/empty-changes it) ids frame-id page-id objects drop-index cell)] (when (and (some? frame-id) (d/not-empty? changes)) (rx/of (dch/commit-changes changes) -- Gitee From 0b4fbc184deb1ba7afc5ddb689acbb08c6a87202 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Mon, 6 May 2024 16:45:43 +0200 Subject: [PATCH 0502/1266] :recycle: Move generate-xx methods to logic module --- backend/src/app/features/components_v2.clj | 18 +- .../libraries.cljc} | 514 +---------------- common/src/app/common/logic/shapes.cljc | 519 ++++++++++++++++++ common/test/common_tests/helpers/files.cljc | 4 +- .../logic/comp_remove_swap_slots_test.cljc | 170 +++--- .../logic/component_creation_test.cljc | 18 +- .../logic/components_touched_test.cljc | 53 +- .../logic/swap_and_reset_test.cljc | 76 ++- frontend/src/app/main/data/workspace.cljs | 16 +- .../src/app/main/data/workspace/changes.cljs | 16 +- .../app/main/data/workspace/libraries.cljs | 47 +- .../app/main/data/workspace/selection.cljs | 28 +- .../src/app/main/data/workspace/shapes.cljs | 10 +- .../app/main/data/workspace/transforms.cljs | 4 +- .../test/frontend_tests/helpers/pages.cljs | 32 +- 15 files changed, 769 insertions(+), 756 deletions(-) rename common/src/app/common/{files/libraries_helpers.cljc => logic/libraries.cljc} (79%) create mode 100644 common/src/app/common/logic/shapes.cljc diff --git a/backend/src/app/features/components_v2.clj b/backend/src/app/features/components_v2.clj index 452b83bc5..47dc3fad0 100644 --- a/backend/src/app/features/components_v2.clj +++ b/backend/src/app/features/components_v2.clj @@ -12,7 +12,6 @@ [app.common.files.changes :as cp] [app.common.files.changes-builder :as fcb] [app.common.files.helpers :as cfh] - [app.common.files.libraries-helpers :as cflh] [app.common.files.migrations :as fmg] [app.common.files.shapes-helpers :as cfsh] [app.common.files.validate :as cfv] @@ -23,6 +22,7 @@ [app.common.geom.shapes :as gsh] [app.common.geom.shapes.path :as gshp] [app.common.logging :as l] + [app.common.logic.libraries :as cll] [app.common.math :as mth] [app.common.schema :as sm] [app.common.svg :as csvg] @@ -1451,14 +1451,14 @@ (cons shape children)) [_ _ changes] - (cflh/generate-add-component changes - [shape] - (:objects page) - (:id page) - file-id - true - nil - cfsh/prepare-create-artboard-from-selection)] + (cll/generate-add-component changes + [shape] + (:objects page) + (:id page) + file-id + true + nil + cfsh/prepare-create-artboard-from-selection)] (shape-cb shape) (:redo-changes changes))) diff --git a/common/src/app/common/files/libraries_helpers.cljc b/common/src/app/common/logic/libraries.cljc similarity index 79% rename from common/src/app/common/files/libraries_helpers.cljc rename to common/src/app/common/logic/libraries.cljc index 6df368eb6..458bcb2ec 100644 --- a/common/src/app/common/files/libraries_helpers.cljc +++ b/common/src/app/common/logic/libraries.cljc @@ -4,7 +4,7 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns app.common.files.libraries-helpers +(ns app.common.logic.libraries (:require [app.common.data :as d] [app.common.data.macros :as dm] @@ -14,6 +14,7 @@ [app.common.geom.shapes :as gsh] [app.common.geom.shapes.grid-layout :as gslg] [app.common.logging :as log] + [app.common.logic.shapes :as cls] [app.common.spec :as us] [app.common.text :as txt] [app.common.types.color :as ctc] @@ -21,10 +22,8 @@ [app.common.types.components-list :as ctkl] [app.common.types.container :as ctn] [app.common.types.file :as ctf] - [app.common.types.page :as ctp] [app.common.types.pages-list :as ctpl] [app.common.types.shape-tree :as ctst] - [app.common.types.shape.interactions :as ctsi] [app.common.types.shape.layout :as ctl] [app.common.types.typography :as cty] [app.common.uuid :as uuid] @@ -34,23 +33,6 @@ ;; Change this to :info :debug or :trace to debug this module, or :warn to reset to default (log/set-level! :warn) -(defn generate-update-shapes - [changes ids update-fn objects {:keys [attrs ignore-tree ignore-touched with-objects?]}] - (let [changes (reduce - (fn [changes id] - (let [opts {:attrs attrs - :ignore-geometry? (get ignore-tree id) - :ignore-touched ignore-touched - :with-objects? with-objects?}] - (pcb/update-shapes changes [id] update-fn (d/without-nils opts)))) - (-> changes - (pcb/with-objects objects)) - ids) - grid-ids (->> ids (filter (partial ctl/grid-layout? objects))) - changes (pcb/update-shapes changes grid-ids ctl/assign-cell-positions {:with-objects? true}) - changes (pcb/reorder-grid-children changes ids)] - changes)) - (declare generate-sync-container) (declare generate-sync-shape) (declare generate-sync-text-shape) @@ -58,7 +40,6 @@ (declare generate-sync-shape-direct) (declare generate-sync-shape-direct-recursive) -(declare generate-sync-shape-inverse) (declare generate-sync-shape-inverse-recursive) (declare compare-children) @@ -864,7 +845,6 @@ reset? components-v2)))) - (defn generate-rename-component "Generate the changes for rename the component with the given id, in the current file library." [changes id new-name library-data components-v2] @@ -884,9 +864,6 @@ (pcb/with-library-data library-data) (pcb/update-component id update-fn)))) - - - (defn generate-sync-shape-inverse "Generate changes to update the component a shape is linked to, from the values in the shape and all its children." @@ -1838,175 +1815,6 @@ (pcb/with-objects (:objects container)) (generate-detach-instance container libraries id)))) -(defn generate-update-shape-flags - [changes ids objects {:keys [blocked hidden] :as flags}] - (let [update-fn - (fn [obj] - (cond-> obj - (boolean? blocked) (assoc :blocked blocked) - (boolean? hidden) (assoc :hidden hidden))) - - ids (if (boolean? blocked) - (into ids (->> ids (mapcat #(cfh/get-children-ids objects %)))) - ids)] - (-> changes - (pcb/update-shapes ids update-fn {:attrs #{:blocked :hidden}})))) - -(defn generate-delete-shapes - [changes file page objects ids {:keys [components-v2 ignore-touched component-swap]}] - (let [ids (cfh/clean-loops objects ids) - - in-component-copy? - (fn [shape-id] - ;; Look for shapes that are inside a component copy, but are - ;; not the root. In this case, they must not be deleted, - ;; but hidden (to be able to recover them more easily). - ;; Unless we are doing a component swap, in which case we want - ;; to delete the old shape - (let [shape (get objects shape-id)] - (and (ctn/has-any-copy-parent? objects shape) - (not component-swap)))) - - [ids-to-delete ids-to-hide] - (if components-v2 - (loop [ids-seq (seq ids) - ids-to-delete [] - ids-to-hide []] - (let [id (first ids-seq)] - (if (nil? id) - [ids-to-delete ids-to-hide] - (if (in-component-copy? id) - (recur (rest ids-seq) - ids-to-delete - (conj ids-to-hide id)) - (recur (rest ids-seq) - (conj ids-to-delete id) - ids-to-hide))))) - [ids []]) - - changes (-> changes - (pcb/with-page page) - (pcb/with-objects objects) - (pcb/with-library-data file)) - lookup (d/getf objects) - groups-to-unmask - (reduce (fn [group-ids id] - ;; When the shape to delete is the mask of a masked group, - ;; the mask condition must be removed, and it must be - ;; converted to a normal group. - (let [obj (lookup id) - parent (lookup (:parent-id obj))] - (if (and (:masked-group parent) - (= id (first (:shapes parent)))) - (conj group-ids (:id parent)) - group-ids))) - #{} - ids-to-delete) - - interacting-shapes - (filter (fn [shape] - ;; If any of the deleted shapes is the destination of - ;; some interaction, this must be deleted, too. - (let [interactions (:interactions shape)] - (some #(and (ctsi/has-destination %) - (contains? ids-to-delete (:destination %))) - interactions))) - (vals objects)) - - ids-set (set ids-to-delete) - guides-to-remove - (->> (dm/get-in page [:options :guides]) - (vals) - (filter #(contains? ids-set (:frame-id %))) - (map :id)) - - guides - (->> guides-to-remove - (reduce dissoc (dm/get-in page [:options :guides]))) - - starting-flows - (filter (fn [flow] - ;; If any of the deleted is a frame that starts a flow, - ;; this must be deleted, too. - (contains? ids-to-delete (:starting-frame flow))) - (-> page :options :flows)) - - all-parents - (reduce (fn [res id] - ;; All parents of any deleted shape must be resized. - (into res (cfh/get-parent-ids objects id))) - (d/ordered-set) - ids-to-delete) - - all-children - (->> ids-to-delete ;; Children of deleted shapes must be also deleted. - (reduce (fn [res id] - (into res (cfh/get-children-ids objects id))) - []) - (reverse) - (into (d/ordered-set))) - - find-all-empty-parents - (fn recursive-find-empty-parents [empty-parents] - (let [all-ids (into empty-parents ids-to-delete) - contains? (partial contains? all-ids) - xform (comp (map lookup) - (filter #(or (cfh/group-shape? %) (cfh/bool-shape? %))) - (remove #(->> (:shapes %) (remove contains?) seq)) - (map :id)) - parents (into #{} xform all-parents)] - (if (= empty-parents parents) - empty-parents - (recursive-find-empty-parents parents)))) - - empty-parents - ;; Any parent whose children are all deleted, must be deleted too. - (into (d/ordered-set) (find-all-empty-parents #{})) - - components-to-delete - (if components-v2 - (reduce (fn [components id] - (let [shape (get objects id)] - (if (and (= (:component-file shape) (:id file)) ;; Main instances should exist only in local file - (:main-instance shape)) ;; but check anyway - (conj components (:component-id shape)) - components))) - [] - (into ids-to-delete all-children)) - []) - - changes (-> changes - (pcb/set-page-option :guides guides)) - - changes (reduce (fn [changes component-id] - ;; It's important to delete the component before the main instance, because we - ;; need to store the instance position if we want to restore it later. - (pcb/delete-component changes component-id (:id page))) - changes - components-to-delete) - changes (-> changes - (generate-update-shape-flags ids-to-hide objects {:hidden true}) - (pcb/remove-objects all-children {:ignore-touched true}) - (pcb/remove-objects ids-to-delete {:ignore-touched ignore-touched}) - (pcb/remove-objects empty-parents) - (pcb/resize-parents all-parents) - (pcb/update-shapes groups-to-unmask - (fn [shape] - (assoc shape :masked-group false))) - (pcb/update-shapes (map :id interacting-shapes) - (fn [shape] - (d/update-when shape :interactions - (fn [interactions] - (into [] - (remove #(and (ctsi/has-destination %) - (contains? ids-to-delete (:destination %)))) - interactions))))) - (cond-> (seq starting-flows) - (pcb/update-page-option :flows (fn [flows] - (->> (map :id starting-flows) - (reduce ctp/remove-flow flows))))))] - [all-parents changes])) - (defn generate-new-shape-for-swap [changes shape file page libraries id-new-component index target-cell keep-props-values] (let [objects (:objects page) @@ -2057,8 +1865,8 @@ [changes objects shape file page libraries id-new-component index target-cell keep-props-values] (let [[all-parents changes] (-> changes - (generate-delete-shapes file page objects (d/ordered-set (:id shape)) {:components-v2 true - :component-swap true})) + (cls/generate-delete-shapes file page objects (d/ordered-set (:id shape)) {:components-v2 true + :component-swap true})) [new-shape changes] (-> changes (generate-new-shape-for-swap shape file page libraries id-new-component index target-cell keep-props-values))] @@ -2115,317 +1923,3 @@ (cond-> changes (some? swap-slot) (generate-sync-head file-full libraries container id components-v2 true)))) - -(defn generate-relocate-shapes [changes objects parents parent-id page-id to-index ids] - (let [groups-to-delete - (loop [current-id (first parents) - to-check (rest parents) - removed-id? (set ids) - result #{}] - - (if-not current-id - ;; Base case, no next element - result - - (let [group (get objects current-id)] - (if (and (not= :frame (:type group)) - (not= current-id parent-id) - (empty? (remove removed-id? (:shapes group)))) - - ;; Adds group to the remove and check its parent - (let [to-check (concat to-check [(cfh/get-parent-id objects current-id)])] - (recur (first to-check) - (rest to-check) - (conj removed-id? current-id) - (conj result current-id))) - - ;; otherwise recur - (recur (first to-check) - (rest to-check) - removed-id? - result))))) - - groups-to-unmask - (reduce (fn [group-ids id] - ;; When a masked group loses its mask shape, because it's - ;; moved outside the group, the mask condition must be - ;; removed, and it must be converted to a normal group. - (let [obj (get objects id) - parent (get objects (:parent-id obj))] - (if (and (:masked-group parent) - (= id (first (:shapes parent))) - (not= (:id parent) parent-id)) - (conj group-ids (:id parent)) - group-ids))) - #{} - ids) - - - ;; TODO: Probably implementing this using loop/recur will - ;; be more efficient than using reduce and continuous data - ;; desturcturing. - - ;; Sets the correct components metadata for the moved shapes - ;; `shapes-to-detach` Detach from a component instance a shape that was inside a component and is moved outside - ;; `shapes-to-deroot` Removes the root flag from a component instance moved inside another component - ;; `shapes-to-reroot` Adds a root flag when a nested component instance is moved outside - [shapes-to-detach shapes-to-deroot shapes-to-reroot] - (reduce (fn [[shapes-to-detach shapes-to-deroot shapes-to-reroot] id] - (let [shape (get objects id) - parent (get objects parent-id) - component-shape (ctn/get-component-shape objects shape) - component-shape-parent (ctn/get-component-shape objects parent {:allow-main? true}) - root-parent (ctn/get-instance-root objects parent) - - detach? (and (ctk/in-component-copy-not-head? shape) - (not= (:id component-shape) - (:id component-shape-parent))) - deroot? (and (ctk/instance-root? shape) - root-parent) - reroot? (and (ctk/subinstance-head? shape) - (not component-shape-parent)) - - ids-to-detach (when detach? - (cons id (cfh/get-children-ids objects id)))] - - [(cond-> shapes-to-detach detach? (into ids-to-detach)) - (cond-> shapes-to-deroot deroot? (conj id)) - (cond-> shapes-to-reroot reroot? (conj id))])) - [[] [] []] - (->> ids - (mapcat #(ctn/get-child-heads objects %)) - (map :id))) - - shapes-to-unconstraint ids - - ordered-indexes (cfh/order-by-indexed-shapes objects ids) - shapes (map (d/getf objects) ordered-indexes) - parent (get objects parent-id) - component-main-parent (ctn/find-component-main objects parent false) - child-heads - (->> ordered-indexes - (mapcat #(ctn/get-child-heads objects %)) - (map :id))] - - (-> changes - (pcb/with-page-id page-id) - (pcb/with-objects objects) - - ;; Remove layout-item properties when moving a shape outside a layout - (cond-> (not (ctl/any-layout? parent)) - (pcb/update-shapes ordered-indexes ctl/remove-layout-item-data)) - - ;; Remove the hide in viewer flag - (cond-> (and (not= uuid/zero parent-id) (cfh/frame-shape? parent)) - (pcb/update-shapes ordered-indexes #(cond-> % (cfh/frame-shape? %) (assoc :hide-in-viewer true)))) - - ;; Remove the swap slots if it is moving to a different component - (pcb/update-shapes child-heads - (fn [shape] - (cond-> shape - (not= component-main-parent (ctn/find-component-main objects shape false)) - (ctk/remove-swap-slot)))) - - ;; Add component-root property when moving a component outside a component - (cond-> (not (ctn/get-instance-root objects parent)) - (pcb/update-shapes child-heads #(assoc % :component-root true))) - - ;; Move the shapes - (pcb/change-parent parent-id - shapes - to-index) - - ;; Remove empty groups - (pcb/remove-objects groups-to-delete) - - ;; Unmask groups whose mask have moved outside - (pcb/update-shapes groups-to-unmask - (fn [shape] - (assoc shape :masked-group false))) - - ;; Detach shapes moved out of their component - (pcb/update-shapes shapes-to-detach ctk/detach-shape) - - ;; Make non root a component moved inside another one - (pcb/update-shapes shapes-to-deroot - (fn [shape] - (assoc shape :component-root nil))) - - ;; Make root a subcomponent moved outside its parent component - (pcb/update-shapes shapes-to-reroot - (fn [shape] - (assoc shape :component-root true))) - - ;; Reset constraints depending on the new parent - (pcb/update-shapes shapes-to-unconstraint - (fn [shape] - (let [frame-id (if (= (:type parent) :frame) - (:id parent) - (:frame-id parent)) - moved-shape (assoc shape - :parent-id parent-id - :frame-id frame-id)] - (assoc shape - :constraints-h (gsh/default-constraints-h moved-shape) - :constraints-v (gsh/default-constraints-v moved-shape)))) - {:ignore-touched true}) - - ;; Fix the sizing when moving a shape - (pcb/update-shapes parents - (fn [parent] - (if (ctl/flex-layout? parent) - (cond-> parent - (ctl/change-h-sizing? (:id parent) objects (:shapes parent)) - (assoc :layout-item-h-sizing :fix) - - (ctl/change-v-sizing? (:id parent) objects (:shapes parent)) - (assoc :layout-item-v-sizing :fix)) - parent))) - - ;; Update grid layout - (cond-> (ctl/grid-layout? objects parent-id) - (pcb/update-shapes [parent-id] #(ctl/add-children-to-index % ids objects to-index))) - - (pcb/update-shapes parents - (fn [parent objects] - (cond-> parent - (ctl/grid-layout? parent) - (ctl/assign-cells objects))) - {:with-objects? true}) - - (pcb/reorder-grid-children parents) - - ;; If parent locked, lock the added shapes - (cond-> (:blocked parent) - (pcb/update-shapes ordered-indexes #(assoc % :blocked true))) - - ;; Resize parent containers that need to - (pcb/resize-parents parents)))) - - -(defn generate-move-shapes-to-frame - [changes ids frame-id page-id objects drop-index [row column :as cell]] - (let [lookup (d/getf objects) - frame (get objects frame-id) - layout? (:layout frame) - - component-main-frame (ctn/find-component-main objects frame false) - - shapes (->> ids - (cfh/clean-loops objects) - (keep lookup) - ;;remove shapes inside copies, because we can't change the structure of copies - (remove #(ctk/in-component-copy? (get objects (:parent-id %))))) - - moving-shapes - (cond->> shapes - (not layout?) - (remove #(= (:frame-id %) frame-id)) - - layout? - (remove #(and (= (:frame-id %) frame-id) - (not= (:parent-id %) frame-id)))) - - ordered-indexes (cfh/order-by-indexed-shapes objects (map :id moving-shapes)) - moving-shapes (map (d/getf objects) ordered-indexes) - - all-parents - (reduce (fn [res id] - (into res (cfh/get-parent-ids objects id))) - (d/ordered-set) - ids) - - find-all-empty-parents - (fn recursive-find-empty-parents [empty-parents] - (let [all-ids (into empty-parents ids) - contains? (partial contains? all-ids) - xform (comp (map lookup) - (filter cfh/group-shape?) - (remove #(->> (:shapes %) (remove contains?) seq)) - (map :id)) - parents (into #{} xform all-parents)] - (if (= empty-parents parents) - empty-parents - (recursive-find-empty-parents parents)))) - - empty-parents - ;; Any empty parent whose children are moved to another frame should be deleted - (if (empty? moving-shapes) - #{} - (into (d/ordered-set) (find-all-empty-parents #{}))) - - ;; Not move absolute shapes that won't change parent - moving-shapes - (->> moving-shapes - (remove (fn [shape] - (and (ctl/position-absolute? shape) - (= frame-id (:parent-id shape)))))) - - frame-component - (ctn/get-component-shape objects frame) - - shape-ids-to-detach - (reduce (fn [result shape] - (if (and (some? shape) (ctk/in-component-copy-not-head? shape)) - (let [shape-component (ctn/get-component-shape objects shape)] - (if (= (:id frame-component) (:id shape-component)) - result - (into result (cfh/get-children-ids-with-self objects (:id shape))))) - result)) - #{} - moving-shapes) - - moving-shapes-ids - (map :id moving-shapes) - - moving-shapes-children-ids - (->> moving-shapes-ids - (mapcat #(cfh/get-children-ids-with-self objects %))) - - child-heads - (->> moving-shapes-ids - (mapcat #(ctn/get-child-heads objects %)) - (map :id))] - (-> changes - (pcb/with-page-id page-id) - (pcb/with-objects objects) - - ;; Remove layout-item properties when moving a shape outside a layout - (cond-> (not (ctl/any-layout? objects frame-id)) - (pcb/update-shapes moving-shapes-ids ctl/remove-layout-item-data)) - - ;; Remove the swap slots if it is moving to a different component - (pcb/update-shapes - child-heads - (fn [shape] - (cond-> shape - (not= component-main-frame (ctn/find-component-main objects shape false)) - (ctk/remove-swap-slot)))) - - ;; Remove component-root property when moving a shape inside a component - (cond-> (ctn/get-instance-root objects frame) - (pcb/update-shapes moving-shapes-children-ids #(dissoc % :component-root))) - - ;; Add component-root property when moving a component outside a component - (cond-> (not (ctn/get-instance-root objects frame)) - (pcb/update-shapes child-heads #(assoc % :component-root true))) - - (pcb/update-shapes moving-shapes-ids #(cond-> % (cfh/frame-shape? %) (assoc :hide-in-viewer true))) - (pcb/update-shapes shape-ids-to-detach ctk/detach-shape) - (pcb/change-parent frame-id moving-shapes drop-index) - - ;; Change the grid cell in a grid layout - (cond-> (ctl/grid-layout? objects frame-id) - (-> (pcb/update-shapes - [frame-id] - (fn [frame objects] - (-> frame - ;; Assign the cell when pushing into a specific grid cell - (cond-> (some? cell) - (-> (ctl/free-cell-shapes moving-shapes-ids) - (ctl/push-into-cell moving-shapes-ids row column) - (ctl/assign-cells objects))) - (ctl/assign-cell-positions objects))) - {:with-objects? true}) - (pcb/reorder-grid-children [frame-id]))) - (pcb/remove-objects empty-parents)))) diff --git a/common/src/app/common/logic/shapes.cljc b/common/src/app/common/logic/shapes.cljc new file mode 100644 index 000000000..29d58dad6 --- /dev/null +++ b/common/src/app/common/logic/shapes.cljc @@ -0,0 +1,519 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.common.logic.shapes + (:require + [app.common.data :as d] + [app.common.data.macros :as dm] + [app.common.files.changes-builder :as pcb] + [app.common.files.helpers :as cfh] + [app.common.geom.shapes :as gsh] + [app.common.types.component :as ctk] + [app.common.types.container :as ctn] + [app.common.types.page :as ctp] + [app.common.types.shape.interactions :as ctsi] + [app.common.types.shape.layout :as ctl] + [app.common.uuid :as uuid])) + +(defn generate-update-shapes + [changes ids update-fn objects {:keys [attrs ignore-tree ignore-touched with-objects?]}] + (let [changes (reduce + (fn [changes id] + (let [opts {:attrs attrs + :ignore-geometry? (get ignore-tree id) + :ignore-touched ignore-touched + :with-objects? with-objects?}] + (pcb/update-shapes changes [id] update-fn (d/without-nils opts)))) + (-> changes + (pcb/with-objects objects)) + ids) + grid-ids (->> ids (filter (partial ctl/grid-layout? objects))) + changes (pcb/update-shapes changes grid-ids ctl/assign-cell-positions {:with-objects? true}) + changes (pcb/reorder-grid-children changes ids)] + changes)) + +(defn- generate-update-shape-flags + [changes ids objects {:keys [blocked hidden] :as flags}] + (let [update-fn + (fn [obj] + (cond-> obj + (boolean? blocked) (assoc :blocked blocked) + (boolean? hidden) (assoc :hidden hidden))) + + ids (if (boolean? blocked) + (into ids (->> ids (mapcat #(cfh/get-children-ids objects %)))) + ids)] + (-> changes + (pcb/update-shapes ids update-fn {:attrs #{:blocked :hidden}})))) + +(defn generate-delete-shapes + [changes file page objects ids {:keys [components-v2 ignore-touched component-swap]}] + (let [ids (cfh/clean-loops objects ids) + + in-component-copy? + (fn [shape-id] + ;; Look for shapes that are inside a component copy, but are + ;; not the root. In this case, they must not be deleted, + ;; but hidden (to be able to recover them more easily). + ;; Unless we are doing a component swap, in which case we want + ;; to delete the old shape + (let [shape (get objects shape-id)] + (and (ctn/has-any-copy-parent? objects shape) + (not component-swap)))) + + [ids-to-delete ids-to-hide] + (if components-v2 + (loop [ids-seq (seq ids) + ids-to-delete [] + ids-to-hide []] + (let [id (first ids-seq)] + (if (nil? id) + [ids-to-delete ids-to-hide] + (if (in-component-copy? id) + (recur (rest ids-seq) + ids-to-delete + (conj ids-to-hide id)) + (recur (rest ids-seq) + (conj ids-to-delete id) + ids-to-hide))))) + [ids []]) + + changes (-> changes + (pcb/with-page page) + (pcb/with-objects objects) + (pcb/with-library-data file)) + lookup (d/getf objects) + groups-to-unmask + (reduce (fn [group-ids id] + ;; When the shape to delete is the mask of a masked group, + ;; the mask condition must be removed, and it must be + ;; converted to a normal group. + (let [obj (lookup id) + parent (lookup (:parent-id obj))] + (if (and (:masked-group parent) + (= id (first (:shapes parent)))) + (conj group-ids (:id parent)) + group-ids))) + #{} + ids-to-delete) + + interacting-shapes + (filter (fn [shape] + ;; If any of the deleted shapes is the destination of + ;; some interaction, this must be deleted, too. + (let [interactions (:interactions shape)] + (some #(and (ctsi/has-destination %) + (contains? ids-to-delete (:destination %))) + interactions))) + (vals objects)) + + ids-set (set ids-to-delete) + guides-to-remove + (->> (dm/get-in page [:options :guides]) + (vals) + (filter #(contains? ids-set (:frame-id %))) + (map :id)) + + guides + (->> guides-to-remove + (reduce dissoc (dm/get-in page [:options :guides]))) + + starting-flows + (filter (fn [flow] + ;; If any of the deleted is a frame that starts a flow, + ;; this must be deleted, too. + (contains? ids-to-delete (:starting-frame flow))) + (-> page :options :flows)) + + all-parents + (reduce (fn [res id] + ;; All parents of any deleted shape must be resized. + (into res (cfh/get-parent-ids objects id))) + (d/ordered-set) + ids-to-delete) + + all-children + (->> ids-to-delete ;; Children of deleted shapes must be also deleted. + (reduce (fn [res id] + (into res (cfh/get-children-ids objects id))) + []) + (reverse) + (into (d/ordered-set))) + + find-all-empty-parents + (fn recursive-find-empty-parents [empty-parents] + (let [all-ids (into empty-parents ids-to-delete) + contains? (partial contains? all-ids) + xform (comp (map lookup) + (filter #(or (cfh/group-shape? %) (cfh/bool-shape? %))) + (remove #(->> (:shapes %) (remove contains?) seq)) + (map :id)) + parents (into #{} xform all-parents)] + (if (= empty-parents parents) + empty-parents + (recursive-find-empty-parents parents)))) + + empty-parents + ;; Any parent whose children are all deleted, must be deleted too. + (into (d/ordered-set) (find-all-empty-parents #{})) + + components-to-delete + (if components-v2 + (reduce (fn [components id] + (let [shape (get objects id)] + (if (and (= (:component-file shape) (:id file)) ;; Main instances should exist only in local file + (:main-instance shape)) ;; but check anyway + (conj components (:component-id shape)) + components))) + [] + (into ids-to-delete all-children)) + []) + + changes (-> changes + (pcb/set-page-option :guides guides)) + + changes (reduce (fn [changes component-id] + ;; It's important to delete the component before the main instance, because we + ;; need to store the instance position if we want to restore it later. + (pcb/delete-component changes component-id (:id page))) + changes + components-to-delete) + changes (-> changes + (generate-update-shape-flags ids-to-hide objects {:hidden true}) + (pcb/remove-objects all-children {:ignore-touched true}) + (pcb/remove-objects ids-to-delete {:ignore-touched ignore-touched}) + (pcb/remove-objects empty-parents) + (pcb/resize-parents all-parents) + (pcb/update-shapes groups-to-unmask + (fn [shape] + (assoc shape :masked-group false))) + (pcb/update-shapes (map :id interacting-shapes) + (fn [shape] + (d/update-when shape :interactions + (fn [interactions] + (into [] + (remove #(and (ctsi/has-destination %) + (contains? ids-to-delete (:destination %)))) + interactions))))) + (cond-> (seq starting-flows) + (pcb/update-page-option :flows (fn [flows] + (->> (map :id starting-flows) + (reduce ctp/remove-flow flows))))))] + [all-parents changes])) + +(defn generate-relocate-shapes [changes objects parents parent-id page-id to-index ids] + (let [groups-to-delete + (loop [current-id (first parents) + to-check (rest parents) + removed-id? (set ids) + result #{}] + + (if-not current-id + ;; Base case, no next element + result + + (let [group (get objects current-id)] + (if (and (not= :frame (:type group)) + (not= current-id parent-id) + (empty? (remove removed-id? (:shapes group)))) + + ;; Adds group to the remove and check its parent + (let [to-check (concat to-check [(cfh/get-parent-id objects current-id)])] + (recur (first to-check) + (rest to-check) + (conj removed-id? current-id) + (conj result current-id))) + + ;; otherwise recur + (recur (first to-check) + (rest to-check) + removed-id? + result))))) + + groups-to-unmask + (reduce (fn [group-ids id] + ;; When a masked group loses its mask shape, because it's + ;; moved outside the group, the mask condition must be + ;; removed, and it must be converted to a normal group. + (let [obj (get objects id) + parent (get objects (:parent-id obj))] + (if (and (:masked-group parent) + (= id (first (:shapes parent))) + (not= (:id parent) parent-id)) + (conj group-ids (:id parent)) + group-ids))) + #{} + ids) + + + ;; TODO: Probably implementing this using loop/recur will + ;; be more efficient than using reduce and continuous data + ;; desturcturing. + + ;; Sets the correct components metadata for the moved shapes + ;; `shapes-to-detach` Detach from a component instance a shape that was inside a component and is moved outside + ;; `shapes-to-deroot` Removes the root flag from a component instance moved inside another component + ;; `shapes-to-reroot` Adds a root flag when a nested component instance is moved outside + [shapes-to-detach shapes-to-deroot shapes-to-reroot] + (reduce (fn [[shapes-to-detach shapes-to-deroot shapes-to-reroot] id] + (let [shape (get objects id) + parent (get objects parent-id) + component-shape (ctn/get-component-shape objects shape) + component-shape-parent (ctn/get-component-shape objects parent {:allow-main? true}) + root-parent (ctn/get-instance-root objects parent) + + detach? (and (ctk/in-component-copy-not-head? shape) + (not= (:id component-shape) + (:id component-shape-parent))) + deroot? (and (ctk/instance-root? shape) + root-parent) + reroot? (and (ctk/subinstance-head? shape) + (not component-shape-parent)) + + ids-to-detach (when detach? + (cons id (cfh/get-children-ids objects id)))] + + [(cond-> shapes-to-detach detach? (into ids-to-detach)) + (cond-> shapes-to-deroot deroot? (conj id)) + (cond-> shapes-to-reroot reroot? (conj id))])) + [[] [] []] + (->> ids + (mapcat #(ctn/get-child-heads objects %)) + (map :id))) + + shapes-to-unconstraint ids + + ordered-indexes (cfh/order-by-indexed-shapes objects ids) + shapes (map (d/getf objects) ordered-indexes) + parent (get objects parent-id) + component-main-parent (ctn/find-component-main objects parent false) + child-heads + (->> ordered-indexes + (mapcat #(ctn/get-child-heads objects %)) + (map :id))] + + (-> changes + (pcb/with-page-id page-id) + (pcb/with-objects objects) + + ;; Remove layout-item properties when moving a shape outside a layout + (cond-> (not (ctl/any-layout? parent)) + (pcb/update-shapes ordered-indexes ctl/remove-layout-item-data)) + + ;; Remove the hide in viewer flag + (cond-> (and (not= uuid/zero parent-id) (cfh/frame-shape? parent)) + (pcb/update-shapes ordered-indexes #(cond-> % (cfh/frame-shape? %) (assoc :hide-in-viewer true)))) + + ;; Remove the swap slots if it is moving to a different component + (pcb/update-shapes child-heads + (fn [shape] + (cond-> shape + (not= component-main-parent (ctn/find-component-main objects shape false)) + (ctk/remove-swap-slot)))) + + ;; Add component-root property when moving a component outside a component + (cond-> (not (ctn/get-instance-root objects parent)) + (pcb/update-shapes child-heads #(assoc % :component-root true))) + + ;; Move the shapes + (pcb/change-parent parent-id + shapes + to-index) + + ;; Remove empty groups + (pcb/remove-objects groups-to-delete) + + ;; Unmask groups whose mask have moved outside + (pcb/update-shapes groups-to-unmask + (fn [shape] + (assoc shape :masked-group false))) + + ;; Detach shapes moved out of their component + (pcb/update-shapes shapes-to-detach ctk/detach-shape) + + ;; Make non root a component moved inside another one + (pcb/update-shapes shapes-to-deroot + (fn [shape] + (assoc shape :component-root nil))) + + ;; Make root a subcomponent moved outside its parent component + (pcb/update-shapes shapes-to-reroot + (fn [shape] + (assoc shape :component-root true))) + + ;; Reset constraints depending on the new parent + (pcb/update-shapes shapes-to-unconstraint + (fn [shape] + (let [frame-id (if (= (:type parent) :frame) + (:id parent) + (:frame-id parent)) + moved-shape (assoc shape + :parent-id parent-id + :frame-id frame-id)] + (assoc shape + :constraints-h (gsh/default-constraints-h moved-shape) + :constraints-v (gsh/default-constraints-v moved-shape)))) + {:ignore-touched true}) + + ;; Fix the sizing when moving a shape + (pcb/update-shapes parents + (fn [parent] + (if (ctl/flex-layout? parent) + (cond-> parent + (ctl/change-h-sizing? (:id parent) objects (:shapes parent)) + (assoc :layout-item-h-sizing :fix) + + (ctl/change-v-sizing? (:id parent) objects (:shapes parent)) + (assoc :layout-item-v-sizing :fix)) + parent))) + + ;; Update grid layout + (cond-> (ctl/grid-layout? objects parent-id) + (pcb/update-shapes [parent-id] #(ctl/add-children-to-index % ids objects to-index))) + + (pcb/update-shapes parents + (fn [parent objects] + (cond-> parent + (ctl/grid-layout? parent) + (ctl/assign-cells objects))) + {:with-objects? true}) + + (pcb/reorder-grid-children parents) + + ;; If parent locked, lock the added shapes + (cond-> (:blocked parent) + (pcb/update-shapes ordered-indexes #(assoc % :blocked true))) + + ;; Resize parent containers that need to + (pcb/resize-parents parents)))) + + +(defn generate-move-shapes-to-frame + [changes ids frame-id page-id objects drop-index [row column :as cell]] + (let [lookup (d/getf objects) + frame (get objects frame-id) + layout? (:layout frame) + + component-main-frame (ctn/find-component-main objects frame false) + + shapes (->> ids + (cfh/clean-loops objects) + (keep lookup) + ;;remove shapes inside copies, because we can't change the structure of copies + (remove #(ctk/in-component-copy? (get objects (:parent-id %))))) + + moving-shapes + (cond->> shapes + (not layout?) + (remove #(= (:frame-id %) frame-id)) + + layout? + (remove #(and (= (:frame-id %) frame-id) + (not= (:parent-id %) frame-id)))) + + ordered-indexes (cfh/order-by-indexed-shapes objects (map :id moving-shapes)) + moving-shapes (map (d/getf objects) ordered-indexes) + + all-parents + (reduce (fn [res id] + (into res (cfh/get-parent-ids objects id))) + (d/ordered-set) + ids) + + find-all-empty-parents + (fn recursive-find-empty-parents [empty-parents] + (let [all-ids (into empty-parents ids) + contains? (partial contains? all-ids) + xform (comp (map lookup) + (filter cfh/group-shape?) + (remove #(->> (:shapes %) (remove contains?) seq)) + (map :id)) + parents (into #{} xform all-parents)] + (if (= empty-parents parents) + empty-parents + (recursive-find-empty-parents parents)))) + + empty-parents + ;; Any empty parent whose children are moved to another frame should be deleted + (if (empty? moving-shapes) + #{} + (into (d/ordered-set) (find-all-empty-parents #{}))) + + ;; Not move absolute shapes that won't change parent + moving-shapes + (->> moving-shapes + (remove (fn [shape] + (and (ctl/position-absolute? shape) + (= frame-id (:parent-id shape)))))) + + frame-component + (ctn/get-component-shape objects frame) + + shape-ids-to-detach + (reduce (fn [result shape] + (if (and (some? shape) (ctk/in-component-copy-not-head? shape)) + (let [shape-component (ctn/get-component-shape objects shape)] + (if (= (:id frame-component) (:id shape-component)) + result + (into result (cfh/get-children-ids-with-self objects (:id shape))))) + result)) + #{} + moving-shapes) + + moving-shapes-ids + (map :id moving-shapes) + + moving-shapes-children-ids + (->> moving-shapes-ids + (mapcat #(cfh/get-children-ids-with-self objects %))) + + child-heads + (->> moving-shapes-ids + (mapcat #(ctn/get-child-heads objects %)) + (map :id))] + (-> changes + (pcb/with-page-id page-id) + (pcb/with-objects objects) + + ;; Remove layout-item properties when moving a shape outside a layout + (cond-> (not (ctl/any-layout? objects frame-id)) + (pcb/update-shapes moving-shapes-ids ctl/remove-layout-item-data)) + + ;; Remove the swap slots if it is moving to a different component + (pcb/update-shapes + child-heads + (fn [shape] + (cond-> shape + (not= component-main-frame (ctn/find-component-main objects shape false)) + (ctk/remove-swap-slot)))) + + ;; Remove component-root property when moving a shape inside a component + (cond-> (ctn/get-instance-root objects frame) + (pcb/update-shapes moving-shapes-children-ids #(dissoc % :component-root))) + + ;; Add component-root property when moving a component outside a component + (cond-> (not (ctn/get-instance-root objects frame)) + (pcb/update-shapes child-heads #(assoc % :component-root true))) + + (pcb/update-shapes moving-shapes-ids #(cond-> % (cfh/frame-shape? %) (assoc :hide-in-viewer true))) + (pcb/update-shapes shape-ids-to-detach ctk/detach-shape) + (pcb/change-parent frame-id moving-shapes drop-index) + + ;; Change the grid cell in a grid layout + (cond-> (ctl/grid-layout? objects frame-id) + (-> (pcb/update-shapes + [frame-id] + (fn [frame objects] + (-> frame + ;; Assign the cell when pushing into a specific grid cell + (cond-> (some? cell) + (-> (ctl/free-cell-shapes moving-shapes-ids) + (ctl/push-into-cell moving-shapes-ids row column) + (ctl/assign-cells objects))) + (ctl/assign-cell-positions objects))) + {:with-objects? true}) + (pcb/reorder-grid-children [frame-id]))) + (pcb/remove-objects empty-parents)))) diff --git a/common/test/common_tests/helpers/files.cljc b/common/test/common_tests/helpers/files.cljc index b6349636b..c7de66880 100644 --- a/common/test/common_tests/helpers/files.cljc +++ b/common/test/common_tests/helpers/files.cljc @@ -12,9 +12,9 @@ [app.common.files.changes :as cfc] [app.common.files.changes-builder :as pcb] [app.common.files.helpers :as cfh] - [app.common.files.libraries-helpers :as cflh] [app.common.files.validate :as cfv] [app.common.geom.point :as gpt] + [app.common.logic.libraries :as cll] [app.common.pprint :refer [pprint]] [app.common.types.color :as ctc] [app.common.types.colors-list :as ctcl] @@ -297,7 +297,7 @@ [new_shape _ changes] (-> (pcb/empty-changes nil (:id page)) - (cflh/generate-component-swap objects shape (:data file) page libraries id-new-component 0 nil keep-props-values))] + (cll/generate-component-swap objects shape (:data file) page libraries id-new-component 0 nil keep-props-values))] (thi/set-id! new-shape-label (:id new_shape)) (apply-changes file changes))) diff --git a/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc b/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc index ede14008d..2fd559e0c 100644 --- a/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc +++ b/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc @@ -7,7 +7,7 @@ (ns common-tests.logic.comp-remove-swap-slots-test (:require [app.common.files.changes-builder :as pcb] - [app.common.files.libraries-helpers :as cflh] + [app.common.logic.shapes :as cls] [app.common.types.component :as ctk] [app.common.uuid :as uuid] [clojure.test :as t] @@ -57,13 +57,13 @@ blue1 (thf/get-shape file :blue1) ;; ============================== Action ============================== - changes (cflh/generate-relocate-shapes (pcb/empty-changes nil) - (:objects page) - #{(:parent-id blue1)} ;; parents - uuid/zero ;; parent-id - (:id page) ;; page-id - 0 ;; to-index - #{(:id blue1)}) ;; ids + changes (cls/generate-relocate-shapes (pcb/empty-changes nil) + (:objects page) + #{(:parent-id blue1)} ;; parents + uuid/zero ;; parent-id + (:id page) ;; page-id + 0 ;; to-index + #{(:id blue1)}) ;; ids file' (thf/apply-changes file changes) ;; ============================== Get ================================= @@ -84,13 +84,13 @@ blue1 (thf/get-shape file :blue1) ;; ============================== Action ============================== - changes (cflh/generate-move-shapes-to-frame (pcb/empty-changes nil) - #{(:id blue1)} ;; ids - uuid/zero ;; frame-id - (:id page) ;; page-id - (:objects page) ;; objects - 0 ;; drop-index - nil) ;; cell + changes (cls/generate-move-shapes-to-frame (pcb/empty-changes nil) + #{(:id blue1)} ;; ids + uuid/zero ;; frame-id + (:id page) ;; page-id + (:objects page) ;; objects + 0 ;; drop-index + nil) ;; cell file' (thf/apply-changes file changes) @@ -115,13 +115,13 @@ ;; ============================== Action ============================== - changes (cflh/generate-relocate-shapes (pcb/empty-changes nil) - (:objects page) - #{(:parent-id blue1)} ;; parents - (:id b2) ;; parent-id - (:id page) ;; page-id - 0 ;; to-index - #{(:id blue1)}) ;; ids + changes (cls/generate-relocate-shapes (pcb/empty-changes nil) + (:objects page) + #{(:parent-id blue1)} ;; parents + (:id b2) ;; parent-id + (:id page) ;; page-id + 0 ;; to-index + #{(:id blue1)}) ;; ids file' (thf/apply-changes file changes) ;; ============================== Get ================================= @@ -144,13 +144,13 @@ ;; ============================== Action ============================== - changes (cflh/generate-move-shapes-to-frame (pcb/empty-changes nil) - #{(:id blue1)} ;; ids - (:id b2) ;; frame-id - (:id page) ;; page-id - (:objects page) ;; objects - 0 ;; drop-index - nil) ;; cell + changes (cls/generate-move-shapes-to-frame (pcb/empty-changes nil) + #{(:id blue1)} ;; ids + (:id b2) ;; frame-id + (:id page) ;; page-id + (:objects page) ;; objects + 0 ;; drop-index + nil) ;; cell file' (thf/apply-changes file changes) @@ -174,26 +174,26 @@ ;; ============================== Action ============================== ;; Move blue1 into yellow - changes (cflh/generate-relocate-shapes (pcb/empty-changes nil) - (:objects page) - #{(:parent-id blue1)} ;; parents - (:id yellow) ;; parent-id - (:id page) ;; page-id - 0 ;; to-index - #{(:id blue1)}) ;; ids + changes (cls/generate-relocate-shapes (pcb/empty-changes nil) + (:objects page) + #{(:parent-id blue1)} ;; parents + (:id yellow) ;; parent-id + (:id page) ;; page-id + 0 ;; to-index + #{(:id blue1)}) ;; ids file' (thf/apply-changes file changes) page' (thf/current-page file') yellow' (thf/get-shape file' :frame-yellow) ;; Move yellow into root - changes' (cflh/generate-relocate-shapes (pcb/empty-changes nil) - (:objects page') - #{(:parent-id yellow')} ;; parents - uuid/zero ;; parent-id - (:id page') ;; page-id - 0 ;; to-index - #{(:id yellow')}) ;; ids + changes' (cls/generate-relocate-shapes (pcb/empty-changes nil) + (:objects page') + #{(:parent-id yellow')} ;; parents + uuid/zero ;; parent-id + (:id page') ;; page-id + 0 ;; to-index + #{(:id yellow')}) ;; ids file'' (thf/apply-changes file' changes') ;; ============================== Get ================================= @@ -216,26 +216,26 @@ ;; ============================== Action ============================== ;; Move blue1 into yellow - changes (cflh/generate-move-shapes-to-frame (pcb/empty-changes nil) - #{(:id blue1)} ;; ids - (:id yellow) ;; frame-id - (:id page) ;; page-id - (:objects page) ;; objects - 0 ;; drop-index - nil) ;; cell + changes (cls/generate-move-shapes-to-frame (pcb/empty-changes nil) + #{(:id blue1)} ;; ids + (:id yellow) ;; frame-id + (:id page) ;; page-id + (:objects page) ;; objects + 0 ;; drop-index + nil) ;; cell file' (thf/apply-changes file changes) page' (thf/current-page file') yellow' (thf/get-shape file' :frame-yellow) ;; Move yellow into root - changes' (cflh/generate-move-shapes-to-frame (pcb/empty-changes nil) - #{(:id yellow')} ;; ids - uuid/zero ;; frame-id - (:id page') ;; page-id - (:objects page') ;; objects - 0 ;; drop-index - nil) ;; cell + changes' (cls/generate-move-shapes-to-frame (pcb/empty-changes nil) + #{(:id yellow')} ;; ids + uuid/zero ;; frame-id + (:id page') ;; page-id + (:objects page') ;; objects + 0 ;; drop-index + nil) ;; cell file'' (thf/apply-changes file' changes') ;; ============================== Get ================================= @@ -259,13 +259,13 @@ ;; ============================== Action ============================== ;; Move blue1 into yellow - changes (cflh/generate-relocate-shapes (pcb/empty-changes nil) - (:objects page) - #{(:parent-id blue1)} ;; parents - (:id yellow) ;; parent-id - (:id page) ;; page-id - 0 ;; to-index - #{(:id blue1)}) ;; ids + changes (cls/generate-relocate-shapes (pcb/empty-changes nil) + (:objects page) + #{(:parent-id blue1)} ;; parents + (:id yellow) ;; parent-id + (:id page) ;; page-id + 0 ;; to-index + #{(:id blue1)}) ;; ids file' (thf/apply-changes file changes) page' (thf/current-page file') @@ -273,13 +273,13 @@ b2' (thf/get-shape file' :frame-b2) ;; Move yellow into b2 - changes' (cflh/generate-relocate-shapes (pcb/empty-changes nil) - (:objects page') - #{(:parent-id yellow')} ;; parents - (:id b2') ;; parent-id - (:id page') ;; page-id - 0 ;; to-index - #{(:id yellow')}) ;; ids + changes' (cls/generate-relocate-shapes (pcb/empty-changes nil) + (:objects page') + #{(:parent-id yellow')} ;; parents + (:id b2') ;; parent-id + (:id page') ;; page-id + 0 ;; to-index + #{(:id yellow')}) ;; ids file'' (thf/apply-changes file' changes') ;; ============================== Get ================================= @@ -302,13 +302,13 @@ ;; ============================== Action ============================== ;; Move blue1 into yellow - changes (cflh/generate-move-shapes-to-frame (pcb/empty-changes nil) - #{(:id blue1)} ;; ids - (:id yellow) ;; frame-id - (:id page) ;; page-id - (:objects page) ;; objects - 0 ;; drop-index - nil) ;; cell + changes (cls/generate-move-shapes-to-frame (pcb/empty-changes nil) + #{(:id blue1)} ;; ids + (:id yellow) ;; frame-id + (:id page) ;; page-id + (:objects page) ;; objects + 0 ;; drop-index + nil) ;; cell file' (thf/apply-changes file changes) page' (thf/current-page file') @@ -316,13 +316,13 @@ b2' (thf/get-shape file' :frame-b2) ;; Move yellow into b2 - changes' (cflh/generate-move-shapes-to-frame (pcb/empty-changes nil) - #{(:id yellow')} ;; ids - (:id b2') ;; frame-id - (:id page') ;; page-id - (:objects page') ;; objects - 0 ;; drop-index - nil) ;; cell + changes' (cls/generate-move-shapes-to-frame (pcb/empty-changes nil) + #{(:id yellow')} ;; ids + (:id b2') ;; frame-id + (:id page') ;; page-id + (:objects page') ;; objects + 0 ;; drop-index + nil) ;; cell file'' (thf/apply-changes file' changes') diff --git a/common/test/common_tests/logic/component_creation_test.cljc b/common/test/common_tests/logic/component_creation_test.cljc index 3e6499fb2..59ec29806 100644 --- a/common/test/common_tests/logic/component_creation_test.cljc +++ b/common/test/common_tests/logic/component_creation_test.cljc @@ -7,7 +7,7 @@ (ns common-tests.logic.component-creation-test (:require [app.common.files.changes-builder :as pcb] - [app.common.files.libraries-helpers :as cflh] + [app.common.logic.libraries :as cll] [clojure.test :as t] [common-tests.helpers.files :as thf] [common-tests.helpers.ids-map :as thi])) @@ -24,14 +24,14 @@ ;; Action [_ component-id changes] - (cflh/generate-add-component (pcb/empty-changes) - [shape1] - (:objects page) - (:id page) - (:id file) - true - nil - nil) + (cll/generate-add-component (pcb/empty-changes) + [shape1] + (:objects page) + (:id page) + (:id file) + true + nil + nil) file' (thf/apply-changes file changes) diff --git a/common/test/common_tests/logic/components_touched_test.cljc b/common/test/common_tests/logic/components_touched_test.cljc index 4d912a641..0aa14ca29 100644 --- a/common/test/common_tests/logic/components_touched_test.cljc +++ b/common/test/common_tests/logic/components_touched_test.cljc @@ -7,7 +7,8 @@ (ns common-tests.logic.components-touched-test (:require [app.common.files.changes-builder :as pcb] - [app.common.files.libraries-helpers :as cflh] + [app.common.logic.libraries :as cll] + [app.common.logic.shapes :as cls] [clojure.test :as t] [common-tests.helpers.compositions :as tho] [common-tests.helpers.files :as thf] @@ -31,11 +32,11 @@ update-fn (fn [shape] (assoc shape :fills (thf/sample-fills-color :fill-color "#fabada"))) - changes (cflh/generate-update-shapes (pcb/empty-changes nil (:id page)) - (:shapes copy-root) - update-fn - (:objects page) - {}) + changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) + (:shapes copy-root) + update-fn + (:objects page) + {}) file' (thf/apply-changes file changes) @@ -67,13 +68,13 @@ ;; Action ;; IMPORTANT: as modifying copies structure is now forbidden, this action ;; will not have any effect, and so the parent shape won't also be touched. - changes (cflh/generate-relocate-shapes (pcb/empty-changes) - (:objects page) - #{(:parent-id copy-root)} ; parents - (thi/id :copy-root) ; parent-id - (:id page) ; page-id - 0 ; to-index - #{(thi/id :free-shape)}) ; ids + changes (cls/generate-relocate-shapes (pcb/empty-changes) + (:objects page) + #{(:parent-id copy-root)} ; parents + (thi/id :copy-root) ; parent-id + (:id page) ; page-id + 0 ; to-index + #{(thi/id :free-shape)}) ; ids file' (thf/apply-changes file changes) @@ -100,12 +101,12 @@ ;; IMPORTANT: as modifying copies structure is now forbidden, this action will not ;; delete the child shape, but hide it (thus setting the visibility group). [_all-parents changes] - (cflh/generate-delete-shapes (pcb/empty-changes) - file - page - (:objects page) - (set (:shapes copy-root)) - {:components-v2 true}) + (cls/generate-delete-shapes (pcb/empty-changes) + file + page + (:objects page) + (set (:shapes copy-root)) + {:components-v2 true}) file' (thf/apply-changes file changes) @@ -133,13 +134,13 @@ ;; Action ;; IMPORTANT: as modifying copies structure is now forbidden, this action ;; will not have any effect, and so the parent shape won't also be touched. - changes (cflh/generate-relocate-shapes (pcb/empty-changes) - (:objects page) - #{(:parent-id copy-child1)} ; parents - (thi/id :copy-root) ; parent-id - (:id page) ; page-id - 2 ; to-index - #{(:id copy-child1)}) ; ids + changes (cls/generate-relocate-shapes (pcb/empty-changes) + (:objects page) + #{(:parent-id copy-child1)} ; parents + (thi/id :copy-root) ; parent-id + (:id page) ; page-id + 2 ; to-index + #{(:id copy-child1)}) ; ids file' (thf/apply-changes file changes) diff --git a/common/test/common_tests/logic/swap_and_reset_test.cljc b/common/test/common_tests/logic/swap_and_reset_test.cljc index 1ad70d9b7..535315297 100644 --- a/common/test/common_tests/logic/swap_and_reset_test.cljc +++ b/common/test/common_tests/logic/swap_and_reset_test.cljc @@ -7,11 +7,9 @@ (ns common-tests.logic.swap-and-reset-test (:require [app.common.files.changes-builder :as pcb] - [app.common.files.libraries-helpers :as cflh] - [app.common.pprint :as pp] + [app.common.logic.libraries :as cll] [app.common.types.component :as ctk] [app.common.types.file :as ctf] - [app.common.uuid :as uuid] [clojure.test :as t] [common-tests.helpers.compositions :as thc] [common-tests.helpers.files :as thf] @@ -34,16 +32,16 @@ ;; Action [new-shape all-parents changes] - (cflh/generate-component-swap (pcb/empty-changes) - (:objects page) - component-1-copy-root - (:data file) - page - {(:id file) file} - (:id component-2) - 0 - nil - {}) + (cll/generate-component-swap (pcb/empty-changes) + (:objects page) + component-1-copy-root + (:data file) + page + {(:id file) file} + (:id component-2) + 0 + nil + {}) file' (thf/apply-changes file changes) @@ -82,16 +80,16 @@ ;; Action [new-shape all-parents changes] - (cflh/generate-component-swap (pcb/empty-changes) - (:objects page) - copy - (:data file) - page - libraries - (:id component-2) - 0 - nil - {}) + (cll/generate-component-swap (pcb/empty-changes) + (:objects page) + copy + (:data file) + page + libraries + (:id component-2) + 0 + nil + {}) file' (thf/apply-changes file changes) libraries' {(:id file') file'} @@ -137,27 +135,27 @@ ;; Action [new-shape all-parents changes-swap] - (cflh/generate-component-swap (pcb/empty-changes) - (:objects page) - copy - (:data file) - page - {(:id file) file} - (:id component-2) - 0 - nil - {}) + (cll/generate-component-swap (pcb/empty-changes) + (:objects page) + copy + (:data file) + page + {(:id file) file} + (:id component-2) + 0 + nil + {}) file-swap (thf/apply-changes file changes-swap) page-swap (thf/current-page file-swap) changes - (cflh/generate-reset-component (pcb/empty-changes) - file-swap - {(:id file-swap) file-swap} - page-swap - (:id new-shape) - true) + (cll/generate-reset-component (pcb/empty-changes) + file-swap + {(:id file-swap) file-swap} + page-swap + (:id new-shape) + true) file' (thf/apply-changes file changes) page' (thf/current-page file') diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index 078f6c1a3..bb88913c4 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -13,13 +13,13 @@ [app.common.features :as cfeat] [app.common.files.changes-builder :as pcb] [app.common.files.helpers :as cfh] - [app.common.files.libraries-helpers :as cflh] [app.common.geom.align :as gal] [app.common.geom.point :as gpt] [app.common.geom.proportions :as gpp] [app.common.geom.rect :as grc] [app.common.geom.shapes :as gsh] [app.common.geom.shapes.grid-layout :as gslg] + [app.common.logic.shapes :as cls] [app.common.schema :as sm] [app.common.text :as txt] [app.common.transit :as t] @@ -809,13 +809,13 @@ all-parents (into #{parent-id} (map #(cfh/get-parent-id objects %)) ids) parents (if ignore-parents? #{parent-id} all-parents) - changes (cflh/generate-relocate-shapes (pcb/empty-changes it) - objects - parents - parent-id - page-id - to-index - ids) + changes (cls/generate-relocate-shapes (pcb/empty-changes it) + objects + parents + parent-id + page-id + to-index + ids) undo-id (js/Symbol)] (rx/of (dwu/start-undo-transaction undo-id) diff --git a/frontend/src/app/main/data/workspace/changes.cljs b/frontend/src/app/main/data/workspace/changes.cljs index 87dec4048..56fbb2411 100644 --- a/frontend/src/app/main/data/workspace/changes.cljs +++ b/frontend/src/app/main/data/workspace/changes.cljs @@ -12,8 +12,8 @@ [app.common.files.changes :as cpc] [app.common.files.changes-builder :as pcb] [app.common.files.helpers :as cph] - [app.common.files.libraries-helpers :as cflh] [app.common.logging :as log] + [app.common.logic.shapes :as cls] [app.common.schema :as sm] [app.common.types.shape-tree :as ctst] [app.common.uuid :as uuid] @@ -77,13 +77,13 @@ changes (-> (pcb/empty-changes it page-id) (pcb/set-save-undo? save-undo?) (pcb/set-stack-undo? stack-undo?) - (cflh/generate-update-shapes ids - update-fn - objects - {:attrs attrs - :ignore-tree ignore-tree - :ignore-touched ignore-touched - :with-objects? with-objects?}) + (cls/generate-update-shapes ids + update-fn + objects + {:attrs attrs + :ignore-tree ignore-tree + :ignore-touched ignore-touched + :with-objects? with-objects?}) (cond-> undo-group (pcb/set-undo-group undo-group))) diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index a542301e8..585ab58a5 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -11,10 +11,11 @@ [app.common.files.changes :as ch] [app.common.files.changes-builder :as pcb] [app.common.files.helpers :as cfh] - [app.common.files.libraries-helpers :as cflh] [app.common.files.shapes-helpers :as cfsh] [app.common.geom.point :as gpt] [app.common.logging :as log] + [app.common.logic.libraries :as cll] + [app.common.logic.shapes :as cls] [app.common.types.color :as ctc] [app.common.types.component :as ctk] [app.common.types.components-list :as ctkl] @@ -351,9 +352,9 @@ parents (into #{} (map :parent-id) shapes)] (when-not (empty? shapes) (let [[root _ changes] - (cflh/generate-add-component (pcb/empty-changes it) shapes objects page-id file-id components-v2 - dwg/prepare-create-group - cfsh/prepare-create-artboard-from-selection)] + (cll/generate-add-component (pcb/empty-changes it) shapes objects page-id file-id components-v2 + dwg/prepare-create-group + cfsh/prepare-create-artboard-from-selection)] (when-not (empty? (:redo-changes changes)) (rx/of (dch/commit-changes changes) (dws/select-shapes (d/ordered-set (:id root))) @@ -417,7 +418,7 @@ (let [library-data (get state :workspace-data) components-v2 (features/active-feature? state "components/v2") changes (-> (pcb/empty-changes it) - (cflh/generate-rename-component id new-name library-data components-v2))] + (cll/generate-rename-component id new-name library-data components-v2))] (rx/of (dch/commit-changes changes)))))))) @@ -452,7 +453,7 @@ library (get libraries library-id) components-v2 (features/active-feature? state "components/v2") changes (-> (pcb/empty-changes it nil) - (cflh/generate-duplicate-component library component-id components-v2))] + (cll/generate-duplicate-component library component-id components-v2))] (rx/of (dch/commit-changes changes)))))) @@ -478,9 +479,9 @@ [all-parents changes] (-> (pcb/empty-changes it page-id) ;; Deleting main root triggers component delete - (cflh/generate-delete-shapes file page objects #{root-id} {:components-v2 components-v2 - :undo-group undo-group - :undo-id undo-id}))] + (cls/generate-delete-shapes file page objects #{root-id} {:components-v2 components-v2 + :undo-group undo-group + :undo-id undo-id}))] (rx/of (dwu/start-undo-transaction undo-id) (dwt/clear-thumbnail (:current-file-id state) page-id root-id "component") @@ -508,7 +509,7 @@ library-data (wsh/get-file state library-id) objects (wsh/lookup-page-objects state page-id) changes (-> (pcb/empty-changes it) - (cflh/generate-restore-component library-data component-id library-id current-page objects))] + (cll/generate-restore-component library-data component-id library-id current-page objects))] (rx/of (dch/commit-changes changes)))))) @@ -545,13 +546,13 @@ (pcb/with-objects objects)) [new-shape changes] - (cflh/generate-instantiate-component changes - objects - file-id - component-id - position - page - libraries) + (cll/generate-instantiate-component changes + objects + file-id + component-id + position + page + libraries) undo-id (js/Symbol)] (rx/of (dwu/start-undo-transaction undo-id) (dch/commit-changes changes) @@ -574,7 +575,7 @@ libraries (wsh/get-libraries state) changes (-> (pcb/empty-changes it) - (cflh/generate-detach-component id file page-id libraries))] + (cll/generate-detach-component id file page-id libraries))] (rx/of (dch/commit-changes changes)))))) @@ -610,7 +611,7 @@ changes (when can-detach? (reduce (fn [changes id] - (cflh/generate-detach-instance changes container libraries id)) + (cll/generate-detach-instance changes container libraries id)) (pcb/empty-changes it) selected))] @@ -696,7 +697,7 @@ changes (-> (pcb/empty-changes it) - (cflh/generate-reset-component file-full libraries container id components-v2))] + (cll/generate-reset-component file-full libraries container id components-v2))] (log/debug :msg "RESET-COMPONENT finished" :js/rchanges (log-changes (:redo-changes changes) @@ -751,7 +752,7 @@ (-> (pcb/empty-changes it) (pcb/set-undo-group undo-group) (pcb/with-container container) - (cflh/generate-sync-shape-inverse full-file libraries container id components-v2)) + (cll/generate-sync-shape-inverse full-file libraries container id components-v2)) file-id (:component-file shape) file (wsh/get-file state file-id) @@ -890,7 +891,7 @@ [new-shape all-parents changes] (-> (pcb/empty-changes it (:id page)) (pcb/set-undo-group undo-group) - (cflh/generate-component-swap objects shape file page libraries id-new-component index target-cell keep-props-values))] + (cll/generate-component-swap objects shape file page libraries id-new-component index target-cell keep-props-values))] (rx/of (dwu/start-undo-transaction undo-id) @@ -976,7 +977,7 @@ libraries (wsh/get-libraries state) current-file-id (:current-file-id state) - changes (cflh/generate-sync-file-changes + changes (cll/generate-sync-file-changes (pcb/empty-changes it) undo-group asset-type diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index b271f1ae6..e0dee732f 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -11,10 +11,10 @@ [app.common.files.changes-builder :as pcb] [app.common.files.focus :as cpf] [app.common.files.helpers :as cfh] - [app.common.files.libraries-helpers :as cflh] [app.common.geom.point :as gpt] [app.common.geom.rect :as grc] [app.common.geom.shapes :as gsh] + [app.common.logic.libraries :as cll] [app.common.record :as cr] [app.common.types.component :as ctk] [app.common.types.container :as ctn] @@ -434,20 +434,20 @@ (gpt/subtract (-> origin-frame :selrect gpt/point))) instantiate-component - #(cflh/generate-instantiate-component changes - objects - file-id - (:component-id component-root) - pos - page - libraries - (:id component-root) - parent-id - frame-id - {}) + #(cll/generate-instantiate-component changes + objects + file-id + (:component-id component-root) + pos + page + libraries + (:id component-root) + parent-id + frame-id + {}) restore-component - #(let [restore (cflh/prepare-restore-component changes library-data (:component-id component-root) page delta (:id component-root) parent-id frame-id)] + #(let [restore (cll/prepare-restore-component changes library-data (:component-id component-root) page delta (:id component-root) parent-id frame-id)] [(:shape restore) (:changes restore)]) [_shape changes] @@ -498,7 +498,7 @@ regenerate-component (fn [changes shape] (let [components-v2 (dm/get-in library-data [:options :components-v2]) - [_ changes] (cflh/generate-add-component-changes changes shape objects file-id (:id page) components-v2)] + [_ changes] (cll/generate-add-component-changes changes shape objects file-id (:id page) components-v2)] changes)) new-obj diff --git a/frontend/src/app/main/data/workspace/shapes.cljs b/frontend/src/app/main/data/workspace/shapes.cljs index 692ff9317..1918aa0f3 100644 --- a/frontend/src/app/main/data/workspace/shapes.cljs +++ b/frontend/src/app/main/data/workspace/shapes.cljs @@ -10,8 +10,8 @@ [app.common.data.macros :as dm] [app.common.files.changes-builder :as pcb] [app.common.files.helpers :as cfh] - [app.common.files.libraries-helpers :as cflh] [app.common.files.shapes-helpers :as cfsh] + [app.common.logic.shapes :as cls] [app.common.schema :as sm] [app.common.types.container :as ctn] [app.common.types.shape :as cts] @@ -105,10 +105,10 @@ components-v2 (features/active-feature? state "components/v2") undo-id (or (:undo-id options) (js/Symbol)) [all-parents changes] (-> (pcb/empty-changes it (:id page)) - (cflh/generate-delete-shapes file page objects ids {:components-v2 components-v2 - :ignore-touched (:component-swap options) - :undo-group (:undo-group options) - :undo-id undo-id}))] + (cls/generate-delete-shapes file page objects ids {:components-v2 components-v2 + :ignore-touched (:component-swap options) + :undo-group (:undo-group options) + :undo-id undo-id}))] (rx/of (dwu/start-undo-transaction undo-id) (dc/detach-comment-thread ids) diff --git a/frontend/src/app/main/data/workspace/transforms.cljs b/frontend/src/app/main/data/workspace/transforms.cljs index 310a79c58..e381b4bee 100644 --- a/frontend/src/app/main/data/workspace/transforms.cljs +++ b/frontend/src/app/main/data/workspace/transforms.cljs @@ -11,7 +11,6 @@ [app.common.data.macros :as dm] [app.common.files.changes-builder :as pcb] [app.common.files.helpers :as cfh] - [app.common.files.libraries-helpers :as cflh] [app.common.geom.matrix :as gmt] [app.common.geom.modifiers :as gm] [app.common.geom.point :as gpt] @@ -19,6 +18,7 @@ [app.common.geom.shapes :as gsh] [app.common.geom.shapes.flex-layout :as gslf] [app.common.geom.shapes.grid-layout :as gslg] + [app.common.logic.shapes :as cls] [app.common.math :as mth] [app.common.types.component :as ctk] [app.common.types.container :as ctn] @@ -839,7 +839,7 @@ (watch [it state _] (let [page-id (:current-page-id state) objects (wsh/lookup-page-objects state page-id) - changes (cflh/generate-move-shapes-to-frame (pcb/empty-changes it) ids frame-id page-id objects drop-index cell)] + changes (cls/generate-move-shapes-to-frame (pcb/empty-changes it) ids frame-id page-id objects drop-index cell)] (when (and (some? frame-id) (d/not-empty? changes)) (rx/of (dch/commit-changes changes) diff --git a/frontend/test/frontend_tests/helpers/pages.cljs b/frontend/test/frontend_tests/helpers/pages.cljs index e650c3d28..9289d992a 100644 --- a/frontend/test/frontend_tests/helpers/pages.cljs +++ b/frontend/test/frontend_tests/helpers/pages.cljs @@ -9,9 +9,9 @@ [app.common.files.changes :as cp] [app.common.files.changes-builder :as pcb] [app.common.files.helpers :as cfh] - [app.common.files.libraries-helpers :as cflh] [app.common.files.shapes-helpers :as cfsh] [app.common.geom.point :as gpt] + [app.common.logic.libraries :as cll] [app.common.types.shape :as cts] [app.common.uuid :as uuid] [app.main.data.workspace.groups :as dwg] @@ -132,14 +132,14 @@ shapes (dwg/shapes-for-grouping objects shape-ids) [group component-id changes] - (cflh/generate-add-component (pcb/empty-changes nil) - shapes - (:objects page) - (:id page) - current-file-id - true - dwg/prepare-create-group - cfsh/prepare-create-artboard-from-selection)] + (cll/generate-add-component (pcb/empty-changes nil) + shapes + (:objects page) + (:id page) + current-file-id + true + dwg/prepare-create-group + cfsh/prepare-create-artboard-from-selection)] (swap! idmap assoc instance-label (:id group) component-label component-id) @@ -158,13 +158,13 @@ (pcb/with-objects objects)) [new-shape changes] - (cflh/generate-instantiate-component changes - objects - file-id - component-id - (gpt/point 100 100) - page - libraries)] + (cll/generate-instantiate-component changes + objects + file-id + component-id + (gpt/point 100 100) + page + libraries)] (swap! idmap assoc label (:id new-shape)) (update state :workspace-data -- Gitee From 832c1db63ba379653d36e3e2ca5341a158822ee3 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Mon, 6 May 2024 17:29:27 +0200 Subject: [PATCH 0503/1266] :sparkles: Add login page as Page Object Model --- .../get-profile-anonymous.json | 0 .../get-built-in-templates-empty.json | 0 .../get-font-variants-empty.json | 0 .../logged-in-user/get-profile-logged-in.json | 0 .../get-profiles-for-file-comments-empty.json | 0 .../logged-in-user/get-projects-default.json | 0 .../get-team-members-your-penpot.json | 0 .../get-team-recent-files-empty.json | 0 .../get-team-users-single-user.json | 0 .../logged-in-user/get-teams-default.json | 0 .../get-unread-comment-threads-empty.json | 0 .../login-with-password-success.json | 0 .../login-with-password-error.json | 0 frontend/playwright/helpers/index.js | 8 +- frontend/playwright/helpers/intercepts.js | 8 ++ frontend/playwright/login.spec.js | 80 ------------------- frontend/playwright/ui/pages/login-page.js | 76 ++++++++++++++++++ .../playwright/{ => ui/specs}/example.spec.js | 2 +- frontend/playwright/ui/specs/login.spec.js | 54 +++++++++++++ 19 files changed, 143 insertions(+), 85 deletions(-) rename frontend/playwright/{fixtures => data}/get-profile-anonymous.json (100%) rename frontend/playwright/{fixtures => data}/logged-in-user/get-built-in-templates-empty.json (100%) rename frontend/playwright/{fixtures => data}/logged-in-user/get-font-variants-empty.json (100%) rename frontend/playwright/{fixtures => data}/logged-in-user/get-profile-logged-in.json (100%) rename frontend/playwright/{fixtures => data}/logged-in-user/get-profiles-for-file-comments-empty.json (100%) rename frontend/playwright/{fixtures => data}/logged-in-user/get-projects-default.json (100%) rename frontend/playwright/{fixtures => data}/logged-in-user/get-team-members-your-penpot.json (100%) rename frontend/playwright/{fixtures => data}/logged-in-user/get-team-recent-files-empty.json (100%) rename frontend/playwright/{fixtures => data}/logged-in-user/get-team-users-single-user.json (100%) rename frontend/playwright/{fixtures => data}/logged-in-user/get-teams-default.json (100%) rename frontend/playwright/{fixtures => data}/logged-in-user/get-unread-comment-threads-empty.json (100%) rename frontend/playwright/{fixtures => data}/logged-in-user/login-with-password-success.json (100%) rename frontend/playwright/{fixtures => data}/login-with-password-error.json (100%) create mode 100644 frontend/playwright/helpers/intercepts.js delete mode 100644 frontend/playwright/login.spec.js create mode 100644 frontend/playwright/ui/pages/login-page.js rename frontend/playwright/{ => ui/specs}/example.spec.js (84%) create mode 100644 frontend/playwright/ui/specs/login.spec.js diff --git a/frontend/playwright/fixtures/get-profile-anonymous.json b/frontend/playwright/data/get-profile-anonymous.json similarity index 100% rename from frontend/playwright/fixtures/get-profile-anonymous.json rename to frontend/playwright/data/get-profile-anonymous.json diff --git a/frontend/playwright/fixtures/logged-in-user/get-built-in-templates-empty.json b/frontend/playwright/data/logged-in-user/get-built-in-templates-empty.json similarity index 100% rename from frontend/playwright/fixtures/logged-in-user/get-built-in-templates-empty.json rename to frontend/playwright/data/logged-in-user/get-built-in-templates-empty.json diff --git a/frontend/playwright/fixtures/logged-in-user/get-font-variants-empty.json b/frontend/playwright/data/logged-in-user/get-font-variants-empty.json similarity index 100% rename from frontend/playwright/fixtures/logged-in-user/get-font-variants-empty.json rename to frontend/playwright/data/logged-in-user/get-font-variants-empty.json diff --git a/frontend/playwright/fixtures/logged-in-user/get-profile-logged-in.json b/frontend/playwright/data/logged-in-user/get-profile-logged-in.json similarity index 100% rename from frontend/playwright/fixtures/logged-in-user/get-profile-logged-in.json rename to frontend/playwright/data/logged-in-user/get-profile-logged-in.json diff --git a/frontend/playwright/fixtures/logged-in-user/get-profiles-for-file-comments-empty.json b/frontend/playwright/data/logged-in-user/get-profiles-for-file-comments-empty.json similarity index 100% rename from frontend/playwright/fixtures/logged-in-user/get-profiles-for-file-comments-empty.json rename to frontend/playwright/data/logged-in-user/get-profiles-for-file-comments-empty.json diff --git a/frontend/playwright/fixtures/logged-in-user/get-projects-default.json b/frontend/playwright/data/logged-in-user/get-projects-default.json similarity index 100% rename from frontend/playwright/fixtures/logged-in-user/get-projects-default.json rename to frontend/playwright/data/logged-in-user/get-projects-default.json diff --git a/frontend/playwright/fixtures/logged-in-user/get-team-members-your-penpot.json b/frontend/playwright/data/logged-in-user/get-team-members-your-penpot.json similarity index 100% rename from frontend/playwright/fixtures/logged-in-user/get-team-members-your-penpot.json rename to frontend/playwright/data/logged-in-user/get-team-members-your-penpot.json diff --git a/frontend/playwright/fixtures/logged-in-user/get-team-recent-files-empty.json b/frontend/playwright/data/logged-in-user/get-team-recent-files-empty.json similarity index 100% rename from frontend/playwright/fixtures/logged-in-user/get-team-recent-files-empty.json rename to frontend/playwright/data/logged-in-user/get-team-recent-files-empty.json diff --git a/frontend/playwright/fixtures/logged-in-user/get-team-users-single-user.json b/frontend/playwright/data/logged-in-user/get-team-users-single-user.json similarity index 100% rename from frontend/playwright/fixtures/logged-in-user/get-team-users-single-user.json rename to frontend/playwright/data/logged-in-user/get-team-users-single-user.json diff --git a/frontend/playwright/fixtures/logged-in-user/get-teams-default.json b/frontend/playwright/data/logged-in-user/get-teams-default.json similarity index 100% rename from frontend/playwright/fixtures/logged-in-user/get-teams-default.json rename to frontend/playwright/data/logged-in-user/get-teams-default.json diff --git a/frontend/playwright/fixtures/logged-in-user/get-unread-comment-threads-empty.json b/frontend/playwright/data/logged-in-user/get-unread-comment-threads-empty.json similarity index 100% rename from frontend/playwright/fixtures/logged-in-user/get-unread-comment-threads-empty.json rename to frontend/playwright/data/logged-in-user/get-unread-comment-threads-empty.json diff --git a/frontend/playwright/fixtures/logged-in-user/login-with-password-success.json b/frontend/playwright/data/logged-in-user/login-with-password-success.json similarity index 100% rename from frontend/playwright/fixtures/logged-in-user/login-with-password-success.json rename to frontend/playwright/data/logged-in-user/login-with-password-success.json diff --git a/frontend/playwright/fixtures/login-with-password-error.json b/frontend/playwright/data/login-with-password-error.json similarity index 100% rename from frontend/playwright/fixtures/login-with-password-error.json rename to frontend/playwright/data/login-with-password-error.json diff --git a/frontend/playwright/helpers/index.js b/frontend/playwright/helpers/index.js index 419dfa918..ac8108f81 100644 --- a/frontend/playwright/helpers/index.js +++ b/frontend/playwright/helpers/index.js @@ -1,14 +1,14 @@ export const interceptRPC = async (page, path, jsonFilename, options = {}) => { const interceptConfig = { status: 200, - ...options + ...options, }; - await page.route(`**/api/rpc/command/${path}`, (route) => { - route.fulfill({ + await page.route(`**/api/rpc/command/${path}`, async (route) => { + await route.fulfill({ ...interceptConfig, contentType: "application/transit+json", - path: `playwright/fixtures/${jsonFilename}`, + path: `playwright/data/${jsonFilename}`, }); }); }; diff --git a/frontend/playwright/helpers/intercepts.js b/frontend/playwright/helpers/intercepts.js new file mode 100644 index 000000000..ecb46b817 --- /dev/null +++ b/frontend/playwright/helpers/intercepts.js @@ -0,0 +1,8 @@ +import { interceptRPC } from "./index"; + + +export const setupNotLogedIn = async (page) => { + await interceptRPC(page, "get-profile", "get-profile-anonymous.json"); + +}; + diff --git a/frontend/playwright/login.spec.js b/frontend/playwright/login.spec.js deleted file mode 100644 index 5b10ca2ce..000000000 --- a/frontend/playwright/login.spec.js +++ /dev/null @@ -1,80 +0,0 @@ -import { test, expect } from "@playwright/test"; -import { interceptRPC } from "./helpers"; - -const setupLoggedOutUser = async (page) => { - await interceptRPC(page, "get-profile", "get-profile-anonymous.json"); - await interceptRPC(page, "login-with-password", "logged-in-user/login-with-password-success.json"); -}; - -// TODO: maybe Playwright's fixtures are the right way to do this? -const setupDashboardUser = async (page) => { - await interceptRPC(page, "get-profile", "logged-in-user/get-profile-logged-in.json"); - await interceptRPC(page, "get-teams", "logged-in-user/get-teams-default.json"); - await interceptRPC(page, "get-font-variants?team-id=*", "logged-in-user/get-font-variants-empty.json"); - await interceptRPC(page, "get-projects?team-id=*", "logged-in-user/get-projects-default.json"); - await interceptRPC(page, "get-team-members?team-id=*", "logged-in-user/get-team-members-your-penpot.json"); - await interceptRPC(page, "get-team-users?team-id=*", "logged-in-user/get-team-users-single-user.json"); - await interceptRPC( - page, - "get-unread-comment-threads?team-id=*", - "logged-in-user/get-team-users-single-user.json", - ); - await interceptRPC( - page, - "get-team-recent-files?team-id=*", - "logged-in-user/get-team-recent-files-empty.json", - ); - await interceptRPC( - page, - "get-profiles-for-file-comments", - "logged-in-user/get-profiles-for-file-comments-empty.json", - ); -}; - -test("Shows login page when going to index and user is logged out", async ({ page }) => { - setupLoggedOutUser(page); - - await page.goto("/"); - - await expect(page).toHaveURL(/auth\/login$/); - await expect(page.getByRole("heading", { name: "Log into my account" } )).toBeVisible(); -}); - -test("User submit a wrong formated email ", async ({ page }) => { - await interceptRPC(page, "get-profile", "get-profile-anonymous.json"); - await page.goto("/"); - await page.getByLabel("Email").fill("foo"); - - await expect(page).toHaveURL(/auth\/login$/); - await expect(page.getByText("Enter a valid email please")).toBeVisible(); -}); - -test("User logs in by filling the login form", async ({ page }) => { - setupLoggedOutUser(page); - - await page.goto("/#/auth/login"); - - setupDashboardUser(page); - - await page.getByLabel("Email").fill("foo@example.com"); - await page.getByLabel("Password").fill("loremipsum"); - - await page.getByRole("button", { name: "Login" }).click(); - - await expect(page).toHaveURL(/dashboard/); -}); - -test("User submits wrong credentials", async ({ page }) => { - await interceptRPC(page, "get-profile", "get-profile-anonymous.json"); - await interceptRPC(page, "login-with-password", "login-with-password-error.json", { status: 400 }); - - await page.goto("/"); - - await page.getByLabel("Email").fill("foo123@example.com"); - await page.getByLabel("Password").fill("aaaa"); - - await page.getByRole("button", { name: "Login" }).click(); - - await expect(page.getByText("Email or password is incorrect")).toBeVisible(); - await expect(page).toHaveURL(/auth\/login$/); -}); diff --git a/frontend/playwright/ui/pages/login-page.js b/frontend/playwright/ui/pages/login-page.js new file mode 100644 index 000000000..1358f4ab3 --- /dev/null +++ b/frontend/playwright/ui/pages/login-page.js @@ -0,0 +1,76 @@ +import { interceptRPC } from "../../helpers/index"; + +class LoginPage { + constructor(page) { + this.page = page; + this.loginButton = page.getByRole("button", { name: "Login" }); + this.password = page.getByLabel("Password"); + this.userName = page.getByLabel("Email"); + this.message = page.getByText("Email or password is incorrect"); + this.badLoginMsg = page.getByText("Enter a valid email please"); + this.initialHeading = page.getByRole("heading", { name: "Log into my account" }); + } + + url() { + return this.page.url(); + } + + context() { + return this.page.context(); + } + + async fillEmailAndPasswordInputs(email, password) { + await this.userName.fill(email); + await this.password.fill(password); + } + + async clickLoginButton() { + await this.loginButton.click(); + } + + async setupAllowedUser() { + await interceptRPC(this.page, "get-profile", "logged-in-user/get-profile-logged-in.json"); + await interceptRPC(this.page, "get-teams", "logged-in-user/get-teams-default.json"); + await interceptRPC( + this.page, + "get-font-variants?team-id=*", + "logged-in-user/get-font-variants-empty.json", + ); + await interceptRPC(this.page, "get-projects?team-id=*", "logged-in-user/get-projects-default.json"); + await interceptRPC( + this.page, + "get-team-members?team-id=*", + "logged-in-user/get-team-members-your-penpot.json", + ); + await interceptRPC( + this.page, + "get-team-users?team-id=*", + "logged-in-user/get-team-users-single-user.json", + ); + await interceptRPC( + this.page, + "get-unread-comment-threads?team-id=*", + "logged-in-user/get-team-users-single-user.json", + ); + await interceptRPC( + this.page, + "get-team-recent-files?team-id=*", + "logged-in-user/get-team-recent-files-empty.json", + ); + await interceptRPC( + this.page, + "get-profiles-for-file-comments", + "logged-in-user/get-profiles-for-file-comments-empty.json", + ); + } + + async setupLoginSuccess() { + await interceptRPC(this.page, "login-with-password", "logged-in-user/login-with-password-success.json"); + } + + async setupLoginError() { + await interceptRPC(this.page, "login-with-password", "login-with-password-error.json", { status: 400 }); + } +} + +export default LoginPage; diff --git a/frontend/playwright/example.spec.js b/frontend/playwright/ui/specs/example.spec.js similarity index 84% rename from frontend/playwright/example.spec.js rename to frontend/playwright/ui/specs/example.spec.js index f2450fa36..ad5e4712d 100644 --- a/frontend/playwright/example.spec.js +++ b/frontend/playwright/ui/specs/example.spec.js @@ -5,7 +5,7 @@ test("Has title", async ({ page }) => { route.fulfill({ status: 200, contentType: "application/transit+json", - path: "playwright/fixtures/get-profile-anonymous.json", + path: "playwright/data/get-profile-anonymous.json", }); }); await page.goto("/"); diff --git a/frontend/playwright/ui/specs/login.spec.js b/frontend/playwright/ui/specs/login.spec.js new file mode 100644 index 000000000..08d3753c4 --- /dev/null +++ b/frontend/playwright/ui/specs/login.spec.js @@ -0,0 +1,54 @@ +import { test, expect } from "@playwright/test"; +import { setupNotLogedIn } from "../../helpers/intercepts"; + +import LoginPage from "../pages/login-page"; + +test.beforeEach(async ({ page }) => { + await setupNotLogedIn(page); + await page.goto("/#/auth/login"); +}); + +test("Shows login page when going to index and user is logged out", async ({ page }) => { + const loginPage = new LoginPage(page); + + await loginPage.setupAllowedUser(); + + await expect(loginPage.url()).toMatch(/auth\/login$/); + await expect(loginPage.initialHeading).toBeVisible(); +}); + +test("User submit a wrong formated email ", async ({ page }) => { + const loginPage = new LoginPage(page); + + await loginPage.setupLoginSuccess(); + + await loginPage.fillEmailAndPasswordInputs("foo", "lorenIpsum"); + + await expect(loginPage.badLoginMsg).toBeVisible(); +}); + +test("User logs in by filling the login form", async ({ page }) => { + const loginPage = new LoginPage(page); + + await loginPage.setupLoginSuccess(); + await loginPage.setupAllowedUser(); + + await loginPage.fillEmailAndPasswordInputs("foo@example.com", "loremipsum"); + await loginPage.clickLoginButton(); + + await page.waitForURL('**/dashboard/**'); + await expect(page).toHaveURL(/dashboard/); + // await expect(loginPage.url()).toMatch(/dashboard/); +}); + +test("User submits wrong credentials", async ({ page }) => { + const loginPage = new LoginPage(page); + + await loginPage.setupLoginError(); + + await loginPage.fillEmailAndPasswordInputs("test@example.com", "loremipsum"); + await loginPage.clickLoginButton(); + + await expect(loginPage.message).toBeVisible(); + await expect(loginPage.url()).toMatch(/auth\/login$/); +}); -- Gitee From 30321e54f0928ae1aecd76d87e44cd6f147f3b04 Mon Sep 17 00:00:00 2001 From: AzazelN28 Date: Thu, 25 Apr 2024 14:14:46 +0200 Subject: [PATCH 0504/1266] :paperclip: Add WebSocket mock --- .gitignore | 4 + .../get-builtin-templates-empty.json | 1 + frontend/playwright/helpers/MockRPC.js | 8 + frontend/playwright/helpers/MockWebSocket.js | 81 +++++++ frontend/playwright/helpers/index.js | 14 -- frontend/playwright/login.spec.js | 69 ++++++ frontend/playwright/scripts/MockWebSocket.js | 220 ++++++++++++++++++ package-lock.json | 91 ++++++++ package.json | 4 + playwright.config.ts | 77 ++++++ yarn.lock | 48 +++- 11 files changed, 591 insertions(+), 26 deletions(-) create mode 100644 frontend/playwright/data/logged-in-user/get-builtin-templates-empty.json create mode 100644 frontend/playwright/helpers/MockRPC.js create mode 100644 frontend/playwright/helpers/MockWebSocket.js delete mode 100644 frontend/playwright/helpers/index.js create mode 100644 frontend/playwright/login.spec.js create mode 100644 frontend/playwright/scripts/MockWebSocket.js create mode 100644 package-lock.json create mode 100644 playwright.config.ts diff --git a/.gitignore b/.gitignore index 0e271d125..9b3cdd4b0 100644 --- a/.gitignore +++ b/.gitignore @@ -68,3 +68,7 @@ clj-profiler/ node_modules frontend/.storybook/preview-body.html +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/frontend/playwright/data/logged-in-user/get-builtin-templates-empty.json b/frontend/playwright/data/logged-in-user/get-builtin-templates-empty.json new file mode 100644 index 000000000..0637a088a --- /dev/null +++ b/frontend/playwright/data/logged-in-user/get-builtin-templates-empty.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/frontend/playwright/helpers/MockRPC.js b/frontend/playwright/helpers/MockRPC.js new file mode 100644 index 000000000..b08b9678d --- /dev/null +++ b/frontend/playwright/helpers/MockRPC.js @@ -0,0 +1,8 @@ +export const interceptRPC = (page, path, jsonFilename) => + page.route(`**/api/rpc/command/${path}`, (route) => + route.fulfill({ + status: 200, + contentType: "application/transit+json", + path: `playwright/fixtures/${jsonFilename}`, + }) + ); diff --git a/frontend/playwright/helpers/MockWebSocket.js b/frontend/playwright/helpers/MockWebSocket.js new file mode 100644 index 000000000..53d7612b7 --- /dev/null +++ b/frontend/playwright/helpers/MockWebSocket.js @@ -0,0 +1,81 @@ +export class MockWebSocket extends EventTarget { + static #mocks = new Map(); + + static async init(page) { + await page.exposeFunction('MockWebSocket$$constructor', (url, protocols) => { + console.log('MockWebSocket$$constructor', MockWebSocket, url, protocols) + const webSocket = new MockWebSocket(page, url, protocols); + this.#mocks.set(url, webSocket); + }); + await page.exposeFunction('MockWebSocket$$spyMessage', (url, data) => { + console.log('MockWebSocket$$spyMessage', url, data) + this.#mocks.get(url).dispatchEvent(new MessageEvent('message', { data })) + }); + await page.exposeFunction('MockWebSocket$$spyClose', (url, code, reason) => { + console.log('MockWebSocket$$spyClose', url, code, reason) + this.#mocks.get(url).dispatchEvent(new CloseEvent('close', { code, reason })) + }); + await page.addInitScript({ path: "playwright/scripts/MockWebSocket.js" }); + } + + static waitForURL(url) { + return new Promise((resolve) => { + let intervalID = setInterval(() => { + for (const [wsURL, ws] of this.#mocks) { + console.log(wsURL) + if (wsURL.includes(url)) { + clearInterval(intervalID); + return resolve(ws); + } + } + }, 30) + }) + } + + #page = null + #url + #protocols + + // spies. + #spyClose = null + #spyMessage = null + + constructor(page, url, protocols) { + super() + this.#page = page + this.#url = url + this.#protocols = protocols + } + + mockOpen(options) { + return this.#page.evaluate((options) => { + WebSocket.getByURL(url).mockOpen(options) + }, options) + } + + mockMessage(data) { + return this.#page.evaluate((data) => { + WebSocket.getByURL(url).mockMessage(data) + }, data) + } + + mockClose() { + return this.#page.evaluate(() => { + WebSocket.getByURL(url).mockClose() + }) + } + + spyClose(fn) { + if (typeof fn !== 'function') { + throw new TypeError('Invalid callback') + } + this.#spyClose = fn + } + + spyMessage(fn) { + if (typeof fn !== 'function') { + throw new TypeError('Invalid callback') + } + this.#spyMessage = fn + } +} diff --git a/frontend/playwright/helpers/index.js b/frontend/playwright/helpers/index.js deleted file mode 100644 index ac8108f81..000000000 --- a/frontend/playwright/helpers/index.js +++ /dev/null @@ -1,14 +0,0 @@ -export const interceptRPC = async (page, path, jsonFilename, options = {}) => { - const interceptConfig = { - status: 200, - ...options, - }; - - await page.route(`**/api/rpc/command/${path}`, async (route) => { - await route.fulfill({ - ...interceptConfig, - contentType: "application/transit+json", - path: `playwright/data/${jsonFilename}`, - }); - }); -}; diff --git a/frontend/playwright/login.spec.js b/frontend/playwright/login.spec.js new file mode 100644 index 000000000..18279b95a --- /dev/null +++ b/frontend/playwright/login.spec.js @@ -0,0 +1,69 @@ +import { test, expect } from "@playwright/test"; +import { interceptRPC } from "./helpers/MockRPC"; +import { MockWebSocket } from "./helpers/MockWebSocket"; + +const setupLoggedOutUser = async (page) => { + await interceptRPC(page, "get-profile", "get-profile-anonymous.json"); + await interceptRPC(page, "login-with-password", "logged-in-user/login-with-password-success.json"); +}; + +// TODO: maybe Playwright's fixtures are the right way to do this? +const setupDashboardUser = async (page) => { + await interceptRPC(page, "get-profile", "logged-in-user/get-profile-logged-in.json"); + await interceptRPC(page, "get-teams", "logged-in-user/get-teams-default.json"); + await interceptRPC(page, "get-font-variants?team-id=*", "logged-in-user/get-font-variants-empty.json"); + await interceptRPC(page, "get-projects?team-id=*", "logged-in-user/get-projects-default.json"); + await interceptRPC(page, "get-team-members?team-id=*", "logged-in-user/get-team-members-your-penpot.json"); + await interceptRPC(page, "get-team-users?team-id=*", "logged-in-user/get-team-users-single-user.json"); + await interceptRPC( + page, + "get-unread-comment-threads?team-id=*", + "logged-in-user/get-team-users-single-user.json", + ); + await interceptRPC( + page, + "get-team-recent-files?team-id=*", + "logged-in-user/get-team-recent-files-empty.json", + ); + await interceptRPC( + page, + "get-profiles-for-file-comments", + "logged-in-user/get-profiles-for-file-comments-empty.json", + ); + await interceptRPC( + page, + "get-builtin-templates", + "logged-in-user/get-builtin-templates-empty.json", + ); +}; + +test.beforeEach(async ({ page }) => { + await MockWebSocket.init(page); +}) + +test("Shows login page when going to index and user is logged out", async ({ page }) => { + await setupLoggedOutUser(page); + + await page.goto("/"); + + await expect(page).toHaveURL(/auth\/login$/); + await expect(page.getByText("Log into my account")).toBeVisible(); +}); + +test("User logs in by filling the login form", async ({ page }) => { + await setupLoggedOutUser(page); + + await page.goto("/#/auth/login"); + + await setupDashboardUser(page); + + await page.getByLabel("Email").fill("foo@example.com"); + await page.getByLabel("Password").fill("loremipsum"); + + await page.getByRole("button", { name: "Login" }).click(); + + const ws = await MockWebSocket.waitForURL('ws://0.0.0.0:3500/ws/notifications'); + console.log(ws) + + await expect(page).toHaveURL(/dashboard/); +}); diff --git a/frontend/playwright/scripts/MockWebSocket.js b/frontend/playwright/scripts/MockWebSocket.js new file mode 100644 index 000000000..457955449 --- /dev/null +++ b/frontend/playwright/scripts/MockWebSocket.js @@ -0,0 +1,220 @@ +console.log("MockWebSocket mock loaded"); +window.WebSocket = class MockWebSocket extends EventTarget { + static CONNECTING = 0; + static OPEN = 1; + static CLOSING = 2; + static CLOSED = 3; + + static #mocks = new Map(); + + static getAll() { + return this.#mocks.values(); + } + + static getByURL(url) { + return this.#mocks.get(url); + } + + #url; + #protocols; + #protocol = ""; + #binaryType = "blob"; + #bufferedAmount = 0; + #extensions = ""; + #readyState = MockWebSocket.CONNECTING; + + #onopen = null; + #onerror = null; + #onmessage = null; + #onclose = null; + + #spyMessage = null; + #spyClose = null; + + constructor(url, protocols) { + super(); + + console.log("MockWebSocket", url, protocols); + + this.#url = url; + this.#protocols = protocols || []; + + MockWebSocket.#mocks.set(this.#url, this); + + if (typeof window["MockWebSocket$$constructor"] === "function") { + MockWebSocket$$constructor(this.#url, this.#protocols); + } + if (typeof window["MockWebSocket$$spyMessage"] === "function") { + this.#spyMessage = MockWebSocket$$spyMessage; + } + if (typeof window["MockWebSocket$$spyClose"] === "function") { + this.#spyClose = MockWebSocket$$spyClose; + } + } + + set binaryType(binaryType) { + if (!["blob", "arraybuffer"].includes(binaryType)) { + return; + } + this.#binaryType = binaryType; + } + + get binaryType() { + return this.#binaryType; + } + + get bufferedAmount() { + return this.#bufferedAmount; + } + + get extensions() { + return this.#extensions; + } + + get readyState() { + return this.#readyState; + } + + get protocol() { + return this.#protocol; + } + + get url() { + return this.#url; + } + + set onopen(callback) { + if (callback === null) { + this.removeEventListener("open", this.#onopen); + } else if (typeof callback === "function") { + if (this.#onopen) this.removeEventListener("open", this.#onopen); + this.addEventListener("open", callback); + } + this.#onopen = callback; + } + + get onopen() { + return this.#onopen; + } + + set onerror(callback) { + if (callback === null) { + this.removeEventListener("error", this.#onerror); + } else if (typeof callback === "function") { + if (this.#onerror) this.removeEventListener("error", this.#onerror); + this.addEventListener("error", callback); + } + this.#onerror = callback; + } + + get onerror() { + return this.#onerror; + } + + set onmessage(callback) { + if (callback === null) { + this.removeEventListener("message", this.#onmessage); + } else if (typeof callback === "function") { + if (this.#onmessage) this.removeEventListener("message", this.#onmessage); + this.addEventListener("message", callback); + } + this.#onmessage = callback; + } + + get onmessage() { + return this.#onmessage; + } + + set onclose(callback) { + if (callback === null) { + this.removeEventListener("close", this.#onclose); + } else if (typeof callback === "function") { + if (this.#onclose) this.removeEventListener("close", this.#onclose); + this.addEventListener("close", callback); + } + this.#onclose = callback; + } + + get onclose() { + return this.#onclose; + } + + get mockProtocols() { + return this.#protocols; + } + + spyClose(callback) { + if (typeof callback !== "function") { + throw new TypeError("Invalid callback"); + } + this.#spyClose = callback; + return this; + } + + spyMessage(callback) { + if (typeof callback !== "function") { + throw new TypeError("Invalid callback"); + } + this.#spyMessage = callback; + return this; + } + + mockOpen(options) { + this.#protocol = options?.protocol || ""; + this.#extensions = options?.extensions || ""; + this.#readyState = MockWebSocket.OPEN; + this.dispatchEvent(new Event("open")); + return this; + } + + mockError(error) { + this.#readyState = MockWebSocket.CLOSED; + this.dispatchEvent(new ErrorEvent("error", { error })); + return this; + } + + mockMessage(data) { + if (this.#readyState !== MockWebSocket.OPEN) { + throw new Error("MockWebSocket is not connected"); + } + this.dispatchEvent(new MessageEvent("message", { data })); + return this; + } + + mockClose(code, reason) { + this.#readyState = MockWebSocket.CLOSED; + this.dispatchEvent(new CloseEvent("close", { code: code || 1000, reason: reason || "" })); + return this; + } + + send(data) { + console.log(data); + if (this.#readyState === MockWebSocket.CONNECTING) { + throw new DOMException("InvalidStateError", "MockWebSocket is not connected"); + } + console.log(`MockWebSocket send: ${data}`); + this.#spyMessage && this.#spyMessage(this.url, data); + } + + close(code, reason) { + console.log(code, reason); + if (code && !Number.isInteger(code) && code !== 1000 && (code < 3000 || code > 4999)) { + throw new DOMException("InvalidAccessError", "Invalid code"); + } + + if (reason && typeof reason === "string") { + const reasonBytes = new TextEncoder().encode(reason); + if (reasonBytes.length > 123) { + throw new DOMException("SyntaxError", "Reason is too long"); + } + } + + if ([MockWebSocket.CLOSED, MockWebSocket.CLOSING].includes(this.#readyState)) { + return; + } + + this.#readyState = MockWebSocket.CLOSING; + console.log("MockWebSocket close"); + this.#spyClose && this.#spyClose(this.url, code, reason); + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..8c0dc2cbc --- /dev/null +++ b/package-lock.json @@ -0,0 +1,91 @@ +{ + "name": "penpot", + "version": "1.20.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "penpot", + "version": "1.20.0", + "license": "MPL-2.0", + "devDependencies": { + "@playwright/test": "^1.43.1", + "@types/node": "^20.12.7" + } + }, + "node_modules/@playwright/test": { + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.43.1.tgz", + "integrity": "sha512-HgtQzFgNEEo4TE22K/X7sYTYNqEMMTZmFS8kTq6m8hXj+m1D8TgwgIbumHddJa9h4yl4GkKb8/bgAl2+g7eDgA==", + "dev": true, + "dependencies": { + "playwright": "1.43.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@types/node": { + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/playwright": { + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.43.1.tgz", + "integrity": "sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA==", + "dev": true, + "dependencies": { + "playwright-core": "1.43.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.43.1.tgz", + "integrity": "sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg==", + "dev": true, + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + } + } +} diff --git a/package.json b/package.json index 94f482998..d26aae7be 100644 --- a/package.json +++ b/package.json @@ -18,5 +18,9 @@ "lint:clj:backend": "clj-kondo --parallel=true --lint backend/src", "lint:clj:exporter": "clj-kondo --parallel=true --lint exporter/src", "lint:clj": "yarn run lint:clj:common && yarn run lint:clj:frontend && yarn run lint:clj:backend && yarn run lint:clj:exporter" + }, + "devDependencies": { + "@playwright/test": "^1.43.1", + "@types/node": "^20.12.7" } } diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 000000000..301801ee1 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,77 @@ +import { defineConfig, devices } from '@playwright/test'; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './tests', + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + // baseURL: 'http://127.0.0.1:3000', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + + { + name: 'firefox', + use: { ...devices['Desktop Firefox'] }, + }, + + { + name: 'webkit', + use: { ...devices['Desktop Safari'] }, + }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + // webServer: { + // command: 'npm run start', + // url: 'http://127.0.0.1:3000', + // reuseExistingServer: !process.env.CI, + // }, +}); diff --git a/yarn.lock b/yarn.lock index 9a4b9536a..b3d605679 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,12 +1,36 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 8 - cacheKey: 10c0 - -"penpot@workspace:.": - version: 0.0.0-use.local - resolution: "penpot@workspace:." - languageName: unknown - linkType: soft +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@playwright/test@^1.43.1": + version "1.43.1" + resolved "https://registry.npmjs.org/@playwright/test/-/test-1.43.1.tgz" + integrity sha512-HgtQzFgNEEo4TE22K/X7sYTYNqEMMTZmFS8kTq6m8hXj+m1D8TgwgIbumHddJa9h4yl4GkKb8/bgAl2+g7eDgA== + dependencies: + playwright "1.43.1" + +"@types/node@^20.12.7": + version "20.12.7" + resolved "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz" + integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg== + dependencies: + undici-types "~5.26.4" + +playwright-core@1.43.1: + version "1.43.1" + resolved "https://registry.npmjs.org/playwright-core/-/playwright-core-1.43.1.tgz" + integrity sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg== + +playwright@1.43.1: + version "1.43.1" + resolved "https://registry.npmjs.org/playwright/-/playwright-1.43.1.tgz" + integrity sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA== + dependencies: + playwright-core "1.43.1" + optionalDependencies: + fsevents "2.3.2" + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -- Gitee From 3bae6e46618e7927a92fba02de6ac61713fde020 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Fri, 3 May 2024 14:52:58 +0200 Subject: [PATCH 0505/1266] :sparkles: Adapt mock and add workspace test with websocket mock --- .../workspace/get-comment-threads-empty.json | 1 + .../fixtures/workspace/get-file-blank.json | 58 +++++++++++ .../workspace/get-file-fragment-blank.json | 97 +++++++++++++++++++ .../workspace/get-file-libraries-empty.json | 1 + .../get-file-object-thumbnails-blank.json | 3 + .../workspace/get-font-variants-empty.json | 1 + .../get-profile-for-file-comments.json | 9 ++ .../workspace/get-project-default.json | 8 ++ .../fixtures/workspace/get-team-default.json | 23 +++++ .../fixtures/workspace/ws-notifications.js | 7 ++ .../helpers/{MockRPC.js => MockAPI.js} | 11 ++- frontend/playwright/helpers/MockWebSocket.js | 78 +-------------- frontend/playwright/login.spec.js | 16 +-- frontend/playwright/scripts/MockWebSocket.js | 76 +++++++++------ frontend/playwright/workspace.spec.js | 69 +++++++++++++ .../main/data/workspace/notifications.cljs | 1 + .../src/app/main/ui/workspace/presence.cljs | 4 +- .../main/ui/workspace/sidebar/sitemap.cljs | 2 +- 18 files changed, 340 insertions(+), 125 deletions(-) create mode 100644 frontend/playwright/fixtures/workspace/get-comment-threads-empty.json create mode 100644 frontend/playwright/fixtures/workspace/get-file-blank.json create mode 100644 frontend/playwright/fixtures/workspace/get-file-fragment-blank.json create mode 100644 frontend/playwright/fixtures/workspace/get-file-libraries-empty.json create mode 100644 frontend/playwright/fixtures/workspace/get-file-object-thumbnails-blank.json create mode 100644 frontend/playwright/fixtures/workspace/get-font-variants-empty.json create mode 100644 frontend/playwright/fixtures/workspace/get-profile-for-file-comments.json create mode 100644 frontend/playwright/fixtures/workspace/get-project-default.json create mode 100644 frontend/playwright/fixtures/workspace/get-team-default.json create mode 100644 frontend/playwright/fixtures/workspace/ws-notifications.js rename frontend/playwright/helpers/{MockRPC.js => MockAPI.js} (49%) create mode 100644 frontend/playwright/workspace.spec.js diff --git a/frontend/playwright/fixtures/workspace/get-comment-threads-empty.json b/frontend/playwright/fixtures/workspace/get-comment-threads-empty.json new file mode 100644 index 000000000..0637a088a --- /dev/null +++ b/frontend/playwright/fixtures/workspace/get-comment-threads-empty.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/frontend/playwright/fixtures/workspace/get-file-blank.json b/frontend/playwright/fixtures/workspace/get-file-blank.json new file mode 100644 index 000000000..9e05e3b50 --- /dev/null +++ b/frontend/playwright/fixtures/workspace/get-file-blank.json @@ -0,0 +1,58 @@ +{ + "~:features": { + "~#set": [ + "layout/grid", + "styles/v2", + "fdata/pointer-map", + "fdata/objects-map", + "components/v2", + "fdata/shape-data-type" + ] + }, + "~:permissions": { + "~:type": "~:membership", + "~:is-owner": true, + "~:is-admin": true, + "~:can-edit": true, + "~:can-read": true, + "~:is-logged": true + }, + "~:has-media-trimmed": false, + "~:comment-thread-seqn": 0, + "~:name": "New File 1", + "~:revn": 11, + "~:modified-at": "~m1713873823633", + "~:id": "~uc7ce0794-0992-8105-8004-38f280443849", + "~:is-shared": false, + "~:version": 46, + "~:project-id": "~uc7ce0794-0992-8105-8004-38e630f7920b", + "~:created-at": "~m1713536343369", + "~:data": { + "~:pages": [ + "~uc7ce0794-0992-8105-8004-38f28044384a" + ], + "~:pages-index": { + "~uc7ce0794-0992-8105-8004-38f28044384a": { + "~#penpot/pointer": [ + "~ude58c8f6-c5c2-8196-8004-3df9e2e52d88", + { + "~:created-at": "~m1713873823636" + } + ] + } + }, + "~:id": "~uc7ce0794-0992-8105-8004-38f280443849", + "~:options": { + "~:components-v2": true + }, + "~:recent-colors": [ + { + "~:color": "#0000ff", + "~:opacity": 1, + "~:id": null, + "~:file-id": null, + "~:image": null + } + ] + } +} \ No newline at end of file diff --git a/frontend/playwright/fixtures/workspace/get-file-fragment-blank.json b/frontend/playwright/fixtures/workspace/get-file-fragment-blank.json new file mode 100644 index 000000000..fe357c500 --- /dev/null +++ b/frontend/playwright/fixtures/workspace/get-file-fragment-blank.json @@ -0,0 +1,97 @@ +{ + "~:id": "~ude58c8f6-c5c2-8196-8004-3df9e2e52d88", + "~:file-id": "~uc7ce0794-0992-8105-8004-38f280443849", + "~:created-at": "~m1713873823631", + "~:content": { + "~:options": {}, + "~:objects": { + "~u00000000-0000-0000-0000-000000000000": { + "~#shape": { + "~:y": 0, + "~:hide-fill-on-export": false, + "~:transform": { + "~#matrix": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + } + }, + "~:rotation": 0, + "~:name": "Root Frame", + "~:width": 0.01, + "~:type": "~:frame", + "~:points": [ + { + "~#point": { + "~:x": 0, + "~:y": 0 + } + }, + { + "~#point": { + "~:x": 0.01, + "~:y": 0 + } + }, + { + "~#point": { + "~:x": 0.01, + "~:y": 0.01 + } + }, + { + "~#point": { + "~:x": 0, + "~:y": 0.01 + } + } + ], + "~:proportion-lock": false, + "~:transform-inverse": { + "~#matrix": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + } + }, + "~:id": "~u00000000-0000-0000-0000-000000000000", + "~:parent-id": "~u00000000-0000-0000-0000-000000000000", + "~:frame-id": "~u00000000-0000-0000-0000-000000000000", + "~:strokes": [], + "~:x": 0, + "~:proportion": 1, + "~:selrect": { + "~#rect": { + "~:x": 0, + "~:y": 0, + "~:width": 0.01, + "~:height": 0.01, + "~:x1": 0, + "~:y1": 0, + "~:x2": 0.01, + "~:y2": 0.01 + } + }, + "~:fills": [ + { + "~:fill-color": "#FFFFFF", + "~:fill-opacity": 1 + } + ], + "~:flip-x": null, + "~:height": 0.01, + "~:flip-y": null, + "~:shapes": [] + } + } + }, + "~:id": "~uc7ce0794-0992-8105-8004-38f28044384a", + "~:name": "Page 1" + } +} \ No newline at end of file diff --git a/frontend/playwright/fixtures/workspace/get-file-libraries-empty.json b/frontend/playwright/fixtures/workspace/get-file-libraries-empty.json new file mode 100644 index 000000000..0637a088a --- /dev/null +++ b/frontend/playwright/fixtures/workspace/get-file-libraries-empty.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/frontend/playwright/fixtures/workspace/get-file-object-thumbnails-blank.json b/frontend/playwright/fixtures/workspace/get-file-object-thumbnails-blank.json new file mode 100644 index 000000000..8f55ece27 --- /dev/null +++ b/frontend/playwright/fixtures/workspace/get-file-object-thumbnails-blank.json @@ -0,0 +1,3 @@ +{ + "c7ce0794-0992-8105-8004-38f280443849/c7ce0794-0992-8105-8004-38f28044384a/8c1035fa-01f0-8071-8004-3df966ff2c64/frame": "http://localhost:3449/assets/by-id/50d097ed-d321-4319-b00b-e82a9c9435ea" +} \ No newline at end of file diff --git a/frontend/playwright/fixtures/workspace/get-font-variants-empty.json b/frontend/playwright/fixtures/workspace/get-font-variants-empty.json new file mode 100644 index 000000000..0637a088a --- /dev/null +++ b/frontend/playwright/fixtures/workspace/get-font-variants-empty.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/frontend/playwright/fixtures/workspace/get-profile-for-file-comments.json b/frontend/playwright/fixtures/workspace/get-profile-for-file-comments.json new file mode 100644 index 000000000..f11319ecf --- /dev/null +++ b/frontend/playwright/fixtures/workspace/get-profile-for-file-comments.json @@ -0,0 +1,9 @@ +[ + { + "~:id": "~uc7ce0794-0992-8105-8004-38e630f29a9b", + "~:email": "foo@example.com", + "~:name": "Princesa Leia", + "~:fullname": "Princesa Leia", + "~:is-active": true + } +] \ No newline at end of file diff --git a/frontend/playwright/fixtures/workspace/get-project-default.json b/frontend/playwright/fixtures/workspace/get-project-default.json new file mode 100644 index 000000000..d953da8fd --- /dev/null +++ b/frontend/playwright/fixtures/workspace/get-project-default.json @@ -0,0 +1,8 @@ +{ + "~:id": "~uc7ce0794-0992-8105-8004-38e630f7920b", + "~:team-id": "~uc7ce0794-0992-8105-8004-38e630f40f6d", + "~:created-at": "~m1713533116382", + "~:modified-at": "~m1713873823633", + "~:is-default": true, + "~:name": "Drafts" +} \ No newline at end of file diff --git a/frontend/playwright/fixtures/workspace/get-team-default.json b/frontend/playwright/fixtures/workspace/get-team-default.json new file mode 100644 index 000000000..e31dcf90c --- /dev/null +++ b/frontend/playwright/fixtures/workspace/get-team-default.json @@ -0,0 +1,23 @@ +{ + "~:features": { + "~#set": [ + "layout/grid", + "styles/v2", + "fdata/pointer-map", + "fdata/objects-map", + "components/v2", + "fdata/shape-data-type" + ] + }, + "~:permissions": { + "~:type": "~:membership", + "~:is-owner": true, + "~:is-admin": true, + "~:can-edit": true + }, + "~:name": "Default", + "~:modified-at": "~m1713533116375", + "~:id": "~uc7ce0794-0992-8105-8004-38e630f40f6d", + "~:created-at": "~m1713533116375", + "~:is-default": true +} diff --git a/frontend/playwright/fixtures/workspace/ws-notifications.js b/frontend/playwright/fixtures/workspace/ws-notifications.js new file mode 100644 index 000000000..4ab58d147 --- /dev/null +++ b/frontend/playwright/fixtures/workspace/ws-notifications.js @@ -0,0 +1,7 @@ +export const presenceFixture = { + "~:type": "~:presence", + "~:file-id": "~uc7ce0794-0992-8105-8004-38f280443849", + "~:session-id": "~u37730924-d520-80f1-8004-4ae6e5c3942d", + "~:profile-id": "~uc7ce0794-0992-8105-8004-38e630f29a9b", + "~:subs-id": "~uc7ce0794-0992-8105-8004-38f280443849", +}; diff --git a/frontend/playwright/helpers/MockRPC.js b/frontend/playwright/helpers/MockAPI.js similarity index 49% rename from frontend/playwright/helpers/MockRPC.js rename to frontend/playwright/helpers/MockAPI.js index b08b9678d..8a5e970c4 100644 --- a/frontend/playwright/helpers/MockRPC.js +++ b/frontend/playwright/helpers/MockAPI.js @@ -4,5 +4,14 @@ export const interceptRPC = (page, path, jsonFilename) => status: 200, contentType: "application/transit+json", path: `playwright/fixtures/${jsonFilename}`, - }) + }), + ); + +export const interceptRPCByRegex = (page, regex, jsonFilename) => + page.route(regex, (route) => + route.fulfill({ + status: 200, + contentType: "application/transit+json", + path: `playwright/fixtures/${jsonFilename}`, + }), ); diff --git a/frontend/playwright/helpers/MockWebSocket.js b/frontend/playwright/helpers/MockWebSocket.js index 53d7612b7..18134ff78 100644 --- a/frontend/playwright/helpers/MockWebSocket.js +++ b/frontend/playwright/helpers/MockWebSocket.js @@ -1,81 +1,5 @@ -export class MockWebSocket extends EventTarget { - static #mocks = new Map(); - +export class WebSocketManager { static async init(page) { - await page.exposeFunction('MockWebSocket$$constructor', (url, protocols) => { - console.log('MockWebSocket$$constructor', MockWebSocket, url, protocols) - const webSocket = new MockWebSocket(page, url, protocols); - this.#mocks.set(url, webSocket); - }); - await page.exposeFunction('MockWebSocket$$spyMessage', (url, data) => { - console.log('MockWebSocket$$spyMessage', url, data) - this.#mocks.get(url).dispatchEvent(new MessageEvent('message', { data })) - }); - await page.exposeFunction('MockWebSocket$$spyClose', (url, code, reason) => { - console.log('MockWebSocket$$spyClose', url, code, reason) - this.#mocks.get(url).dispatchEvent(new CloseEvent('close', { code, reason })) - }); await page.addInitScript({ path: "playwright/scripts/MockWebSocket.js" }); } - - static waitForURL(url) { - return new Promise((resolve) => { - let intervalID = setInterval(() => { - for (const [wsURL, ws] of this.#mocks) { - console.log(wsURL) - if (wsURL.includes(url)) { - clearInterval(intervalID); - return resolve(ws); - } - } - }, 30) - }) - } - - #page = null - #url - #protocols - - // spies. - #spyClose = null - #spyMessage = null - - constructor(page, url, protocols) { - super() - this.#page = page - this.#url = url - this.#protocols = protocols - } - - mockOpen(options) { - return this.#page.evaluate((options) => { - WebSocket.getByURL(url).mockOpen(options) - }, options) - } - - mockMessage(data) { - return this.#page.evaluate((data) => { - WebSocket.getByURL(url).mockMessage(data) - }, data) - } - - mockClose() { - return this.#page.evaluate(() => { - WebSocket.getByURL(url).mockClose() - }) - } - - spyClose(fn) { - if (typeof fn !== 'function') { - throw new TypeError('Invalid callback') - } - this.#spyClose = fn - } - - spyMessage(fn) { - if (typeof fn !== 'function') { - throw new TypeError('Invalid callback') - } - this.#spyMessage = fn - } } diff --git a/frontend/playwright/login.spec.js b/frontend/playwright/login.spec.js index 18279b95a..cade62385 100644 --- a/frontend/playwright/login.spec.js +++ b/frontend/playwright/login.spec.js @@ -1,6 +1,5 @@ import { test, expect } from "@playwright/test"; -import { interceptRPC } from "./helpers/MockRPC"; -import { MockWebSocket } from "./helpers/MockWebSocket"; +import { interceptRPC } from "./helpers/MockAPI"; const setupLoggedOutUser = async (page) => { await interceptRPC(page, "get-profile", "get-profile-anonymous.json"); @@ -30,17 +29,9 @@ const setupDashboardUser = async (page) => { "get-profiles-for-file-comments", "logged-in-user/get-profiles-for-file-comments-empty.json", ); - await interceptRPC( - page, - "get-builtin-templates", - "logged-in-user/get-builtin-templates-empty.json", - ); + await interceptRPC(page, "get-builtin-templates", "logged-in-user/get-builtin-templates-empty.json"); }; -test.beforeEach(async ({ page }) => { - await MockWebSocket.init(page); -}) - test("Shows login page when going to index and user is logged out", async ({ page }) => { await setupLoggedOutUser(page); @@ -62,8 +53,5 @@ test("User logs in by filling the login form", async ({ page }) => { await page.getByRole("button", { name: "Login" }).click(); - const ws = await MockWebSocket.waitForURL('ws://0.0.0.0:3500/ws/notifications'); - console.log(ws) - await expect(page).toHaveURL(/dashboard/); }); diff --git a/frontend/playwright/scripts/MockWebSocket.js b/frontend/playwright/scripts/MockWebSocket.js index 457955449..a7449827e 100644 --- a/frontend/playwright/scripts/MockWebSocket.js +++ b/frontend/playwright/scripts/MockWebSocket.js @@ -1,4 +1,3 @@ -console.log("MockWebSocket mock loaded"); window.WebSocket = class MockWebSocket extends EventTarget { static CONNECTING = 0; static OPEN = 1; @@ -15,6 +14,19 @@ window.WebSocket = class MockWebSocket extends EventTarget { return this.#mocks.get(url); } + static waitForURL(url) { + return new Promise((resolve) => { + let intervalID = setInterval(() => { + for (const [wsURL, ws] of this.#mocks) { + if (wsURL.includes(url)) { + clearInterval(intervalID); + resolve(ws); + } + } + }, 30); + }); + } + #url; #protocols; #protocol = ""; @@ -32,10 +44,9 @@ window.WebSocket = class MockWebSocket extends EventTarget { #spyClose = null; constructor(url, protocols) { + console.log("🤖 New websocket at", url); super(); - console.log("MockWebSocket", url, protocols); - this.#url = url; this.#protocols = protocols || []; @@ -84,13 +95,13 @@ window.WebSocket = class MockWebSocket extends EventTarget { } set onopen(callback) { - if (callback === null) { - this.removeEventListener("open", this.#onopen); - } else if (typeof callback === "function") { - if (this.#onopen) this.removeEventListener("open", this.#onopen); + this.removeEventListener("open", this.#onopen); + this.#onopen = null; + + if (typeof callback === "function") { this.addEventListener("open", callback); + this.#onopen = callback; } - this.#onopen = callback; } get onopen() { @@ -98,13 +109,13 @@ window.WebSocket = class MockWebSocket extends EventTarget { } set onerror(callback) { - if (callback === null) { - this.removeEventListener("error", this.#onerror); - } else if (typeof callback === "function") { - if (this.#onerror) this.removeEventListener("error", this.#onerror); + this.removeEventListener("error", this.#onerror); + this.#onerror = null; + + if (typeof callback === "function") { this.addEventListener("error", callback); + this.#onerror = callback; } - this.#onerror = callback; } get onerror() { @@ -112,13 +123,13 @@ window.WebSocket = class MockWebSocket extends EventTarget { } set onmessage(callback) { - if (callback === null) { - this.removeEventListener("message", this.#onmessage); - } else if (typeof callback === "function") { - if (this.#onmessage) this.removeEventListener("message", this.#onmessage); + this.removeEventListener("message", this.#onmessage); + this.#onmessage = null; + + if (typeof callback === "function") { this.addEventListener("message", callback); + this.#onmessage = callback; } - this.#onmessage = callback; } get onmessage() { @@ -126,13 +137,13 @@ window.WebSocket = class MockWebSocket extends EventTarget { } set onclose(callback) { - if (callback === null) { - this.removeEventListener("close", this.#onclose); - } else if (typeof callback === "function") { - if (this.#onclose) this.removeEventListener("close", this.#onclose); + this.removeEventListener("close", this.#onclose); + this.#onclose = null; + + if (typeof callback === "function") { this.addEventListener("close", callback); + this.#onclose = callback; } - this.#onclose = callback; } get onclose() { @@ -160,6 +171,7 @@ window.WebSocket = class MockWebSocket extends EventTarget { } mockOpen(options) { + console.log("🤖 open mock"); this.#protocol = options?.protocol || ""; this.#extensions = options?.extensions || ""; this.#readyState = MockWebSocket.OPEN; @@ -174,9 +186,12 @@ window.WebSocket = class MockWebSocket extends EventTarget { } mockMessage(data) { + console.log("🤯 mock message"); if (this.#readyState !== MockWebSocket.OPEN) { + console.log("socket is not connected"); throw new Error("MockWebSocket is not connected"); } + console.log("😰 dispatching `message`", { data }); this.dispatchEvent(new MessageEvent("message", { data })); return this; } @@ -188,16 +203,16 @@ window.WebSocket = class MockWebSocket extends EventTarget { } send(data) { - console.log(data); if (this.#readyState === MockWebSocket.CONNECTING) { throw new DOMException("InvalidStateError", "MockWebSocket is not connected"); } - console.log(`MockWebSocket send: ${data}`); - this.#spyMessage && this.#spyMessage(this.url, data); + + if (this.#spyMessage) { + this.#spyMessage(this.url, data); + } } close(code, reason) { - console.log(code, reason); if (code && !Number.isInteger(code) && code !== 1000 && (code < 3000 || code > 4999)) { throw new DOMException("InvalidAccessError", "Invalid code"); } @@ -214,7 +229,8 @@ window.WebSocket = class MockWebSocket extends EventTarget { } this.#readyState = MockWebSocket.CLOSING; - console.log("MockWebSocket close"); - this.#spyClose && this.#spyClose(this.url, code, reason); + if (this.#spyClose) { + this.#spyClose(this.url, code, reason); + } } -} +}; diff --git a/frontend/playwright/workspace.spec.js b/frontend/playwright/workspace.spec.js new file mode 100644 index 000000000..ff0bc5fee --- /dev/null +++ b/frontend/playwright/workspace.spec.js @@ -0,0 +1,69 @@ +import { test, expect } from "@playwright/test"; +import { interceptRPC, interceptRPCByRegex } from "./helpers/MockAPI"; +import { WebSocketManager } from "./helpers/MockWebSocket"; +import { presenceFixture } from "./fixtures/workspace/ws-notifications"; + +const anyProjectId = "c7ce0794-0992-8105-8004-38e630f7920b"; +const anyFileId = "c7ce0794-0992-8105-8004-38f280443849"; +const anyPageId = "c7ce0794-0992-8105-8004-38f28044384a"; + +const setupWorkspaceUser = (page) => { + interceptRPC(page, "get-profile", "logged-in-user/get-profile-logged-in.json"); + interceptRPC(page, "get-team-users?file-id=*", "logged-in-user/get-team-users-single-user.json"); + interceptRPC(page, "get-comment-threads?file-id=*", "workspace/get-comment-threads-empty.json"); + interceptRPC(page, "get-project?id=*", "workspace/get-project-default.json"); + interceptRPC(page, "get-team?id=*", "workspace/get-team-default.json"); + interceptRPCByRegex(page, /get\-file\?/, "workspace/get-file-blank.json"); + interceptRPC( + page, + "get-file-object-thumbnails?file-id=*", + "workspace/get-file-object-thumbnails-blank.json", + ); + interceptRPC( + page, + "get-profiles-for-file-comments?file-id=*", + "workspace/get-profile-for-file-comments.json", + ); + interceptRPC(page, "get-font-variants?team-id=*", "workspace/get-font-variants-empty.json"); + interceptRPC(page, "get-file-fragment?file-id=*", "workspace/get-file-fragment-blank.json"); + interceptRPC(page, "get-file-libraries?file-id=*", "workspace/get-file-libraries-empty.json"); +}; + +test.beforeEach(async ({ page }) => { + await WebSocketManager.init(page); +}); + +test("User loads worskpace with empty file", async ({ page }) => { + await setupWorkspaceUser(page); + + await page.goto(`/#/workspace/${anyProjectId}/${anyFileId}?page-id=${anyPageId}`); + + await expect(page.getByTestId("page-name")).toHaveText("Page 1"); +}); + +test.only("User receives notifications updates in the workspace", async ({ page }) => { + await setupWorkspaceUser(page); + await page.goto(`/#/workspace/${anyProjectId}/${anyFileId}?page-id=${anyPageId}`); + + await page.evaluate(async () => { + const ws = await WebSocket.waitForURL("ws://0.0.0.0:3500/ws/notifications"); + ws.mockOpen(); + }); + + await expect(page.getByTestId("page-name")).toHaveText("Page 1"); + + await page.evaluate( + async ({ presenceFixture }) => { + const ws = await WebSocket.waitForURL("ws://0.0.0.0:3500/ws/notifications"); + ws.mockMessage(JSON.stringify(presenceFixture)); + }, + { presenceFixture }, + ); + + expect(page.getByTestId("active-users-list").getByAltText("Princesa Leia")).toHaveCount(2); + + await page.evaluate(async () => { + const ws = await WebSocket.waitForURL("ws://0.0.0.0:3500/ws/notifications"); + ws.mockClose(); + }); +}); diff --git a/frontend/src/app/main/data/workspace/notifications.cljs b/frontend/src/app/main/data/workspace/notifications.cljs index 4bb3a9772..b721c2485 100644 --- a/frontend/src/app/main/data/workspace/notifications.cljs +++ b/frontend/src/app/main/data/workspace/notifications.cljs @@ -162,6 +162,7 @@ (assoc :text-color "#000000"))) (update-presence [presence] + (js/console.log "🥰 WIIIIII" (clj->js presence)) (-> presence (update session-id update-session presence) (d/without-nils)))] diff --git a/frontend/src/app/main/ui/workspace/presence.cljs b/frontend/src/app/main/ui/workspace/presence.cljs index cdf6c6e23..6a071fbda 100644 --- a/frontend/src/app/main/ui/workspace/presence.cljs +++ b/frontend/src/app/main/ui/workspace/presence.cljs @@ -56,7 +56,7 @@ :class (stl/css :active-users-opened) :on-click on-close :on-blur on-close} - [:ul {:class (stl/css :active-users-list)} + [:ul {:class (stl/css :active-users-list) :data-testid "active-users-list"} (for [session sessions] [:& session-widget {:color (:color session) @@ -66,7 +66,7 @@ [:button {:class (stl/css-case :active-users true) :on-click on-open} - [:ul {:class (stl/css :active-users-list)} + [:ul {:class (stl/css :active-users-list) :data-testid "active-users-list"} (when (> num-sessions 2) [:span {:class (stl/css :users-num)} (dm/str "+" (- num-sessions 2))]) diff --git a/frontend/src/app/main/ui/workspace/sidebar/sitemap.cljs b/frontend/src/app/main/ui/workspace/sidebar/sitemap.cljs index 975615048..39064f7c7 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/sitemap.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/sitemap.cljs @@ -144,7 +144,7 @@ :auto-focus true :default-value (:name page "")}]] [:* - [:span {:class (stl/css :page-name)} + [:span {:class (stl/css :page-name) :data-testid "page-name"} (:name page)] [:div {:class (stl/css :page-actions)} (when (and deletable? (not workspace-read-only?)) -- Gitee From 572c6f02e25adea959807d4ea8a82300b4d1c590 Mon Sep 17 00:00:00 2001 From: AzazelN28 Date: Tue, 7 May 2024 11:18:35 +0200 Subject: [PATCH 0506/1266] :recycle: Refactor MockWebSocket --- frontend/playwright/helpers/MockWebSocket.js | 69 +++++++++++++++++++- frontend/playwright/scripts/MockWebSocket.js | 23 +++---- frontend/playwright/workspace.spec.js | 21 ++++-- 3 files changed, 91 insertions(+), 22 deletions(-) diff --git a/frontend/playwright/helpers/MockWebSocket.js b/frontend/playwright/helpers/MockWebSocket.js index 18134ff78..1a6c8eb81 100644 --- a/frontend/playwright/helpers/MockWebSocket.js +++ b/frontend/playwright/helpers/MockWebSocket.js @@ -1,5 +1,72 @@ -export class WebSocketManager { +export class MockWebSocket extends EventTarget { + static #mocks = new Map(); + static async init(page) { + await page.exposeFunction("MockWebSocket$$constructor", (url, protocols) => { + console.log("MockWebSocket$$constructor", MockWebSocket, url, protocols); + const webSocket = new MockWebSocket(page, url, protocols); + this.#mocks.set(url, webSocket); + }); + await page.exposeFunction("MockWebSocket$$spyMessage", (url, data) => { + console.log("MockWebSocket$$spyMessage", url, data); + this.#mocks.get(url).dispatchEvent(new MessageEvent("message", { data })); + }); + await page.exposeFunction("MockWebSocket$$spyClose", (url, code, reason) => { + console.log("MockWebSocket$$spyClose", url, code, reason); + this.#mocks.get(url).dispatchEvent(new CloseEvent("close", { code, reason })); + }); await page.addInitScript({ path: "playwright/scripts/MockWebSocket.js" }); } + + static waitForURL(url) { + return new Promise((resolve) => { + const intervalID = setInterval(() => { + for (const [wsURL, ws] of this.#mocks) { + console.log('waitForURL', wsURL); + if (wsURL.includes(url)) { + clearInterval(intervalID); + return resolve(ws); + } + } + }, 30); + }); + } + + #page = null; + #url; + #protocols; + + constructor(page, url, protocols) { + super(); + this.#page = page; + this.#url = url; + this.#protocols = protocols; + } + + mockOpen(options) { + return this.#page.evaluate(({ url, options }) => { + if (typeof WebSocket.getByURL !== 'function') { + throw new Error('WebSocket.getByURL is not a function. Did you forget to call MockWebSocket.init(page)?') + } + WebSocket.getByURL(url).mockOpen(options); + }, { url: this.#url, options }); + } + + mockMessage(data) { + return this.#page.evaluate(({ url, data }) => { + if (typeof WebSocket.getByURL !== 'function') { + throw new Error('WebSocket.getByURL is not a function. Did you forget to call MockWebSocket.init(page)?') + } + WebSocket.getByURL(url).mockMessage(data); + }, { url: this.#url, data }); + } + + mockClose() { + return this.#page.evaluate(({ url }) => { + if (typeof WebSocket.getByURL !== 'function') { + throw new Error('WebSocket.getByURL is not a function. Did you forget to call MockWebSocket.init(page)?') + } + WebSocket.getByURL(url).mockClose(); + }, { url: this.#url }); + } } diff --git a/frontend/playwright/scripts/MockWebSocket.js b/frontend/playwright/scripts/MockWebSocket.js index a7449827e..60723eb29 100644 --- a/frontend/playwright/scripts/MockWebSocket.js +++ b/frontend/playwright/scripts/MockWebSocket.js @@ -11,20 +11,15 @@ window.WebSocket = class MockWebSocket extends EventTarget { } static getByURL(url) { - return this.#mocks.get(url); - } - - static waitForURL(url) { - return new Promise((resolve) => { - let intervalID = setInterval(() => { - for (const [wsURL, ws] of this.#mocks) { - if (wsURL.includes(url)) { - clearInterval(intervalID); - resolve(ws); - } - } - }, 30); - }); + if (this.#mocks.has(url)) { + return this.#mocks.get(url); + } + for (const [wsURL, ws] of this.#mocks) { + if (wsURL.includes(url)) { + return ws; + } + } + return undefined; } #url; diff --git a/frontend/playwright/workspace.spec.js b/frontend/playwright/workspace.spec.js index ff0bc5fee..07e8762ca 100644 --- a/frontend/playwright/workspace.spec.js +++ b/frontend/playwright/workspace.spec.js @@ -1,6 +1,6 @@ import { test, expect } from "@playwright/test"; import { interceptRPC, interceptRPCByRegex } from "./helpers/MockAPI"; -import { WebSocketManager } from "./helpers/MockWebSocket"; +import { MockWebSocket } from "./helpers/MockWebSocket"; import { presenceFixture } from "./fixtures/workspace/ws-notifications"; const anyProjectId = "c7ce0794-0992-8105-8004-38e630f7920b"; @@ -30,7 +30,7 @@ const setupWorkspaceUser = (page) => { }; test.beforeEach(async ({ page }) => { - await WebSocketManager.init(page); + await MockWebSocket.init(page); }); test("User loads worskpace with empty file", async ({ page }) => { @@ -45,13 +45,15 @@ test.only("User receives notifications updates in the workspace", async ({ page await setupWorkspaceUser(page); await page.goto(`/#/workspace/${anyProjectId}/${anyFileId}?page-id=${anyPageId}`); - await page.evaluate(async () => { - const ws = await WebSocket.waitForURL("ws://0.0.0.0:3500/ws/notifications"); - ws.mockOpen(); - }); + const ws = await MockWebSocket.waitForURL("ws://0.0.0.0:3500/ws/notifications") + await ws.mockOpen(); + console.log('JEEEEEE', ws) await expect(page.getByTestId("page-name")).toHaveText("Page 1"); + await ws.mockMessage(JSON.stringify(presenceFixture)); + + /* await page.evaluate( async ({ presenceFixture }) => { const ws = await WebSocket.waitForURL("ws://0.0.0.0:3500/ws/notifications"); @@ -59,11 +61,16 @@ test.only("User receives notifications updates in the workspace", async ({ page }, { presenceFixture }, ); + */ + + await expect(page.getByTestId("active-users-list").getByAltText("Princesa Leia")).toHaveCount(2); - expect(page.getByTestId("active-users-list").getByAltText("Princesa Leia")).toHaveCount(2); + await ws.mockClose(); + /* await page.evaluate(async () => { const ws = await WebSocket.waitForURL("ws://0.0.0.0:3500/ws/notifications"); ws.mockClose(); }); + */ }); -- Gitee From b68bc9a08c89281f0c09c4897f1c59e658052547 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Mon, 6 May 2024 14:53:44 +0200 Subject: [PATCH 0507/1266] :white_check_mark: Move more touched tests to common --- .../common_tests/helpers/compositions.cljc | 105 +++++- common/test/common_tests/helpers/debug.cljc | 44 ++- .../logic/components_touched_test.cljc | 79 ++++- .../state_components_sync_test.cljs | 331 ------------------ 4 files changed, 206 insertions(+), 353 deletions(-) diff --git a/common/test/common_tests/helpers/compositions.cljc b/common/test/common_tests/helpers/compositions.cljc index d8b9cbe8b..50e367afd 100644 --- a/common/test/common_tests/helpers/compositions.cljc +++ b/common/test/common_tests/helpers/compositions.cljc @@ -11,6 +11,8 @@ (defn add-rect [file rect-label & {:keys [] :as params}] + ;; Generated shape tree: + ;; :rect-label [:type :rect :name: Rect1] (thf/add-sample-shape file rect-label (merge {:type :rect :name "Rect1"} @@ -18,6 +20,8 @@ (defn add-frame [file frame-label & {:keys [] :as params}] + ;; Generated shape tree: + ;; :frame-label [:type :frame :name: Frame1] (thf/add-sample-shape file frame-label (merge {:type :frame :name "Frame1"} @@ -25,6 +29,9 @@ (defn add-frame-with-child [file frame-label child-label & {:keys [frame-params child-params]}] + ;; Generated shape tree: + ;; :frame-label [:name: Frame1] + ;; :child-label [:name: Rect1] (-> file (add-frame frame-label frame-params) (thf/add-sample-shape child-label @@ -36,6 +43,9 @@ (defn add-simple-component [file component-label root-label child-label & {:keys [component-params root-params child-params]}] + ;; Generated shape tree: + ;; {:root-label} [:name: Frame1] # [Component :component-label] + ;; :child-label [:name: Rect1] (-> file (add-frame-with-child root-label child-label :frame-params root-params :child-params child-params) (thf/make-component component-label root-label component-params))) @@ -43,6 +53,12 @@ (defn add-simple-component-with-copy [file component-label main-root-label main-child-label copy-root-label & {:keys [component-params main-root-params main-child-params copy-root-params]}] + ;; Generated shape tree: + ;; {:main-root-label} [:name: Frame1] # [Component :component-label] + ;; :main-child-label [:name: Rect1] + ;; + ;; :copy-root-label [:name: Frame1] #--> [Component :component-label] :main-root-label + ;; [:name: Rect1] ---> :main-child-label (-> file (add-simple-component component-label main-root-label @@ -55,27 +71,98 @@ (defn add-component-with-many-children [file component-label root-label child-labels & {:keys [component-params root-params child-params-list]}] + ;; Generated shape tree: + ;; {:root-label} [:name: Frame1] # [Component :component-label] + ;; :child1-label [:name: Rect1] + ;; :child2-label [:name: Rect2] + ;; :child3-label [:name: Rect3] (as-> file $ (add-frame $ root-label root-params) - (reduce (fn [file [label params]] + (reduce (fn [file [index [label params]]] (thf/add-sample-shape file label (merge {:type :rect - :name "Rect1" + :name (str "Rect" (inc index)) :parent-label root-label} params))) $ - (d/zip-all child-labels child-params-list)) + (d/enumerate (d/zip-all child-labels child-params-list))) (thf/make-component $ component-label root-label component-params))) (defn add-component-with-many-children-and-copy - [file component-label root-label child-labels copy-root-label - & {:keys [component-params root-params child-params-list copy-root-params]}] + [file component-label main-root-label main-child-labels copy-root-label + & {:keys [component-params main-root-params main-child-params-list copy-root-params]}] + ;; Generated shape tree: + ;; {:root-label} [:name: Frame1] # [Component :component-label] + ;; :child1-label [:name: Rect1] + ;; :child2-label [:name: Rect2] + ;; :child3-label [:name: Rect3] + ;; + ;; :copy-root-label [:name: Frame1] #--> [Component :component-label] :root-label + ;; [:name: Rect1] ---> :child1-label + ;; [:name: Rect2] ---> :child2-label + ;; [:name: Rect3] ---> :child3-label (-> file (add-component-with-many-children component-label - root-label - child-labels + main-root-label + main-child-labels :component-params component-params - :root-params root-params - :child-params-list child-params-list) + :root-params main-root-params + :child-params-list main-child-params-list) (thf/instantiate-component component-label copy-root-label copy-root-params))) + +(defn add-nested-component + [file component1-label main1-root-label main1-child-label component2-label main2-root-label nested-head-label + & {:keys [component1-params root1-params main1-child-params component2-params main2-root-params nested-head-params]}] + ;; Generated shape tree: + ;; {:main1-root-label} [:name: Frame1] # [Component :component1-label] + ;; :main1-child-label [:name: Rect1] + ;; + ;; {:main2-root-label} [:name: Frame2] # [Component :component2-label] + ;; :nested-head-label [:name: Frame1] @--> [Component :component1-label] :main1-root-label + ;; [:name: Rect1] ---> :main1-child-label + (-> file + (add-simple-component component1-label + main1-root-label + main1-child-label + :component-params component1-params + :root-params root1-params + :child-params main1-child-params) + (add-frame main2-root-label (merge {:name "Frame2"} + main2-root-params)) + (thf/instantiate-component component1-label + nested-head-label + (assoc nested-head-params + :parent-label main2-root-label)) + (thf/make-component component2-label + main2-root-label + component2-params))) + +(defn add-nested-component-with-copy + [file component1-label main1-root-label main1-child-label component2-label main2-root-label nested-head-label copy2-label + & {:keys [component1-params root1-params main1-child-params component2-params main2-root-params nested-head-params copy2-params]}] + ;; Generated shape tree: + ;; {:main1-root-label} [:name: Frame1] # [Component :component1-label] + ;; :main1-child-label [:name: Rect1] + ;; + ;; {:main2-root-label} [:name: Frame2] # [Component :component2-label] + ;; :nested-head-label [:name: Frame1] @--> [Component :component1-label] :main1-root-label + ;; [:name: Rect1] ---> :main1-child-label + ;; + ;; :copy2-label [:name: Frame2] #--> [Component :component2-label] :main2-root-label + ;; [:name: Frame1] @--> [Component :component1-label] :nested-head-label + ;; [:name: Rect1] ---> + (-> file + (add-nested-component component1-label + main1-root-label + main1-child-label + component2-label + main2-root-label + nested-head-label + :component1-params component1-params + :root1-params root1-params + :main1-child-params main1-child-params + :component2-params component2-params + :main2-root-params main2-root-params + :nested-head-params nested-head-params) + (thf/instantiate-component component2-label copy2-label copy2-params))) \ No newline at end of file diff --git a/common/test/common_tests/helpers/debug.cljc b/common/test/common_tests/helpers/debug.cljc index 984e47159..5ecdcdb71 100644 --- a/common/test/common_tests/helpers/debug.cljc +++ b/common/test/common_tests/helpers/debug.cljc @@ -1,7 +1,9 @@ (ns common-tests.helpers.debug (:require + [app.common.data :as d] [app.common.uuid :as uuid] - [common-tests.helpers.ids-map :as thi])) + [common-tests.helpers.ids-map :as thi] + [cuerdas.core :as str])) (defn dump-shape "Dumps a shape, with each attribute in a line" @@ -15,19 +17,37 @@ (defn- stringify-keys [m keys] (apply str (interpose ", " (map #(str % ": " (get m %)) keys)))) +(defn- dump-page-shape + [shape keys padding] + (println (str/pad (str padding + (when (:main-instance shape) "{") + (or (thi/label (:id shape)) "") + (when (:main-instance shape) "}") + (when keys + (str " [" (stringify-keys shape keys) "]"))) + {:length 40 :type :right}) + (if (nil? (:shape-ref shape)) + (if (:component-root shape) + (str "# [Component " (or (thi/label (:component-id shape)) "") "]") + "") + (str/format "%s--> %s%s" + (cond (:component-root shape) "#" + (:component-id shape) "@" + :else "-") + (if (:component-root shape) + (str "[Component " (or (thi/label (:component-id shape)) "") "] ") + "") + (or (thi/label (:shape-ref shape)) ""))))) + (defn dump-page "Dumps the layer tree of the page. Prints the label of each shape, and the specified keys. Example: (thd/dump-page (thf/current-page file) [:id :touched])" ([page keys] (dump-page page uuid/zero "" keys)) - ([page id padding keys] - (let [objects (vals (:objects page)) - root-objects (filter #(and - (= (:parent-id %) id) - (not= (:id %) id)) - objects)] - (doseq [val root-objects] - (println padding (thi/label (:id val)) - (when keys - (str "[" (stringify-keys val keys) "]"))) - (dump-page page (:id val) (str padding " ") keys))))) + ([page root-id padding keys] + (let [lookupf (d/getf (:objects page)) + root-shape (lookupf root-id) + shapes (map lookupf (:shapes root-shape))] + (doseq [shape shapes] + (dump-page-shape shape keys padding) + (dump-page page (:id shape) (str padding " ") keys))))) diff --git a/common/test/common_tests/logic/components_touched_test.cljc b/common/test/common_tests/logic/components_touched_test.cljc index 0aa14ca29..e20827c1e 100644 --- a/common/test/common_tests/logic/components_touched_test.cljc +++ b/common/test/common_tests/logic/components_touched_test.cljc @@ -7,7 +7,6 @@ (ns common-tests.logic.components-touched-test (:require [app.common.files.changes-builder :as pcb] - [app.common.logic.libraries :as cll] [app.common.logic.shapes :as cls] [clojure.test :as t] [common-tests.helpers.compositions :as tho] @@ -151,3 +150,81 @@ ;; Check (t/is (= (:touched copy-root') nil)) (t/is (= (:touched copy-child') nil)))) + +(t/deftest test-touched-when-changing-upper + (let [;; Setup + file (-> (thf/sample-file :file1) + (tho/add-nested-component-with-copy :component1 + :main1-root + :main1-child + :component2 + :main2-root + :main2-nested-head + :copy2-root + :root2-params {:fills (thf/sample-fills-color + :fill-color "#abcdef")})) + page (thf/current-page file) + copy2-root (thf/get-shape file :copy2-root) + + ;; Action + update-fn (fn [shape] + (assoc shape :fills (thf/sample-fills-color :fill-color "#fabada"))) + + changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) + #{(:id copy2-root)} + update-fn + (:objects page) + {}) + + file' (thf/apply-changes file changes) + + ;; Get + copy2-root' (thf/get-shape file' :copy2-root) + fills' (:fills copy2-root') + fill' (first fills')] + + ;; Check + (t/is (= (count fills') 1)) + (t/is (= (:fill-color fill') "#fabada")) + (t/is (= (:fill-opacity fill') 1)) + (t/is (= (:touched copy2-root') #{:fill-group})))) + +(t/deftest test-touched-when-changing-lower + (let [;; Setup + file (-> (thf/sample-file :file1) + (tho/add-nested-component-with-copy :component1 + :main1-root + :main1-child + :component2 + :main2-root + :main2-nested-head + :copy2-root + :nested-head-params {:fills (thf/sample-fills-color + :fill-color "#abcdef")})) + page (thf/current-page file) + copy2-root (thf/get-shape file :copy2-root) + + ;; Action + update-fn (fn [shape] + (assoc shape :fills (thf/sample-fills-color :fill-color "#fabada"))) + + changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) + (:shapes copy2-root) + update-fn + (:objects page) + {}) + + file' (thf/apply-changes file changes) + + ;; Get + copy2-root' (thf/get-shape file' :copy2-root) + copy2-child' (thf/get-shape-by-id file' (first (:shapes copy2-root'))) + fills' (:fills copy2-child') + fill' (first fills')] + + ;; Check + (t/is (= (count fills') 1)) + (t/is (= (:fill-color fill') "#fabada")) + (t/is (= (:fill-opacity fill') 1)) + (t/is (= (:touched copy2-root') nil)) + (t/is (= (:touched copy2-child') #{:fill-group})))) \ No newline at end of file diff --git a/frontend/test/frontend_tests/state_components_sync_test.cljs b/frontend/test/frontend_tests/state_components_sync_test.cljs index 8ae88562a..7907f4ddd 100644 --- a/frontend/test/frontend_tests/state_components_sync_test.cljs +++ b/frontend/test/frontend_tests/state_components_sync_test.cljs @@ -21,337 +21,6 @@ (t/use-fixtures :each {:before thp/reset-idmap!}) -;; === Test touched ====================== - -(t/deftest test-touched-from-lib - (t/async - done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1" - :fill-color clr/white - :fill-opacity 1}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)]) - (thp/move-to-library :lib1 "Library 1") - (thp/sample-page) - (thp/instantiate-component :instance1 - (thp/id :component1) - (thp/id :lib1))) - - [_group1 shape1'] - (thl/resolve-instance state (thp/id :instance1)) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Rect 1 #--> Rect 1 - ;; Rect 1* ---> Rect 1 - ;; #{:fill-group} - ;; - (let [[[group shape1] [c-group c-shape1] _component] - (thl/resolve-instance-and-main - new-state - (thp/id :instance1))] - - (t/is (= (:name group) "Rect 1")) - (t/is (= (:touched group) nil)) - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:touched shape1) #{:fill-group})) - (t/is (= (:fill-color shape1) clr/test)) - (t/is (= (:fill-opacity shape1) 0.5)) - - (t/is (= (:name c-group) "Rect 1")) - (t/is (= (:touched c-group) nil)) - (t/is (= (:name c-shape1) "Rect 1")) - (t/is (= (:touched c-shape1) nil)) - (t/is (= (:fill-color c-shape1) clr/white)) - (t/is (= (:fill-opacity c-shape1) 1)))))] - - (ptk/emit! - store - (dch/update-shapes [(:id shape1')] - (fn [shape] - (merge shape {:fill-color clr/test - :fill-opacity 0.5}))) - :the/end)))) - -(t/deftest test-touched-nested-upper - (t/async - done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1" - :fill-color clr/white - :fill-opacity 1}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)]) - (thp/instantiate-component :instance1 - (thp/id :component1)) - (thp/sample-shape :shape2 :circle - {:name "Circle 1" - :fill-color clr/black - :fill-opacity 0}) - (thp/frame-shapes :frame1 - [(thp/id :instance1) - (thp/id :shape2)]) - (thp/make-component :main2 :component2 - [(thp/id :frame1)]) - (thp/instantiate-component :instance2 - (thp/id :component2))) - - [_instance2 _instance1 shape1' _shape2'] - (thl/resolve-instance state (thp/id :instance2)) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Rect 1 - ;; Rect 1 - ;; Group - ;; Rect 1 #--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; Circle 1 - ;; Group #--> Group - ;; Rect 1 @--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; Circle 1* ---> Circle 1 - ;; #{:fill-group} - ;; - ;; [Rect 1] - ;; page1 / Rect 1 - ;; - ;; [Group] - ;; page1 / Group - ;; - (let [[[instance2 instance1 shape1 shape2] - [c-instance2 c-instance1 c-shape1 c-shape2] _component] - (thl/resolve-instance-and-main - new-state - (thp/id :instance2))] - - (t/is (= (:name instance2) "Board")) - (t/is (= (:touched instance2) nil)) - (t/is (= (:name instance1) "Rect 1")) - (t/is (= (:touched instance1) nil)) - (t/is (= (:name shape1) "Circle 1")) - (t/is (= (:touched shape1) #{:fill-group})) - (t/is (= (:fill-color shape1) clr/test)) - (t/is (= (:fill-opacity shape1) 0.5)) - (t/is (= (:name shape2) "Rect 1")) - (t/is (= (:touched shape2) nil)) - (t/is (= (:fill-color shape2) clr/white)) - (t/is (= (:fill-opacity shape2) 1)) - - (t/is (= (:name c-instance2) "Board")) - (t/is (= (:touched c-instance2) nil)) - (t/is (= (:name c-instance1) "Rect 1")) - (t/is (= (:touched c-instance1) nil)) - (t/is (= (:name c-shape1) "Circle 1")) - (t/is (= (:touched c-shape1) nil)) - (t/is (= (:fill-color c-shape1) clr/black)) - (t/is (= (:fill-opacity c-shape1) 0)) - (t/is (= (:name c-shape2) "Rect 1")) - (t/is (= (:touched c-shape2) nil)) - (t/is (= (:fill-color c-shape2) clr/white)) - (t/is (= (:fill-opacity c-shape2) 1)))))] - - (ptk/emit! - store - (dch/update-shapes [(:id shape1')] - (fn [shape] - (merge shape {:fill-color clr/test - :fill-opacity 0.5}))) - :the/end)))) - -(t/deftest test-touched-nested-lower-near - (t/async done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1" - :fill-color clr/white - :fill-opacity 1}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)]) - (thp/instantiate-component :instance1 - (thp/id :component1)) - (thp/sample-shape :shape2 :circle - {:name "Circle 1" - :fill-color clr/black - :fill-opacity 0}) - (thp/frame-shapes :frame1 - [(thp/id :instance1) - (thp/id :shape2)]) - (thp/make-component :instance2 :component2 - [(thp/id :frame1)]) - (thp/instantiate-component :instance2 - (thp/id :component2))) - - [_instance2 _instance1 _shape1' shape2'] - (thl/resolve-instance state (thp/id :instance2)) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Rect 1 - ;; Rect 1 - ;; Group - ;; Rect 1 #--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; Circle 1 - ;; Group #--> Group - ;; Rect 1 @--> Rect 1 - ;; Rect 1* ---> Rect 1 - ;; #{:fill-group} - ;; Circle 1 ---> Circle 1 - ;; - ;; [Rect 1] - ;; page1 / Rect 1 - ;; - ;; [Group] - ;; page1 / Group - ;; - (let [[[instance2 instance1 shape1 shape2] - [c-instance2 c-instance1 c-shape1 c-shape2] _component] - (thl/resolve-instance-and-main - new-state - (thp/id :instance2))] - - (t/is (= (:name instance2) "Board")) - (t/is (= (:touched instance2) nil)) - (t/is (= (:name instance1) "Rect 1")) - (t/is (= (:touched instance1) nil)) - (t/is (= (:name shape1) "Circle 1")) - (t/is (= (:touched shape1) nil)) - (t/is (= (:fill-color shape1) clr/black)) - (t/is (= (:fill-opacity shape1) 0)) - (t/is (= (:name shape2) "Rect 1")) - (t/is (= (:touched shape2) #{:fill-group})) - (t/is (= (:fill-color shape2) clr/test)) - (t/is (= (:fill-opacity shape2) 0.5)) - - (t/is (= (:name c-instance2) "Board")) - (t/is (= (:touched c-instance2) nil)) - (t/is (= (:name c-instance1) "Rect 1")) - (t/is (= (:touched c-instance1) nil)) - (t/is (= (:name c-shape1) "Circle 1")) - (t/is (= (:touched c-shape1) nil)) - (t/is (= (:fill-color c-shape1) clr/black)) - (t/is (= (:fill-opacity c-shape1) 0)) - (t/is (= (:name c-shape2) "Rect 1")) - (t/is (= (:touched c-shape2) nil)) - (t/is (= (:fill-color c-shape2) clr/white)) - (t/is (= (:fill-opacity c-shape2) 1)))))] - - (ptk/emit! - store - (dch/update-shapes [(:id shape2')] - (fn [shape] - (merge shape {:fill-color clr/test - :fill-opacity 0.5}))) - :the/end)))) - -(t/deftest test-touched-nested-lower-remote - (t/async done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1" - :fill-color clr/white - :fill-opacity 1}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)]) - (thp/instantiate-component :instance1 - (thp/id :component1)) - (thp/sample-shape :shape2 :circle - {:name "Circle 1" - :fill-color clr/black - :fill-opacity 0}) - (thp/frame-shapes :frame1 - [(thp/id :instance1) - (thp/id :shape2)]) - (thp/make-component :instance2 :component2 - [(thp/id :frame1)]) - (thp/instantiate-component :instance2 - (thp/id :component2))) - - [instance2 _instance1 _shape1' shape2'] - (thl/resolve-instance state (thp/id :instance2)) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Rect 1 - ;; Rect 1 - ;; Group - ;; Rect 1 #--> Rect 1 - ;; Rect 1* ---> Rect 1 - ;; #{:fill-group} - ;; Circle 1 - ;; Group #--> Group - ;; Rect 1 @--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; Circle 1 ---> Circle 1 - ;; - ;; [Rect 1] - ;; page1 / Rect 1 - ;; - ;; [Group] - ;; page1 / Group - ;; - (let [[[instance2 instance1 shape1 shape2] - [c-instance2 c-instance1 c-shape1 c-shape2] _component] - (thl/resolve-instance-and-main - new-state - (thp/id :instance2))] - - (t/is (= (:name instance2) "Board")) - (t/is (= (:touched instance2) nil)) - (t/is (= (:name instance1) "Rect 1")) - (t/is (= (:touched instance1) nil)) - (t/is (= (:name shape1) "Circle 1")) - (t/is (= (:touched shape1) nil)) - (t/is (= (:fill-color shape1) clr/black)) - (t/is (= (:fill-opacity shape1) 0)) - (t/is (= (:name shape2) "Rect 1")) - (t/is (= (:touched shape2) #{:fill-group})) - (t/is (= (:fill-color shape2) clr/test)) - (t/is (= (:fill-opacity shape2) 0.5)) - (t/is (= (:name c-instance2) "Board")) - (t/is (= (:touched c-instance2) nil)) - (t/is (= (:name c-instance1) "Rect 1")) - (t/is (= (:touched c-instance1) nil)) - (t/is (= (:name c-shape1) "Circle 1")) - (t/is (= (:touched c-shape1) nil)) - (t/is (= (:fill-color c-shape1) clr/black)) - (t/is (= (:fill-opacity c-shape1) 0)) - (t/is (= (:name c-shape2) "Rect 1")) - (t/is (= (:touched c-shape2) #{:fill-group})))))] - - (ptk/emit! - store - (dch/update-shapes [(:id shape2')] - (fn [shape] - (merge shape {:fill-color clr/test - :fill-opacity 0.5}))) - (dwl/update-component (:id instance2)) - :the/end)))) - ;; === Test reset changes ====================== (t/deftest test-reset-changes -- Gitee From 97e34d6e28e6fbd52b671a33ecb665c6b4ab6fc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Tue, 7 May 2024 11:35:01 +0200 Subject: [PATCH 0508/1266] :lipstick: Unify comments --- .../logic/comp_remove_swap_slots_test.cljc | 76 +++++++++++-------- .../logic/component_creation_test.cljc | 8 +- .../logic/components_touched_test.cljc | 51 +++++++------ .../logic/swap_and_reset_test.cljc | 51 ++++++------- 4 files changed, 100 insertions(+), 86 deletions(-) diff --git a/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc b/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc index 2fd559e0c..dcbd5cc48 100644 --- a/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc +++ b/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc @@ -51,12 +51,13 @@ (thf/make-component :b2 :frame-b2))) (t/deftest test-keep-swap-slot-relocating-blue1-to-root - (let [;; ============================== Setup =============================== + (let [;; ==== Setup file (setup-file) + page (thf/current-page file) blue1 (thf/get-shape file :blue1) - ;; ============================== Action ============================== + ;; ==== Action changes (cls/generate-relocate-shapes (pcb/empty-changes nil) (:objects page) #{(:parent-id blue1)} ;; parents @@ -66,10 +67,11 @@ #{(:id blue1)}) ;; ids file' (thf/apply-changes file changes) - ;; ============================== Get ================================= + ;; ==== Get blue1' (thf/get-shape file' :blue1)] - ;; ================================== Check =============================== + ;; ==== Check + ;; blue1 had swap-id before move (t/is (some? (ctk/get-swap-slot blue1))) @@ -78,12 +80,12 @@ (t/is (nil? (ctk/get-swap-slot blue1'))))) (t/deftest test-keep-swap-slot-move-blue1-to-root - (let [;; ============================== Setup =============================== + (let [;; ==== Setup file (setup-file) page (thf/current-page file) blue1 (thf/get-shape file :blue1) - ;; ============================== Action ============================== + ;; ==== Action changes (cls/generate-move-shapes-to-frame (pcb/empty-changes nil) #{(:id blue1)} ;; ids uuid/zero ;; frame-id @@ -94,10 +96,11 @@ file' (thf/apply-changes file changes) - ;; ============================== Get ================================= + ;; ==== Get blue1' (thf/get-shape file' :blue1)] - ;; ================================== Check =============================== + ;; ==== Check + ;; blue1 had swap-id before move (t/is (some? (ctk/get-swap-slot blue1))) @@ -107,14 +110,14 @@ (t/deftest test-keep-swap-slot-relocating-blue1-to-b2 - (let [;; ============================== Setup =============================== + (let [;; ==== Setup file (setup-file) page (thf/current-page file) blue1 (thf/get-shape file :blue1) b2 (thf/get-shape file :frame-b2) - ;; ============================== Action ============================== + ;; ==== Action changes (cls/generate-relocate-shapes (pcb/empty-changes nil) (:objects page) #{(:parent-id blue1)} ;; parents @@ -124,10 +127,11 @@ #{(:id blue1)}) ;; ids file' (thf/apply-changes file changes) - ;; ============================== Get ================================= + ;; ==== Get blue1' (thf/get-shape file' :blue1)] - ;; ================================== Check =============================== + ;; ==== Check + ;; blue1 had swap-id before move (t/is (some? (ctk/get-swap-slot blue1))) @@ -136,14 +140,14 @@ (t/is (nil? (ctk/get-swap-slot blue1'))))) (t/deftest test-keep-swap-slot-move-blue1-to-b2 - (let [;; ============================== Setup =============================== + (let [;; ==== Setup file (setup-file) page (thf/current-page file) blue1 (thf/get-shape file :blue1) b2 (thf/get-shape file :frame-b2) - ;; ============================== Action ============================== + ;; ==== Action changes (cls/generate-move-shapes-to-frame (pcb/empty-changes nil) #{(:id blue1)} ;; ids (:id b2) ;; frame-id @@ -154,10 +158,11 @@ file' (thf/apply-changes file changes) - ;; ============================== Get ================================= + ;; ==== Get blue1' (thf/get-shape file' :blue1)] - ;; ================================== Check =============================== + ;; ==== Check + ;; blue1 had swap-id before move (t/is (some? (ctk/get-swap-slot blue1))) @@ -166,13 +171,13 @@ (t/is (nil? (ctk/get-swap-slot blue1'))))) (t/deftest test-keep-swap-slot-relocating-yellow-to-root - (let [;; ============================== Setup =============================== + (let [;; ==== Setup file (setup-file) page (thf/current-page file) blue1 (thf/get-shape file :blue1) yellow (thf/get-shape file :frame-yellow) - ;; ============================== Action ============================== + ;; ==== Action ;; Move blue1 into yellow changes (cls/generate-relocate-shapes (pcb/empty-changes nil) (:objects page) @@ -196,10 +201,11 @@ #{(:id yellow')}) ;; ids file'' (thf/apply-changes file' changes') - ;; ============================== Get ================================= + ;; ==== Get blue1'' (thf/get-shape file'' :blue1)] - ;; ================================== Check =============================== + ;; ==== Check + ;; blue1 had swap-id before move (t/is (some? (ctk/get-swap-slot blue1))) @@ -208,13 +214,14 @@ (t/is (nil? (ctk/get-swap-slot blue1''))))) (t/deftest test-keep-swap-slot-move-yellow-to-root - (let [;; ============================== Setup =============================== + (let [;; ==== Setup file (setup-file) page (thf/current-page file) blue1 (thf/get-shape file :blue1) yellow (thf/get-shape file :frame-yellow) - ;; ============================== Action ============================== + ;; ==== Action + ;; Move blue1 into yellow changes (cls/generate-move-shapes-to-frame (pcb/empty-changes nil) #{(:id blue1)} ;; ids @@ -238,10 +245,11 @@ nil) ;; cell file'' (thf/apply-changes file' changes') - ;; ============================== Get ================================= + ;; ==== Get blue1'' (thf/get-shape file'' :blue1)] - ;; ================================== Check =============================== + ;; ==== Check + ;; blue1 had swap-id before move (t/is (some? (ctk/get-swap-slot blue1))) @@ -251,13 +259,14 @@ (t/deftest test-keep-swap-slot-relocating-yellow-to-b2 - (let [;; ============================== Setup =============================== + (let [;; ==== Setup file (setup-file) page (thf/current-page file) blue1 (thf/get-shape file :blue1) yellow (thf/get-shape file :frame-yellow) - ;; ============================== Action ============================== + ;; ==== Action + ;; Move blue1 into yellow changes (cls/generate-relocate-shapes (pcb/empty-changes nil) (:objects page) @@ -282,10 +291,11 @@ #{(:id yellow')}) ;; ids file'' (thf/apply-changes file' changes') - ;; ============================== Get ================================= + ;; ==== Get blue1'' (thf/get-shape file'' :blue1)] - ;; ================================== Check =============================== + ;; ==== Check + ;; blue1 had swap-id before move (t/is (some? (ctk/get-swap-slot blue1))) @@ -294,13 +304,14 @@ (t/is (nil? (ctk/get-swap-slot blue1''))))) (t/deftest test-keep-swap-slot-move-yellow-to-b2 - (let [;; ============================== Setup =============================== + (let [;; ==== Setup file (setup-file) page (thf/current-page file) blue1 (thf/get-shape file :blue1) yellow (thf/get-shape file :frame-yellow) - ;; ============================== Action ============================== + ;; ==== Action + ;; Move blue1 into yellow changes (cls/generate-move-shapes-to-frame (pcb/empty-changes nil) #{(:id blue1)} ;; ids @@ -326,10 +337,11 @@ file'' (thf/apply-changes file' changes') - ;; ============================== Get ================================= + ;; ==== Get blue1'' (thf/get-shape file'' :blue1)] - ;; ================================== Check =============================== + ;; ==== Check + ;; blue1 had swap-id before move (t/is (some? (ctk/get-swap-slot blue1))) diff --git a/common/test/common_tests/logic/component_creation_test.cljc b/common/test/common_tests/logic/component_creation_test.cljc index 59ec29806..daf1565f8 100644 --- a/common/test/common_tests/logic/component_creation_test.cljc +++ b/common/test/common_tests/logic/component_creation_test.cljc @@ -15,14 +15,14 @@ (t/use-fixtures :each thi/test-fixture) (t/deftest test-add-component-from-single-shape - (let [;; Setup + (let [;; ==== Setup file (-> (thf/sample-file :file1) (thf/add-sample-shape :shape1 :type :frame)) page (thf/current-page file) shape1 (thf/get-shape file :shape1) - ;; Action + ;; ==== Action [_ component-id changes] (cll/generate-add-component (pcb/empty-changes) [shape1] @@ -35,11 +35,11 @@ file' (thf/apply-changes file changes) - ;; Get + ;; ==== Get component (thf/get-component-by-id file' component-id) root (thf/get-shape-by-id file' (:main-instance-id component))] - ;; Check + ;; ==== Check (t/is (some? component)) (t/is (some? root)) (t/is (= (:component-id root) (:id component))))) diff --git a/common/test/common_tests/logic/components_touched_test.cljc b/common/test/common_tests/logic/components_touched_test.cljc index e20827c1e..d409c8d5f 100644 --- a/common/test/common_tests/logic/components_touched_test.cljc +++ b/common/test/common_tests/logic/components_touched_test.cljc @@ -16,7 +16,7 @@ (t/use-fixtures :each thi/test-fixture) (t/deftest test-touched-when-changing-attribute - (let [;; Setup + (let [;; ==== Setup file (-> (thf/sample-file :file1) (tho/add-simple-component-with-copy :component1 :main-root @@ -27,7 +27,7 @@ page (thf/current-page file) copy-root (thf/get-shape file :copy-root) - ;; Action + ;; ==== Action update-fn (fn [shape] (assoc shape :fills (thf/sample-fills-color :fill-color "#fabada"))) @@ -39,13 +39,13 @@ file' (thf/apply-changes file changes) - ;; Get + ;; ==== Get copy-root' (thf/get-shape file' :copy-root) copy-child' (thf/get-shape-by-id file' (first (:shapes copy-root'))) fills' (:fills copy-child') fill' (first fills')] - ;; Check + ;; ==== Check (t/is (= (count fills') 1)) (t/is (= (:fill-color fill') "#fabada")) (t/is (= (:fill-opacity fill') 1)) @@ -53,7 +53,7 @@ (t/is (= (:touched copy-child') #{:fill-group})))) (t/deftest test-not-touched-when-adding-shape - (let [;; Setup + (let [;; ==== Setup file (-> (thf/sample-file :file1) (tho/add-simple-component-with-copy :component1 :main-root @@ -64,7 +64,8 @@ page (thf/current-page file) copy-root (thf/get-shape file :copy-root) - ;; Action + ;; ==== Action + ;; IMPORTANT: as modifying copies structure is now forbidden, this action ;; will not have any effect, and so the parent shape won't also be touched. changes (cls/generate-relocate-shapes (pcb/empty-changes) @@ -77,16 +78,16 @@ file' (thf/apply-changes file changes) - ;; Get + ;; ==== Get copy-root' (thf/get-shape file' :copy-root) copy-child' (thf/get-shape-by-id file' (first (:shapes copy-root')))] - ;; Check + ;; ==== Check (t/is (= (:touched copy-root') nil)) (t/is (= (:touched copy-child') nil)))) (t/deftest test-touched-when-deleting-shape - (let [;; Setup + (let [;; ==== Setup file (-> (thf/sample-file :file1) (tho/add-simple-component-with-copy :component1 :main-root @@ -96,7 +97,8 @@ page (thf/current-page file) copy-root (thf/get-shape file :copy-root) - ;; Action + ;; ==== Action + ;; IMPORTANT: as modifying copies structure is now forbidden, this action will not ;; delete the child shape, but hide it (thus setting the visibility group). [_all-parents changes] @@ -109,16 +111,16 @@ file' (thf/apply-changes file changes) - ;; Get + ;; ==== Get copy-root' (thf/get-shape file' :copy-root) copy-child' (thf/get-shape-by-id file' (first (:shapes copy-root')))] - ;; Check + ;; ==== Check (t/is (= (:touched copy-root') nil)) (t/is (= (:touched copy-child') #{:visibility-group})))) (t/deftest test-not-touched-when-moving-shape - (let [;; Setup + (let [;; ==== Setup file (-> (thf/sample-file :file1) (tho/add-component-with-many-children-and-copy :component1 :main-root @@ -130,7 +132,8 @@ copy-root (thf/get-shape file :copy-root) copy-child1 (thf/get-shape-by-id file (first (:shapes copy-root))) - ;; Action + ;; ==== Action + ;; IMPORTANT: as modifying copies structure is now forbidden, this action ;; will not have any effect, and so the parent shape won't also be touched. changes (cls/generate-relocate-shapes (pcb/empty-changes) @@ -143,16 +146,16 @@ file' (thf/apply-changes file changes) - ;; Get + ;; ==== Get copy-root' (thf/get-shape file' :copy-root) copy-child' (thf/get-shape-by-id file' (first (:shapes copy-root')))] - ;; Check + ;; ==== Check (t/is (= (:touched copy-root') nil)) (t/is (= (:touched copy-child') nil)))) (t/deftest test-touched-when-changing-upper - (let [;; Setup + (let [;; ==== Setup file (-> (thf/sample-file :file1) (tho/add-nested-component-with-copy :component1 :main1-root @@ -166,7 +169,7 @@ page (thf/current-page file) copy2-root (thf/get-shape file :copy2-root) - ;; Action + ;; ==== Action update-fn (fn [shape] (assoc shape :fills (thf/sample-fills-color :fill-color "#fabada"))) @@ -178,19 +181,19 @@ file' (thf/apply-changes file changes) - ;; Get + ;; ==== Get copy2-root' (thf/get-shape file' :copy2-root) fills' (:fills copy2-root') fill' (first fills')] - ;; Check + ;; ==== Check (t/is (= (count fills') 1)) (t/is (= (:fill-color fill') "#fabada")) (t/is (= (:fill-opacity fill') 1)) (t/is (= (:touched copy2-root') #{:fill-group})))) (t/deftest test-touched-when-changing-lower - (let [;; Setup + (let [;; ==== Setup file (-> (thf/sample-file :file1) (tho/add-nested-component-with-copy :component1 :main1-root @@ -204,7 +207,7 @@ page (thf/current-page file) copy2-root (thf/get-shape file :copy2-root) - ;; Action + ;; ==== Action update-fn (fn [shape] (assoc shape :fills (thf/sample-fills-color :fill-color "#fabada"))) @@ -216,13 +219,13 @@ file' (thf/apply-changes file changes) - ;; Get + ;; ==== Get copy2-root' (thf/get-shape file' :copy2-root) copy2-child' (thf/get-shape-by-id file' (first (:shapes copy2-root'))) fills' (:fills copy2-child') fill' (first fills')] - ;; Check + ;; ==== Check (t/is (= (count fills') 1)) (t/is (= (:fill-color fill') "#fabada")) (t/is (= (:fill-opacity fill') 1)) diff --git a/common/test/common_tests/logic/swap_and_reset_test.cljc b/common/test/common_tests/logic/swap_and_reset_test.cljc index 535315297..ba9746c3a 100644 --- a/common/test/common_tests/logic/swap_and_reset_test.cljc +++ b/common/test/common_tests/logic/swap_and_reset_test.cljc @@ -19,19 +19,22 @@ ;; Related .penpot file: common/test/cases/swap-and-reset.penpot (t/deftest test-simple-swap - (let [;; Setup - file - (-> (thf/sample-file :file1) - (thc/add-simple-component-with-copy :component-1 :component-1-main-root :component-1-main-child :component-1-copy-root) - (thc/add-simple-component :component-2 :component-2-root :component-2-child)) + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (thc/add-simple-component-with-copy :component-1 + :component-1-main-root + :component-1-main-child + :component-1-copy-root) + (thc/add-simple-component :component-2 + :component-2-root + :component-2-child)) component-1-copy-root (thf/get-shape file :component-1-copy-root) - component-1 (thf/get-component file :component-1) component-2 (thf/get-component file :component-2) page (thf/current-page file) - ;; Action - [new-shape all-parents changes] + ;; ==== Action + [new-shape _all-parents changes] (cll/generate-component-swap (pcb/empty-changes) (:objects page) component-1-copy-root @@ -45,16 +48,16 @@ file' (thf/apply-changes file changes) - ;; Get + ;; ==== Get swapped (thf/get-shape-by-id file' (:id new-shape))] - ;; Check + ;; ==== Check (t/is (not= (:component-id component-1-copy-root) (:component-id swapped))) (t/is (= (:id component-2) (:component-id swapped))) (t/is (= (:id file) (:component-file swapped))))) (t/deftest test-swap-nested - (let [;; Setup + (let [;; ==== Setup file (-> (thf/sample-file :file1) (thc/add-simple-component :component-1 :component-1-main-root :component-1-main-child) @@ -65,9 +68,7 @@ (thc/add-simple-component :component-2 :component-2-main-root :component-2-main-child)) page (thf/current-page file) - component-1 (thf/get-component file :component-1) component-2 (thf/get-component file :component-2) - component-3 (thf/get-component file :component-3) copy (->> @@ -78,8 +79,8 @@ libraries {(:id file) file} - ;; Action - [new-shape all-parents changes] + ;; ==== Action + [new-shape _all-parents changes] (cll/generate-component-swap (pcb/empty-changes) (:objects page) copy @@ -95,7 +96,7 @@ libraries' {(:id file') file'} page' (thf/current-page file') - ;; Get + ;; ==== Get swapped (thf/get-shape-by-id file' (:id new-shape)) component-1-copy-root (thf/get-shape file' :component-1-copy-root) slot (-> (ctf/find-swap-slot swapped @@ -104,7 +105,7 @@ libraries') (ctk/build-swap-slot-group))] - ;; Check + ;; ==== Check (t/is (not= (:component-id copy) (:component-id swapped))) (t/is (= (:id component-2) (:component-id swapped))) (t/is (= (:id file) (:component-file swapped))) @@ -112,7 +113,7 @@ (t/is (= (ctk/get-swap-slot swapped) (:id component-1-copy-root))))) (t/deftest test-swap-and-reset-override - (let [;; Setup + (let [;; ==== Setup file (-> (thf/sample-file :file1) (thc/add-simple-component :component-1 :component-1-main-root :component-1-main-child) @@ -133,8 +134,8 @@ first (thf/get-shape-by-id file)) - ;; Action - [new-shape all-parents changes-swap] + ;; ==== Action + [new-shape _all-parents changes-swap] (cll/generate-component-swap (pcb/empty-changes) (:objects page) copy @@ -158,17 +159,15 @@ true) file' (thf/apply-changes file changes) - page' (thf/current-page file') - ;; Get + + ;; ==== Get reset (->> (thf/get-shape file' :component-container-instance) :shapes first - (thf/get-shape-by-id file')) - - component-1-copy-root (thf/get-shape file' :component-1-copy-root)] + (thf/get-shape-by-id file'))] - ;; Check + ;; ==== Check (t/is (= (:id component-1) (:component-id reset))) (t/is (nil? (ctk/get-swap-slot reset))))) -- Gitee From c937d49ce9187e3fd9f20e8c1d284367e2684d5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Tue, 7 May 2024 12:50:32 +0200 Subject: [PATCH 0509/1266] :lipstick: Split helpers in separated files --- .../test/common_tests/helpers/components.cljc | 153 +++++++++ .../common_tests/helpers/compositions.cljc | 25 +- common/test/common_tests/helpers/debug.cljc | 53 --- common/test/common_tests/helpers/files.cljc | 318 ++++-------------- common/test/common_tests/helpers/shapes.cljc | 101 ++++++ .../logic/comp_remove_swap_slots_test.cljc | 83 +++-- .../logic/component_creation_test.cljc | 12 +- .../logic/components_touched_test.cljc | 55 +-- .../logic/swap_and_reset_test.cljc | 62 ++-- .../types/types_libraries_test.cljc | 32 +- 10 files changed, 462 insertions(+), 432 deletions(-) create mode 100644 common/test/common_tests/helpers/components.cljc delete mode 100644 common/test/common_tests/helpers/debug.cljc create mode 100644 common/test/common_tests/helpers/shapes.cljc diff --git a/common/test/common_tests/helpers/components.cljc b/common/test/common_tests/helpers/components.cljc new file mode 100644 index 000000000..56ebf488d --- /dev/null +++ b/common/test/common_tests/helpers/components.cljc @@ -0,0 +1,153 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns common-tests.helpers.components + (:require + [app.common.data.macros :as dm] + [app.common.files.changes-builder :as pcb] + [app.common.files.helpers :as cfh] + [app.common.geom.point :as gpt] + [app.common.logic.libraries :as cll] + [app.common.types.component :as ctk] + [app.common.types.components-list :as ctkl] + [app.common.types.container :as ctn] + [app.common.types.file :as ctf] + [app.common.types.pages-list :as ctpl] + [app.common.types.shape-tree :as ctst] + [common-tests.helpers.files :as thf] + [common-tests.helpers.ids-map :as thi] + [common-tests.helpers.shapes :as ths])) + +(defn make-component + [file label root-label & {:keys [] :as params}] + (let [page (thf/current-page file) + root (ths/get-shape file root-label)] + + (dm/assert! + "Need that root is already a frame" + (cfh/frame-shape? root)) + + (let [[_new-root _new-shapes updated-shapes] + (ctn/convert-shape-in-component root (:objects page) (:id file)) + + updated-root (first updated-shapes)] ; Can't use new-root because it has a new id + + (thi/set-id! label (:component-id updated-root)) + + (ctf/update-file-data + file + (fn [file-data] + (as-> file-data $ + (reduce (fn [file-data shape] + (ctpl/update-page file-data + (:id page) + #(update % :objects assoc (:id shape) shape))) + $ + updated-shapes) + (ctkl/add-component $ (assoc params + :id (:component-id updated-root) + :name (:name updated-root) + :main-instance-id (:id updated-root) + :main-instance-page (:id page) + :shapes updated-shapes)))))))) + +(defn get-component + [file label] + (ctkl/get-component (:data file) (thi/id label))) + +(defn get-component-by-id + [file id] + (ctkl/get-component (:data file) id)) + +(defn set-child-label + [file shape-label child-idx label] + (let [id (-> (ths/get-shape file shape-label) + :shapes + (nth child-idx))] + (when id + (thi/set-id! label id)))) + +(defn instantiate-component + [file component-label copy-root-label & {:keys [parent-label library children-labels] :as params}] + (let [page (thf/current-page file) + library (or library file) + component (get-component library component-label) + parent-id (when parent-label + (thi/id parent-label)) + parent (when parent-id + (ctst/get-shape page parent-id)) + frame-id (if (cfh/frame-shape? parent) + (:id parent) + (:frame-id parent)) + + [copy-root copy-shapes] + (ctn/make-component-instance page + component + (:data library) + (gpt/point 100 100) + true + {:force-id (thi/new-id! copy-root-label) + :force-frame-id frame-id}) + + copy-root' (cond-> copy-root + (some? parent) + (assoc :parent-id parent-id) + + (some? frame-id) + (assoc :frame-id frame-id) + + (and (some? parent) (ctn/in-any-component? (:objects page) parent)) + (dissoc :component-root)) + file' (ctf/update-file-data + file + (fn [file-data] + (as-> file-data $ + (ctpl/update-page $ + (:id page) + #(ctst/add-shape (:id copy-root') + copy-root' + % + frame-id + parent-id + nil + true)) + (reduce (fn [file-data shape] + (ctpl/update-page file-data + (:id page) + #(ctst/add-shape (:id shape) + shape + % + (:parent-id shape) + (:frame-id shape) + nil + true))) + $ + (remove #(= (:id %) (:did copy-root')) copy-shapes)))))] + (when children-labels + (dotimes [idx (count children-labels)] + (set-child-label file' copy-root-label idx (nth children-labels idx)))) + file')) + +(defn component-swap + [file shape-label new-component-label new-shape-label & {:keys [library] :as params}] + (let [shape (ths/get-shape file shape-label) + library (or library file) + libraries {(:id library) library} + page (thf/current-page file) + objects (:objects page) + id-new-component (-> (get-component library new-component-label) + :id) + + ;; Store the properties that need to be maintained when the component is swapped + keep-props-values (select-keys shape ctk/swap-keep-attrs) + + + [new_shape _ changes] + (-> (pcb/empty-changes nil (:id page)) + (cll/generate-component-swap objects shape (:data file) page libraries id-new-component 0 nil keep-props-values))] + + (thi/set-id! new-shape-label (:id new_shape)) + (thf/apply-changes file changes))) diff --git a/common/test/common_tests/helpers/compositions.cljc b/common/test/common_tests/helpers/compositions.cljc index 50e367afd..cf1a02d9a 100644 --- a/common/test/common_tests/helpers/compositions.cljc +++ b/common/test/common_tests/helpers/compositions.cljc @@ -7,13 +7,14 @@ (ns common-tests.helpers.compositions (:require [app.common.data :as d] - [common-tests.helpers.files :as thf])) + [common-tests.helpers.components :as thc] + [common-tests.helpers.shapes :as ths])) (defn add-rect [file rect-label & {:keys [] :as params}] ;; Generated shape tree: ;; :rect-label [:type :rect :name: Rect1] - (thf/add-sample-shape file rect-label + (ths/add-sample-shape file rect-label (merge {:type :rect :name "Rect1"} params))) @@ -22,7 +23,7 @@ [file frame-label & {:keys [] :as params}] ;; Generated shape tree: ;; :frame-label [:type :frame :name: Frame1] - (thf/add-sample-shape file frame-label + (ths/add-sample-shape file frame-label (merge {:type :frame :name "Frame1"} params))) @@ -34,7 +35,7 @@ ;; :child-label [:name: Rect1] (-> file (add-frame frame-label frame-params) - (thf/add-sample-shape child-label + (ths/add-sample-shape child-label (merge {:type :rect :name "Rect1" :parent-label frame-label} @@ -48,7 +49,7 @@ ;; :child-label [:name: Rect1] (-> file (add-frame-with-child root-label child-label :frame-params root-params :child-params child-params) - (thf/make-component component-label root-label component-params))) + (thc/make-component component-label root-label component-params))) (defn add-simple-component-with-copy [file component-label main-root-label main-child-label copy-root-label @@ -66,7 +67,7 @@ :component-params component-params :root-params main-root-params :child-params main-child-params) - (thf/instantiate-component component-label copy-root-label copy-root-params))) + (thc/instantiate-component component-label copy-root-label copy-root-params))) (defn add-component-with-many-children [file component-label root-label child-labels @@ -79,7 +80,7 @@ (as-> file $ (add-frame $ root-label root-params) (reduce (fn [file [index [label params]]] - (thf/add-sample-shape file + (ths/add-sample-shape file label (merge {:type :rect :name (str "Rect" (inc index)) @@ -87,7 +88,7 @@ params))) $ (d/enumerate (d/zip-all child-labels child-params-list))) - (thf/make-component $ component-label root-label component-params))) + (thc/make-component $ component-label root-label component-params))) (defn add-component-with-many-children-and-copy [file component-label main-root-label main-child-labels copy-root-label @@ -109,7 +110,7 @@ :component-params component-params :root-params main-root-params :child-params-list main-child-params-list) - (thf/instantiate-component component-label copy-root-label copy-root-params))) + (thc/instantiate-component component-label copy-root-label copy-root-params))) (defn add-nested-component [file component1-label main1-root-label main1-child-label component2-label main2-root-label nested-head-label @@ -130,11 +131,11 @@ :child-params main1-child-params) (add-frame main2-root-label (merge {:name "Frame2"} main2-root-params)) - (thf/instantiate-component component1-label + (thc/instantiate-component component1-label nested-head-label (assoc nested-head-params :parent-label main2-root-label)) - (thf/make-component component2-label + (thc/make-component component2-label main2-root-label component2-params))) @@ -165,4 +166,4 @@ :component2-params component2-params :main2-root-params main2-root-params :nested-head-params nested-head-params) - (thf/instantiate-component component2-label copy2-label copy2-params))) \ No newline at end of file + (thc/instantiate-component component2-label copy2-label copy2-params))) \ No newline at end of file diff --git a/common/test/common_tests/helpers/debug.cljc b/common/test/common_tests/helpers/debug.cljc deleted file mode 100644 index 5ecdcdb71..000000000 --- a/common/test/common_tests/helpers/debug.cljc +++ /dev/null @@ -1,53 +0,0 @@ -(ns common-tests.helpers.debug - (:require - [app.common.data :as d] - [app.common.uuid :as uuid] - [common-tests.helpers.ids-map :as thi] - [cuerdas.core :as str])) - -(defn dump-shape - "Dumps a shape, with each attribute in a line" - [shape] - (println "{") - (doseq [[k v] (sort shape)] - (when (some? v) - (println (str " " k " : " v)))) - (println "}")) - -(defn- stringify-keys [m keys] - (apply str (interpose ", " (map #(str % ": " (get m %)) keys)))) - -(defn- dump-page-shape - [shape keys padding] - (println (str/pad (str padding - (when (:main-instance shape) "{") - (or (thi/label (:id shape)) "") - (when (:main-instance shape) "}") - (when keys - (str " [" (stringify-keys shape keys) "]"))) - {:length 40 :type :right}) - (if (nil? (:shape-ref shape)) - (if (:component-root shape) - (str "# [Component " (or (thi/label (:component-id shape)) "") "]") - "") - (str/format "%s--> %s%s" - (cond (:component-root shape) "#" - (:component-id shape) "@" - :else "-") - (if (:component-root shape) - (str "[Component " (or (thi/label (:component-id shape)) "") "] ") - "") - (or (thi/label (:shape-ref shape)) ""))))) - -(defn dump-page - "Dumps the layer tree of the page. Prints the label of each shape, and the specified keys. - Example: (thd/dump-page (thf/current-page file) [:id :touched])" - ([page keys] - (dump-page page uuid/zero "" keys)) - ([page root-id padding keys] - (let [lookupf (d/getf (:objects page)) - root-shape (lookupf root-id) - shapes (map lookupf (:shapes root-shape))] - (doseq [shape shapes] - (dump-page-shape shape keys padding) - (dump-page page (:id shape) (str padding " ") keys))))) diff --git a/common/test/common_tests/helpers/files.cljc b/common/test/common_tests/helpers/files.cljc index c7de66880..2d893104f 100644 --- a/common/test/common_tests/helpers/files.cljc +++ b/common/test/common_tests/helpers/files.cljc @@ -6,29 +6,17 @@ (ns common-tests.helpers.files (:require - [app.common.colors :as clr] - [app.common.data.macros :as dm] + [app.common.data :as d] [app.common.features :as ffeat] [app.common.files.changes :as cfc] - [app.common.files.changes-builder :as pcb] - [app.common.files.helpers :as cfh] [app.common.files.validate :as cfv] - [app.common.geom.point :as gpt] - [app.common.logic.libraries :as cll] [app.common.pprint :refer [pprint]] - [app.common.types.color :as ctc] - [app.common.types.colors-list :as ctcl] - [app.common.types.component :as ctk] - [app.common.types.components-list :as ctkl] - [app.common.types.container :as ctn] [app.common.types.file :as ctf] [app.common.types.page :as ctp] [app.common.types.pages-list :as ctpl] - [app.common.types.shape :as cts] - [app.common.types.shape-tree :as ctst] - [app.common.types.typographies-list :as cttl] - [app.common.types.typography :as ctt] - [common-tests.helpers.ids-map :as thi])) + [app.common.uuid :as uuid] + [common-tests.helpers.ids-map :as thi] + [cuerdas.core :as str])) ;; ----- Files @@ -68,25 +56,6 @@ (validate-file! file') file')) -(declare current-page-id) -(declare get-page) - -(defn dump-file - [file & {:keys [page-label libraries] :as params}] - (let [params (-> params - (or {:show-ids true :show-touched true}) - (dissoc page-label libraries)) - page (if (some? page-label) - (:id (get-page file page-label)) - (current-page-id file)) - libraries (or libraries {})] - - (ctf/dump-tree file page libraries params))) - -(defn pprint-file - [file & {:keys [level length] :or {level 10 length 1000}}] - (pprint file {:level level :length length})) - ;; ----- Pages (defn sample-page @@ -116,221 +85,74 @@ [file label] (vary-meta file assoc :current-page-id (thi/id label))) -;; ----- Shapes - -(defn sample-shape - [label & {:keys [type] :as params}] - (let [params (cond-> params - label - (assoc :id (thi/new-id! label)) - - (nil? type) - (assoc :type :rect))] - - (cts/setup-shape params))) - -(defn add-sample-shape - [file label & {:keys [parent-label] :as params}] - (let [page (current-page file) - shape (sample-shape label (dissoc params :parent-label)) - parent-id (when parent-label - (thi/id parent-label)) - parent (when parent-id - (ctst/get-shape page parent-id)) - frame-id (if (cfh/frame-shape? parent) - (:id parent) - (:frame-id parent))] - (ctf/update-file-data - file - (fn [file-data] - (ctpl/update-page file-data - (:id page) - #(ctst/add-shape (:id shape) - shape - % - frame-id - parent-id - nil - true)))))) - -(defn get-shape - [file label & {:keys [page-label]}] - (let [page (if page-label - (get-page file page-label) - (current-page file))] - (ctst/get-shape page (thi/id label)))) - -(defn get-shape-by-id - [file id & {:keys [page-label]}] - (let [page (if page-label - (get-page file page-label) - (current-page file))] - (ctst/get-shape page id))) - -;; ----- Components - -(defn make-component - [file label root-label & {:keys [] :as params}] - (let [page (current-page file) - root (get-shape file root-label)] - - (dm/assert! - "Need that root is already a frame" - (cfh/frame-shape? root)) - - (let [[_new-root _new-shapes updated-shapes] - (ctn/convert-shape-in-component root (:objects page) (:id file)) - - updated-root (first updated-shapes)] ; Can't use new-root because it has a new id - - (thi/set-id! label (:component-id updated-root)) - - (ctf/update-file-data - file - (fn [file-data] - (as-> file-data $ - (reduce (fn [file-data shape] - (ctpl/update-page file-data - (:id page) - #(update % :objects assoc (:id shape) shape))) - $ - updated-shapes) - (ctkl/add-component $ (assoc params - :id (:component-id updated-root) - :name (:name updated-root) - :main-instance-id (:id updated-root) - :main-instance-page (:id page) - :shapes updated-shapes)))))))) - -(defn get-component - [file label] - (ctkl/get-component (:data file) (thi/id label))) - -(defn get-component-by-id - [file id] - (ctkl/get-component (:data file) id)) - -(defn set-child-label - [file shape-label child-idx label] - (let [id (-> (get-shape file shape-label) - :shapes - (nth child-idx))] - (when id - (thi/set-id! label id)))) +;; ----- Debug -(defn instantiate-component - [file component-label copy-root-label & {:keys [parent-label library children-labels] :as params}] - (let [page (current-page file) - library (or library file) - component (get-component library component-label) - parent-id (when parent-label - (thi/id parent-label)) - parent (when parent-id - (ctst/get-shape page parent-id)) - frame-id (if (cfh/frame-shape? parent) - (:id parent) - (:frame-id parent)) - - [copy-root copy-shapes] - (ctn/make-component-instance page - component - (:data library) - (gpt/point 100 100) - true - {:force-id (thi/new-id! copy-root-label) - :force-frame-id frame-id}) - - copy-root' (cond-> copy-root - (some? parent) - (assoc :parent-id parent-id) - - (some? frame-id) - (assoc :frame-id frame-id) - - (and (some? parent) (ctn/in-any-component? (:objects page) parent)) - (dissoc :component-root)) - file' (ctf/update-file-data - file - (fn [file-data] - (as-> file-data $ - (ctpl/update-page $ - (:id page) - #(ctst/add-shape (:id copy-root') - copy-root' - % - frame-id - parent-id - nil - true)) - (reduce (fn [file-data shape] - (ctpl/update-page file-data - (:id page) - #(ctst/add-shape (:id shape) - shape - % - (:parent-id shape) - (:frame-id shape) - nil - true))) - $ - (remove #(= (:id %) (:did copy-root')) copy-shapes)))))] - (when children-labels - (dotimes [idx (count children-labels)] - (set-child-label file' copy-root-label idx (nth children-labels idx)))) - file')) - - - -(defn component-swap - [file shape-label new-component-label new-shape-label & {:keys [library] :as params}] - (let [shape (get-shape file shape-label) - library (or library file) - libraries {(:id library) library} - page (current-page file) - objects (:objects page) - id-new-component (-> (get-component library new-component-label) - :id) - - ;; Store the properties that need to be maintained when the component is swapped - keep-props-values (select-keys shape ctk/swap-keep-attrs) - - - [new_shape _ changes] - (-> (pcb/empty-changes nil (:id page)) - (cll/generate-component-swap objects shape (:data file) page libraries id-new-component 0 nil keep-props-values))] - - (thi/set-id! new-shape-label (:id new_shape)) - (apply-changes file changes))) - - -(defn sample-color - [label & {:keys [] :as params}] - (ctc/make-color (assoc params :id (thi/new-id! label)))) - -(defn sample-fill-color - [& {:keys [fill-color fill-opacity] :as params}] - (let [params (cond-> params - (nil? fill-color) - (assoc :fill-color clr/black) - - (nil? fill-opacity) - (assoc :fill-opacity 1))] - params)) +(defn dump-file-type + "Dump a file using dump-tree function in common.types.file." + [file & {:keys [page-label libraries] :as params}] + (let [params (-> params + (or {:show-ids true :show-touched true}) + (dissoc page-label libraries)) + page (if (some? page-label) + (:id (get-page file page-label)) + (current-page-id file)) + libraries (or libraries {})] -(defn sample-fills-color - [& {:keys [] :as params}] - [(sample-fill-color params)]) + (ctf/dump-tree file page libraries params))) -(defn add-sample-library-color - [file label & {:keys [] :as params}] - (let [color (sample-color label params)] - (ctf/update-file-data file #(ctcl/add-color % color)))) +(defn pprint-file + "Pretry print a file trying to limit the quantity of info shown." + [file & {:keys [level length] :or {level 10 length 1000}}] + (pprint file {:level level :length length})) -(defn sample-typography - [label & {:keys [] :as params}] - (ctt/make-typography (assoc params :id (thi/new-id! label)))) +(defn dump-shape + "Dump a shape, with each attribute in a line." + [shape] + (println "{") + (doseq [[k v] (sort shape)] + (when (some? v) + (println (str " " k " : " v)))) + (println "}")) + +(defn- stringify-keys [m keys] + (apply str (interpose ", " (map #(str % ": " (get m %)) keys)))) + +(defn- dump-page-shape + [shape keys padding] + (println (str/pad (str padding + (when (:main-instance shape) "{") + (or (thi/label (:id shape)) "") + (when (:main-instance shape) "}") + (when keys + (str " [" (stringify-keys shape keys) "]"))) + {:length 40 :type :right}) + (if (nil? (:shape-ref shape)) + (if (:component-root shape) + (str "# [Component " (or (thi/label (:component-id shape)) "") "]") + "") + (str/format "%s--> %s%s" + (cond (:component-root shape) "#" + (:component-id shape) "@" + :else "-") + (if (:component-root shape) + (str "[Component " (or (thi/label (:component-id shape)) "") "] ") + "") + (or (thi/label (:shape-ref shape)) ""))))) + +(defn dump-page + "Dump the layer tree of the page. Print the label of each shape, and the specified keys." + ([page keys] + (dump-page page uuid/zero "" keys)) + ([page root-id padding keys] + (let [lookupf (d/getf (:objects page)) + root-shape (lookupf root-id) + shapes (map lookupf (:shapes root-shape))] + (doseq [shape shapes] + (dump-page-shape shape keys padding) + (dump-page page (:id shape) (str padding " ") keys))))) -(defn add-sample-typography - [file label & {:keys [] :as params}] - (let [typography (sample-typography label params)] - (ctf/update-file-data file #(cttl/add-typography % typography)))) +(defn dump-file + "Dump the current page of the file, using dump-page above. + Example: (thf/dump-file file [:id :touched])" + ([file] (dump-file file [])) + ([file keys] (dump-page (current-page file) keys))) diff --git a/common/test/common_tests/helpers/shapes.cljc b/common/test/common_tests/helpers/shapes.cljc new file mode 100644 index 000000000..53521cbe5 --- /dev/null +++ b/common/test/common_tests/helpers/shapes.cljc @@ -0,0 +1,101 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns common-tests.helpers.shapes + (:require + [app.common.colors :as clr] + [app.common.files.helpers :as cfh] + [app.common.types.color :as ctc] + [app.common.types.colors-list :as ctcl] + [app.common.types.file :as ctf] + [app.common.types.pages-list :as ctpl] + [app.common.types.shape :as cts] + [app.common.types.shape-tree :as ctst] + [app.common.types.typographies-list :as cttl] + [app.common.types.typography :as ctt] + [common-tests.helpers.files :as thf] + [common-tests.helpers.ids-map :as thi])) + +(defn sample-shape + [label & {:keys [type] :as params}] + (let [params (cond-> params + label + (assoc :id (thi/new-id! label)) + + (nil? type) + (assoc :type :rect))] + + (cts/setup-shape params))) + +(defn add-sample-shape + [file label & {:keys [parent-label] :as params}] + (let [page (thf/current-page file) + shape (sample-shape label (dissoc params :parent-label)) + parent-id (when parent-label + (thi/id parent-label)) + parent (when parent-id + (ctst/get-shape page parent-id)) + frame-id (if (cfh/frame-shape? parent) + (:id parent) + (:frame-id parent))] + (ctf/update-file-data + file + (fn [file-data] + (ctpl/update-page file-data + (:id page) + #(ctst/add-shape (:id shape) + shape + % + frame-id + parent-id + nil + true)))))) + +(defn get-shape + [file label & {:keys [page-label]}] + (let [page (if page-label + (thf/get-page file page-label) + (thf/current-page file))] + (ctst/get-shape page (thi/id label)))) + +(defn get-shape-by-id + [file id & {:keys [page-label]}] + (let [page (if page-label + (thf/get-page file page-label) + (thf/current-page file))] + (ctst/get-shape page id))) + +(defn sample-color + [label & {:keys [] :as params}] + (ctc/make-color (assoc params :id (thi/new-id! label)))) + +(defn sample-fill-color + [& {:keys [fill-color fill-opacity] :as params}] + (let [params (cond-> params + (nil? fill-color) + (assoc :fill-color clr/black) + + (nil? fill-opacity) + (assoc :fill-opacity 1))] + params)) + +(defn sample-fills-color + [& {:keys [] :as params}] + [(sample-fill-color params)]) + +(defn add-sample-library-color + [file label & {:keys [] :as params}] + (let [color (sample-color label params)] + (ctf/update-file-data file #(ctcl/add-color % color)))) + +(defn sample-typography + [label & {:keys [] :as params}] + (ctt/make-typography (assoc params :id (thi/new-id! label)))) + +(defn add-sample-typography + [file label & {:keys [] :as params}] + (let [typography (sample-typography label params)] + (ctf/update-file-data file #(cttl/add-typography % typography)))) diff --git a/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc b/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc index dcbd5cc48..331ee0e8a 100644 --- a/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc +++ b/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc @@ -11,9 +11,11 @@ [app.common.types.component :as ctk] [app.common.uuid :as uuid] [clojure.test :as t] + [common-tests.helpers.components :as thc] [common-tests.helpers.compositions :as tho] [common-tests.helpers.files :as thf] - [common-tests.helpers.ids-map :as thi])) + [common-tests.helpers.ids-map :as thi] + [common-tests.helpers.shapes :as ths])) (t/use-fixtures :each thi/test-fixture) @@ -34,28 +36,28 @@ (-> (thf/sample-file :file1) (tho/add-frame :frame-red) - (thf/make-component :red :frame-red) + (thc/make-component :red :frame-red) (tho/add-frame :frame-blue) - (thf/make-component :blue :frame-blue) + (thc/make-component :blue :frame-blue) (tho/add-frame :frame-green) - (thf/make-component :green :frame-green) - (thf/instantiate-component :red :red-copy-green :parent-label :frame-green) + (thc/make-component :green :frame-green) + (thc/instantiate-component :red :red-copy-green :parent-label :frame-green) (tho/add-frame :frame-b1) - (thf/make-component :b1 :frame-b1) + (thc/make-component :b1 :frame-b1) (tho/add-frame :frame-yellow :parent-label :frame-b1) - (thf/instantiate-component :red :red-copy :parent-label :frame-b1) - (thf/component-swap :red-copy :blue :blue1) - (thf/instantiate-component :green :green-copy :parent-label :frame-b1 :children-labels [:red-copy-in-green-copy]) - (thf/component-swap :red-copy-in-green-copy :blue :blue-copy-in-green-copy) + (thc/instantiate-component :red :red-copy :parent-label :frame-b1) + (thc/component-swap :red-copy :blue :blue1) + (thc/instantiate-component :green :green-copy :parent-label :frame-b1 :children-labels [:red-copy-in-green-copy]) + (thc/component-swap :red-copy-in-green-copy :blue :blue-copy-in-green-copy) (tho/add-frame :frame-b2) - (thf/make-component :b2 :frame-b2))) + (thc/make-component :b2 :frame-b2))) (t/deftest test-keep-swap-slot-relocating-blue1-to-root (let [;; ==== Setup file (setup-file) page (thf/current-page file) - blue1 (thf/get-shape file :blue1) + blue1 (ths/get-shape file :blue1) ;; ==== Action changes (cls/generate-relocate-shapes (pcb/empty-changes nil) @@ -68,7 +70,7 @@ file' (thf/apply-changes file changes) ;; ==== Get - blue1' (thf/get-shape file' :blue1)] + blue1' (ths/get-shape file' :blue1)] ;; ==== Check @@ -83,7 +85,7 @@ (let [;; ==== Setup file (setup-file) page (thf/current-page file) - blue1 (thf/get-shape file :blue1) + blue1 (ths/get-shape file :blue1) ;; ==== Action changes (cls/generate-move-shapes-to-frame (pcb/empty-changes nil) @@ -97,7 +99,7 @@ file' (thf/apply-changes file changes) ;; ==== Get - blue1' (thf/get-shape file' :blue1)] + blue1' (ths/get-shape file' :blue1)] ;; ==== Check @@ -113,8 +115,8 @@ (let [;; ==== Setup file (setup-file) page (thf/current-page file) - blue1 (thf/get-shape file :blue1) - b2 (thf/get-shape file :frame-b2) + blue1 (ths/get-shape file :blue1) + b2 (ths/get-shape file :frame-b2) ;; ==== Action @@ -128,7 +130,7 @@ file' (thf/apply-changes file changes) ;; ==== Get - blue1' (thf/get-shape file' :blue1)] + blue1' (ths/get-shape file' :blue1)] ;; ==== Check @@ -143,8 +145,8 @@ (let [;; ==== Setup file (setup-file) page (thf/current-page file) - blue1 (thf/get-shape file :blue1) - b2 (thf/get-shape file :frame-b2) + blue1 (ths/get-shape file :blue1) + b2 (ths/get-shape file :frame-b2) ;; ==== Action @@ -159,7 +161,7 @@ file' (thf/apply-changes file changes) ;; ==== Get - blue1' (thf/get-shape file' :blue1)] + blue1' (ths/get-shape file' :blue1)] ;; ==== Check @@ -174,8 +176,8 @@ (let [;; ==== Setup file (setup-file) page (thf/current-page file) - blue1 (thf/get-shape file :blue1) - yellow (thf/get-shape file :frame-yellow) + blue1 (ths/get-shape file :blue1) + yellow (ths/get-shape file :frame-yellow) ;; ==== Action ;; Move blue1 into yellow @@ -189,7 +191,7 @@ file' (thf/apply-changes file changes) page' (thf/current-page file') - yellow' (thf/get-shape file' :frame-yellow) + yellow' (ths/get-shape file' :frame-yellow) ;; Move yellow into root changes' (cls/generate-relocate-shapes (pcb/empty-changes nil) @@ -202,7 +204,7 @@ file'' (thf/apply-changes file' changes') ;; ==== Get - blue1'' (thf/get-shape file'' :blue1)] + blue1'' (ths/get-shape file'' :blue1)] ;; ==== Check @@ -217,11 +219,10 @@ (let [;; ==== Setup file (setup-file) page (thf/current-page file) - blue1 (thf/get-shape file :blue1) - yellow (thf/get-shape file :frame-yellow) + blue1 (ths/get-shape file :blue1) + yellow (ths/get-shape file :frame-yellow) ;; ==== Action - ;; Move blue1 into yellow changes (cls/generate-move-shapes-to-frame (pcb/empty-changes nil) #{(:id blue1)} ;; ids @@ -233,7 +234,7 @@ file' (thf/apply-changes file changes) page' (thf/current-page file') - yellow' (thf/get-shape file' :frame-yellow) + yellow' (ths/get-shape file' :frame-yellow) ;; Move yellow into root changes' (cls/generate-move-shapes-to-frame (pcb/empty-changes nil) @@ -246,7 +247,7 @@ file'' (thf/apply-changes file' changes') ;; ==== Get - blue1'' (thf/get-shape file'' :blue1)] + blue1'' (ths/get-shape file'' :blue1)] ;; ==== Check @@ -262,11 +263,10 @@ (let [;; ==== Setup file (setup-file) page (thf/current-page file) - blue1 (thf/get-shape file :blue1) - yellow (thf/get-shape file :frame-yellow) + blue1 (ths/get-shape file :blue1) + yellow (ths/get-shape file :frame-yellow) ;; ==== Action - ;; Move blue1 into yellow changes (cls/generate-relocate-shapes (pcb/empty-changes nil) (:objects page) @@ -278,8 +278,8 @@ file' (thf/apply-changes file changes) page' (thf/current-page file') - yellow' (thf/get-shape file' :frame-yellow) - b2' (thf/get-shape file' :frame-b2) + yellow' (ths/get-shape file' :frame-yellow) + b2' (ths/get-shape file' :frame-b2) ;; Move yellow into b2 changes' (cls/generate-relocate-shapes (pcb/empty-changes nil) @@ -292,7 +292,7 @@ file'' (thf/apply-changes file' changes') ;; ==== Get - blue1'' (thf/get-shape file'' :blue1)] + blue1'' (ths/get-shape file'' :blue1)] ;; ==== Check @@ -307,11 +307,10 @@ (let [;; ==== Setup file (setup-file) page (thf/current-page file) - blue1 (thf/get-shape file :blue1) - yellow (thf/get-shape file :frame-yellow) + blue1 (ths/get-shape file :blue1) + yellow (ths/get-shape file :frame-yellow) ;; ==== Action - ;; Move blue1 into yellow changes (cls/generate-move-shapes-to-frame (pcb/empty-changes nil) #{(:id blue1)} ;; ids @@ -323,8 +322,8 @@ file' (thf/apply-changes file changes) page' (thf/current-page file') - yellow' (thf/get-shape file' :frame-yellow) - b2' (thf/get-shape file' :frame-b2) + yellow' (ths/get-shape file' :frame-yellow) + b2' (ths/get-shape file' :frame-b2) ;; Move yellow into b2 changes' (cls/generate-move-shapes-to-frame (pcb/empty-changes nil) @@ -338,7 +337,7 @@ file'' (thf/apply-changes file' changes') ;; ==== Get - blue1'' (thf/get-shape file'' :blue1)] + blue1'' (ths/get-shape file'' :blue1)] ;; ==== Check diff --git a/common/test/common_tests/logic/component_creation_test.cljc b/common/test/common_tests/logic/component_creation_test.cljc index daf1565f8..13a7533b8 100644 --- a/common/test/common_tests/logic/component_creation_test.cljc +++ b/common/test/common_tests/logic/component_creation_test.cljc @@ -9,18 +9,20 @@ [app.common.files.changes-builder :as pcb] [app.common.logic.libraries :as cll] [clojure.test :as t] + [common-tests.helpers.components :as thc] [common-tests.helpers.files :as thf] - [common-tests.helpers.ids-map :as thi])) + [common-tests.helpers.ids-map :as thi] + [common-tests.helpers.shapes :as ths])) (t/use-fixtures :each thi/test-fixture) (t/deftest test-add-component-from-single-shape (let [;; ==== Setup file (-> (thf/sample-file :file1) - (thf/add-sample-shape :shape1 :type :frame)) + (ths/add-sample-shape :shape1 :type :frame)) page (thf/current-page file) - shape1 (thf/get-shape file :shape1) + shape1 (ths/get-shape file :shape1) ;; ==== Action [_ component-id changes] @@ -36,8 +38,8 @@ file' (thf/apply-changes file changes) ;; ==== Get - component (thf/get-component-by-id file' component-id) - root (thf/get-shape-by-id file' (:main-instance-id component))] + component (thc/get-component-by-id file' component-id) + root (ths/get-shape-by-id file' (:main-instance-id component))] ;; ==== Check (t/is (some? component)) diff --git a/common/test/common_tests/logic/components_touched_test.cljc b/common/test/common_tests/logic/components_touched_test.cljc index d409c8d5f..c7bc5bd62 100644 --- a/common/test/common_tests/logic/components_touched_test.cljc +++ b/common/test/common_tests/logic/components_touched_test.cljc @@ -11,7 +11,8 @@ [clojure.test :as t] [common-tests.helpers.compositions :as tho] [common-tests.helpers.files :as thf] - [common-tests.helpers.ids-map :as thi])) + [common-tests.helpers.ids-map :as thi] + [common-tests.helpers.shapes :as ths])) (t/use-fixtures :each thi/test-fixture) @@ -22,14 +23,14 @@ :main-root :main-child :copy-root - :main-child-params {:fills (thf/sample-fills-color + :main-child-params {:fills (ths/sample-fills-color :fill-color "#abcdef")})) page (thf/current-page file) - copy-root (thf/get-shape file :copy-root) + copy-root (ths/get-shape file :copy-root) ;; ==== Action update-fn (fn [shape] - (assoc shape :fills (thf/sample-fills-color :fill-color "#fabada"))) + (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) (:shapes copy-root) @@ -40,8 +41,8 @@ file' (thf/apply-changes file changes) ;; ==== Get - copy-root' (thf/get-shape file' :copy-root) - copy-child' (thf/get-shape-by-id file' (first (:shapes copy-root'))) + copy-root' (ths/get-shape file' :copy-root) + copy-child' (ths/get-shape-by-id file' (first (:shapes copy-root'))) fills' (:fills copy-child') fill' (first fills')] @@ -59,10 +60,10 @@ :main-root :main-child :copy-root) - (thf/add-sample-shape :free-shape)) + (ths/add-sample-shape :free-shape)) page (thf/current-page file) - copy-root (thf/get-shape file :copy-root) + copy-root (ths/get-shape file :copy-root) ;; ==== Action @@ -79,8 +80,8 @@ file' (thf/apply-changes file changes) ;; ==== Get - copy-root' (thf/get-shape file' :copy-root) - copy-child' (thf/get-shape-by-id file' (first (:shapes copy-root')))] + copy-root' (ths/get-shape file' :copy-root) + copy-child' (ths/get-shape-by-id file' (first (:shapes copy-root')))] ;; ==== Check (t/is (= (:touched copy-root') nil)) @@ -95,7 +96,7 @@ :copy-root)) page (thf/current-page file) - copy-root (thf/get-shape file :copy-root) + copy-root (ths/get-shape file :copy-root) ;; ==== Action @@ -112,8 +113,8 @@ file' (thf/apply-changes file changes) ;; ==== Get - copy-root' (thf/get-shape file' :copy-root) - copy-child' (thf/get-shape-by-id file' (first (:shapes copy-root')))] + copy-root' (ths/get-shape file' :copy-root) + copy-child' (ths/get-shape-by-id file' (first (:shapes copy-root')))] ;; ==== Check (t/is (= (:touched copy-root') nil)) @@ -126,11 +127,11 @@ :main-root [:main-child1 :main-child2 :main-child3] :copy-root) - (thf/add-sample-shape :free-shape)) + (ths/add-sample-shape :free-shape)) page (thf/current-page file) - copy-root (thf/get-shape file :copy-root) - copy-child1 (thf/get-shape-by-id file (first (:shapes copy-root))) + copy-root (ths/get-shape file :copy-root) + copy-child1 (ths/get-shape-by-id file (first (:shapes copy-root))) ;; ==== Action @@ -147,8 +148,8 @@ file' (thf/apply-changes file changes) ;; ==== Get - copy-root' (thf/get-shape file' :copy-root) - copy-child' (thf/get-shape-by-id file' (first (:shapes copy-root')))] + copy-root' (ths/get-shape file' :copy-root) + copy-child' (ths/get-shape-by-id file' (first (:shapes copy-root')))] ;; ==== Check (t/is (= (:touched copy-root') nil)) @@ -164,14 +165,14 @@ :main2-root :main2-nested-head :copy2-root - :root2-params {:fills (thf/sample-fills-color + :root2-params {:fills (ths/sample-fills-color :fill-color "#abcdef")})) page (thf/current-page file) - copy2-root (thf/get-shape file :copy2-root) + copy2-root (ths/get-shape file :copy2-root) ;; ==== Action update-fn (fn [shape] - (assoc shape :fills (thf/sample-fills-color :fill-color "#fabada"))) + (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) #{(:id copy2-root)} @@ -182,7 +183,7 @@ file' (thf/apply-changes file changes) ;; ==== Get - copy2-root' (thf/get-shape file' :copy2-root) + copy2-root' (ths/get-shape file' :copy2-root) fills' (:fills copy2-root') fill' (first fills')] @@ -202,14 +203,14 @@ :main2-root :main2-nested-head :copy2-root - :nested-head-params {:fills (thf/sample-fills-color + :nested-head-params {:fills (ths/sample-fills-color :fill-color "#abcdef")})) page (thf/current-page file) - copy2-root (thf/get-shape file :copy2-root) + copy2-root (ths/get-shape file :copy2-root) ;; ==== Action update-fn (fn [shape] - (assoc shape :fills (thf/sample-fills-color :fill-color "#fabada"))) + (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) (:shapes copy2-root) @@ -220,8 +221,8 @@ file' (thf/apply-changes file changes) ;; ==== Get - copy2-root' (thf/get-shape file' :copy2-root) - copy2-child' (thf/get-shape-by-id file' (first (:shapes copy2-root'))) + copy2-root' (ths/get-shape file' :copy2-root) + copy2-child' (ths/get-shape-by-id file' (first (:shapes copy2-root'))) fills' (:fills copy2-child') fill' (first fills')] diff --git a/common/test/common_tests/logic/swap_and_reset_test.cljc b/common/test/common_tests/logic/swap_and_reset_test.cljc index ba9746c3a..40d3c7ef8 100644 --- a/common/test/common_tests/logic/swap_and_reset_test.cljc +++ b/common/test/common_tests/logic/swap_and_reset_test.cljc @@ -11,9 +11,11 @@ [app.common.types.component :as ctk] [app.common.types.file :as ctf] [clojure.test :as t] - [common-tests.helpers.compositions :as thc] + [common-tests.helpers.components :as thc] + [common-tests.helpers.compositions :as tho] [common-tests.helpers.files :as thf] - [common-tests.helpers.ids-map :as thi])) + [common-tests.helpers.ids-map :as thi] + [common-tests.helpers.shapes :as ths])) (t/use-fixtures :each thi/test-fixture) @@ -21,16 +23,16 @@ (t/deftest test-simple-swap (let [;; ==== Setup file (-> (thf/sample-file :file1) - (thc/add-simple-component-with-copy :component-1 + (tho/add-simple-component-with-copy :component-1 :component-1-main-root :component-1-main-child :component-1-copy-root) - (thc/add-simple-component :component-2 + (tho/add-simple-component :component-2 :component-2-root :component-2-child)) - component-1-copy-root (thf/get-shape file :component-1-copy-root) - component-2 (thf/get-component file :component-2) + component-1-copy-root (ths/get-shape file :component-1-copy-root) + component-2 (thc/get-component file :component-2) page (thf/current-page file) ;; ==== Action @@ -49,7 +51,7 @@ file' (thf/apply-changes file changes) ;; ==== Get - swapped (thf/get-shape-by-id file' (:id new-shape))] + swapped (ths/get-shape-by-id file' (:id new-shape))] ;; ==== Check (t/is (not= (:component-id component-1-copy-root) (:component-id swapped))) @@ -60,22 +62,22 @@ (let [;; ==== Setup file (-> (thf/sample-file :file1) - (thc/add-simple-component :component-1 :component-1-main-root :component-1-main-child) - (thc/add-frame :component-container) - (thf/instantiate-component :component-1 :component-1-copy-root :parent-label :component-container) - (thf/make-component :component-container-main :component-container) - (thf/instantiate-component :component-container-main :component-container-instance) - (thc/add-simple-component :component-2 :component-2-main-root :component-2-main-child)) + (tho/add-simple-component :component-1 :component-1-main-root :component-1-main-child) + (tho/add-frame :component-container) + (thc/instantiate-component :component-1 :component-1-copy-root :parent-label :component-container) + (thc/make-component :component-container-main :component-container) + (thc/instantiate-component :component-container-main :component-container-instance) + (tho/add-simple-component :component-2 :component-2-main-root :component-2-main-child)) page (thf/current-page file) - component-2 (thf/get-component file :component-2) + component-2 (thc/get-component file :component-2) copy (->> - (thf/get-shape file :component-container-instance) + (ths/get-shape file :component-container-instance) :shapes first - (thf/get-shape-by-id file)) + (ths/get-shape-by-id file)) libraries {(:id file) file} @@ -97,8 +99,8 @@ page' (thf/current-page file') ;; ==== Get - swapped (thf/get-shape-by-id file' (:id new-shape)) - component-1-copy-root (thf/get-shape file' :component-1-copy-root) + swapped (ths/get-shape-by-id file' (:id new-shape)) + component-1-copy-root (ths/get-shape file' :component-1-copy-root) slot (-> (ctf/find-swap-slot swapped page' file' @@ -116,23 +118,23 @@ (let [;; ==== Setup file (-> (thf/sample-file :file1) - (thc/add-simple-component :component-1 :component-1-main-root :component-1-main-child) - (thc/add-frame :component-container) - (thf/instantiate-component :component-1 :component-1-copy-root :parent-label :component-container) - (thf/make-component :component-container-main :component-container) - (thf/instantiate-component :component-container-main :component-container-instance) - (thc/add-simple-component :component-2 :component-2-main-root :component-2-main-child)) + (tho/add-simple-component :component-1 :component-1-main-root :component-1-main-child) + (tho/add-frame :component-container) + (thc/instantiate-component :component-1 :component-1-copy-root :parent-label :component-container) + (thc/make-component :component-container-main :component-container) + (thc/instantiate-component :component-container-main :component-container-instance) + (tho/add-simple-component :component-2 :component-2-main-root :component-2-main-child)) page (thf/current-page file) - component-1 (thf/get-component file :component-1) - component-2 (thf/get-component file :component-2) + component-1 (thc/get-component file :component-1) + component-2 (thc/get-component file :component-2) copy (->> - (thf/get-shape file :component-container-instance) + (ths/get-shape file :component-container-instance) :shapes first - (thf/get-shape-by-id file)) + (ths/get-shape-by-id file)) ;; ==== Action [new-shape _all-parents changes-swap] @@ -163,10 +165,10 @@ ;; ==== Get reset (->> - (thf/get-shape file' :component-container-instance) + (ths/get-shape file' :component-container-instance) :shapes first - (thf/get-shape-by-id file'))] + (ths/get-shape-by-id file'))] ;; ==== Check (t/is (= (:id component-1) (:component-id reset))) diff --git a/common/test/common_tests/types/types_libraries_test.cljc b/common/test/common_tests/types/types_libraries_test.cljc index d95232824..744a39518 100644 --- a/common/test/common_tests/types/types_libraries_test.cljc +++ b/common/test/common_tests/types/types_libraries_test.cljc @@ -15,9 +15,11 @@ [app.common.types.pages-list :as ctpl] [app.common.types.typographies-list :as ctyl] [clojure.test :as t] + [common-tests.helpers.components :as thc] [common-tests.helpers.compositions :as tho] [common-tests.helpers.files :as thf] - [common-tests.helpers.ids-map :as thi])) + [common-tests.helpers.ids-map :as thi] + [common-tests.helpers.shapes :as ths])) (t/use-fixtures :each thi/test-fixture) @@ -27,14 +29,14 @@ f3 (thf/sample-file :file3 :name "testing file") f4 (-> (thf/sample-file :file4 :page-label :page2) (thf/add-sample-page :page3 :name "testing page") - (thf/add-sample-shape :shape1)) + (ths/add-sample-shape :shape1)) f5 (-> f4 - (thf/add-sample-shape :shape2) + (ths/add-sample-shape :shape2) (thf/switch-to-page :page2) - (thf/add-sample-shape :shape3 :name "testing shape" :width 100)) - s1 (thf/get-shape f4 :shape1) - s2 (thf/get-shape f5 :shape2 :page-label :page3) - s3 (thf/get-shape f5 :shape3)] + (ths/add-sample-shape :shape3 :name "testing shape" :width 100)) + s1 (ths/get-shape f4 :shape1) + s2 (ths/get-shape f5 :shape2 :page-label :page3) + s3 (ths/get-shape f5 :shape3)] ;; (thf/pprint-file f4) @@ -75,7 +77,7 @@ (tho/add-simple-component :component1 :main-root :rect1)) file (-> (thf/sample-file :file) - (thf/instantiate-component :component1 :copy-root :library library)) + (thc/instantiate-component :component1 :copy-root :library library)) ;; Action file' (ctf/update-file-data @@ -89,7 +91,7 @@ components' (ctkl/components-seq (ctf/file-data file')) component' (first components') - copy-root' (thf/get-shape file' :copy-root) + copy-root' (ths/get-shape file' :copy-root) main-root' (ctf/get-ref-shape (ctf/file-data file') component' copy-root')] ;; Check @@ -106,11 +108,11 @@ (t/deftest test-absorb-colors (let [;; Setup library (-> (thf/sample-file :library :is-shared true) - (thf/add-sample-library-color :color1 {:name "Test color" + (ths/add-sample-library-color :color1 {:name "Test color" :color "#abcdef"})) file (-> (thf/sample-file :file) - (thf/add-sample-shape :shape1 + (ths/add-sample-shape :shape1 :type :rect :name "Rect1" :fills [{:fill-color "#abcdef" @@ -127,7 +129,7 @@ ;; Get colors' (ctcl/colors-seq (ctf/file-data file')) - shape1' (thf/get-shape file' :shape1) + shape1' (ths/get-shape file' :shape1) fill' (first (:fills shape1'))] ;; Check @@ -143,10 +145,10 @@ (t/deftest test-absorb-typographies (let [;; Setup library (-> (thf/sample-file :library :is-shared true) - (thf/add-sample-typography :typography1 {:name "Test typography"})) + (ths/add-sample-typography :typography1 {:name "Test typography"})) file (-> (thf/sample-file :file) - (thf/add-sample-shape :shape1 + (ths/add-sample-shape :shape1 :type :text :name "Text1" :content {:type "root" @@ -178,7 +180,7 @@ ;; Get typographies' (ctyl/typographies-seq (ctf/file-data file')) - shape1' (thf/get-shape file' :shape1) + shape1' (ths/get-shape file' :shape1) text-node' (d/seek #(some? (:text %)) (txt/node-seq (:content shape1')))] ;; Check -- Gitee From 86e524638cedd5f36afc34ef69304ceafd2419d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Tue, 7 May 2024 15:51:56 +0200 Subject: [PATCH 0510/1266] :fire: Do a small cleanup --- .../files/libraries_common_helpers.cljc | 103 ------------------ common/src/app/common/logic/libraries.cljc | 2 +- 2 files changed, 1 insertion(+), 104 deletions(-) delete mode 100644 common/src/app/common/files/libraries_common_helpers.cljc diff --git a/common/src/app/common/files/libraries_common_helpers.cljc b/common/src/app/common/files/libraries_common_helpers.cljc deleted file mode 100644 index e7df2d8f3..000000000 --- a/common/src/app/common/files/libraries_common_helpers.cljc +++ /dev/null @@ -1,103 +0,0 @@ -;; This Source Code Form is subject to the terms of the Mozilla Public -;; License, v. 2.0. If a copy of the MPL was not distributed with this -;; file, You can obtain one at http://mozilla.org/MPL/2.0/. -;; -;; Copyright (c) KALEIDOS INC - -(ns app.common.files.libraries-common-helpers - (:require - [app.common.data :as d] - [app.common.files.changes-builder :as pcb] - [app.common.files.helpers :as cfh] - [app.common.types.component :as ctk] - [app.common.types.container :as ctn] - [app.common.uuid :as uuid])) - -(defn generate-add-component-changes - [changes root objects file-id page-id components-v2] - (let [name (:name root) - [path name] (cfh/parse-path-name name) - - [root-shape new-shapes updated-shapes] - (if-not components-v2 - (ctn/make-component-shape root objects file-id components-v2) - (ctn/convert-shape-in-component root objects file-id)) - - changes (-> changes - (pcb/add-component (:id root-shape) - path - name - new-shapes - updated-shapes - (:id root) - page-id))] - [root-shape changes])) - -(defn generate-add-component - "If there is exactly one id, and it's a frame (or a group in v1), and not already a component, - use it as root. Otherwise, create a frame (v2) or group (v1) that contains all ids. Then, make a - component with it, and link all shapes to their corresponding one in the component." - [it shapes objects page-id file-id components-v2 prepare-create-group prepare-create-board] - - (let [changes (pcb/empty-changes it page-id) - shapes-count (count shapes) - first-shape (first shapes) - - from-singe-frame? - (and (= 1 shapes-count) - (cfh/frame-shape? first-shape)) - - [root changes old-root-ids] - (if (and (= shapes-count 1) - (or (and (cfh/group-shape? first-shape) - (not components-v2)) - (cfh/frame-shape? first-shape)) - (not (ctk/instance-head? first-shape))) - [first-shape - (-> (pcb/empty-changes it page-id) - (pcb/with-objects objects)) - (:shapes first-shape)] - - (let [root-name (if (= 1 shapes-count) - (:name first-shape) - "Component 1") - - shape-ids (into (d/ordered-set) (map :id) shapes) - - [root changes] - (if-not components-v2 - (prepare-create-group it ; These functions needs to be passed as argument - objects ; to avoid a circular dependence - page-id - shapes - root-name - (not (ctk/instance-head? first-shape))) - (prepare-create-board changes - (uuid/next) - (:parent-id first-shape) - objects - shape-ids - nil - root-name - true))] - - [root changes shape-ids])) - - changes - (cond-> changes - (not from-singe-frame?) - (pcb/update-shapes - (:shapes root) - (fn [shape] - (assoc shape :constraints-h :scale :constraints-v :scale)))) - - objects' (assoc objects (:id root) root) - - [root-shape changes] (generate-add-component-changes changes root objects' file-id page-id components-v2) - - changes (pcb/update-shapes changes - old-root-ids - #(dissoc % :component-root) - [:component-root])] - - [root (:id root-shape) changes])) diff --git a/common/src/app/common/logic/libraries.cljc b/common/src/app/common/logic/libraries.cljc index 458bcb2ec..0caf60d36 100644 --- a/common/src/app/common/logic/libraries.cljc +++ b/common/src/app/common/logic/libraries.cljc @@ -1697,7 +1697,7 @@ (assoc change :page-id (:id container)) (assoc change :component-id (:id container)))) -(defn generate-add-component-changes +(defn- generate-add-component-changes [changes root objects file-id page-id components-v2] (let [name (:name root) [path name] (cfh/parse-path-name name) -- Gitee From b4ea749388f51457ea4ff4844ee3d6d7e1e08156 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Tue, 7 May 2024 16:00:32 +0200 Subject: [PATCH 0511/1266] :bug: Fix linter error --- common/src/app/common/logic/libraries.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/app/common/logic/libraries.cljc b/common/src/app/common/logic/libraries.cljc index 0caf60d36..458bcb2ec 100644 --- a/common/src/app/common/logic/libraries.cljc +++ b/common/src/app/common/logic/libraries.cljc @@ -1697,7 +1697,7 @@ (assoc change :page-id (:id container)) (assoc change :component-id (:id container)))) -(defn- generate-add-component-changes +(defn generate-add-component-changes [changes root objects file-id page-id components-v2] (let [name (:name root) [path name] (cfh/parse-path-name name) -- Gitee From 0091ac0f5f26971304567b134b5bd8907d1f1165 Mon Sep 17 00:00:00 2001 From: AzazelN28 Date: Tue, 7 May 2024 13:12:58 +0200 Subject: [PATCH 0512/1266] :recycle: Refactor tests and pages --- .../workspace/get-comment-threads-empty.json | 0 .../workspace/get-file-blank.json | 0 .../workspace/get-file-fragment-blank.json | 0 .../workspace/get-file-libraries-empty.json | 0 .../get-file-object-thumbnails-blank.json | 0 .../workspace/get-font-variants-empty.json | 0 .../get-profile-for-file-comments.json | 0 .../workspace/get-project-default.json | 0 .../workspace/get-team-default.json | 0 .../workspace/ws-notifications.js | 0 frontend/playwright/fixtures/login-fixture.js | 10 ++++ frontend/playwright/helpers/MockAPI.js | 17 ------ ...ockWebSocket.js => MockWebSocketHelper.js} | 14 +++-- frontend/playwright/helpers/intercepts.js | 8 --- frontend/playwright/login.spec.js | 57 ------------------ frontend/playwright/scripts/MockWebSocket.js | 5 -- frontend/playwright/ui/pages/BasePage.js | 38 ++++++++++++ .../playwright/ui/pages/BaseWebSocketPage.js | 32 ++++++++++ .../ui/pages/{login-page.js => LoginPage.js} | 58 ++++++------------- frontend/playwright/ui/specs/login.spec.js | 13 ++--- .../{ => ui/specs}/workspace.spec.js | 56 ++++++------------ .../main/data/workspace/notifications.cljs | 1 - 22 files changed, 128 insertions(+), 181 deletions(-) rename frontend/playwright/{fixtures => data}/workspace/get-comment-threads-empty.json (100%) rename frontend/playwright/{fixtures => data}/workspace/get-file-blank.json (100%) rename frontend/playwright/{fixtures => data}/workspace/get-file-fragment-blank.json (100%) rename frontend/playwright/{fixtures => data}/workspace/get-file-libraries-empty.json (100%) rename frontend/playwright/{fixtures => data}/workspace/get-file-object-thumbnails-blank.json (100%) rename frontend/playwright/{fixtures => data}/workspace/get-font-variants-empty.json (100%) rename frontend/playwright/{fixtures => data}/workspace/get-profile-for-file-comments.json (100%) rename frontend/playwright/{fixtures => data}/workspace/get-project-default.json (100%) rename frontend/playwright/{fixtures => data}/workspace/get-team-default.json (100%) rename frontend/playwright/{fixtures => data}/workspace/ws-notifications.js (100%) create mode 100644 frontend/playwright/fixtures/login-fixture.js delete mode 100644 frontend/playwright/helpers/MockAPI.js rename frontend/playwright/helpers/{MockWebSocket.js => MockWebSocketHelper.js} (85%) delete mode 100644 frontend/playwright/helpers/intercepts.js delete mode 100644 frontend/playwright/login.spec.js create mode 100644 frontend/playwright/ui/pages/BasePage.js create mode 100644 frontend/playwright/ui/pages/BaseWebSocketPage.js rename frontend/playwright/ui/pages/{login-page.js => LoginPage.js} (42%) rename frontend/playwright/{ => ui/specs}/workspace.spec.js (42%) diff --git a/frontend/playwright/fixtures/workspace/get-comment-threads-empty.json b/frontend/playwright/data/workspace/get-comment-threads-empty.json similarity index 100% rename from frontend/playwright/fixtures/workspace/get-comment-threads-empty.json rename to frontend/playwright/data/workspace/get-comment-threads-empty.json diff --git a/frontend/playwright/fixtures/workspace/get-file-blank.json b/frontend/playwright/data/workspace/get-file-blank.json similarity index 100% rename from frontend/playwright/fixtures/workspace/get-file-blank.json rename to frontend/playwright/data/workspace/get-file-blank.json diff --git a/frontend/playwright/fixtures/workspace/get-file-fragment-blank.json b/frontend/playwright/data/workspace/get-file-fragment-blank.json similarity index 100% rename from frontend/playwright/fixtures/workspace/get-file-fragment-blank.json rename to frontend/playwright/data/workspace/get-file-fragment-blank.json diff --git a/frontend/playwright/fixtures/workspace/get-file-libraries-empty.json b/frontend/playwright/data/workspace/get-file-libraries-empty.json similarity index 100% rename from frontend/playwright/fixtures/workspace/get-file-libraries-empty.json rename to frontend/playwright/data/workspace/get-file-libraries-empty.json diff --git a/frontend/playwright/fixtures/workspace/get-file-object-thumbnails-blank.json b/frontend/playwright/data/workspace/get-file-object-thumbnails-blank.json similarity index 100% rename from frontend/playwright/fixtures/workspace/get-file-object-thumbnails-blank.json rename to frontend/playwright/data/workspace/get-file-object-thumbnails-blank.json diff --git a/frontend/playwright/fixtures/workspace/get-font-variants-empty.json b/frontend/playwright/data/workspace/get-font-variants-empty.json similarity index 100% rename from frontend/playwright/fixtures/workspace/get-font-variants-empty.json rename to frontend/playwright/data/workspace/get-font-variants-empty.json diff --git a/frontend/playwright/fixtures/workspace/get-profile-for-file-comments.json b/frontend/playwright/data/workspace/get-profile-for-file-comments.json similarity index 100% rename from frontend/playwright/fixtures/workspace/get-profile-for-file-comments.json rename to frontend/playwright/data/workspace/get-profile-for-file-comments.json diff --git a/frontend/playwright/fixtures/workspace/get-project-default.json b/frontend/playwright/data/workspace/get-project-default.json similarity index 100% rename from frontend/playwright/fixtures/workspace/get-project-default.json rename to frontend/playwright/data/workspace/get-project-default.json diff --git a/frontend/playwright/fixtures/workspace/get-team-default.json b/frontend/playwright/data/workspace/get-team-default.json similarity index 100% rename from frontend/playwright/fixtures/workspace/get-team-default.json rename to frontend/playwright/data/workspace/get-team-default.json diff --git a/frontend/playwright/fixtures/workspace/ws-notifications.js b/frontend/playwright/data/workspace/ws-notifications.js similarity index 100% rename from frontend/playwright/fixtures/workspace/ws-notifications.js rename to frontend/playwright/data/workspace/ws-notifications.js diff --git a/frontend/playwright/fixtures/login-fixture.js b/frontend/playwright/fixtures/login-fixture.js new file mode 100644 index 000000000..866453793 --- /dev/null +++ b/frontend/playwright/fixtures/login-fixture.js @@ -0,0 +1,10 @@ +import { test as base } from '@playwright/test' + +export const test = base.extend({ + loginPage: async ({ page }, use) => { + const loginPage = new LoginPage(page) + await use(loginPage) + } +}) + +export { expect } from '@playwright/test' diff --git a/frontend/playwright/helpers/MockAPI.js b/frontend/playwright/helpers/MockAPI.js deleted file mode 100644 index 8a5e970c4..000000000 --- a/frontend/playwright/helpers/MockAPI.js +++ /dev/null @@ -1,17 +0,0 @@ -export const interceptRPC = (page, path, jsonFilename) => - page.route(`**/api/rpc/command/${path}`, (route) => - route.fulfill({ - status: 200, - contentType: "application/transit+json", - path: `playwright/fixtures/${jsonFilename}`, - }), - ); - -export const interceptRPCByRegex = (page, regex, jsonFilename) => - page.route(regex, (route) => - route.fulfill({ - status: 200, - contentType: "application/transit+json", - path: `playwright/fixtures/${jsonFilename}`, - }), - ); diff --git a/frontend/playwright/helpers/MockWebSocket.js b/frontend/playwright/helpers/MockWebSocketHelper.js similarity index 85% rename from frontend/playwright/helpers/MockWebSocket.js rename to frontend/playwright/helpers/MockWebSocketHelper.js index 1a6c8eb81..3f0f845d2 100644 --- a/frontend/playwright/helpers/MockWebSocket.js +++ b/frontend/playwright/helpers/MockWebSocketHelper.js @@ -1,18 +1,21 @@ -export class MockWebSocket extends EventTarget { +export class MockWebSocketHelper extends EventTarget { static #mocks = new Map(); static async init(page) { await page.exposeFunction("MockWebSocket$$constructor", (url, protocols) => { - console.log("MockWebSocket$$constructor", MockWebSocket, url, protocols); - const webSocket = new MockWebSocket(page, url, protocols); + const webSocket = new MockWebSocketHelper(page, url, protocols); this.#mocks.set(url, webSocket); }); await page.exposeFunction("MockWebSocket$$spyMessage", (url, data) => { - console.log("MockWebSocket$$spyMessage", url, data); + if (!this.#mocks.has(url)) { + throw new Error(`WebSocket with URL ${url} not found`); + } this.#mocks.get(url).dispatchEvent(new MessageEvent("message", { data })); }); await page.exposeFunction("MockWebSocket$$spyClose", (url, code, reason) => { - console.log("MockWebSocket$$spyClose", url, code, reason); + if (!this.#mocks.has(url)) { + throw new Error(`WebSocket with URL ${url} not found`); + } this.#mocks.get(url).dispatchEvent(new CloseEvent("close", { code, reason })); }); await page.addInitScript({ path: "playwright/scripts/MockWebSocket.js" }); @@ -22,7 +25,6 @@ export class MockWebSocket extends EventTarget { return new Promise((resolve) => { const intervalID = setInterval(() => { for (const [wsURL, ws] of this.#mocks) { - console.log('waitForURL', wsURL); if (wsURL.includes(url)) { clearInterval(intervalID); return resolve(ws); diff --git a/frontend/playwright/helpers/intercepts.js b/frontend/playwright/helpers/intercepts.js deleted file mode 100644 index ecb46b817..000000000 --- a/frontend/playwright/helpers/intercepts.js +++ /dev/null @@ -1,8 +0,0 @@ -import { interceptRPC } from "./index"; - - -export const setupNotLogedIn = async (page) => { - await interceptRPC(page, "get-profile", "get-profile-anonymous.json"); - -}; - diff --git a/frontend/playwright/login.spec.js b/frontend/playwright/login.spec.js deleted file mode 100644 index cade62385..000000000 --- a/frontend/playwright/login.spec.js +++ /dev/null @@ -1,57 +0,0 @@ -import { test, expect } from "@playwright/test"; -import { interceptRPC } from "./helpers/MockAPI"; - -const setupLoggedOutUser = async (page) => { - await interceptRPC(page, "get-profile", "get-profile-anonymous.json"); - await interceptRPC(page, "login-with-password", "logged-in-user/login-with-password-success.json"); -}; - -// TODO: maybe Playwright's fixtures are the right way to do this? -const setupDashboardUser = async (page) => { - await interceptRPC(page, "get-profile", "logged-in-user/get-profile-logged-in.json"); - await interceptRPC(page, "get-teams", "logged-in-user/get-teams-default.json"); - await interceptRPC(page, "get-font-variants?team-id=*", "logged-in-user/get-font-variants-empty.json"); - await interceptRPC(page, "get-projects?team-id=*", "logged-in-user/get-projects-default.json"); - await interceptRPC(page, "get-team-members?team-id=*", "logged-in-user/get-team-members-your-penpot.json"); - await interceptRPC(page, "get-team-users?team-id=*", "logged-in-user/get-team-users-single-user.json"); - await interceptRPC( - page, - "get-unread-comment-threads?team-id=*", - "logged-in-user/get-team-users-single-user.json", - ); - await interceptRPC( - page, - "get-team-recent-files?team-id=*", - "logged-in-user/get-team-recent-files-empty.json", - ); - await interceptRPC( - page, - "get-profiles-for-file-comments", - "logged-in-user/get-profiles-for-file-comments-empty.json", - ); - await interceptRPC(page, "get-builtin-templates", "logged-in-user/get-builtin-templates-empty.json"); -}; - -test("Shows login page when going to index and user is logged out", async ({ page }) => { - await setupLoggedOutUser(page); - - await page.goto("/"); - - await expect(page).toHaveURL(/auth\/login$/); - await expect(page.getByText("Log into my account")).toBeVisible(); -}); - -test("User logs in by filling the login form", async ({ page }) => { - await setupLoggedOutUser(page); - - await page.goto("/#/auth/login"); - - await setupDashboardUser(page); - - await page.getByLabel("Email").fill("foo@example.com"); - await page.getByLabel("Password").fill("loremipsum"); - - await page.getByRole("button", { name: "Login" }).click(); - - await expect(page).toHaveURL(/dashboard/); -}); diff --git a/frontend/playwright/scripts/MockWebSocket.js b/frontend/playwright/scripts/MockWebSocket.js index 60723eb29..b7f5e4e30 100644 --- a/frontend/playwright/scripts/MockWebSocket.js +++ b/frontend/playwright/scripts/MockWebSocket.js @@ -39,7 +39,6 @@ window.WebSocket = class MockWebSocket extends EventTarget { #spyClose = null; constructor(url, protocols) { - console.log("🤖 New websocket at", url); super(); this.#url = url; @@ -166,7 +165,6 @@ window.WebSocket = class MockWebSocket extends EventTarget { } mockOpen(options) { - console.log("🤖 open mock"); this.#protocol = options?.protocol || ""; this.#extensions = options?.extensions || ""; this.#readyState = MockWebSocket.OPEN; @@ -181,12 +179,9 @@ window.WebSocket = class MockWebSocket extends EventTarget { } mockMessage(data) { - console.log("🤯 mock message"); if (this.#readyState !== MockWebSocket.OPEN) { - console.log("socket is not connected"); throw new Error("MockWebSocket is not connected"); } - console.log("😰 dispatching `message`", { data }); this.dispatchEvent(new MessageEvent("message", { data })); return this; } diff --git a/frontend/playwright/ui/pages/BasePage.js b/frontend/playwright/ui/pages/BasePage.js new file mode 100644 index 000000000..e0e62a0a1 --- /dev/null +++ b/frontend/playwright/ui/pages/BasePage.js @@ -0,0 +1,38 @@ +export class BasePage { + static async mockRPC(page, path, jsonFilename, options) { + if (!page) { + throw new TypeError("Invalid page argument. Must be a Playwright page."); + } + if (typeof path !== "string" && !(path instanceof RegExp)) { + throw new TypeError("Invalid path argument. Must be a string or a RegExp."); + } + const url = typeof path === "string" ? `**/api/rpc/command/${path}` : path; + const interceptConfig = { + status: 200, + contentType: "application/transit+json", + ...options, + }; + return page.route(url, (route) => + route.fulfill({ + ...interceptConfig, + path: `playwright/data/${jsonFilename}`, + }), + ); + } + + #page = null; + + constructor(page) { + this.#page = page; + } + + get page() { + return this.#page; + } + + async mockRPC(path, jsonFilename, options) { + return BasePage.mockRPC(this.page, path, jsonFilename, options); + } +} + +export default BasePage; diff --git a/frontend/playwright/ui/pages/BaseWebSocketPage.js b/frontend/playwright/ui/pages/BaseWebSocketPage.js new file mode 100644 index 000000000..f76a7f5c4 --- /dev/null +++ b/frontend/playwright/ui/pages/BaseWebSocketPage.js @@ -0,0 +1,32 @@ +import { MockWebSocketHelper } from "../../helpers/MockWebSocketHelper"; +import BasePage from "./BasePage"; + +export class BaseWebSocketPage extends BasePage { + /** + * This should be called on `test.beforeEach`. + * + * @param {Page} page + * @returns + */ + static setupWebSockets(page) { + return MockWebSocketHelper.init(page); + } + + /** + * Returns a promise that resolves when a WebSocket with the given URL is created. + * + * @param {string} url + * @returns {Promise} + */ + async waitForWebSocket(url) { + return MockWebSocketHelper.waitForURL(url); + } + + /** + * + * @returns {Promise} + */ + async waitForNotificationsWebSocket() { + return this.waitForWebSocket("ws://0.0.0.0:3500/ws/notifications"); + } +} diff --git a/frontend/playwright/ui/pages/login-page.js b/frontend/playwright/ui/pages/LoginPage.js similarity index 42% rename from frontend/playwright/ui/pages/login-page.js rename to frontend/playwright/ui/pages/LoginPage.js index 1358f4ab3..e0acf8b12 100644 --- a/frontend/playwright/ui/pages/login-page.js +++ b/frontend/playwright/ui/pages/LoginPage.js @@ -1,8 +1,12 @@ -import { interceptRPC } from "../../helpers/index"; +import { BasePage } from "./BasePage"; + +export class LoginPage extends BasePage { + static setupLoggedOutUser(page) { + return this.mockRPC(page, "get-profile", "get-profile-anonymous.json"); + } -class LoginPage { constructor(page) { - this.page = page; + super(page); this.loginButton = page.getByRole("button", { name: "Login" }); this.password = page.getByLabel("Password"); this.userName = page.getByLabel("Email"); @@ -11,14 +15,6 @@ class LoginPage { this.initialHeading = page.getByRole("heading", { name: "Log into my account" }); } - url() { - return this.page.url(); - } - - context() { - return this.page.context(); - } - async fillEmailAndPasswordInputs(email, password) { await this.userName.fill(email); await this.password.fill(password); @@ -29,47 +25,29 @@ class LoginPage { } async setupAllowedUser() { - await interceptRPC(this.page, "get-profile", "logged-in-user/get-profile-logged-in.json"); - await interceptRPC(this.page, "get-teams", "logged-in-user/get-teams-default.json"); - await interceptRPC( - this.page, - "get-font-variants?team-id=*", - "logged-in-user/get-font-variants-empty.json", - ); - await interceptRPC(this.page, "get-projects?team-id=*", "logged-in-user/get-projects-default.json"); - await interceptRPC( - this.page, - "get-team-members?team-id=*", - "logged-in-user/get-team-members-your-penpot.json", - ); - await interceptRPC( - this.page, - "get-team-users?team-id=*", - "logged-in-user/get-team-users-single-user.json", - ); - await interceptRPC( - this.page, + await this.mockRPC("get-profile", "logged-in-user/get-profile-logged-in.json"); + await this.mockRPC("get-teams", "logged-in-user/get-teams-default.json"); + await this.mockRPC("get-font-variants?team-id=*", "logged-in-user/get-font-variants-empty.json"); + await this.mockRPC("get-projects?team-id=*", "logged-in-user/get-projects-default.json"); + await this.mockRPC("get-team-members?team-id=*", "logged-in-user/get-team-members-your-penpot.json"); + await this.mockRPC("get-team-users?team-id=*", "logged-in-user/get-team-users-single-user.json"); + await this.mockRPC( "get-unread-comment-threads?team-id=*", "logged-in-user/get-team-users-single-user.json", ); - await interceptRPC( - this.page, - "get-team-recent-files?team-id=*", - "logged-in-user/get-team-recent-files-empty.json", - ); - await interceptRPC( - this.page, + await this.mockRPC("get-team-recent-files?team-id=*", "logged-in-user/get-team-recent-files-empty.json"); + await this.mockRPC( "get-profiles-for-file-comments", "logged-in-user/get-profiles-for-file-comments-empty.json", ); } async setupLoginSuccess() { - await interceptRPC(this.page, "login-with-password", "logged-in-user/login-with-password-success.json"); + await this.mockRPC("login-with-password", "logged-in-user/login-with-password-success.json"); } async setupLoginError() { - await interceptRPC(this.page, "login-with-password", "login-with-password-error.json", { status: 400 }); + await this.mockRPC("login-with-password", "login-with-password-error.json", { status: 400 }); } } diff --git a/frontend/playwright/ui/specs/login.spec.js b/frontend/playwright/ui/specs/login.spec.js index 08d3753c4..dab5a5ca6 100644 --- a/frontend/playwright/ui/specs/login.spec.js +++ b/frontend/playwright/ui/specs/login.spec.js @@ -1,10 +1,8 @@ import { test, expect } from "@playwright/test"; -import { setupNotLogedIn } from "../../helpers/intercepts"; - -import LoginPage from "../pages/login-page"; +import { LoginPage } from "../pages/LoginPage"; test.beforeEach(async ({ page }) => { - await setupNotLogedIn(page); + await LoginPage.setupLoggedOutUser(page); await page.goto("/#/auth/login"); }); @@ -13,7 +11,7 @@ test("Shows login page when going to index and user is logged out", async ({ pag await loginPage.setupAllowedUser(); - await expect(loginPage.url()).toMatch(/auth\/login$/); + await expect(loginPage.page).toHaveURL(/auth\/login$/); await expect(loginPage.initialHeading).toBeVisible(); }); @@ -37,8 +35,7 @@ test("User logs in by filling the login form", async ({ page }) => { await loginPage.clickLoginButton(); await page.waitForURL('**/dashboard/**'); - await expect(page).toHaveURL(/dashboard/); - // await expect(loginPage.url()).toMatch(/dashboard/); + await expect(loginPage.page).toHaveURL(/dashboard/); }); test("User submits wrong credentials", async ({ page }) => { @@ -50,5 +47,5 @@ test("User submits wrong credentials", async ({ page }) => { await loginPage.clickLoginButton(); await expect(loginPage.message).toBeVisible(); - await expect(loginPage.url()).toMatch(/auth\/login$/); + await expect(loginPage.page).toHaveURL(/auth\/login$/); }); diff --git a/frontend/playwright/workspace.spec.js b/frontend/playwright/ui/specs/workspace.spec.js similarity index 42% rename from frontend/playwright/workspace.spec.js rename to frontend/playwright/ui/specs/workspace.spec.js index 07e8762ca..3f24e2d28 100644 --- a/frontend/playwright/workspace.spec.js +++ b/frontend/playwright/ui/specs/workspace.spec.js @@ -1,36 +1,36 @@ import { test, expect } from "@playwright/test"; -import { interceptRPC, interceptRPCByRegex } from "./helpers/MockAPI"; -import { MockWebSocket } from "./helpers/MockWebSocket"; -import { presenceFixture } from "./fixtures/workspace/ws-notifications"; +import { BasePage } from "../pages/BasePage"; +import { MockWebSocketHelper } from "../../helpers/MockWebSocketHelper"; +import { presenceFixture } from "../../data/workspace/ws-notifications"; const anyProjectId = "c7ce0794-0992-8105-8004-38e630f7920b"; const anyFileId = "c7ce0794-0992-8105-8004-38f280443849"; const anyPageId = "c7ce0794-0992-8105-8004-38f28044384a"; const setupWorkspaceUser = (page) => { - interceptRPC(page, "get-profile", "logged-in-user/get-profile-logged-in.json"); - interceptRPC(page, "get-team-users?file-id=*", "logged-in-user/get-team-users-single-user.json"); - interceptRPC(page, "get-comment-threads?file-id=*", "workspace/get-comment-threads-empty.json"); - interceptRPC(page, "get-project?id=*", "workspace/get-project-default.json"); - interceptRPC(page, "get-team?id=*", "workspace/get-team-default.json"); - interceptRPCByRegex(page, /get\-file\?/, "workspace/get-file-blank.json"); - interceptRPC( + BasePage.mockRPC(page, "get-profile", "logged-in-user/get-profile-logged-in.json"); + BasePage.mockRPC(page, "get-team-users?file-id=*", "logged-in-user/get-team-users-single-user.json"); + BasePage.mockRPC(page, "get-comment-threads?file-id=*", "workspace/get-comment-threads-empty.json"); + BasePage.mockRPC(page, "get-project?id=*", "workspace/get-project-default.json"); + BasePage.mockRPC(page, "get-team?id=*", "workspace/get-team-default.json"); + BasePage.mockRPC(page, /get\-file\?/, "workspace/get-file-blank.json"); + BasePage.mockRPC( page, "get-file-object-thumbnails?file-id=*", "workspace/get-file-object-thumbnails-blank.json", ); - interceptRPC( + BasePage.mockRPC( page, "get-profiles-for-file-comments?file-id=*", "workspace/get-profile-for-file-comments.json", ); - interceptRPC(page, "get-font-variants?team-id=*", "workspace/get-font-variants-empty.json"); - interceptRPC(page, "get-file-fragment?file-id=*", "workspace/get-file-fragment-blank.json"); - interceptRPC(page, "get-file-libraries?file-id=*", "workspace/get-file-libraries-empty.json"); + BasePage.mockRPC(page, "get-font-variants?team-id=*", "workspace/get-font-variants-empty.json"); + BasePage.mockRPC(page, "get-file-fragment?file-id=*", "workspace/get-file-fragment-blank.json"); + BasePage.mockRPC(page, "get-file-libraries?file-id=*", "workspace/get-file-libraries-empty.json"); }; test.beforeEach(async ({ page }) => { - await MockWebSocket.init(page); + await MockWebSocketHelper.init(page); }); test("User loads worskpace with empty file", async ({ page }) => { @@ -41,36 +41,14 @@ test("User loads worskpace with empty file", async ({ page }) => { await expect(page.getByTestId("page-name")).toHaveText("Page 1"); }); -test.only("User receives notifications updates in the workspace", async ({ page }) => { +test("User receives notifications updates in the workspace", async ({ page }) => { await setupWorkspaceUser(page); await page.goto(`/#/workspace/${anyProjectId}/${anyFileId}?page-id=${anyPageId}`); - const ws = await MockWebSocket.waitForURL("ws://0.0.0.0:3500/ws/notifications") + const ws = await MockWebSocketHelper.waitForURL("ws://0.0.0.0:3500/ws/notifications") await ws.mockOpen(); - console.log('JEEEEEE', ws) - await expect(page.getByTestId("page-name")).toHaveText("Page 1"); - await ws.mockMessage(JSON.stringify(presenceFixture)); - - /* - await page.evaluate( - async ({ presenceFixture }) => { - const ws = await WebSocket.waitForURL("ws://0.0.0.0:3500/ws/notifications"); - ws.mockMessage(JSON.stringify(presenceFixture)); - }, - { presenceFixture }, - ); - */ - await expect(page.getByTestId("active-users-list").getByAltText("Princesa Leia")).toHaveCount(2); - await ws.mockClose(); - - /* - await page.evaluate(async () => { - const ws = await WebSocket.waitForURL("ws://0.0.0.0:3500/ws/notifications"); - ws.mockClose(); - }); - */ }); diff --git a/frontend/src/app/main/data/workspace/notifications.cljs b/frontend/src/app/main/data/workspace/notifications.cljs index b721c2485..4bb3a9772 100644 --- a/frontend/src/app/main/data/workspace/notifications.cljs +++ b/frontend/src/app/main/data/workspace/notifications.cljs @@ -162,7 +162,6 @@ (assoc :text-color "#000000"))) (update-presence [presence] - (js/console.log "🥰 WIIIIII" (clj->js presence)) (-> presence (update session-id update-session presence) (d/without-nils)))] -- Gitee From ea6a9c87ec885a7383ca6f1b05235ec5c575e1a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Tue, 7 May 2024 15:16:17 +0200 Subject: [PATCH 0513/1266] :wrench: Enhance debug trace helpers for common tests --- common/test/common_tests/helpers/files.cljc | 95 ++++++++++++------- common/test/common_tests/helpers/ids_map.cljc | 9 +- .../logic/comp_remove_swap_slots_test.cljc | 21 ++-- 3 files changed, 78 insertions(+), 47 deletions(-) diff --git a/common/test/common_tests/helpers/files.cljc b/common/test/common_tests/helpers/files.cljc index 2d893104f..31a887481 100644 --- a/common/test/common_tests/helpers/files.cljc +++ b/common/test/common_tests/helpers/files.cljc @@ -11,6 +11,7 @@ [app.common.files.changes :as cfc] [app.common.files.validate :as cfv] [app.common.pprint :refer [pprint]] + [app.common.types.component :as ctk] [app.common.types.file :as ctf] [app.common.types.page :as ctp] [app.common.types.pages-list :as ctpl] @@ -87,7 +88,7 @@ ;; ----- Debug -(defn dump-file-type +(defn dump-tree "Dump a file using dump-tree function in common.types.file." [file & {:keys [page-label libraries] :as params}] (let [params (-> params @@ -115,44 +116,74 @@ (println "}")) (defn- stringify-keys [m keys] - (apply str (interpose ", " (map #(str % ": " (get m %)) keys)))) + (let [kv (-> (select-keys m keys) + (assoc :swap-slot (when ((set keys) :swap-slot) + (ctk/get-swap-slot m))) + (assoc :swap-slot-label (when ((set keys) :swap-slot-label) + (when-let [slot (ctk/get-swap-slot m)] + (thi/label slot)))) + (d/without-nils)) + + pretty-uuid (fn [id] + (let [id (str id)] + (str "#" (subs id (- (count id) 6))))) + + format-kv (fn [[k v]] + (cond + (uuid? v) + (str k " " (pretty-uuid v)) + + :else + (str k " " v)))] + + (when (seq kv) + (str " [" (apply str (interpose ", " (map format-kv kv))) "]")))) (defn- dump-page-shape - [shape keys padding] + [shape keys padding show-refs?] (println (str/pad (str padding - (when (:main-instance shape) "{") - (or (thi/label (:id shape)) "") - (when (:main-instance shape) "}") - (when keys - (str " [" (stringify-keys shape keys) "]"))) - {:length 40 :type :right}) + (when (and (:main-instance shape) show-refs?) "{") + (thi/label (:id shape)) + (when (and (:main-instance shape) show-refs?) "}") + (when (seq keys) + (stringify-keys shape keys))) + {:length 50 :type :right}) (if (nil? (:shape-ref shape)) - (if (:component-root shape) - (str "# [Component " (or (thi/label (:component-id shape)) "") "]") + (if (and (:component-root shape) show-refs?) + (str "# [Component " (thi/label (:component-id shape)) "]") "") - (str/format "%s--> %s%s" - (cond (:component-root shape) "#" - (:component-id shape) "@" - :else "-") - (if (:component-root shape) - (str "[Component " (or (thi/label (:component-id shape)) "") "] ") - "") - (or (thi/label (:shape-ref shape)) ""))))) + (if show-refs? + (str/format "%s--> %s%s" + (cond (:component-root shape) "#" + (:component-id shape) "@" + :else "-") + (if (:component-root shape) + (str "[Component " (thi/label (:component-id shape)) "] ") + "") + (thi/label (:shape-ref shape))) + "")))) (defn dump-page - "Dump the layer tree of the page. Print the label of each shape, and the specified keys." - ([page keys] - (dump-page page uuid/zero "" keys)) - ([page root-id padding keys] - (let [lookupf (d/getf (:objects page)) - root-shape (lookupf root-id) - shapes (map lookupf (:shapes root-shape))] - (doseq [shape shapes] - (dump-page-shape shape keys padding) - (dump-page page (:id shape) (str padding " ") keys))))) + "Dump the layer tree of the page, showing labels of the shapes. + - keys: a list of attributes of the shapes you want to show. In addition, you + can add :swap-slot to show the slot id (if any) or :swap-slot-label + to show the corresponding label. + - show-refs?: if true, the component references will be shown." + [page & {:keys [keys root-id padding show-refs?] + :or {keys [:name :swap-slot-label] root-id uuid/zero padding "" show-refs? true}}] + (let [lookupf (d/getf (:objects page)) + root-shape (lookupf root-id) + shapes (map lookupf (:shapes root-shape))] + (doseq [shape shapes] + (dump-page-shape shape keys padding show-refs?) + (dump-page page + :keys keys + :root-id (:id shape) + :padding (str padding " ") + :show-refs? show-refs?)))) (defn dump-file "Dump the current page of the file, using dump-page above. - Example: (thf/dump-file file [:id :touched])" - ([file] (dump-file file [])) - ([file keys] (dump-page (current-page file) keys))) + Example: (thf/dump-file file :keys [:name :swap-slot-label] :show-refs? false)" + [file & {:keys [] :as params}] + (dump-page (current-page file) params)) diff --git a/common/test/common_tests/helpers/ids_map.cljc b/common/test/common_tests/helpers/ids_map.cljc index cec7242cf..8eb8536eb 100644 --- a/common/test/common_tests/helpers/ids_map.cljc +++ b/common/test/common_tests/helpers/ids_map.cljc @@ -36,7 +36,8 @@ (f)) (defn label [id] - (->> @idmap - (filter #(= id (val %))) - (map key) - (first))) + (or (->> @idmap + (filter #(= id (val %))) + (map key) + (first)) + (str ""))) diff --git a/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc b/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc index 331ee0e8a..a1e0b4aad 100644 --- a/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc +++ b/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc @@ -23,17 +23,16 @@ ;; Related .penpot file: common/test/cases/remove-swap-slots.penpot (defn- setup-file [] - ;; :frame-b1 [:id: 3aee2370-44e4-81c8-8004-46e56a459d70, :touched: ] - ;; :blue1 [:id: 3aee2370-44e4-81c8-8004-46e56a45fc55, :touched: #{:swap-slot-3aee2370-44e4-81c8-8004-46e56a459d75}] - ;; :green-copy [:id: 3aee2370-44e4-81c8-8004-46e56a45fc56, :touched: ] - ;; :blue-copy-in-green-copy [:id: 3aee2370-44e4-81c8-8004-46e56a4631a4, :touched: #{:swap-slot-3aee2370-44e4-81c8-8004-46e56a459d6f}] - ;; :frame-yellow [:id: 3aee2370-44e4-81c8-8004-46e56a459d73, :touched: ] - ;; :frame-green [:id: 3aee2370-44e4-81c8-8004-46e56a459d6c, :touched: ] - ;; :red-copy-green [:id: 3aee2370-44e4-81c8-8004-46e56a459d6f, :touched: ] - ;; :frame-blue [:id: 3aee2370-44e4-81c8-8004-46e56a459d69, :touched: ] - ;; :frame-b2 [:id: 3aee2370-44e4-81c8-8004-46e56a4631a5, :touched: ] - ;; :frame-red [:id: 3aee2370-44e4-81c8-8004-46e56a459d66, :touched: ] - + ;; {:frame-red} [:name Frame1] # [Component :red] + ;; {:frame-blue} [:name Frame1] # [Component :blue] + ;; {:frame-green} [:name Frame1] # [Component :green] + ;; :red-copy-green [:name Frame1] @--> :frame-red + ;; {:frame-b1} [:name Frame1] # [Component :b1] + ;; :blue1 [:name Frame1, :swap-slot-label :red-copy] @--> :frame-blue + ;; :frame-yellow [:name Frame1] + ;; :green-copy [:name Frame1] @--> :frame-green + ;; :blue-copy-in-green-copy [:name Frame1, :swap-slot-label :red-copy-green] @--> :frame-blue + ;; {:frame-b2} [:name Frame1] # [Component :b2] (-> (thf/sample-file :file1) (tho/add-frame :frame-red) (thc/make-component :red :frame-red) -- Gitee From 9fd9e0178e2a8cb5091e2a239306756c198742f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Wed, 8 May 2024 12:14:56 +0200 Subject: [PATCH 0514/1266] :recycle: Refactor LoginPage POM --- frontend/playwright/fixtures/login-fixture.js | 10 ---- frontend/playwright/ui/pages/BasePage.js | 1 + frontend/playwright/ui/pages/LoginPage.js | 10 ++-- frontend/playwright/ui/specs/login.spec.js | 55 +++++++++---------- .../playwright/ui/specs/workspace.spec.js | 38 +++++-------- 5 files changed, 48 insertions(+), 66 deletions(-) delete mode 100644 frontend/playwright/fixtures/login-fixture.js diff --git a/frontend/playwright/fixtures/login-fixture.js b/frontend/playwright/fixtures/login-fixture.js deleted file mode 100644 index 866453793..000000000 --- a/frontend/playwright/fixtures/login-fixture.js +++ /dev/null @@ -1,10 +0,0 @@ -import { test as base } from '@playwright/test' - -export const test = base.extend({ - loginPage: async ({ page }, use) => { - const loginPage = new LoginPage(page) - await use(loginPage) - } -}) - -export { expect } from '@playwright/test' diff --git a/frontend/playwright/ui/pages/BasePage.js b/frontend/playwright/ui/pages/BasePage.js index e0e62a0a1..076bf13f6 100644 --- a/frontend/playwright/ui/pages/BasePage.js +++ b/frontend/playwright/ui/pages/BasePage.js @@ -6,6 +6,7 @@ export class BasePage { if (typeof path !== "string" && !(path instanceof RegExp)) { throw new TypeError("Invalid path argument. Must be a string or a RegExp."); } + const url = typeof path === "string" ? `**/api/rpc/command/${path}` : path; const interceptConfig = { status: 200, diff --git a/frontend/playwright/ui/pages/LoginPage.js b/frontend/playwright/ui/pages/LoginPage.js index e0acf8b12..5e94c10ca 100644 --- a/frontend/playwright/ui/pages/LoginPage.js +++ b/frontend/playwright/ui/pages/LoginPage.js @@ -1,8 +1,8 @@ import { BasePage } from "./BasePage"; export class LoginPage extends BasePage { - static setupLoggedOutUser(page) { - return this.mockRPC(page, "get-profile", "get-profile-anonymous.json"); + static async initWithLoggedOutUser(page) { + await BasePage.mockRPC(page, "get-profile", "get-profile-anonymous.json"); } constructor(page) { @@ -10,8 +10,8 @@ export class LoginPage extends BasePage { this.loginButton = page.getByRole("button", { name: "Login" }); this.password = page.getByLabel("Password"); this.userName = page.getByLabel("Email"); - this.message = page.getByText("Email or password is incorrect"); - this.badLoginMsg = page.getByText("Enter a valid email please"); + this.invalidCredentialsError = page.getByText("Email or password is incorrect"); + this.invalidEmailError = page.getByText("Enter a valid email please"); this.initialHeading = page.getByRole("heading", { name: "Log into my account" }); } @@ -24,7 +24,7 @@ export class LoginPage extends BasePage { await this.loginButton.click(); } - async setupAllowedUser() { + async setupLoggedInUser() { await this.mockRPC("get-profile", "logged-in-user/get-profile-logged-in.json"); await this.mockRPC("get-teams", "logged-in-user/get-teams-default.json"); await this.mockRPC("get-font-variants?team-id=*", "logged-in-user/get-font-variants-empty.json"); diff --git a/frontend/playwright/ui/specs/login.spec.js b/frontend/playwright/ui/specs/login.spec.js index dab5a5ca6..dd259cf77 100644 --- a/frontend/playwright/ui/specs/login.spec.js +++ b/frontend/playwright/ui/specs/login.spec.js @@ -2,50 +2,49 @@ import { test, expect } from "@playwright/test"; import { LoginPage } from "../pages/LoginPage"; test.beforeEach(async ({ page }) => { - await LoginPage.setupLoggedOutUser(page); + await LoginPage.initWithLoggedOutUser(page); await page.goto("/#/auth/login"); }); -test("Shows login page when going to index and user is logged out", async ({ page }) => { +test("User is redirected to the login page when logged out", async ({ page }) => { const loginPage = new LoginPage(page); - await loginPage.setupAllowedUser(); + await loginPage.setupLoggedInUser(); await expect(loginPage.page).toHaveURL(/auth\/login$/); await expect(loginPage.initialHeading).toBeVisible(); }); -test("User submit a wrong formated email ", async ({ page }) => { - const loginPage = new LoginPage(page); +test.describe("Login form", () => { + test("User logs in by filling the login form", async ({ page }) => { + const loginPage = new LoginPage(page); + await loginPage.setupLoginSuccess(); + await loginPage.setupLoggedInUser(); - await loginPage.setupLoginSuccess(); + await loginPage.fillEmailAndPasswordInputs("foo@example.com", "loremipsum"); + await loginPage.clickLoginButton(); - await loginPage.fillEmailAndPasswordInputs("foo", "lorenIpsum"); + await page.waitForURL("**/dashboard/**"); + await expect(loginPage.page).toHaveURL(/dashboard/); + }); - await expect(loginPage.badLoginMsg).toBeVisible(); -}); + test("User gets error message when submitting an bad formatted email ", async ({ page }) => { + const loginPage = new LoginPage(page); + await loginPage.setupLoginSuccess(); -test("User logs in by filling the login form", async ({ page }) => { - const loginPage = new LoginPage(page); + await loginPage.fillEmailAndPasswordInputs("foo", "lorenIpsum"); - await loginPage.setupLoginSuccess(); - await loginPage.setupAllowedUser(); + await expect(loginPage.invalidEmailError).toBeVisible(); + }); - await loginPage.fillEmailAndPasswordInputs("foo@example.com", "loremipsum"); - await loginPage.clickLoginButton(); + test("User gets error message when submitting wrong credentials", async ({ page }) => { + const loginPage = new LoginPage(page); + await loginPage.setupLoginError(); - await page.waitForURL('**/dashboard/**'); - await expect(loginPage.page).toHaveURL(/dashboard/); -}); + await loginPage.fillEmailAndPasswordInputs("test@example.com", "loremipsum"); + await loginPage.clickLoginButton(); -test("User submits wrong credentials", async ({ page }) => { - const loginPage = new LoginPage(page); - - await loginPage.setupLoginError(); - - await loginPage.fillEmailAndPasswordInputs("test@example.com", "loremipsum"); - await loginPage.clickLoginButton(); - - await expect(loginPage.message).toBeVisible(); - await expect(loginPage.page).toHaveURL(/auth\/login$/); + await expect(loginPage.invalidCredentialsError).toBeVisible(); + await expect(loginPage.page).toHaveURL(/auth\/login$/); + }); }); diff --git a/frontend/playwright/ui/specs/workspace.spec.js b/frontend/playwright/ui/specs/workspace.spec.js index 3f24e2d28..57a60e979 100644 --- a/frontend/playwright/ui/specs/workspace.spec.js +++ b/frontend/playwright/ui/specs/workspace.spec.js @@ -1,5 +1,5 @@ import { test, expect } from "@playwright/test"; -import { BasePage } from "../pages/BasePage"; +import { BaseWebSocketPage } from "../pages/BaseWebSocketPage"; import { MockWebSocketHelper } from "../../helpers/MockWebSocketHelper"; import { presenceFixture } from "../../data/workspace/ws-notifications"; @@ -8,32 +8,24 @@ const anyFileId = "c7ce0794-0992-8105-8004-38f280443849"; const anyPageId = "c7ce0794-0992-8105-8004-38f28044384a"; const setupWorkspaceUser = (page) => { - BasePage.mockRPC(page, "get-profile", "logged-in-user/get-profile-logged-in.json"); - BasePage.mockRPC(page, "get-team-users?file-id=*", "logged-in-user/get-team-users-single-user.json"); - BasePage.mockRPC(page, "get-comment-threads?file-id=*", "workspace/get-comment-threads-empty.json"); - BasePage.mockRPC(page, "get-project?id=*", "workspace/get-project-default.json"); - BasePage.mockRPC(page, "get-team?id=*", "workspace/get-team-default.json"); - BasePage.mockRPC(page, /get\-file\?/, "workspace/get-file-blank.json"); - BasePage.mockRPC( - page, - "get-file-object-thumbnails?file-id=*", - "workspace/get-file-object-thumbnails-blank.json", - ); - BasePage.mockRPC( - page, - "get-profiles-for-file-comments?file-id=*", - "workspace/get-profile-for-file-comments.json", - ); - BasePage.mockRPC(page, "get-font-variants?team-id=*", "workspace/get-font-variants-empty.json"); - BasePage.mockRPC(page, "get-file-fragment?file-id=*", "workspace/get-file-fragment-blank.json"); - BasePage.mockRPC(page, "get-file-libraries?file-id=*", "workspace/get-file-libraries-empty.json"); + page.mockRPC("get-profile", "logged-in-user/get-profile-logged-in.json"); + page.mockRPC("get-team-users?file-id=*", "logged-in-user/get-team-users-single-user.json"); + page.mockRPC("get-comment-threads?file-id=*", "workspace/get-comment-threads-empty.json"); + page.mockRPC("get-project?id=*", "workspace/get-project-default.json"); + page.mockRPC("get-team?id=*", "workspace/get-team-default.json"); + page.mockRPC(/get\-file\?/, "workspace/get-file-blank.json"); + page.mockRPC("get-file-object-thumbnails?file-id=*", "workspace/get-file-object-thumbnails-blank.json"); + page.mockRPC("get-profiles-for-file-comments?file-id=*", "workspace/get-profile-for-file-comments.json"); + page.mockRPC("get-font-variants?team-id=*", "workspace/get-font-variants-empty.json"); + page.mockRPC("get-file-fragment?file-id=*", "workspace/get-file-fragment-blank.json"); + page.mockRPC("get-file-libraries?file-id=*", "workspace/get-file-libraries-empty.json"); }; test.beforeEach(async ({ page }) => { await MockWebSocketHelper.init(page); }); -test("User loads worskpace with empty file", async ({ page }) => { +test.skip("User loads worskpace with empty file", async ({ page }) => { await setupWorkspaceUser(page); await page.goto(`/#/workspace/${anyProjectId}/${anyFileId}?page-id=${anyPageId}`); @@ -41,11 +33,11 @@ test("User loads worskpace with empty file", async ({ page }) => { await expect(page.getByTestId("page-name")).toHaveText("Page 1"); }); -test("User receives notifications updates in the workspace", async ({ page }) => { +test.skip("User receives notifications updates in the workspace", async ({ page }) => { await setupWorkspaceUser(page); await page.goto(`/#/workspace/${anyProjectId}/${anyFileId}?page-id=${anyPageId}`); - const ws = await MockWebSocketHelper.waitForURL("ws://0.0.0.0:3500/ws/notifications") + const ws = await MockWebSocketHelper.waitForURL("ws://0.0.0.0:3500/ws/notifications"); await ws.mockOpen(); await expect(page.getByTestId("page-name")).toHaveText("Page 1"); await ws.mockMessage(JSON.stringify(presenceFixture)); -- Gitee From 40bc1fac7376f6a8bb512c6bf9063661adf97414 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20S=C3=A1nchez?= Date: Thu, 9 May 2024 10:36:49 +0200 Subject: [PATCH 0515/1266] :bug: Fix medias not being imported using lib-penpot --- frontend/src/app/config.cljs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/frontend/src/app/config.cljs b/frontend/src/app/config.cljs index c95f72e1a..7fba68aa2 100644 --- a/frontend/src/app/config.cljs +++ b/frontend/src/app/config.cljs @@ -157,8 +157,10 @@ (defn resolve-file-media ([media] (resolve-file-media media false)) - ([{:keys [id] :as media} thumbnail?] - (dm/str - (cond-> (u/join public-uri "assets/by-file-media-id/") - (true? thumbnail?) (u/join (dm/str id "/thumbnail")) - (false? thumbnail?) (u/join (dm/str id)))))) + ([{:keys [id data-uri] :as media} thumbnail?] + (if data-uri + data-uri + (dm/str + (cond-> (u/join public-uri "assets/by-file-media-id/") + (true? thumbnail?) (u/join (dm/str id "/thumbnail")) + (false? thumbnail?) (u/join (dm/str id))))))) -- Gitee From bfe9caba15dd6d3f33b160621054dc37f386f6c6 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Tue, 7 May 2024 19:42:57 +0200 Subject: [PATCH 0516/1266] :recycle: Components refactor: move generators for duplicate --- common/src/app/common/logic/libraries.cljc | 294 ++++++++++++++++ frontend/src/app/main/data/workspace.cljs | 4 +- .../app/main/data/workspace/selection.cljs | 313 +----------------- .../app/main/data/workspace/shape_layout.cljs | 6 +- 4 files changed, 304 insertions(+), 313 deletions(-) diff --git a/common/src/app/common/logic/libraries.cljc b/common/src/app/common/logic/libraries.cljc index 458bcb2ec..330fa596e 100644 --- a/common/src/app/common/logic/libraries.cljc +++ b/common/src/app/common/logic/libraries.cljc @@ -22,8 +22,10 @@ [app.common.types.components-list :as ctkl] [app.common.types.container :as ctn] [app.common.types.file :as ctf] + [app.common.types.page :as ctp] [app.common.types.pages-list :as ctpl] [app.common.types.shape-tree :as ctst] + [app.common.types.shape.interactions :as ctsi] [app.common.types.shape.layout :as ctl] [app.common.types.typography :as cty] [app.common.uuid :as uuid] @@ -1923,3 +1925,295 @@ (cond-> changes (some? swap-slot) (generate-sync-head file-full libraries container id components-v2 true)))) + +(defn generate-duplicate-flows + [changes shapes page ids-map] + (let [flows (-> page :options :flows) + unames (volatile! (into #{} (map :name flows))) + frames-with-flow (->> shapes + (filter #(= (:type %) :frame)) + (filter #(some? (ctp/get-frame-flow flows (:id %)))))] + (if-not (empty? frames-with-flow) + (let [update-flows (fn [flows] + (reduce + (fn [flows frame] + (let [name (cfh/generate-unique-name @unames "Flow 1") + _ (vswap! unames conj name) + new-flow {:id (uuid/next) + :name name + :starting-frame (get ids-map (:id frame))}] + (ctp/add-flow flows new-flow))) + flows + frames-with-flow))] + (pcb/update-page-option changes :flows update-flows)) + changes))) + +(defn generate-duplicate-guides + [changes shapes page ids-map delta] + (let [guides (get-in page [:options :guides]) + frames (->> shapes (filter cfh/frame-shape?)) + + new-guides + (reduce + (fn [g frame] + (let [new-id (ids-map (:id frame)) + new-frame (-> frame (gsh/move delta)) + + new-guides + (->> guides + (vals) + (filter #(= (:frame-id %) (:id frame))) + (map #(-> % + (assoc :id (uuid/next)) + (assoc :frame-id new-id) + (assoc :position (if (= (:axis %) :x) + (+ (:position %) (- (:x new-frame) (:x frame))) + (+ (:position %) (- (:y new-frame) (:y frame))))))))] + (cond-> g + (not-empty new-guides) + (conj (into {} (map (juxt :id identity) new-guides)))))) + guides + frames)] + (-> (pcb/with-page changes page) + (pcb/set-page-option :guides new-guides)))) + +(defn generate-duplicate-component-change + [changes objects page component-root parent-id frame-id delta libraries library-data] + (let [component-id (:component-id component-root) + file-id (:component-file component-root) + main-component (ctf/get-component libraries file-id component-id) + moved-component (gsh/move component-root delta) + pos (gpt/point (:x moved-component) (:y moved-component)) + origin-frame (get-in page [:objects frame-id]) + delta (cond-> delta + (some? origin-frame) + (gpt/subtract (-> origin-frame :selrect gpt/point))) + + instantiate-component + #(generate-instantiate-component changes + objects + file-id + (:component-id component-root) + pos + page + libraries + (:id component-root) + parent-id + frame-id + {}) + + restore-component + #(let [restore (prepare-restore-component changes library-data (:component-id component-root) page delta (:id component-root) parent-id frame-id)] + [(:shape restore) (:changes restore)]) + + [_shape changes] + (if (nil? main-component) + (restore-component) + (instantiate-component))] + changes)) + +(defn generate-duplicate-shape-change + ([changes objects page unames update-unames! ids-map obj delta level-delta libraries library-data file-id] + (generate-duplicate-shape-change changes objects page unames update-unames! ids-map obj delta level-delta libraries library-data file-id (:frame-id obj) (:parent-id obj) false false true)) + + ([changes objects page unames update-unames! ids-map obj delta level-delta libraries library-data file-id frame-id parent-id duplicating-component? child? remove-swap-slot?] + (cond + (nil? obj) + changes + + (ctf/is-main-of-known-component? obj libraries) + (generate-duplicate-component-change changes objects page obj parent-id frame-id delta libraries library-data) + + :else + (let [frame? (cfh/frame-shape? obj) + group? (cfh/group-shape? obj) + bool? (cfh/bool-shape? obj) + new-id (ids-map (:id obj)) + parent-id (or parent-id frame-id) + parent (get objects parent-id) + name (:name obj) + + is-component-root? (or (:saved-component-root obj) + ;; Backward compatibility + (:saved-component-root? obj) + (ctk/instance-root? obj)) + duplicating-component? (or duplicating-component? (ctk/instance-head? obj)) + is-component-main? (ctk/main-instance? obj) + subinstance-head? (ctk/subinstance-head? obj) + instance-root? (ctk/instance-root? obj) + + into-component? (and duplicating-component? + (ctn/in-any-component? objects parent)) + + level-delta (if (some? level-delta) + level-delta + (ctn/get-nesting-level-delta objects obj parent)) + new-shape-ref (ctf/advance-shape-ref nil page libraries obj level-delta {:include-deleted? true}) + + regenerate-component + (fn [changes shape] + (let [components-v2 (dm/get-in library-data [:options :components-v2]) + [_ changes] (generate-add-component-changes changes shape objects file-id (:id page) components-v2)] + changes)) + + new-obj + (-> obj + (assoc :id new-id + :name name + :parent-id parent-id + :frame-id frame-id) + + (cond-> (and (not instance-root?) + subinstance-head? + remove-swap-slot?) + (ctk/remove-swap-slot)) + + (dissoc :shapes + :use-for-thumbnail) + + (cond-> (not is-component-root?) + (dissoc :main-instance)) + + (cond-> into-component? + (dissoc :component-root)) + + (cond-> (and (ctk/instance-head? obj) + (not into-component?)) + (assoc :component-root true)) + + (cond-> (or frame? group? bool?) + (assoc :shapes [])) + + (cond-> (and (some? new-shape-ref) + (not= new-shape-ref (:shape-ref obj))) + (assoc :shape-ref new-shape-ref)) + + (gsh/move delta) + (d/update-when :interactions #(ctsi/remap-interactions % ids-map objects)) + + (cond-> (ctl/grid-layout? obj) + (ctl/remap-grid-cells ids-map))) + + new-obj (cond-> new-obj + (not duplicating-component?) + (ctk/detach-shape)) + + ;; We want the first added object to touch it's parent, but not subsequent children + changes (-> (pcb/add-object changes new-obj {:ignore-touched (and duplicating-component? child?)}) + (pcb/amend-last-change #(assoc % :old-id (:id obj))) + (cond-> (ctl/grid-layout? objects (:parent-id obj)) + (-> (pcb/update-shapes [(:parent-id obj)] ctl/assign-cells {:with-objects? true}) + (pcb/reorder-grid-children [(:parent-id obj)])))) + + changes (cond-> changes + (and is-component-root? is-component-main?) + (regenerate-component new-obj)) + + ;; This is needed for the recursive call to find the new object as parent + page' (ctst/add-shape (:id new-obj) + new-obj + {:objects objects} + (:frame-id new-obj) + (:parent-id new-obj) + nil + true)] + + (reduce (fn [changes child] + (generate-duplicate-shape-change changes + (:objects page') + page + unames + update-unames! + ids-map + child + delta + level-delta + libraries + library-data + file-id + (if frame? new-id frame-id) + new-id + duplicating-component? + true + (and remove-swap-slot? + ;; only remove swap slot of children when the current shape + ;; is not a subinstance head nor a instance root + (not subinstance-head?) + (not instance-root?)))) + changes + (map (d/getf objects) (:shapes obj))))))) + +(defn generate-duplicate-changes + "Prepare objects to duplicate: generate new id, give them unique names, + move to the desired position, and recalculate parents and frames as needed." + [changes all-objects page ids delta libraries library-data file-id] + (let [shapes (map (d/getf all-objects) ids) + unames (volatile! (cfh/get-used-names (:objects page))) + update-unames! (fn [new-name] (vswap! unames conj new-name)) + all-ids (reduce #(into %1 (cons %2 (cfh/get-children-ids all-objects %2))) (d/ordered-set) ids) + + ;; We need ids-map for remapping the grid layout. But when duplicating the guides + ;; we calculate a new one because the components will have created new shapes. + ids-map (into {} (map #(vector % (uuid/next))) all-ids) + + changes (-> changes + (pcb/with-page page) + (pcb/with-objects all-objects)) + changes + (->> shapes + (reduce #(generate-duplicate-shape-change %1 + all-objects + page + unames + update-unames! + ids-map + %2 + delta + nil + libraries + library-data + file-id) + changes)) + + ;; We need to check the changes to get the ids-map + ids-map + (into {} + (comp + (filter #(= :add-obj (:type %))) + (map #(vector (:old-id %) (-> % :obj :id)))) + (:redo-changes changes))] + + (-> changes + (generate-duplicate-flows shapes page ids-map) + (generate-duplicate-guides shapes page ids-map delta)))) + +(defn generate-duplicate-changes-update-indices + "Updates the changes to correctly set the indexes of the duplicated objects, + depending on the index of the original object respect their parent." + [changes objects ids] + (let [;; index-map is a map that goes from parent-id => vector([id index-in-parent]) + index-map (reduce (fn [index-map id] + (let [parent-id (get-in objects [id :parent-id]) + parent-index (cfh/get-position-on-parent objects id)] + (update index-map parent-id (fnil conj []) [id parent-index]))) + {} + ids) + + inc-indices + (fn [[offset result] [id index]] + [(inc offset) (conj result [id (+ index offset)])]) + + fix-indices + (fn [_ entry] + (->> entry + (sort-by second) + (reduce inc-indices [1 []]) + (second) + (into {}))) + + objects-indices (->> index-map (d/mapm fix-indices) (vals) (reduce merge))] + + (pcb/amend-changes + changes + (fn [change] + (assoc change :index (get objects-indices (:old-id change))))))) diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index bb88913c4..ea52674f5 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -19,6 +19,7 @@ [app.common.geom.rect :as grc] [app.common.geom.shapes :as gsh] [app.common.geom.shapes.grid-layout :as gslg] + [app.common.logic.libraries :as cll] [app.common.logic.shapes :as cls] [app.common.schema :as sm] [app.common.text :as txt] @@ -1868,7 +1869,8 @@ drop-cell (when (ctl/grid-layout? all-objects parent-id) (gslg/get-drop-cell frame-id all-objects position)) - changes (-> (dws/prepare-duplicate-changes all-objects page selected delta it libraries ldata file-id) + changes (-> (pcb/empty-changes it) + (cll/generate-duplicate-changes all-objects page selected delta libraries ldata file-id) (pcb/amend-changes (partial process-rchange media-idx)) (pcb/amend-changes (partial change-add-obj-index objects selected index))) diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index e0dee732f..f05cf5d5e 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -17,12 +17,6 @@ [app.common.logic.libraries :as cll] [app.common.record :as cr] [app.common.types.component :as ctk] - [app.common.types.container :as ctn] - [app.common.types.file :as ctf] - [app.common.types.page :as ctp] - [app.common.types.shape-tree :as ctst] - [app.common.types.shape.interactions :as ctsi] - [app.common.types.shape.layout :as ctl] [app.common.uuid :as uuid] [app.main.data.events :as ev] [app.main.data.modal :as md] @@ -368,308 +362,6 @@ (rx/of (select-shape (:id selected)))))))) ;; --- Duplicate Shapes -(declare prepare-duplicate-shape-change) -(declare prepare-duplicate-flows) -(declare prepare-duplicate-guides) - -(defn prepare-duplicate-changes - "Prepare objects to duplicate: generate new id, give them unique names, - move to the desired position, and recalculate parents and frames as needed." - ([all-objects page ids delta it libraries library-data file-id] - (let [init-changes - (-> (pcb/empty-changes it) - (pcb/with-page page) - (pcb/with-objects all-objects))] - (prepare-duplicate-changes all-objects page ids delta it libraries library-data file-id init-changes))) - - ([all-objects page ids delta it libraries library-data file-id init-changes] - (let [shapes (map (d/getf all-objects) ids) - unames (volatile! (cfh/get-used-names (:objects page))) - update-unames! (fn [new-name] (vswap! unames conj new-name)) - all-ids (reduce #(into %1 (cons %2 (cfh/get-children-ids all-objects %2))) (d/ordered-set) ids) - - ;; We need ids-map for remapping the grid layout. But when duplicating the guides - ;; we calculate a new one because the components will have created new shapes. - ids-map (into {} (map #(vector % (uuid/next))) all-ids) - - changes - (->> shapes - (reduce #(prepare-duplicate-shape-change %1 - all-objects - page - unames - update-unames! - ids-map - %2 - delta - nil - libraries - library-data - it - file-id) - init-changes)) - - ;; We need to check the changes to get the ids-map - ids-map - (into {} - (comp - (filter #(= :add-obj (:type %))) - (map #(vector (:old-id %) (-> % :obj :id)))) - (:redo-changes changes))] - - (-> changes - (prepare-duplicate-flows shapes page ids-map) - (prepare-duplicate-guides shapes page ids-map delta))))) - -(defn- prepare-duplicate-component-change - [changes objects page component-root parent-id frame-id delta libraries library-data] - (let [component-id (:component-id component-root) - file-id (:component-file component-root) - main-component (ctf/get-component libraries file-id component-id) - moved-component (gsh/move component-root delta) - pos (gpt/point (:x moved-component) (:y moved-component)) - origin-frame (get-in page [:objects frame-id]) - delta (cond-> delta - (some? origin-frame) - (gpt/subtract (-> origin-frame :selrect gpt/point))) - - instantiate-component - #(cll/generate-instantiate-component changes - objects - file-id - (:component-id component-root) - pos - page - libraries - (:id component-root) - parent-id - frame-id - {}) - - restore-component - #(let [restore (cll/prepare-restore-component changes library-data (:component-id component-root) page delta (:id component-root) parent-id frame-id)] - [(:shape restore) (:changes restore)]) - - [_shape changes] - (if (nil? main-component) - (restore-component) - (instantiate-component))] - changes)) - -;; TODO: move to common.files.shape-helpers -(defn- prepare-duplicate-shape-change - ([changes objects page unames update-unames! ids-map obj delta level-delta libraries library-data it file-id] - (prepare-duplicate-shape-change changes objects page unames update-unames! ids-map obj delta level-delta libraries library-data it file-id (:frame-id obj) (:parent-id obj) false false true)) - - ([changes objects page unames update-unames! ids-map obj delta level-delta libraries library-data it file-id frame-id parent-id duplicating-component? child? remove-swap-slot?] - (cond - (nil? obj) - changes - - (ctf/is-main-of-known-component? obj libraries) - (prepare-duplicate-component-change changes objects page obj parent-id frame-id delta libraries library-data) - - :else - (let [frame? (cfh/frame-shape? obj) - group? (cfh/group-shape? obj) - bool? (cfh/bool-shape? obj) - new-id (ids-map (:id obj)) - parent-id (or parent-id frame-id) - parent (get objects parent-id) - name (:name obj) - - is-component-root? (or (:saved-component-root obj) - ;; Backward compatibility - (:saved-component-root? obj) - (ctk/instance-root? obj)) - duplicating-component? (or duplicating-component? (ctk/instance-head? obj)) - is-component-main? (ctk/main-instance? obj) - subinstance-head? (ctk/subinstance-head? obj) - instance-root? (ctk/instance-root? obj) - - into-component? (and duplicating-component? - (ctn/in-any-component? objects parent)) - - level-delta (if (some? level-delta) - level-delta - (ctn/get-nesting-level-delta objects obj parent)) - new-shape-ref (ctf/advance-shape-ref nil page libraries obj level-delta {:include-deleted? true}) - - regenerate-component - (fn [changes shape] - (let [components-v2 (dm/get-in library-data [:options :components-v2]) - [_ changes] (cll/generate-add-component-changes changes shape objects file-id (:id page) components-v2)] - changes)) - - new-obj - (-> obj - (assoc :id new-id - :name name - :parent-id parent-id - :frame-id frame-id) - - (cond-> (and (not instance-root?) - subinstance-head? - remove-swap-slot?) - (ctk/remove-swap-slot)) - - (dissoc :shapes - :use-for-thumbnail) - - (cond-> (not is-component-root?) - (dissoc :main-instance)) - - (cond-> into-component? - (dissoc :component-root)) - - (cond-> (and (ctk/instance-head? obj) - (not into-component?)) - (assoc :component-root true)) - - (cond-> (or frame? group? bool?) - (assoc :shapes [])) - - (cond-> (and (some? new-shape-ref) - (not= new-shape-ref (:shape-ref obj))) - (assoc :shape-ref new-shape-ref)) - - (gsh/move delta) - (d/update-when :interactions #(ctsi/remap-interactions % ids-map objects)) - - (cond-> (ctl/grid-layout? obj) - (ctl/remap-grid-cells ids-map))) - - new-obj (cond-> new-obj - (not duplicating-component?) - (ctk/detach-shape)) - - ;; We want the first added object to touch it's parent, but not subsequent children - changes (-> (pcb/add-object changes new-obj {:ignore-touched (and duplicating-component? child?)}) - (pcb/amend-last-change #(assoc % :old-id (:id obj))) - (cond-> (ctl/grid-layout? objects (:parent-id obj)) - (-> (pcb/update-shapes [(:parent-id obj)] ctl/assign-cells {:with-objects? true}) - (pcb/reorder-grid-children [(:parent-id obj)])))) - - changes (cond-> changes - (and is-component-root? is-component-main?) - (regenerate-component new-obj)) - - ;; This is needed for the recursive call to find the new object as parent - page' (ctst/add-shape (:id new-obj) - new-obj - {:objects objects} - (:frame-id new-obj) - (:parent-id new-obj) - nil - true)] - - (reduce (fn [changes child] - (prepare-duplicate-shape-change changes - (:objects page') - page - unames - update-unames! - ids-map - child - delta - level-delta - libraries - library-data - it - file-id - (if frame? new-id frame-id) - new-id - duplicating-component? - true - (and remove-swap-slot? - ;; only remove swap slot of children when the current shape - ;; is not a subinstance head nor a instance root - (not subinstance-head?) - (not instance-root?)))) - changes - (map (d/getf objects) (:shapes obj))))))) - -(defn- prepare-duplicate-flows - [changes shapes page ids-map] - (let [flows (-> page :options :flows) - unames (volatile! (into #{} (map :name flows))) - frames-with-flow (->> shapes - (filter #(= (:type %) :frame)) - (filter #(some? (ctp/get-frame-flow flows (:id %)))))] - (if-not (empty? frames-with-flow) - (let [update-flows (fn [flows] - (reduce - (fn [flows frame] - (let [name (cfh/generate-unique-name @unames "Flow 1") - _ (vswap! unames conj name) - new-flow {:id (uuid/next) - :name name - :starting-frame (get ids-map (:id frame))}] - (ctp/add-flow flows new-flow))) - flows - frames-with-flow))] - (pcb/update-page-option changes :flows update-flows)) - changes))) - -(defn- prepare-duplicate-guides - [changes shapes page ids-map delta] - (let [guides (get-in page [:options :guides]) - frames (->> shapes (filter cfh/frame-shape?)) - - new-guides - (reduce - (fn [g frame] - (let [new-id (ids-map (:id frame)) - new-frame (-> frame (gsh/move delta)) - - new-guides - (->> guides - (vals) - (filter #(= (:frame-id %) (:id frame))) - (map #(-> % - (assoc :id (uuid/next)) - (assoc :frame-id new-id) - (assoc :position (if (= (:axis %) :x) - (+ (:position %) (- (:x new-frame) (:x frame))) - (+ (:position %) (- (:y new-frame) (:y frame))))))))] - (cond-> g - (not-empty new-guides) - (conj (into {} (map (juxt :id identity) new-guides)))))) - guides - frames)] - (-> (pcb/with-page changes page) - (pcb/set-page-option :guides new-guides)))) - -(defn duplicate-changes-update-indices - "Updates the changes to correctly set the indexes of the duplicated objects, - depending on the index of the original object respect their parent." - [objects ids changes] - (let [;; index-map is a map that goes from parent-id => vector([id index-in-parent]) - index-map (reduce (fn [index-map id] - (let [parent-id (get-in objects [id :parent-id]) - parent-index (cfh/get-position-on-parent objects id)] - (update index-map parent-id (fnil conj []) [id parent-index]))) - {} - ids) - - inc-indices - (fn [[offset result] [id index]] - [(inc offset) (conj result [id (+ index offset)])]) - - fix-indices - (fn [_ entry] - (->> entry - (sort-by second) - (reduce inc-indices [1 []]) - (second) - (into {}))) - - objects-indices (->> index-map (d/mapm fix-indices) (vals) (reduce merge))] - - (pcb/amend-changes - changes - (fn [change] - (assoc change :index (get objects-indices (:old-id change))))))) (defn clear-memorize-duplicated [] @@ -746,8 +438,9 @@ libraries (wsh/get-libraries state) library-data (wsh/get-file state file-id) - changes (->> (prepare-duplicate-changes objects page ids delta it libraries library-data file-id) - (duplicate-changes-update-indices objects ids)) + changes (-> (pcb/empty-changes it) + (cll/generate-duplicate-changes objects page ids delta libraries library-data file-id) + (cll/generate-duplicate-changes-update-indices objects ids)) tags (or (:tags changes) #{}) diff --git a/frontend/src/app/main/data/workspace/shape_layout.cljs b/frontend/src/app/main/data/workspace/shape_layout.cljs index b3c0d513f..765973787 100644 --- a/frontend/src/app/main/data/workspace/shape_layout.cljs +++ b/frontend/src/app/main/data/workspace/shape_layout.cljs @@ -15,6 +15,7 @@ [app.common.geom.point :as gpt] [app.common.geom.shapes.flex-layout :as flex] [app.common.geom.shapes.grid-layout :as grid] + [app.common.logic.libraries :as cll] [app.common.types.component :as ctc] [app.common.types.modifiers :as ctm] [app.common.types.shape.layout :as ctl] @@ -339,8 +340,9 @@ selected (set shapes-by-track) changes - (->> (dwse/prepare-duplicate-changes objects page selected (gpt/point 0 0) it libraries library-data file-id) - (dwse/duplicate-changes-update-indices objects selected)) + (-> (pcb/empty-changes it) + (cll/generate-duplicate-changes objects page selected (gpt/point 0 0) libraries library-data file-id) + (cll/generate-duplicate-changes-update-indices objects selected)) ;; Creates a map with shape-id => duplicated-shape-id ids-map -- Gitee From 6f93db034fef9a8e1327326c9b6ce91f97475f75 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Wed, 8 May 2024 23:05:33 +0200 Subject: [PATCH 0517/1266] :tada: Components refactor: Add tests for remove swap slot on duplicate --- common/src/app/common/logic/libraries.cljc | 58 ++++---- .../logic/comp_remove_swap_slots_test.cljc | 124 ++++++++++++++++-- 2 files changed, 143 insertions(+), 39 deletions(-) diff --git a/common/src/app/common/logic/libraries.cljc b/common/src/app/common/logic/libraries.cljc index 330fa596e..5566ab449 100644 --- a/common/src/app/common/logic/libraries.cljc +++ b/common/src/app/common/logic/libraries.cljc @@ -2120,26 +2120,26 @@ (reduce (fn [changes child] (generate-duplicate-shape-change changes - (:objects page') - page - unames - update-unames! - ids-map - child - delta - level-delta - libraries - library-data - file-id - (if frame? new-id frame-id) - new-id - duplicating-component? - true - (and remove-swap-slot? + (:objects page') + page + unames + update-unames! + ids-map + child + delta + level-delta + libraries + library-data + file-id + (if frame? new-id frame-id) + new-id + duplicating-component? + true + (and remove-swap-slot? ;; only remove swap slot of children when the current shape ;; is not a subinstance head nor a instance root - (not subinstance-head?) - (not instance-root?)))) + (not subinstance-head?) + (not instance-root?)))) changes (map (d/getf objects) (:shapes obj))))))) @@ -2162,17 +2162,17 @@ changes (->> shapes (reduce #(generate-duplicate-shape-change %1 - all-objects - page - unames - update-unames! - ids-map - %2 - delta - nil - libraries - library-data - file-id) + all-objects + page + unames + update-unames! + ids-map + %2 + delta + nil + libraries + library-data + file-id) changes)) ;; We need to check the changes to get the ids-map diff --git a/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc b/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc index a1e0b4aad..17c534c22 100644 --- a/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc +++ b/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc @@ -7,6 +7,8 @@ (ns common-tests.logic.comp-remove-swap-slots-test (:require [app.common.files.changes-builder :as pcb] + [app.common.geom.point :as gpt] + [app.common.logic.libraries :as cll] [app.common.logic.shapes :as cls] [app.common.types.component :as ctk] [app.common.uuid :as uuid] @@ -36,14 +38,14 @@ (-> (thf/sample-file :file1) (tho/add-frame :frame-red) (thc/make-component :red :frame-red) - (tho/add-frame :frame-blue) + (tho/add-frame :frame-blue :name "frame-blue") (thc/make-component :blue :frame-blue) (tho/add-frame :frame-green) (thc/make-component :green :frame-green) (thc/instantiate-component :red :red-copy-green :parent-label :frame-green) (tho/add-frame :frame-b1) (thc/make-component :b1 :frame-b1) - (tho/add-frame :frame-yellow :parent-label :frame-b1) + (tho/add-frame :frame-yellow :parent-label :frame-b1 :name "frame-yellow") (thc/instantiate-component :red :red-copy :parent-label :frame-b1) (thc/component-swap :red-copy :blue :blue1) (thc/instantiate-component :green :green-copy :parent-label :frame-b1 :children-labels [:red-copy-in-green-copy]) @@ -51,7 +53,7 @@ (tho/add-frame :frame-b2) (thc/make-component :b2 :frame-b2))) -(t/deftest test-keep-swap-slot-relocating-blue1-to-root +(t/deftest test-remove-swap-slot-relocating-blue1-to-root (let [;; ==== Setup file (setup-file) @@ -80,7 +82,7 @@ (t/is (some? blue1')) (t/is (nil? (ctk/get-swap-slot blue1'))))) -(t/deftest test-keep-swap-slot-move-blue1-to-root +(t/deftest test-remove-swap-slot-move-blue1-to-root (let [;; ==== Setup file (setup-file) page (thf/current-page file) @@ -110,7 +112,7 @@ (t/is (nil? (ctk/get-swap-slot blue1'))))) -(t/deftest test-keep-swap-slot-relocating-blue1-to-b2 +(t/deftest test-remove-swap-slot-relocating-blue1-to-b2 (let [;; ==== Setup file (setup-file) page (thf/current-page file) @@ -140,7 +142,7 @@ (t/is (some? blue1')) (t/is (nil? (ctk/get-swap-slot blue1'))))) -(t/deftest test-keep-swap-slot-move-blue1-to-b2 +(t/deftest test-remove-swap-slot-move-blue1-to-b2 (let [;; ==== Setup file (setup-file) page (thf/current-page file) @@ -171,7 +173,7 @@ (t/is (some? blue1')) (t/is (nil? (ctk/get-swap-slot blue1'))))) -(t/deftest test-keep-swap-slot-relocating-yellow-to-root +(t/deftest test-remove-swap-slot-relocating-yellow-to-root (let [;; ==== Setup file (setup-file) page (thf/current-page file) @@ -214,7 +216,7 @@ (t/is (some? blue1'')) (t/is (nil? (ctk/get-swap-slot blue1''))))) -(t/deftest test-keep-swap-slot-move-yellow-to-root +(t/deftest test-remove-swap-slot-move-yellow-to-root (let [;; ==== Setup file (setup-file) page (thf/current-page file) @@ -258,7 +260,7 @@ (t/is (nil? (ctk/get-swap-slot blue1''))))) -(t/deftest test-keep-swap-slot-relocating-yellow-to-b2 +(t/deftest test-remove-swap-slot-relocating-yellow-to-b2 (let [;; ==== Setup file (setup-file) page (thf/current-page file) @@ -302,7 +304,7 @@ (t/is (some? blue1'')) (t/is (nil? (ctk/get-swap-slot blue1''))))) -(t/deftest test-keep-swap-slot-move-yellow-to-b2 +(t/deftest test-remove-swap-slot-move-yellow-to-b2 (let [;; ==== Setup file (setup-file) page (thf/current-page file) @@ -346,3 +348,105 @@ ;; blue1 has not swap-id after move (t/is (some? blue1'')) (t/is (nil? (ctk/get-swap-slot blue1''))))) + +(defn- find-duplicated-shape + [original-shape page] + ;; duplicated shape has the same name, the same parent, and doesn't have a label + (->> (vals (:objects page)) + (filter #(and (= (:name %) (:name original-shape)) + (= (:parent-id %) (:parent-id original-shape)) + (nil? (thi/label (:id %))))) + first)) + +(t/deftest test-remove-swap-slot-duplicating-blue1 + (let [;; ==== Setup + file (setup-file) + + page (thf/current-page file) + blue1 (ths/get-shape file :blue1) + + ;; ==== Action + changes (-> (pcb/empty-changes nil) + (cll/generate-duplicate-changes (:objects page) ;; objects + page ;; page + #{(:id blue1)} ;; ids + (gpt/point 0 0) ;; delta + {(:id file) file} ;; libraries + (:data file) ;; library-data + (:id file)) ;; file-id + (cll/generate-duplicate-changes-update-indices (:objects page) ;; objects + #{(:id blue1)})) ;; ids + + + + file' (thf/apply-changes file changes) + + ;; ==== Get + page' (thf/current-page file') + blue1' (ths/get-shape file' :blue1) + duplicated-blue1' (find-duplicated-shape blue1' page')] + + ;; ==== Check + + ;; blue1 has swap-id + (t/is (some? (ctk/get-swap-slot blue1'))) + + ;; duplicated-blue1 has not swap-id + (t/is (some? duplicated-blue1')) + (t/is (nil? (ctk/get-swap-slot duplicated-blue1'))))) + +(t/deftest test-remove-swap-slot-duplicate-yellow + (let [;; ==== Setup + file (setup-file) + page (thf/current-page file) + blue1 (ths/get-shape file :blue1) + yellow (ths/get-shape file :frame-yellow) + + ;; ==== Action + ;; Move blue1 into yellow + changes (cls/generate-move-shapes-to-frame (pcb/empty-changes nil) + #{(:id blue1)} ;; ids + (:id yellow) ;; frame-id + (:id page) ;; page-id + (:objects page) ;; objects + 0 ;; drop-index + nil) ;; cell + + file' (thf/apply-changes file changes) + page' (thf/current-page file') + yellow' (ths/get-shape file' :frame-yellow) + + ;; Duplicate yellow + changes' (-> (pcb/empty-changes nil) + (cll/generate-duplicate-changes (:objects page') ;; objects + page' ;; page + #{(:id yellow')} ;; ids + (gpt/point 0 0) ;; delta + {(:id file') file'} ;; libraries + (:data file') ;; library-data + (:id file')) ;; file-id + (cll/generate-duplicate-changes-update-indices (:objects page') ;; objects + #{(:id yellow')})) ;; ids + + file'' (thf/apply-changes file' changes') + + ;; ==== Get + page'' (thf/current-page file'') + blue1'' (ths/get-shape file'' :blue1) + yellow'' (ths/get-shape file'' :frame-yellow) + + + duplicated-yellow'' (find-duplicated-shape yellow'' page'') + duplicated-blue1-id'' (-> duplicated-yellow'' + :shapes + first) + duplicated-blue1'' (get (:objects page'') duplicated-blue1-id'')] + + ;; ==== Check + + ;; blue1'' has swap-id + (t/is (some? (ctk/get-swap-slot blue1''))) + + ;; duplicated-blue1'' has not swap-id + (t/is (some? duplicated-blue1'')) + (t/is (nil? (ctk/get-swap-slot duplicated-blue1''))))) -- Gitee From 8deb799c3de528620ccd3368b227050d2b5378fc Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Thu, 9 May 2024 13:10:35 +0200 Subject: [PATCH 0518/1266] :bug: Fix tests for remove swap slots --- common/test/common_tests/helpers/ids_map.cljc | 2 +- .../common_tests/logic/comp_remove_swap_slots_test.cljc | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/common/test/common_tests/helpers/ids_map.cljc b/common/test/common_tests/helpers/ids_map.cljc index 8eb8536eb..ccbbdb542 100644 --- a/common/test/common_tests/helpers/ids_map.cljc +++ b/common/test/common_tests/helpers/ids_map.cljc @@ -40,4 +40,4 @@ (filter #(= id (val %))) (map key) (first)) - (str ""))) + (str ""))) diff --git a/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc b/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc index 17c534c22..51a0fa008 100644 --- a/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc +++ b/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc @@ -17,7 +17,8 @@ [common-tests.helpers.compositions :as tho] [common-tests.helpers.files :as thf] [common-tests.helpers.ids-map :as thi] - [common-tests.helpers.shapes :as ths])) + [common-tests.helpers.shapes :as ths] + [cuerdas.core :as str])) (t/use-fixtures :each thi/test-fixture) @@ -31,7 +32,7 @@ ;; :red-copy-green [:name Frame1] @--> :frame-red ;; {:frame-b1} [:name Frame1] # [Component :b1] ;; :blue1 [:name Frame1, :swap-slot-label :red-copy] @--> :frame-blue - ;; :frame-yellow [:name Frame1] + ;; :frame-yellow [:name Frame1] ;; :green-copy [:name Frame1] @--> :frame-green ;; :blue-copy-in-green-copy [:name Frame1, :swap-slot-label :red-copy-green] @--> :frame-blue ;; {:frame-b2} [:name Frame1] # [Component :b2] @@ -355,7 +356,7 @@ (->> (vals (:objects page)) (filter #(and (= (:name %) (:name original-shape)) (= (:parent-id %) (:parent-id original-shape)) - (nil? (thi/label (:id %))))) + (str/starts-with? (thi/label (:id %)) " Date: Tue, 7 May 2024 17:01:01 +0200 Subject: [PATCH 0519/1266] :white_check_mark: Add tests for reset components --- .../common_tests/logic/comp_reset_test.cljc | 343 ++++++++++ .../logic/components_touched_test.cljc | 51 +- .../state_components_sync_test.cljs | 592 ------------------ 3 files changed, 387 insertions(+), 599 deletions(-) create mode 100644 common/test/common_tests/logic/comp_reset_test.cljc diff --git a/common/test/common_tests/logic/comp_reset_test.cljc b/common/test/common_tests/logic/comp_reset_test.cljc new file mode 100644 index 000000000..22c4a9538 --- /dev/null +++ b/common/test/common_tests/logic/comp_reset_test.cljc @@ -0,0 +1,343 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns common-tests.logic.comp-reset-test + (:require + [app.common.files.changes-builder :as pcb] + [app.common.logic.libraries :as cll] + [app.common.logic.shapes :as cls] + [clojure.test :as t] + [common-tests.helpers.components :as thc] + [common-tests.helpers.compositions :as tho] + [common-tests.helpers.files :as thf] + [common-tests.helpers.ids-map :as thi] + [common-tests.helpers.shapes :as ths])) + +(t/use-fixtures :each thi/test-fixture) + +(t/deftest test-reset-after-changing-attribute + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (tho/add-simple-component-with-copy :component1 + :main-root + :main-child + :copy-root + :main-child-params {:fills (ths/sample-fills-color + :fill-color "#abcdef")})) + page (thf/current-page file) + copy-root (ths/get-shape file :copy-root) + + ;; ==== Action + update-fn (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) + + changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) + (:shapes copy-root) + update-fn + (:objects page) + {}) + + file-mdf (thf/apply-changes file changes) + page-mdf (thf/current-page file-mdf) + + changes (cll/generate-reset-component (pcb/empty-changes) + file-mdf + {(:id file-mdf) file-mdf} + page-mdf + (:id copy-root) + true) + + file' (thf/apply-changes file changes) + + ;; ==== Get + copy-root' (ths/get-shape file' :copy-root) + copy-child' (ths/get-shape-by-id file' (first (:shapes copy-root'))) + fills' (:fills copy-child') + fill' (first fills')] + + ;; ==== Check + (t/is (= (count fills') 1)) + (t/is (= (:fill-color fill') "#abcdef")) + (t/is (= (:fill-opacity fill') 1)) + (t/is (= (:touched copy-root') nil)) + (t/is (= (:touched copy-child') nil)))) + +(t/deftest test-reset-from-library + (let [;; ==== Setup + library (-> (thf/sample-file :library :is-shared true) + (tho/add-simple-component :component1 :main-root :main-child + :child-params {:fills (ths/sample-fills-color + :fill-color "#abcdef")})) + + file (-> (thf/sample-file :file) + (thc/instantiate-component :component1 :copy-root :library library)) + + page (thf/current-page file) + copy-root (ths/get-shape file :copy-root) + + ;; ==== Action + update-fn (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) + + changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) + (:shapes copy-root) + update-fn + (:objects page) + {}) + + file-mdf (thf/apply-changes file changes) + page-mdf (thf/current-page file-mdf) + + changes (cll/generate-reset-component (pcb/empty-changes) + file-mdf + {(:id file-mdf) file-mdf + (:id library) library} + page-mdf + (:id copy-root) + true) + + file' (thf/apply-changes file changes) + + ;; ==== Get + copy-root' (ths/get-shape file' :copy-root) + copy-child' (ths/get-shape-by-id file' (first (:shapes copy-root'))) + fills' (:fills copy-child') + fill' (first fills')] + + ;; ==== Check + (t/is (= (count fills') 1)) + (t/is (= (:fill-color fill') "#abcdef")) + (t/is (= (:fill-opacity fill') 1)) + (t/is (= (:touched copy-root') nil)) + (t/is (= (:touched copy-child') nil)))) + +(t/deftest test-reset-after-adding-shape + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (tho/add-simple-component-with-copy :component1 + :main-root + :main-child + :copy-root) + (ths/add-sample-shape :free-shape)) + + page (thf/current-page file) + copy-root (ths/get-shape file :copy-root) + + ;; ==== Action + + ;; IMPORTANT: as modifying copies structure is now forbidden, this action + ;; will not have any effect, and so the parent shape won't also be touched. + changes (cls/generate-relocate-shapes (pcb/empty-changes) + (:objects page) + #{(:parent-id copy-root)} ; parents + (thi/id :copy-root) ; parent-id + (:id page) ; page-id + 0 ; to-index + #{(thi/id :free-shape)}) ; ids + + file-mdf (thf/apply-changes file changes) + page-mdf (thf/current-page file-mdf) + + changes (cll/generate-reset-component (pcb/empty-changes) + file-mdf + {(:id file-mdf) file-mdf} + page-mdf + (:id copy-root) + true) + + file' (thf/apply-changes file changes) + + ;; ==== Get + copy-root' (ths/get-shape file' :copy-root) + copy-child' (ths/get-shape-by-id file' (first (:shapes copy-root')))] + + ;; ==== Check + (t/is (= (:touched copy-root') nil)) + (t/is (= (:touched copy-child') nil)))) + +(t/deftest test-reset-after-deleting-shape + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (tho/add-simple-component-with-copy :component1 + :main-root + :main-child + :copy-root)) + + page (thf/current-page file) + copy-root (ths/get-shape file :copy-root) + + ;; ==== Action + + ;; IMPORTANT: as modifying copies structure is now forbidden, this action will not + ;; delete the child shape, but hide it (thus setting the visibility group). + [_all-parents changes] + (cls/generate-delete-shapes (pcb/empty-changes) + file + page + (:objects page) + (set (:shapes copy-root)) + {:components-v2 true}) + + file-mdf (thf/apply-changes file changes) + page-mdf (thf/current-page file-mdf) + + changes (cll/generate-reset-component (pcb/empty-changes) + file-mdf + {(:id file-mdf) file-mdf} + page-mdf + (:id copy-root) + true) + + file' (thf/apply-changes file changes) + + ;; ==== Get + copy-root' (ths/get-shape file' :copy-root) + copy-child' (ths/get-shape-by-id file' (first (:shapes copy-root')))] + + ;; ==== Check + (t/is (= (:touched copy-root') nil)) + (t/is (= (:touched copy-child') nil)))) + +(t/deftest test-reset-after-moving-shape + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (tho/add-component-with-many-children-and-copy :component1 + :main-root + [:main-child1 :main-child2 :main-child3] + :copy-root) + (ths/add-sample-shape :free-shape)) + + page (thf/current-page file) + copy-root (ths/get-shape file :copy-root) + copy-child1 (ths/get-shape-by-id file (first (:shapes copy-root))) + + ;; ==== Action + + ;; IMPORTANT: as modifying copies structure is now forbidden, this action + ;; will not have any effect, and so the parent shape won't also be touched. + changes (cls/generate-relocate-shapes (pcb/empty-changes) + (:objects page) + #{(:parent-id copy-child1)} ; parents + (thi/id :copy-root) ; parent-id + (:id page) ; page-id + 2 ; to-index + #{(:id copy-child1)}) ; ids + + file-mdf (thf/apply-changes file changes) + page-mdf (thf/current-page file-mdf) + + changes (cll/generate-reset-component (pcb/empty-changes) + file-mdf + {(:id file-mdf) file-mdf} + page-mdf + (:id copy-root) + true) + + file' (thf/apply-changes file changes) + + ;; ==== Get + copy-root' (ths/get-shape file' :copy-root) + copy-child' (ths/get-shape-by-id file' (first (:shapes copy-root')))] + + ;; ==== Check + (t/is (= (:touched copy-root') nil)) + (t/is (= (:touched copy-child') nil)))) + +(t/deftest test-reset-after-changing-upper + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (tho/add-nested-component-with-copy :component1 + :main1-root + :main1-child + :component2 + :main2-root + :main2-nested-head + :copy2-root + :main2-root-params {:fills (ths/sample-fills-color + :fill-color "#abcdef")})) + page (thf/current-page file) + copy2-root (ths/get-shape file :copy2-root) + + ;; ==== Action + update-fn (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) + + changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) + #{(:id copy2-root)} + update-fn + (:objects page) + {}) + + file-mdf (thf/apply-changes file changes) + page-mdf (thf/current-page file-mdf) + + changes (cll/generate-reset-component (pcb/empty-changes) + file-mdf + {(:id file-mdf) file-mdf} + page-mdf + (:id copy2-root) + true) + + file' (thf/apply-changes file changes) + + ;; ==== Get + copy2-root' (ths/get-shape file' :copy2-root) + fills' (:fills copy2-root') + fill' (first fills')] + + ;; ==== Check + (t/is (= (count fills') 1)) + (t/is (= (:fill-color fill') "#abcdef")) + (t/is (= (:fill-opacity fill') 1)) + (t/is (= (:touched copy2-root') nil)))) + +(t/deftest test-reset-after-changing-lower + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (tho/add-nested-component-with-copy :component1 + :main1-root + :main1-child + :component2 + :main2-root + :main2-nested-head + :copy2-root)) + page (thf/current-page file) + copy2-root (ths/get-shape file :copy2-root) + + ;; ==== Action + update-fn (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) + + changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) + (:shapes copy2-root) + update-fn + (:objects page) + {}) + + file-mdf (thf/apply-changes file changes) + page-mdf (thf/current-page file-mdf) + + changes (cll/generate-reset-component (pcb/empty-changes) + file-mdf + {(:id file-mdf) file-mdf} + page-mdf + (:id copy2-root) + true) + + file' (thf/apply-changes file changes) + + ;; ==== Get + copy2-root' (ths/get-shape file' :copy2-root) + copy2-child' (ths/get-shape-by-id file' (first (:shapes copy2-root'))) + fills' (:fills copy2-child') + fill' (first fills')] + + ;; ==== Check + (t/is (= (count fills') 1)) + (t/is (= (:fill-color fill') "#FFFFFF")) + (t/is (= (:fill-opacity fill') 1)) + (t/is (= (:touched copy2-root') nil)) + (t/is (= (:touched copy2-child') nil)))) \ No newline at end of file diff --git a/common/test/common_tests/logic/components_touched_test.cljc b/common/test/common_tests/logic/components_touched_test.cljc index c7bc5bd62..426e9c3cb 100644 --- a/common/test/common_tests/logic/components_touched_test.cljc +++ b/common/test/common_tests/logic/components_touched_test.cljc @@ -9,6 +9,7 @@ [app.common.files.changes-builder :as pcb] [app.common.logic.shapes :as cls] [clojure.test :as t] + [common-tests.helpers.components :as thc] [common-tests.helpers.compositions :as tho] [common-tests.helpers.files :as thf] [common-tests.helpers.ids-map :as thi] @@ -53,6 +54,44 @@ (t/is (= (:touched copy-root') nil)) (t/is (= (:touched copy-child') #{:fill-group})))) +(t/deftest test-touched-from-library + (let [;; ==== Setup + library (-> (thf/sample-file :library :is-shared true) + (tho/add-simple-component :component1 :main-root :main-child + :child-params {:fills (ths/sample-fills-color + :fill-color "#abcdef")})) + + file (-> (thf/sample-file :file) + (thc/instantiate-component :component1 :copy-root :library library)) + + page (thf/current-page file) + copy-root (ths/get-shape file :copy-root) + + ;; ==== Action + update-fn (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) + + changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) + (:shapes copy-root) + update-fn + (:objects page) + {}) + + file' (thf/apply-changes file changes) + + ;; ==== Get + copy-root' (ths/get-shape file' :copy-root) + copy-child' (ths/get-shape-by-id file' (first (:shapes copy-root'))) + fills' (:fills copy-child') + fill' (first fills')] + + ;; ==== Check + (t/is (= (count fills') 1)) + (t/is (= (:fill-color fill') "#fabada")) + (t/is (= (:fill-opacity fill') 1)) + (t/is (= (:touched copy-root') nil)) + (t/is (= (:touched copy-child') #{:fill-group})))) + (t/deftest test-not-touched-when-adding-shape (let [;; ==== Setup file (-> (thf/sample-file :file1) @@ -87,7 +126,7 @@ (t/is (= (:touched copy-root') nil)) (t/is (= (:touched copy-child') nil)))) -(t/deftest test-touched-when-deleting-shape +(t/deftest test-not-touched-when-deleting-shape (let [;; ==== Setup file (-> (thf/sample-file :file1) (tho/add-simple-component-with-copy :component1 @@ -165,8 +204,8 @@ :main2-root :main2-nested-head :copy2-root - :root2-params {:fills (ths/sample-fills-color - :fill-color "#abcdef")})) + :main2-root-params {:fills (ths/sample-fills-color + :fill-color "#abcdef")})) page (thf/current-page file) copy2-root (ths/get-shape file :copy2-root) @@ -202,9 +241,7 @@ :component2 :main2-root :main2-nested-head - :copy2-root - :nested-head-params {:fills (ths/sample-fills-color - :fill-color "#abcdef")})) + :copy2-root)) page (thf/current-page file) copy2-root (ths/get-shape file :copy2-root) @@ -231,4 +268,4 @@ (t/is (= (:fill-color fill') "#fabada")) (t/is (= (:fill-opacity fill') 1)) (t/is (= (:touched copy2-root') nil)) - (t/is (= (:touched copy2-child') #{:fill-group})))) \ No newline at end of file + (t/is (= (:touched copy2-child') #{:fill-group})))) diff --git a/frontend/test/frontend_tests/state_components_sync_test.cljs b/frontend/test/frontend_tests/state_components_sync_test.cljs index 7907f4ddd..381669c6a 100644 --- a/frontend/test/frontend_tests/state_components_sync_test.cljs +++ b/frontend/test/frontend_tests/state_components_sync_test.cljs @@ -21,598 +21,6 @@ (t/use-fixtures :each {:before thp/reset-idmap!}) -;; === Test reset changes ====================== - -(t/deftest test-reset-changes - (t/async done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1" - :fill-color clr/white - :fill-opacity 1}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)]) - (thp/instantiate-component :instance1 - (thp/id :component1))) - - [instance1 shape1'] - (thl/resolve-instance state (thp/id :instance1)) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Rect 1 - ;; Rect 1 - ;; Rect 1 #--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; - ;; - ;; [Rect 1] - ;; page1 / Rect 1 - ;; - (let [[[group shape1] [c-group c-shape1] _component] - (thl/resolve-instance-and-main - new-state - (:id instance1))] - - (t/is (= (:name group) "Rect 1")) - (t/is (= (:touched group) nil)) - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:fill-color shape1) clr/white)) - (t/is (= (:fill-opacity shape1) 1)) - (t/is (= (:touched shape1) nil)) - - (t/is (= (:name c-group) "Rect 1")) - (t/is (= (:touched c-group) nil)) - (t/is (= (:name c-shape1) "Rect 1")) - (t/is (= (:fill-color c-shape1) clr/white)) - (t/is (= (:fill-opacity c-shape1) 1)) - (t/is (= (:touched c-shape1) nil)))))] - - (ptk/emit! - store - (dch/update-shapes [(:id shape1')] - (fn [shape] - (merge shape {:fill-color clr/test - :fill-opacity 0.5}))) - (dwl/reset-component (:id instance1)) - :the/end)))) - -(t/deftest test-reset-children-add - (t/async done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1" - :fill-color clr/white - :fill-opacity 1}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)]) - (thp/instantiate-component :instance1 - (thp/id :component1)) - (thp/sample-shape :shape2 :circle - {:name "Circle 1"})) - - instance1 (thp/get-shape state :instance1) - shape2 (thp/get-shape state :shape2) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Rect 1 - ;; Rect 1 - ;; Rect 1 #--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; - ;; [Rect 1] - ;; page1 / Rect 1 - ;; - (let [[[group shape1] [c-group c-shape1] _component] - (thl/resolve-instance-and-main - new-state - (thp/id :instance1))] - - (t/is (= (:name group) "Rect 1")) - (t/is (= (:touched group) nil)) - (t/is (not= (:shape-ref group) nil)) - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:touched shape1) nil)) - (t/is (not= (:shape-ref shape1) nil)) - - (t/is (= (:name c-group) "Rect 1")) - (t/is (= (:touched c-group) nil)) - (t/is (= (:shape-ref c-group) nil)) - (t/is (= (:name c-shape1) "Rect 1")) - (t/is (= (:touched c-shape1) nil)) - (t/is (= (:shape-ref c-shape1) nil)))))] - - (ptk/emit! - store - (dw/relocate-shapes #{(:id shape2)} (:id instance1) 0) - (dwl/reset-component (:id instance1)) - :the/end)))) - -(t/deftest test-reset-children-delete - (t/async done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1"}) - (thp/sample-shape :shape2 :rect - {:name "Rect 2"}) - (thp/make-component :main1 :component1 - [(thp/id :shape1) - (thp/id :shape2)]) - (thp/instantiate-component :instance1 - (thp/id :component1))) - - [instance1 shape1'] - (thl/resolve-instance state (thp/id :instance1)) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Component 1 - ;; Rect 1 - ;; Rect 2 - ;; Component 1 #--> Component 1 - ;; Rect 1 ---> Rect 1 - ;; Rect 2 ---> Rect 2 - ;; - ;; [Component 1] - ;; page1 / Component 1 - ;; - (let [[[group shape1 shape2] - [c-group c-shape1 c-shape2] _component] - (thl/resolve-instance-and-main - new-state - (thp/id :instance1))] - - (t/is (= (:name group) "Component 1")) - (t/is (= (:touched group) nil)) - (t/is (not= (:shape-ref group) nil)) - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:touched shape1) nil)) - (t/is (not= (:shape-ref shape1) nil)) - (t/is (= (:name shape2) "Rect 2")) - (t/is (= (:touched shape2) nil)) - (t/is (not= (:shape-ref shape2) nil)) - - (t/is (= (:name c-group) "Component 1")) - (t/is (= (:touched c-group) nil)) - (t/is (= (:shape-ref c-group) nil)) - (t/is (= (:name c-shape1) "Rect 1")) - (t/is (= (:touched c-shape1) nil)) - (t/is (= (:shape-ref c-shape1) nil)) - (t/is (= (:name c-shape2) "Rect 2")) - (t/is (= (:touched c-shape2) nil)) - (t/is (= (:shape-ref c-shape2) nil)))))] - - (ptk/emit! - store - (dwsh/delete-shapes #{(:id shape1')}) - (dwl/reset-component (:id instance1)) - :the/end)))) - -(t/deftest test-reset-children-move - (t/async done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1"}) - (thp/sample-shape :shape2 :rect - {:name "Rect 2"}) - (thp/sample-shape :shape3 :rect - {:name "Rect 3"}) - (thp/make-component :main1 :component1 - [(thp/id :shape1) - (thp/id :shape2) - (thp/id :shape3)]) - (thp/instantiate-component :instance1 - (thp/id :component1))) - - [instance1 shape1'] - (thl/resolve-instance state (thp/id :instance1)) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Component 1 - ;; Rect 1 - ;; Rect 2 - ;; Rect 3 - ;; Component 1 #--> Component 1 - ;; Rect 1 ---> Rect 1 - ;; Rect 2 ---> Rect 2 - ;; Rect 3 ---> Rect 3 - ;; - ;; [Component 1] - ;; page1 / Component 1 - ;; - (let [[[group shape1 shape2 shape3] [c-group c-shape1 c-shape2 c-shape3] _component] - (thl/resolve-instance-and-main - new-state - (thp/id :instance1))] - - (t/is (= (:name group) "Component 1")) - (t/is (= (:touched group) nil)) - (t/is (not= (:shape-ref group) nil)) - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:touched shape1) nil)) - (t/is (not= (:shape-ref shape1) nil)) - (t/is (= (:name shape2) "Rect 2")) - (t/is (= (:touched shape2) nil)) - (t/is (not= (:shape-ref shape2) nil)) - (t/is (= (:name shape3) "Rect 3")) - (t/is (= (:touched shape3) nil)) - (t/is (not= (:shape-ref shape3) nil)) - - (t/is (= (:name c-group) "Component 1")) - (t/is (= (:touched c-group) nil)) - (t/is (= (:shape-ref c-group) nil)) - (t/is (= (:name c-shape1) "Rect 1")) - (t/is (= (:touched c-shape1) nil)) - (t/is (= (:shape-ref c-shape1) nil)) - (t/is (= (:name c-shape2) "Rect 2")) - (t/is (= (:touched c-shape2) nil)) - (t/is (= (:shape-ref c-shape2) nil)) - (t/is (= (:name c-shape3) "Rect 3")) - (t/is (= (:touched c-shape3) nil)) - (t/is (= (:shape-ref c-shape3) nil)))))] - - (ptk/emit! - store - (dw/relocate-shapes #{(:id shape1')} (:id instance1) 2) - (dwl/reset-component (:id instance1)) - :the/end)))) - -(t/deftest test-reset-from-lib - (t/async done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1" - :fill-color clr/white - :fill-opacity 1}) - (thp/make-component :instance1 :component1 - [(thp/id :shape1)]) - (thp/move-to-library :lib1 "Library 1") - (thp/sample-page) - (thp/instantiate-component :instance2 - (thp/id :component1) - (thp/id :lib1))) - - [instance2 shape2] - (thl/resolve-instance state (thp/id :instance2)) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Rect 1 #--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; - (let [[[group shape1] [c-group c-shape1] _component] - (thl/resolve-instance-and-main - new-state - (:id instance2))] - - (t/is (= (:name group) "Rect 1")) - (t/is (= (:touched group) nil)) - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:fill-color shape1) clr/white)) - (t/is (= (:fill-opacity shape1) 1)) - (t/is (= (:touched shape1) nil)) - - (t/is (= (:name c-group) "Rect 1")) - (t/is (= (:touched c-group) nil)) - (t/is (= (:name c-shape1) "Rect 1")) - (t/is (= (:fill-color c-shape1) clr/white)) - (t/is (= (:fill-opacity c-shape1) 1)) - (t/is (= (:touched c-shape1) nil)))))] - - (ptk/emit! - store - (dch/update-shapes [(:id shape2)] - (fn [shape] - (merge shape {:fill-color clr/test - :fill-opacity 0.5}))) - (dwl/reset-component (:id instance2)) - :the/end)))) - -(t/deftest test-reset-nested-upper - (t/async done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1" - :fill-color clr/white - :fill-opacity 1}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)]) - (thp/instantiate-component :instance1 - (thp/id :component1)) - (thp/sample-shape :shape2 :circle - {:name "Circle 1" - :fill-color clr/black - :fill-opacity 0}) - (thp/frame-shapes :frame1 - [(thp/id :instance1) - (thp/id :shape2)]) - (thp/make-component :main2 :component2 - [(thp/id :frame1)]) - (thp/instantiate-component :instance2 - (thp/id :component2))) - - [instance2 _instance1 shape1' _shape2'] - (thl/resolve-instance state (thp/id :instance2)) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Rect 1 - ;; Rect 1 - ;; Group - ;; Rect 1 #--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; Circle 1 - ;; Group #--> Group - ;; Rect 1 @--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; Circle 1 ---> Circle 1 - ;; - ;; [Rect 1] - ;; page1 / Rect 1 - ;; - ;; [Group] - ;; page1 / Group - ;; - (let [[[instance2 instance1 shape1 shape2] - [c-instance2 c-instance1 c-shape1 c-shape2] _component] - (thl/resolve-instance-and-main - new-state - (thp/id :instance2))] - - (t/is (= (:name instance2) "Board")) - (t/is (= (:touched instance2) nil)) - (t/is (= (:name instance1) "Rect 1")) - (t/is (= (:touched instance1) nil)) - (t/is (= (:name shape1) "Circle 1")) - (t/is (= (:touched shape1) nil)) - (t/is (= (:fill-color shape1) clr/black)) - (t/is (= (:fill-opacity shape1) 0)) - (t/is (= (:name shape2) "Rect 1")) - (t/is (= (:touched shape2) nil)) - (t/is (= (:fill-color shape2) clr/white)) - (t/is (= (:fill-opacity shape2) 1)) - - (t/is (= (:name c-instance2) "Board")) - (t/is (= (:touched c-instance2) nil)) - (t/is (= (:name c-instance1) "Rect 1")) - (t/is (= (:touched c-instance1) nil)) - (t/is (= (:name c-shape1) "Circle 1")) - (t/is (= (:touched c-shape1) nil)) - (t/is (= (:fill-color c-shape1) clr/black)) - (t/is (= (:fill-opacity c-shape1) 0)) - (t/is (= (:name c-shape2) "Rect 1")) - (t/is (= (:touched c-shape2) nil)) - (t/is (= (:fill-color c-shape2) clr/white)) - (t/is (= (:fill-opacity c-shape2) 1)))))] - - (ptk/emit! - store - (dch/update-shapes [(:id shape1')] - (fn [shape] - (merge shape {:fill-color clr/test - :fill-opacity 0.5}))) - (dwl/reset-component (:id instance2)) - :the/end)))) - -;; (t/deftest test-reset-nested-lower-near -;; (t/async done -;; (let [state (-> thp/initial-state -;; (thp/sample-page) -;; (thp/sample-shape :shape1 :rect -;; {:name "Rect 1" -;; :fill-color clr/white -;; :fill-opacity 1}) -;; (thp/make-component :main1 :component1 -;; [(thp/id :shape1)]) -;; (thp/instantiate-component :instance1 -;; (thp/id :component1)) -;; (thp/sample-shape :shape2 :circle -;; {:name "Circle 1" -;; :fill-color clr/black -;; :fill-opacity 0}) -;; (thp/frame-shapes :frame1 -;; [(thp/id :instance1) -;; (thp/id :shape2)]) -;; (thp/make-component :instance2 :component2 -;; [(thp/id :frame1)]) -;; (thp/instantiate-component :instance2 -;; (thp/id :component2))) -;; -;; [instance2 instance1 _shape1' shape2'] -;; (thl/resolve-instance state (thp/id :instance2)) -;; -;; store (the/prepare-store state done -;; (fn [new-state] -;; ;; Expected shape tree: -;; ;; -;; ;; [Page] -;; ;; Root Frame -;; ;; Rect 1 -;; ;; Rect 1 -;; ;; Group -;; ;; Rect 1 #--> Rect 1 -;; ;; Rect 1 ---> Rect 1 -;; ;; Circle 1 -;; ;; Group #--> Group -;; ;; Rect 1 @--> Rect 1 -;; ;; Rect 1 ---> Rect 1 -;; ;; Circle 1 ---> Circle 1 -;; ;; -;; ;; [Rect 1] -;; ;; page1 / Rect 1 -;; ;; -;; ;; [Group] -;; ;; page1 / Group -;; ;; -;; (let [[[instance2 instance1 shape1 shape2] -;; [c-instance2 c-instance1 c-shape1 c-shape2] _component] -;; (thl/resolve-instance-and-main -;; new-state -;; (thp/id :instance2))] -;; -;; (t/is (= (:name instance2) "Board")) -;; (t/is (= (:touched instance2) nil)) -;; (t/is (= (:name instance1) "Rect 1")) -;; (t/is (= (:touched instance1) nil)) -;; (t/is (= (:name shape1) "Circle 1")) -;; (t/is (= (:touched shape1) nil)) -;; (t/is (= (:fill-color shape1) clr/black)) -;; (t/is (= (:fill-opacity shape1) 0)) -;; (t/is (= (:name shape2) "Rect 1")) -;; (t/is (= (:touched shape2) nil)) -;; (t/is (= (:fill-color shape2) clr/white)) -;; (t/is (= (:fill-opacity shape2) 1)) -;; -;; (t/is (= (:name c-instance2) "Board")) -;; (t/is (= (:touched c-instance2) nil)) -;; (t/is (= (:name c-instance1) "Rect 1")) -;; (t/is (= (:touched c-instance1) nil)) -;; (t/is (= (:name c-shape1) "Circle 1")) -;; (t/is (= (:touched c-shape1) nil)) -;; (t/is (= (:fill-color c-shape1) clr/black)) -;; (t/is (= (:fill-opacity c-shape1) 0)) -;; (t/is (= (:name c-shape2) "Rect 1")) -;; (t/is (= (:touched c-shape2) nil)) -;; (t/is (= (:fill-color c-shape2) clr/white)) -;; (t/is (= (:fill-opacity c-shape2) 1)))))] -;; -;; (ptk/emit! -;; store -;; (dch/update-shapes [(:id shape2')] -;; (fn [shape] -;; (merge shape {:fill-color clr/test -;; :fill-opacity 0.5}))) -;; (dwl/update-component (:id instance1)) -;; (dwl/reset-component (:id instance2)) -;; :the/end)))) - -(t/deftest test-reset-nested-lower-remote - (t/async done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1" - :fill-color clr/white - :fill-opacity 1}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)]) - (thp/instantiate-component :instance1 - (thp/id :component1)) - (thp/sample-shape :shape2 :circle - {:name "Circle 1" - :fill-color clr/black - :fill-opacity 0}) - (thp/frame-shapes :frame1 - [(thp/id :instance1) - (thp/id :shape2)]) - (thp/make-component :instance2 :component2 - [(thp/id :frame1)]) - (thp/instantiate-component :instance2 - (thp/id :component2))) - - [instance2 instance1 _shape1' shape2'] - (thl/resolve-instance state (thp/id :instance2)) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Rect 1 - ;; Rect 1 - ;; Group - ;; Rect 1 #--> Rect 1 - ;; Rect 1* ---> Rect 1 - ;; #{:fill-group} - ;; Circle 1 - ;; Group #--> Group - ;; Rect 1 @--> Rect 1 - ;; (remote-synced) - ;; Rect 1 ---> Rect 1 - ;; (remote-synced) - ;; Circle 1 ---> Circle 1 - ;; - ;; [Rect 1] - ;; page1 / Rect 1 - ;; - ;; [Group] - ;; page1 / Group - ;; - (let [[[instance2 instance1 shape1 shape2] - [c-instance2 c-instance1 c-shape1 c-shape2] _component] - (thl/resolve-instance-and-main - new-state - (thp/id :instance2))] - - (t/is (= (:name instance2) "Board")) - (t/is (= (:touched instance2) nil)) - (t/is (= (:name instance1) "Rect 1")) - (t/is (= (:touched instance1) nil)) - (t/is (= (:name shape1) "Circle 1")) - (t/is (= (:touched shape1) nil)) - (t/is (= (:fill-color shape1) clr/black)) - (t/is (= (:fill-opacity shape1) 0)) - (t/is (= (:name shape2) "Rect 1")) - (t/is (= (:touched shape2) nil)) - (t/is (= (:fill-color shape2) clr/test)) - (t/is (= (:fill-opacity shape2) 0.5)) - - (t/is (= (:name c-instance2) "Board")) - (t/is (= (:touched c-instance2) nil)) - (t/is (= (:name c-instance1) "Rect 1")) - (t/is (= (:touched c-instance1) nil)) - (t/is (= (:name c-shape1) "Circle 1")) - (t/is (= (:touched c-shape1) nil)) - (t/is (= (:fill-color c-shape1) clr/black)) - (t/is (= (:fill-opacity c-shape1) 0)) - (t/is (= (:name c-shape2) "Rect 1")) - (t/is (= (:touched c-shape2) #{:fill-group})) - (t/is (= (:fill-color c-shape2) clr/test)) - (t/is (= (:fill-opacity c-shape2) 0.5)))))] - - (ptk/emit! - store - (dch/update-shapes [(:id shape2')] - (fn [shape] - (merge shape {:fill-color clr/test - :fill-opacity 0.5}))) - (dwl/update-component (:id instance2)) - (dwl/reset-component (:id instance1)) - :the/end)))) - ;; === Test update component ====================== (t/deftest test-update-component -- Gitee From 8b4e52a2be51772b04b3ca643dd73a2d85fc3592 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Tue, 7 May 2024 18:07:03 +0200 Subject: [PATCH 0520/1266] :lipstick: Improve copy child selection and test robustness --- .../test/common_tests/helpers/components.cljc | 1 + .../common_tests/helpers/compositions.cljc | 6 +- ...tion_test.cljc => comp_creation_test.cljc} | 2 +- .../common_tests/logic/comp_reset_test.cljc | 106 ++++++++++------ ...uched_test.cljc => comp_touched_test.cljc} | 119 ++++++++++-------- 5 files changed, 140 insertions(+), 94 deletions(-) rename common/test/common_tests/logic/{component_creation_test.cljc => comp_creation_test.cljc} (97%) rename common/test/common_tests/logic/{components_touched_test.cljc => comp_touched_test.cljc} (71%) diff --git a/common/test/common_tests/helpers/components.cljc b/common/test/common_tests/helpers/components.cljc index 56ebf488d..a8657c325 100644 --- a/common/test/common_tests/helpers/components.cljc +++ b/common/test/common_tests/helpers/components.cljc @@ -129,6 +129,7 @@ (when children-labels (dotimes [idx (count children-labels)] (set-child-label file' copy-root-label idx (nth children-labels idx)))) + file')) (defn component-swap diff --git a/common/test/common_tests/helpers/compositions.cljc b/common/test/common_tests/helpers/compositions.cljc index cf1a02d9a..21f4217d0 100644 --- a/common/test/common_tests/helpers/compositions.cljc +++ b/common/test/common_tests/helpers/compositions.cljc @@ -140,8 +140,8 @@ component2-params))) (defn add-nested-component-with-copy - [file component1-label main1-root-label main1-child-label component2-label main2-root-label nested-head-label copy2-label - & {:keys [component1-params root1-params main1-child-params component2-params main2-root-params nested-head-params copy2-params]}] + [file component1-label main1-root-label main1-child-label component2-label main2-root-label nested-head-label copy2-root-label + & {:keys [component1-params root1-params main1-child-params component2-params main2-root-params nested-head-params copy2-root-params]}] ;; Generated shape tree: ;; {:main1-root-label} [:name: Frame1] # [Component :component1-label] ;; :main1-child-label [:name: Rect1] @@ -166,4 +166,4 @@ :component2-params component2-params :main2-root-params main2-root-params :nested-head-params nested-head-params) - (thc/instantiate-component component2-label copy2-label copy2-params))) \ No newline at end of file + (thc/instantiate-component component2-label copy2-root-label copy2-root-params))) \ No newline at end of file diff --git a/common/test/common_tests/logic/component_creation_test.cljc b/common/test/common_tests/logic/comp_creation_test.cljc similarity index 97% rename from common/test/common_tests/logic/component_creation_test.cljc rename to common/test/common_tests/logic/comp_creation_test.cljc index 13a7533b8..bed320a0a 100644 --- a/common/test/common_tests/logic/component_creation_test.cljc +++ b/common/test/common_tests/logic/comp_creation_test.cljc @@ -4,7 +4,7 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns common-tests.logic.component-creation-test +(ns common-tests.logic.comp-creation-test (:require [app.common.files.changes-builder :as pcb] [app.common.logic.libraries :as cll] diff --git a/common/test/common_tests/logic/comp_reset_test.cljc b/common/test/common_tests/logic/comp_reset_test.cljc index 22c4a9538..fecab3362 100644 --- a/common/test/common_tests/logic/comp_reset_test.cljc +++ b/common/test/common_tests/logic/comp_reset_test.cljc @@ -20,22 +20,24 @@ (t/deftest test-reset-after-changing-attribute (let [;; ==== Setup - file (-> (thf/sample-file :file1) - (tho/add-simple-component-with-copy :component1 - :main-root - :main-child - :copy-root - :main-child-params {:fills (ths/sample-fills-color - :fill-color "#abcdef")})) - page (thf/current-page file) - copy-root (ths/get-shape file :copy-root) + file (-> (thf/sample-file :file1) + (tho/add-simple-component-with-copy :component1 + :main-root + :main-child + :copy-root + :main-child-params {:fills (ths/sample-fills-color + :fill-color "#abcdef")} + :copy-root-params {:children-labels [:copy-child]})) + page (thf/current-page file) + copy-root (ths/get-shape file :copy-root) + copy-child (ths/get-shape file :copy-child) ;; ==== Action update-fn (fn [shape] (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) - (:shapes copy-root) + #{(:id copy-child)} update-fn (:objects page) {}) @@ -54,11 +56,13 @@ ;; ==== Get copy-root' (ths/get-shape file' :copy-root) - copy-child' (ths/get-shape-by-id file' (first (:shapes copy-root'))) + copy-child' (ths/get-shape file' :copy-child) fills' (:fills copy-child') fill' (first fills')] ;; ==== Check + (t/is (some? copy-root')) + (t/is (some? copy-child')) (t/is (= (count fills') 1)) (t/is (= (:fill-color fill') "#abcdef")) (t/is (= (:fill-opacity fill') 1)) @@ -67,23 +71,26 @@ (t/deftest test-reset-from-library (let [;; ==== Setup - library (-> (thf/sample-file :library :is-shared true) - (tho/add-simple-component :component1 :main-root :main-child - :child-params {:fills (ths/sample-fills-color - :fill-color "#abcdef")})) + library (-> (thf/sample-file :library :is-shared true) + (tho/add-simple-component :component1 :main-root :main-child + :child-params {:fills (ths/sample-fills-color + :fill-color "#abcdef")})) - file (-> (thf/sample-file :file) - (thc/instantiate-component :component1 :copy-root :library library)) + file (-> (thf/sample-file :file) + (thc/instantiate-component :component1 :copy-root + :library library + :children-labels [:copy-child])) - page (thf/current-page file) - copy-root (ths/get-shape file :copy-root) + page (thf/current-page file) + copy-root (ths/get-shape file :copy-root) + copy-child (ths/get-shape file :copy-child) ;; ==== Action update-fn (fn [shape] (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) - (:shapes copy-root) + #{(:id copy-child)} update-fn (:objects page) {}) @@ -103,11 +110,13 @@ ;; ==== Get copy-root' (ths/get-shape file' :copy-root) - copy-child' (ths/get-shape-by-id file' (first (:shapes copy-root'))) + copy-child' (ths/get-shape file' :copy-child) fills' (:fills copy-child') fill' (first fills')] ;; ==== Check + (t/is (some? copy-root')) + (t/is (some? copy-child')) (t/is (= (count fills') 1)) (t/is (= (:fill-color fill') "#abcdef")) (t/is (= (:fill-opacity fill') 1)) @@ -120,7 +129,8 @@ (tho/add-simple-component-with-copy :component1 :main-root :main-child - :copy-root) + :copy-root + :copy-root-params {:children-labels [:copy-child]}) (ths/add-sample-shape :free-shape)) page (thf/current-page file) @@ -152,9 +162,11 @@ ;; ==== Get copy-root' (ths/get-shape file' :copy-root) - copy-child' (ths/get-shape-by-id file' (first (:shapes copy-root')))] + copy-child' (ths/get-shape file' :copy-child)] ;; ==== Check + (t/is (some? copy-root')) + (t/is (some? copy-child')) (t/is (= (:touched copy-root') nil)) (t/is (= (:touched copy-child') nil)))) @@ -164,10 +176,12 @@ (tho/add-simple-component-with-copy :component1 :main-root :main-child - :copy-root)) + :copy-root + :copy-root-params {:children-labels [:copy-child]})) page (thf/current-page file) copy-root (ths/get-shape file :copy-root) + copy-child (ths/get-shape file :copy-child) ;; ==== Action @@ -178,7 +192,7 @@ file page (:objects page) - (set (:shapes copy-root)) + #{(:id copy-child)} {:components-v2 true}) file-mdf (thf/apply-changes file changes) @@ -195,9 +209,11 @@ ;; ==== Get copy-root' (ths/get-shape file' :copy-root) - copy-child' (ths/get-shape-by-id file' (first (:shapes copy-root')))] + copy-child' (ths/get-shape file' :copy-child)] ;; ==== Check + (t/is (some? copy-root')) + (t/is (some? copy-child')) (t/is (= (:touched copy-root') nil)) (t/is (= (:touched copy-child') nil)))) @@ -207,12 +223,13 @@ (tho/add-component-with-many-children-and-copy :component1 :main-root [:main-child1 :main-child2 :main-child3] - :copy-root) + :copy-root + :copy-root-params {:children-labels [:copy-child]}) (ths/add-sample-shape :free-shape)) page (thf/current-page file) copy-root (ths/get-shape file :copy-root) - copy-child1 (ths/get-shape-by-id file (first (:shapes copy-root))) + copy-child1 (ths/get-shape file :copy-child) ;; ==== Action @@ -240,9 +257,11 @@ ;; ==== Get copy-root' (ths/get-shape file' :copy-root) - copy-child' (ths/get-shape-by-id file' (first (:shapes copy-root')))] + copy-child' (ths/get-shape file' :copy-child)] ;; ==== Check + (t/is (some? copy-root')) + (t/is (some? copy-child')) (t/is (= (:touched copy-root') nil)) (t/is (= (:touched copy-child') nil)))) @@ -289,6 +308,7 @@ fill' (first fills')] ;; ==== Check + (t/is (some? copy2-root')) (t/is (= (count fills') 1)) (t/is (= (:fill-color fill') "#abcdef")) (t/is (= (:fill-opacity fill') 1)) @@ -296,23 +316,25 @@ (t/deftest test-reset-after-changing-lower (let [;; ==== Setup - file (-> (thf/sample-file :file1) - (tho/add-nested-component-with-copy :component1 - :main1-root - :main1-child - :component2 - :main2-root - :main2-nested-head - :copy2-root)) - page (thf/current-page file) - copy2-root (ths/get-shape file :copy2-root) + file (-> (thf/sample-file :file1) + (tho/add-nested-component-with-copy :component1 + :main1-root + :main1-child + :component2 + :main2-root + :main2-nested-head + :copy2-root + :copy2-root-params {:children-labels [:copy2-child]})) + page (thf/current-page file) + copy2-root (ths/get-shape file :copy2-root) + copy2-child (ths/get-shape file :copy2-child) ;; ==== Action update-fn (fn [shape] (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) - (:shapes copy2-root) + #{(:id copy2-child)} update-fn (:objects page) {}) @@ -331,11 +353,13 @@ ;; ==== Get copy2-root' (ths/get-shape file' :copy2-root) - copy2-child' (ths/get-shape-by-id file' (first (:shapes copy2-root'))) + copy2-child' (ths/get-shape file' :copy2-child) fills' (:fills copy2-child') fill' (first fills')] ;; ==== Check + (t/is (some? copy2-root')) + (t/is (some? copy2-child')) (t/is (= (count fills') 1)) (t/is (= (:fill-color fill') "#FFFFFF")) (t/is (= (:fill-opacity fill') 1)) diff --git a/common/test/common_tests/logic/components_touched_test.cljc b/common/test/common_tests/logic/comp_touched_test.cljc similarity index 71% rename from common/test/common_tests/logic/components_touched_test.cljc rename to common/test/common_tests/logic/comp_touched_test.cljc index 426e9c3cb..c4f658fea 100644 --- a/common/test/common_tests/logic/components_touched_test.cljc +++ b/common/test/common_tests/logic/comp_touched_test.cljc @@ -4,7 +4,7 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns common-tests.logic.components-touched-test +(ns common-tests.logic.comp-touched-test (:require [app.common.files.changes-builder :as pcb] [app.common.logic.shapes :as cls] @@ -19,22 +19,23 @@ (t/deftest test-touched-when-changing-attribute (let [;; ==== Setup - file (-> (thf/sample-file :file1) - (tho/add-simple-component-with-copy :component1 - :main-root - :main-child - :copy-root - :main-child-params {:fills (ths/sample-fills-color - :fill-color "#abcdef")})) - page (thf/current-page file) - copy-root (ths/get-shape file :copy-root) + file (-> (thf/sample-file :file1) + (tho/add-simple-component-with-copy :component1 + :main-root + :main-child + :copy-root + :main-child-params {:fills (ths/sample-fills-color + :fill-color "#abcdef")} + :copy-root-params {:children-labels [:copy-child]})) + page (thf/current-page file) + copy-child (ths/get-shape file :copy-child) ;; ==== Action update-fn (fn [shape] (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) - (:shapes copy-root) + #{(:id copy-child)} update-fn (:objects page) {}) @@ -43,11 +44,13 @@ ;; ==== Get copy-root' (ths/get-shape file' :copy-root) - copy-child' (ths/get-shape-by-id file' (first (:shapes copy-root'))) + copy-child' (ths/get-shape file' :copy-child) fills' (:fills copy-child') fill' (first fills')] ;; ==== Check + (t/is (some? copy-root')) + (t/is (some? copy-child')) (t/is (= (count fills') 1)) (t/is (= (:fill-color fill') "#fabada")) (t/is (= (:fill-opacity fill') 1)) @@ -56,23 +59,25 @@ (t/deftest test-touched-from-library (let [;; ==== Setup - library (-> (thf/sample-file :library :is-shared true) - (tho/add-simple-component :component1 :main-root :main-child - :child-params {:fills (ths/sample-fills-color - :fill-color "#abcdef")})) + library (-> (thf/sample-file :library :is-shared true) + (tho/add-simple-component :component1 :main-root :main-child + :child-params {:fills (ths/sample-fills-color + :fill-color "#abcdef")})) - file (-> (thf/sample-file :file) - (thc/instantiate-component :component1 :copy-root :library library)) + file (-> (thf/sample-file :file) + (thc/instantiate-component :component1 :copy-root + :library library + :children-labels [:copy-child])) - page (thf/current-page file) - copy-root (ths/get-shape file :copy-root) + page (thf/current-page file) + copy-child (ths/get-shape file :copy-child) ;; ==== Action update-fn (fn [shape] (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) - (:shapes copy-root) + #{(:id copy-child)} update-fn (:objects page) {}) @@ -81,11 +86,13 @@ ;; ==== Get copy-root' (ths/get-shape file' :copy-root) - copy-child' (ths/get-shape-by-id file' (first (:shapes copy-root'))) + copy-child' (ths/get-shape file' :copy-child) fills' (:fills copy-child') fill' (first fills')] ;; ==== Check + (t/is (some? copy-root')) + (t/is (some? copy-child')) (t/is (= (count fills') 1)) (t/is (= (:fill-color fill') "#fabada")) (t/is (= (:fill-opacity fill') 1)) @@ -94,12 +101,13 @@ (t/deftest test-not-touched-when-adding-shape (let [;; ==== Setup - file (-> (thf/sample-file :file1) - (tho/add-simple-component-with-copy :component1 - :main-root - :main-child - :copy-root) - (ths/add-sample-shape :free-shape)) + file (-> (thf/sample-file :file1) + (tho/add-simple-component-with-copy :component1 + :main-root + :main-child + :copy-root + :copy-root-params {:children-labels [:copy-child]}) + (ths/add-sample-shape :free-shape)) page (thf/current-page file) copy-root (ths/get-shape file :copy-root) @@ -120,9 +128,11 @@ ;; ==== Get copy-root' (ths/get-shape file' :copy-root) - copy-child' (ths/get-shape-by-id file' (first (:shapes copy-root')))] + copy-child' (ths/get-shape file' :copy-child)] ;; ==== Check + (t/is (some? copy-root')) + (t/is (some? copy-child')) (t/is (= (:touched copy-root') nil)) (t/is (= (:touched copy-child') nil)))) @@ -132,10 +142,11 @@ (tho/add-simple-component-with-copy :component1 :main-root :main-child - :copy-root)) + :copy-root + :copy-root-params {:children-labels [:copy-child]})) page (thf/current-page file) - copy-root (ths/get-shape file :copy-root) + copy-child (ths/get-shape file :copy-child) ;; ==== Action @@ -146,16 +157,18 @@ file page (:objects page) - (set (:shapes copy-root)) + #{(:id copy-child)} {:components-v2 true}) file' (thf/apply-changes file changes) ;; ==== Get copy-root' (ths/get-shape file' :copy-root) - copy-child' (ths/get-shape-by-id file' (first (:shapes copy-root')))] + copy-child' (ths/get-shape file' :copy-child)] ;; ==== Check + (t/is (some? copy-root')) + (t/is (some? copy-child')) (t/is (= (:touched copy-root') nil)) (t/is (= (:touched copy-child') #{:visibility-group})))) @@ -165,12 +178,14 @@ (tho/add-component-with-many-children-and-copy :component1 :main-root [:main-child1 :main-child2 :main-child3] - :copy-root) + :copy-root + :copy-root-params {:children-labels [:copy-child1 + :copy-child2 + :copy-child3]}) (ths/add-sample-shape :free-shape)) page (thf/current-page file) - copy-root (ths/get-shape file :copy-root) - copy-child1 (ths/get-shape-by-id file (first (:shapes copy-root))) + copy-child1 (ths/get-shape file :copy-child1) ;; ==== Action @@ -188,9 +203,11 @@ ;; ==== Get copy-root' (ths/get-shape file' :copy-root) - copy-child' (ths/get-shape-by-id file' (first (:shapes copy-root')))] + copy-child' (ths/get-shape file' :copy-child1)] ;; ==== Check + (t/is (some? copy-root')) + (t/is (some? copy-child')) (t/is (= (:touched copy-root') nil)) (t/is (= (:touched copy-child') nil)))) @@ -227,6 +244,7 @@ fill' (first fills')] ;; ==== Check + (t/is (some? copy2-root')) (t/is (= (count fills') 1)) (t/is (= (:fill-color fill') "#fabada")) (t/is (= (:fill-opacity fill') 1)) @@ -234,23 +252,24 @@ (t/deftest test-touched-when-changing-lower (let [;; ==== Setup - file (-> (thf/sample-file :file1) - (tho/add-nested-component-with-copy :component1 - :main1-root - :main1-child - :component2 - :main2-root - :main2-nested-head - :copy2-root)) - page (thf/current-page file) - copy2-root (ths/get-shape file :copy2-root) + file (-> (thf/sample-file :file1) + (tho/add-nested-component-with-copy :component1 + :main1-root + :main1-child + :component2 + :main2-root + :main2-nested-head + :copy2-root + :copy2-root-params {:children-labels [:copy2-child]})) + page (thf/current-page file) + copy2-child (ths/get-shape file :copy2-child) ;; ==== Action update-fn (fn [shape] (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) - (:shapes copy2-root) + #{(:id copy2-child)} update-fn (:objects page) {}) @@ -259,11 +278,13 @@ ;; ==== Get copy2-root' (ths/get-shape file' :copy2-root) - copy2-child' (ths/get-shape-by-id file' (first (:shapes copy2-root'))) + copy2-child' (ths/get-shape file' :copy2-child) fills' (:fills copy2-child') fill' (first fills')] ;; ==== Check + (t/is (some? copy2-root')) + (t/is (some? copy2-child')) (t/is (= (count fills') 1)) (t/is (= (:fill-color fill') "#fabada")) (t/is (= (:fill-opacity fill') 1)) -- Gitee From e28d56e670910de5a81cc9ff269758279f59a9eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Wed, 8 May 2024 14:22:18 +0200 Subject: [PATCH 0521/1266] :sparkles: Add WorkspacePage POM for playwright testing --- .../playwright/ui/pages/BaseWebSocketPage.js | 2 +- frontend/playwright/ui/pages/WorkspacePage.js | 89 +++++++++++++++++++ .../playwright/ui/specs/workspace.spec.js | 46 +++------- 3 files changed, 103 insertions(+), 34 deletions(-) create mode 100644 frontend/playwright/ui/pages/WorkspacePage.js diff --git a/frontend/playwright/ui/pages/BaseWebSocketPage.js b/frontend/playwright/ui/pages/BaseWebSocketPage.js index f76a7f5c4..85700e048 100644 --- a/frontend/playwright/ui/pages/BaseWebSocketPage.js +++ b/frontend/playwright/ui/pages/BaseWebSocketPage.js @@ -8,7 +8,7 @@ export class BaseWebSocketPage extends BasePage { * @param {Page} page * @returns */ - static setupWebSockets(page) { + static initWebSockets(page) { return MockWebSocketHelper.init(page); } diff --git a/frontend/playwright/ui/pages/WorkspacePage.js b/frontend/playwright/ui/pages/WorkspacePage.js new file mode 100644 index 000000000..f89c57a7a --- /dev/null +++ b/frontend/playwright/ui/pages/WorkspacePage.js @@ -0,0 +1,89 @@ +import { expect } from "@playwright/test"; +import { BaseWebSocketPage } from "./BaseWebSocketPage"; + +export class WorkspacePage extends BaseWebSocketPage { + /** + * This should be called on `test.beforeEach`. + * + * @param {Page} page + * @returns + */ + static async init(page) { + await BaseWebSocketPage.initWebSockets(page); + + await BaseWebSocketPage.mockRPC(page, "get-profile", "logged-in-user/get-profile-logged-in.json"); + await BaseWebSocketPage.mockRPC( + page, + "get-team-users?file-id=*", + "logged-in-user/get-team-users-single-user.json", + ); + await BaseWebSocketPage.mockRPC( + page, + "get-comment-threads?file-id=*", + "workspace/get-comment-threads-empty.json", + ); + await BaseWebSocketPage.mockRPC(page, "get-project?id=*", "workspace/get-project-default.json"); + await BaseWebSocketPage.mockRPC(page, "get-team?id=*", "workspace/get-team-default.json"); + await BaseWebSocketPage.mockRPC( + page, + "get-profiles-for-file-comments?file-id=*", + "workspace/get-profile-for-file-comments.json", + ); + } + + static anyProjectId = "c7ce0794-0992-8105-8004-38e630f7920b"; + static anyFileId = "c7ce0794-0992-8105-8004-38f280443849"; + static anyPageId = "c7ce0794-0992-8105-8004-38f28044384a"; + + #ws = null; + + constructor(page) { + super(page); + // TODO: add locators + this.pageName = page.getByTestId("page-name"); + this.presentUserListItems = page.getByTestId("active-users-list").getByAltText("Princesa Leia"); + } + + async goToWorkspace() { + await this.page.goto( + `/#/workspace/${WorkspacePage.anyProjectId}/${WorkspacePage.anyFileId}?page-id=${WorkspacePage.anyPageId}`, + ); + + this.#ws = await this.waitForNotificationsWebSocket(); + await this.#ws.mockOpen(); + await this.#waitForWebSocketReadiness(); + } + + async #waitForWebSocketReadiness() { + // TODO: find a better event to settle whether the app is ready to receive notifications via ws + await expect(this.pageName).toHaveText("Page 1"); + } + + async sendPresenceMessage(fixture) { + await this.#ws.mockMessage(JSON.stringify(fixture)); + } + + async cleanUp() { + await this.#ws.mockClose(); + } + + async setupEmptyFile() { + await this.mockRPC("get-profile", "logged-in-user/get-profile-logged-in.json"); + await this.mockRPC("get-team-users?file-id=*", "logged-in-user/get-team-users-single-user.json"); + await this.mockRPC("get-comment-threads?file-id=*", "workspace/get-comment-threads-empty.json"); + await this.mockRPC("get-project?id=*", "workspace/get-project-default.json"); + await this.mockRPC("get-team?id=*", "workspace/get-team-default.json"); + await this.mockRPC( + "get-profiles-for-file-comments?file-id=*", + "workspace/get-profile-for-file-comments.json", + ); + await this.mockRPC(/get\-file\?/, "workspace/get-file-blank.json"); + await this.mockRPC( + "get-file-object-thumbnails?file-id=*", + "workspace/get-file-object-thumbnails-blank.json", + ); + await this.mockRPC("get-font-variants?team-id=*", "workspace/get-font-variants-empty.json"); + await this.mockRPC("get-file-fragment?file-id=*", "workspace/get-file-fragment-blank.json"); + await this.mockRPC("get-file-libraries?file-id=*", "workspace/get-file-libraries-empty.json"); + } +} diff --git a/frontend/playwright/ui/specs/workspace.spec.js b/frontend/playwright/ui/specs/workspace.spec.js index 57a60e979..663e76b02 100644 --- a/frontend/playwright/ui/specs/workspace.spec.js +++ b/frontend/playwright/ui/specs/workspace.spec.js @@ -1,46 +1,26 @@ import { test, expect } from "@playwright/test"; -import { BaseWebSocketPage } from "../pages/BaseWebSocketPage"; -import { MockWebSocketHelper } from "../../helpers/MockWebSocketHelper"; +import { WorkspacePage } from "../pages/WorkspacePage"; import { presenceFixture } from "../../data/workspace/ws-notifications"; -const anyProjectId = "c7ce0794-0992-8105-8004-38e630f7920b"; -const anyFileId = "c7ce0794-0992-8105-8004-38f280443849"; -const anyPageId = "c7ce0794-0992-8105-8004-38f28044384a"; - -const setupWorkspaceUser = (page) => { - page.mockRPC("get-profile", "logged-in-user/get-profile-logged-in.json"); - page.mockRPC("get-team-users?file-id=*", "logged-in-user/get-team-users-single-user.json"); - page.mockRPC("get-comment-threads?file-id=*", "workspace/get-comment-threads-empty.json"); - page.mockRPC("get-project?id=*", "workspace/get-project-default.json"); - page.mockRPC("get-team?id=*", "workspace/get-team-default.json"); - page.mockRPC(/get\-file\?/, "workspace/get-file-blank.json"); - page.mockRPC("get-file-object-thumbnails?file-id=*", "workspace/get-file-object-thumbnails-blank.json"); - page.mockRPC("get-profiles-for-file-comments?file-id=*", "workspace/get-profile-for-file-comments.json"); - page.mockRPC("get-font-variants?team-id=*", "workspace/get-font-variants-empty.json"); - page.mockRPC("get-file-fragment?file-id=*", "workspace/get-file-fragment-blank.json"); - page.mockRPC("get-file-libraries?file-id=*", "workspace/get-file-libraries-empty.json"); -}; - test.beforeEach(async ({ page }) => { - await MockWebSocketHelper.init(page); + await WorkspacePage.init(page); }); -test.skip("User loads worskpace with empty file", async ({ page }) => { - await setupWorkspaceUser(page); +test("User loads worskpace with empty file", async ({ page }) => { + const workspacePage = new WorkspacePage(page); + await workspacePage.setupEmptyFile(page); - await page.goto(`/#/workspace/${anyProjectId}/${anyFileId}?page-id=${anyPageId}`); + await workspacePage.goToWorkspace(); - await expect(page.getByTestId("page-name")).toHaveText("Page 1"); + await expect(workspacePage.pageName).toHaveText("Page 1"); }); -test.skip("User receives notifications updates in the workspace", async ({ page }) => { - await setupWorkspaceUser(page); - await page.goto(`/#/workspace/${anyProjectId}/${anyFileId}?page-id=${anyPageId}`); +test("User receives presence notifications updates in the workspace", async ({ page }) => { + const workspacePage = new WorkspacePage(page); + await workspacePage.setupEmptyFile(); + + await workspacePage.goToWorkspace(); + await workspacePage.sendPresenceMessage(presenceFixture); - const ws = await MockWebSocketHelper.waitForURL("ws://0.0.0.0:3500/ws/notifications"); - await ws.mockOpen(); - await expect(page.getByTestId("page-name")).toHaveText("Page 1"); - await ws.mockMessage(JSON.stringify(presenceFixture)); await expect(page.getByTestId("active-users-list").getByAltText("Princesa Leia")).toHaveCount(2); - await ws.mockClose(); }); -- Gitee From 00430d63eb596457eb384df3fe1de473fb641046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Thu, 9 May 2024 12:57:51 +0200 Subject: [PATCH 0522/1266] :sparkles: Add test for drawing a shape in the workspace --- .../data/workspace/update-file-create-rect.json | 9 +++++++++ frontend/playwright/ui/pages/WorkspacePage.js | 12 +++++++++++- frontend/playwright/ui/specs/workspace.spec.js | 14 ++++++++++++++ frontend/src/app/main/ui/workspace/viewport.cljs | 2 +- 4 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 frontend/playwright/data/workspace/update-file-create-rect.json diff --git a/frontend/playwright/data/workspace/update-file-create-rect.json b/frontend/playwright/data/workspace/update-file-create-rect.json new file mode 100644 index 000000000..671fef98f --- /dev/null +++ b/frontend/playwright/data/workspace/update-file-create-rect.json @@ -0,0 +1,9 @@ +[ + { + "~:id": "~u088df3d4-d383-80f6-8004-527e50ea4f1f", + "~:revn": 21, + "~:file-id": "~uc7ce0794-0992-8105-8004-38f280443849", + "~:session-id": "~u1dc6d4fa-7bd3-803a-8004-527dd9df2c62", + "~:changes": [] + } +] diff --git a/frontend/playwright/ui/pages/WorkspacePage.js b/frontend/playwright/ui/pages/WorkspacePage.js index f89c57a7a..ce9b78dab 100644 --- a/frontend/playwright/ui/pages/WorkspacePage.js +++ b/frontend/playwright/ui/pages/WorkspacePage.js @@ -39,9 +39,11 @@ export class WorkspacePage extends BaseWebSocketPage { constructor(page) { super(page); - // TODO: add locators this.pageName = page.getByTestId("page-name"); this.presentUserListItems = page.getByTestId("active-users-list").getByAltText("Princesa Leia"); + this.viewport = page.getByTestId("viewport"); + this.rootShape = page.locator(`[id="shape-00000000-0000-0000-0000-000000000000"]`); + this.rectShapeButton = page.getByRole("button", { name: "Rectangle (R)" }); } async goToWorkspace() { @@ -86,4 +88,12 @@ export class WorkspacePage extends BaseWebSocketPage { await this.mockRPC("get-file-fragment?file-id=*", "workspace/get-file-fragment-blank.json"); await this.mockRPC("get-file-libraries?file-id=*", "workspace/get-file-libraries-empty.json"); } + + async clickWithDragViewportAt(x, y, width, height) { + await this.page.waitForTimeout(100); + await this.viewport.hover({ position: { x, y } }); + await this.page.mouse.down(); + await this.viewport.hover({ position: { x: x + width, y: y + height } }); + await this.page.mouse.up(); + } } diff --git a/frontend/playwright/ui/specs/workspace.spec.js b/frontend/playwright/ui/specs/workspace.spec.js index 663e76b02..832617911 100644 --- a/frontend/playwright/ui/specs/workspace.spec.js +++ b/frontend/playwright/ui/specs/workspace.spec.js @@ -24,3 +24,17 @@ test("User receives presence notifications updates in the workspace", async ({ p await expect(page.getByTestId("active-users-list").getByAltText("Princesa Leia")).toHaveCount(2); }); + +test("User draws a rect", async ({ page }) => { + const workspacePage = new WorkspacePage(page); + await workspacePage.setupEmptyFile(); + await workspacePage.mockRPC("update-file?id=*", "workspace/update-file-create-rect.json"); + + await workspacePage.goToWorkspace(); + await workspacePage.rectShapeButton.click(); + await workspacePage.clickWithDragViewportAt(128, 128, 200, 100); + + const shape = await workspacePage.rootShape.locator("rect"); + expect(shape).toHaveAttribute("width", "200"); + expect(shape).toHaveAttribute("height", "100"); +}); diff --git a/frontend/src/app/main/ui/workspace/viewport.cljs b/frontend/src/app/main/ui/workspace/viewport.cljs index d20d35e3c..d2697e018 100644 --- a/frontend/src/app/main/ui/workspace/viewport.cljs +++ b/frontend/src/app/main/ui/workspace/viewport.cljs @@ -276,7 +276,7 @@ (hooks/setup-shortcuts node-editing? drawing-path? text-editing? grid-editing?) (hooks/setup-active-frames base-objects hover-ids selected active-frames zoom transform vbox) - [:div.viewport {:style #js {"--zoom" zoom}} + [:div.viewport {:style #js {"--zoom" zoom} :data-testid "viewport"} [:& top-bar/top-bar {:layout layout}] [:div.viewport-overlays ;; The behaviour inside a foreign object is a bit different that in plain HTML so we wrap -- Gitee From b6e633865edeaf1f9d18ab76c206cda6f708203c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Wed, 8 May 2024 16:23:50 +0200 Subject: [PATCH 0523/1266] :white_check_mark: Add tests for component creation and modification --- .../src/app/common/files/changes_builder.cljc | 1 + common/src/app/common/logic/libraries.cljc | 2 - common/src/app/common/types/shape_tree.cljc | 4 + .../test/common_tests/helpers/components.cljc | 10 +- .../logic/comp_creation_test.cljc | 569 +++++++++++- .../frontend_tests/state_components_test.cljs | 860 ------------------ 6 files changed, 577 insertions(+), 869 deletions(-) delete mode 100644 frontend/test/frontend_tests/state_components_test.cljs diff --git a/common/src/app/common/files/changes_builder.cljc b/common/src/app/common/files/changes_builder.cljc index 7d693c370..865ed2fa7 100644 --- a/common/src/app/common/files/changes_builder.cljc +++ b/common/src/app/common/files/changes_builder.cljc @@ -720,6 +720,7 @@ (map lookupf) (map mk-change)) updated-shapes)))) + (apply-changes-local))))) (defn update-component diff --git a/common/src/app/common/logic/libraries.cljc b/common/src/app/common/logic/libraries.cljc index 5566ab449..ccc2f5d34 100644 --- a/common/src/app/common/logic/libraries.cljc +++ b/common/src/app/common/logic/libraries.cljc @@ -150,8 +150,6 @@ [new-component-shape new-component-shapes nil nil])))) - - (defn generate-duplicate-component "Create a new component copied from the one with the given id." [changes library component-id components-v2] diff --git a/common/src/app/common/types/shape_tree.cljc b/common/src/app/common/types/shape_tree.cljc index a76189f71..c7a301ca4 100644 --- a/common/src/app/common/types/shape_tree.cljc +++ b/common/src/app/common/types/shape_tree.cljc @@ -61,6 +61,10 @@ (update container :objects update-objects parent-id))) +(defn parent-of? + [parent child] + (= (:id parent) (:parent-id child))) + (defn get-shape "Get a shape identified by id" [container id] diff --git a/common/test/common_tests/helpers/components.cljc b/common/test/common_tests/helpers/components.cljc index a8657c325..81d331660 100644 --- a/common/test/common_tests/helpers/components.cljc +++ b/common/test/common_tests/helpers/components.cljc @@ -33,8 +33,9 @@ (let [[_new-root _new-shapes updated-shapes] (ctn/convert-shape-in-component root (:objects page) (:id file)) - updated-root (first updated-shapes)] ; Can't use new-root because it has a new id + updated-root (first updated-shapes) ; Can't use new-root because it has a new id + [path name] (cfh/parse-path-name (:name updated-root))] (thi/set-id! label (:component-id updated-root)) (ctf/update-file-data @@ -49,14 +50,15 @@ updated-shapes) (ctkl/add-component $ (assoc params :id (:component-id updated-root) - :name (:name updated-root) + :name name + :path path :main-instance-id (:id updated-root) :main-instance-page (:id page) :shapes updated-shapes)))))))) (defn get-component - [file label] - (ctkl/get-component (:data file) (thi/id label))) + [file label & {:keys [include-deleted?] :or {include-deleted? false}}] + (ctkl/get-component (:data file) (thi/id label) include-deleted?)) (defn get-component-by-id [file id] diff --git a/common/test/common_tests/logic/comp_creation_test.cljc b/common/test/common_tests/logic/comp_creation_test.cljc index bed320a0a..6d3280533 100644 --- a/common/test/common_tests/logic/comp_creation_test.cljc +++ b/common/test/common_tests/logic/comp_creation_test.cljc @@ -6,20 +6,62 @@ (ns common-tests.logic.comp-creation-test (:require + [app.common.data :as d] [app.common.files.changes-builder :as pcb] + [app.common.files.shapes-helpers :as cfsh] + [app.common.geom.point :as gpt] [app.common.logic.libraries :as cll] + [app.common.logic.shapes :as cls] + [app.common.types.component :as ctk] + [app.common.types.components-list :as ctkl] + [app.common.types.shape-tree :as ctst] [clojure.test :as t] [common-tests.helpers.components :as thc] + [common-tests.helpers.compositions :as tho] [common-tests.helpers.files :as thf] [common-tests.helpers.ids-map :as thi] [common-tests.helpers.shapes :as ths])) (t/use-fixtures :each thi/test-fixture) +(t/deftest test-add-component-from-single-frame + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (ths/add-sample-shape :frame1 :type :frame)) + + page (thf/current-page file) + frame1 (ths/get-shape file :frame1) + + ;; ==== Action + [_ component-id changes] + (cll/generate-add-component (pcb/empty-changes) + [frame1] + (:objects page) + (:id page) + (:id file) + true + nil + nil) + + file' (thf/apply-changes file changes) + + ;; ==== Get + component (thc/get-component-by-id file' component-id) + root (ths/get-shape-by-id file' (:main-instance-id component)) + frame1' (ths/get-shape file' :frame1)] + + ;; ==== Check + (t/is (some? component)) + (t/is (some? root)) + (t/is (some? frame1')) + (t/is (= (:id root) (:id frame1'))) + (t/is (ctk/main-instance? root)) + (t/is (ctk/main-instance-of? (:id root) (:id page) component)))) + (t/deftest test-add-component-from-single-shape (let [;; ==== Setup file (-> (thf/sample-file :file1) - (ths/add-sample-shape :shape1 :type :frame)) + (ths/add-sample-shape :shape1 :type :rect)) page (thf/current-page file) shape1 (ths/get-shape file :shape1) @@ -33,15 +75,536 @@ (:id file) true nil + cfsh/prepare-create-artboard-from-selection) + + file' (thf/apply-changes file changes) + + ;; ==== Get + component (thc/get-component-by-id file' component-id) + root (ths/get-shape-by-id file' (:main-instance-id component)) + shape1' (ths/get-shape file' :shape1)] + + ;; ==== Check + (t/is (some? component)) + (t/is (some? root)) + (t/is (some? shape1')) + (t/is (ctst/parent-of? root shape1')) + (t/is (= (:type root) :frame)) + (t/is (ctk/main-instance? root)) + (t/is (ctk/main-instance-of? (:id root) (:id page) component)))) + +(t/deftest test-add-component-from-several-shapes + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (ths/add-sample-shape :shape1 :type :rect) + (ths/add-sample-shape :shape2 :type :rect)) + + page (thf/current-page file) + shape1 (ths/get-shape file :shape1) + shape2 (ths/get-shape file :shape2) + + ;; ==== Action + [_ component-id changes] + (cll/generate-add-component (pcb/empty-changes) + [shape1 shape2] + (:objects page) + (:id page) + (:id file) + true + nil + cfsh/prepare-create-artboard-from-selection) + + file' (thf/apply-changes file changes) + + ;; ==== Get + component (thc/get-component-by-id file' component-id) + root (ths/get-shape-by-id file' (:main-instance-id component)) + shape1' (ths/get-shape file' :shape1) + shape2' (ths/get-shape file' :shape2)] + + ;; ==== Check + (t/is (some? component)) + (t/is (some? root)) + (t/is (some? shape1')) + (t/is (some? shape2')) + (t/is (ctst/parent-of? root shape1')) + (t/is (ctst/parent-of? root shape2')) + (t/is (= (:type root) :frame)) + (t/is (ctk/main-instance? root)) + (t/is (ctk/main-instance-of? (:id root) (:id page) component)))) + +(t/deftest test-add-component-from-several-frames + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (ths/add-sample-shape :frame1 :type :frame) + (ths/add-sample-shape :frame2 :type :frame)) + + page (thf/current-page file) + frame1 (ths/get-shape file :frame1) + frame2 (ths/get-shape file :frame2) + + ;; ==== Action + [_ component-id changes] + (cll/generate-add-component (pcb/empty-changes) + [frame1 frame2] + (:objects page) + (:id page) + (:id file) + true + nil + cfsh/prepare-create-artboard-from-selection) + + file' (thf/apply-changes file changes) + + ;; ==== Get + component (thc/get-component-by-id file' component-id) + root (ths/get-shape-by-id file' (:main-instance-id component)) + frame1' (ths/get-shape file' :frame1) + frame2' (ths/get-shape file' :frame2)] + + ;; ==== Check + (t/is (some? component)) + (t/is (some? root)) + (t/is (some? frame1')) + (t/is (some? frame2')) + (t/is (ctst/parent-of? root frame1')) + (t/is (ctst/parent-of? root frame2')) + (t/is (= (:type root) :frame)) + (t/is (ctk/main-instance? root)) + (t/is (ctk/main-instance-of? (:id root) (:id page) component)))) + +(t/deftest test-add-component-from-frame-with-children + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (ths/add-sample-shape :frame1 :type :frame) + (ths/add-sample-shape :shape1 :type :rect :parent-label :frame1) + (ths/add-sample-shape :shape2 :type :rect :parent-label :frame1)) + + page (thf/current-page file) + frame1 (ths/get-shape file :frame1) + + ;; ==== Action + [_ component-id changes] + (cll/generate-add-component (pcb/empty-changes) + [frame1] + (:objects page) + (:id page) + (:id file) + true + nil nil) file' (thf/apply-changes file changes) ;; ==== Get component (thc/get-component-by-id file' component-id) - root (ths/get-shape-by-id file' (:main-instance-id component))] + root (ths/get-shape-by-id file' (:main-instance-id component)) + frame1' (ths/get-shape file' :frame1) + shape1' (ths/get-shape file' :shape1) + shape2' (ths/get-shape file' :shape2)] ;; ==== Check (t/is (some? component)) (t/is (some? root)) - (t/is (= (:component-id root) (:id component))))) + (t/is (some? frame1')) + (t/is (= (:id root) (:id frame1'))) + (t/is (ctst/parent-of? frame1' shape1')) + (t/is (ctst/parent-of? frame1' shape2')) + (t/is (ctk/main-instance? root)) + (t/is (ctk/main-instance-of? (:id root) (:id page) component)))) + +(t/deftest test-add-component-from-copy + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (tho/add-simple-component-with-copy :component1 + :main1-root + :main1-child + :copy1-root)) + + page (thf/current-page file) + copy1-root (ths/get-shape file :copy1-root) + + ;; ==== Action + [_ component2-id changes] + (cll/generate-add-component (pcb/empty-changes) + [copy1-root] + (:objects page) + (:id page) + (:id file) + true + nil + cfsh/prepare-create-artboard-from-selection) + + file' (thf/apply-changes file changes) + + ;; ==== Get + component2' (thc/get-component-by-id file' component2-id) + root2' (ths/get-shape-by-id file' (:main-instance-id component2')) + copy1-root' (ths/get-shape file' :copy1-root)] + + ;; ==== Check + (t/is (some? component2')) + (t/is (some? root2')) + (t/is (some? copy1-root')) + (t/is (ctst/parent-of? root2' copy1-root')) + (t/is (ctk/main-instance? root2')) + (t/is (ctk/main-instance-of? (:id root2') (:id page) component2')))) + +(t/deftest test-rename-component + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (tho/add-simple-component :component1 + :main1-root + :main1-child + :name "Test component before")) + + component (thc/get-component file :component1) + + ;; ==== Action + changes (cll/generate-rename-component (pcb/empty-changes) + (:id component) + "Test component after" + (:data file) + true) + + file' (thf/apply-changes file changes) + + ;; ==== Get + component' (thc/get-component file' :component1)] + + ;; ==== Check + (t/is (= (:name component') "Test component after")))) + +(t/deftest test-duplicate-component + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (tho/add-simple-component :component1 + :main1-root + :main1-child)) + + component (thc/get-component file :component1) + + ;; ==== Action + changes (cll/generate-duplicate-component (pcb/empty-changes) + file + (:id component) + true) + + file' (thf/apply-changes file changes) + + ;; ==== Get + components' (ctkl/components-seq (:data file')) + component1' (d/seek #(= (:id %) (thi/id :component1)) components') + component2' (d/seek #(not= (:id %) (thi/id :component1)) components') + root1' (ths/get-shape-by-id file' (:main-instance-id component1')) + root2' (ths/get-shape-by-id file' (:main-instance-id component2')) + child1' (ths/get-shape-by-id file' (first (:shapes root1'))) + child2' (ths/get-shape-by-id file' (first (:shapes root2')))] + + ;; ==== Check + (t/is (= 2 (count components'))) + (t/is (some? component1')) + (t/is (some? component2')) + (t/is (some? root1')) + (t/is (some? root2')) + (t/is (= (thi/id :main1-root) (:id root1'))) + (t/is (not= (thi/id :main1-root) (:id root2'))) + (t/is (some? child1')) + (t/is (some? child2')) + (t/is (= (thi/id :main1-child) (:id child1'))) + (t/is (not= (thi/id :main1-child) (:id child2'))))) + +(t/deftest test-delete-component + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (tho/add-simple-component-with-copy :component1 + :main1-root + :main1-child + :copy1-root)) + + page (thf/current-page file) + root (ths/get-shape file :main1-root) + + ;; ==== Action + [_ changes] + (cls/generate-delete-shapes (pcb/empty-changes) + file + page + (:objects page) + #{(:id root)} + {:components-v2 true}) + + file' (thf/apply-changes file changes) + + ;; ==== Get + component1' (thc/get-component file' :component1 :include-deleted? true) + copy1-root' (ths/get-shape file' :copy1-root) + + main1-root' (ths/get-shape file' :main1-root) + main1-child' (ths/get-shape file' :main1-child) + + saved-objects (:objects component1') + saved-main1-root' (get saved-objects (thi/id :main1-root)) + saved-main1-child' (get saved-objects (thi/id :main1-child))] + + ;; ==== Check + (t/is (true? (:deleted component1'))) + (t/is (some? copy1-root')) + (t/is (nil? main1-root')) + (t/is (nil? main1-child')) + (t/is (some? saved-main1-root')) + (t/is (some? saved-main1-child')))) + +(t/deftest test-restore-component + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (tho/add-simple-component-with-copy :component1 + :main1-root + :main1-child + :copy1-root)) + + page (thf/current-page file) + root (ths/get-shape file :main1-root) + + ;; ==== Action + [_ changes] + (cls/generate-delete-shapes (pcb/empty-changes) + file + page + (:objects page) + #{(:id root)} + {:components-v2 true}) + + file-deleted (thf/apply-changes file changes) + page-deleted (thf/current-page file-deleted) + + changes (cll/generate-restore-component (pcb/empty-changes) + (:data file-deleted) + (thi/id :component1) + (:id file-deleted) + page-deleted + (:objects page-deleted)) + + file' (thf/apply-changes file changes) + + ;; ==== Get + component1' (thc/get-component file' :component1 :include-deleted? false) + copy1-root' (ths/get-shape file' :copy1-root) + + main1-root' (ths/get-shape file' :main1-root) + main1-child' (ths/get-shape file' :main1-child) + + saved-objects' (:objects component1')] + + ;; ==== Check + (t/is (nil? (:deleted component1'))) + (t/is (some? copy1-root')) + (t/is (some? main1-root')) + (t/is (some? main1-child')) + (t/is (ctk/main-instance? main1-root')) + (t/is (ctk/main-instance-of? (:id main1-root') (:id page) component1')) + (t/is (nil? saved-objects')))) + +(t/deftest test-instantiate-component + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (tho/add-simple-component :component1 + :main1-root + :main1-child)) + + page (thf/current-page file) + component (thc/get-component file :component1) + + ;; ==== Action + [new-shape changes] + (cll/generate-instantiate-component (-> (pcb/empty-changes nil (:id page)) ;; This may not be moved to generate + (pcb/with-objects (:objects page))) ;; because in some cases the objects + (:objects page) ;; not the same as those on the page + (:id file) + (:id component) + (gpt/point 1000 1000) + page + {(:id file) file}) + + file' (thf/apply-changes file changes) + + ;; ==== Get + component' (thc/get-component file' :component1) + main1-root' (ths/get-shape file' :main1-root) + main1-child' (ths/get-shape file' :main1-child) + copy1-root' (ths/get-shape-by-id file' (:id new-shape)) + copy1-child' (ths/get-shape-by-id file' (first (:shapes copy1-root')))] + + ;; ==== Check + (t/is (some? main1-root')) + (t/is (some? main1-child')) + (t/is (some? copy1-root')) + (t/is (some? copy1-child')) + (t/is (ctk/instance-root? copy1-root')) + (t/is (ctk/instance-of? copy1-root' (:id file') (:id component'))) + (t/is (ctk/is-main-of? main1-root' copy1-root' true)) + (t/is (ctk/is-main-of? main1-child' copy1-child' true)) + (t/is (ctst/parent-of? copy1-root' copy1-child')))) + +(t/deftest test-instantiate-component-from-lib + (let [;; ==== Setup + library (-> (thf/sample-file :library1) + (tho/add-simple-component :component1 + :main1-root + :main1-child)) + + file (thf/sample-file :file1) + + page (thf/current-page file) + component (thc/get-component library :component1) + + ;; ==== Action + [new-shape changes] + (cll/generate-instantiate-component (-> (pcb/empty-changes nil (:id page)) + (pcb/with-objects (:objects page))) + (:objects page) + (:id library) + (:id component) + (gpt/point 1000 1000) + page + {(:id file) file + (:id library) library}) + + file' (thf/apply-changes file changes) + + ;; ==== Get + component' (thc/get-component library :component1) + main1-root' (ths/get-shape library :main1-root) + main1-child' (ths/get-shape library :main1-child) + copy1-root' (ths/get-shape-by-id file' (:id new-shape)) + copy1-child' (ths/get-shape-by-id file' (first (:shapes copy1-root')))] + + ;; ==== Check + (t/is (some? main1-root')) + (t/is (some? main1-child')) + (t/is (some? copy1-root')) + (t/is (some? copy1-child')) + (t/is (ctk/instance-root? copy1-root')) + (t/is (ctk/instance-of? copy1-root' (:id library) (:id component'))) + (t/is (ctk/is-main-of? main1-root' copy1-root' true)) + (t/is (ctk/is-main-of? main1-child' copy1-child' true)) + (t/is (ctst/parent-of? copy1-root' copy1-child')))) + +(t/deftest test-instantiate-nested-component + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (tho/add-nested-component :component1 + :main1-root + :main1-child + :component2 + :main2-root + :main2-nested-head)) + + page (thf/current-page file) + component (thc/get-component file :component1) + + ;; ==== Action + [new-shape changes] + (cll/generate-instantiate-component (-> (pcb/empty-changes nil (:id page)) + (pcb/with-objects (:objects page))) + (:objects page) + (:id file) + (:id component) + (gpt/point 1000 1000) + page + {(:id file) file}) + + file' (thf/apply-changes file changes) + + ;; ==== Get + component' (thc/get-component file' :component1) + main1-root' (ths/get-shape file' :main1-root) + main1-child' (ths/get-shape file' :main1-child) + copy1-root' (ths/get-shape-by-id file' (:id new-shape)) + copy1-child' (ths/get-shape-by-id file' (first (:shapes copy1-root')))] + + ;; ==== Check + (t/is (some? main1-root')) + (t/is (some? main1-child')) + (t/is (some? copy1-root')) + (t/is (some? copy1-child')) + (t/is (ctk/instance-root? copy1-root')) + (t/is (ctk/instance-of? copy1-root' (:id file') (:id component'))) + (t/is (ctk/is-main-of? main1-root' copy1-root' true)) + (t/is (ctk/is-main-of? main1-child' copy1-child' true)) + (t/is (ctst/parent-of? copy1-root' copy1-child')))) + +(t/deftest test-instantiate-nested-component-from-lib + (let [;; ==== Setup + library (-> (thf/sample-file :file1) + (tho/add-nested-component :component1 + :main1-root + :main1-child + :component2 + :main2-root + :main2-nested-head)) + + file (thf/sample-file :file1) + + page (thf/current-page file) + component (thc/get-component library :component1) + + ;; ==== Action + [new-shape changes] + (cll/generate-instantiate-component (-> (pcb/empty-changes nil (:id page)) + (pcb/with-objects (:objects page))) + (:objects page) + (:id library) + (:id component) + (gpt/point 1000 1000) + page + {(:id file) file + (:id library) library}) + + file' (thf/apply-changes file changes) + + ;; ==== Get + component' (thc/get-component library :component1) + main1-root' (ths/get-shape library :main1-root) + main1-child' (ths/get-shape library :main1-child) + copy1-root' (ths/get-shape-by-id file' (:id new-shape)) + copy1-child' (ths/get-shape-by-id file' (first (:shapes copy1-root')))] + + ;; ==== Check + (t/is (some? main1-root')) + (t/is (some? main1-child')) + (t/is (some? copy1-root')) + (t/is (some? copy1-child')) + (t/is (ctk/instance-root? copy1-root')) + (t/is (ctk/instance-of? copy1-root' (:id library) (:id component'))) + (t/is (ctk/is-main-of? main1-root' copy1-root' true)) + (t/is (ctk/is-main-of? main1-child' copy1-child' true)) + (t/is (ctst/parent-of? copy1-root' copy1-child')))) + +(t/deftest test-detach-copy + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (tho/add-simple-component-with-copy :component1 + :main1-root + :main1-child + :copy1-root)) + + page (thf/current-page file) + copy1-root (ths/get-shape file :copy1-root) + + ;; ==== Action + changes (cll/generate-detach-component (pcb/empty-changes) + (:id copy1-root) + (:data file) + (:id page) + {(:id file) file}) + + file' (thf/apply-changes file changes) + + ;; ==== Get + copy1-root' (ths/get-shape file' :copy1-root)] + + ;; ==== Check + (t/is (some? copy1-root')) + (t/is (not (ctk/instance-head? copy1-root'))) + (t/is (not (ctk/in-component-copy? copy1-root'))))) diff --git a/frontend/test/frontend_tests/state_components_test.cljs b/frontend/test/frontend_tests/state_components_test.cljs deleted file mode 100644 index 3a8751019..000000000 --- a/frontend/test/frontend_tests/state_components_test.cljs +++ /dev/null @@ -1,860 +0,0 @@ -(ns frontend-tests.state-components-test - (:require - [app.common.geom.point :as gpt] - [app.common.types.components-list :as ctkl] - [app.common.types.container :as ctn] - [app.common.types.file :as ctf] - [app.main.data.workspace :as dw] - [app.main.data.workspace.libraries :as dwl] - [app.main.data.workspace.shapes :as dwsh] - [app.main.data.workspace.state-helpers :as wsh] - [cljs.test :as t :include-macros true] - [frontend-tests.helpers.events :as the] - [frontend-tests.helpers.libraries :as thl] - [frontend-tests.helpers.pages :as thp] - [linked.core :as lks] - [potok.v2.core :as ptk])) - -(t/use-fixtures :each - {:before thp/reset-idmap!}) - -(t/deftest test-add-component-from-single-shape - (t/testing "test-add-component-from-single-shape" - (t/async - done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1"})) - - store (the/prepare-store state done - (fn [new-state] - ;; Uncomment to debug - ;; (ctf/dump-tree (get new-state :workspace-data) - ;; (get new-state :current-page-id) - ;; (get new-state :workspace-libraries) - ;; false true) - - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Rect 1 #--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; - ;; [Rect 1] - ;; Rect 1 - ;; Rect 1 - ;; - (let [shape1 (thp/get-shape new-state :shape1) - - [[group shape1] [c-group c-shape1] component] - (thl/resolve-instance-and-main - new-state - (:parent-id shape1)) - - file (wsh/get-local-file new-state)] - - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:name group) "Rect 1")) - (t/is (= (:name component) "Rect 1")) - (t/is (= (:name c-shape1) "Rect 1")) - (t/is (= (:name c-group) "Rect 1")) - - (thl/is-from-file group file))))] - - (ptk/emit! - store - (dw/select-shape (thp/id :shape1)) - (dwl/add-component) - :the/end))))) - -(t/deftest test-add-component-from-several-shapes - (t/async - done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1"}) - (thp/sample-shape :shape2 :rect - {:name "Rect-2"})) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; [Page] - ;; Root Frame - ;; Component 1 - ;; Rect 1 - ;; Rect-2 - ;; - ;; [Component 1] - ;; page1 / Component 1 - ;; - (let [shape1 (thp/get-shape new-state :shape1) - - [[group shape1 shape2] - [c-group c-shape1 c-shape2] - component] - (thl/resolve-instance-and-main - new-state - (:parent-id shape1)) - - file (wsh/get-local-file new-state)] - - (t/is (= (:name group) "Component 1")) - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:name shape2) "Rect-2")) - (t/is (= (:name component) "Component 1")) - (t/is (= (:name c-group) "Component 1")) - (t/is (= (:name c-shape1) "Rect 1")) - (t/is (= (:name c-shape2) "Rect-2")) - - (thl/is-from-file group file))))] - - (ptk/emit! - store - (dw/select-shapes (lks/set (thp/id :shape1) - (thp/id :shape2))) - (dwl/add-component) - :the/end)))) - -(t/deftest test-add-component-from-frame - (t/async - done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1"}) - (thp/sample-shape :shape2 :rect - {:name "Rect-2"}) - (thp/frame-shapes :frame1 - [(thp/id :shape1) - (thp/id :shape2)])) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Group - ;; Rect 1 - ;; Rect-2 - ;; - ;; [Group] - ;; page1 / Group - ;; - (let [[[group shape1 shape2] - [c-group c-shape1 c-shape2] - component] - (thl/resolve-instance-and-main - new-state - (thp/id :frame1)) - - file (wsh/get-local-file new-state)] - - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:name shape2) "Rect-2")) - (t/is (= (:name group) "Board")) - (t/is (= (:name component) "Board")) - (t/is (= (:name c-shape1) "Rect 1")) - (t/is (= (:name c-shape2) "Rect-2")) - (t/is (= (:name c-group) "Board")) - - (thl/is-from-file group file))))] - - (ptk/emit! - store - (dw/select-shape (thp/id :frame1)) - (dwl/add-component) - :the/end)))) - -(t/deftest test-add-component-from-component-instance - (t/async - done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1"}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)]) - (thp/instantiate-component :instance1 (thp/id :component1))) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page: Page] - ;; Root Frame - ;; Rect 1 # - ;; Rect 1 - ;; Rect 1 # - ;; Rect 1* @--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; - (let [[[instance1 shape1] - [c-instance1 c-shape1] - component1] - (thl/resolve-instance-and-main - new-state - (thp/id :instance1) - true) - - [[instance2 instance1' shape1'] - [c-instance2 c-instance1' c-shape1'] - component2] - (thl/resolve-instance-and-main - new-state - (:parent-id instance1))] - - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:name instance1) "Rect 1")) - (t/is (= (:name component1) "Rect 1")) - (t/is (= (:name c-shape1) "Rect 1")) - (t/is (= (:name c-instance1) "Rect 1")) - - (t/is (= (:name shape1') "Rect 1")) - (t/is (= (:name instance1') "Rect 1")) - (t/is (= (:name instance2) "Rect 1")) - (t/is (= (:name component2) "Rect 1")) - (t/is (= (:name c-shape1') "Rect 1")) - (t/is (= (:name c-instance1') "Rect 1")) - (t/is (= (:name c-instance2) "Rect 1")))))] - - (ptk/emit! - store - (dw/select-shape (thp/id :instance1)) - (dwl/add-component) - :the/end)))) - - -(t/deftest test-add-component-from-component-main - (t/async - done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1"}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)])) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Rect 1 - ;; Rect 1 - ;; - ;; [Rect 1] - ;; page1 / Rect 1 - ;; - (let [file (wsh/get-local-file new-state) - components (ctkl/components file) - page (thp/current-page new-state) - shape1 (thp/get-shape new-state :shape1) - parent1 (ctn/get-shape page (:parent-id shape1)) - main1 (thp/get-shape state :main1) - [[instance1 shape1] - [c-instance1 c-shape1] - component1] - (thl/resolve-instance-and-main - new-state - (:id main1))] - ;; Creating a component from a main doesn't generate a new component - (t/is (= (count components) 1)) - - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:name instance1) "Rect 1")) - (t/is (= (:name component1) "Rect 1")) - (t/is (= (:name c-shape1) "Rect 1")) - (t/is (= (:name c-instance1) "Rect 1")))))] - - (ptk/emit! - store - (dw/select-shape (thp/id :main1)) - (dwl/add-component) - :the/end)))) - -(t/deftest test-rename-component - (t/async - done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1"}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)])) - - main1 (thp/get-shape state :main1) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Rect 1 - ;; Rect 1 - ;; - ;; [Renamed component] - ;; page1 / Rect 1 - ;; - (let [libs (wsh/get-libraries new-state) - component (ctf/get-component libs - (:component-file main1) - (:component-id main1))] - (t/is (= (:name component) - "Renamed component")))))] - - (ptk/emit! - store - (dwl/rename-component (:component-id main1) "Renamed component") - :the/end)))) - -(t/deftest test-duplicate-component - (t/async - done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1"}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)])) - - main1 (thp/get-shape state :main1) - component-id (:component-id main1) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Rect 1 - ;; Rect 1 - ;; Rect 1 #--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; - ;; [Rect 1] - ;; page1 / Rect 1 - ;; - ;; [Rect 1] - ;; page1 / Rect 1 - ;; - (let [new-component-id (->> (get-in new-state - [:workspace-data - :components]) - (keys) - (filter #(not= % component-id)) - (first)) - - [[_instance1 _shape1] - [_c-instance1 _c-shape1] - _component1] - (thl/resolve-instance-and-main - new-state - (:id main1)) - - [[_c-component2 _c-shape2] - component2] - (thl/resolve-component - new-state - (:current-file-id new-state) - new-component-id)] - - (t/is (= (:name component2) "Rect 1")))))] - - (ptk/emit! - store - (dwl/duplicate-component thp/current-file-id component-id) - :the/end)))) - -(t/deftest test-delete-component - (t/async done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect {:name "Rect 1"}) - (thp/make-component :main1 :component1 [(thp/id :shape1)]) - (thp/instantiate-component :instance1 (thp/id :component1))) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;;; - ;; [Page] - ;; Root Frame - ;; Rect 1 #--> ? - ;; Rect 1 ---> ? - ;;; - (let [[main1 shape1] - (thl/resolve-noninstance - new-state - (thp/id :main1)) - - [[instance1 shape2] [c-instance1 c-shape2] component1] - (thl/resolve-instance-and-main-allow-dangling - new-state - (thp/id :instance1)) - - file (wsh/get-local-file new-state) - component2 (ctkl/get-component file (thp/id :component1)) - component3 (ctkl/get-deleted-component file (thp/id :component1)) - - saved-objects (:objects component3) - saved-main1 (get saved-objects (:shape-ref instance1)) - saved-shape2 (get saved-objects (:shape-ref shape2))] - - (t/is (nil? main1)) - (t/is (nil? shape1)) - - (t/is (= (:name instance1) "Rect 1")) - (t/is (= (:touched instance1) nil)) - (t/is (not= (:shape-ref instance1) nil)) - (t/is (= (:name shape2) "Rect 1")) - (t/is (= (:touched shape2) nil)) - (t/is (not= (:shape-ref shape2) nil)) - (t/is (nil? c-instance1)) - (t/is (nil? c-shape2)) - (t/is (nil? component1)) - - (t/is (nil? component2)) - - (t/is (= (:name component3) "Rect 1")) - (t/is (= (:deleted component3) true)) - (t/is (some? (:objects component3))) - - (t/is (= (:name saved-main1) "Rect 1")) - (t/is (= (:name saved-shape2) "Rect 1")))))] - (ptk/emit! store - (dwl/delete-component {:id (thp/id :component1)}) - :the/end)))) - -(t/deftest test-restore-component - (t/async - done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1"}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)]) - (thp/instantiate-component :instance1 - (thp/id :component1))) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Rect 1 #--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; Rect 1 - ;; Rect 1 - ;; - ;; [Rect 1] - ;; page1 / Rect 1 - ;; - (let [[[instance1 shape2] [c-instance1 c-shape2] component1] - (thl/resolve-instance-and-main - new-state - (thp/id :instance1)) - - file (wsh/get-local-file new-state) - component2 (ctkl/get-component file (thp/id :component1)) - - saved-objects (:objects component2)] - - (t/is (= (:name instance1) "Rect 1")) - (t/is (= (:name shape2) "Rect 1")) - (t/is (= (:name c-instance1) "Rect 1")) - (t/is (= (:name c-shape2) "Rect 1")) - - (t/is (some? component1)) - (t/is (some? component2)) - (t/is (nil? saved-objects)))))] - - (ptk/emit! - store - (dwl/delete-component {:id (thp/id :component1)}) - (dwl/restore-component thp/current-file-id (thp/id :component1)) - :the/end)))) - -(t/deftest test-instantiate-component - (t/async - done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1"}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)])) - - file (wsh/get-local-file state) - component-id (thp/id :component1) - main1 (thp/get-shape state :main1) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Rect 1 - ;; Rect 1 - ;; Rect 1 #--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; - ;; [Rect 1] - ;; page1 / Rect 1 - ;; - (let [new-instance-id (-> new-state - wsh/lookup-selected - first) - - [[instance1 shape2] - [c-instance1 c-shape2] - component] - (thl/resolve-instance-and-main - new-state - new-instance-id)] - - (t/is (not= (:id main1) (:id instance1))) - (t/is (= (:id component) component-id)) - (t/is (= (:name instance1) "Rect 1")) - (t/is (= (:name shape2) "Rect 1")) - (t/is (= (:name c-instance1) "Rect 1")) - (t/is (= (:name c-shape2) "Rect 1")) - (t/is (= (:component-file instance1) - thp/current-file-id)))))] - - (ptk/emit! - store - (dwl/instantiate-component (:id file) - component-id - (gpt/point 100 100)) - :the/end)))) - -(t/deftest test-instantiate-component-from-lib - (t/async - done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1"}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)]) - (thp/move-to-library :lib1 "Library 1") - (thp/sample-page)) - - library-id (thp/id :lib1) - component-id (thp/id :component1) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Rect 1 #--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; - (let [new-instance-id (-> new-state - wsh/lookup-selected - first) - - [[instance1 shape2] - [c-instance1 c-shape2] - component] - (thl/resolve-instance-and-main - new-state - new-instance-id)] - - (t/is (= (:id component) component-id)) - (t/is (= (:name instance1) "Rect 1")) - (t/is (= (:name shape2) "Rect 1")) - (t/is (= (:name c-instance1) "Rect 1")) - (t/is (= (:name c-shape2) "Rect 1")) - (t/is (= (:component-file instance1) library-id)))))] - - (ptk/emit! - store - (dwl/instantiate-component library-id - component-id - (gpt/point 100 100)) - :the/end)))) - -(t/deftest test-detach-component - (t/async - done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1"}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)]) - (thp/instantiate-component :instance1 - (thp/id :component1))) - - instance1 (thp/get-shape state :instance1) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Rect 1 - ;; Rect 1 - ;; Rect 1 - ;; Rect 1 - ;; - ;; [Rect 1] - ;; page1 / Rect 1 - ;; - (let [[instance2 shape1] - (thl/resolve-noninstance - new-state - (:id instance1))] - - (t/is (some? instance2)) - (t/is (some? shape1)))))] - - (ptk/emit! - store - (dwl/detach-component (:id instance1)) - :the/end)))) - - - -(t/deftest test-add-nested-component-instance - (t/async - done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1"}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)]) - (thp/instantiate-component :instance1 (thp/id :component1))) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Rect 1 - ;; Rect 1 - ;; Board - ;; Rect 1 - ;; Rect 1 - ;; - ;; [Rect 1] - ;; page1 / Rect 1 - ;; - ;; [Board] - ;; page1 / Board - ;; - (let [instance1 (thp/get-shape new-state :instance1) - - [[group shape1 shape2] - [c-group c-shape1 c-shape2] - component] - (thl/resolve-instance-and-main - new-state - (:parent-id instance1))] - - (t/is (= (:name group) "Board")) - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:name shape2) "Rect 1")) - (t/is (= (:name component) "Board")) - (t/is (= (:name c-group) "Board")) - (t/is (= (:name c-shape1) "Rect 1")) - (t/is (= (:name c-shape2) "Rect 1")))))] - - (ptk/emit! - store - (dw/select-shape (thp/id :instance1)) - (dwsh/create-artboard-from-selection) - (dwl/add-component) - :the/end)))) - -(t/deftest test-add-nested-component-main - (t/async - done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1"})) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Board - ;; Rect 1 - ;; Rect 1 - ;; - ;; [Rect 1] - ;; page1 / Rect 1 - ;; - ;; - (let [file (wsh/get-local-file new-state) - components (ctkl/components file) - page (thp/current-page new-state) - - shape1 (thp/get-shape new-state :shape1) - parent1 (ctn/get-shape page (:parent-id shape1)) - - [[group shape1] - [c-group c-shape1] - component] - (thl/resolve-instance-and-main - new-state - (:parent-id shape1))] - - ;; Creating a component from something containing a main doesn't generate a new component - (t/is (= (count components) 1)) - - (t/is (= (:name group) "Rect 1")) - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:name component) "Rect 1")) - (t/is (= (:name c-group) "Rect 1")) - (t/is (= (:name c-shape1) "Rect 1")))))] - - (ptk/emit! - store - (dw/select-shape (thp/id :shape1)) - (dwl/add-component) - (dwsh/create-artboard-from-selection) - (dwl/add-component) - :the/end)))) - -(t/deftest test-instantiate-nested-component - (t/async - done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1"}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)]) - (thp/make-component :main2 :component-2 - [(thp/id :main1)])) - - file (wsh/get-local-file state) - main1 (thp/get-shape state :main1) - main2 (thp/get-shape state :main2) - component-id (:component-id main2) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Rect 1 - ;; Rect 1 - ;; Rect 1 - ;; Rect 1 #--> Rect 1 - ;; Rect 1 @--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; - ;; [Rect 1] - ;; page1 / Rect 1 - ;; - ;; [Rect 1] - ;; page1 / Rect 1 - ;; - (let [new-instance-id (-> new-state - wsh/lookup-selected - first) - - [[instance1 shape1 shape2] - [c-instance1 c-shape1 c-shape2] - component] - (thl/resolve-instance-and-main - new-state - new-instance-id)] - - ;; TODO: get and check the instance inside component [Rect-2] - - (t/is (not= (:id main1) (:id instance1))) - (t/is (= (:id component) component-id)) - (t/is (= (:name instance1) "Rect 1")) - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:name shape2) "Rect 1")) - (t/is (= (:name c-instance1) "Rect 1")) - (t/is (= (:name c-shape1) "Rect 1")) - (t/is (= (:name c-shape2) "Rect 1")))))] - - (ptk/emit! - store - (dwl/instantiate-component (:id file) - (:component-id main2) - (gpt/point 100 100)) - :the/end)))) - -(t/deftest test-instantiate-nested-component-from-lib - (t/async - done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1"}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)]) - (thp/move-to-library :lib1 "Library 1") - (thp/sample-page) - (thp/instantiate-component :instance1 - (thp/id :component1) - (thp/id :lib1))) - - file (wsh/get-local-file state) - library-id (thp/id :lib1) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Group - ;; Rect 1 #--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; - ;; [Group] - ;; page1 / Group - ;; - (let [instance1 (thp/get-shape new-state :instance1) - - [[group1 shape1 shape2] [c-group1 c-shape1 c-shape2] _component] - (thl/resolve-instance-and-main - new-state - (:parent-id instance1))] - - (t/is (= (:name group1) "Board")) - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:name shape2) "Rect 1")) - (t/is (= (:name c-group1) "Board")) - (t/is (= (:name c-shape1) "Rect 1")) - (t/is (= (:name c-shape2) "Rect 1")) - (t/is (= (:component-file group1) thp/current-file-id)) - (t/is (= (:component-file shape1) library-id)) - (t/is (= (:component-file shape2) nil)) - (t/is (= (:component-file c-group1) (:id file))) - (t/is (= (:component-file c-shape1) library-id)) - (t/is (= (:component-file c-shape2) nil)))))] - - (ptk/emit! - store - (dw/select-shape (thp/id :instance1)) - (dwsh/create-artboard-from-selection) - (dwl/add-component) - :the/end)))) -- Gitee From 6b76213128b9c99aab398a0368b0021b60a85851 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 9 May 2024 13:17:12 +0200 Subject: [PATCH 0524/1266] :sparkles: Frontend integration tests --- .circleci/config.yml | 10 ++++++++++ frontend/playwright.config.js | 9 +++++---- frontend/playwright/ui/pages/BaseWebSocketPage.js | 2 +- frontend/scripts/e2e-server.js | 2 +- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 18d7cf5d7..52ec3b79e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -102,6 +102,16 @@ jobs: yarn install yarn test + - run: + name: "frontend integration tests" + working_directory: "./frontend" + command: | + yarn install + yarn run compile + clojure -M:dev:shadow-cljs compile main + yarn playwright install --with-deps chromium + yarn e2e:test + - run: name: "backend tests" working_directory: "./backend" diff --git a/frontend/playwright.config.js b/frontend/playwright.config.js index 08a372946..4c8b68424 100644 --- a/frontend/playwright.config.js +++ b/frontend/playwright.config.js @@ -18,18 +18,18 @@ export default defineConfig({ /* Retry on CI only */ retries: process.env.CI ? 2 : 0, /* Opt out of parallel tests on CI. */ - workers: process.env.CI ? 1 : undefined, + workers: process.env.CI ? 4 : undefined, /* Reporter to use. See https://playwright.dev/docs/test-reporters */ reporter: "html", /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ use: { /* Base URL to use in actions like `await page.goto('/')`. */ - baseURL: "http://0.0.0.0:3500", + baseURL: "http://localhost:3000", /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ trace: "on-first-retry", - locale: "en-US" + locale: "en-US", }, /* Configure projects for major browsers */ @@ -42,8 +42,9 @@ export default defineConfig({ /* Run your local dev server before starting the tests */ webServer: { + timeout: 2 * 60 * 1000, command: "yarn e2e:server", - url: "http://0.0.0.0:3500", + url: "http://localhost:3000", reuseExistingServer: !process.env.CI, }, }); diff --git a/frontend/playwright/ui/pages/BaseWebSocketPage.js b/frontend/playwright/ui/pages/BaseWebSocketPage.js index 85700e048..e382cd7b0 100644 --- a/frontend/playwright/ui/pages/BaseWebSocketPage.js +++ b/frontend/playwright/ui/pages/BaseWebSocketPage.js @@ -27,6 +27,6 @@ export class BaseWebSocketPage extends BasePage { * @returns {Promise} */ async waitForNotificationsWebSocket() { - return this.waitForWebSocket("ws://0.0.0.0:3500/ws/notifications"); + return this.waitForWebSocket("ws://localhost:3000/ws/notifications"); } } diff --git a/frontend/scripts/e2e-server.js b/frontend/scripts/e2e-server.js index cebddcdd3..4c441d21c 100644 --- a/frontend/scripts/e2e-server.js +++ b/frontend/scripts/e2e-server.js @@ -3,7 +3,7 @@ import { fileURLToPath } from "url"; import path from "path"; const app = express(); -const port = 3500; +const port = 3000; const staticPath = path.join(fileURLToPath(import.meta.url), "../../resources/public"); app.use(express.static(staticPath)); -- Gitee From cf4ef426d777e66463e30d6d99ddf1ae5b81409f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Fri, 10 May 2024 10:17:09 +0200 Subject: [PATCH 0525/1266] :white_check_mark: Add tests for component sync --- .../common_tests/logic/comp_sync_test.cljc | 495 ++++++++ .../common_tests/logic/comp_touched_test.cljc | 76 +- .../state_components_sync_test.cljs | 1075 ----------------- 3 files changed, 557 insertions(+), 1089 deletions(-) create mode 100644 common/test/common_tests/logic/comp_sync_test.cljc delete mode 100644 frontend/test/frontend_tests/state_components_sync_test.cljs diff --git a/common/test/common_tests/logic/comp_sync_test.cljc b/common/test/common_tests/logic/comp_sync_test.cljc new file mode 100644 index 000000000..1f3b8b4c2 --- /dev/null +++ b/common/test/common_tests/logic/comp_sync_test.cljc @@ -0,0 +1,495 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns common-tests.logic.comp-sync-test + (:require + [app.common.data :as d] + [app.common.files.changes-builder :as pcb] + [app.common.files.shapes-helpers :as cfsh] + [app.common.geom.point :as gpt] + [app.common.logic.libraries :as cll] + [app.common.logic.shapes :as cls] + [app.common.types.component :as ctk] + [app.common.types.components-list :as ctkl] + [app.common.types.shape-tree :as ctst] + [clojure.test :as t] + [common-tests.helpers.components :as thc] + [common-tests.helpers.compositions :as tho] + [common-tests.helpers.files :as thf] + [common-tests.helpers.ids-map :as thi] + [common-tests.helpers.shapes :as ths])) + +(t/use-fixtures :each thi/test-fixture) + +(t/deftest test-sync-when-changing-attribute + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (tho/add-simple-component-with-copy :component1 + :main-root + :main-child + :copy-root + :main-child-params {:fills (ths/sample-fills-color + :fill-color "#abcdef")} + :copy-root-params {:children-labels [:copy-child]})) + page (thf/current-page file) + main-child (ths/get-shape file :main-child) + + ;; ==== Action + changes1 (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) + #{(:id main-child)} + (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) + (:objects page) + {}) + + updated-file (thf/apply-changes file changes1) + + changes2 (cll/generate-sync-file-changes (pcb/empty-changes) + nil + :components + (:id updated-file) + (thi/id :component1) + (:id updated-file) + {(:id updated-file) updated-file} + (:id updated-file)) + + file' (thf/apply-changes updated-file changes2) + + ;; ==== Get + copy-root' (ths/get-shape file' :copy-root) + copy-child' (ths/get-shape file' :copy-child) + fills' (:fills copy-child') + fill' (first fills')] + + ;; ==== Check + (t/is (some? copy-root')) + (t/is (some? copy-child')) + (t/is (= (count fills') 1)) + (t/is (= (:fill-color fill') "#fabada")) + (t/is (= (:fill-opacity fill') 1)) + (t/is (= (:touched copy-root') nil)) + (t/is (= (:touched copy-child') nil)))) + +(t/deftest test-sync-when-changing-attribute-from-library + (let [;; ==== Setup + library (-> (thf/sample-file :file1) + (tho/add-simple-component :component1 + :main-root + :main-child + :copy-root + :main-child-params {:fills (ths/sample-fills-color + :fill-color "#abcdef")})) + + file (-> (thf/sample-file :file) + (thc/instantiate-component :component1 :copy-root + :library library + :children-labels [:copy-child])) + + page (thf/current-page library) + main-child (ths/get-shape library :main-child) + + ;; ==== Action + changes1 (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) + #{(:id main-child)} + (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) + (:objects page) + {}) + + updated-library (thf/apply-changes library changes1) + + changes2 (cll/generate-sync-file-changes (pcb/empty-changes) + nil + :components + (:id file) + (thi/id :component1) + (:id updated-library) + {(:id updated-library) updated-library + (:id file) file} + (:id file)) + + file' (thf/apply-changes file changes2) + + ;; ==== Get + copy-root' (ths/get-shape file' :copy-root) + copy-child' (ths/get-shape file' :copy-child) + fills' (:fills copy-child') + fill' (first fills')] + + ;; ==== Check + (t/is (some? copy-root')) + (t/is (some? copy-child')) + (t/is (= (count fills') 1)) + (t/is (= (:fill-color fill') "#fabada")) + (t/is (= (:fill-opacity fill') 1)) + (t/is (= (:touched copy-root') nil)) + (t/is (= (:touched copy-child') nil)))) + +(t/deftest test-sync-when-changing-attribute-preserve-touched + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (tho/add-simple-component-with-copy :component1 + :main-root + :main-child + :copy-root + :main-child-params {:fills (ths/sample-fills-color + :fill-color "#abcdef")} + :copy-root-params {:children-labels [:copy-child]})) + page (thf/current-page file) + main-child (ths/get-shape file :main-child) + copy-child (ths/get-shape file :copy-child) + + ;; ==== Action + changes1 (-> (pcb/empty-changes nil (:id page)) + (cls/generate-update-shapes + #{(:id copy-child)} + (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color "#aaaaaa"))) + (:objects page) + {}) + (cls/generate-update-shapes + #{(:id main-child)} + (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) + (:objects page) + {})) + + updated-file (thf/apply-changes file changes1) + + changes2 (cll/generate-sync-file-changes (pcb/empty-changes) + nil + :components + (:id updated-file) + (thi/id :component1) + (:id updated-file) + {(:id updated-file) updated-file} + (:id updated-file)) + + file' (thf/apply-changes updated-file changes2) + + ;; ==== Get + copy-root' (ths/get-shape file' :copy-root) + copy-child' (ths/get-shape file' :copy-child) + fills' (:fills copy-child') + fill' (first fills')] + + ;; ==== Check + (t/is (some? copy-root')) + (t/is (some? copy-child')) + (t/is (= (count fills') 1)) + (t/is (= (:fill-color fill') "#aaaaaa")) + (t/is (= (:fill-opacity fill') 1)) + (t/is (= (:touched copy-root') nil)) + (t/is (= (:touched copy-child') #{:fill-group})))) + +(t/deftest test-sync-when-adding-shape + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (tho/add-simple-component-with-copy :component1 + :main-root + :main-child + :copy-root + :copy-root-params {:children-labels [:copy-child]}) + (ths/add-sample-shape :free-shape)) + + page (thf/current-page file) + main-root (ths/get-shape file :main-root) + + ;; ==== Action + changes1 (cls/generate-relocate-shapes (pcb/empty-changes) + (:objects page) + #{(:parent-id main-root)} ; parents + (thi/id :main-root) ; parent-id + (:id page) ; page-id + 0 ; to-index + #{(thi/id :free-shape)}) ; ids + + updated-file (thf/apply-changes file changes1) + + changes2 (cll/generate-sync-file-changes (pcb/empty-changes) + nil + :components + (:id updated-file) + (thi/id :component1) + (:id updated-file) + {(:id updated-file) updated-file} + (:id updated-file)) + + file' (thf/apply-changes updated-file changes2) + + ;; ==== Get + main-free-shape' (ths/get-shape file' :free-shape) + copy-root' (ths/get-shape file' :copy-root) + copy-new-child-id' (d/seek #(not= % (thi/id :copy-child)) (:shapes copy-root')) + copy-new-child' (ths/get-shape-by-id file' copy-new-child-id')] + + ;; ==== Check + (t/is (some? copy-root')) + (t/is (some? copy-new-child')) + (t/is (= (:touched copy-root') nil)) + (t/is (= (:touched copy-new-child') nil)) + (t/is (ctst/parent-of? copy-root' copy-new-child')) + (t/is (ctk/is-main-of? main-free-shape' copy-new-child' true)))) + +(t/deftest test-sync-when-deleting-shape + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (tho/add-simple-component-with-copy :component1 + :main-root + :main-child + :copy-root + :copy-root-params {:children-labels [:copy-child]})) + + page (thf/current-page file) + main-child (ths/get-shape file :main-child) + + ;; ==== Action + + ;; IMPORTANT: as modifying copies structure is now forbidden, this action will not + ;; delete the child shape, but hide it (thus setting the visibility group). + [_all-parents changes1] + (cls/generate-delete-shapes (pcb/empty-changes) + file + page + (:objects page) + #{(:id main-child)} + {:components-v2 true}) + + updated-file (thf/apply-changes file changes1) + + changes2 (cll/generate-sync-file-changes (pcb/empty-changes) + nil + :components + (:id updated-file) + (thi/id :component1) + (:id updated-file) + {(:id updated-file) updated-file} + (:id updated-file)) + + file' (thf/apply-changes updated-file changes2) + + ;; ==== Get + copy-root' (ths/get-shape file' :copy-root) + copy-child' (ths/get-shape file' :copy-child)] + + ;; ==== Check + (t/is (some? copy-root')) + (t/is (nil? copy-child')) + (t/is (= (:touched copy-root') nil)) + (t/is (empty? (:shapes copy-root'))))) + +(t/deftest test-sync-when-moving-shape + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (tho/add-component-with-many-children-and-copy :component1 + :main-root + [:main-child1 :main-child2 :main-child3] + :copy-root + :copy-root-params {:children-labels [:copy-child1 + :copy-child2 + :copy-child3]}) + (ths/add-sample-shape :free-shape)) + + page (thf/current-page file) + main-child1 (ths/get-shape file :main-child1) + + ;; ==== Action + changes1 (cls/generate-relocate-shapes (pcb/empty-changes) + (:objects page) + #{(:parent-id main-child1)} ; parents + (thi/id :main-root) ; parent-id + (:id page) ; page-id + 2 ; to-index + #{(:id main-child1)}) ; ids + + updated-file (thf/apply-changes file changes1) + + changes2 (cll/generate-sync-file-changes (pcb/empty-changes) + nil + :components + (:id updated-file) + (thi/id :component1) + (:id updated-file) + {(:id updated-file) updated-file} + (:id updated-file)) + + file' (thf/apply-changes updated-file changes2) + + ;; ==== Get + copy-root' (ths/get-shape file' :copy-root) + copy-child1' (ths/get-shape file' :copy-child1) + copy-child2' (ths/get-shape file' :copy-child2) + copy-child3' (ths/get-shape file' :copy-child3)] + + ;; ==== Check + (t/is (some? copy-root')) + (t/is (some? copy-child1')) + (t/is (= (:touched copy-root') nil)) + (t/is (= (:touched copy-child1') nil)) + (t/is (= (:touched copy-child2') nil)) + (t/is (= (:touched copy-child3') nil)) + (t/is (= (second (:shapes copy-root')) (:id copy-child1'))) + (t/is (= (first (:shapes copy-root')) (:id copy-child2'))) + (t/is (= (nth (:shapes copy-root') 2) (:id copy-child3'))))) + +(t/deftest test-sync-when-changing-upper + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (tho/add-nested-component-with-copy :component1 + :main1-root + :main1-child + :component2 + :main2-root + :main2-nested-head + :copy2-root + :main2-root-params {:fills (ths/sample-fills-color + :fill-color "#abcdef")})) + page (thf/current-page file) + main2-root (ths/get-shape file :main2-root) + + ;; ==== Action + changes1 (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) + #{(:id main2-root)} + (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) + (:objects page) + {}) + + updated-file (thf/apply-changes file changes1) + + changes2 (cll/generate-sync-file-changes (pcb/empty-changes) + nil + :components + (:id updated-file) + (thi/id :component2) + (:id updated-file) + {(:id updated-file) updated-file} + (:id updated-file)) + + file' (thf/apply-changes updated-file changes2) + + ;; ==== Get + copy2-root' (ths/get-shape file' :copy2-root) + fills' (:fills copy2-root') + fill' (first fills')] + + ;; ==== Check + (t/is (some? copy2-root')) + (t/is (= (count fills') 1)) + (t/is (= (:fill-color fill') "#fabada")) + (t/is (= (:fill-opacity fill') 1)) + (t/is (= (:touched copy2-root') nil)))) + +(t/deftest test-sync-when-changing-lower-near + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (tho/add-nested-component-with-copy :component1 + :main1-root + :main1-child + :component2 + :main2-root + :main2-nested-head + :copy2-root + :copy2-root-params {:children-labels [:copy2-child]})) + page (thf/current-page file) + main2-nested-head (ths/get-shape file :main2-nested-head) + + ;; ==== Action + changes1 (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) + #{(:id main2-nested-head)} + (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) + (:objects page) + {}) + + updated-file (thf/apply-changes file changes1) + + changes2 (cll/generate-sync-file-changes (pcb/empty-changes) + nil + :components + (:id updated-file) + (thi/id :component2) + (:id updated-file) + {(:id updated-file) updated-file} + (:id updated-file)) + + file' (thf/apply-changes updated-file changes2) + + ;; ==== Get + copy2-root' (ths/get-shape file' :copy2-root) + copy2-child' (ths/get-shape file' :copy2-child) + fills' (:fills copy2-child') + fill' (first fills')] + + ;; ==== Check + (t/is (some? copy2-root')) + (t/is (some? copy2-child')) + (t/is (= (count fills') 1)) + (t/is (= (:fill-color fill') "#fabada")) + (t/is (= (:fill-opacity fill') 1)) + (t/is (= (:touched copy2-root') nil)) + (t/is (= (:touched copy2-child') nil)))) + +(t/deftest test-sync-when-changing-lower-remote + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (tho/add-nested-component-with-copy :component1 + :main1-root + :main1-child + :component2 + :main2-root + :main2-nested-head + :copy2-root + :copy2-root-params {:children-labels [:copy2-child]})) + page (thf/current-page file) + main1-root (ths/get-shape file :main1-root) + + ;; ==== Action + changes1 (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) + #{(:id main1-root)} + (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) + (:objects page) + {}) + + updated-file (thf/apply-changes file changes1) + + changes2 (cll/generate-sync-file-changes (pcb/empty-changes) + nil + :components + (:id updated-file) + (thi/id :component1) + (:id updated-file) + {(:id updated-file) updated-file} + (:id updated-file)) + + synced-file (thf/apply-changes updated-file changes2) + + changes3 (cll/generate-sync-file-changes (pcb/empty-changes) + nil + :components + (:id synced-file) + (thi/id :component2) + (:id synced-file) + {(:id synced-file) synced-file} + (:id synced-file)) + + file' (thf/apply-changes synced-file changes3) + + ;; ==== Get + copy2-root' (ths/get-shape file' :copy2-root) + copy2-child' (ths/get-shape file' :copy2-child) + fills' (:fills copy2-child') + fill' (first fills')] + + ;; ==== Check + (t/is (some? copy2-root')) + (t/is (some? copy2-child')) + (t/is (= (count fills') 1)) + (t/is (= (:fill-color fill') "#fabada")) + (t/is (= (:fill-opacity fill') 1)) + (t/is (= (:touched copy2-root') nil)) + (t/is (= (:touched copy2-child') nil)))) \ No newline at end of file diff --git a/common/test/common_tests/logic/comp_touched_test.cljc b/common/test/common_tests/logic/comp_touched_test.cljc index c4f658fea..9293cdb27 100644 --- a/common/test/common_tests/logic/comp_touched_test.cljc +++ b/common/test/common_tests/logic/comp_touched_test.cljc @@ -118,11 +118,11 @@ ;; will not have any effect, and so the parent shape won't also be touched. changes (cls/generate-relocate-shapes (pcb/empty-changes) (:objects page) - #{(:parent-id copy-root)} ; parents - (thi/id :copy-root) ; parent-id - (:id page) ; page-id - 0 ; to-index - #{(thi/id :free-shape)}) ; ids + #{(:parent-id copy-root)} ; parents + (thi/id :copy-root) ; parent-id + (:id page) ; page-id + 0 ; to-index + #{(thi/id :free-shape)}) ; ids file' (thf/apply-changes file changes) @@ -193,23 +193,30 @@ ;; will not have any effect, and so the parent shape won't also be touched. changes (cls/generate-relocate-shapes (pcb/empty-changes) (:objects page) - #{(:parent-id copy-child1)} ; parents - (thi/id :copy-root) ; parent-id - (:id page) ; page-id - 2 ; to-index - #{(:id copy-child1)}) ; ids + #{(:parent-id copy-child1)} ; parents + (thi/id :copy-root) ; parent-id + (:id page) ; page-id + 2 ; to-index + #{(:id copy-child1)}) ; ids file' (thf/apply-changes file changes) ;; ==== Get - copy-root' (ths/get-shape file' :copy-root) - copy-child' (ths/get-shape file' :copy-child1)] + copy-root' (ths/get-shape file' :copy-root) + copy-child1' (ths/get-shape file' :copy-child1) + copy-child2' (ths/get-shape file' :copy-child2) + copy-child3' (ths/get-shape file' :copy-child3)] ;; ==== Check (t/is (some? copy-root')) - (t/is (some? copy-child')) + (t/is (some? copy-child1')) (t/is (= (:touched copy-root') nil)) - (t/is (= (:touched copy-child') nil)))) + (t/is (= (:touched copy-child1') nil)) + (t/is (= (:touched copy-child2') nil)) + (t/is (= (:touched copy-child3') nil)) + (t/is (= (first (:shapes copy-root')) (:id copy-child1'))) + (t/is (= (second (:shapes copy-root')) (:id copy-child2'))) + (t/is (= (nth (:shapes copy-root') 2) (:id copy-child3'))))) (t/deftest test-touched-when-changing-upper (let [;; ==== Setup @@ -290,3 +297,44 @@ (t/is (= (:fill-opacity fill') 1)) (t/is (= (:touched copy2-root') nil)) (t/is (= (:touched copy2-child') #{:fill-group})))) + +(t/deftest test-touched-when-changing-lower + (let [;; ==== Setup + file (-> (thf/sample-file :file1) + (tho/add-nested-component-with-copy :component1 + :main1-root + :main1-child + :component2 + :main2-root + :main2-nested-head + :copy2-root + :copy2-root-params {:children-labels [:copy2-child]})) + page (thf/current-page file) + copy2-child (ths/get-shape file :copy2-child) + + ;; ==== Action + update-fn (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) + + changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) + #{(:id copy2-child)} + update-fn + (:objects page) + {}) + + file' (thf/apply-changes file changes) + + ;; ==== Get + copy2-root' (ths/get-shape file' :copy2-root) + copy2-child' (ths/get-shape file' :copy2-child) + fills' (:fills copy2-child') + fill' (first fills')] + + ;; ==== Check + (t/is (some? copy2-root')) + (t/is (some? copy2-child')) + (t/is (= (count fills') 1)) + (t/is (= (:fill-color fill') "#fabada")) + (t/is (= (:fill-opacity fill') 1)) + (t/is (= (:touched copy2-root') nil)) + (t/is (= (:touched copy2-child') #{:fill-group})))) \ No newline at end of file diff --git a/frontend/test/frontend_tests/state_components_sync_test.cljs b/frontend/test/frontend_tests/state_components_sync_test.cljs deleted file mode 100644 index 381669c6a..000000000 --- a/frontend/test/frontend_tests/state_components_sync_test.cljs +++ /dev/null @@ -1,1075 +0,0 @@ -;; This Source Code Form is subject to the terms of the Mozilla Public -;; License, v. 2.0. If a copy of the MPL was not distributed with this -;; file, You can obtain one at http://mozilla.org/MPL/2.0/. -;; -;; Copyright (c) KALEIDOS INC - -(ns frontend-tests.state-components-sync-test - (:require - [app.common.colors :as clr] - [app.main.data.workspace :as dw] - [app.main.data.workspace.changes :as dch] - [app.main.data.workspace.libraries :as dwl] - [app.main.data.workspace.shapes :as dwsh] - [app.main.data.workspace.state-helpers :as wsh] - [cljs.test :as t :include-macros true] - [frontend-tests.helpers.events :as the] - [frontend-tests.helpers.libraries :as thl] - [frontend-tests.helpers.pages :as thp] - [potok.v2.core :as ptk])) - -(t/use-fixtures :each - {:before thp/reset-idmap!}) - -;; === Test update component ====================== - -(t/deftest test-update-component - (t/async done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1" - :fill-color clr/white - :fill-opacity 1}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)]) - (thp/instantiate-component :instance1 - (thp/id :component1)) - (thp/instantiate-component :instance2 - (thp/id :component1))) - - [instance1 shape1'] - (thl/resolve-instance state (thp/id :instance1)) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Rect 1 - ;; Rect 1 - ;; Rect 1 #--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; Rect 1 #--> Rect 1 - ;; Rect 1 ---> Rect 1 <== (not updated) - ;; - ;; [Rect 1] - ;; page1 / Rect 1 - ;; - (let [[[main1 shape1] [c-main1 c-shape1] component1] - (thl/resolve-instance-and-main - new-state - (thp/id :main1)) - - [[instance1 shape2] [c-instance1 c-shape2] component2] - (thl/resolve-instance-and-main - new-state - (thp/id :instance1)) - - [[instance2 shape3] [c-instance2 c-shape3] component3] - (thl/resolve-instance-and-main - new-state - (thp/id :instance2))] - - (t/is (= (:name main1) "Rect 1")) - (t/is (= (:touched main1) nil)) - (t/is (= (:shape-ref main1) nil)) - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:fill-color shape1) clr/test)) - (t/is (= (:fill-opacity shape1) 0.5)) - (t/is (= (:touched shape1) nil)) - (t/is (= (:shape-ref shape1) nil)) - - (t/is (= (:name instance1) "Rect 1")) - (t/is (= (:touched instance1) nil)) - (t/is (= (:shape-ref instance1) (:id c-main1))) - (t/is (= (:name shape2) "Rect 1")) - (t/is (= (:fill-color shape2) clr/test)) - (t/is (= (:fill-opacity shape2) 0.5)) - (t/is (= (:touched shape2) nil)) - (t/is (= (:shape-ref shape2) (:id c-shape1))) - - (t/is (= (:name instance2) "Rect 1")) - (t/is (= (:touched instance2) nil)) - (t/is (= (:shape-ref instance2) (:id c-main1))) - (t/is (= (:name shape3) "Rect 1")) - (t/is (= (:fill-color shape3) clr/white)) - (t/is (= (:fill-opacity shape3) 1)) - (t/is (= (:touched shape3) nil)) - (t/is (= (:shape-ref shape3) (:id c-shape1))) - - (t/is (= component1 component2 component3)) - (t/is (= c-main1 main1)) - (t/is (= c-shape1 shape1)) - (t/is (= c-instance1 c-main1)) - (t/is (= c-shape2 c-shape1)) - (t/is (= c-instance2 c-main1)) - (t/is (= c-shape3 c-shape1)))))] - - (ptk/emit! - store - (dch/update-shapes [(:id shape1')] - (fn [shape] - (merge shape {:fill-color clr/test - :fill-opacity 0.5}))) - (dwl/update-component (:id instance1)) - :the/end)))) - -(t/deftest test-update-component-and-sync - (t/async done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1" - :fill-color clr/white - :fill-opacity 1}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)]) - (thp/instantiate-component :instance1 - (thp/id :component1)) - (thp/instantiate-component :instance2 - (thp/id :component1))) - - file (wsh/get-local-file state) - - [instance1 shape1'] - (thl/resolve-instance state (thp/id :instance1)) - - [_instance2 _shape1''] - (thl/resolve-instance state (thp/id :instance2)) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Rect 1 - ;; Rect 1 - ;; Rect 1 #--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; Rect 1 #--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; - ;; [Rect 1] - ;; page1 / Rect 1 - ;; - (let [[[main1 shape1] [c-main1 c-shape1] component1] - (thl/resolve-instance-and-main - new-state - (thp/id :main1)) - - [[instance1 shape2] [c-instance1 c-shape2] component2] - (thl/resolve-instance-and-main - new-state - (thp/id :instance1)) - - [[instance2 shape3] [c-instance2 c-shape3] component3] - (thl/resolve-instance-and-main - new-state - (thp/id :instance2))] - - (t/is (= (:name main1) "Rect 1")) - (t/is (= (:touched main1) nil)) - (t/is (= (:shape-ref main1) nil)) - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:fill-color shape1) clr/test)) - (t/is (= (:fill-opacity shape1) 0.5)) - (t/is (= (:touched shape1) nil)) - (t/is (= (:shape-ref shape1) nil)) - - (t/is (= (:name instance1) "Rect 1")) - (t/is (= (:touched instance1) nil)) - (t/is (= (:shape-ref instance1) (:id c-main1))) - (t/is (= (:name shape2) "Rect 1")) - (t/is (= (:fill-color shape2) clr/test)) - (t/is (= (:fill-opacity shape2) 0.5)) - (t/is (= (:touched shape2) nil)) - (t/is (= (:shape-ref shape2) (:id c-shape1))) - - (t/is (= (:name instance2) "Rect 1")) - (t/is (= (:touched instance2) nil)) - (t/is (= (:shape-ref instance2) (:id c-main1))) - (t/is (= (:name shape3) "Rect 1")) - (t/is (= (:fill-color shape3) clr/test)) - (t/is (= (:fill-opacity shape3) 0.5)) - (t/is (= (:touched shape3) nil)) - (t/is (= (:shape-ref shape3) (:id c-shape1))) - - (t/is (= component1 component2 component3)) - (t/is (= c-main1 main1)) - (t/is (= c-shape1 shape1)) - (t/is (= c-instance1 c-main1)) - (t/is (= c-shape2 c-shape1)) - (t/is (= c-instance2 c-main1)) - (t/is (= c-shape3 c-shape1)))))] - - (ptk/emit! - store - (dch/update-shapes [(:id shape1')] - (fn [shape] - (merge shape {:fill-color clr/test - :fill-opacity 0.5}))) - (dwl/update-component-sync (:id instance1) (:id file)) - :the/end)))) - -(t/deftest test-update-preserve-touched - (t/async done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1" - :fill-color clr/white - :fill-opacity 1}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)]) - (thp/instantiate-component :instance1 - (thp/id :component1)) - (thp/instantiate-component :instance2 - (thp/id :component1))) - - file (wsh/get-local-file state) - - [instance1 shape1'] - (thl/resolve-instance state (thp/id :instance1)) - - [_instance2 shape1''] - (thl/resolve-instance state (thp/id :instance2)) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Rect 1 - ;; Rect 1 - ;; Rect 1 #--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; Rect 1 #--> Rect 1 - ;; Rect 1* ---> Rect 1 - ;; #{:stroke-group} - ;; - ;; [Rect 1] - ;; page1 / Rect 1 - ;; - (let [[[main1 shape1] [c-main1 c-shape1] component1] - (thl/resolve-instance-and-main - new-state - (thp/id :main1)) - - [[instance1 shape2] [c-instance1 c-shape2] component2] - (thl/resolve-instance-and-main - new-state - (thp/id :instance1)) - - [[instance2 shape3] [c-instance2 c-shape3] component3] - (thl/resolve-instance-and-main - new-state - (thp/id :instance2))] - - (t/is (= (:name main1) "Rect 1")) - (t/is (= (:touched main1) nil)) - (t/is (= (:shape-ref main1) nil)) - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:fill-color shape1) clr/test)) - (t/is (= (:stroke-width shape1) 0.5)) - (t/is (= (:touched shape1) nil)) - (t/is (= (:shape-ref shape1) nil)) - - (t/is (= (:name instance1) "Rect 1")) - (t/is (= (:touched instance1) nil)) - (t/is (= (:shape-ref instance1) (:id c-main1))) - (t/is (= (:name shape2) "Rect 1")) - (t/is (= (:fill-color shape2) clr/test)) - (t/is (= (:stroke-width shape2) 0.5)) - (t/is (= (:touched shape2) nil)) - (t/is (= (:shape-ref shape2) (:id c-shape1))) - - (t/is (= (:name instance2) "Rect 1")) - (t/is (= (:touched instance2) nil)) - (t/is (= (:shape-ref instance2) (:id c-main1))) - (t/is (= (:name shape3) "Rect 1")) - (t/is (= (:fill-color shape3) clr/test)) - (t/is (= (:stroke-width shape3) 0.2)) - (t/is (= (:touched shape3) #{:stroke-group})) - (t/is (= (:shape-ref shape3) (:id c-shape1))) - - (t/is (= component1 component2 component3)) - (t/is (= c-main1 main1)) - (t/is (= c-shape1 shape1)) - (t/is (= c-instance1 c-main1)) - (t/is (= c-shape2 c-shape1)) - (t/is (= c-instance2 c-main1)) - (t/is (= c-shape3 c-shape1)))))] - - (ptk/emit! - store - (dch/update-shapes [(:id shape1')] - (fn [shape] - (merge shape {:fill-color clr/test - :stroke-width 0.5}))) - (dch/update-shapes [(:id shape1'')] - (fn [shape] - (merge shape {:stroke-width 0.2}))) - (dwl/update-component-sync (:id instance1) (:id file)) - :the/end)))) - -(t/deftest test-update-children-add - (t/async done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1" - :fill-color clr/white - :fill-opacity 1}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)]) - (thp/instantiate-component :instance1 - (thp/id :component1)) - (thp/instantiate-component :instance2 - (thp/id :component1)) - (thp/sample-shape :shape2 :circle - {:name "Circle 1"})) - - file (wsh/get-local-file state) - - instance1 (thp/get-shape state :instance1) - shape2 (thp/get-shape state :shape2) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page: Page 1] - ;; Root Frame - ;; {Rect 1} # - ;; Rect 1 - ;; Rect 1 #--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; Rect 1 #--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; Circle 1 - ;; - ;; ========= Local library - ;; - ;; [Component: Rect 1] - ;; --> [Page 1] Rect 1 - ;; - (let [[[main1 shape1] - [c-main1 c-shape1] component1] - (thl/resolve-instance-and-main - new-state - (thp/id :main1)) - - [[instance1 shape2] - [c-instance1 c-shape2] component2] - (thl/resolve-instance-and-main - new-state - (thp/id :instance1)) - - [[instance2 shape3] - [c-instance2 c-shape3] component3] - (thl/resolve-instance-and-main - new-state - (thp/id :instance2))] - - (t/is (= (:name main1) "Rect 1")) - (t/is (= (:touched main1) nil)) - (t/is (= (:shape-ref main1) nil)) - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:touched shape1) nil)) - (t/is (= (:shape-ref shape1) nil)) - - (t/is (= (:name instance1) "Rect 1")) - (t/is (= (:touched instance1) nil)) - (t/is (= (:shape-ref instance1) (:id c-main1))) - (t/is (= (:name shape2) "Rect 1")) - (t/is (= (:touched shape2) nil)) - (t/is (= (:shape-ref shape2) (:id c-shape1))) - - (t/is (= (:name instance2) "Rect 1")) - (t/is (= (:touched instance2) nil)) - (t/is (= (:shape-ref instance2) (:id c-main1))) - (t/is (= (:name shape3) "Rect 1")) - (t/is (= (:touched shape3) nil)) - (t/is (= (:shape-ref shape2) (:id c-shape1))) - - (t/is (= component1 component2 component3)) - (t/is (= c-main1 main1)) - (t/is (= c-shape1 shape1)) - (t/is (= c-instance1 c-main1)) - (t/is (= c-shape2 c-shape1)) - (t/is (= c-instance2 c-main1)) - (t/is (= c-shape3 c-shape1)))))] - - (ptk/emit! - store - (dw/relocate-shapes #{(:id shape2)} (:id instance1) 0) ;; We cant't change the structure of component copies, so this operation will do nothing - (dwl/update-component-sync (:id instance1) (:id file)) - :the/end)))) - -(t/deftest test-update-children-delete - (t/async done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1"}) - (thp/sample-shape :shape2 :rect - {:name "Rect 2"}) - (thp/make-component :main1 :component1 - [(thp/id :shape1) - (thp/id :shape2)]) - (thp/instantiate-component :instance1 - (thp/id :component1)) - (thp/instantiate-component :instance2 - (thp/id :component1))) - - file (wsh/get-local-file state) - - [instance1 shape1' _shape2'] - (thl/resolve-instance state (thp/id :instance1)) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Component 1 - ;; Rect 1 - ;; Rect 2 - ;; Component 1 #--> Component 1 - ;; Rect 1 ---> Rect 1 - ;; Rect 2 ---> Rect 2 - ;; Component 1 #--> Component 1 - ;; Rect 1 ---> Rect 1 - ;; Rect 2 ---> Rect 2 - ;; - ;; [Component 1] - ;; page1 / Component 1 - ;; - (let [[[main1 shape1 shape2] - [c-main1 c-shape1 c-shape2] component1] - (thl/resolve-instance-and-main - new-state - (thp/id :main1)) - - [[instance1 shape3 shape4] - [c-instance1 c-shape3 c-shape4] component2] - (thl/resolve-instance-and-main - new-state - (thp/id :instance1)) - - [[instance2 shape5 shape6] - [c-instance2 c-shape5 c-shape6] component3] - (thl/resolve-instance-and-main - new-state - (thp/id :instance2))] - - (t/is (= (:name main1) "Component 1")) - (t/is (= (:touched main1) nil)) - (t/is (= (:shape-ref main1) nil)) - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:hidden shape1) true)) ;; Instance shapes are not deleted but hidden - (t/is (= (:touched shape1) nil)) - (t/is (= (:shape-ref shape1) nil)) - (t/is (= (:name shape2) "Rect 2")) - (t/is (= (:hidden shape2) nil)) - (t/is (= (:touched shape2) nil)) - (t/is (= (:shape-ref shape2) nil)) - - (t/is (= (:name instance1) "Component 1")) - (t/is (= (:touched instance1) nil)) - (t/is (= (:shape-ref instance1) (:id c-main1))) - (t/is (= (:name shape3) "Rect 1")) - (t/is (= (:hidden shape3) true)) - (t/is (= (:touched shape3) nil)) - (t/is (= (:shape-ref shape3) (:id c-shape1))) - (t/is (= (:name shape4) "Rect 2")) - (t/is (= (:hidden shape4) nil)) - (t/is (= (:touched shape4) nil)) - (t/is (= (:shape-ref shape4) (:id c-shape2))) - - (t/is (= (:name instance2) "Component 1")) - (t/is (= (:touched instance2) nil)) - (t/is (= (:shape-ref instance2) (:id c-main1))) - (t/is (= (:name shape5) "Rect 1")) - (t/is (= (:hidden shape5) true)) - (t/is (= (:touched shape5) nil)) - (t/is (= (:shape-ref shape5) (:id c-shape1))) - (t/is (= (:name shape6) "Rect 2")) - (t/is (= (:hidden shape6) nil)) - (t/is (= (:touched shape6) nil)) - (t/is (= (:shape-ref shape6) (:id c-shape2))) - - (t/is (= component1 component2 component3)) - (t/is (= c-main1 main1)) - (t/is (= c-shape1 shape1)) - (t/is (= c-shape2 shape2)) - (t/is (= c-instance1 c-main1)) - (t/is (= c-shape3 c-shape1)) - (t/is (= c-shape4 c-shape2)) - (t/is (= c-instance2 c-main1)) - (t/is (= c-shape5 c-shape1)) - (t/is (= c-shape6 c-shape2)))))] - - (ptk/emit! - store - (dwsh/delete-shapes #{(:id shape1')}) - (dwl/update-component-sync (:id instance1) (:id file)) - :the/end)))) - -(t/deftest test-update-children-move - (t/async done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1"}) - (thp/sample-shape :shape2 :rect - {:name "Rect 2"}) - (thp/sample-shape :shape3 :rect - {:name "Rect 3"}) - (thp/make-component :main1 :component1 - [(thp/id :shape1) - (thp/id :shape2) - (thp/id :shape3)]) - (thp/instantiate-component :instance1 - (thp/id :component1)) - (thp/instantiate-component :instance2 - (thp/id :component1))) - - file (wsh/get-local-file state) - - [instance1 shape1' _shape2' _shape3'] - (thl/resolve-instance state (thp/id :instance1)) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Component 1 - ;; Rect 1 - ;; Rect 2 - ;; Rect 3 - ;; Component 1 #--> Component 1 - ;; Rect 1 ---> Rect 1 - ;; Rect 2 ---> Rect 2 - ;; Rect 3 ---> Rect 3 - ;; Component 1 #--> Component 1 - ;; Rect 1 ---> Rect 1 - ;; Rect 2 ---> Rect 2 - ;; Rect 3 ---> Rect 3 - ;; - ;; [Component 1] - ;; page1 / Component 1 - ;; - (let [[[main1 shape1 shape2 shape3] - [c-main1 c-shape1 c-shape2 c-shape3] component1] - (thl/resolve-instance-and-main - new-state - (thp/id :main1)) - - [[instance1 shape4 shape5 shape6] - [c-instance1 c-shape4 c-shape5 c-shape6] component2] - (thl/resolve-instance-and-main - new-state - (thp/id :instance1)) - - [[instance2 shape7 shape8 shape9] - [c-instance2 c-shape7 c-shape8 c-shape9] component3] - (thl/resolve-instance-and-main - new-state - (thp/id :instance2))] - - (t/is (= (:name main1) "Component 1")) - (t/is (= (:touched main1) nil)) - (t/is (= (:shape-ref main1) nil)) - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:touched shape1) nil)) - (t/is (= (:shape-ref shape1) nil)) - (t/is (= (:name shape2) "Rect 2")) - (t/is (= (:touched shape2) nil)) - (t/is (= (:shape-ref shape2) nil)) - (t/is (= (:name shape3) "Rect 3")) - (t/is (= (:touched shape3) nil)) - (t/is (= (:shape-ref shape3) nil)) - - (t/is (= (:name instance1) "Component 1")) - (t/is (= (:touched instance1) nil)) - (t/is (= (:shape-ref instance1) (:id c-main1))) - (t/is (= (:name shape4) "Rect 1")) - (t/is (= (:touched shape4) nil)) - (t/is (= (:shape-ref shape4) (:id c-shape1))) - (t/is (= (:name shape5) "Rect 2")) - (t/is (= (:touched shape5) nil)) - (t/is (= (:shape-ref shape5) (:id c-shape2))) - (t/is (= (:name shape6) "Rect 3")) - (t/is (= (:touched shape6) nil)) - (t/is (= (:shape-ref shape6) (:id c-shape3))) - - (t/is (= (:name instance2) "Component 1")) - (t/is (= (:touched instance2) nil)) - (t/is (= (:shape-ref instance2) (:id c-main1))) - (t/is (= (:name shape7) "Rect 1")) - (t/is (= (:touched shape7) nil)) - (t/is (= (:shape-ref shape7) (:id c-shape1))) - (t/is (= (:name shape8) "Rect 2")) - (t/is (= (:touched shape8) nil)) - (t/is (= (:shape-ref shape8) (:id c-shape2))) - (t/is (= (:name shape9) "Rect 3")) - (t/is (= (:touched shape9) nil)) - (t/is (= (:shape-ref shape9) (:id c-shape3))) - - (t/is (= component1 component2 component3)) - (t/is (= c-main1 main1)) - (t/is (= c-shape1 shape1)) - (t/is (= c-shape2 shape2)) - (t/is (= c-shape3 shape3)) - (t/is (= c-instance1 c-main1)) - (t/is (= c-shape4 c-shape4)) - (t/is (= c-shape5 c-shape5)) - (t/is (= c-shape6 c-shape6)) - (t/is (= c-instance2 c-main1)) - (t/is (= c-shape7 c-shape7)) - (t/is (= c-shape8 c-shape8)) - (t/is (= c-shape9 c-shape9)))))] - - (ptk/emit! - store - (dw/relocate-shapes #{(:id shape1')} (:id instance1) 2) - (dwl/update-component-sync (:id instance1) (:id file)) - :the/end)))) - -(t/deftest test-update-from-lib - (t/async done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1" - :fill-color clr/white - :fill-opacity 1}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)]) - (thp/move-to-library :lib1 "Library 1") - (thp/sample-page) - (thp/instantiate-component :instance1 - (thp/id :component1) - (thp/id :lib1)) - (thp/instantiate-component :instance2 - (thp/id :component1) - (thp/id :lib1))) - - [instance1 shape1'] - (thl/resolve-instance state (thp/id :instance1)) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Rect 1 #--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; Rect 1 #--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; - (let [[[instance1 shape1] [c-instance1 c-shape1] _component1] - (thl/resolve-instance-and-main - new-state - (thp/id :instance1)) - - [[instance2 shape2] [_c-instance2 _c-shape2] _component2] - (thl/resolve-instance-and-main - new-state - (thp/id :instance2))] - - (t/is (= (:name instance1) "Rect 1")) - (t/is (= (:touched instance1) nil)) - (t/is (= (:name shape1) "Rect 1")) - (t/is (= (:fill-color shape1) clr/test)) - (t/is (= (:fill-opacity shape1) 0.5)) - (t/is (= (:touched shape1) nil)) - - (t/is (= (:name c-instance1) "Rect 1")) - (t/is (= (:touched c-instance1) nil)) - (t/is (= (:name c-shape1) "Rect 1")) - (t/is (= (:fill-color c-shape1) clr/test)) - (t/is (= (:fill-opacity c-shape1) 0.5)) - (t/is (= (:touched c-shape1) nil)) - - (t/is (= (:name instance2) "Rect 1")) - (t/is (= (:touched instance2) nil)) - (t/is (= (:name shape2) "Rect 1")) - (t/is (= (:fill-color shape2) clr/test)) - (t/is (= (:fill-opacity shape2) 0.5)) - (t/is (= (:touched shape2) nil)))))] - - (ptk/emit! - store - (dch/update-shapes [(:id shape1')] - (fn [shape] - (merge shape {:fill-color clr/test - :fill-opacity 0.5}))) - (dwl/update-component-sync (:id instance1) (thp/id :lib1)) - :the/end)))) - -(t/deftest test-update-nested-upper - (t/async done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1" - :fill-color clr/white - :fill-opacity 1}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)]) - (thp/instantiate-component :instance1 - (thp/id :component1)) - (thp/sample-shape :shape2 :circle - {:name "Circle 1" - :fill-color clr/black - :fill-opacity 0}) - (thp/frame-shapes :frame1 - [(thp/id :instance1) - (thp/id :shape2)]) - (thp/make-component :main2 :component2 - [(thp/id :frame1)]) - (thp/instantiate-component :instance2 - (thp/id :component2)) - (thp/instantiate-component :instance3 - (thp/id :component2))) - - file (wsh/get-local-file state) - - [instance2 _instance1 shape1' _shape2'] - (thl/resolve-instance state (thp/id :instance2)) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Rect 1 - ;; Rect 1 - ;; Group - ;; Rect 1 #--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; Circle 1 - ;; Group #--> Group - ;; Rect 1 @--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; Circle 1 ---> Circle 1 - ;; Group #--> Group - ;; Rect 1 @--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; Circle 1 ---> Circle 1 - ;; - ;; [Rect 1] - ;; page1 / Rect 1 - ;; - ;; [Group] - ;; page1 / Group - ;; - (let [[[instance2 instance1 shape1 shape2] - [c-instance2 c-instance1 c-shape1 c-shape2] _component1] - (thl/resolve-instance-and-main - new-state - (thp/id :instance2)) - - [[instance4 instance3 shape3 shape4] - [_c-instance4 _c-instance3 _c-shape3 _c-shape4] _component2] - (thl/resolve-instance-and-main - new-state - (thp/id :instance3))] - - (t/is (= (:name instance2) "Board")) - (t/is (= (:touched instance2) nil)) - (t/is (= (:name instance1) "Rect 1")) - (t/is (= (:touched instance1) nil)) - (t/is (= (:name shape1) "Circle 1")) - (t/is (= (:touched shape1) nil)) - (t/is (= (:fill-color shape1) clr/test)) - (t/is (= (:fill-opacity shape1) 0.5)) - (t/is (= (:name shape2) "Rect 1")) - (t/is (= (:touched shape2) nil)) - (t/is (= (:fill-color shape2) clr/white)) - (t/is (= (:fill-opacity shape2) 1)) - - (t/is (= (:name c-instance2) "Board")) - (t/is (= (:touched c-instance2) nil)) - (t/is (= (:name c-instance1) "Rect 1")) - (t/is (= (:touched c-instance1) nil)) - (t/is (= (:name c-shape1) "Circle 1")) - (t/is (= (:touched c-shape1) nil)) - (t/is (= (:fill-color c-shape1) clr/test)) - (t/is (= (:fill-opacity c-shape1) 0.5)) - (t/is (= (:name c-shape2) "Rect 1")) - (t/is (= (:touched c-shape2) nil)) - (t/is (= (:fill-color c-shape2) clr/white)) - (t/is (= (:fill-opacity c-shape2) 1)) - - (t/is (= (:name instance4) "Board")) - (t/is (= (:touched instance4) nil)) - (t/is (= (:name instance3) "Rect 1")) - (t/is (= (:touched instance3) nil)) - (t/is (= (:name shape3) "Circle 1")) - (t/is (= (:touched shape3) nil)) - (t/is (= (:fill-color shape3) clr/test)) - (t/is (= (:fill-opacity shape3) 0.5)) - (t/is (= (:name shape4) "Rect 1")) - (t/is (= (:touched shape4) nil)) - (t/is (= (:fill-color shape4) clr/white)) - (t/is (= (:fill-opacity shape4) 1)))))] - - (ptk/emit! - store - (dch/update-shapes [(:id shape1')] - (fn [shape] - (merge shape {:fill-color clr/test - :fill-opacity 0.5}))) - (dwl/update-component-sync (:id instance2) (:id file)) - :the/end)))) - -(t/deftest test-update-nested-lower-near - (t/async done - (let [state (-> thp/initial-state - (thp/sample-page) - (thp/sample-shape :shape1 :rect - {:name "Rect 1" - :fill-color clr/white - :fill-opacity 1}) - (thp/make-component :main1 :component1 - [(thp/id :shape1)]) - (thp/instantiate-component :instance1 - (thp/id :component1)) - (thp/sample-shape :shape2 :circle - {:name "Circle 1" - :fill-color clr/black - :fill-opacity 0}) - (thp/frame-shapes :frame1 - [(thp/id :instance1) - (thp/id :shape2)]) - (thp/make-component :main2 :component2 - [(thp/id :frame1)]) - (thp/instantiate-component :instance2 - (thp/id :component2)) - (thp/instantiate-component :instance3 - (thp/id :component2))) - - file (wsh/get-local-file state) - - [instance2 instance1 _shape1' shape2'] - (thl/resolve-instance state (thp/id :instance2)) - - store (the/prepare-store state done - (fn [new-state] - ;; Expected shape tree: - ;; - ;; [Page] - ;; Root Frame - ;; Rect 1 - ;; Rect 1 - ;; Group - ;; Rect 1 #--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; Circle 1 - ;; Group #--> Group - ;; Rect 1 @--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; Circle 1 ---> Circle 1 - ;; Group #--> Group - ;; Rect 1 @--> Rect 1 - ;; Rect 1 ---> Rect 1 - ;; Circle 1 ---> Circle 1 - ;; - ;; [Rect 1] - ;; page1 / Rect 1 - ;; - ;; [Group] - ;; page1 / Group - ;; - (let [[[instance2 instance1 shape1 shape2] - [c-instance2 c-instance1 c-shape1 c-shape2] _component1] - (thl/resolve-instance-and-main - new-state - (thp/id :instance2)) - - [[instance4 instance3 shape3 shape4] - [_c-instance4 _c-instance3 _c-shape3 _c-shape4] _component2] - (thl/resolve-instance-and-main - new-state - (thp/id :instance3))] - - (t/is (= (:name instance2) "Board")) - (t/is (= (:touched instance2) nil)) - (t/is (= (:name instance1) "Rect 1")) - (t/is (= (:touched instance1) nil)) - (t/is (= (:name shape1) "Circle 1")) - (t/is (= (:touched shape1) nil)) - (t/is (= (:fill-color shape1) clr/black)) - (t/is (= (:fill-opacity shape1) 0)) - (t/is (= (:name shape2) "Rect 1")) - (t/is (= (:touched shape2) nil)) - (t/is (= (:fill-color shape2) clr/test)) - (t/is (= (:fill-opacity shape2) 0.5)) - - (t/is (= (:name c-instance2) "Board")) - (t/is (= (:touched c-instance2) nil)) - (t/is (= (:name c-instance1) "Rect 1")) - (t/is (= (:touched c-instance1) nil)) - (t/is (= (:name c-shape1) "Circle 1")) - (t/is (= (:touched c-shape1) nil)) - (t/is (= (:fill-color c-shape1) clr/black)) - (t/is (= (:fill-opacity c-shape1) 0)) - (t/is (= (:name c-shape2) "Rect 1")) - (t/is (= (:touched c-shape2) nil)) - (t/is (= (:fill-color c-shape2) clr/test)) - (t/is (= (:fill-opacity c-shape2) 0.5)) - - (t/is (= (:name instance4) "Board")) - (t/is (= (:touched instance4) nil)) - (t/is (= (:name instance3) "Rect 1")) - (t/is (= (:touched instance3) nil)) - (t/is (= (:name shape3) "Circle 1")) - (t/is (= (:touched shape3) nil)) - (t/is (= (:fill-color shape3) clr/black)) - (t/is (= (:fill-opacity shape3) 0)) - (t/is (= (:name shape4) "Rect 1")) - (t/is (= (:touched shape4) nil)) - (t/is (= (:fill-color shape4) clr/test)) - (t/is (= (:fill-opacity shape4) 0.5)))))] - - (ptk/emit! - store - (dch/update-shapes [(:id shape2')] - (fn [shape] - (merge shape {:fill-color clr/test - :fill-opacity 0.5}))) - (dwl/update-component (:id instance1)) - (dwl/update-component-sync (:id instance2) (:id file)) - :the/end)))) - -;; (t/deftest test-update-nested-lower-remote -;; (t/async done -;; (let [state (-> thp/initial-state -;; (thp/sample-page) -;; (thp/sample-shape :shape1 :rect -;; {:name "Rect 1" -;; :fill-color clr/white -;; :fill-opacity 1}) -;; (thp/make-component :main1 :component1 -;; [(thp/id :shape1)]) -;; (thp/instantiate-component :instance1 -;; (thp/id :component1)) -;; (thp/sample-shape :shape2 :circle -;; {:name "Circle 1" -;; :fill-color clr/black -;; :fill-opacity 0}) -;; (thp/frame-shapes :frame1 -;; [(thp/id :instance1) -;; (thp/id :shape2)]) -;; (thp/make-component :main2 :component2 -;; [(thp/id :frame1)]) -;; (thp/instantiate-component :instance2 -;; (thp/id :component2)) -;; (thp/instantiate-component :instance3 -;; (thp/id :component2))) -;; -;; file (wsh/get-local-file state) -;; -;; [_instance2 instance1 _shape1' shape2'] -;; (thl/resolve-instance state (thp/id :instance2)) -;; -;; store (the/prepare-store state done -;; (fn [new-state] -;; ;; Expected shape tree: -;; ;; -;; ;; [Page] -;; ;; Root Frame -;; ;; Rect 1 -;; ;; Rect 1 -;; ;; Group -;; ;; Rect 1 #--> Rect 1 -;; ;; Rect 1 ---> Rect 1 -;; ;; Circle 1 -;; ;; Group #--> Group -;; ;; Rect 1 @--> Rect 1 -;; ;; (remote-synced) -;; ;; Rect 1 ---> Rect 1 -;; ;; (remote-synced) -;; ;; Circle 1 ---> Circle 1 -;; ;; Group #--> Group -;; ;; Rect 1 @--> Rect 1 -;; ;; Rect 1 ---> Rect 1 -;; ;; Circle 1 ---> Circle 1 -;; ;; -;; ;; [Rect 1] -;; ;; page1 / Rect 1 -;; ;; -;; ;; [Group] -;; ;; page1 / Group -;; ;; -;; (let [[[instance2 instance1 shape1 shape2] -;; [c-instance2 c-instance1 c-shape1 c-shape2] _component1] -;; (thl/resolve-instance-and-main -;; new-state -;; (thp/id :instance2)) -;; -;; [[instance4 instance3 shape3 shape4] -;; [_c-instance4 _c-instance3 _c-shape3 _c-shape4] _component2] -;; (thl/resolve-instance-and-main -;; new-state -;; (thp/id :instance3))] -;; -;; (t/is (= (:name instance2) "Board")) -;; (t/is (= (:touched instance2) nil)) -;; (t/is (= (:name instance1) "Rect 1")) -;; (t/is (= (:touched instance1) nil)) -;; (t/is (= (:name shape1) "Circle 1")) -;; (t/is (= (:touched shape1) nil)) -;; (t/is (= (:fill-color shape1) clr/black)) -;; (t/is (= (:fill-opacity shape1) 0)) -;; (t/is (= (:name shape2) "Rect 1")) -;; (t/is (= (:touched shape2) nil)) -;; (t/is (= (:fill-color shape2) clr/test)) -;; (t/is (= (:fill-opacity shape2) 0.5)) -;; -;; (t/is (= (:name c-instance2) "Board")) -;; (t/is (= (:touched c-instance2) nil)) -;; (t/is (= (:name c-instance1) "Rect 1")) -;; (t/is (= (:touched c-instance1) nil)) -;; (t/is (= (:name c-shape1) "Circle 1")) -;; (t/is (= (:touched c-shape1) nil)) -;; (t/is (= (:fill-color c-shape1) clr/black)) -;; (t/is (= (:fill-opacity c-shape1) 0)) -;; (t/is (= (:name c-shape2) "Rect 1")) -;; (t/is (= (:touched c-shape2) nil)) -;; (t/is (= (:fill-color c-shape2) clr/test)) -;; (t/is (= (:fill-opacity c-shape2) 0.5)) -;; -;; (t/is (= (:name instance4) "Board")) -;; (t/is (= (:touched instance4) nil)) -;; (t/is (= (:name instance3) "Rect 1")) -;; (t/is (= (:touched instance3) nil)) -;; (t/is (= (:name shape3) "Circle 1")) -;; (t/is (= (:touched shape3) nil)) -;; (t/is (= (:fill-color shape3) clr/black)) -;; (t/is (= (:fill-opacity shape3) 0)) -;; (t/is (= (:name shape4) "Rect 1")) -;; (t/is (= (:touched shape4) nil)) -;; (t/is (= (:fill-color shape4) clr/test)) -;; (t/is (= (:fill-opacity shape4) 0.5)))))] -;; -;; (ptk/emit! -;; store -;; (dch/update-shapes [(:id shape2')] -;; (fn [shape] -;; (merge shape {:fill-color clr/test -;; :fill-opacity 0.5}))) -;; (dwl/update-component-sync (:id instance1) (:id file)) -;; :the/end)))) -- Gitee From a3e750ed0af732359b5f42a5d120fd0a06a95e0f Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 30 Apr 2024 16:37:52 +0200 Subject: [PATCH 0526/1266] :sparkles: Tests for chained components changes propagation --- ...ined-components-changes-propagation.penpot | Bin 0 -> 5393 bytes .../logic/chained_propagation_test.cljc | 223 ++++++++++++++++++ 2 files changed, 223 insertions(+) create mode 100644 common/test/cases/chained-components-changes-propagation.penpot create mode 100644 common/test/common_tests/logic/chained_propagation_test.cljc diff --git a/common/test/cases/chained-components-changes-propagation.penpot b/common/test/cases/chained-components-changes-propagation.penpot new file mode 100644 index 0000000000000000000000000000000000000000..368e9a0bc50ef157d1e19960e5b97f9a6614a577 GIT binary patch literal 5393 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 literal 0 HcmV?d00001 diff --git a/common/test/common_tests/logic/chained_propagation_test.cljc b/common/test/common_tests/logic/chained_propagation_test.cljc new file mode 100644 index 000000000..f1db114a7 --- /dev/null +++ b/common/test/common_tests/logic/chained_propagation_test.cljc @@ -0,0 +1,223 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns common-tests.logic.chained-propagation-test + (:require + [app.common.files.changes :as ch] + [app.common.files.changes-builder :as pcb] + [app.common.logic.libraries :as cll] + [app.common.logic.shapes :as cls] + [app.common.pprint :as pp] + [app.common.types.component :as ctk] + [app.common.types.container :as ctn] + [app.common.types.file :as ctf] + [app.common.uuid :as uuid] + [clojure.test :as t] + [common-tests.helpers.components :as thc] + [common-tests.helpers.compositions :as tho] + [common-tests.helpers.files :as thf] + [common-tests.helpers.ids-map :as thi] + [common-tests.helpers.shapes :as ths])) + +(t/use-fixtures :each thi/test-fixture) + +(defn- first-fill-color [file tag] + (-> (ths/get-shape file tag) + (:fills) + first + :fill-color)) + +(defn- first-child-fill-color [file tag] + (let [shape (ths/get-shape file tag)] + (-> (ths/get-shape-by-id file (first (:shapes shape))) + (:fills) + first + :fill-color))) + +;; Related .penpot file: common/test/cases/chained-components-changes-propagation.penpot +(t/deftest test-propagation-with-anidated-components + (letfn [(setup [] + (-> (thf/sample-file :file1) + (tho/add-frame :frame-comp-1) + (ths/add-sample-shape :rectangle :parent-label :frame-comp-1) + (thc/make-component :comp-1 :frame-comp-1) + + (tho/add-frame :frame-comp-2) + (thc/instantiate-component :comp-1 :copy-comp-1 :parent-label :frame-comp-2 :children-labels [:rect-comp-2]) + (thc/make-component :comp-2 :frame-comp-2) + + (tho/add-frame :frame-comp-3) + (thc/instantiate-component :comp-2 :copy-comp-2 :parent-label :frame-comp-3 :children-labels [:comp-1-comp-2]) + (thc/make-component :comp-3 :frame-comp-3))) + + (step-update-color-comp-2 [file] + (let [page (thf/current-page file) + file-id (:id file) + page-id (:id page) + + ;; Changes to update the color of the contained rectangle in component comp-2 + changes-update-color-comp-1 + (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) + (:shapes (ths/get-shape file :copy-comp-1)) + (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color "#FF0000"))) + (:objects page) + {}) + + file' (thf/apply-changes file changes-update-color-comp-1)] + + (t/is (= (first-child-fill-color file' :comp-1-comp-2) "#B1B2B5")) + file')) + + (step-propagate-comp-2 [file] + (let [page (thf/current-page file) + file-id (:id file) + page-id (:id page) + + ;; Changes to propagate the color changes of component comp-1 + changes-sync-comp-1 (-> (pcb/empty-changes) + (cll/generate-sync-file-changes + nil + :components + file-id + (:id (thc/get-component file :comp-2)) + file-id + {file-id file} + file-id)) + + file' (thf/apply-changes file changes-sync-comp-1)] + + (t/is (= (first-fill-color file' :rect-comp-2) "#FF0000")) + (t/is (= (first-child-fill-color file' :comp-1-comp-2) "#FF0000")) + file')) + + (step-update-color-comp-3 [file] + (let [page (thf/current-page file) + page-id (:id page) + comp-1-comp-2 (ths/get-shape file :comp-1-comp-2) + rect-comp-3 (ths/get-shape-by-id file (first (:shapes comp-1-comp-2))) + ;; Changes to update the color of the contained rectangle in component comp-3 + changes-update-color-comp-3 + (cls/generate-update-shapes (pcb/empty-changes nil page-id) + [(:id rect-comp-3)] + (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color "#00FF00"))) + (:objects page) + {}) + + file' (thf/apply-changes file changes-update-color-comp-3) + page' (thf/current-page file')] + + (t/is (= (first-child-fill-color file' :comp-1-comp-2) "#00FF00")) + file')) + + (step-reset [file] + (let [page (thf/current-page file) + file-id (:id file) + comp-1-comp-2 (ths/get-shape file :comp-1-comp-2) + ;; Changes to reset the changes on comp-1 inside comp-3 + changes-reset (cll/generate-reset-component (pcb/empty-changes) + file + {file-id file} + (ctn/make-container page :page) + (:id comp-1-comp-2) + true) + file' (thf/apply-changes file changes-reset)] + + (t/is (= (first-child-fill-color file' :comp-1-comp-2) "#FF0000")) + file'))] + + (-> (setup) + step-update-color-comp-2 + step-propagate-comp-2 + step-update-color-comp-3 + step-reset))) + +(t/deftest test-propagation-with-deleted-component + (letfn [(setup [] + (-> (thf/sample-file :file1) + (tho/add-frame :frame-comp-4) + (ths/add-sample-shape :rectangle :parent-label :frame-comp-4) + (thc/make-component :comp-4 :frame-comp-4) + + (tho/add-frame :frame-comp-5) + (thc/instantiate-component :comp-4 :copy-comp-4 :parent-label :frame-comp-5 :children-labels [:rect-comp-5]) + (thc/make-component :comp-5 :frame-comp-5) + + (tho/add-frame :frame-comp-6) + (thc/instantiate-component :comp-5 :copy-comp-5 :parent-label :frame-comp-6 :children-labels [:comp-4-comp-5]) + (thc/make-component :comp-6 :frame-comp-6))) + + (step-delete-comp-5 [file] + (let [page (thf/current-page file) + ;; Changes to delete comp-5 + [_ changes-delete] (cls/generate-delete-shapes (pcb/empty-changes nil (:id page)) + file + page + (:objects page) + #{(-> (ths/get-shape file :frame-comp-5) + :id)} + {:components-v2 true}) + + file' (thf/apply-changes file changes-delete)] + (t/is (= (first-child-fill-color file' :comp-4-comp-5) "#B1B2B5")) + file')) + + (step-update-color-comp-4 [file] + (let [page (thf/current-page file) + file-id (:id file) + ;; Changes to update the color of the contained rectangle in component comp-4 + changes-update-color-comp-4 + (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) + [(-> (ths/get-shape file :rectangle) + :id)] + (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color "#FF0000"))) + (:objects page) + {}) + + file' (thf/apply-changes file changes-update-color-comp-4)] + (t/is (= (first-fill-color file' :rectangle) "#FF0000")) + file')) + + (step-propagate-comp-4 [file] + (let [page (thf/current-page file) + file-id (:id file) + ;; Changes to propagate the color changes of component comp-4 + changes-sync-comp-4 (-> (pcb/empty-changes) + (cll/generate-sync-file-changes + nil + :components + file-id + (:id (thc/get-component file :comp-4)) + file-id + {file-id file} + file-id)) + + file' (thf/apply-changes file changes-sync-comp-4)] + file')) + + (step-propagate-comp-5 [file] + (let [file-id (:id file) + ;; Changes to propagate the color changes of component comp-5 + changes-sync-comp-5 (-> (pcb/empty-changes) + (cll/generate-sync-file-changes + nil + :components + file-id + (:id (thc/get-component file :comp-5)) + file-id + {file-id file} + file-id)) + file' (thf/apply-changes file changes-sync-comp-5)] + (t/is (= (first-child-fill-color file' :comp-4-comp-5) "#FF0000")) + file'))] + + (-> (setup) + step-delete-comp-5 + step-update-color-comp-4 + step-propagate-comp-4 + step-propagate-comp-5))) -- Gitee From cb73ddc3535e76b313b77d3262fb1c6fb56357ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Fri, 10 May 2024 10:28:23 +0200 Subject: [PATCH 0527/1266] :lipstick: Small refactor --- .../common_tests/logic/comp_reset_test.cljc | 24 +++++---------- .../common_tests/logic/comp_touched_test.cljc | 30 +++++++------------ 2 files changed, 18 insertions(+), 36 deletions(-) diff --git a/common/test/common_tests/logic/comp_reset_test.cljc b/common/test/common_tests/logic/comp_reset_test.cljc index fecab3362..3b7551a9f 100644 --- a/common/test/common_tests/logic/comp_reset_test.cljc +++ b/common/test/common_tests/logic/comp_reset_test.cljc @@ -33,12 +33,10 @@ copy-child (ths/get-shape file :copy-child) ;; ==== Action - update-fn (fn [shape] - (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) - changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) #{(:id copy-child)} - update-fn + (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) (:objects page) {}) @@ -86,12 +84,10 @@ copy-child (ths/get-shape file :copy-child) ;; ==== Action - update-fn (fn [shape] - (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) - changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) #{(:id copy-child)} - update-fn + (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) (:objects page) {}) @@ -281,12 +277,10 @@ copy2-root (ths/get-shape file :copy2-root) ;; ==== Action - update-fn (fn [shape] - (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) - changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) #{(:id copy2-root)} - update-fn + (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) (:objects page) {}) @@ -330,12 +324,10 @@ copy2-child (ths/get-shape file :copy2-child) ;; ==== Action - update-fn (fn [shape] - (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) - changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) #{(:id copy2-child)} - update-fn + (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) (:objects page) {}) diff --git a/common/test/common_tests/logic/comp_touched_test.cljc b/common/test/common_tests/logic/comp_touched_test.cljc index 9293cdb27..1d21eae08 100644 --- a/common/test/common_tests/logic/comp_touched_test.cljc +++ b/common/test/common_tests/logic/comp_touched_test.cljc @@ -31,12 +31,10 @@ copy-child (ths/get-shape file :copy-child) ;; ==== Action - update-fn (fn [shape] - (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) - changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) #{(:id copy-child)} - update-fn + (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) (:objects page) {}) @@ -73,12 +71,10 @@ copy-child (ths/get-shape file :copy-child) ;; ==== Action - update-fn (fn [shape] - (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) - changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) #{(:id copy-child)} - update-fn + (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) (:objects page) {}) @@ -234,12 +230,10 @@ copy2-root (ths/get-shape file :copy2-root) ;; ==== Action - update-fn (fn [shape] - (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) - changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) #{(:id copy2-root)} - update-fn + (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) (:objects page) {}) @@ -272,12 +266,10 @@ copy2-child (ths/get-shape file :copy2-child) ;; ==== Action - update-fn (fn [shape] - (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) - changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) #{(:id copy2-child)} - update-fn + (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) (:objects page) {}) @@ -313,12 +305,10 @@ copy2-child (ths/get-shape file :copy2-child) ;; ==== Action - update-fn (fn [shape] - (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) - changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) #{(:id copy2-child)} - update-fn + (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color "#fabada"))) (:objects page) {}) -- Gitee From d341cef4061a20291ee64b93d315e92b00164286 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Wed, 8 May 2024 17:30:47 +0200 Subject: [PATCH 0528/1266] :sparkles: Add basic dashboard pom and test --- .../data/dashboard/create-project.json | 9 ++ .../dashboard/get-project-files-empty.json | 1 + .../data/dashboard/get-project-files.json | 20 ++++ .../data/dashboard/get-projects-new.json | 18 ++++ .../get-profile-logged-in-no-onboarding.json | 26 ++++++ frontend/playwright/ui/pages/DashboardPage.js | 93 +++++++++++++++++++ .../playwright/ui/specs/dashboard.spec.js | 44 +++++++++ frontend/src/app/main/ui/components/link.cljs | 3 +- .../src/app/main/ui/dashboard/sidebar.cljs | 1 + 9 files changed, 214 insertions(+), 1 deletion(-) create mode 100644 frontend/playwright/data/dashboard/create-project.json create mode 100644 frontend/playwright/data/dashboard/get-project-files-empty.json create mode 100644 frontend/playwright/data/dashboard/get-project-files.json create mode 100644 frontend/playwright/data/dashboard/get-projects-new.json create mode 100644 frontend/playwright/data/logged-in-user/get-profile-logged-in-no-onboarding.json create mode 100644 frontend/playwright/ui/pages/DashboardPage.js create mode 100644 frontend/playwright/ui/specs/dashboard.spec.js diff --git a/frontend/playwright/data/dashboard/create-project.json b/frontend/playwright/data/dashboard/create-project.json new file mode 100644 index 000000000..92566a65f --- /dev/null +++ b/frontend/playwright/data/dashboard/create-project.json @@ -0,0 +1,9 @@ +{ + "~:id": "~ue5a24d1b-ef1e-812f-8004-52bab84be6f7", + "~:team-id": "~uc7ce0794-0992-8105-8004-38e630f40f6", + "~:created-at": "~m1715266551088", + "~:modified-at": "~m1715266551088", + "~:is-default": false, + "~:name": "New Project 1", + "~:is-pinned": false +} diff --git a/frontend/playwright/data/dashboard/get-project-files-empty.json b/frontend/playwright/data/dashboard/get-project-files-empty.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/frontend/playwright/data/dashboard/get-project-files-empty.json @@ -0,0 +1 @@ +[] diff --git a/frontend/playwright/data/dashboard/get-project-files.json b/frontend/playwright/data/dashboard/get-project-files.json new file mode 100644 index 000000000..b0394aff1 --- /dev/null +++ b/frontend/playwright/data/dashboard/get-project-files.json @@ -0,0 +1,20 @@ +[ + { + "~:id": "~u8b479b80-e02d-8074-8004-4088dc6bfd11", + "~:project-id": "~uc7ce0794-0992-8105-8004-38e630f7920b", + "~:created-at": "~m1714045521389", + "~:modified-at": "~m1714045654874", + "~:name": "New File 2", + "~:revn": 1, + "~:is-shared": false + }, + { + "~:id": "~u95d6fdd8-48d8-8148-8004-38af910d2dbe", + "~:project-id": "~uc7ce0794-0992-8105-8004-38e630f7920b", + "~:created-at": "~m1713518796912", + "~:modified-at": "~m1713519762931", + "~:name": "New File 1", + "~:revn": 1, + "~:is-shared": false + } +] diff --git a/frontend/playwright/data/dashboard/get-projects-new.json b/frontend/playwright/data/dashboard/get-projects-new.json new file mode 100644 index 000000000..47c85eee4 --- /dev/null +++ b/frontend/playwright/data/dashboard/get-projects-new.json @@ -0,0 +1,18 @@ +[{ + "~:id": "~ue5a24d1b-ef1e-812f-8004-52bab84be6f7", + "~:team-id": "~uc7ce0794-0992-8105-8004-38e630f40f6d", + "~:created-at": "~m1715266551088", + "~:modified-at": "~m1715266551088", + "~:is-default": false, + "~:name": "New Project 1", + "~:is-pinned": false, + "~:count": 0 +}, +{ + "~:id": "~uc7ce0794-0992-8105-8004-38e630f7920b", + "~:team-id": "~uc7ce0794-0992-8105-8004-38e630f40f6d", + "~:created-at": "~m1713533116382", + "~:modified-at": "~m1713873823633", + "~:is-default": true, + "~:name": "Drafts" +}] diff --git a/frontend/playwright/data/logged-in-user/get-profile-logged-in-no-onboarding.json b/frontend/playwright/data/logged-in-user/get-profile-logged-in-no-onboarding.json new file mode 100644 index 000000000..0b416835f --- /dev/null +++ b/frontend/playwright/data/logged-in-user/get-profile-logged-in-no-onboarding.json @@ -0,0 +1,26 @@ +{ + "~:email": "foo@example.com", + "~:is-demo": false, + "~:auth-backend": "penpot", + "~:fullname": "Princesa Leia", + "~:modified-at": "~m1713533116365", + "~:is-active": true, + "~:default-project-id": "~uc7ce0794-0992-8105-8004-38e630f7920b", + "~:id": "~uc7ce0794-0992-8105-8004-38e630f29a9b", + "~:is-muted": false, + "~:default-team-id": "~uc7ce0794-0992-8105-8004-38e630f40f6d", + "~:created-at": "~m1713533116365", + "~:is-blocked": false, + "~:props": { + "~:nudge": { + "~:big": 10, + "~:small": 1 + }, + "~:v2-info-shown": true, + "~:viewed-tutorial?": false, + "~:viewed-walkthrough?": false, + "~:onboarding-viewed": true, + "~:builtin-templates-collapsed-status": + true + } +} diff --git a/frontend/playwright/ui/pages/DashboardPage.js b/frontend/playwright/ui/pages/DashboardPage.js new file mode 100644 index 000000000..285e47d95 --- /dev/null +++ b/frontend/playwright/ui/pages/DashboardPage.js @@ -0,0 +1,93 @@ +import { BaseWebSocketPage } from "./BaseWebSocketPage"; + +export class DashboardPage extends BaseWebSocketPage { + static async init(page) { + await BaseWebSocketPage.initWebSockets(page); + + await BaseWebSocketPage.mockRPC( + page, + "get-profile", + "logged-in-user/get-profile-logged-in-no-onboarding.json", + ); + await BaseWebSocketPage.mockRPC(page, "get-teams", "logged-in-user/get-teams-default.json"); + await BaseWebSocketPage.mockRPC( + page, + "get-font-variants?team-id=*", + "workspace/get-font-variants-empty.json", + ); + + await BaseWebSocketPage.mockRPC( + page, + "get-projects?team-id=*", + "logged-in-user/get-projects-default.json", + ); + await BaseWebSocketPage.mockRPC( + page, + "get-team-members?team-id=*", + "logged-in-user/get-team-members-your-penpot.json", + ); + await BaseWebSocketPage.mockRPC( + page, + "get-team-users?team-id=*", + "logged-in-user/get-team-users-single-user.json", + ); + await BaseWebSocketPage.mockRPC( + page, + "get-unread-comment-threads?team-id=*", + "logged-in-user/get-team-users-single-user.json", + ); + await BaseWebSocketPage.mockRPC( + page, + "get-team-recent-files?team-id=*", + "logged-in-user/get-team-recent-files-empty.json", + ); + await BaseWebSocketPage.mockRPC( + page, + "get-profiles-for-file-comments", + "workspace/get-profile-for-file-comments.json", + ); + await BaseWebSocketPage.mockRPC( + page, + "get-builtin-templates", + "logged-in-user/get-built-in-templates-empty.json", + ); + } + + static anyTeamId = "c7ce0794-0992-8105-8004-38e630f40f6d"; + + static draftProjectId = "c7ce0794-0992-8105-8004-38e630f7920b"; + + constructor(page) { + super(page); + this.titleLabel = page.getByRole("heading", { name: "Projects" }); + this.addProjectBtn = page.getByRole("button", { name: "+ NEW PROJECT" }); + this.projectName = page.getByText("Project 1"); + this.draftTitle = page.getByRole("heading", { name: "Drafts" }); + this.draftLink = page.getByTestId("drafts-link-sidebar"); + this.draftsFile = page.getByText(/New File 1/); + } + + async setupDraftsEmpty() { + await this.mockRPC("get-project-files?project-id=*", "dashboard/get-project-files-empty.json"); + } + + async setupDrafts() { + await this.mockRPC("get-project-files?project-id=*", "dashboard/get-project-files.json"); + } + + async setupNewProject() { + await this.mockRPC("create-project", "dashboard/create-project.json", { method: "POST" }); + await this.mockRPC("get-projects?team-id=*", "dashboard/get-projects-new.json"); + } + async goToWorkspace() { + await this.page.goto(`#/dashboard/team/${DashboardPage.anyTeamId}/projects`); + } + + async goToDrafts() { + await this.page.goto( + `#/dashboard/team/${DashboardPage.anyTeamId}/projects/${DashboardPage.draftProjectId}`, + ); + } +} + +export default DashboardPage; diff --git a/frontend/playwright/ui/specs/dashboard.spec.js b/frontend/playwright/ui/specs/dashboard.spec.js new file mode 100644 index 000000000..145c1321a --- /dev/null +++ b/frontend/playwright/ui/specs/dashboard.spec.js @@ -0,0 +1,44 @@ +import { test, expect } from "@playwright/test"; +import DashboardPage from "../pages/DashboardPage"; + +test.beforeEach(async ({ page }) => { + await DashboardPage.init(page); +}); + +test("Dashboad page has title ", async ({ page }) => { + const dashboardPage = new DashboardPage(page); + + await dashboardPage.goToWorkspace(); + + await expect(dashboardPage.page).toHaveURL(/dashboard/); + await expect(dashboardPage.titleLabel).toBeVisible(); +}); + +test("User can create a new project", async ({ page }) => { + const dashboardPage = new DashboardPage(page); + await dashboardPage.setupNewProject(); + + await dashboardPage.goToWorkspace(); + await dashboardPage.addProjectBtn.click(); + + await expect(dashboardPage.projectName).toBeVisible(); +}); + +test("User goes to draft page", async ({ page }) => { + const dashboardPage = new DashboardPage(page); + await dashboardPage.setupDraftsEmpty(); + + await dashboardPage.goToWorkspace(); + await dashboardPage.draftLink.click(); + + await expect(dashboardPage.draftTitle).toBeVisible(); +}); + +test("User loads the draft page", async ({ page }) => { + const dashboardPage = new DashboardPage(page); + await dashboardPage.setupDrafts(); + + await dashboardPage.goToDrafts(); + + await expect(dashboardPage.draftsFile).toBeVisible(); +}); diff --git a/frontend/src/app/main/ui/components/link.cljs b/frontend/src/app/main/ui/components/link.cljs index 4c48681bb..6ceee146b 100644 --- a/frontend/src/app/main/ui/components/link.cljs +++ b/frontend/src/app/main/ui/components/link.cljs @@ -12,7 +12,7 @@ (mf/defc link {::mf/wrap-props false} - [{:keys [action class data-test keyboard-action children]}] + [{:keys [action class data-test keyboard-action children data-testid]}] (let [keyboard-action (d/nilv keyboard-action action)] [:a {:on-click action :class class @@ -20,5 +20,6 @@ (when ^boolean (kbd/enter? event) (keyboard-action event))) :tab-index "0" + :data-testid data-testid :data-test data-test} children])) diff --git a/frontend/src/app/main/ui/dashboard/sidebar.cljs b/frontend/src/app/main/ui/dashboard/sidebar.cljs index 96d4c9df0..10cfd2f5c 100644 --- a/frontend/src/app/main/ui/dashboard/sidebar.cljs +++ b/frontend/src/app/main/ui/dashboard/sidebar.cljs @@ -783,6 +783,7 @@ [:li {:class (stl/css-case :current drafts? :sidebar-nav-item true)} [:& link {:action go-drafts + :data-testid "drafts-link-sidebar" :class (stl/css :sidebar-link) :keyboard-action go-drafts-with-key} [:span {:class (stl/css :element-title)} (tr "labels.drafts")]]] -- Gitee From ee0492120a6f1e251de92396d669807ed3d9d676 Mon Sep 17 00:00:00 2001 From: Andy Li Date: Sat, 11 May 2024 08:34:08 +0000 Subject: [PATCH 0529/1266] :globe_with_meridians: Add translations for: Chinese (Traditional). Currently translated at 47.2% (651 of 1379 strings) Translation: Penpot/frontend Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/ --- frontend/translations/zh_Hant.po | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/frontend/translations/zh_Hant.po b/frontend/translations/zh_Hant.po index 695a21a59..b5e40d2ef 100644 --- a/frontend/translations/zh_Hant.po +++ b/frontend/translations/zh_Hant.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-05-05 05:07+0000\n" +"PO-Revision-Date: 2024-05-12 09:01+0000\n" "Last-Translator: Andy Li \n" "Language-Team: Chinese (Traditional) \n" @@ -9,7 +9,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.5.3\n" +"X-Generator: Weblate 5.5.4\n" #: src/app/main/ui/auth/register.cljs msgid "auth.already-have-account" @@ -2442,3 +2442,29 @@ msgstr "不再作為共用資料庫" #: src/app/main/ui/workspace/header.cljs, src/app/main/ui/dashboard/file_menu.cljs msgid "dashboard.unpublish-shared" msgstr "取消發佈資料庫" + +msgid "errors.cannot-upload" +msgstr "無法上傳此媒體檔案。" + +#: src/app/main/ui/settings/access-tokens.cljs +msgid "dashboard.access-tokens.personal.description" +msgstr "個人存取權杖就像是帳號密碼驗證系統的替代方案,且可用於讓第三方應用程式存取 " +"Penpot 內部 API" + +#: src/app/main/data/users.cljs +msgid "errors.email-domain-not-allowed" +msgstr "不允許此域名" + +msgid "errors.paste-data-validation" +msgstr "剪貼簿中的資料無效" + +msgid "dashboard.import.analyze-error.components-v2" +msgstr "檔案中啟用了 Components v2 但這個團隊尚未支援。" + +#: src/app/main/ui/confirm.cljs +msgid "ds.component-subtitle" +msgstr "待更新的元件:" + +#: src/app/main/data/users.cljs +msgid "errors.auth-provider-not-allowed" +msgstr "此設定檔不允許此驗證提供者" -- Gitee From d8c60aa770447d5037325272c91c8c7d78129165 Mon Sep 17 00:00:00 2001 From: AzazelN28 Date: Mon, 13 May 2024 12:08:12 +0200 Subject: [PATCH 0530/1266] :rewind: Skip failing test --- frontend/playwright/ui/specs/workspace.spec.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/playwright/ui/specs/workspace.spec.js b/frontend/playwright/ui/specs/workspace.spec.js index 832617911..3f97aad90 100644 --- a/frontend/playwright/ui/specs/workspace.spec.js +++ b/frontend/playwright/ui/specs/workspace.spec.js @@ -6,7 +6,7 @@ test.beforeEach(async ({ page }) => { await WorkspacePage.init(page); }); -test("User loads worskpace with empty file", async ({ page }) => { +test.skip("User loads worskpace with empty file", async ({ page }) => { const workspacePage = new WorkspacePage(page); await workspacePage.setupEmptyFile(page); @@ -15,7 +15,7 @@ test("User loads worskpace with empty file", async ({ page }) => { await expect(workspacePage.pageName).toHaveText("Page 1"); }); -test("User receives presence notifications updates in the workspace", async ({ page }) => { +test.skip("User receives presence notifications updates in the workspace", async ({ page }) => { const workspacePage = new WorkspacePage(page); await workspacePage.setupEmptyFile(); @@ -25,7 +25,7 @@ test("User receives presence notifications updates in the workspace", async ({ p await expect(page.getByTestId("active-users-list").getByAltText("Princesa Leia")).toHaveCount(2); }); -test("User draws a rect", async ({ page }) => { +test.skip("User draws a rect", async ({ page }) => { const workspacePage = new WorkspacePage(page); await workspacePage.setupEmptyFile(); await workspacePage.mockRPC("update-file?id=*", "workspace/update-file-create-rect.json"); -- Gitee From c16ef39abfdb93857deb0a0d2b4106381d76ae9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Fri, 10 May 2024 19:02:55 +0200 Subject: [PATCH 0531/1266] :recycle: Make test helpers globally usable --- .../app/common/test_helpers}/components.cljc | 10 +++---- .../common/test_helpers}/compositions.cljc | 6 ++--- .../app/common/test_helpers}/files.cljc | 4 +-- .../app/common/test_helpers}/ids_map.cljc | 2 +- .../app/common/test_helpers}/shapes.cljc | 8 +++--- .../logic/chained_propagation_test.cljc | 27 ++++++------------- .../logic/comp_creation_test.cljc | 12 ++++----- .../logic/comp_remove_swap_slots_test.cljc | 11 ++++---- .../common_tests/logic/comp_reset_test.cljc | 12 ++++----- .../common_tests/logic/comp_sync_test.cljc | 15 +++++------ .../common_tests/logic/comp_touched_test.cljc | 12 ++++----- .../logic/swap_and_reset_test.cljc | 12 ++++----- .../types/types_libraries_test.cljc | 12 ++++----- 13 files changed, 64 insertions(+), 79 deletions(-) rename common/{test/common_tests/helpers => src/app/common/test_helpers}/components.cljc (96%) rename common/{test/common_tests/helpers => src/app/common/test_helpers}/compositions.cljc (98%) rename common/{test/common_tests/helpers => src/app/common/test_helpers}/files.cljc (98%) rename common/{test/common_tests/helpers => src/app/common/test_helpers}/ids_map.cljc (96%) rename common/{test/common_tests/helpers => src/app/common/test_helpers}/shapes.cljc (95%) diff --git a/common/test/common_tests/helpers/components.cljc b/common/src/app/common/test_helpers/components.cljc similarity index 96% rename from common/test/common_tests/helpers/components.cljc rename to common/src/app/common/test_helpers/components.cljc index 81d331660..b1c9c0513 100644 --- a/common/test/common_tests/helpers/components.cljc +++ b/common/src/app/common/test_helpers/components.cljc @@ -4,22 +4,22 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns common-tests.helpers.components +(ns app.common.test-helpers.components (:require [app.common.data.macros :as dm] [app.common.files.changes-builder :as pcb] [app.common.files.helpers :as cfh] [app.common.geom.point :as gpt] [app.common.logic.libraries :as cll] + [app.common.test-helpers.files :as thf] + [app.common.test-helpers.ids-map :as thi] + [app.common.test-helpers.shapes :as ths] [app.common.types.component :as ctk] [app.common.types.components-list :as ctkl] [app.common.types.container :as ctn] [app.common.types.file :as ctf] [app.common.types.pages-list :as ctpl] - [app.common.types.shape-tree :as ctst] - [common-tests.helpers.files :as thf] - [common-tests.helpers.ids-map :as thi] - [common-tests.helpers.shapes :as ths])) + [app.common.types.shape-tree :as ctst])) (defn make-component [file label root-label & {:keys [] :as params}] diff --git a/common/test/common_tests/helpers/compositions.cljc b/common/src/app/common/test_helpers/compositions.cljc similarity index 98% rename from common/test/common_tests/helpers/compositions.cljc rename to common/src/app/common/test_helpers/compositions.cljc index 21f4217d0..72ab0073f 100644 --- a/common/test/common_tests/helpers/compositions.cljc +++ b/common/src/app/common/test_helpers/compositions.cljc @@ -4,11 +4,11 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns common-tests.helpers.compositions +(ns app.common.test-helpers.compositions (:require [app.common.data :as d] - [common-tests.helpers.components :as thc] - [common-tests.helpers.shapes :as ths])) + [app.common.test-helpers.components :as thc] + [app.common.test-helpers.shapes :as ths])) (defn add-rect [file rect-label & {:keys [] :as params}] diff --git a/common/test/common_tests/helpers/files.cljc b/common/src/app/common/test_helpers/files.cljc similarity index 98% rename from common/test/common_tests/helpers/files.cljc rename to common/src/app/common/test_helpers/files.cljc index 31a887481..59b166555 100644 --- a/common/test/common_tests/helpers/files.cljc +++ b/common/src/app/common/test_helpers/files.cljc @@ -4,19 +4,19 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns common-tests.helpers.files +(ns app.common.test-helpers.files (:require [app.common.data :as d] [app.common.features :as ffeat] [app.common.files.changes :as cfc] [app.common.files.validate :as cfv] [app.common.pprint :refer [pprint]] + [app.common.test-helpers.ids-map :as thi] [app.common.types.component :as ctk] [app.common.types.file :as ctf] [app.common.types.page :as ctp] [app.common.types.pages-list :as ctpl] [app.common.uuid :as uuid] - [common-tests.helpers.ids-map :as thi] [cuerdas.core :as str])) ;; ----- Files diff --git a/common/test/common_tests/helpers/ids_map.cljc b/common/src/app/common/test_helpers/ids_map.cljc similarity index 96% rename from common/test/common_tests/helpers/ids_map.cljc rename to common/src/app/common/test_helpers/ids_map.cljc index ccbbdb542..603229d9e 100644 --- a/common/test/common_tests/helpers/ids_map.cljc +++ b/common/src/app/common/test_helpers/ids_map.cljc @@ -4,7 +4,7 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns common-tests.helpers.ids-map +(ns app.common.test-helpers.ids-map (:require [app.common.uuid :as uuid])) diff --git a/common/test/common_tests/helpers/shapes.cljc b/common/src/app/common/test_helpers/shapes.cljc similarity index 95% rename from common/test/common_tests/helpers/shapes.cljc rename to common/src/app/common/test_helpers/shapes.cljc index 53521cbe5..28e8c5d2c 100644 --- a/common/test/common_tests/helpers/shapes.cljc +++ b/common/src/app/common/test_helpers/shapes.cljc @@ -4,10 +4,12 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns common-tests.helpers.shapes +(ns app.common.test-helpers.shapes (:require [app.common.colors :as clr] [app.common.files.helpers :as cfh] + [app.common.test-helpers.files :as thf] + [app.common.test-helpers.ids-map :as thi] [app.common.types.color :as ctc] [app.common.types.colors-list :as ctcl] [app.common.types.file :as ctf] @@ -15,9 +17,7 @@ [app.common.types.shape :as cts] [app.common.types.shape-tree :as ctst] [app.common.types.typographies-list :as cttl] - [app.common.types.typography :as ctt] - [common-tests.helpers.files :as thf] - [common-tests.helpers.ids-map :as thi])) + [app.common.types.typography :as ctt])) (defn sample-shape [label & {:keys [type] :as params}] diff --git a/common/test/common_tests/logic/chained_propagation_test.cljc b/common/test/common_tests/logic/chained_propagation_test.cljc index f1db114a7..dc9a5ac91 100644 --- a/common/test/common_tests/logic/chained_propagation_test.cljc +++ b/common/test/common_tests/logic/chained_propagation_test.cljc @@ -6,21 +6,16 @@ (ns common-tests.logic.chained-propagation-test (:require - [app.common.files.changes :as ch] [app.common.files.changes-builder :as pcb] [app.common.logic.libraries :as cll] [app.common.logic.shapes :as cls] - [app.common.pprint :as pp] - [app.common.types.component :as ctk] + [app.common.test-helpers.components :as thc] + [app.common.test-helpers.compositions :as tho] + [app.common.test-helpers.files :as thf] + [app.common.test-helpers.ids-map :as thi] + [app.common.test-helpers.shapes :as ths] [app.common.types.container :as ctn] - [app.common.types.file :as ctf] - [app.common.uuid :as uuid] - [clojure.test :as t] - [common-tests.helpers.components :as thc] - [common-tests.helpers.compositions :as tho] - [common-tests.helpers.files :as thf] - [common-tests.helpers.ids-map :as thi] - [common-tests.helpers.shapes :as ths])) + [clojure.test :as t])) (t/use-fixtures :each thi/test-fixture) @@ -55,8 +50,6 @@ (step-update-color-comp-2 [file] (let [page (thf/current-page file) - file-id (:id file) - page-id (:id page) ;; Changes to update the color of the contained rectangle in component comp-2 changes-update-color-comp-1 @@ -75,7 +68,6 @@ (step-propagate-comp-2 [file] (let [page (thf/current-page file) file-id (:id file) - page-id (:id page) ;; Changes to propagate the color changes of component comp-1 changes-sync-comp-1 (-> (pcb/empty-changes) @@ -108,8 +100,7 @@ (:objects page) {}) - file' (thf/apply-changes file changes-update-color-comp-3) - page' (thf/current-page file')] + file' (thf/apply-changes file changes-update-color-comp-3)] (t/is (= (first-child-fill-color file' :comp-1-comp-2) "#00FF00")) file')) @@ -168,7 +159,6 @@ (step-update-color-comp-4 [file] (let [page (thf/current-page file) - file-id (:id file) ;; Changes to update the color of the contained rectangle in component comp-4 changes-update-color-comp-4 (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) @@ -184,8 +174,7 @@ file')) (step-propagate-comp-4 [file] - (let [page (thf/current-page file) - file-id (:id file) + (let [file-id (:id file) ;; Changes to propagate the color changes of component comp-4 changes-sync-comp-4 (-> (pcb/empty-changes) (cll/generate-sync-file-changes diff --git a/common/test/common_tests/logic/comp_creation_test.cljc b/common/test/common_tests/logic/comp_creation_test.cljc index 6d3280533..c59c14bc1 100644 --- a/common/test/common_tests/logic/comp_creation_test.cljc +++ b/common/test/common_tests/logic/comp_creation_test.cljc @@ -12,15 +12,15 @@ [app.common.geom.point :as gpt] [app.common.logic.libraries :as cll] [app.common.logic.shapes :as cls] + [app.common.test-helpers.components :as thc] + [app.common.test-helpers.compositions :as tho] + [app.common.test-helpers.files :as thf] + [app.common.test-helpers.ids-map :as thi] + [app.common.test-helpers.shapes :as ths] [app.common.types.component :as ctk] [app.common.types.components-list :as ctkl] [app.common.types.shape-tree :as ctst] - [clojure.test :as t] - [common-tests.helpers.components :as thc] - [common-tests.helpers.compositions :as tho] - [common-tests.helpers.files :as thf] - [common-tests.helpers.ids-map :as thi] - [common-tests.helpers.shapes :as ths])) + [clojure.test :as t])) (t/use-fixtures :each thi/test-fixture) diff --git a/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc b/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc index 51a0fa008..f5cb012b4 100644 --- a/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc +++ b/common/test/common_tests/logic/comp_remove_swap_slots_test.cljc @@ -10,19 +10,18 @@ [app.common.geom.point :as gpt] [app.common.logic.libraries :as cll] [app.common.logic.shapes :as cls] + [app.common.test-helpers.components :as thc] + [app.common.test-helpers.compositions :as tho] + [app.common.test-helpers.files :as thf] + [app.common.test-helpers.ids-map :as thi] + [app.common.test-helpers.shapes :as ths] [app.common.types.component :as ctk] [app.common.uuid :as uuid] [clojure.test :as t] - [common-tests.helpers.components :as thc] - [common-tests.helpers.compositions :as tho] - [common-tests.helpers.files :as thf] - [common-tests.helpers.ids-map :as thi] - [common-tests.helpers.shapes :as ths] [cuerdas.core :as str])) (t/use-fixtures :each thi/test-fixture) - ;; Related .penpot file: common/test/cases/remove-swap-slots.penpot (defn- setup-file [] diff --git a/common/test/common_tests/logic/comp_reset_test.cljc b/common/test/common_tests/logic/comp_reset_test.cljc index 3b7551a9f..d7f441ed9 100644 --- a/common/test/common_tests/logic/comp_reset_test.cljc +++ b/common/test/common_tests/logic/comp_reset_test.cljc @@ -9,12 +9,12 @@ [app.common.files.changes-builder :as pcb] [app.common.logic.libraries :as cll] [app.common.logic.shapes :as cls] - [clojure.test :as t] - [common-tests.helpers.components :as thc] - [common-tests.helpers.compositions :as tho] - [common-tests.helpers.files :as thf] - [common-tests.helpers.ids-map :as thi] - [common-tests.helpers.shapes :as ths])) + [app.common.test-helpers.components :as thc] + [app.common.test-helpers.compositions :as tho] + [app.common.test-helpers.files :as thf] + [app.common.test-helpers.ids-map :as thi] + [app.common.test-helpers.shapes :as ths] + [clojure.test :as t])) (t/use-fixtures :each thi/test-fixture) diff --git a/common/test/common_tests/logic/comp_sync_test.cljc b/common/test/common_tests/logic/comp_sync_test.cljc index 1f3b8b4c2..75abacea3 100644 --- a/common/test/common_tests/logic/comp_sync_test.cljc +++ b/common/test/common_tests/logic/comp_sync_test.cljc @@ -8,19 +8,16 @@ (:require [app.common.data :as d] [app.common.files.changes-builder :as pcb] - [app.common.files.shapes-helpers :as cfsh] - [app.common.geom.point :as gpt] [app.common.logic.libraries :as cll] [app.common.logic.shapes :as cls] + [app.common.test-helpers.components :as thc] + [app.common.test-helpers.compositions :as tho] + [app.common.test-helpers.files :as thf] + [app.common.test-helpers.ids-map :as thi] + [app.common.test-helpers.shapes :as ths] [app.common.types.component :as ctk] - [app.common.types.components-list :as ctkl] [app.common.types.shape-tree :as ctst] - [clojure.test :as t] - [common-tests.helpers.components :as thc] - [common-tests.helpers.compositions :as tho] - [common-tests.helpers.files :as thf] - [common-tests.helpers.ids-map :as thi] - [common-tests.helpers.shapes :as ths])) + [clojure.test :as t])) (t/use-fixtures :each thi/test-fixture) diff --git a/common/test/common_tests/logic/comp_touched_test.cljc b/common/test/common_tests/logic/comp_touched_test.cljc index 1d21eae08..a0907e37c 100644 --- a/common/test/common_tests/logic/comp_touched_test.cljc +++ b/common/test/common_tests/logic/comp_touched_test.cljc @@ -8,12 +8,12 @@ (:require [app.common.files.changes-builder :as pcb] [app.common.logic.shapes :as cls] - [clojure.test :as t] - [common-tests.helpers.components :as thc] - [common-tests.helpers.compositions :as tho] - [common-tests.helpers.files :as thf] - [common-tests.helpers.ids-map :as thi] - [common-tests.helpers.shapes :as ths])) + [app.common.test-helpers.components :as thc] + [app.common.test-helpers.compositions :as tho] + [app.common.test-helpers.files :as thf] + [app.common.test-helpers.ids-map :as thi] + [app.common.test-helpers.shapes :as ths] + [clojure.test :as t])) (t/use-fixtures :each thi/test-fixture) diff --git a/common/test/common_tests/logic/swap_and_reset_test.cljc b/common/test/common_tests/logic/swap_and_reset_test.cljc index 40d3c7ef8..c27a5b99e 100644 --- a/common/test/common_tests/logic/swap_and_reset_test.cljc +++ b/common/test/common_tests/logic/swap_and_reset_test.cljc @@ -8,14 +8,14 @@ (:require [app.common.files.changes-builder :as pcb] [app.common.logic.libraries :as cll] + [app.common.test-helpers.components :as thc] + [app.common.test-helpers.compositions :as tho] + [app.common.test-helpers.files :as thf] + [app.common.test-helpers.ids-map :as thi] + [app.common.test-helpers.shapes :as ths] [app.common.types.component :as ctk] [app.common.types.file :as ctf] - [clojure.test :as t] - [common-tests.helpers.components :as thc] - [common-tests.helpers.compositions :as tho] - [common-tests.helpers.files :as thf] - [common-tests.helpers.ids-map :as thi] - [common-tests.helpers.shapes :as ths])) + [clojure.test :as t])) (t/use-fixtures :each thi/test-fixture) diff --git a/common/test/common_tests/types/types_libraries_test.cljc b/common/test/common_tests/types/types_libraries_test.cljc index 744a39518..ab13cf868 100644 --- a/common/test/common_tests/types/types_libraries_test.cljc +++ b/common/test/common_tests/types/types_libraries_test.cljc @@ -7,6 +7,11 @@ (ns common-tests.types.types-libraries-test (:require [app.common.data :as d] + [app.common.test-helpers.components :as thc] + [app.common.test-helpers.compositions :as tho] + [app.common.test-helpers.files :as thf] + [app.common.test-helpers.ids-map :as thi] + [app.common.test-helpers.shapes :as ths] [app.common.text :as txt] [app.common.types.colors-list :as ctcl] [app.common.types.component :as ctk] @@ -14,12 +19,7 @@ [app.common.types.file :as ctf] [app.common.types.pages-list :as ctpl] [app.common.types.typographies-list :as ctyl] - [clojure.test :as t] - [common-tests.helpers.components :as thc] - [common-tests.helpers.compositions :as tho] - [common-tests.helpers.files :as thf] - [common-tests.helpers.ids-map :as thi] - [common-tests.helpers.shapes :as ths])) + [clojure.test :as t])) (t/use-fixtures :each thi/test-fixture) -- Gitee From da939cc0a6872bbbc815e637b13010b832d34d76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Fri, 10 May 2024 19:40:48 +0200 Subject: [PATCH 0532/1266] :recycle: Refactor front end test to make use of common file helpers --- .../frontend_tests/basic_shapes_test.cljs | 49 ++++++++++++++++ .../test/frontend_tests/helpers/pages.cljs | 2 +- .../test/frontend_tests/helpers/state.cljs | 56 +++++++++++++++++++ 3 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 frontend/test/frontend_tests/basic_shapes_test.cljs create mode 100644 frontend/test/frontend_tests/helpers/state.cljs diff --git a/frontend/test/frontend_tests/basic_shapes_test.cljs b/frontend/test/frontend_tests/basic_shapes_test.cljs new file mode 100644 index 000000000..7f3188620 --- /dev/null +++ b/frontend/test/frontend_tests/basic_shapes_test.cljs @@ -0,0 +1,49 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC +(ns frontend-tests.basic-shapes-test + (:require + [app.common.test-helpers.files :as cthf] + [app.common.test-helpers.ids-map :as cthi] + [app.common.test-helpers.shapes :as cths] + [app.main.data.workspace.changes :as dch] + [cljs.test :as t :include-macros true] + [frontend-tests.helpers.state :as ths])) + +(t/deftest test-update-shape + (t/async + done + (let [;; ==== Setup + store + (ths/setup-store + (-> (cthf/sample-file :file1 :page-label :page1) + (cths/add-sample-shape :shape1))) + + ;; ==== Action + events + [(dch/update-shapes [(cthi/id :shape1)] + #(assoc % :fills + (cths/sample-fills-color :fill-color + "#fabada")))]] + + (ths/run-store + store done events + (fn [new-state] + (let [;; ==== Get + shape1' (get-in new-state [:workspace-data + :pages-index + (cthi/id :page1) + :objects + (cthi/id :shape1)]) + fills' (:fills shape1') + fill' (first fills')] + + (cthf/dump-shape shape1') + + ;; ==== Check + (t/is (some? shape1')) + (t/is (= (count fills') 1)) + (t/is (= (:fill-color fill') "#fabada")) + (t/is (= (:fill-opacity fill') 1)))))))) diff --git a/frontend/test/frontend_tests/helpers/pages.cljs b/frontend/test/frontend_tests/helpers/pages.cljs index 9289d992a..939d06a07 100644 --- a/frontend/test/frontend_tests/helpers/pages.cljs +++ b/frontend/test/frontend_tests/helpers/pages.cljs @@ -97,7 +97,7 @@ (if (empty? shapes) state (let [[group changes] - (dwg/prepare-create-group nil (:objects page) (:id page) shapes prefix true)] + (dwg/prepare-create-group (pcb/empty-changes) nil (:objects page) (:id page) shapes prefix true)] (swap! idmap assoc label (:id group)) (update state :workspace-data diff --git a/frontend/test/frontend_tests/helpers/state.cljs b/frontend/test/frontend_tests/helpers/state.cljs new file mode 100644 index 000000000..3b5fd501f --- /dev/null +++ b/frontend/test/frontend_tests/helpers/state.cljs @@ -0,0 +1,56 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns frontend-tests.helpers.state + (:require + [app.common.pprint :refer [pprint]] + [app.common.schema :as sm] + [app.common.test-helpers.files :as cthf] + [app.main.data.workspace.layout :as layout] + [beicon.v2.core :as rx] + [potok.v2.core :as ptk])) + +(def ^private initial-state + {:workspace-layout layout/default-layout + :workspace-global layout/default-global + :current-file-id nil + :current-page-id nil + :workspace-data nil + :workspace-libraries {} + :features/team #{"components/v2"}}) + +(defn- on-error + [cause] + (js/console.log "STORE ERROR" (.-stack cause)) + (when-let [data (some-> cause ex-data ::sm/explain)] + (pprint (sm/humanize-explain data)))) + +(defn setup-store + [file] + (let [state (-> initial-state + (assoc :current-file-id (:id file) + :current-page-id (cthf/current-page-id file) + :workspace-file (dissoc file :data) + :workspace-data (:data file))) + store (ptk/store {:state state :on-error on-error})] + store)) + +(defn run-store + [store done events completed-cb] + (let [stream (ptk/input-stream store)] + (->> stream + (rx/take-until (rx/filter #(= :the/end %) stream)) + (rx/last) + (rx/tap (fn [] + (completed-cb @store))) + (rx/subs! (fn [_] (done)) + (fn [cause] + (js/console.log "[error]:" cause)) + (fn [_] + (js/console.log "[complete]")))) + (doall (for [event events] + (ptk/emit! store event))) + (ptk/emit! store :the/end))) -- Gitee From 677b28218eed83e4e7a5b3311c993e0bd3cd969b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Mon, 13 May 2024 13:31:38 +0200 Subject: [PATCH 0533/1266] :wrench: Update dependencies for fmt:clj --- yarn.lock | 937 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 910 insertions(+), 27 deletions(-) diff --git a/yarn.lock b/yarn.lock index b3d605679..55dc780c9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,36 +1,919 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! +__metadata: + version: 8 + cacheKey: 10c0 -"@playwright/test@^1.43.1": - version "1.43.1" - resolved "https://registry.npmjs.org/@playwright/test/-/test-1.43.1.tgz" - integrity sha512-HgtQzFgNEEo4TE22K/X7sYTYNqEMMTZmFS8kTq6m8hXj+m1D8TgwgIbumHddJa9h4yl4GkKb8/bgAl2+g7eDgA== +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" dependencies: - playwright "1.43.1" + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e + languageName: node + linkType: hard -"@types/node@^20.12.7": - version "20.12.7" - resolved "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz" - integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg== +"@npmcli/agent@npm:^2.0.0": + version: 2.2.2 + resolution: "@npmcli/agent@npm:2.2.2" dependencies: - undici-types "~5.26.4" + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.3" + checksum: 325e0db7b287d4154ecd164c0815c08007abfb07653cc57bceded17bb7fd240998a3cbdbe87d700e30bef494885eccc725ab73b668020811d56623d145b524ae + languageName: node + linkType: hard -playwright-core@1.43.1: - version "1.43.1" - resolved "https://registry.npmjs.org/playwright-core/-/playwright-core-1.43.1.tgz" - integrity sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg== +"@npmcli/fs@npm:^3.1.0": + version: 3.1.1 + resolution: "@npmcli/fs@npm:3.1.1" + dependencies: + semver: "npm:^7.3.5" + checksum: c37a5b4842bfdece3d14dfdb054f73fe15ed2d3da61b34ff76629fb5b1731647c49166fd2a8bf8b56fcfa51200382385ea8909a3cbecdad612310c114d3f6c99 + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd + languageName: node + linkType: hard + +"@playwright/test@npm:^1.43.1": + version: 1.43.1 + resolution: "@playwright/test@npm:1.43.1" + dependencies: + playwright: "npm:1.43.1" + bin: + playwright: cli.js + checksum: 6f1398c3c66657729a14d7c2d239e2f678c37610c3163b4ad1f028cbb6b88fc845cd9033a25d35436fa86d3dfcc57ecb49028c09f7aea1389c4257e4ac9124cd + languageName: node + linkType: hard + +"@types/node@npm:^20.12.7": + version: 20.12.7 + resolution: "@types/node@npm:20.12.7" + dependencies: + undici-types: "npm:~5.26.4" + checksum: dce80d63a3b91892b321af823d624995c61e39c6a223cc0ac481a44d337640cc46931d33efb3beeed75f5c85c3bda1d97cef4c5cd4ec333caf5dee59cff6eca0 + languageName: node + linkType: hard + +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: f742a5a107473946f426c691c08daba61a1d15942616f300b5d32fd735be88fef5cba24201757b6c407fd564555fb48c751cfa33519b2605c8a7aadd22baf372 + languageName: node + linkType: hard + +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": + version: 7.1.1 + resolution: "agent-base@npm:7.1.1" + dependencies: + debug: "npm:^4.3.4" + checksum: e59ce7bed9c63bf071a30cc471f2933862044c97fd9958967bfe22521d7a0f601ce4ed5a8c011799d0c726ca70312142ae193bbebb60f576b52be19d4a363b50 + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: "npm:^2.0.0" + indent-string: "npm:^4.0.0" + checksum: a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.0.1 + resolution: "ansi-regex@npm:6.0.1" + checksum: cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: "npm:^2.0.1" + checksum: 895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 + languageName: node + linkType: hard + +"ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: 5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f + languageName: node + linkType: hard + +"cacache@npm:^18.0.0": + version: 18.0.3 + resolution: "cacache@npm:18.0.3" + dependencies: + "@npmcli/fs": "npm:^3.1.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^4.0.0" + ssri: "npm:^10.0.0" + tar: "npm:^6.1.11" + unique-filename: "npm:^3.0.0" + checksum: dfda92840bb371fb66b88c087c61a74544363b37a265023223a99965b16a16bbb87661fe4948718d79df6e0cc04e85e62784fbcf1832b2a5e54ff4c46fbb45b7 + languageName: node + linkType: hard + +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: 594754e1303672171cc04e50f6c398ae16128eb134a88f801bf5354fd96f205320f23536a045d9abd8b51024a149696e51231565891d4efdab8846021ecf88e6 + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: "npm:~1.1.4" + checksum: 37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.3.4": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: "npm:2.1.2" + peerDependenciesMeta: + supports-color: + optional: true + checksum: cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736 + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: "npm:^0.6.2" + checksum: 36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.1.1 + resolution: "foreground-child@npm:3.1.1" + dependencies: + cross-spawn: "npm:^7.0.0" + signal-exit: "npm:^4.0.1" + checksum: 9700a0285628abaeb37007c9a4d92bd49f67210f09067638774338e146c8e9c825c5c877f072b2f75f41dc6a2d0be8664f79ffc03f6576649f54a84fb9b47de0 + languageName: node + linkType: hard + +"fs-minipass@npm:^2.0.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: "npm:^3.0.0" + checksum: 703d16522b8282d7299337539c3ed6edddd1afe82435e4f5b76e34a79cd74e488a8a0e26a636afc2440e1a23b03878e2122e3a2cfe375a5cf63c37d92b86a004 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: "npm:^7.0.3" + checksum: 63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 + languageName: node + linkType: hard + +"fsevents@npm:2.3.2": + version: 2.3.2 + resolution: "fsevents@npm:2.3.2" + dependencies: + node-gyp: "npm:latest" + checksum: be78a3efa3e181cda3cf7a4637cb527bcebb0bd0ea0440105a3bb45b86f9245b307dc10a2507e8f4498a7d4ec349d1910f4d73e4d4495b16103106e07eee735b + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@npm%3A2.3.2#optional!builtin": + version: 2.3.2 + resolution: "fsevents@patch:fsevents@npm%3A2.3.2#optional!builtin::version=2.3.2&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + +"glob@npm:^10.2.2, glob@npm:^10.3.10": + version: 10.3.15 + resolution: "glob@npm:10.3.15" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^2.3.6" + minimatch: "npm:^9.0.1" + minipass: "npm:^7.0.4" + path-scurry: "npm:^1.11.0" + bin: + glob: dist/esm/bin.mjs + checksum: cda748ddc181b31b3df9548c0991800406d5cc3b3f8110e37a8751ec1e39f37cdae7d7782d5422d7df92775121cdf00599992dff22f7ff1260344843af227c2b + languageName: node + linkType: hard + +"graceful-fs@npm:^4.2.6": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: 4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1": + version: 7.0.4 + resolution: "https-proxy-agent@npm:7.0.4" + dependencies: + agent-base: "npm:^7.0.2" + debug: "npm:4" + checksum: bc4f7c38da32a5fc622450b6cb49a24ff596f9bd48dcedb52d2da3fa1c1a80e100fb506bd59b326c012f21c863c69b275c23de1a01d0b84db396822fdf25e52b + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f + languageName: node + linkType: hard + +"ip-address@npm:^9.0.5": + version: 9.0.5 + resolution: "ip-address@npm:9.0.5" + dependencies: + jsbn: "npm:1.1.0" + sprintf-js: "npm:^1.1.3" + checksum: 331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc + languageName: node + linkType: hard + +"is-lambda@npm:^1.0.1": + version: 1.0.1 + resolution: "is-lambda@npm:1.0.1" + checksum: 85fee098ae62ba6f1e24cf22678805473c7afd0fb3978a3aa260e354cb7bcb3a5806cf0a98403188465efedec41ab4348e8e4e79305d409601323855b3839d4d + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 + languageName: node + linkType: hard + +"jackspeak@npm:^2.3.6": + version: 2.3.6 + resolution: "jackspeak@npm:2.3.6" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: f01d8f972d894cd7638bc338e9ef5ddb86f7b208ce177a36d718eac96ec86638a6efa17d0221b10073e64b45edc2ce15340db9380b1f5d5c5d000cbc517dc111 + languageName: node + linkType: hard + +"jsbn@npm:1.1.0": + version: 1.1.0 + resolution: "jsbn@npm:1.1.0" + checksum: 4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 + languageName: node + linkType: hard + +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": + version: 10.2.2 + resolution: "lru-cache@npm:10.2.2" + checksum: 402d31094335851220d0b00985084288136136992979d0e015f0f1697e15d1c86052d7d53ae86b614e5b058425606efffc6969a31a091085d7a2b80a8a1e26d6 + languageName: node + linkType: hard + +"make-fetch-happen@npm:^13.0.0": + version: 13.0.1 + resolution: "make-fetch-happen@npm:13.0.1" + dependencies: + "@npmcli/agent": "npm:^2.0.0" + cacache: "npm:^18.0.0" + http-cache-semantics: "npm:^4.1.1" + is-lambda: "npm:^1.0.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^3.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^0.6.3" + proc-log: "npm:^4.2.0" + promise-retry: "npm:^2.0.1" + ssri: "npm:^10.0.0" + checksum: df5f4dbb6d98153b751bccf4dc4cc500de85a96a9331db9805596c46aa9f99d9555983954e6c1266d9f981ae37a9e4647f42b9a4bb5466f867f4012e582c9e7e + languageName: node + linkType: hard + +"minimatch@npm:^9.0.1": + version: 9.0.4 + resolution: "minimatch@npm:9.0.4" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 2c16f21f50e64922864e560ff97c587d15fd491f65d92a677a344e970fe62aafdbeafe648965fa96d33c061b4d0eabfe0213466203dd793367e7f28658cf6414 + languageName: node + linkType: hard + +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: "npm:^7.0.3" + checksum: 5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e + languageName: node + linkType: hard + +"minipass-fetch@npm:^3.0.0": + version: 3.0.5 + resolution: "minipass-fetch@npm:3.0.5" + dependencies: + encoding: "npm:^0.1.13" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^2.1.2" + dependenciesMeta: + encoding: + optional: true + checksum: 9d702d57f556274286fdd97e406fc38a2f5c8d15e158b498d7393b1105974b21249289ec571fa2b51e038a4872bfc82710111cf75fae98c662f3d6f95e72152b + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: "npm:^3.0.0" + checksum: 2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: "npm:^3.0.0" + checksum: cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: "npm:^3.0.0" + checksum: 298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: "npm:^4.0.0" + checksum: a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c + languageName: node + linkType: hard + +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: a91d8043f691796a8ac88df039da19933ef0f633e3d7f0d35dcd5373af49131cf2399bfc355f41515dc495e3990369c3858cd319e5c2722b4753c90bf3152462 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4": + version: 7.1.1 + resolution: "minipass@npm:7.1.1" + checksum: fdccc2f99c31083f45f881fd1e6971d798e333e078ab3c8988fb818c470fbd5e935388ad9adb286397eba50baebf46ef8ff487c8d3f455a69c6f3efc327bdff9 + languageName: node + linkType: hard + +"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": + version: 2.1.2 + resolution: "minizlib@npm:2.1.2" + dependencies: + minipass: "npm:^3.0.0" + yallist: "npm:^4.0.0" + checksum: 64fae024e1a7d0346a1102bb670085b17b7f95bf6cfdf5b128772ec8faf9ea211464ea4add406a3a6384a7d87a0cd1a96263692134323477b4fb43659a6cab78 + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: 46ea0f3ffa8bc6a5bc0c7081ffc3907777f0ed6516888d40a518c5111f8366d97d2678911ad1a6882bf592fa9de6c784fea32e1687bb94e1f4944170af48a5cf + languageName: node + linkType: hard + +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc + languageName: node + linkType: hard + +"negotiator@npm:^0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: 3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 10.1.0 + resolution: "node-gyp@npm:10.1.0" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^13.0.0" + nopt: "npm:^7.0.0" + proc-log: "npm:^3.0.0" + semver: "npm:^7.3.5" + tar: "npm:^6.1.2" + which: "npm:^4.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 9cc821111ca244a01fb7f054db7523ab0a0cd837f665267eb962eb87695d71fb1e681f9e21464cc2fd7c05530dc4c81b810bca1a88f7d7186909b74477491a3c + languageName: node + linkType: hard + +"nopt@npm:^7.0.0": + version: 7.2.1 + resolution: "nopt@npm:7.2.1" + dependencies: + abbrev: "npm:^2.0.0" + bin: + nopt: bin/nopt.js + checksum: a069c7c736767121242037a22a788863accfa932ab285a1eb569eb8cd534b09d17206f68c37f096ae785647435e0c5a5a0a67b42ec743e481a455e5ae6a6df81 + languageName: node + linkType: hard + +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: "npm:^3.0.0" + checksum: 592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c + languageName: node + linkType: hard + +"path-scurry@npm:^1.11.0": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" + dependencies: + lru-cache: "npm:^10.2.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: 32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d + languageName: node + linkType: hard + +"penpot@workspace:.": + version: 0.0.0-use.local + resolution: "penpot@workspace:." + dependencies: + "@playwright/test": "npm:^1.43.1" + "@types/node": "npm:^20.12.7" + languageName: unknown + linkType: soft + +"playwright-core@npm:1.43.1": + version: 1.43.1 + resolution: "playwright-core@npm:1.43.1" + bin: + playwright-core: cli.js + checksum: e99f087c5f2b9ab6c379945311ea6e9e90c33cefecd8f950a0716e498dfdded738d6738266af307806d7730eacda8410c7563030690b9acf80c0b268781470b6 + languageName: node + linkType: hard + +"playwright@npm:1.43.1": + version: 1.43.1 + resolution: "playwright@npm:1.43.1" + dependencies: + fsevents: "npm:2.3.2" + playwright-core: "npm:1.43.1" + dependenciesMeta: + fsevents: + optional: true + bin: + playwright: cli.js + checksum: 7edc1e12b8f3b791c7e8d1f9c595be35c6eaf8100f9550d5e35e979aca0bc229734e65f200f2a02dc7e21630cc40c171d7b25f5f6ccf628c79e4a2d4690909ab + languageName: node + linkType: hard + +"proc-log@npm:^3.0.0": + version: 3.0.0 + resolution: "proc-log@npm:3.0.0" + checksum: f66430e4ff947dbb996058f6fd22de2c66612ae1a89b097744e17fb18a4e8e7a86db99eda52ccf15e53f00b63f4ec0b0911581ff2aac0355b625c8eac509b0dc + languageName: node + linkType: hard + +"proc-log@npm:^4.2.0": + version: 4.2.0 + resolution: "proc-log@npm:4.2.0" + checksum: 17db4757c2a5c44c1e545170e6c70a26f7de58feb985091fb1763f5081cab3d01b181fb2dd240c9f4a4255a1d9227d163d5771b7e69c9e49a561692db865efb9 + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: "npm:^2.0.2" + retry: "npm:^0.12.0" + checksum: 9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + languageName: node + linkType: hard + +"semver@npm:^7.3.5": + version: 7.6.2 + resolution: "semver@npm:7.6.2" + bin: + semver: bin/semver.js + checksum: 97d3441e97ace8be4b1976433d1c32658f6afaff09f143e52c593bae7eef33de19e3e369c88bd985ce1042c6f441c80c6803078d1de2a9988080b66684cbb30c + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: "npm:^3.0.0" + checksum: a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.3": + version: 8.0.3 + resolution: "socks-proxy-agent@npm:8.0.3" + dependencies: + agent-base: "npm:^7.1.1" + debug: "npm:^4.3.4" + socks: "npm:^2.7.1" + checksum: 4950529affd8ccd6951575e21c1b7be8531b24d924aa4df3ee32df506af34b618c4e50d261f4cc603f1bfd8d426915b7d629966c8ce45b05fb5ad8c8b9a6459d + languageName: node + linkType: hard + +"socks@npm:^2.7.1": + version: 2.8.3 + resolution: "socks@npm:2.8.3" + dependencies: + ip-address: "npm:^9.0.5" + smart-buffer: "npm:^4.2.0" + checksum: d54a52bf9325165770b674a67241143a3d8b4e4c8884560c4e0e078aace2a728dffc7f70150660f51b85797c4e1a3b82f9b7aa25e0a0ceae1a243365da5c51a7 + languageName: node + linkType: hard + +"sprintf-js@npm:^1.1.3": + version: 1.1.3 + resolution: "sprintf-js@npm:1.1.3" + checksum: 09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec + languageName: node + linkType: hard + +"ssri@npm:^10.0.0": + version: 10.0.6 + resolution: "ssri@npm:10.0.6" + dependencies: + minipass: "npm:^7.0.3" + checksum: e5a1e23a4057a86a97971465418f22ea89bd439ac36ade88812dd920e4e61873e8abd6a9b72a03a67ef50faa00a2daf1ab745c5a15b46d03e0544a0296354227 + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: 1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b + languageName: node + linkType: hard + +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: "npm:^0.2.0" + emoji-regex: "npm:^9.2.2" + strip-ansi: "npm:^7.0.1" + checksum: ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: "npm:^6.0.1" + checksum: a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 + languageName: node + linkType: hard + +"tar@npm:^6.1.11, tar@npm:^6.1.2": + version: 6.2.1 + resolution: "tar@npm:6.2.1" + dependencies: + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.0.0" + minipass: "npm:^5.0.0" + minizlib: "npm:^2.1.1" + mkdirp: "npm:^1.0.3" + yallist: "npm:^4.0.0" + checksum: a5eca3eb50bc11552d453488344e6507156b9193efd7635e98e867fab275d527af53d8866e2370cd09dfe74378a18111622ace35af6a608e5223a7d27fe99537 + languageName: node + linkType: hard + +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: bb673d7876c2d411b6eb6c560e0c571eef4a01c1c19925175d16e3a30c4c428181fb8d7ae802a261f283e4166a0ac435e2f505743aa9e45d893f9a3df017b501 + languageName: node + linkType: hard + +"unique-filename@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-filename@npm:3.0.0" + dependencies: + unique-slug: "npm:^4.0.0" + checksum: 6363e40b2fa758eb5ec5e21b3c7fb83e5da8dcfbd866cc0c199d5534c42f03b9ea9ab069769cc388e1d7ab93b4eeef28ef506ab5f18d910ef29617715101884f + languageName: node + linkType: hard + +"unique-slug@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-slug@npm:4.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: cb811d9d54eb5821b81b18205750be84cb015c20a4a44280794e915f5a0a70223ce39066781a354e872df3572e8155c228f43ff0cce94c7cbf4da2cc7cbdd635 + languageName: node + linkType: hard + +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: ./bin/node-which + checksum: 66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f + languageName: node + linkType: hard + +"which@npm:^4.0.0": + version: 4.0.0 + resolution: "which@npm:4.0.0" + dependencies: + isexe: "npm:^3.1.1" + bin: + node-which: bin/which.js + checksum: 449fa5c44ed120ccecfe18c433296a4978a7583bf2391c50abce13f76878d2476defde04d0f79db8165bdf432853c1f8389d0485ca6e8ebce3bbcded513d5e6a + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da + languageName: node + linkType: hard -playwright@1.43.1: - version "1.43.1" - resolved "https://registry.npmjs.org/playwright/-/playwright-1.43.1.tgz" - integrity sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA== +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" dependencies: - playwright-core "1.43.1" - optionalDependencies: - fsevents "2.3.2" + ansi-styles: "npm:^6.1.0" + string-width: "npm:^5.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 + languageName: node + linkType: hard -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a + languageName: node + linkType: hard -- Gitee From 575873eba767af22118270b9e40d35d56f773094 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Mon, 13 May 2024 17:17:16 +0200 Subject: [PATCH 0534/1266] :bug: Fix workspace rect drawing test --- frontend/playwright.config.js | 2 +- frontend/playwright/ui/specs/workspace.spec.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/playwright.config.js b/frontend/playwright.config.js index 4c8b68424..f062238f2 100644 --- a/frontend/playwright.config.js +++ b/frontend/playwright.config.js @@ -18,7 +18,7 @@ export default defineConfig({ /* Retry on CI only */ retries: process.env.CI ? 2 : 0, /* Opt out of parallel tests on CI. */ - workers: process.env.CI ? 4 : undefined, + workers: process.env.CI ? 1 : 1, /* Reporter to use. See https://playwright.dev/docs/test-reporters */ reporter: "html", /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ diff --git a/frontend/playwright/ui/specs/workspace.spec.js b/frontend/playwright/ui/specs/workspace.spec.js index 3f97aad90..b3b9981e5 100644 --- a/frontend/playwright/ui/specs/workspace.spec.js +++ b/frontend/playwright/ui/specs/workspace.spec.js @@ -35,6 +35,6 @@ test.skip("User draws a rect", async ({ page }) => { await workspacePage.clickWithDragViewportAt(128, 128, 200, 100); const shape = await workspacePage.rootShape.locator("rect"); - expect(shape).toHaveAttribute("width", "200"); - expect(shape).toHaveAttribute("height", "100"); + await expect(shape).toHaveAttribute("width", "200"); + await expect(shape).toHaveAttribute("height", "100"); }); -- Gitee From 3e4aaa79350ac3ff88cca1ef72b57a8cc7110ea1 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 14 May 2024 13:29:14 +0200 Subject: [PATCH 0535/1266] :sparkles: Add new composition functions for common tests --- .../app/common/test_helpers/compositions.cljc | 155 +++++++++++++++++- 1 file changed, 153 insertions(+), 2 deletions(-) diff --git a/common/src/app/common/test_helpers/compositions.cljc b/common/src/app/common/test_helpers/compositions.cljc index 72ab0073f..9de6aafa5 100644 --- a/common/src/app/common/test_helpers/compositions.cljc +++ b/common/src/app/common/test_helpers/compositions.cljc @@ -7,8 +7,15 @@ (ns app.common.test-helpers.compositions (:require [app.common.data :as d] + [app.common.files.changes-builder :as pcb] + [app.common.logic.libraries :as cll] + [app.common.logic.shapes :as cls] [app.common.test-helpers.components :as thc] - [app.common.test-helpers.shapes :as ths])) + [app.common.test-helpers.files :as thf] + [app.common.test-helpers.shapes :as ths] + [app.common.types.container :as ctn])) + +;; ----- File building (defn add-rect [file rect-label & {:keys [] :as params}] @@ -166,4 +173,148 @@ :component2-params component2-params :main2-root-params main2-root-params :nested-head-params nested-head-params) - (thc/instantiate-component component2-label copy2-root-label copy2-root-params))) \ No newline at end of file + (thc/instantiate-component component2-label copy2-root-label copy2-root-params))) + +;; ----- Getters + +(defn- bottom-shape-by-id + "Get the deepest descendant of a shape by id" + [file id & {:keys [page-label]}] + (let [shape (ths/get-shape-by-id file id :page-label page-label)] + (if (some? (:shapes shape)) + (let [child-id (-> (:shapes shape) + first)] + (bottom-shape-by-id file child-id :page-label page-label)) + shape))) + +(defn- bottom-shape + "Get the deepest descendant of a shape by tag" + [file tag & {:keys [page-label]}] + (let [shape (ths/get-shape file tag :page-label page-label)] + (bottom-shape-by-id file (:id shape) :page-label page-label))) + +(defn bottom-fill-color + "Get the first fill color of the deepest descendant of a shape by tag" + [file tag & {:keys [page-label]}] + (-> (bottom-shape file tag :page-label page-label) + :fills + first + :fill-color)) + +;; ----- File modifiers + +(defn propagate-component-changes + "Propagates the component changes for component specified by component-tag" + [file component-tag] + (let [file-id (:id file) + + changes (-> (pcb/empty-changes) + (cll/generate-sync-file-changes + nil + :components + file-id + (:id (thc/get-component file component-tag)) + file-id + {file-id file} + file-id))] + (thf/apply-changes file changes))) + +(defn swap-component + "Swap the specified shape by the component specified by component-tag" + [file shape component-tag & {:keys [page-label propagate-fn]}] + (let [page (if page-label + (thf/get-page file page-label) + (thf/current-page file)) + + [_ _all-parents changes] + (cll/generate-component-swap (pcb/empty-changes) + (:objects page) + shape + (:data file) + page + {(:id file) file} + (-> (thc/get-component file component-tag) + :id) + 0 + nil + {}) + + file' (thf/apply-changes file changes)] + (if propagate-fn + (propagate-fn file') + file'))) + +(defn swap-component-in-shape [file shape-tag component-tag & {:keys [page-label propagate-fn]}] + (swap-component file (ths/get-shape file shape-tag :page-label page-label) component-tag :page-label page-label :propagate-fn propagate-fn)) + +(defn swap-component-in-first-child [file shape-tag component-tag & {:keys [page-label propagate-fn]}] + (let [first-child-id (->> (ths/get-shape file shape-tag :page-label page-label) + :shapes + first)] + (swap-component file + (ths/get-shape-by-id file first-child-id :page-label page-label) + component-tag + :page-label page-label + :propagate-fn propagate-fn))) + +(defn update-color + "Update the first fill color for the shape identified by shape-tag" + [file shape-tag color & {:keys [page-label propagate-fn]}] + (let [page (if page-label + (thf/get-page file page-label) + (thf/current-page file)) + changes + (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) + #{(:id (ths/get-shape file shape-tag :page-label page-label))} + (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color color))) + (:objects page) + {}) + file' (thf/apply-changes file changes)] + (if propagate-fn + (propagate-fn file') + file'))) + +(defn update-bottom-color + "Update the first fill color of the deepest descendant for the shape identified by shape-tag" + [file shape-tag color & {:keys [page-label propagate-fn]}] + (let [page (if page-label + (thf/get-page file page-label) + (thf/current-page file)) + changes + (cls/generate-update-shapes (pcb/empty-changes nil (:id page)) + #{(:id (bottom-shape file shape-tag :page-label page-label))} + (fn [shape] + (assoc shape :fills (ths/sample-fills-color :fill-color color))) + (:objects page) + {}) + file' (thf/apply-changes file changes)] + (if propagate-fn + (propagate-fn file') + file'))) + +(defn reset-overrides [file shape & {:keys [page-label propagate-fn]}] + (let [page (if page-label + (thf/get-page file page-label) + (thf/current-page file)) + container (ctn/make-container page :page) + file-id (:id file) + changes (-> (pcb/empty-changes) + (cll/generate-reset-component + file + {file-id file} + (ctn/make-container container :page) + (:id shape) + true)) + file' (thf/apply-changes file changes)] + (if propagate-fn + (propagate-fn file') + file'))) + +(defn reset-overrides-in-first-child [file shape-tag & {:keys [page-label propagate-fn]}] + (let [first-child-id (->> + (ths/get-shape file shape-tag :page-label page-label) + :shapes + first) + shape (ths/get-shape-by-id file first-child-id :page-label page-label)] + (reset-overrides file shape :page-label page-label :propagate-fn propagate-fn))) -- Gitee From fcf14b5cab5ea09f30d4c17518b200a21c1e7abe Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 14 May 2024 13:29:52 +0200 Subject: [PATCH 0536/1266] :sparkles: Add duplicate page component tests --- common/test/cases/duplicated-pages.penpot | Bin 0 -> 25839 bytes .../logic/duplicated_pages_test.cljc | 117 ++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 common/test/cases/duplicated-pages.penpot create mode 100644 common/test/common_tests/logic/duplicated_pages_test.cljc diff --git a/common/test/cases/duplicated-pages.penpot b/common/test/cases/duplicated-pages.penpot new file mode 100644 index 0000000000000000000000000000000000000000..dccccbde44d5ef481488ca2fdd38a1634d733dfd GIT binary patch literal 25839 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%0A19gi#?pbCEMy~#KaXC%UU2E$}ybBEj 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 literal 0 HcmV?d00001 diff --git a/common/test/common_tests/logic/duplicated_pages_test.cljc b/common/test/common_tests/logic/duplicated_pages_test.cljc new file mode 100644 index 000000000..d1bafb88d --- /dev/null +++ b/common/test/common_tests/logic/duplicated_pages_test.cljc @@ -0,0 +1,117 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns common-tests.logic.duplicated-pages-test + (:require + [app.common.files.changes :as ch] + [app.common.files.changes-builder :as pcb] + [app.common.logic.libraries :as cll] + [app.common.logic.shapes :as cls] + [app.common.pprint :as pp] + [app.common.test-helpers.components :as thc] + [app.common.test-helpers.compositions :as tho] + [app.common.test-helpers.files :as thf] + [app.common.test-helpers.ids-map :as thi] + [app.common.test-helpers.shapes :as ths] + [app.common.types.component :as ctk] + [app.common.types.container :as ctn] + [app.common.types.file :as ctf] + [app.common.uuid :as uuid] + [clojure.test :as t])) + +(t/use-fixtures :each thi/test-fixture) + +;; Related .penpot file: common/test/cases/duplicated-pages.penpot +(t/deftest test-propagation-with-anidated-components + (letfn [(setup [] + (-> (thf/sample-file :file1 :page-label :page-1) + (tho/add-frame :frame-ellipse-1 :fills []) + (ths/add-sample-shape :ellipse-shape-1 :parent-label :frame-ellipse-1 :fills (ths/sample-fills-color :fill-color "#204fdc")) + (thc/make-component :ellipse-1 :frame-ellipse-1) + + (tho/add-frame :frame-ellipse-2 :fills []) + (ths/add-sample-shape :ellipse-shape-2 :parent-label :frame-ellipse-2 :fills (ths/sample-fills-color :fill-color "#dc3020")) + (thc/make-component :ellipse-2 :frame-ellipse-2) + + (tho/add-frame :frame-ellipse-3 :fills []) + (ths/add-sample-shape :ellipse-shape-3 :parent-label :frame-ellipse-3 :fills (ths/sample-fills-color :fill-color "#d8dc20")) + (thc/make-component :ellipse-3 :frame-ellipse-3) + + (tho/add-frame :frame-board-1 :fills (ths/sample-fills-color :fill-color "#FFFFFF")) + (thc/instantiate-component :ellipse-1 :copy-ellipse-1 :parent-label :frame-board-1 :children-labels [:ellipse-shape-1-board-1]) + (thc/make-component :board-1 :frame-board-1) + + (thf/add-sample-page :page-2) + (tho/add-frame :frame-board-2 :fills (ths/sample-fills-color :fill-color "#FFFFFF")) + (thc/instantiate-component :board-1 :copy-board-1 :parent-label :frame-board-2 :children-labels [:board-1-board-2]) + (thc/make-component :board-2 :frame-board-2) + + (thf/add-sample-page :page-3) + (tho/add-frame :frame-board-3 :fills (ths/sample-fills-color :fill-color "#FFFFFF")) + (thc/instantiate-component :board-2 :copy-board-2 :parent-label :frame-board-3 :children-labels [:board-2-board-3]) + (thc/make-component :board-3 :frame-board-3))) + + (propagate-all-component-changes [file] + (-> file + (tho/propagate-component-changes :ellipse-1) + (tho/propagate-component-changes :ellipse-2) + (tho/propagate-component-changes :ellipse-3) + (tho/propagate-component-changes :board-1) + (tho/propagate-component-changes :board-2))) + + (reset-all-overrides [file] + (-> file + (tho/reset-overrides-in-first-child :frame-board-1 :page-label :page-1) + (tho/reset-overrides-in-first-child :copy-board-1 :page-label :page-2) + (propagate-all-component-changes))) + + (fill-colors [file] + [(tho/bottom-fill-color file :frame-ellipse-1 :page-label :page-1) + (tho/bottom-fill-color file :frame-ellipse-2 :page-label :page-1) + (tho/bottom-fill-color file :frame-ellipse-3 :page-label :page-1) + (tho/bottom-fill-color file :frame-board-1 :page-label :page-1) + (tho/bottom-fill-color file :frame-board-2 :page-label :page-2) + (tho/bottom-fill-color file :frame-board-3 :page-label :page-3) + (-> + (ths/get-shape file :frame-board-1 :page-label :page-1) + :fills + first + :fill-color) + (-> + (ths/get-shape file :copy-board-1 :page-label :page-2) + :fills + first + :fill-color)]) + + (validate [file validator] + (validator file) + file)] + + (-> (setup) + ;; Swap the copy inside main of Board1 to Ellipse2, and see that it propagates to copies in other pages. + (tho/swap-component-in-shape :copy-ellipse-1 :ellipse-2 :page-label :page-1 :propagate-fn propagate-all-component-changes) + (validate #(t/is (= (fill-colors %) ["#204fdc" "#dc3020" "#d8dc20" "#dc3020" "#dc3020" "#dc3020" "#FFFFFF" "#FFFFFF"]))) + + ;; Change color of Ellipse2 main, and see that it propagates to all copies. + (tho/update-bottom-color :frame-ellipse-2 "#abcdef" :page-label :page-1 :propagate-fn propagate-all-component-changes) + (validate #(t/is (= (fill-colors %) ["#204fdc" "#abcdef" "#d8dc20" "#abcdef" "#abcdef" "#abcdef" "#FFFFFF" "#FFFFFF"]))) + + ;;Change color of copies of Ellipse2 and see that the override works. + (tho/update-bottom-color :frame-board-1 "#efaade" :page-label :page-1 :propagate-fn propagate-all-component-changes) + (validate #(t/is (= (fill-colors %) ["#204fdc" "#abcdef" "#d8dc20" "#efaade" "#efaade" "#efaade" "#FFFFFF" "#FFFFFF"]))) + (tho/update-bottom-color :copy-board-1 "#aaefcb" :page-label :page-2 :propagate-fn propagate-all-component-changes) + (validate #(t/is (= (fill-colors %) ["#204fdc" "#abcdef" "#d8dc20" "#efaade" "#aaefcb" "#aaefcb" "#FFFFFF" "#FFFFFF"]))) + + ;; Reset all overrides. + (reset-all-overrides) + (validate #(t/is (= (fill-colors %) ["#204fdc" "#abcdef" "#d8dc20" "#abcdef" "#abcdef" "#abcdef" "#FFFFFF" "#FFFFFF"]))) + + ;; Swap the copy of Ellipse2 inside copies of Board1 to Ellipse 3. Then make + ;; changes in Board1 main and see that they are not propagated. + (tho/swap-component-in-first-child :copy-board-1 :ellipse-3 :page-label :page-2 :propagate-fn propagate-all-component-changes) + (validate #(t/is (= (fill-colors %) ["#204fdc" "#abcdef" "#d8dc20" "#abcdef" "#d8dc20" "#d8dc20" "#FFFFFF" "#FFFFFF"]))) + (tho/update-color :frame-board-1 "#fabada" :page-label :page-1 :propagate-fn propagate-all-component-changes) + (validate #(t/is (= (fill-colors %) ["#204fdc" "#abcdef" "#d8dc20" "#abcdef" "#d8dc20" "#d8dc20" "#fabada" "#fabada"])))))) -- Gitee From 39c8b2ea3cdcf4b60ed8c476f2944f86afbc260f Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 14 May 2024 13:30:31 +0200 Subject: [PATCH 0537/1266] :sparkles: Add multiple nesting levels component tests --- .../test/cases/multiple-testing-levels.penpot | Bin 0 -> 19735 bytes .../logic/multiple_nesting_levels_test.cljc | 124 ++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 common/test/cases/multiple-testing-levels.penpot create mode 100644 common/test/common_tests/logic/multiple_nesting_levels_test.cljc diff --git a/common/test/cases/multiple-testing-levels.penpot b/common/test/cases/multiple-testing-levels.penpot new file mode 100644 index 0000000000000000000000000000000000000000..06539e8f7ed513855152844cf449ed104dbcd321 GIT binary patch literal 19735 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 QHP>oct2)0&RRIA20LecuUjP6A literal 0 HcmV?d00001 diff --git a/common/test/common_tests/logic/multiple_nesting_levels_test.cljc b/common/test/common_tests/logic/multiple_nesting_levels_test.cljc new file mode 100644 index 000000000..aeb4cb608 --- /dev/null +++ b/common/test/common_tests/logic/multiple_nesting_levels_test.cljc @@ -0,0 +1,124 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns common-tests.logic.multiple-nesting-levels-test + (:require + [app.common.files.changes :as ch] + [app.common.files.changes-builder :as pcb] + [app.common.logic.libraries :as cll] + [app.common.logic.shapes :as cls] + [app.common.pprint :as pp] + [app.common.test-helpers.components :as thc] + [app.common.test-helpers.compositions :as tho] + [app.common.test-helpers.files :as thf] + [app.common.test-helpers.ids-map :as thi] + [app.common.test-helpers.shapes :as ths] + [app.common.types.component :as ctk] + [app.common.types.container :as ctn] + [app.common.types.file :as ctf] + [app.common.uuid :as uuid] + [clojure.test :as t])) + +(t/use-fixtures :each thi/test-fixture) + +;; TODO +;; Related .penpot file: XXX +(t/deftest test-multiple-nesting-levels + (letfn [(setup [] + (-> (thf/sample-file :file1) + + (tho/add-frame :frame-simple-1) + (ths/add-sample-shape :rectangle :parent-label :frame-simple-1 :fills (ths/sample-fills-color :fill-color "#2152e5")) + (thc/make-component :simple-1 :frame-simple-1) + + (tho/add-frame :frame-simple-2) + (ths/add-sample-shape :circle :parent-label :frame-simple-2 :fills (ths/sample-fills-color :fill-color "#e56d21")) + (thc/make-component :simple-2 :frame-simple-2) + + (tho/add-frame :frame-composed-1) + (thc/instantiate-component :simple-1 :copy-simple-1 :parent-label :frame-composed-1 :children-labels [:simple-1-composed-1]) + (thc/make-component :composed-1 :frame-composed-1) + + (tho/add-frame :frame-composed-2) + (thc/instantiate-component :composed-1 :copy-frame-composed-1 :parent-label :frame-composed-2 :children-labels [:composed-1-composed-2]) + (thc/make-component :composed-2 :frame-composed-2) + + (thc/instantiate-component :composed-2 :copy-frame-composed-2 :children-labels [:composed-1-composed-2-copy]))) + + (propagate-all-component-changes [file] + (-> file + (tho/propagate-component-changes :simple-1) + (tho/propagate-component-changes :simple-2) + (tho/propagate-component-changes :composed-1) + (tho/propagate-component-changes :composed-2))) + + (reset-all-overrides [file] + (-> file + (tho/reset-overrides (ths/get-shape file :copy-simple-1)) + (tho/reset-overrides (ths/get-shape file :copy-frame-composed-1)) + (tho/reset-overrides (ths/get-shape file :composed-1-composed-2-copy)) + (propagate-all-component-changes))) + + (fill-colors [file] + [(tho/bottom-fill-color file :frame-simple-1) + (tho/bottom-fill-color file :frame-simple-2) + (tho/bottom-fill-color file :frame-composed-1) + (tho/bottom-fill-color file :frame-composed-2) + (tho/bottom-fill-color file :copy-frame-composed-2)]) + + (validate [file validator] + (validator file) + file)] + (-> (setup) + ;; Change color of Simple1 and see that it's propagated to all copies. + (tho/update-bottom-color :frame-simple-1 "#e521a8" :propagate-fn propagate-all-component-changes) + (validate #(t/is (= (fill-colors %) ["#e521a8" "#e56d21" "#e521a8" "#e521a8" "#e521a8"]))) + + ;; Override color in copy inside Composed1, Composed2 and the copy + ;; of Composed2 and see in all cases that a change in the main is overriden. + (tho/update-bottom-color :simple-1-composed-1 "#21e59e" :propagate-fn propagate-all-component-changes) + (tho/update-bottom-color :composed-1-composed-2 "#2186e5" :propagate-fn propagate-all-component-changes) + (tho/update-bottom-color :composed-1-composed-2-copy "#e5a221" :propagate-fn propagate-all-component-changes) + (validate #(t/is (= (fill-colors %) ["#e521a8" "#e56d21" "#21e59e" "#2186e5" "#e5a221"]))) + (tho/update-bottom-color :frame-simple-1 "#b2e521" :propagate-fn propagate-all-component-changes) + (validate #(t/is (= (fill-colors %) ["#b2e521" "#e56d21" "#21e59e" "#2186e5" "#e5a221"]))) + + ;; Reset all overrides and check again the propagation from mains. + (reset-all-overrides) + (tho/update-bottom-color :frame-simple-1 "#21aae5" :propagate-fn propagate-all-component-changes) + (validate #(t/is (= (fill-colors %) ["#21aae5" "#e56d21" "#21aae5" "#21aae5" "#21aae5"]))) + + ;; Swap in Composed1 to Simple2 and see that it propagates ok. + (tho/swap-component-in-shape :copy-simple-1 :simple-2 :propagate-fn propagate-all-component-changes) + (validate #(t/is (= (fill-colors %) ["#21aae5" "#e56d21" "#e56d21" "#e56d21" "#e56d21"]))) + + ;; Change color of Simple 2 and see that it propagates ok. + (tho/update-bottom-color :frame-simple-2 "#c321e5" :propagate-fn propagate-all-component-changes) + (validate #(t/is (= (fill-colors %) ["#21aae5" "#c321e5" "#c321e5" "#c321e5" "#c321e5"]))) + + ;; Swap Simple 2 copy in Composed2. Check propagations. + (tho/swap-component-in-first-child :copy-frame-composed-1 :simple-1 :propagate-fn propagate-all-component-changes) + (validate #(t/is (= (fill-colors %) ["#21aae5" "#c321e5" "#c321e5" "#21aae5" "#21aae5"]))) + + ;; Change color of Simple 1 and check propagation. + (tho/update-bottom-color :frame-simple-1 "#e521a8" :propagate-fn propagate-all-component-changes) + (validate #(t/is (= (fill-colors %) ["#e521a8" "#c321e5" "#c321e5" "#e521a8" "#e521a8"]))) + + ;; Reset overrides in Composed2 main, and swap Simple 2 copy in + ;; Composed2 copy. Change color of Simple 2 and check propatagion. + (tho/reset-overrides-in-first-child :copy-frame-composed-1 :propagate-fn propagate-all-component-changes) + (tho/swap-component-in-first-child :composed-1-composed-2-copy :simple-1 :propagate-fn propagate-all-component-changes) + (tho/update-bottom-color :frame-simple-2 "#21e55d" :propagate-fn propagate-all-component-changes) + (validate #(t/is (= (fill-colors %) ["#e521a8" "#21e55d" "#21e55d" "#21e55d" "#e521a8"]))) + + ;; Swap all of three (Composed 1, Composed2 and copy of Composed2) + ;; and check propagations from Simple mains. + (tho/swap-component-in-first-child :frame-composed-1 :simple-1 :propagate-fn propagate-all-component-changes) + (tho/swap-component-in-first-child :copy-frame-composed-1 :simple-2 :propagate-fn propagate-all-component-changes) + (tho/swap-component-in-first-child :composed-1-composed-2-copy :simple-2 :propagate-fn propagate-all-component-changes) + (tho/update-bottom-color :frame-simple-1 "#111111" :propagate-fn propagate-all-component-changes) + (tho/update-bottom-color :frame-simple-2 "#222222" :propagate-fn propagate-all-component-changes) + (validate #(t/is (= (fill-colors %) ["#111111" "#222222" "#111111" "#222222" "#222222"])))))) -- Gitee From d43458ee891b50678133f1d1b1d45053e6877f20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Tue, 14 May 2024 15:13:11 +0200 Subject: [PATCH 0538/1266] :bug: Fix mocking websockets when running multiple tests --- frontend/playwright.config.js | 2 +- .../playwright/helpers/MockWebSocketHelper.js | 63 ++++++++++++------- frontend/playwright/scripts/MockWebSocket.js | 12 ++-- .../playwright/ui/pages/BaseWebSocketPage.js | 4 +- .../playwright/ui/specs/workspace.spec.js | 6 +- 5 files changed, 51 insertions(+), 36 deletions(-) diff --git a/frontend/playwright.config.js b/frontend/playwright.config.js index f062238f2..b1b6ffd5f 100644 --- a/frontend/playwright.config.js +++ b/frontend/playwright.config.js @@ -18,7 +18,7 @@ export default defineConfig({ /* Retry on CI only */ retries: process.env.CI ? 2 : 0, /* Opt out of parallel tests on CI. */ - workers: process.env.CI ? 1 : 1, + workers: process.env.CI ? 1 : undefined, /* Reporter to use. See https://playwright.dev/docs/test-reporters */ reporter: "html", /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ diff --git a/frontend/playwright/helpers/MockWebSocketHelper.js b/frontend/playwright/helpers/MockWebSocketHelper.js index 3f0f845d2..42d06d5eb 100644 --- a/frontend/playwright/helpers/MockWebSocketHelper.js +++ b/frontend/playwright/helpers/MockWebSocketHelper.js @@ -2,17 +2,19 @@ export class MockWebSocketHelper extends EventTarget { static #mocks = new Map(); static async init(page) { - await page.exposeFunction("MockWebSocket$$constructor", (url, protocols) => { - const webSocket = new MockWebSocketHelper(page, url, protocols); + this.#mocks = new Map(); + + await page.exposeFunction("onMockWebSocketConstructor", (url) => { + const webSocket = new MockWebSocketHelper(page, url); this.#mocks.set(url, webSocket); }); - await page.exposeFunction("MockWebSocket$$spyMessage", (url, data) => { + await page.exposeFunction("onMockWebSocketSpyMessage", (url, data) => { if (!this.#mocks.has(url)) { throw new Error(`WebSocket with URL ${url} not found`); } this.#mocks.get(url).dispatchEvent(new MessageEvent("message", { data })); }); - await page.exposeFunction("MockWebSocket$$spyClose", (url, code, reason) => { + await page.exposeFunction("onMockWebSocketSpyClose", (url, code, reason) => { if (!this.#mocks.has(url)) { throw new Error(`WebSocket with URL ${url} not found`); } @@ -36,39 +38,52 @@ export class MockWebSocketHelper extends EventTarget { #page = null; #url; - #protocols; constructor(page, url, protocols) { super(); this.#page = page; this.#url = url; - this.#protocols = protocols; } mockOpen(options) { - return this.#page.evaluate(({ url, options }) => { - if (typeof WebSocket.getByURL !== 'function') { - throw new Error('WebSocket.getByURL is not a function. Did you forget to call MockWebSocket.init(page)?') - } - WebSocket.getByURL(url).mockOpen(options); - }, { url: this.#url, options }); + return this.#page.evaluate( + ({ url, options }) => { + if (typeof WebSocket.getByURL !== "function") { + throw new Error( + "WebSocket.getByURL is not a function. Did you forget to call MockWebSocket.init(page)?", + ); + } + WebSocket.getByURL(url).mockOpen(options); + }, + { url: this.#url, options }, + ); } mockMessage(data) { - return this.#page.evaluate(({ url, data }) => { - if (typeof WebSocket.getByURL !== 'function') { - throw new Error('WebSocket.getByURL is not a function. Did you forget to call MockWebSocket.init(page)?') - } - WebSocket.getByURL(url).mockMessage(data); - }, { url: this.#url, data }); + return this.#page.evaluate( + ({ url, data }) => { + if (typeof WebSocket.getByURL !== "function") { + throw new Error( + "WebSocket.getByURL is not a function. Did you forget to call MockWebSocket.init(page)?", + ); + } + WebSocket.getByURL(url).mockMessage(data); + }, + { url: this.#url, data }, + ); } mockClose() { - return this.#page.evaluate(({ url }) => { - if (typeof WebSocket.getByURL !== 'function') { - throw new Error('WebSocket.getByURL is not a function. Did you forget to call MockWebSocket.init(page)?') - } - WebSocket.getByURL(url).mockClose(); - }, { url: this.#url }); + return this.#page.evaluate( + ({ url }) => { + if (typeof WebSocket.getByURL !== "function") { + throw new Error( + "WebSocket.getByURL is not a function. Did you forget to call MockWebSocket.init(page)?", + ); + } + WebSocket.getByURL(url).mockClose(); + }, + { url: this.#url }, + ); } } diff --git a/frontend/playwright/scripts/MockWebSocket.js b/frontend/playwright/scripts/MockWebSocket.js index b7f5e4e30..aa54067da 100644 --- a/frontend/playwright/scripts/MockWebSocket.js +++ b/frontend/playwright/scripts/MockWebSocket.js @@ -46,14 +46,14 @@ window.WebSocket = class MockWebSocket extends EventTarget { MockWebSocket.#mocks.set(this.#url, this); - if (typeof window["MockWebSocket$$constructor"] === "function") { - MockWebSocket$$constructor(this.#url, this.#protocols); + if (typeof window["onMockWebSocketConstructor"] === "function") { + onMockWebSocketConstructor(this.#url, this.#protocols); } - if (typeof window["MockWebSocket$$spyMessage"] === "function") { - this.#spyMessage = MockWebSocket$$spyMessage; + if (typeof window["onMockWebSocketSpyMessage"] === "function") { + this.#spyMessage = onMockWebSocketSpyMessage; } - if (typeof window["MockWebSocket$$spyClose"] === "function") { - this.#spyClose = MockWebSocket$$spyClose; + if (typeof window["onMockWebSocketSpyClose"] === "function") { + this.#spyClose = onMockWebSocketSpyClose; } } diff --git a/frontend/playwright/ui/pages/BaseWebSocketPage.js b/frontend/playwright/ui/pages/BaseWebSocketPage.js index e382cd7b0..21855312e 100644 --- a/frontend/playwright/ui/pages/BaseWebSocketPage.js +++ b/frontend/playwright/ui/pages/BaseWebSocketPage.js @@ -8,8 +8,8 @@ export class BaseWebSocketPage extends BasePage { * @param {Page} page * @returns */ - static initWebSockets(page) { - return MockWebSocketHelper.init(page); + static async initWebSockets(page) { + await MockWebSocketHelper.init(page); } /** diff --git a/frontend/playwright/ui/specs/workspace.spec.js b/frontend/playwright/ui/specs/workspace.spec.js index b3b9981e5..58e9e5697 100644 --- a/frontend/playwright/ui/specs/workspace.spec.js +++ b/frontend/playwright/ui/specs/workspace.spec.js @@ -6,7 +6,7 @@ test.beforeEach(async ({ page }) => { await WorkspacePage.init(page); }); -test.skip("User loads worskpace with empty file", async ({ page }) => { +test("User loads worskpace with empty file", async ({ page }) => { const workspacePage = new WorkspacePage(page); await workspacePage.setupEmptyFile(page); @@ -15,7 +15,7 @@ test.skip("User loads worskpace with empty file", async ({ page }) => { await expect(workspacePage.pageName).toHaveText("Page 1"); }); -test.skip("User receives presence notifications updates in the workspace", async ({ page }) => { +test("User receives presence notifications updates in the workspace", async ({ page }) => { const workspacePage = new WorkspacePage(page); await workspacePage.setupEmptyFile(); @@ -25,7 +25,7 @@ test.skip("User receives presence notifications updates in the workspace", async await expect(page.getByTestId("active-users-list").getByAltText("Princesa Leia")).toHaveCount(2); }); -test.skip("User draws a rect", async ({ page }) => { +test("User draws a rect", async ({ page }) => { const workspacePage = new WorkspacePage(page); await workspacePage.setupEmptyFile(); await workspacePage.mockRPC("update-file?id=*", "workspace/update-file-create-rect.json"); -- Gitee From 236ff06763596d0e173e4efad4776ce74dc4f53a Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Mon, 6 May 2024 17:32:14 +0200 Subject: [PATCH 0539/1266] :sparkles: Expand api for plugins --- common/src/app/common/text.cljc | 8 +- frontend/src/app/plugins/api.cljs | 16 +++ frontend/src/app/plugins/grid.cljs | 39 +++++- frontend/src/app/plugins/shape.cljs | 176 ++++++++++++++++++++++++---- 4 files changed, 210 insertions(+), 29 deletions(-) diff --git a/common/src/app/common/text.cljc b/common/src/app/common/text.cljc index b164633a8..8ee125e8a 100644 --- a/common/src/app/common/text.cljc +++ b/common/src/app/common/text.cljc @@ -406,8 +406,12 @@ [shape text] (let [content (:content shape) - paragraph-style (select-keys (->> content (node-seq is-paragraph-node?) first) text-all-attrs) - text-style (select-keys (->> content (node-seq is-text-node?) first) text-all-attrs) + paragraph-style (merge + default-text-attrs + (select-keys (->> content (node-seq is-paragraph-node?) first) text-all-attrs)) + text-style (merge + default-text-attrs + (select-keys (->> content (node-seq is-text-node?) first) text-all-attrs)) paragraph-texts (str/split text "\n") diff --git a/frontend/src/app/plugins/api.cljs b/frontend/src/app/plugins/api.cljs index 5c06da859..38bda54f0 100644 --- a/frontend/src/app/plugins/api.cljs +++ b/frontend/src/app/plugins/api.cljs @@ -11,6 +11,7 @@ [app.common.files.changes-builder :as cb] [app.common.geom.point :as gpt] [app.common.record :as cr] + [app.common.text :as txt] [app.common.types.shape :as cts] [app.common.uuid :as uuid] [app.main.data.workspace.changes :as ch] @@ -129,6 +130,21 @@ [_] (create-shape :rect)) + (createText + [_ text] + (let [page-id (:current-page-id @st/state) + page (dm/get-in @st/state [:workspace-data :pages-index page-id]) + shape (-> (cts/setup-shape {:type :text :x 0 :y 0 :grow-type :auto-width}) + (txt/change-text text) + (assoc :position-data nil)) + changes + (-> (cb/empty-changes) + (cb/with-page page) + (cb/with-objects (:objects page)) + (cb/add-object shape))] + (st/emit! (ch/commit-changes changes)) + (shape/data->shape-proxy shape))) + (createShapeFromSvg [_ svg-string] (let [id (uuid/next) diff --git a/frontend/src/app/plugins/grid.cljs b/frontend/src/app/plugins/grid.cljs index 07cb39c9a..6c39df7f8 100644 --- a/frontend/src/app/plugins/grid.cljs +++ b/frontend/src/app/plugins/grid.cljs @@ -34,7 +34,7 @@ (st/emit! (dwsl/add-layout-track #{id} :row {:type type :value value})))) (addRowAtIndex - [self type value index] + [self index type value] (let [id (get-data self :id) type (keyword type)] (st/emit! (dwsl/add-layout-track #{id} :row {:type type :value value} index)))) @@ -46,7 +46,7 @@ (st/emit! (dwsl/add-layout-track #{id} :column {:type type :value value})))) (addColumnAtIndex - [self type value index] + [self index type value] (let [id (get-data self :id) type (keyword type)] (st/emit! (dwsl/add-layout-track #{id} :column {:type type :value value} index)))) @@ -170,4 +170,37 @@ (fn [self value] (let [id (get-data self :id)] (when (us/safe-int? value) - (st/emit! (dwsl/update-layout #{id} {:layout-padding {:p2 value :p4 value}})))))}))) + (st/emit! (dwsl/update-layout #{id} {:layout-padding {:p2 value :p4 value}})))))} + + + {:name "topPadding" + :get #(:p1 (get-state % :layout-padding)) + :set + (fn [self value] + (let [id (get-data self :id)] + (when (us/safe-int? value) + (st/emit! (dwsl/update-layout #{id} {:layout-padding {:p1 value}})))))} + + {:name "rightPadding" + :get #(:p2 (get-state % :layout-padding)) + :set + (fn [self value] + (let [id (get-data self :id)] + (when (us/safe-int? value) + (st/emit! (dwsl/update-layout #{id} {:layout-padding {:p2 value}})))))} + + {:name "bottomPadding" + :get #(:p3 (get-state % :layout-padding)) + :set + (fn [self value] + (let [id (get-data self :id)] + (when (us/safe-int? value) + (st/emit! (dwsl/update-layout #{id} {:layout-padding {:p3 value}})))))} + + {:name "leftPadding" + :get #(:p4 (get-state % :layout-padding)) + :set + (fn [self value] + (let [id (get-data self :id)] + (when (us/safe-int? value) + (st/emit! (dwsl/update-layout #{id} {:layout-padding {:p4 value}})))))}))) diff --git a/frontend/src/app/plugins/shape.cljs b/frontend/src/app/plugins/shape.cljs index e4b466b2e..11831bb94 100644 --- a/frontend/src/app/plugins/shape.cljs +++ b/frontend/src/app/plugins/shape.cljs @@ -7,10 +7,13 @@ (ns app.plugins.shape "RPC for plugins runtime." (:require + [app.common.data :as d] [app.common.data.macros :as dm] [app.common.files.helpers :as cfh] [app.common.record :as crc] + [app.common.spec :as us] [app.common.text :as txt] + [app.common.types.shape :as cts] [app.common.uuid :as uuid] [app.main.data.workspace :as udw] [app.main.data.workspace.changes :as dwc] @@ -24,17 +27,11 @@ (declare data->shape-proxy) -(defn- make-fills - [fills] +(defn- array-to-js + [value] (.freeze js/Object - (apply array (->> fills (map utils/to-js))))) - -(defn- make-strokes - [strokes] - (.freeze - js/Object - (apply array (->> strokes (map utils/to-js))))) + (apply array (->> value (map utils/to-js))))) (defn- locate-shape [shape-id] @@ -86,7 +83,8 @@ (addGridLayout [self] (let [id (get-data self :id)] - (st/emit! (dwsl/create-layout-from-id id :grid :from-frame? true :calculate-params? false))))) + (st/emit! (dwsl/create-layout-from-id id :grid :from-frame? true :calculate-params? false)) + (grid/grid-layout-proxy (obj/get self "_data"))))) (crc/define-properties! ShapeProxy @@ -107,6 +105,118 @@ {:name "type" :get (get-data-fn :type name)} + {:name "name" + :get #(get-state % :name) + :set (fn [self value] + (let [id (get-data self :id)] + (st/emit! (dwc/update-shapes [id] #(assoc % :name value)))))} + + {:name "blocked" + :get #(get-state % :blocked boolean) + :set (fn [self value] + (let [id (get-data self :id)] + (st/emit! (dwc/update-shapes [id] #(assoc % :blocked value)))))} + + {:name "hidden" + :get #(get-state % :hidden boolean) + :set (fn [self value] + (let [id (get-data self :id)] + (st/emit! (dwc/update-shapes [id] #(assoc % :hidden value)))))} + + {:name "proportionLock" + :get #(get-state % :proportion-lock boolean) + :set (fn [self value] + (let [id (get-data self :id)] + (st/emit! (dwc/update-shapes [id] #(assoc % :proportion-lock value)))))} + + {:name "constraintsHorizontal" + :get #(get-state % :constraints-h d/name) + :set (fn [self value] + (let [id (get-data self :id) + value (keyword value)] + (when (contains? cts/horizontal-constraint-types value) + (st/emit! (dwc/update-shapes [id] #(assoc % :constraints-h value))))))} + + {:name "constraintsVertical" + :get #(get-state % :constraints-v d/name) + :set (fn [self value] + (let [id (get-data self :id) + value (keyword value)] + (when (contains? cts/vertical-constraint-types value) + (st/emit! (dwc/update-shapes [id] #(assoc % :constraints-v value))))))} + + {:name "borderRadius" + :get #(get-state % :rx) + :set (fn [self value] + (let [id (get-data self :id)] + (when (us/safe-int? value) + (st/emit! (dwc/update-shapes [id] #(assoc % :rx value :ry value))))))} + + {:name "borderRadiusTopLeft" + :get #(get-state % :r1) + :set (fn [self value] + (let [id (get-data self :id)] + (when (us/safe-int? value) + (st/emit! (dwc/update-shapes [id] #(assoc % :r1 value))))))} + + {:name "borderRadiusTopRight" + :get #(get-state % :r2) + :set (fn [self value] + (let [id (get-data self :id)] + (when (us/safe-int? value) + (st/emit! (dwc/update-shapes [id] #(assoc % :r2 value))))))} + + {:name "borderRadiusBottomRight" + :get #(get-state % :r3) + :set (fn [self value] + (let [id (get-data self :id)] + (when (us/safe-int? value) + (st/emit! (dwc/update-shapes [id] #(assoc % :r3 value))))))} + + {:name "borderRadiusBottomLeft" + :get #(get-state % :r4) + :set (fn [self value] + (let [id (get-data self :id)] + (when (us/safe-int? value) + (st/emit! (dwc/update-shapes [id] #(assoc % :r4 value))))))} + + {:name "opacity" + :get #(get-state % :opacity) + :set (fn [self value] + (let [id (get-data self :id)] + (when (and (us/safe-number? value) (>= value 0) (<= value 1)) + (st/emit! (dwc/update-shapes [id] #(assoc % :opacity value))))))} + + {:name "blendMode" + :get #(get-state % :blend-mode d/name) + :set (fn [self value] + (let [id (get-data self :id) + value (keyword value)] + (when (contains? cts/blend-modes value) + (st/emit! (dwc/update-shapes [id] #(assoc % :blend-mode value))))))} + + {:name "shadows" + :get #(get-state % :shadow array-to-js) + :set (fn [self value] + (let [id (get-data self :id) + value (mapv #(utils/from-js %) value)] + (st/emit! (dwc/update-shapes [id] #(assoc % :shadows value)))))} + + {:name "blur" + :get #(get-state % :blur utils/to-js) + :set (fn [self value] + (let [id (get-data self :id) + value (utils/from-js value)] + (st/emit! (dwc/update-shapes [id] #(assoc % :blur value)))))} + + {:name "exports" + :get #(get-state % :exports array-to-js) + :set (fn [self value] + (let [id (get-data self :id) + value (mapv #(utils/from-js %) value)] + (st/emit! (dwc/update-shapes [id] #(assoc % :exports value)))))} + + ;; Geometry properties {:name "x" :get #(get-state % :x) :set @@ -183,21 +293,22 @@ {:name "height" :get #(get-state % :height)} - {:name "name" - :get #(get-state % :name) - :set (fn [self value] - (let [id (get-data self :id)] - (st/emit! (dwc/update-shapes [id] #(assoc % :name value)))))} + {:name "flipX" + :get #(get-state % :flip-x)} + {:name "flipY" + :get #(get-state % :flip-y)} + + ;; Strokes and fills {:name "fills" - :get #(get-state % :fills make-fills) + :get #(get-state % :fills array-to-js) :set (fn [self value] (let [id (get-data self :id) value (mapv #(utils/from-js %) value)] (st/emit! (dwc/update-shapes [id] #(assoc % :fills value)))))} {:name "strokes" - :get #(get-state % :strokes make-strokes) + :get #(get-state % :strokes array-to-js) :set (fn [self value] (let [id (get-data self :id) value (mapv #(utils/from-js %) value)] @@ -220,8 +331,16 @@ (fn [self] (let [layout (get-state self :layout)] (when (= :grid layout) - (grid/grid-layout-proxy data))))}) + (grid/grid-layout-proxy data))))} + + {:name "guides" + :get #(get-state % :grids array-to-js) + :set (fn [self value] + (let [id (get-data self :id) + value (mapv #(utils/from-js %) value)] + (st/emit! (dwc/update-shapes [id] #(assoc % :grids value)))))}) + ;; TODO: Flex properties #_(crc/add-properties! {:name "flex" :get @@ -235,9 +354,18 @@ (obj/unset! "addFlexLayout"))) (cond-> (cfh/text-shape? data) - (crc/add-properties! - {:name "characters" - :get #(get-state % :content txt/content->text) - :set (fn [self value] - (let [id (get-data self :id)] - (st/emit! (dwc/update-shapes [id] #(txt/change-text % value)))))})))) + (-> (crc/add-properties! + {:name "characters" + :get #(get-state % :content txt/content->text) + :set (fn [self value] + (let [id (get-data self :id)] + (st/emit! (dwc/update-shapes [id] #(txt/change-text % value)))))}) + + (crc/add-properties! + {:name "growType" + :get #(get-state % :grow-type d/name) + :set (fn [self value] + (let [id (get-data self :id) + value (keyword value)] + (when (contains? #{:auto-width :auto-height :fixed} value) + (st/emit! (dwc/update-shapes [id] #(assoc % :grow-type value))))))}))))) -- Gitee From 4c71a4367fb8df2c37b152c9e2782523ca82af3f Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 14 May 2024 12:11:13 +0200 Subject: [PATCH 0540/1266] :sparkles: Add plugins management dialog --- .../app/main/data/workspace/shortcuts.cljs | 12 +- .../app/main/ui/components/search_bar.cljs | 5 +- frontend/src/app/main/ui/workspace.cljs | 1 + .../src/app/main/ui/workspace/main_menu.cljs | 75 +++++++- .../src/app/main/ui/workspace/main_menu.scss | 10 +- .../src/app/main/ui/workspace/plugins.cljs | 180 ++++++++++++++++++ .../src/app/main/ui/workspace/plugins.scss | 167 ++++++++++++++++ frontend/src/app/plugins/api.cljs | 15 +- frontend/src/app/plugins/library.cljs | 96 ++++++++++ frontend/translations/en.po | 30 +++ frontend/translations/es.po | 31 +++ 11 files changed, 608 insertions(+), 14 deletions(-) create mode 100644 frontend/src/app/main/ui/workspace/plugins.cljs create mode 100644 frontend/src/app/main/ui/workspace/plugins.scss create mode 100644 frontend/src/app/plugins/library.cljs diff --git a/frontend/src/app/main/data/workspace/shortcuts.cljs b/frontend/src/app/main/data/workspace/shortcuts.cljs index f3d7a72d6..6ca11f33e 100644 --- a/frontend/src/app/main/data/workspace/shortcuts.cljs +++ b/frontend/src/app/main/data/workspace/shortcuts.cljs @@ -8,6 +8,7 @@ (:require [app.main.data.events :as ev] [app.main.data.exports :as de] + [app.main.data.modal :as modal] [app.main.data.preview :as dp] [app.main.data.shortcuts :as ds] [app.main.data.users :as du] @@ -23,6 +24,7 @@ [app.main.data.workspace.texts :as dwtxt] [app.main.data.workspace.transforms :as dwt] [app.main.data.workspace.undo :as dwu] + [app.main.features :as features] [app.main.refs :as refs] [app.main.store :as st] [app.main.ui.hooks.resize :as r] @@ -552,7 +554,15 @@ :command (ds/a-mod "m") :subsections [:basics] :fn #(st/emit! (with-meta (du/toggle-theme) - {::ev/origin "workspace:shortcut"}))}}) + {::ev/origin "workspace:shortcut"}))} + + + ;; PLUGINS + :plugins {:tooltip (ds/meta (ds/alt "P")) + :command (ds/c-mod "alt+p") + :subsections [:basics] + :fn #(when (features/active-feature? @st/state "plugins/runtime") + (st/emit! (modal/show :plugin-management {})))}}) (def debug-shortcuts ;; PREVIEW diff --git a/frontend/src/app/main/ui/components/search_bar.cljs b/frontend/src/app/main/ui/components/search_bar.cljs index 0fb73303c..e9c82e391 100644 --- a/frontend/src/app/main/ui/components/search_bar.cljs +++ b/frontend/src/app/main/ui/components/search_bar.cljs @@ -7,6 +7,7 @@ (ns app.main.ui.components.search-bar (:require-macros [app.main.style :as stl]) (:require + [app.common.data.macros :as dm] [app.main.ui.icons :as i] [app.util.dom :as dom] [app.util.keyboard :as kbd] @@ -23,7 +24,7 @@ icon (unchecked-get props "icon") autofocus (unchecked-get props "auto-focus") id (unchecked-get props "id") - + input-class (unchecked-get props "class") handle-change (mf/use-fn @@ -51,7 +52,7 @@ [:span {:class (stl/css-case :search-box true :has-children (some? children))} children - [:div {:class (stl/css :search-input-wrapper)} + [:div {:class (dm/str input-class " " (stl/css :search-input-wrapper))} icon [:input {:id id :on-change handle-change diff --git a/frontend/src/app/main/ui/workspace.cljs b/frontend/src/app/main/ui/workspace.cljs index 8363e438f..3f3c0f71a 100644 --- a/frontend/src/app/main/ui/workspace.cljs +++ b/frontend/src/app/main/ui/workspace.cljs @@ -26,6 +26,7 @@ [app.main.ui.workspace.libraries] [app.main.ui.workspace.nudge] [app.main.ui.workspace.palette :refer [palette]] + [app.main.ui.workspace.plugins] [app.main.ui.workspace.sidebar :refer [left-sidebar right-sidebar]] [app.main.ui.workspace.sidebar.collapsable-button :refer [collapsed-button]] [app.main.ui.workspace.sidebar.history :refer [history-toolbox]] diff --git a/frontend/src/app/main/ui/workspace/main_menu.cljs b/frontend/src/app/main/ui/workspace/main_menu.cljs index d144706c3..3f554d61e 100644 --- a/frontend/src/app/main/ui/workspace/main_menu.cljs +++ b/frontend/src/app/main/ui/workspace/main_menu.cljs @@ -7,6 +7,8 @@ (ns app.main.ui.workspace.main-menu (:require-macros [app.main.style :as stl]) (:require + [app.common.data :as d] + [app.common.data.macros :as dm] [app.common.files.helpers :as cfh] [app.common.uuid :as uuid] [app.config :as cf] @@ -20,12 +22,14 @@ [app.main.data.workspace.common :as dwc] [app.main.data.workspace.libraries :as dwl] [app.main.data.workspace.shortcuts :as sc] + [app.main.features :as features] [app.main.refs :as refs] [app.main.store :as st] [app.main.ui.components.dropdown-menu :refer [dropdown-menu dropdown-menu-item*]] [app.main.ui.context :as ctx] [app.main.ui.hooks.resize :as r] [app.main.ui.icons :as i] + [app.main.ui.workspace.plugins :as uwp] [app.util.dom :as dom] [app.util.i18n :as i18n :refer [tr]] [app.util.keyboard :as kbd] @@ -60,6 +64,9 @@ nav-to-feedback (mf/use-fn #(st/emit! (rt/nav-new-window* {:rname :settings-feedback}))) + plugins? + (features/active-feature? @st/state "plugins/runtime") + show-shortcuts (mf/use-fn (mf/deps layout) @@ -83,7 +90,8 @@ [:& dropdown-menu {:show true :on-close on-close :list-class (stl/css-case :sub-menu true - :help-info true)} + :help-info plugins? + :help-info-old (not plugins?))} [:> dropdown-menu-item* {:class (stl/css :submenu-item) :on-click nav-to-helpc-center :on-key-down (fn [event] @@ -148,7 +156,6 @@ :id "file-menu-shortcuts"} [:span {:class (stl/css :item-name)} (tr "label.shortcuts")] [:span {:class (stl/css :shortcut)} - (for [sc (scd/split-sc (sc/get-tooltip :show-shortcuts))] [:span {:class (stl/css :shortcut-key) :key sc} sc])]] @@ -596,6 +603,41 @@ [:span {:class (stl/css :item-name)} (tr "dashboard.export-frames")]])])) +(mf/defc plugins-menu + {::mf/wrap-props false + ::mf/wrap [mf/memo]} + [{:keys [open-plugins on-close]}] + (when (features/active-feature? @st/state "plugins/runtime") + (let [plugins (uwp/load-from-store)] + [:& dropdown-menu {:show true + :list-class (stl/css-case :sub-menu true :plugins true) + :on-close on-close} + [:> dropdown-menu-item* {:on-click open-plugins + :class (stl/css :submenu-item) + :on-key-down (fn [event] + (when (kbd/enter? event) + (open-plugins event))) + :data-test "open-plugins" + :id "file-menu-open-plugins"} + [:span {:class (stl/css :item-name)} + (tr "workspace.plugins.menu.plugins-manager")] + [:span {:class (stl/css :shortcut)} + (for [sc (scd/split-sc (sc/get-tooltip :plugins))] + [:span {:class (stl/css :shortcut-key) :key sc} sc])]] + + + (when (d/not-empty? plugins) + [:div {:class (stl/css :separator)}]) + + (for [[idx {:keys [name url]}] (d/enumerate plugins)] + [:> dropdown-menu-item* {:key (dm/str "plugins-menu-" idx) + :on-click #(uwp/open-plugin! url) + :class (stl/css :submenu-item) + :on-key-down (fn [event] + (when (kbd/enter? event) + #(uwp/open-plugin! url)))} + [:span {:class (stl/css :item-name)} name]])]))) + (mf/defc menu {::mf/wrap-props false} [{:keys [layout file profile]}] @@ -644,12 +686,19 @@ (reset! show-menu* false) (reset! sub-menu* nil)))) - toggle-theme (mf/use-fn (fn [event] (dom/stop-propagation event) - (st/emit! (du/toggle-theme))))] + (st/emit! (du/toggle-theme)))) + + open-plugins-manager + (mf/use-fn + (fn [event] + (dom/stop-propagation event) + (reset! show-menu* false) + (reset! sub-menu* nil) + (st/emit! (modal/show :plugin-management {}))))] [:* @@ -703,6 +752,19 @@ :id "file-menu-preferences"} [:span {:class (stl/css :item-name)} (tr "workspace.header.menu.option.preferences")] [:span {:class (stl/css :open-arrow)} i/arrow]] + + (when (features/active-feature? @st/state "plugins/runtime") + [:> dropdown-menu-item* {:class (stl/css :menu-item) + :on-click on-menu-click + :on-key-down (fn [event] + (when (kbd/enter? event) + (on-menu-click event))) + :on-pointer-enter on-menu-click + :data-test "plugins" + :id "file-menu-plugins"} + [:span {:class (stl/css :item-name)} (tr "workspace.plugins.menu.title")] + [:span {:class (stl/css :open-arrow)} i/arrow]]) + [:div {:class (stl/css :separator)}] [:> dropdown-menu-item* {:class (stl/css-case :menu-item true) :on-click on-menu-click @@ -739,6 +801,11 @@ :toggle-theme toggle-theme :on-close close-sub-menu}] + :plugins + [:& plugins-menu + {:open-plugins open-plugins-manager + :on-close close-sub-menu}] + :help-info [:& help-info-menu {:layout layout diff --git a/frontend/src/app/main/ui/workspace/main_menu.scss b/frontend/src/app/main/ui/workspace/main_menu.scss index 55732dab2..f986ced89 100644 --- a/frontend/src/app/main/ui/workspace/main_menu.scss +++ b/frontend/src/app/main/ui/workspace/main_menu.scss @@ -95,7 +95,15 @@ top: $s-148; } + &.plugins { + top: $s-180; + } + &.help-info { - top: $s-196; + top: $s-232; + } + + &.help-info-old { + top: $s-192; } } diff --git a/frontend/src/app/main/ui/workspace/plugins.cljs b/frontend/src/app/main/ui/workspace/plugins.cljs new file mode 100644 index 000000000..13a69be15 --- /dev/null +++ b/frontend/src/app/main/ui/workspace/plugins.cljs @@ -0,0 +1,180 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.main.ui.workspace.plugins + (:require-macros [app.main.style :as stl]) + (:require + [app.common.data :as d] + [app.common.data.macros :as dm] + [app.main.data.modal :as modal] + [app.main.ui.components.search-bar :refer [search-bar]] + [app.main.ui.components.title-bar :refer [title-bar]] + [app.main.ui.icons :as i] + [app.util.http :as http] + [app.util.i18n :as i18n :refer [tr]] + [app.util.object :as obj] + [beicon.v2.core :as rx] + [rumext.v2 :as mf])) + +(def ^:private close-icon + (i/icon-xref :close (stl/css :close-icon))) + + +(mf/defc plugin-entry + [{:keys [index _icon url name description on-open-plugin on-remove-plugin]}] + + (let [handle-open-click + (mf/use-callback + (mf/deps index url on-open-plugin) + (fn [] + (when on-open-plugin + (on-open-plugin index url)))) + + handle-delete-click + (mf/use-callback + (mf/deps index url on-remove-plugin) + (fn [] + (when on-remove-plugin + (on-remove-plugin index url))))] + [:div {:class (stl/css :plugins-list-element)} + [:div {:class (stl/css :plugin-icon)} ""] + [:div {:class (stl/css :plugin-description)} + [:div {:class (stl/css :plugin-title)} name] + [:div {:class (stl/css :plugin-summary)} description]] + [:button {:class (stl/css :open-button) + :on-click handle-open-click} (tr "workspace.plugins.button-open")] + [:button {:class (stl/css :trash-button) + :on-click handle-delete-click} i/delete]])) + +(defn load-from-store + [] + (let [ls (.-localStorage js/window) + plugins-val (.getItem ls "plugins")] + (when plugins-val + (let [plugins-js (.parse js/JSON plugins-val)] + (js->clj plugins-js {:keywordize-keys true}))))) + +(defn save-to-store + [plugins] + (let [ls (.-localStorage js/window) + plugins-js (clj->js plugins) + plugins-val (.stringify js/JSON plugins-js)] + (.setItem ls "plugins" plugins-val))) + +(defn open-plugin! + [url] + (.ɵloadPlugin js/window #js {:manifest url})) + +(mf/defc plugin-management-dialog + {::mf/register modal/components + ::mf/register-as :plugin-management} + [] + + (let [plugins-state* (mf/use-state []) + plugins-state @plugins-state* + + plugin-url* (mf/use-state "") + plugin-url @plugin-url* + + input-status* (mf/use-state nil) ;; :error-url :error-manifest :success + input-status @input-status* + + error? (contains? #{:error-url :error-manifest} input-status) + + handle-close-dialog + (mf/use-callback + (fn [] + (modal/hide!))) + + handle-url-input + (mf/use-callback + (fn [value] + (reset! input-status* nil) + (reset! plugin-url* value))) + + handle-install-click + (mf/use-callback + (mf/deps plugins-state plugin-url) + (fn [] + (->> (http/send! {:method :get + :uri plugin-url + :response-type :json}) + (rx/map :body) + (rx/subs! + (fn [body] + (let [name (obj/get body "name") + new-state (conj plugins-state {:name name :url plugin-url})] + (reset! input-status* :success) + (reset! plugin-url* "") + (reset! plugins-state* new-state) + (save-to-store new-state))) + (fn [_] + (reset! input-status* :error-url)))))) + + handle-open-plugin + (mf/use-callback + (fn [_ url] + (open-plugin! url) + (modal/hide!))) + + handle-remove-plugin + (mf/use-callback + (mf/deps plugins-state) + (fn [rm-idx _] + (let [new-state + (into [] + (keep-indexed (fn [idx item] + (when (not= idx rm-idx) item))) + plugins-state)] + + (reset! plugins-state* new-state) + (save-to-store new-state))))] + + (mf/use-effect + (fn [] + (reset! plugins-state* (d/nilv (load-from-store) [])))) + + [:div {:class (stl/css :modal-overlay)} + [:div {:class (stl/css :modal-dialog)} + [:button {:class (stl/css :close-btn) :on-click handle-close-dialog} close-icon] + [:div {:class (stl/css :modal-title)} (tr "workspace.plugins.title")] + + [:div {:class (stl/css :modal-content)} + [:div {:class (stl/css :top-bar)} + [:& search-bar {:on-change handle-url-input + :value plugin-url + :placeholder (tr "workspace.plugins.search-placeholder") + :class (stl/css-case :input-error error?)}] + + [:button {:class (stl/css :primary-button) + :disabled (empty? plugin-url) + :on-click handle-install-click} (tr "workspace.plugins.install")]] + + (when error? + [:div {:class (stl/css-case :info true :error error?)} + (tr "workspace.plugins.error.url")]) + + [:hr] + + [:& title-bar {:collapsable false + :title (tr "workspace.plugins.installed-plugins")}] + + (if (empty? plugins-state) + [:div {:class (stl/css :plugins-empty)} + [:div {:class (stl/css :plugins-empty-logo)} i/logo-icon] + [:div {:class (stl/css :plugins-empty-text)} (tr "workspace.plugins.empty-plugins")]] + + [:div {:class (stl/css :plugins-list)} + + (for [[idx {:keys [name url]}] (d/enumerate plugins-state)] + [:& plugin-entry {:key (dm/str "plugin-" idx) + :name name + :url url + :index idx + :icon nil + :description "Nullam ullamcorper ligula ac felis commodo pulvinar." + :on-open-plugin handle-open-plugin + :on-remove-plugin handle-remove-plugin}])])]]])) diff --git a/frontend/src/app/main/ui/workspace/plugins.scss b/frontend/src/app/main/ui/workspace/plugins.scss new file mode 100644 index 000000000..583c2d8fc --- /dev/null +++ b/frontend/src/app/main/ui/workspace/plugins.scss @@ -0,0 +1,167 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. +// +// Copyright (c) KALEIDOS INC + +@import "refactor/common-refactor.scss"; + +.modal-overlay { + @extend .modal-overlay-base; +} + +.modal-dialog { + @extend .modal-container-base; + display: grid; + grid-template-rows: auto 1fr; + height: $s-472; + max-height: $s-472; + width: $s-472; + max-width: $s-472; +} + +.close-btn { + @extend .modal-close-btn-base; +} + +.close-icon { + @extend .button-icon; + stroke: var(--icon-foreground); +} + +.modal-title { + @include headlineMediumTypography; + margin-block-end: $s-16; + color: var(--modal-title-foreground-color); +} + +.modal-content { + display: flex; + flex-direction: column; + height: $s-380; +} + +.primary-button { + @extend .button-primary; + @include headlineSmallTypography; + padding: $s-0 $s-16; +} + +.search-icon { + @include flexCenter; + width: $s-20; + padding: 0 0 0 $s-8; + svg { + @extend .button-icon-small; + stroke: var(--icon-foreground); + } +} + +.top-bar { + display: flex; + gap: $s-8; +} + +.open-button { + @extend .button-secondary; + width: $s-68; + min-width: $s-68; + height: $s-32; + text-transform: uppercase; +} + +.trash-button { + @extend .button-tertiary; + width: $s-32; + height: $s-32; + + svg { + @extend .button-icon; + stroke: var(--icon-foreground); + } +} + +.plugins-list { + padding-top: $s-20; + overflow-x: hidden; + overflow-y: scroll; + flex: 1; + display: flex; + flex-direction: column; + gap: 12px; +} + +.plugins-list-element { + display: flex; + gap: $s-12; +} + +.plugin-icon { + min-width: $s-32; + min-height: $s-32; + width: $s-32; + height: $s-32; + background: #b1b2b5; +} + +.plugin-description { + display: flex; + flex-direction: column; + gap: $s-8; +} + +.plugin-title { + @include bodyMediumTypography; + color: #ffffff; +} + +.plugin-summary { + @include bodySmallTypography; + color: #8f9da3; +} + +.plugins-empty { + display: flex; + flex-direction: column; + align-items: center; + gap: 20px; + margin-top: 3rem; +} + +.plugins-empty-logo { + width: 44px; + height: 44px; + border-radius: 50%; + display: flex; + justify-content: center; + align-items: center; + background: #212426; + + svg { + width: 16px; + height: 16px; + fill: #8f9da3; + } +} + +.plugins-empty-text { + @include bodySmallTypography; + color: white; +} + +div.input-error { + border: 1px solid var(--input-border-color-error); +} + +.info { + @include bodySmallTypography; + margin-top: $s-4; + + &.error { + color: var(--input-border-color-error); + } + + &.success { + color: var(--input-border-color-success); + } +} diff --git a/frontend/src/app/plugins/api.cljs b/frontend/src/app/plugins/api.cljs index 38bda54f0..2476f3ca3 100644 --- a/frontend/src/app/plugins/api.cljs +++ b/frontend/src/app/plugins/api.cljs @@ -20,6 +20,7 @@ [app.main.store :as st] [app.plugins.events :as events] [app.plugins.file :as file] + [app.plugins.library :as library] [app.plugins.page :as page] [app.plugins.shape :as shape] [app.plugins.utils :as utils] @@ -147,11 +148,12 @@ (createShapeFromSvg [_ svg-string] - (let [id (uuid/next) - page-id (:current-page-id @st/state)] - (st/emit! (dwm/create-svg-shape id "svg" svg-string (gpt/point 0 0))) - (shape/data->shape-proxy - (dm/get-in @st/state [:workspace-data :pages-index page-id :objects id]))))) + (when (some? svg-string) + (let [id (uuid/next) + page-id (:current-page-id @st/state)] + (st/emit! (dwm/create-svg-shape id "svg" svg-string (gpt/point 0 0))) + (shape/data->shape-proxy + (dm/get-in @st/state [:workspace-data :pages-index page-id :objects id])))))) (defn create-context [] @@ -160,4 +162,5 @@ {:name "root" :get #(.getRoot ^js %)} {:name "currentPage" :get #(.getPage ^js %)} {:name "selection" :get #(.getSelectedShapes ^js %)} - {:name "viewport" :get #(.getViewport ^js %)})) + {:name "viewport" :get #(.getViewport ^js %)} + {:name "library" :get (fn [_] (library/create-library-subcontext))})) diff --git a/frontend/src/app/plugins/library.cljs b/frontend/src/app/plugins/library.cljs new file mode 100644 index 000000000..cefed442c --- /dev/null +++ b/frontend/src/app/plugins/library.cljs @@ -0,0 +1,96 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.plugins.library + "RPC for plugins runtime." + (:require + [app.common.data.macros :as dm] + [app.common.record :as cr] + [app.main.store :as st] + [app.plugins.utils :as utils :refer [get-data]] + [app.util.object :as obj])) + +(defn get-library-info + ([self attr] + (let [lib-id (get-data self :id) + current-file-id (:current-file-id @st/state)] + (if (= lib-id current-file-id) + (dm/get-in @st/state [:workspace-file attr]) + (dm/get-in @st/state [:workspace-libraries lib-id attr])))) + + ([self attr mapfn] + (-> (get-library-info self attr) + (mapfn)))) + +(defn get-library-data + ([self attr] + (let [lib-id (get-data self :id) + current-file-id (:current-file-id @st/state)] + (if (= lib-id current-file-id) + (dm/get-in @st/state [:workspace-data attr]) + (dm/get-in @st/state [:workspace-libraries lib-id :data attr])))) + + ([self attr mapfn] + (-> (get-library-data self attr) + (mapfn)))) + +(defn- array-to-js + [value] + (.freeze + js/Object + (apply array (->> value (map utils/to-js))))) + +(deftype Library [_data] + Object) + +(defn create-library + [data] + (cr/add-properties! + (Library. data) + {:name "_data" + :enumerable false} + + {:name "id" + :get (fn [self] + (str (:id (obj/get self "_data"))))} + + {:name "name" + :get (fn [self] + (get-library-info self :name))} + + {:name "colors" + :get (fn [self] + (array-to-js (get-library-data self :colors vals)))} + + {:name "typographies" + :get (fn [self] + (array-to-js (get-library-data self :typographies vals)))} + + {:name "components" + :get (fn [self] + (array-to-js (get-library-data self :components vals)))})) + +(deftype PenpotLibrarySubcontext [] + Object + (find + [_ _name]) + + (find [_])) + +(defn create-library-subcontext + [] + (cr/add-properties! + (PenpotLibrarySubcontext.) + {:name "local" :get + (fn [_] + (let [file (get @st/state :workspace-file) + data (get @st/state :workspace-data)] + (create-library (assoc file :data data))))} + + {:name "connected" :get + (fn [_] + (let [libraries (get @st/state :workspace-libraries)] + (apply array (->> libraries vals (map create-library)))))})) diff --git a/frontend/translations/en.po b/frontend/translations/en.po index 1dffa2c85..f83ab5880 100644 --- a/frontend/translations/en.po +++ b/frontend/translations/en.po @@ -5175,3 +5175,33 @@ msgstr "Update" msgid "workspace.viewport.click-to-close-path" msgstr "Click to close the path" + +msgid "workspace.plugins.title" +msgstr "Plugins" + +msgid "workspace.plugins.search-placeholder" +msgstr "Write a plugin URL" + +msgid "workspace.plugins.install" +msgstr "Install" + +msgid "workspace.plugins.installed-plugins" +msgstr "Installed plugins" + +msgid "workspace.plugins.empty-plugins" +msgstr "No plugins installed yet" + +msgid "workspace.plugins.button-open" +msgstr "Open" + +msgid "workspace.plugins.error.url" +msgstr "The plugin doesn't exist or the URL is not correct." + +msgid "workspace.plugins.success" +msgstr "Plugin correctly loaded." + +msgid "workspace.plugins.menu.title" +msgstr "Plugins" + +msgid "workspace.plugins.menu.plugins-manager" +msgstr "Plugins manager" diff --git a/frontend/translations/es.po b/frontend/translations/es.po index 46b7dd8fc..d0ad70298 100644 --- a/frontend/translations/es.po +++ b/frontend/translations/es.po @@ -5301,3 +5301,34 @@ msgstr "Actualizar" msgid "workspace.viewport.click-to-close-path" msgstr "Pulsar para cerrar la ruta" + +msgid "workspace.plugins.title" +msgstr "Extensiones" + +msgid "workspace.plugins.search-placeholder" +msgstr "Intruduzca URL de la extensión" + +msgid "workspace.plugins.install" +msgstr "Instalar" + +msgid "workspace.plugins.installed-plugins" +msgstr "Extensiones instaladas" + +msgid "workspace.plugins.empty-plugins" +msgstr "No se encuentran extensiones" + +msgid "workspace.plugins.button-open" +msgstr "Abrir" + +msgid "workspace.plugins.error.url" +msgstr "La extensión no existe o la url no es correcta." + +msgid "workspace.plugins.success" +msgstr "Extensión cargada correctamente." + +msgid "workspace.plugins.menu.title" +msgstr "Extensiones" + +msgid "workspace.plugins.menu.plugins-manager" +msgstr "Gestor de extensiones" + -- Gitee From 0ddcfa05cf4d8fe870f5f623b62b366117481a8c Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 14 May 2024 15:30:53 +0200 Subject: [PATCH 0541/1266] :sparkles: Update plugins runtime --- .../plugins-runtime/{index.mjs => index.js} | 4163 +++++++++-------- frontend/resources/templates/index.mustache | 2 +- 2 files changed, 2129 insertions(+), 2036 deletions(-) rename frontend/resources/plugins-runtime/{index.mjs => index.js} (70%) diff --git a/frontend/resources/plugins-runtime/index.mjs b/frontend/resources/plugins-runtime/index.js similarity index 70% rename from frontend/resources/plugins-runtime/index.mjs rename to frontend/resources/plugins-runtime/index.js index 59c2daa7c..6be676b2b 100644 --- a/frontend/resources/plugins-runtime/index.mjs +++ b/frontend/resources/plugins-runtime/index.js @@ -1,165 +1,174 @@ +var An = (t, e, r) => { + if (!e.has(t)) + throw TypeError("Cannot " + r); +}; +var Re = (t, e, r) => (An(t, e, "read from private field"), r ? r.call(t) : e.get(t)), Mr = (t, e, r) => { + if (e.has(t)) + throw TypeError("Cannot add the same private member more than once"); + e instanceof WeakSet ? e.add(t) : e.set(t, r); +}, Fr = (t, e, r, n) => (An(t, e, "write to private field"), n ? n.call(t, r) : e.set(t, r), r); const E = globalThis, { - Array: bs, - Date: ws, - FinalizationRegistry: gt, - Float32Array: xs, - JSON: Ss, - Map: Ie, - Math: Es, - Number: ro, - Object: nn, - Promise: Ps, - Proxy: br, - Reflect: ks, - RegExp: ze, - Set: wt, + Array: Ps, + Date: ks, + FinalizationRegistry: vt, + Float32Array: Ts, + JSON: Is, + Map: Ae, + Math: As, + Number: io, + Object: ln, + Promise: Cs, + Proxy: Sr, + Reflect: Ns, + RegExp: Be, + Set: St, String: ie, - Symbol: At, - WeakMap: Pe, - WeakSet: xt + Symbol: Nt, + WeakMap: ke, + WeakSet: Et } = globalThis, { // The feral Error constructor is safe for internal use, but must not be // revealed to post-lockdown code in any compartment including the start // compartment since in V8 at least it bears stack inspection capabilities. Error: le, - RangeError: Ts, - ReferenceError: et, - SyntaxError: Gt, + RangeError: $s, + ReferenceError: rt, + SyntaxError: Wt, TypeError: v } = globalThis, { - assign: wr, + assign: Er, create: H, defineProperties: F, entries: te, freeze: y, getOwnPropertyDescriptor: ue, - getOwnPropertyDescriptors: Ke, - getOwnPropertyNames: Nt, - getPrototypeOf: G, - is: xr, - isFrozen: Xc, - isSealed: Qc, - isExtensible: el, - keys: no, - prototype: oo, - seal: tl, - preventExtensions: Is, - setPrototypeOf: so, - values: ao, - fromEntries: St -} = nn, { - species: Pn, - toStringTag: Be, - iterator: Ht, - matchAll: io, - unscopables: As, - keyFor: Cs, - for: rl -} = At, { isInteger: Ns } = ro, { stringify: co } = Ss, { defineProperty: $s } = nn, L = (t, e, r) => { - const n = $s(t, e, r); + getOwnPropertyDescriptors: Je, + getOwnPropertyNames: Ot, + getPrototypeOf: B, + is: Pr, + isFrozen: sl, + isSealed: al, + isExtensible: il, + keys: co, + prototype: lo, + seal: cl, + preventExtensions: Os, + setPrototypeOf: uo, + values: fo, + fromEntries: Pt +} = ln, { + species: Cn, + toStringTag: He, + iterator: qt, + matchAll: po, + unscopables: Rs, + keyFor: Ls, + for: ll +} = Nt, { isInteger: Ms } = io, { stringify: mo } = Is, { defineProperty: Fs } = ln, M = (t, e, r) => { + const n = Fs(t, e, r); if (n !== t) throw v( - `Please report that the original defineProperty silently failed to set ${co( + `Please report that the original defineProperty silently failed to set ${mo( ie(e) )}. (SES_DEFINE_PROPERTY_FAILED_SILENTLY)` ); return n; }, { apply: oe, - construct: sr, - get: Os, - getOwnPropertyDescriptor: Rs, - has: lo, - isExtensible: Ms, - ownKeys: nt, - preventExtensions: Ls, - set: uo -} = ks, { isArray: mt, prototype: ke } = bs, { prototype: Et } = Ie, { prototype: Sr } = RegExp, { prototype: Vt } = wt, { prototype: $e } = ie, { prototype: Er } = Pe, { prototype: fo } = xt, { prototype: on } = Function, { prototype: po } = Ps, Fs = G(Uint8Array.prototype), { bind: kn } = on, k = kn.bind(kn.call), se = k(oo.hasOwnProperty), Ge = k(ke.filter), tt = k(ke.forEach), Pr = k(ke.includes), Pt = k(ke.join), de = ( + construct: cr, + get: Ds, + getOwnPropertyDescriptor: Us, + has: ho, + isExtensible: js, + ownKeys: st, + preventExtensions: Zs, + set: go +} = Ns, { isArray: gt, prototype: Te } = Ps, { prototype: kt } = Ae, { prototype: kr } = RegExp, { prototype: Kt } = St, { prototype: Oe } = ie, { prototype: Tr } = ke, { prototype: yo } = Et, { prototype: un } = Function, { prototype: vo } = Cs, zs = B(Uint8Array.prototype), { bind: Nn } = un, k = Nn.bind(Nn.call), se = k(lo.hasOwnProperty), Ve = k(Te.filter), nt = k(Te.forEach), Ir = k(Te.includes), Tt = k(Te.join), de = ( /** @type {any} */ - k(ke.map) -), jr = k(ke.pop), ae = k(ke.push), Ds = k(ke.slice), js = k(ke.some), mo = k(ke.sort), Us = k(ke[Ht]), Ae = k(Et.set), Le = k(Et.get), kr = k(Et.has), Zs = k(Et.delete), zs = k(Et.entries), Bs = k(Et[Ht]), Tr = k(Vt.add); -k(Vt.delete); -const Tn = k(Vt.forEach), sn = k(Vt.has), Gs = k(Vt[Ht]), an = k(Sr.test), cn = k(Sr.exec), Hs = k(Sr[io]), ho = k($e.endsWith), Vs = k($e.includes), Ws = k($e.indexOf); -k($e.match); -const ar = ( + k(Te.map) +), Br = k(Te.pop), ae = k(Te.push), Gs = k(Te.slice), Bs = k(Te.some), _o = k(Te.sort), Hs = k(Te[qt]), Ce = k(kt.set), De = k(kt.get), Ar = k(kt.has), Vs = k(kt.delete), Ws = k(kt.entries), qs = k(kt[qt]), Cr = k(Kt.add); +k(Kt.delete); +const $n = k(Kt.forEach), dn = k(Kt.has), Ks = k(Kt[qt]), fn = k(kr.test), pn = k(kr.exec), Ys = k(kr[po]), bo = k(Oe.endsWith), Js = k(Oe.includes), Xs = k(Oe.indexOf); +k(Oe.match); +const lr = ( /** @type {any} */ - k($e.replace) -), qs = k($e.search), ln = k($e.slice), go = k($e.split), yo = k($e.startsWith), Ks = k($e[Ht]), Js = k(Er.delete), M = k(Er.get), un = k(Er.has), ee = k(Er.set), Ir = k(fo.add), Wt = k(fo.has), Ys = k(on.toString), Xs = k(po.catch), dn = ( + k(Oe.replace) +), Qs = k(Oe.search), mn = k(Oe.slice), wo = k(Oe.split), xo = k(Oe.startsWith), ea = k(Oe[qt]), ta = k(Tr.delete), L = k(Tr.get), hn = k(Tr.has), ee = k(Tr.set), Nr = k(yo.add), Yt = k(yo.has), ra = k(un.toString), na = k(vo.catch), gn = ( /** @type {any} */ - k(po.then) -), Qs = gt && k(gt.prototype.register); -gt && k(gt.prototype.unregister); -const fn = y(H(null)), He = (t) => nn(t) === t, pn = (t) => t instanceof le, vo = eval, ye = Function, ea = () => { + k(vo.then) +), oa = vt && k(vt.prototype.register); +vt && k(vt.prototype.unregister); +const yn = y(H(null)), We = (t) => ln(t) === t, vn = (t) => t instanceof le, So = eval, ye = Function, sa = () => { throw v('Cannot eval with evalTaming set to "noEval" (SES_NO_EVAL)'); }; -function ta() { +function aa() { return this; } -if (ta()) +if (aa()) throw v("SES failed to initialize, sloppy mode (SES_NO_SLOPPY)"); -const { freeze: Xe } = Object, { apply: ra } = Reflect, mn = (t) => (e, ...r) => ra(t, e, r), na = mn(Array.prototype.push), In = mn(Array.prototype.includes), oa = mn(String.prototype.split), Ye = JSON.stringify, Jt = (t, ...e) => { +const { freeze: et } = Object, { apply: ia } = Reflect, _n = (t) => (e, ...r) => ia(t, e, r), ca = _n(Array.prototype.push), On = _n(Array.prototype.includes), la = _n(String.prototype.split), Qe = JSON.stringify, Qt = (t, ...e) => { let r = t[0]; for (let n = 0; n < e.length; n += 1) r = `${r}${e[n]}${t[n + 1]}`; throw Error(r); -}, _o = (t, e = !1) => { +}, Eo = (t, e = !1) => { const r = [], n = (c, u, l = void 0) => { - typeof c == "string" || Jt`Environment option name ${Ye(c)} must be a string.`, typeof u == "string" || Jt`Environment option default setting ${Ye( + typeof c == "string" || Qt`Environment option name ${Qe(c)} must be a string.`, typeof u == "string" || Qt`Environment option default setting ${Qe( u )} must be a string.`; let d = u; const f = t.process || void 0, m = typeof f == "object" && f.env || void 0; if (typeof m == "object" && c in m) { - e || na(r, c); + e || ca(r, c); const p = m[c]; - typeof p == "string" || Jt`Environment option named ${Ye( + typeof p == "string" || Qt`Environment option named ${Qe( c - )}, if present, must have a corresponding string value, got ${Ye( + )}, if present, must have a corresponding string value, got ${Qe( p )}`, d = p; } - return l === void 0 || d === u || In(l, d) || Jt`Unrecognized ${Ye(c)} value ${Ye( + return l === void 0 || d === u || On(l, d) || Qt`Unrecognized ${Qe(c)} value ${Qe( d - )}. Expected one of ${Ye([u, ...l])}`, d; + )}. Expected one of ${Qe([u, ...l])}`, d; }; - Xe(n); + et(n); const a = (c) => { const u = n(c, ""); - return Xe(u === "" ? [] : oa(u, ",")); + return et(u === "" ? [] : la(u, ",")); }; - Xe(a); - const s = (c, u) => In(a(c), u), i = () => Xe([...r]); - return Xe(i), Xe({ + et(a); + const o = (c, u) => On(a(c), u), i = () => et([...r]); + return et(i), et({ getEnvironmentOption: n, getEnvironmentOptionsList: a, - environmentOptionsListHas: s, + environmentOptionsListHas: o, getCapturedEnvironmentOptionNames: i }); }; -Xe(_o); +et(Eo); const { getEnvironmentOption: me, - getEnvironmentOptionsList: nl, - environmentOptionsListHas: ol -} = _o(globalThis, !0), ir = (t) => (t = `${t}`, t.length >= 1 && Vs("aeiouAEIOU", t[0]) ? `an ${t}` : `a ${t}`); -y(ir); -const bo = (t, e = void 0) => { - const r = new wt(), n = (a, s) => { - switch (typeof s) { + getEnvironmentOptionsList: ul, + environmentOptionsListHas: dl +} = Eo(globalThis, !0), ur = (t) => (t = `${t}`, t.length >= 1 && Js("aeiouAEIOU", t[0]) ? `an ${t}` : `a ${t}`); +y(ur); +const Po = (t, e = void 0) => { + const r = new St(), n = (a, o) => { + switch (typeof o) { case "object": { - if (s === null) + if (o === null) return null; - if (sn(r, s)) + if (dn(r, o)) return "[Seen]"; - if (Tr(r, s), pn(s)) - return `[${s.name}: ${s.message}]`; - if (Be in s) - return `[${s[Be]}]`; - if (mt(s)) - return s; - const i = no(s); + if (Cr(r, o), vn(o)) + return `[${o.name}: ${o.message}]`; + if (He in o) + return `[${o[He]}]`; + if (gt(o)) + return o; + const i = co(o); if (i.length < 2) - return s; + return o; let c = !0; for (let l = 1; l < i.length; l += 1) if (i[l - 1] >= i[l]) { @@ -167,334 +176,334 @@ const bo = (t, e = void 0) => { break; } if (c) - return s; - mo(i); - const u = de(i, (l) => [l, s[l]]); - return St(u); + return o; + _o(i); + const u = de(i, (l) => [l, o[l]]); + return Pt(u); } case "function": - return `[Function ${s.name || ""}]`; + return `[Function ${o.name || ""}]`; case "string": - return yo(s, "[") ? `[${s}]` : s; + return xo(o, "[") ? `[${o}]` : o; case "undefined": case "symbol": - return `[${ie(s)}]`; + return `[${ie(o)}]`; case "bigint": - return `[${s}n]`; + return `[${o}n]`; case "number": - return xr(s, NaN) ? "[NaN]" : s === 1 / 0 ? "[Infinity]" : s === -1 / 0 ? "[-Infinity]" : s; + return Pr(o, NaN) ? "[NaN]" : o === 1 / 0 ? "[Infinity]" : o === -1 / 0 ? "[-Infinity]" : o; default: - return s; + return o; } }; try { - return co(t, n, e); + return mo(t, n, e); } catch { return "[Something that failed to stringify]"; } }; -y(bo); -const { isSafeInteger: sa } = Number, { freeze: ft } = Object, { toStringTag: aa } = Symbol, An = (t) => { +y(Po); +const { isSafeInteger: ua } = Number, { freeze: mt } = Object, { toStringTag: da } = Symbol, Rn = (t) => { const r = { next: void 0, prev: void 0, data: t }; return r.next = r, r.prev = r, r; -}, Cn = (t, e) => { +}, Ln = (t, e) => { if (t === e) throw TypeError("Cannot splice a cell into itself"); if (e.next !== e || e.prev !== e) throw TypeError("Expected self-linked cell"); const r = e, n = t.next; return r.prev = t, r.next = n, t.next = r, n.prev = r, r; -}, Or = (t) => { +}, Dr = (t) => { const { prev: e, next: r } = t; e.next = r, r.prev = e, t.prev = t, t.next = t; -}, wo = (t) => { - if (!sa(t) || t < 0) +}, ko = (t) => { + if (!ua(t) || t < 0) throw TypeError("keysBudget must be a safe non-negative integer number"); const e = /* @__PURE__ */ new WeakMap(); let r = 0; - const n = An(void 0), a = (d) => { + const n = Rn(void 0), a = (d) => { const f = e.get(d); if (!(f === void 0 || f.data === void 0)) - return Or(f), Cn(n, f), f; - }, s = (d) => a(d) !== void 0; - ft(s); + return Dr(f), Ln(n, f), f; + }, o = (d) => a(d) !== void 0; + mt(o); const i = (d) => { const f = a(d); return f && f.data && f.data.get(d); }; - ft(i); + mt(i); const c = (d, f) => { if (t < 1) return l; let m = a(d); - if (m === void 0 && (m = An(void 0), Cn(n, m)), !m.data) + if (m === void 0 && (m = Rn(void 0), Ln(n, m)), !m.data) for (r += 1, m.data = /* @__PURE__ */ new WeakMap(), e.set(d, m); r > t; ) { const p = n.prev; - Or(p), p.data = void 0, r -= 1; + Dr(p), p.data = void 0, r -= 1; } return m.data.set(d, f), l; }; - ft(c); + mt(c); const u = (d) => { const f = e.get(d); - return f === void 0 || (Or(f), e.delete(d), f.data === void 0) ? !1 : (f.data = void 0, r -= 1, !0); + return f === void 0 || (Dr(f), e.delete(d), f.data === void 0) ? !1 : (f.data = void 0, r -= 1, !0); }; - ft(u); - const l = ft({ - has: s, + mt(u); + const l = mt({ + has: o, get: i, set: c, delete: u, // eslint-disable-next-line jsdoc/check-types [ /** @type {typeof Symbol.toStringTag} */ - aa + da ]: "LRUCacheMap" }); return l; }; -ft(wo); -const { freeze: rr } = Object, { isSafeInteger: ia } = Number, ca = 1e3, la = 100, xo = (t = ca, e = la) => { - if (!ia(e) || e < 1) +mt(ko); +const { freeze: sr } = Object, { isSafeInteger: fa } = Number, pa = 1e3, ma = 100, To = (t = pa, e = ma) => { + if (!fa(e) || e < 1) throw TypeError( "argsPerErrorBudget must be a safe positive integer number" ); - const r = wo(t), n = (s, i) => { - const c = r.get(s); - c !== void 0 ? (c.length >= e && c.shift(), c.push(i)) : r.set(s, [i]); + const r = ko(t), n = (o, i) => { + const c = r.get(o); + c !== void 0 ? (c.length >= e && c.shift(), c.push(i)) : r.set(o, [i]); }; - rr(n); - const a = (s) => { - const i = r.get(s); - return r.delete(s), i; + sr(n); + const a = (o) => { + const i = r.get(o); + return r.delete(o), i; }; - return rr(a), rr({ + return sr(a), sr({ addLogArgs: n, takeLogArgsArray: a }); }; -rr(xo); -const yt = new Pe(), ot = (t, e = void 0) => { +sr(To); +const _t = new ke(), at = (t, e = void 0) => { const r = y({ - toString: y(() => bo(t, e)) + toString: y(() => Po(t, e)) }); - return ee(yt, r, t), r; + return ee(_t, r, t), r; }; -y(ot); -const ua = y(/^[\w:-]( ?[\w:-])*$/), Ur = (t, e = void 0) => { - if (typeof t != "string" || !an(ua, t)) - return ot(t, e); +y(at); +const ha = y(/^[\w:-]( ?[\w:-])*$/), Hr = (t, e = void 0) => { + if (typeof t != "string" || !fn(ha, t)) + return at(t, e); const r = y({ toString: y(() => t) }); - return ee(yt, r, t), r; + return ee(_t, r, t), r; }; -y(Ur); -const Ar = new Pe(), So = ({ template: t, args: e }) => { +y(Hr); +const $r = new ke(), Io = ({ template: t, args: e }) => { const r = [t[0]]; for (let n = 0; n < e.length; n += 1) { const a = e[n]; - let s; - un(yt, a) ? s = `${a}` : pn(a) ? s = `(${ir(a.name)})` : s = `(${ir(typeof a)})`, ae(r, s, t[n + 1]); + let o; + hn(_t, a) ? o = `${a}` : vn(a) ? o = `(${ur(a.name)})` : o = `(${ur(typeof a)})`, ae(r, o, t[n + 1]); } - return Pt(r, ""); -}, Eo = y({ + return Tt(r, ""); +}, Ao = y({ toString() { - const t = M(Ar, this); - return t === void 0 ? "[Not a DetailsToken]" : So(t); + const t = L($r, this); + return t === void 0 ? "[Not a DetailsToken]" : Io(t); } }); -y(Eo.toString); -const vt = (t, ...e) => { - const r = y({ __proto__: Eo }); - return ee(Ar, r, { template: t, args: e }), r; +y(Ao.toString); +const bt = (t, ...e) => { + const r = y({ __proto__: Ao }); + return ee($r, r, { template: t, args: e }), r; }; -y(vt); -const Po = (t, ...e) => (e = de( +y(bt); +const Co = (t, ...e) => (e = de( e, - (r) => un(yt, r) ? r : ot(r) -), vt(t, ...e)); -y(Po); -const ko = ({ template: t, args: e }) => { + (r) => hn(_t, r) ? r : at(r) +), bt(t, ...e)); +y(Co); +const No = ({ template: t, args: e }) => { const r = [t[0]]; for (let n = 0; n < e.length; n += 1) { let a = e[n]; - un(yt, a) && (a = M(yt, a)); - const s = ar(jr(r) || "", / $/, ""); - s !== "" && ae(r, s); - const i = ar(t[n + 1], /^ /, ""); + hn(_t, a) && (a = L(_t, a)); + const o = lr(Br(r) || "", / $/, ""); + o !== "" && ae(r, o); + const i = lr(t[n + 1], /^ /, ""); ae(r, a, i); } - return r[r.length - 1] === "" && jr(r), r; -}, nr = new Pe(); -let Zr = 0; -const Nn = new Pe(), To = (t, e = t.name) => { - let r = M(Nn, t); - return r !== void 0 || (Zr += 1, r = `${e}#${Zr}`, ee(Nn, t, r)), r; -}, zr = (t = vt`Assert failed`, e = E.Error, { errorName: r = void 0 } = {}) => { - typeof t == "string" && (t = vt([t])); - const n = M(Ar, t); + return r[r.length - 1] === "" && Br(r), r; +}, ar = new ke(); +let Vr = 0; +const Mn = new ke(), $o = (t, e = t.name) => { + let r = L(Mn, t); + return r !== void 0 || (Vr += 1, r = `${e}#${Vr}`, ee(Mn, t, r)), r; +}, Wr = (t = bt`Assert failed`, e = E.Error, { errorName: r = void 0 } = {}) => { + typeof t == "string" && (t = bt([t])); + const n = L($r, t); if (n === void 0) - throw v(`unrecognized details ${ot(t)}`); - const a = So(n), s = new e(a); - return ee(nr, s, ko(n)), r !== void 0 && To(s, r), s; + throw v(`unrecognized details ${at(t)}`); + const a = Io(n), o = new e(a); + return ee(ar, o, No(n)), r !== void 0 && $o(o, r), o; }; -y(zr); -const { addLogArgs: da, takeLogArgsArray: fa } = xo(), Br = new Pe(), Io = (t, e) => { - typeof e == "string" && (e = vt([e])); - const r = M(Ar, e); +y(Wr); +const { addLogArgs: ga, takeLogArgsArray: ya } = To(), qr = new ke(), Oo = (t, e) => { + typeof e == "string" && (e = bt([e])); + const r = L($r, e); if (r === void 0) - throw v(`unrecognized details ${ot(e)}`); - const n = ko(r), a = M(Br, t); + throw v(`unrecognized details ${at(e)}`); + const n = No(r), a = L(qr, t); if (a !== void 0) - for (const s of a) - s(t, n); + for (const o of a) + o(t, n); else - da(t, n); + ga(t, n); }; -y(Io); -const pa = (t) => { +y(Oo); +const va = (t) => { if (!("stack" in t)) return ""; - const e = `${t.stack}`, r = Ws(e, ` + const e = `${t.stack}`, r = Xs(e, ` `); - return yo(e, " ") || r === -1 ? e : ln(e, r + 1); -}, Gr = { - getStackString: E.getStackString || pa, - tagError: (t) => To(t), + return xo(e, " ") || r === -1 ? e : mn(e, r + 1); +}, Kr = { + getStackString: E.getStackString || va, + tagError: (t) => $o(t), resetErrorTagNum: () => { - Zr = 0; + Vr = 0; }, - getMessageLogArgs: (t) => M(nr, t), + getMessageLogArgs: (t) => L(ar, t), takeMessageLogArgs: (t) => { - const e = M(nr, t); - return Js(nr, t), e; + const e = L(ar, t); + return ta(ar, t), e; }, takeNoteLogArgsArray: (t, e) => { - const r = fa(t); + const r = ya(t); if (e !== void 0) { - const n = M(Br, t); - n ? ae(n, e) : ee(Br, t, [e]); + const n = L(qr, t); + n ? ae(n, e) : ee(qr, t, [e]); } return r || []; } }; -y(Gr); -const Cr = (t = void 0, e = !1) => { - const r = e ? Po : vt, n = r`Check failed`, a = (f = n, m = E.Error) => { - const p = zr(f, m); +y(Kr); +const Or = (t = void 0, e = !1) => { + const r = e ? Co : bt, n = r`Check failed`, a = (f = n, m = E.Error) => { + const p = Wr(f, m); throw t !== void 0 && t(p), p; }; y(a); - const s = (f, ...m) => a(r(f, ...m)); + const o = (f, ...m) => a(r(f, ...m)); function i(f, m = void 0, p = void 0) { f || a(m, p); } const c = (f, m, p = void 0, h = void 0) => { - xr(f, m) || a( + Pr(f, m) || a( p || r`Expected ${f} is same as ${m}`, - h || Ts + h || $s ); }; y(c); const u = (f, m, p) => { if (typeof f !== m) { - if (typeof m == "string" || s`${ot(m)} must be a string`, p === void 0) { - const h = ir(m); - p = r`${f} must be ${Ur(h)}`; + if (typeof m == "string" || o`${at(m)} must be a string`, p === void 0) { + const h = ur(m); + p = r`${f} must be ${Hr(h)}`; } a(p, v); } }; y(u); - const d = wr(i, { - error: zr, + const d = Er(i, { + error: Wr, fail: a, equal: c, typeof: u, string: (f, m = void 0) => u(f, "string", m), - note: Io, + note: Oo, details: r, - Fail: s, - quote: ot, - bare: Ur, - makeAssert: Cr + Fail: o, + quote: at, + bare: Hr, + makeAssert: Or }); return y(d); }; -y(Cr); -const Z = Cr(), Ao = ue( - Fs, - Be +y(Or); +const Z = Or(), Ro = ue( + zs, + He ); -Z(Ao); -const Co = Ao.get; -Z(Co); -const ma = (t) => oe(Co, t, []) !== void 0, ha = (t) => { +Z(Ro); +const Lo = Ro.get; +Z(Lo); +const _a = (t) => oe(Lo, t, []) !== void 0, ba = (t) => { const e = +ie(t); - return Ns(e) && ie(e) === t; -}, ga = (t) => { - Is(t), tt(nt(t), (e) => { + return Ms(e) && ie(e) === t; +}, wa = (t) => { + Os(t), nt(st(t), (e) => { const r = ue(t, e); - Z(r), ha(e) || L(t, e, { + Z(r), ba(e) || M(t, e, { ...r, writable: !1, configurable: !1 }); }); -}, ya = () => { +}, xa = () => { if (typeof E.harden == "function") return E.harden; - const t = new xt(), { harden: e } = { + const t = new Et(), { harden: e } = { /** * @template T * @param {T} root * @returns {T} */ harden(r) { - const n = new wt(), a = new Pe(); - function s(d, f = void 0) { - if (!He(d)) + const n = new St(), a = new ke(); + function o(d, f = void 0) { + if (!We(d)) return; const m = typeof d; if (m !== "object" && m !== "function") throw v(`Unexpected typeof: ${m}`); - Wt(t, d) || sn(n, d) || (Tr(n, d), ee(a, d, f)); + Yt(t, d) || dn(n, d) || (Cr(n, d), ee(a, d, f)); } function i(d) { - ma(d) ? ga(d) : y(d); - const f = M(a, d) || "unknown", m = Ke(d), p = G(d); - s(p, `${f}.__proto__`), tt(nt(m), (h) => { + _a(d) ? wa(d) : y(d); + const f = L(a, d) || "unknown", m = Je(d), p = B(d); + o(p, `${f}.__proto__`), nt(st(m), (h) => { const _ = `${f}.${ie(h)}`, w = m[ /** @type {string} */ h ]; - se(w, "value") ? s(w.value, `${_}`) : (s(w.get, `${_}(get)`), s(w.set, `${_}(set)`)); + se(w, "value") ? o(w.value, `${_}`) : (o(w.get, `${_}(get)`), o(w.set, `${_}(set)`)); }); } function c() { - Tn(n, i); + $n(n, i); } function u(d) { - Ir(t, d); + Nr(t, d); } function l() { - Tn(n, u); + $n(n, u); } - return s(r), c(), l(), r; + return o(r), c(), l(), r; } }; return e; -}, No = { +}, Mo = { // *** Value Properties of the Global Object Infinity: 1 / 0, NaN: NaN, undefined: void 0 -}, $o = { +}, Fo = { // *** Function Properties of the Global Object isFinite: "isFinite", isNaN: "isNaN", @@ -553,7 +562,7 @@ const ma = (t) => oe(Co, t, []) !== void 0, ha = (t) => { harden: "harden", HandledPromise: "HandledPromise" // TODO: Until Promise.delegate (see below). -}, $n = { +}, Fn = { // *** Constructor Properties of the Global Object Date: "%InitialDate%", Error: "%InitialError%", @@ -572,7 +581,7 @@ const ma = (t) => oe(Co, t, []) !== void 0, ha = (t) => { // TODO https://github.com/Agoric/SES-shim/issues/551 // Need initial WeakRef and FinalizationGroup in // start compartment only. -}, Oo = { +}, Do = { // *** Constructor Properties of the Global Object Date: "%SharedDate%", Error: "%SharedError%", @@ -580,32 +589,32 @@ const ma = (t) => oe(Co, t, []) !== void 0, ha = (t) => { Symbol: "%SharedSymbol%", // *** Other Properties of the Global Object Math: "%SharedMath%" -}, va = [ +}, Sa = [ EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError -], Hr = { +], Yr = { "[[Proto]]": "%FunctionPrototype%", length: "number", name: "string" // Do not specify "prototype" here, since only Function instances that can // be used as a constructor have a prototype property. For constructors, // since prototype properties are instance-specific, we define it there. -}, _a = { +}, Ea = { // This property is not mentioned in ECMA 262, but is present in V8 and // necessary for lockdown to succeed. "[[Proto]]": "%AsyncFunctionPrototype%" -}, o = Hr, On = _a, O = { - get: o, +}, s = Yr, Dn = Ea, O = { + get: s, set: "undefined" -}, Te = { - get: o, - set: o -}, Rn = (t) => t === O || t === Te; -function lt(t) { +}, Ie = { + get: s, + set: s +}, Un = (t) => t === O || t === Ie; +function dt(t) { return { // Properties of the NativeError Constructors "[[Proto]]": "%SharedError%", @@ -613,7 +622,7 @@ function lt(t) { prototype: t }; } -function ut(t) { +function ft(t) { return { // Properties of the NativeError Prototype Objects "[[Proto]]": "%ErrorPrototype%", @@ -643,7 +652,7 @@ function ge(t) { constructor: t }; } -const Mn = { +const jn = { E: "number", LN10: "number", LN2: "number", @@ -653,40 +662,40 @@ const Mn = { SQRT1_2: "number", SQRT2: "number", "@@toStringTag": "string", - abs: o, - acos: o, - acosh: o, - asin: o, - asinh: o, - atan: o, - atanh: o, - atan2: o, - cbrt: o, - ceil: o, - clz32: o, - cos: o, - cosh: o, - exp: o, - expm1: o, - floor: o, - fround: o, - hypot: o, - imul: o, - log: o, - log1p: o, - log10: o, - log2: o, - max: o, - min: o, - pow: o, - round: o, - sign: o, - sin: o, - sinh: o, - sqrt: o, - tan: o, - tanh: o, - trunc: o, + abs: s, + acos: s, + acosh: s, + asin: s, + asinh: s, + atan: s, + atanh: s, + atan2: s, + cbrt: s, + ceil: s, + clz32: s, + cos: s, + cosh: s, + exp: s, + expm1: s, + floor: s, + fround: s, + hypot: s, + imul: s, + log: s, + log1p: s, + log10: s, + log2: s, + max: s, + min: s, + pow: s, + round: s, + sign: s, + sin: s, + sinh: s, + sqrt: s, + tan: s, + tanh: s, + trunc: s, // See https://github.com/Moddable-OpenSource/moddable/issues/523 idiv: !1, // See https://github.com/Moddable-OpenSource/moddable/issues/523 @@ -701,12 +710,12 @@ const Mn = { mod: !1, // See https://github.com/Moddable-OpenSource/moddable/issues/523#issuecomment-1942904505 irandom: !1 -}, cr = { +}, dr = { // ECMA https://tc39.es/ecma262 // The intrinsics object has no prototype to avoid conflicts. "[[Proto]]": null, // %ThrowTypeError% - "%ThrowTypeError%": o, + "%ThrowTypeError%": s, // *** The Global Object // *** Value Properties of the Global Object Infinity: "number", @@ -714,44 +723,44 @@ const Mn = { undefined: "undefined", // *** Function Properties of the Global Object // eval - "%UniqueEval%": o, - isFinite: o, - isNaN: o, - parseFloat: o, - parseInt: o, - decodeURI: o, - decodeURIComponent: o, - encodeURI: o, - encodeURIComponent: o, + "%UniqueEval%": s, + isFinite: s, + isNaN: s, + parseFloat: s, + parseInt: s, + decodeURI: s, + decodeURIComponent: s, + encodeURI: s, + encodeURIComponent: s, // *** Fundamental Objects Object: { // Properties of the Object Constructor "[[Proto]]": "%FunctionPrototype%", - assign: o, - create: o, - defineProperties: o, - defineProperty: o, - entries: o, - freeze: o, - fromEntries: o, - getOwnPropertyDescriptor: o, - getOwnPropertyDescriptors: o, - getOwnPropertyNames: o, - getOwnPropertySymbols: o, - getPrototypeOf: o, - hasOwn: o, - is: o, - isExtensible: o, - isFrozen: o, - isSealed: o, - keys: o, - preventExtensions: o, + assign: s, + create: s, + defineProperties: s, + defineProperty: s, + entries: s, + freeze: s, + fromEntries: s, + getOwnPropertyDescriptor: s, + getOwnPropertyDescriptors: s, + getOwnPropertyNames: s, + getOwnPropertySymbols: s, + getPrototypeOf: s, + hasOwn: s, + is: s, + isExtensible: s, + isFrozen: s, + isSealed: s, + keys: s, + preventExtensions: s, prototype: "%ObjectPrototype%", - seal: o, - setPrototypeOf: o, - values: o, + seal: s, + setPrototypeOf: s, + values: s, // https://github.com/tc39/proposal-array-grouping - groupBy: o, + groupBy: s, // Seen on QuickJS __getClass: !1 }, @@ -759,20 +768,20 @@ const Mn = { // Properties of the Object Prototype Object "[[Proto]]": null, constructor: "Object", - hasOwnProperty: o, - isPrototypeOf: o, - propertyIsEnumerable: o, - toLocaleString: o, - toString: o, - valueOf: o, + hasOwnProperty: s, + isPrototypeOf: s, + propertyIsEnumerable: s, + toLocaleString: s, + toString: s, + valueOf: s, // Annex B: Additional Properties of the Object.prototype Object // See note in header about the difference between [[Proto]] and --proto-- // special notations. - "--proto--": Te, - __defineGetter__: o, - __defineSetter__: o, - __lookupGetter__: o, - __lookupSetter__: o + "--proto--": Ie, + __defineGetter__: s, + __defineSetter__: s, + __lookupGetter__: s, + __lookupSetter__: s }, "%UniqueFunction%": { // Properties of the Function Constructor @@ -784,12 +793,12 @@ const Mn = { prototype: "%FunctionPrototype%" }, "%FunctionPrototype%": { - apply: o, - bind: o, - call: o, + apply: s, + bind: s, + call: s, constructor: "%InertFunction%", - toString: o, - "@@hasInstance": o, + toString: s, + "@@hasInstance": s, // proposed but not yet std. To be removed if there caller: !1, // proposed but not yet std. To be removed if there @@ -806,8 +815,8 @@ const Mn = { }, "%BooleanPrototype%": { constructor: "Boolean", - toString: o, - valueOf: o + toString: s, + valueOf: s }, "%SharedSymbol%": { // Properties of the Symbol Constructor @@ -815,11 +824,11 @@ const Mn = { asyncDispose: "symbol", asyncIterator: "symbol", dispose: "symbol", - for: o, + for: s, hasInstance: "symbol", isConcatSpreadable: "symbol", iterator: "symbol", - keyFor: o, + keyFor: s, match: "symbol", matchAll: "symbol", prototype: "%SymbolPrototype%", @@ -841,9 +850,9 @@ const Mn = { // Properties of the Symbol Prototype Object constructor: "%SharedSymbol%", description: O, - toString: o, - valueOf: o, - "@@toPrimitive": o, + toString: s, + valueOf: s, + "@@toPrimitive": s, "@@toStringTag": "string" }, "%InitialError%": { @@ -851,85 +860,85 @@ const Mn = { "[[Proto]]": "%FunctionPrototype%", prototype: "%ErrorPrototype%", // Non standard, v8 only, used by tap - captureStackTrace: o, + captureStackTrace: s, // Non standard, v8 only, used by tap, tamed to accessor - stackTraceLimit: Te, + stackTraceLimit: Ie, // Non standard, v8 only, used by several, tamed to accessor - prepareStackTrace: Te + prepareStackTrace: Ie }, "%SharedError%": { // Properties of the Error Constructor "[[Proto]]": "%FunctionPrototype%", prototype: "%ErrorPrototype%", // Non standard, v8 only, used by tap - captureStackTrace: o, + captureStackTrace: s, // Non standard, v8 only, used by tap, tamed to accessor - stackTraceLimit: Te, + stackTraceLimit: Ie, // Non standard, v8 only, used by several, tamed to accessor - prepareStackTrace: Te + prepareStackTrace: Ie }, "%ErrorPrototype%": { constructor: "%SharedError%", message: "string", name: "string", - toString: o, + toString: s, // proposed de-facto, assumed TODO // Seen on FF Nightly 88.0a1 at: !1, // Seen on FF and XS - stack: Te, + stack: Ie, // Superfluously present in some versions of V8. // https://github.com/tc39/notes/blob/master/meetings/2021-10/oct-26.md#:~:text=However%2C%20Chrome%2093,and%20node%2016.11. cause: !1 }, // NativeError - EvalError: lt("%EvalErrorPrototype%"), - RangeError: lt("%RangeErrorPrototype%"), - ReferenceError: lt("%ReferenceErrorPrototype%"), - SyntaxError: lt("%SyntaxErrorPrototype%"), - TypeError: lt("%TypeErrorPrototype%"), - URIError: lt("%URIErrorPrototype%"), - "%EvalErrorPrototype%": ut("EvalError"), - "%RangeErrorPrototype%": ut("RangeError"), - "%ReferenceErrorPrototype%": ut("ReferenceError"), - "%SyntaxErrorPrototype%": ut("SyntaxError"), - "%TypeErrorPrototype%": ut("TypeError"), - "%URIErrorPrototype%": ut("URIError"), + EvalError: dt("%EvalErrorPrototype%"), + RangeError: dt("%RangeErrorPrototype%"), + ReferenceError: dt("%ReferenceErrorPrototype%"), + SyntaxError: dt("%SyntaxErrorPrototype%"), + TypeError: dt("%TypeErrorPrototype%"), + URIError: dt("%URIErrorPrototype%"), + "%EvalErrorPrototype%": ft("EvalError"), + "%RangeErrorPrototype%": ft("RangeError"), + "%ReferenceErrorPrototype%": ft("ReferenceError"), + "%SyntaxErrorPrototype%": ft("SyntaxError"), + "%TypeErrorPrototype%": ft("TypeError"), + "%URIErrorPrototype%": ft("URIError"), // *** Numbers and Dates Number: { // Properties of the Number Constructor "[[Proto]]": "%FunctionPrototype%", EPSILON: "number", - isFinite: o, - isInteger: o, - isNaN: o, - isSafeInteger: o, + isFinite: s, + isInteger: s, + isNaN: s, + isSafeInteger: s, MAX_SAFE_INTEGER: "number", MAX_VALUE: "number", MIN_SAFE_INTEGER: "number", MIN_VALUE: "number", NaN: "number", NEGATIVE_INFINITY: "number", - parseFloat: o, - parseInt: o, + parseFloat: s, + parseInt: s, POSITIVE_INFINITY: "number", prototype: "%NumberPrototype%" }, "%NumberPrototype%": { // Properties of the Number Prototype Object constructor: "Number", - toExponential: o, - toFixed: o, - toLocaleString: o, - toPrecision: o, - toString: o, - valueOf: o + toExponential: s, + toFixed: s, + toLocaleString: s, + toPrecision: s, + toString: s, + valueOf: s }, BigInt: { // Properties of the BigInt Constructor "[[Proto]]": "%FunctionPrototype%", - asIntN: o, - asUintN: o, + asIntN: s, + asUintN: s, prototype: "%BigIntPrototype%", // See https://github.com/Moddable-OpenSource/moddable/issues/523 bitLength: !1, @@ -962,167 +971,167 @@ const Mn = { }, "%BigIntPrototype%": { constructor: "BigInt", - toLocaleString: o, - toString: o, - valueOf: o, + toLocaleString: s, + toString: s, + valueOf: s, "@@toStringTag": "string" }, "%InitialMath%": { - ...Mn, + ...jn, // `%InitialMath%.random()` has the standard unsafe behavior - random: o + random: s }, "%SharedMath%": { - ...Mn, + ...jn, // `%SharedMath%.random()` is tamed to always throw - random: o + random: s }, "%InitialDate%": { // Properties of the Date Constructor "[[Proto]]": "%FunctionPrototype%", - now: o, - parse: o, + now: s, + parse: s, prototype: "%DatePrototype%", - UTC: o + UTC: s }, "%SharedDate%": { // Properties of the Date Constructor "[[Proto]]": "%FunctionPrototype%", // `%SharedDate%.now()` is tamed to always throw - now: o, - parse: o, + now: s, + parse: s, prototype: "%DatePrototype%", - UTC: o + UTC: s }, "%DatePrototype%": { constructor: "%SharedDate%", - getDate: o, - getDay: o, - getFullYear: o, - getHours: o, - getMilliseconds: o, - getMinutes: o, - getMonth: o, - getSeconds: o, - getTime: o, - getTimezoneOffset: o, - getUTCDate: o, - getUTCDay: o, - getUTCFullYear: o, - getUTCHours: o, - getUTCMilliseconds: o, - getUTCMinutes: o, - getUTCMonth: o, - getUTCSeconds: o, - setDate: o, - setFullYear: o, - setHours: o, - setMilliseconds: o, - setMinutes: o, - setMonth: o, - setSeconds: o, - setTime: o, - setUTCDate: o, - setUTCFullYear: o, - setUTCHours: o, - setUTCMilliseconds: o, - setUTCMinutes: o, - setUTCMonth: o, - setUTCSeconds: o, - toDateString: o, - toISOString: o, - toJSON: o, - toLocaleDateString: o, - toLocaleString: o, - toLocaleTimeString: o, - toString: o, - toTimeString: o, - toUTCString: o, - valueOf: o, - "@@toPrimitive": o, + getDate: s, + getDay: s, + getFullYear: s, + getHours: s, + getMilliseconds: s, + getMinutes: s, + getMonth: s, + getSeconds: s, + getTime: s, + getTimezoneOffset: s, + getUTCDate: s, + getUTCDay: s, + getUTCFullYear: s, + getUTCHours: s, + getUTCMilliseconds: s, + getUTCMinutes: s, + getUTCMonth: s, + getUTCSeconds: s, + setDate: s, + setFullYear: s, + setHours: s, + setMilliseconds: s, + setMinutes: s, + setMonth: s, + setSeconds: s, + setTime: s, + setUTCDate: s, + setUTCFullYear: s, + setUTCHours: s, + setUTCMilliseconds: s, + setUTCMinutes: s, + setUTCMonth: s, + setUTCSeconds: s, + toDateString: s, + toISOString: s, + toJSON: s, + toLocaleDateString: s, + toLocaleString: s, + toLocaleTimeString: s, + toString: s, + toTimeString: s, + toUTCString: s, + valueOf: s, + "@@toPrimitive": s, // Annex B: Additional Properties of the Date.prototype Object - getYear: o, - setYear: o, - toGMTString: o + getYear: s, + setYear: s, + toGMTString: s }, // Text Processing String: { // Properties of the String Constructor "[[Proto]]": "%FunctionPrototype%", - fromCharCode: o, - fromCodePoint: o, + fromCharCode: s, + fromCodePoint: s, prototype: "%StringPrototype%", - raw: o, + raw: s, // See https://github.com/Moddable-OpenSource/moddable/issues/523 fromArrayBuffer: !1 }, "%StringPrototype%": { // Properties of the String Prototype Object length: "number", - at: o, - charAt: o, - charCodeAt: o, - codePointAt: o, - concat: o, + at: s, + charAt: s, + charCodeAt: s, + codePointAt: s, + concat: s, constructor: "String", - endsWith: o, - includes: o, - indexOf: o, - lastIndexOf: o, - localeCompare: o, - match: o, - matchAll: o, - normalize: o, - padEnd: o, - padStart: o, - repeat: o, - replace: o, - replaceAll: o, + endsWith: s, + includes: s, + indexOf: s, + lastIndexOf: s, + localeCompare: s, + match: s, + matchAll: s, + normalize: s, + padEnd: s, + padStart: s, + repeat: s, + replace: s, + replaceAll: s, // ES2021 - search: o, - slice: o, - split: o, - startsWith: o, - substring: o, - toLocaleLowerCase: o, - toLocaleUpperCase: o, - toLowerCase: o, - toString: o, - toUpperCase: o, - trim: o, - trimEnd: o, - trimStart: o, - valueOf: o, - "@@iterator": o, + search: s, + slice: s, + split: s, + startsWith: s, + substring: s, + toLocaleLowerCase: s, + toLocaleUpperCase: s, + toLowerCase: s, + toString: s, + toUpperCase: s, + trim: s, + trimEnd: s, + trimStart: s, + valueOf: s, + "@@iterator": s, // Annex B: Additional Properties of the String.prototype Object - substr: o, - anchor: o, - big: o, - blink: o, - bold: o, - fixed: o, - fontcolor: o, - fontsize: o, - italics: o, - link: o, - small: o, - strike: o, - sub: o, - sup: o, - trimLeft: o, - trimRight: o, + substr: s, + anchor: s, + big: s, + blink: s, + bold: s, + fixed: s, + fontcolor: s, + fontsize: s, + italics: s, + link: s, + small: s, + strike: s, + sub: s, + sup: s, + trimLeft: s, + trimRight: s, // See https://github.com/Moddable-OpenSource/moddable/issues/523 compare: !1, // https://github.com/tc39/proposal-is-usv-string - isWellFormed: o, - toWellFormed: o, - unicodeSets: o, + isWellFormed: s, + toWellFormed: s, + unicodeSets: s, // Seen on QuickJS __quote: !1 }, "%StringIteratorPrototype%": { "[[Proto]]": "%IteratorPrototype%", - next: o, + next: s, "@@toStringTag": "string" }, "%InitialRegExp%": { @@ -1161,22 +1170,22 @@ const Mn = { "%RegExpPrototype%": { // Properties of the RegExp Prototype Object constructor: "%SharedRegExp%", - exec: o, + exec: s, dotAll: O, flags: O, global: O, hasIndices: O, ignoreCase: O, - "@@match": o, - "@@matchAll": o, + "@@match": s, + "@@matchAll": s, multiline: O, - "@@replace": o, - "@@search": o, + "@@replace": s, + "@@search": s, source: O, - "@@split": o, + "@@split": s, sticky: O, - test: o, - toString: o, + test: s, + toString: s, unicode: O, unicodeSets: O, // Annex B: Additional Properties of the RegExp.prototype Object @@ -1186,61 +1195,61 @@ const Mn = { "%RegExpStringIteratorPrototype%": { // The %RegExpStringIteratorPrototype% Object "[[Proto]]": "%IteratorPrototype%", - next: o, + next: s, "@@toStringTag": "string" }, // Indexed Collections Array: { // Properties of the Array Constructor "[[Proto]]": "%FunctionPrototype%", - from: o, - isArray: o, - of: o, + from: s, + isArray: s, + of: s, prototype: "%ArrayPrototype%", "@@species": O, // Stage 3: // https://tc39.es/proposal-relative-indexing-method/ - at: o, + at: s, // https://tc39.es/proposal-array-from-async/ - fromAsync: o + fromAsync: s }, "%ArrayPrototype%": { // Properties of the Array Prototype Object - at: o, + at: s, length: "number", - concat: o, + concat: s, constructor: "Array", - copyWithin: o, - entries: o, - every: o, - fill: o, - filter: o, - find: o, - findIndex: o, - flat: o, - flatMap: o, - forEach: o, - includes: o, - indexOf: o, - join: o, - keys: o, - lastIndexOf: o, - map: o, - pop: o, - push: o, - reduce: o, - reduceRight: o, - reverse: o, - shift: o, - slice: o, - some: o, - sort: o, - splice: o, - toLocaleString: o, - toString: o, - unshift: o, - values: o, - "@@iterator": o, + copyWithin: s, + entries: s, + every: s, + fill: s, + filter: s, + find: s, + findIndex: s, + flat: s, + flatMap: s, + forEach: s, + includes: s, + indexOf: s, + join: s, + keys: s, + lastIndexOf: s, + map: s, + pop: s, + push: s, + reduce: s, + reduceRight: s, + reverse: s, + shift: s, + slice: s, + some: s, + sort: s, + splice: s, + toLocaleString: s, + toString: s, + unshift: s, + values: s, + "@@iterator": s, "@@unscopables": { "[[Proto]]": null, copyWithin: "boolean", @@ -1270,76 +1279,76 @@ const Mn = { groupBy: "boolean" }, // See https://github.com/tc39/proposal-array-find-from-last - findLast: o, - findLastIndex: o, + findLast: s, + findLastIndex: s, // https://github.com/tc39/proposal-change-array-by-copy - toReversed: o, - toSorted: o, - toSpliced: o, - with: o, + toReversed: s, + toSorted: s, + toSpliced: s, + with: s, // https://github.com/tc39/proposal-array-grouping - group: o, + group: s, // Not in proposal? Where? - groupToMap: o, + groupToMap: s, // Not in proposal? Where? - groupBy: o + groupBy: s }, "%ArrayIteratorPrototype%": { // The %ArrayIteratorPrototype% Object "[[Proto]]": "%IteratorPrototype%", - next: o, + next: s, "@@toStringTag": "string" }, // *** TypedArray Objects "%TypedArray%": { // Properties of the %TypedArray% Intrinsic Object "[[Proto]]": "%FunctionPrototype%", - from: o, - of: o, + from: s, + of: s, prototype: "%TypedArrayPrototype%", "@@species": O }, "%TypedArrayPrototype%": { - at: o, + at: s, buffer: O, byteLength: O, byteOffset: O, constructor: "%TypedArray%", - copyWithin: o, - entries: o, - every: o, - fill: o, - filter: o, - find: o, - findIndex: o, - forEach: o, - includes: o, - indexOf: o, - join: o, - keys: o, - lastIndexOf: o, + copyWithin: s, + entries: s, + every: s, + fill: s, + filter: s, + find: s, + findIndex: s, + forEach: s, + includes: s, + indexOf: s, + join: s, + keys: s, + lastIndexOf: s, length: O, - map: o, - reduce: o, - reduceRight: o, - reverse: o, - set: o, - slice: o, - some: o, - sort: o, - subarray: o, - toLocaleString: o, - toString: o, - values: o, - "@@iterator": o, + map: s, + reduce: s, + reduceRight: s, + reverse: s, + set: s, + slice: s, + some: s, + sort: s, + subarray: s, + toLocaleString: s, + toString: s, + values: s, + "@@iterator": s, "@@toStringTag": O, // See https://github.com/tc39/proposal-array-find-from-last - findLast: o, - findLastIndex: o, + findLast: s, + findLastIndex: s, // https://github.com/tc39/proposal-change-array-by-copy - toReversed: o, - toSorted: o, - with: o + toReversed: s, + toSorted: s, + with: s }, // The TypedArray Constructors BigInt64Array: he("%BigInt64ArrayPrototype%"), @@ -1375,27 +1384,27 @@ const Mn = { "@@species": O, prototype: "%MapPrototype%", // https://github.com/tc39/proposal-array-grouping - groupBy: o + groupBy: s }, "%MapPrototype%": { - clear: o, + clear: s, constructor: "Map", - delete: o, - entries: o, - forEach: o, - get: o, - has: o, - keys: o, - set: o, + delete: s, + entries: s, + forEach: s, + get: s, + has: s, + keys: s, + set: s, size: O, - values: o, - "@@iterator": o, + values: s, + "@@iterator": s, "@@toStringTag": "string" }, "%MapIteratorPrototype%": { // The %MapIteratorPrototype% Object "[[Proto]]": "%IteratorPrototype%", - next: o, + next: s, "@@toStringTag": "string" }, Set: { @@ -1407,37 +1416,37 @@ const Mn = { groupBy: !1 }, "%SetPrototype%": { - add: o, - clear: o, + add: s, + clear: s, constructor: "Set", - delete: o, - entries: o, - forEach: o, - has: o, - keys: o, + delete: s, + entries: s, + forEach: s, + has: s, + keys: s, size: O, - values: o, - "@@iterator": o, + values: s, + "@@iterator": s, "@@toStringTag": "string", // See https://github.com/tc39/proposal-set-methods - intersection: o, + intersection: s, // See https://github.com/tc39/proposal-set-methods - union: o, + union: s, // See https://github.com/tc39/proposal-set-methods - difference: o, + difference: s, // See https://github.com/tc39/proposal-set-methods - symmetricDifference: o, + symmetricDifference: s, // See https://github.com/tc39/proposal-set-methods - isSubsetOf: o, + isSubsetOf: s, // See https://github.com/tc39/proposal-set-methods - isSupersetOf: o, + isSupersetOf: s, // See https://github.com/tc39/proposal-set-methods - isDisjointFrom: o + isDisjointFrom: s }, "%SetIteratorPrototype%": { // The %SetIteratorPrototype% Object "[[Proto]]": "%IteratorPrototype%", - next: o, + next: s, "@@toStringTag": "string" }, WeakMap: { @@ -1447,10 +1456,10 @@ const Mn = { }, "%WeakMapPrototype%": { constructor: "WeakMap", - delete: o, - get: o, - has: o, - set: o, + delete: s, + get: s, + has: s, + set: s, "@@toStringTag": "string" }, WeakSet: { @@ -1459,17 +1468,17 @@ const Mn = { prototype: "%WeakSetPrototype%" }, "%WeakSetPrototype%": { - add: o, + add: s, constructor: "WeakSet", - delete: o, - has: o, + delete: s, + has: s, "@@toStringTag": "string" }, // *** Structured Data ArrayBuffer: { // Properties of the ArrayBuffer Constructor "[[Proto]]": "%FunctionPrototype%", - isView: o, + isView: s, prototype: "%ArrayBufferPrototype%", "@@species": O, // See https://github.com/Moddable-OpenSource/moddable/issues/523 @@ -1480,17 +1489,17 @@ const Mn = { "%ArrayBufferPrototype%": { byteLength: O, constructor: "ArrayBuffer", - slice: o, + slice: s, "@@toStringTag": "string", // See https://github.com/Moddable-OpenSource/moddable/issues/523 concat: !1, // See https://github.com/tc39/proposal-resizablearraybuffer - transfer: o, - resize: o, + transfer: s, + resize: s, resizable: O, maxByteLength: O, // https://github.com/tc39/proposal-arraybuffer-transfer - transferToFixedLength: o, + transferToFixedLength: s, detached: O }, // SharedArrayBuffer Objects @@ -1510,42 +1519,42 @@ const Mn = { byteLength: O, byteOffset: O, constructor: "DataView", - getBigInt64: o, - getBigUint64: o, + getBigInt64: s, + getBigUint64: s, // https://github.com/tc39/proposal-float16array - getFloat16: o, - getFloat32: o, - getFloat64: o, - getInt8: o, - getInt16: o, - getInt32: o, - getUint8: o, - getUint16: o, - getUint32: o, - setBigInt64: o, - setBigUint64: o, + getFloat16: s, + getFloat32: s, + getFloat64: s, + getInt8: s, + getInt16: s, + getInt32: s, + getUint8: s, + getUint16: s, + getUint32: s, + setBigInt64: s, + setBigUint64: s, // https://github.com/tc39/proposal-float16array - setFloat16: o, - setFloat32: o, - setFloat64: o, - setInt8: o, - setInt16: o, - setInt32: o, - setUint8: o, - setUint16: o, - setUint32: o, + setFloat16: s, + setFloat32: s, + setFloat64: s, + setInt8: s, + setInt16: s, + setInt32: s, + setUint8: s, + setUint16: s, + setUint32: s, "@@toStringTag": "string" }, // Atomics Atomics: !1, // UNSAFE and suppressed. JSON: { - parse: o, - stringify: o, + parse: s, + stringify: s, "@@toStringTag": "string", // https://github.com/tc39/proposal-json-parse-with-source/ - rawJSON: o, - isRawJSON: o + rawJSON: s, + isRawJSON: s }, // *** Control Abstraction Objects // https://github.com/tc39/proposal-iterator-helpers @@ -1553,41 +1562,41 @@ const Mn = { // Properties of the Iterator Constructor "[[Proto]]": "%FunctionPrototype%", prototype: "%IteratorPrototype%", - from: o + from: s }, "%IteratorPrototype%": { // The %IteratorPrototype% Object - "@@iterator": o, + "@@iterator": s, // https://github.com/tc39/proposal-iterator-helpers constructor: "Iterator", - map: o, - filter: o, - take: o, - drop: o, - flatMap: o, - reduce: o, - toArray: o, - forEach: o, - some: o, - every: o, - find: o, + map: s, + filter: s, + take: s, + drop: s, + flatMap: s, + reduce: s, + toArray: s, + forEach: s, + some: s, + every: s, + find: s, "@@toStringTag": "string", // https://github.com/tc39/proposal-async-iterator-helpers - toAsync: o, + toAsync: s, // See https://github.com/Moddable-OpenSource/moddable/issues/523#issuecomment-1942904505 "@@dispose": !1 }, // https://github.com/tc39/proposal-iterator-helpers "%WrapForValidIteratorPrototype%": { "[[Proto]]": "%IteratorPrototype%", - next: o, - return: o + next: s, + return: s }, // https://github.com/tc39/proposal-iterator-helpers "%IteratorHelperPrototype%": { "[[Proto]]": "%IteratorPrototype%", - next: o, - return: o, + next: s, + return: s, "@@toStringTag": "string" }, // https://github.com/tc39/proposal-async-iterator-helpers @@ -1595,24 +1604,24 @@ const Mn = { // Properties of the Iterator Constructor "[[Proto]]": "%FunctionPrototype%", prototype: "%AsyncIteratorPrototype%", - from: o + from: s }, "%AsyncIteratorPrototype%": { // The %AsyncIteratorPrototype% Object - "@@asyncIterator": o, + "@@asyncIterator": s, // https://github.com/tc39/proposal-async-iterator-helpers constructor: "AsyncIterator", - map: o, - filter: o, - take: o, - drop: o, - flatMap: o, - reduce: o, - toArray: o, - forEach: o, - some: o, - every: o, - find: o, + map: s, + filter: s, + take: s, + drop: s, + flatMap: s, + reduce: s, + toArray: s, + forEach: s, + some: s, + every: s, + find: s, "@@toStringTag": "string", // See https://github.com/Moddable-OpenSource/moddable/issues/523#issuecomment-1942904505 "@@asyncDispose": !1 @@ -1620,14 +1629,14 @@ const Mn = { // https://github.com/tc39/proposal-async-iterator-helpers "%WrapForValidAsyncIteratorPrototype%": { "[[Proto]]": "%AsyncIteratorPrototype%", - next: o, - return: o + next: s, + return: s }, // https://github.com/tc39/proposal-async-iterator-helpers "%AsyncIteratorHelperPrototype%": { "[[Proto]]": "%AsyncIteratorPrototype%", - next: o, - return: o, + next: s, + return: s, "@@toStringTag": "string" }, "%InertGeneratorFunction%": { @@ -1662,18 +1671,18 @@ const Mn = { // Properties of the Generator Prototype Object "[[Proto]]": "%IteratorPrototype%", constructor: "%Generator%", - next: o, - return: o, - throw: o, + next: s, + return: s, + throw: s, "@@toStringTag": "string" }, "%AsyncGeneratorPrototype%": { // Properties of the AsyncGenerator Prototype Object "[[Proto]]": "%AsyncIteratorPrototype%", constructor: "%AsyncGenerator%", - next: o, - return: o, - throw: o, + next: s, + return: s, + throw: s, "@@toStringTag": "string" }, // TODO: To be replaced with Promise.delegate @@ -1687,43 +1696,43 @@ const Mn = { // another whitelist change to update to the current proposed standard. HandledPromise: { "[[Proto]]": "Promise", - applyFunction: o, - applyFunctionSendOnly: o, - applyMethod: o, - applyMethodSendOnly: o, - get: o, - getSendOnly: o, + applyFunction: s, + applyFunctionSendOnly: s, + applyMethod: s, + applyMethodSendOnly: s, + get: s, + getSendOnly: s, prototype: "%PromisePrototype%", - resolve: o + resolve: s }, Promise: { // Properties of the Promise Constructor "[[Proto]]": "%FunctionPrototype%", - all: o, - allSettled: o, + all: s, + allSettled: s, // To transition from `false` to `fn` once we also have `AggregateError` // TODO https://github.com/Agoric/SES-shim/issues/550 any: !1, // ES2021 prototype: "%PromisePrototype%", - race: o, - reject: o, - resolve: o, + race: s, + reject: s, + resolve: s, // https://github.com/tc39/proposal-promise-with-resolvers - withResolvers: o, + withResolvers: s, "@@species": O }, "%PromisePrototype%": { // Properties of the Promise Prototype Object - catch: o, + catch: s, constructor: "Promise", - finally: o, - then: o, + finally: s, + then: s, "@@toStringTag": "string", // Non-standard, used in node to prevent async_hooks from breaking - "UniqueSymbol(async_id_symbol)": Te, - "UniqueSymbol(trigger_async_id_symbol)": Te, - "UniqueSymbol(destroyed)": Te + "UniqueSymbol(async_id_symbol)": Ie, + "UniqueSymbol(trigger_async_id_symbol)": Ie, + "UniqueSymbol(destroyed)": Ie }, "%InertAsyncFunction%": { // Properties of the AsyncFunction Constructor @@ -1744,92 +1753,92 @@ const Mn = { Reflect: { // The Reflect Object // Not a function object. - apply: o, - construct: o, - defineProperty: o, - deleteProperty: o, - get: o, - getOwnPropertyDescriptor: o, - getPrototypeOf: o, - has: o, - isExtensible: o, - ownKeys: o, - preventExtensions: o, - set: o, - setPrototypeOf: o, + apply: s, + construct: s, + defineProperty: s, + deleteProperty: s, + get: s, + getOwnPropertyDescriptor: s, + getPrototypeOf: s, + has: s, + isExtensible: s, + ownKeys: s, + preventExtensions: s, + set: s, + setPrototypeOf: s, "@@toStringTag": "string" }, Proxy: { // Properties of the Proxy Constructor "[[Proto]]": "%FunctionPrototype%", - revocable: o + revocable: s }, // Appendix B // Annex B: Additional Properties of the Global Object - escape: o, - unescape: o, + escape: s, + unescape: s, // Proposed "%UniqueCompartment%": { "[[Proto]]": "%FunctionPrototype%", prototype: "%CompartmentPrototype%", - toString: o + toString: s }, "%InertCompartment%": { "[[Proto]]": "%FunctionPrototype%", prototype: "%CompartmentPrototype%", - toString: o + toString: s }, "%CompartmentPrototype%": { constructor: "%InertCompartment%", - evaluate: o, + evaluate: s, globalThis: O, name: O, - import: On, - load: On, - importNow: o, - module: o, + import: Dn, + load: Dn, + importNow: s, + module: s, "@@toStringTag": "string" }, - lockdown: o, - harden: { ...o, isFake: "boolean" }, - "%InitialGetStackString%": o -}, ba = (t) => typeof t == "function"; -function wa(t, e, r) { + lockdown: s, + harden: { ...s, isFake: "boolean" }, + "%InitialGetStackString%": s +}, Pa = (t) => typeof t == "function"; +function ka(t, e, r) { if (se(t, e)) { const n = ue(t, e); - if (!n || !xr(n.value, r.value) || n.get !== r.get || n.set !== r.set || n.writable !== r.writable || n.enumerable !== r.enumerable || n.configurable !== r.configurable) + if (!n || !Pr(n.value, r.value) || n.get !== r.get || n.set !== r.set || n.writable !== r.writable || n.enumerable !== r.enumerable || n.configurable !== r.configurable) throw v(`Conflicting definitions of ${e}`); } - L(t, e, r); + M(t, e, r); } -function xa(t, e) { +function Ta(t, e) { for (const [r, n] of te(e)) - wa(t, r, n); + ka(t, r, n); } -function Ro(t, e) { +function Uo(t, e) { const r = { __proto__: null }; for (const [n, a] of te(e)) se(t, n) && (r[a] = t[n]); return r; } -const Mo = () => { +const jo = () => { const t = H(null); let e; const r = (c) => { - xa(t, Ke(c)); + Ta(t, Je(c)); }; y(r); const n = () => { for (const [c, u] of te(t)) { - if (!He(u) || !se(u, "prototype")) + if (!We(u) || !se(u, "prototype")) continue; - const l = cr[c]; + const l = dr[c]; if (typeof l != "object") throw v(`Expected permit object at whitelist.${c}`); const d = l.prototype; if (!d) throw v(`${c}.prototype property not whitelisted`); - if (typeof d != "string" || !se(cr, d)) + if (typeof d != "string" || !se(dr, d)) throw v(`Unrecognized ${c}.prototype whitelist entry`); const f = u.prototype; if (se(t, d)) { @@ -1841,56 +1850,56 @@ const Mo = () => { } }; y(n); - const a = () => (y(t), e = new xt(Ge(ao(t), ba)), t); + const a = () => (y(t), e = new Et(Ve(fo(t), Pa)), t); y(a); - const s = (c) => { + const o = (c) => { if (!e) throw v( "isPseudoNative can only be called after finalIntrinsics" ); - return Wt(e, c); + return Yt(e, c); }; - y(s); + y(o); const i = { addIntrinsics: r, completePrototypes: n, finalIntrinsics: a, - isPseudoNative: s + isPseudoNative: o }; - return y(i), r(No), r(Ro(E, $o)), i; -}, Sa = (t) => { - const { addIntrinsics: e, finalIntrinsics: r } = Mo(); - return e(Ro(t, Oo)), r(); + return y(i), r(Mo), r(Uo(E, Fo)), i; +}, Ia = (t) => { + const { addIntrinsics: e, finalIntrinsics: r } = jo(); + return e(Uo(t, Do)), r(); }; -function Ea(t, e) { +function Aa(t, e) { let r = !1; - const n = (m, ...p) => (r || (console.groupCollapsed("Removing unpermitted intrinsics"), r = !0), console[m](...p)), a = ["undefined", "boolean", "number", "string", "symbol"], s = new Ie( - At ? de( - Ge( - te(cr["%SharedSymbol%"]), - ([m, p]) => p === "symbol" && typeof At[m] == "symbol" + const n = (m, ...p) => (r || (console.groupCollapsed("Removing unpermitted intrinsics"), r = !0), console[m](...p)), a = ["undefined", "boolean", "number", "string", "symbol"], o = new Ae( + Nt ? de( + Ve( + te(dr["%SharedSymbol%"]), + ([m, p]) => p === "symbol" && typeof Nt[m] == "symbol" ), - ([m]) => [At[m], `@@${m}`] + ([m]) => [Nt[m], `@@${m}`] ) : [] ); function i(m, p) { if (typeof p == "string") return p; - const h = Le(s, p); + const h = De(o, p); if (typeof p == "symbol") { if (h) return h; { - const _ = Cs(p); + const _ = Ls(p); return _ !== void 0 ? `RegisteredSymbol(${_})` : `Unique${ie(p)}`; } } throw v(`Unexpected property name type ${m} ${p}`); } function c(m, p, h) { - if (!He(p)) + if (!We(p)) throw v(`Object expected: ${m}, ${p}, ${h}`); - const _ = G(p); + const _ = B(p); if (!(_ === null && h === null)) { if (h !== void 0 && typeof h != "string") throw v(`Malformed whitelist permit ${m}.__proto__`); @@ -1910,7 +1919,7 @@ function Ea(t, e) { throw v(`Does not match whitelist ${m}`); return !0; } - } else if (Pr(a, _)) { + } else if (Ir(a, _)) { if (typeof p !== _) throw v( `At ${m} expected ${_} not ${typeof p}` @@ -1925,11 +1934,11 @@ function Ea(t, e) { if (!w) throw v(`Property ${h} not found at ${m}`); if (se(w, "value")) { - if (Rn(_)) + if (Un(_)) throw v(`Accessor expected at ${m}`); return u(m, w.value, h, _); } - if (!Rn(_)) + if (!Un(_)) throw v(`Accessor not expected at ${m}`); return u(`${m}`, w.get, h, _.get) && u(`${m}`, w.set, h, _.set); } @@ -1937,15 +1946,15 @@ function Ea(t, e) { const _ = h === "__proto__" ? "--proto--" : h; if (se(p, _)) return p[_]; - if (typeof m == "function" && se(Hr, _)) - return Hr[_]; + if (typeof m == "function" && se(Yr, _)) + return Yr[_]; } function f(m, p, h) { if (p == null) return; const _ = h["[[Proto]]"]; c(m, p, _), typeof p == "function" && e(p); - for (const w of nt(p)) { + for (const w of st(p)) { const I = i(m, w), N = `${m}.${I}`, T = d(p, h, I); if (!T || !l(N, p, w, T)) { T !== !1 && n("warn", `Removing ${N}`); @@ -1969,12 +1978,12 @@ function Ea(t, e) { } } try { - f("intrinsics", t, cr); + f("intrinsics", t, dr); } finally { r && console.groupEnd(); } } -function Pa() { +function Ca() { try { ye.prototype.constructor("return 1"); } catch { @@ -1982,15 +1991,15 @@ function Pa() { } const t = {}; function e(r, n, a) { - let s; + let o; try { - s = (0, eval)(a); + o = (0, eval)(a); } catch (u) { - if (u instanceof Gt) + if (u instanceof Wt) return; throw u; } - const i = G(s), c = function() { + const i = B(o), c = function() { throw v( "Function.prototype.constructor is not a valid constructor." ); @@ -2005,7 +2014,7 @@ function Pa() { } }), F(i, { constructor: { value: c } - }), c !== ye.prototype.constructor && so(c, ye.prototype.constructor), t[n] = c; + }), c !== ye.prototype.constructor && uo(c, ye.prototype.constructor), t[n] = c; } return e("Function", "%InertFunction%", "(function(){})"), e( "GeneratorFunction", @@ -2021,10 +2030,10 @@ function Pa() { "(async function*(){})" ), t; } -function ka(t = "safe") { +function Na(t = "safe") { if (t !== "safe" && t !== "unsafe") throw v(`unrecognized dateTaming ${t}`); - const e = ws, r = e.prototype, n = { + const e = ks, r = e.prototype, n = { /** * `%SharedDate%.now()` throw a `TypeError` starting with "secure mode". * See https://github.com/endojs/endo/issues/910#issuecomment-1581855420 @@ -2035,7 +2044,7 @@ function ka(t = "safe") { }, a = ({ powers: c = "none" } = {}) => { let u; return c === "original" ? u = function(...d) { - return new.target === void 0 ? oe(e, void 0, d) : sr(e, d, new.target); + return new.target === void 0 ? oe(e, void 0, d) : cr(e, d, new.target); } : u = function(...d) { if (new.target === void 0) throw v( @@ -2045,7 +2054,7 @@ function ka(t = "safe") { throw v( "secure mode Calling new %SharedDate%() with no arguments throws" ); - return sr(e, d, new.target); + return cr(e, d, new.target); }, F(u, { length: { value: 7 }, prototype: { @@ -2067,8 +2076,8 @@ function ka(t = "safe") { configurable: !0 } }), u; - }, s = a({ powers: "original" }), i = a({ powers: "none" }); - return F(s, { + }, o = a({ powers: "original" }), i = a({ powers: "none" }); + return F(o, { now: { value: e.now, writable: !0, @@ -2085,14 +2094,14 @@ function ka(t = "safe") { }), F(r, { constructor: { value: i } }), { - "%InitialDate%": s, + "%InitialDate%": o, "%SharedDate%": i }; } -function Ta(t = "safe") { +function $a(t = "safe") { if (t !== "safe" && t !== "unsafe") throw v(`unrecognized mathTaming ${t}`); - const e = Es, r = e, { random: n, ...a } = Ke(e), i = H(oo, { + const e = As, r = e, { random: n, ...a } = Je(e), i = H(lo, { ...a, random: { value: { @@ -2114,13 +2123,13 @@ function Ta(t = "safe") { "%SharedMath%": i }; } -function Ia(t = "safe") { +function Oa(t = "safe") { if (t !== "safe" && t !== "unsafe") throw v(`unrecognized regExpTaming ${t}`); - const e = ze.prototype, r = (s = {}) => { + const e = Be.prototype, r = (o = {}) => { const i = function(...l) { - return new.target === void 0 ? ze(...l) : sr(ze, l, new.target); - }, c = ue(ze, Pn); + return new.target === void 0 ? Be(...l) : cr(Be, l, new.target); + }, c = ue(Be, Cn); if (!c) throw v("no RegExp[Symbol.species] descriptor"); return F(i, { @@ -2131,7 +2140,7 @@ function Ia(t = "safe") { enumerable: !1, configurable: !1 }, - [Pn]: c + [Cn]: c }), i; }, n = r(), a = r(); return t !== "unsafe" && delete e.compile, F(e, { @@ -2141,7 +2150,7 @@ function Ia(t = "safe") { "%SharedRegExp%": a }; } -const Aa = { +const Ra = { "%ObjectPrototype%": { toString: !0 }, @@ -2158,9 +2167,9 @@ const Aa = { // https://github.com/tc39/proposal-iterator-helpers constructor: !0, // https://github.com/tc39/proposal-iterator-helpers - [Be]: !0 + [He]: !0 } -}, Lo = { +}, Zo = { "%ObjectPrototype%": { toString: !0, valueOf: !0 @@ -2171,7 +2180,7 @@ const Aa = { // set by "Google Analytics" concat: !0, // set by mobx generated code (old TS compiler?) - [Ht]: !0 + [qt]: !0 // set by mobx generated code (old TS compiler?) }, // Function.prototype has no 'prototype' property to enable. @@ -2249,10 +2258,10 @@ const Aa = { // https://github.com/tc39/proposal-iterator-helpers constructor: !0, // https://github.com/tc39/proposal-iterator-helpers - [Be]: !0 + [He]: !0 } -}, Ca = { - ...Lo, +}, La = { + ...Zo, /** * Rollup (as used at least by vega) and webpack * (as used at least by regenerator) both turn exports into assignments @@ -2305,11 +2314,11 @@ const Aa = { */ "%SetPrototype%": "*" }; -function Na(t, e, r = []) { - const n = new wt(r); +function Ma(t, e, r = []) { + const n = new St(r); function a(l, d, f, m) { if ("value" in m && m.configurable) { - const { value: p } = m, h = sn(n, f), { get: _, set: w } = ue( + const { value: p } = m, h = dn(n, f), { get: _, set: w } = ue( { get [f]() { return p; @@ -2321,7 +2330,7 @@ function Na(t, e, r = []) { f )}' of '${l}'` ); - se(this, f) ? this[f] = I : (h && console.error(v(`Override property ${f}`)), L(this, f, { + se(this, f) ? this[f] = I : (h && console.error(v(`Override property ${f}`)), M(this, f, { value: I, writable: !0, enumerable: !0, @@ -2331,12 +2340,12 @@ function Na(t, e, r = []) { }, f ); - L(_, "originalValue", { + M(_, "originalValue", { value: p, writable: !1, enumerable: !1, configurable: !1 - }), L(d, f, { + }), M(d, f, { get: _, set: w, enumerable: m.enumerable, @@ -2344,25 +2353,25 @@ function Na(t, e, r = []) { }); } } - function s(l, d, f) { + function o(l, d, f) { const m = ue(d, f); m && a(l, d, f, m); } function i(l, d) { - const f = Ke(d); - f && tt(nt(f), (m) => a(l, d, m, f[m])); + const f = Je(d); + f && nt(st(f), (m) => a(l, d, m, f[m])); } function c(l, d, f) { - for (const m of nt(f)) { + for (const m of st(f)) { const p = ue(d, m); if (!p || p.get || p.set) continue; const h = `${l}.${ie(m)}`, _ = f[m]; if (_ === !0) - s(h, d, m); + o(h, d, m); else if (_ === "*") i(h, p.value); - else if (He(_)) + else if (We(_)) c(h, p.value, _); else throw v(`Unexpected override enablement plan ${h}`); @@ -2371,15 +2380,15 @@ function Na(t, e, r = []) { let u; switch (e) { case "min": { - u = Aa; + u = Ra; break; } case "moderate": { - u = Lo; + u = Zo; break; } case "severe": { - u = Ca; + u = La; break; } default: @@ -2387,7 +2396,7 @@ function Na(t, e, r = []) { } c("root", t, u); } -const { Fail: Vr, quote: lr } = Z, $a = /^(\w*[a-z])Locale([A-Z]\w*)$/, Fo = { +const { Fail: Jr, quote: fr } = Z, Fa = /^(\w*[a-z])Locale([A-Z]\w*)$/, zo = { // See https://tc39.es/ecma262/#sec-string.prototype.localecompare localeCompare(t) { if (this === null || this === void 0) @@ -2395,45 +2404,45 @@ const { Fail: Vr, quote: lr } = Z, $a = /^(\w*[a-z])Locale([A-Z]\w*)$/, Fo = { 'Cannot localeCompare with null or undefined "this" value' ); const e = `${this}`, r = `${t}`; - return e < r ? -1 : e > r ? 1 : (e === r || Vr`expected ${lr(e)} and ${lr(r)} to compare`, 0); + return e < r ? -1 : e > r ? 1 : (e === r || Jr`expected ${fr(e)} and ${fr(r)} to compare`, 0); }, toString() { return `${this}`; } -}, Oa = Fo.localeCompare, Ra = Fo.toString; -function Ma(t, e = "safe") { +}, Da = zo.localeCompare, Ua = zo.toString; +function ja(t, e = "safe") { if (e !== "safe" && e !== "unsafe") throw v(`unrecognized localeTaming ${e}`); if (e !== "unsafe") { - L(ie.prototype, "localeCompare", { - value: Oa + M(ie.prototype, "localeCompare", { + value: Da }); - for (const r of Nt(t)) { + for (const r of Ot(t)) { const n = t[r]; - if (He(n)) - for (const a of Nt(n)) { - const s = cn($a, a); - if (s) { - typeof n[a] == "function" || Vr`expected ${lr(a)} to be a function`; - const i = `${s[1]}${s[2]}`, c = n[i]; - typeof c == "function" || Vr`function ${lr(i)} not found`, L(n, a, { value: c }); + if (We(n)) + for (const a of Ot(n)) { + const o = pn(Fa, a); + if (o) { + typeof n[a] == "function" || Jr`expected ${fr(a)} to be a function`; + const i = `${o[1]}${o[2]}`, c = n[i]; + typeof c == "function" || Jr`function ${fr(i)} not found`, M(n, a, { value: c }); } } } - L(ro.prototype, "toLocaleString", { - value: Ra + M(io.prototype, "toLocaleString", { + value: Ua }); } } -const La = (t) => ({ +const Za = (t) => ({ eval(r) { return typeof r != "string" ? r : t(r); } -}).eval, { Fail: Ln } = Z, Fa = (t) => { +}).eval, { Fail: Zn } = Z, za = (t) => { const e = function(n) { - const a = `${jr(arguments) || ""}`, s = `${Pt(arguments, ",")}`; - new ye(s, ""), new ye(a); - const i = `(function anonymous(${s} + const a = `${Br(arguments) || ""}`, o = `${Tt(arguments, ",")}`; + new ye(o, ""), new ye(a); + const i = `(function anonymous(${o} ) { ${a} })`; @@ -2448,13 +2457,13 @@ ${a} enumerable: !1, configurable: !1 } - }), G(ye) === ye.prototype || Ln`Function prototype is the same accross compartments`, G(e) === ye.prototype || Ln`Function constructor prototype is the same accross compartments`, e; -}, Da = (t) => { - L( + }), B(ye) === ye.prototype || Zn`Function prototype is the same accross compartments`, B(e) === ye.prototype || Zn`Function constructor prototype is the same accross compartments`, e; +}, Ga = (t) => { + M( t, - As, + Rs, y( - wr(H(null), { + Er(H(null), { set: y(() => { throw v( "Cannot set Symbol.unscopables of a Compartment's globalThis" @@ -2465,55 +2474,55 @@ ${a} }) ) ); -}, Do = (t) => { - for (const [e, r] of te(No)) - L(t, e, { +}, Go = (t) => { + for (const [e, r] of te(Mo)) + M(t, e, { value: r, writable: !1, enumerable: !1, configurable: !1 }); -}, jo = (t, { +}, Bo = (t, { intrinsics: e, newGlobalPropertyNames: r, makeCompartmentConstructor: n, markVirtualizedNativeFunction: a }) => { - for (const [i, c] of te($o)) - se(e, c) && L(t, i, { + for (const [i, c] of te(Fo)) + se(e, c) && M(t, i, { value: e[c], writable: !0, enumerable: !1, configurable: !0 }); for (const [i, c] of te(r)) - se(e, c) && L(t, i, { + se(e, c) && M(t, i, { value: e[c], writable: !0, enumerable: !1, configurable: !0 }); - const s = { + const o = { globalThis: t }; - s.Compartment = y( + o.Compartment = y( n( n, e, a ) ); - for (const [i, c] of te(s)) - L(t, i, { + for (const [i, c] of te(o)) + M(t, i, { value: c, writable: !0, enumerable: !1, configurable: !0 }), typeof c == "function" && a(c); -}, Wr = (t, e, r) => { +}, Xr = (t, e, r) => { { - const n = y(La(e)); - r(n), L(t, "eval", { + const n = y(Za(e)); + r(n), M(t, "eval", { value: n, writable: !0, enumerable: !1, @@ -2521,26 +2530,26 @@ ${a} }); } { - const n = y(Fa(e)); - r(n), L(t, "Function", { + const n = y(za(e)); + r(n), M(t, "Function", { value: n, writable: !0, enumerable: !1, configurable: !0 }); } -}, { Fail: ja, quote: Uo } = Z, Zo = new br( - fn, +}, { Fail: Ba, quote: Ho } = Z, Vo = new Sr( + yn, y({ get(t, e) { - ja`Please report unexpected scope handler trap: ${Uo(ie(e))}`; + Ba`Please report unexpected scope handler trap: ${Ho(ie(e))}`; } }) -), Ua = { +), Ha = { get(t, e) { }, set(t, e, r) { - throw et(`${ie(e)} is not defined`); + throw rt(`${ie(e)} is not defined`); }, has(t, e) { return e in E; @@ -2553,7 +2562,7 @@ ${a} // See https://github.com/endojs/endo/issues/1510 // TODO: report as bug to v8 or Chrome, and record issue link here. getOwnPropertyDescriptor(t, e) { - const r = Uo(ie(e)); + const r = Ho(ie(e)); console.warn( `getOwnPropertyDescriptor trap on scopeTerminatorHandler for ${r}`, v().stack @@ -2564,43 +2573,43 @@ ${a} ownKeys(t) { return []; } -}, zo = y( +}, Wo = y( H( - Zo, - Ke(Ua) + Vo, + Je(Ha) ) -), Za = new br( - fn, - zo -), Bo = (t) => { +), Va = new Sr( + yn, + Wo +), qo = (t) => { const e = { // inherit scopeTerminator behavior - ...zo, + ...Wo, // Redirect set properties to the globalObject. - set(a, s, i) { - return uo(t, s, i); + set(a, o, i) { + return go(t, o, i); }, // Always claim to have a potential property in order to be the recipient of a set - has(a, s) { + has(a, o) { return !0; } }, r = y( H( - Zo, - Ke(e) + Vo, + Je(e) ) ); - return new br( - fn, + return new Sr( + yn, r ); }; -y(Bo); -const { Fail: za } = Z, Ba = () => { +y(qo); +const { Fail: Wa } = Z, qa = () => { const t = H(null), e = y({ eval: { get() { - return delete t.eval, vo; + return delete t.eval, So; }, enumerable: !1, configurable: !0 @@ -2609,78 +2618,78 @@ const { Fail: za } = Z, Ba = () => { evalScope: t, allowNextEvalToBeUnsafe() { const { revoked: n } = r; - n !== null && za`a handler did not reset allowNextEvalToBeUnsafe ${n.err}`, F(t, e); + n !== null && Wa`a handler did not reset allowNextEvalToBeUnsafe ${n.err}`, F(t, e); }, /** @type {null | { err: any }} */ revoked: null }; return r; -}, Fn = "\\s*[@#]\\s*([a-zA-Z][a-zA-Z0-9]*)\\s*=\\s*([^\\s\\*]*)", Ga = new ze( - `(?:\\s*//${Fn}|/\\*${Fn}\\s*\\*/)\\s*$` -), hn = (t) => { +}, zn = "\\s*[@#]\\s*([a-zA-Z][a-zA-Z0-9]*)\\s*=\\s*([^\\s\\*]*)", Ka = new Be( + `(?:\\s*//${zn}|/\\*${zn}\\s*\\*/)\\s*$` +), bn = (t) => { let e = ""; for (; t.length > 0; ) { - const r = cn(Ga, t); + const r = pn(Ka, t); if (r === null) break; - t = ln(t, 0, t.length - r[0].length), r[3] === "sourceURL" ? e = r[4] : r[1] === "sourceURL" && (e = r[2]); + t = mn(t, 0, t.length - r[0].length), r[3] === "sourceURL" ? e = r[4] : r[1] === "sourceURL" && (e = r[2]); } return e; }; -function gn(t, e) { - const r = qs(t, e); +function wn(t, e) { + const r = Qs(t, e); if (r < 0) return -1; const n = t[r] === ` ` ? 1 : 0; - return go(ln(t, 0, r), ` + return wo(mn(t, 0, r), ` `).length + n; } -const Go = new ze("(?:)", "g"), Ho = (t) => { - const e = gn(t, Go); +const Ko = new Be("(?:)", "g"), Yo = (t) => { + const e = wn(t, Ko); if (e < 0) return t; - const r = hn(t); - throw Gt( + const r = bn(t); + throw Wt( `Possible HTML comment rejected at ${r}:${e}. (SES_HTML_COMMENT_REJECTED)` ); -}, Vo = (t) => ar(t, Go, (r) => r[0] === "<" ? "< ! --" : "-- >"), Wo = new ze( +}, Jo = (t) => lr(t, Ko, (r) => r[0] === "<" ? "< ! --" : "-- >"), Xo = new Be( "(^|[^.]|\\.\\.\\.)\\bimport(\\s*(?:\\(|/[/*]))", "g" -), qo = (t) => { - const e = gn(t, Wo); +), Qo = (t) => { + const e = wn(t, Xo); if (e < 0) return t; - const r = hn(t); - throw Gt( + const r = bn(t); + throw Wt( `Possible import expression rejected at ${r}:${e}. (SES_IMPORT_REJECTED)` ); -}, Ko = (t) => ar(t, Wo, (r, n, a) => `${n}__import__${a}`), Ha = new ze( +}, es = (t) => lr(t, Xo, (r, n, a) => `${n}__import__${a}`), Ya = new Be( "(^|[^.])\\beval(\\s*\\()", "g" -), Jo = (t) => { - const e = gn(t, Ha); +), ts = (t) => { + const e = wn(t, Ya); if (e < 0) return t; - const r = hn(t); - throw Gt( + const r = bn(t); + throw Wt( `Possible direct eval expression rejected at ${r}:${e}. (SES_EVAL_REJECTED)` ); -}, Yo = (t) => (t = Ho(t), t = qo(t), t), Xo = (t, e) => { +}, rs = (t) => (t = Yo(t), t = Qo(t), t), ns = (t, e) => { for (const r of e) t = r(t); return t; }; y({ - rejectHtmlComments: y(Ho), - evadeHtmlCommentTest: y(Vo), - rejectImportExpressions: y(qo), - evadeImportExpressionTest: y(Ko), - rejectSomeDirectEvalExpressions: y(Jo), - mandatoryTransforms: y(Yo), - applyTransforms: y(Xo) + rejectHtmlComments: y(Yo), + evadeHtmlCommentTest: y(Jo), + rejectImportExpressions: y(Qo), + evadeImportExpressionTest: y(es), + rejectSomeDirectEvalExpressions: y(ts), + mandatoryTransforms: y(rs), + applyTransforms: y(ns) }); -const Va = [ +const Ja = [ // 11.6.2.1 Keywords "await", "break", @@ -2735,8 +2744,8 @@ const Va = [ "false", "this", "arguments" -], Wa = /^[a-zA-Z_$][\w$]*$/, Dn = (t) => t !== "eval" && !Pr(Va, t) && an(Wa, t); -function jn(t, e) { +], Xa = /^[a-zA-Z_$][\w$]*$/, Gn = (t) => t !== "eval" && !Ir(Ja, t) && fn(Xa, t); +function Bn(t, e) { const r = ue(t, e); return r && // // The getters will not have .writable, don't let the falsyness of @@ -2753,37 +2762,37 @@ function jn(t, e) { // case where Object.prototype has been poisoned. se(r, "value"); } -const qa = (t, e = {}) => { - const r = Nt(t), n = Nt(e), a = Ge( +const Qa = (t, e = {}) => { + const r = Ot(t), n = Ot(e), a = Ve( n, - (i) => Dn(i) && jn(e, i) + (i) => Gn(i) && Bn(e, i) ); return { - globalObjectConstants: Ge( + globalObjectConstants: Ve( r, (i) => ( // Can't define a constant: it would prevent a // lookup on the endowments. - !Pr(n, i) && Dn(i) && jn(t, i) + !Ir(n, i) && Gn(i) && Bn(t, i) ) ), moduleLexicalConstants: a }; }; -function Un(t, e) { - return t.length === 0 ? "" : `const {${Pt(t, ",")}} = this.${e};`; +function Hn(t, e) { + return t.length === 0 ? "" : `const {${Tt(t, ",")}} = this.${e};`; } -const Ka = (t) => { - const { globalObjectConstants: e, moduleLexicalConstants: r } = qa( +const ei = (t) => { + const { globalObjectConstants: e, moduleLexicalConstants: r } = Qa( t.globalObject, t.moduleLexicals - ), n = Un( + ), n = Hn( e, "globalObject" - ), a = Un( + ), a = Hn( r, "moduleLexicals" - ), s = ye(` + ), o = ye(` with (this.scopeTerminator) { with (this.globalObject) { with (this.moduleLexicals) { @@ -2799,14 +2808,14 @@ const Ka = (t) => { } } `); - return oe(s, t, []); -}, { Fail: Ja } = Z, yn = ({ + return oe(o, t, []); +}, { Fail: ti } = Z, xn = ({ globalObject: t, moduleLexicals: e = {}, globalTransforms: r = [], sloppyGlobalsMode: n = !1 }) => { - const a = n ? Bo(t) : Za, s = Ba(), { evalScope: i } = s, c = y({ + const a = n ? qo(t) : Va, o = qa(), { evalScope: i } = o, c = y({ evalScope: i, moduleLexicals: e, globalObject: t, @@ -2814,44 +2823,44 @@ const Ka = (t) => { }); let u; const l = () => { - u || (u = Ka(c)); + u || (u = ei(c)); }; return { safeEvaluate: (f, m) => { const { localTransforms: p = [] } = m || {}; - l(), f = Xo(f, [ + l(), f = ns(f, [ ...p, ...r, - Yo + rs ]); let h; try { - return s.allowNextEvalToBeUnsafe(), oe(u, t, [f]); + return o.allowNextEvalToBeUnsafe(), oe(u, t, [f]); } catch (_) { throw h = _, _; } finally { const _ = "eval" in i; - delete i.eval, _ && (s.revoked = { err: h }, Ja`handler did not reset allowNextEvalToBeUnsafe ${h}`); + delete i.eval, _ && (o.revoked = { err: h }, ti`handler did not reset allowNextEvalToBeUnsafe ${h}`); } } }; -}, Ya = ") { [native code] }"; -let Rr; -const Qo = () => { - if (Rr === void 0) { - const t = new xt(); - L(on, "toString", { +}, ri = ") { [native code] }"; +let Ur; +const os = () => { + if (Ur === void 0) { + const t = new Et(); + M(un, "toString", { value: { toString() { - const r = Ys(this); - return ho(r, Ya) || !Wt(t, this) ? r : `function ${this.name}() { [native code] }`; + const r = ra(this); + return bo(r, ri) || !Yt(t, this) ? r : `function ${this.name}() { [native code] }`; } }.toString - }), Rr = y( - (r) => Ir(t, r) + }), Ur = y( + (r) => Nr(t, r) ); } - return Rr; + return Ur; }; -function Xa(t = "safe") { +function ni(t = "safe") { if (t !== "safe" && t !== "unsafe") throw v(`unrecognized domainTaming ${t}`); if (t === "unsafe") @@ -2863,7 +2872,7 @@ function Xa(t = "safe") { throw v( "SES failed to lockdown, Node.js domains have been initialized (SES_NO_DOMAINS)" ); - L(e, "domain", { + M(e, "domain", { value: null, configurable: !1, writable: !1, @@ -2871,7 +2880,7 @@ function Xa(t = "safe") { }); } } -const es = y([ +const ss = y([ ["debug", "debug"], // (fmt?, ...args) verbose level on Chrome ["log", "log"], @@ -2890,7 +2899,7 @@ const es = y([ // (fmt?, ...args) ["groupCollapsed", "log"] // (fmt?, ...args) -]), ts = y([ +]), as = y([ ["assert", "error"], // (value, fmt?, ...args) ["timeLog", "log"], @@ -2922,18 +2931,18 @@ const es = y([ // (label?) ["timeStamp", void 0] // (label?) -]), rs = y([ - ...es, - ...ts -]), Qa = (t, { shouldResetForDebugging: e = !1 } = {}) => { +]), is = y([ + ...ss, + ...as +]), oi = (t, { shouldResetForDebugging: e = !1 } = {}) => { e && t.resetErrorTagNum(); let r = []; - const n = St( - de(rs, ([i, c]) => { + const n = Pt( + de(is, ([i, c]) => { const u = (...l) => { ae(r, [i, ...l]); }; - return L(u, "name", { value: i }), [i, y(u)]; + return M(u, "name", { value: i }), [i, y(u)]; }) ); y(n); @@ -2946,17 +2955,17 @@ const es = y([ n ), takeLog: a }); }; -y(Qa); -const Tt = { +y(oi); +const At = { NOTE: "ERROR_NOTE:", MESSAGE: "ERROR_MESSAGE:" }; -y(Tt); -const ns = (t, e) => { +y(At); +const cs = (t, e) => { if (!t) return; - const { getStackString: r, tagError: n, takeMessageLogArgs: a, takeNoteLogArgsArray: s } = e, i = (w, I) => de(w, (T) => pn(T) ? (ae(I, T), `(${n(T)})`) : T), c = (w, I, N, T, D) => { - const U = n(I), q = N === Tt.MESSAGE ? `${U}:` : `${U} ${N}`, K = i(T, D); + const { getStackString: r, tagError: n, takeMessageLogArgs: a, takeNoteLogArgsArray: o } = e, i = (w, I) => de(w, (T) => vn(T) ? (ae(I, T), `(${n(T)})`) : T), c = (w, I, N, T, D) => { + const j = n(I), q = N === At.MESSAGE ? `${j}:` : `${j} ${N}`, K = i(T, D); t[w](q, ...K); }, u = (w, I, N = void 0) => { if (I.length === 0) @@ -2973,103 +2982,103 @@ const ns = (t, e) => { } finally { t.groupEnd(); } - }, l = new xt(), d = (w) => (I, N) => { + }, l = new Et(), d = (w) => (I, N) => { const T = []; - c(w, I, Tt.NOTE, N, T), u(w, T, n(I)); + c(w, I, At.NOTE, N, T), u(w, T, n(I)); }, f = (w, I) => { - if (Wt(l, I)) + if (Yt(l, I)) return; const N = n(I); - Ir(l, I); - const T = [], D = a(I), U = s( + Nr(l, I); + const T = [], D = a(I), j = o( I, d(w) ); D === void 0 ? t[w](`${N}:`, I.message) : c( w, I, - Tt.MESSAGE, + At.MESSAGE, D, T ); let q = r(I); - typeof q == "string" && q.length >= 1 && !ho(q, ` + typeof q == "string" && q.length >= 1 && !bo(q, ` `) && (q += ` `), t[w](q); - for (const K of U) - c(w, I, Tt.NOTE, K, T); + for (const K of j) + c(w, I, At.NOTE, K, T); u(w, T, N); - }, m = de(es, ([w, I]) => { + }, m = de(ss, ([w, I]) => { const N = (...T) => { - const D = [], U = i(T, D); - t[w](...U), u(w, D); + const D = [], j = i(T, D); + t[w](...j), u(w, D); }; - return L(N, "name", { value: w }), [w, y(N)]; - }), p = Ge( - ts, + return M(N, "name", { value: w }), [w, y(N)]; + }), p = Ve( + as, ([w, I]) => w in t ), h = de(p, ([w, I]) => { const N = (...T) => { t[w](...T); }; - return L(N, "name", { value: w }), [w, y(N)]; - }), _ = St([...m, ...h]); + return M(N, "name", { value: w }), [w, y(N)]; + }), _ = Pt([...m, ...h]); return ( /** @type {VirtualConsole} */ y(_) ); }; -y(ns); -const ei = (t, e, r = void 0) => { - const n = Ge( - rs, +y(cs); +const si = (t, e, r = void 0) => { + const n = Ve( + is, ([i, c]) => i in t ), a = de(n, ([i, c]) => [i, y((...l) => { (c === void 0 || e.canLog(c)) && t[i](...l); - })]), s = St(a); + })]), o = Pt(a); return ( /** @type {VirtualConsole} */ - y(s) + y(o) ); }; -y(ei); -const Zn = (t) => { - if (gt === void 0) +y(si); +const Vn = (t) => { + if (vt === void 0) return; let e = 0; - const r = new Ie(), n = (d) => { - Zs(r, d); - }, a = new Pe(), s = (d) => { - if (kr(r, d)) { - const f = Le(r, d); + const r = new Ae(), n = (d) => { + Vs(r, d); + }, a = new ke(), o = (d) => { + if (Ar(r, d)) { + const f = De(r, d); n(d), t(f); } - }, i = new gt(s); + }, i = new vt(o); return { rejectionHandledHandler: (d) => { - const f = M(a, d); + const f = L(a, d); n(f); }, unhandledRejectionHandler: (d, f) => { e += 1; const m = e; - Ae(r, m, d), ee(a, f, m), Qs(i, f, m, f); + Ce(r, m, d), ee(a, f, m), oa(i, f, m, f); }, processTerminationHandler: () => { - for (const [d, f] of zs(r)) + for (const [d, f] of Ws(r)) n(d), t(f); } }; -}, Mr = (t) => { +}, jr = (t) => { throw v(t); -}, zn = (t, e) => y((...r) => oe(t, e, r)), ti = (t = "safe", e = "platform", r = "report", n = void 0) => { - t === "safe" || t === "unsafe" || Mr(`unrecognized consoleTaming ${t}`); +}, Wn = (t, e) => y((...r) => oe(t, e, r)), ai = (t = "safe", e = "platform", r = "report", n = void 0) => { + t === "safe" || t === "unsafe" || jr(`unrecognized consoleTaming ${t}`); let a; - n === void 0 ? a = Gr : a = { - ...Gr, + n === void 0 ? a = Kr : a = { + ...Kr, getStackString: n }; - const s = ( + const o = ( /** @type {VirtualConsole} */ // eslint-disable-next-line no-nested-ternary typeof E.console < "u" ? E.console : typeof E.print == "function" ? ( @@ -3078,32 +3087,32 @@ const Zn = (t) => { // https://console.spec.whatwg.org/#logging ((l) => y({ debug: l, log: l, info: l, warn: l, error: l }))( // eslint-disable-next-line no-undef - zn(E.print) + Wn(E.print) ) ) : void 0 ); - if (s && s.log) + if (o && o.log) for (const l of ["warn", "error"]) - s[l] || L(s, l, { - value: zn(s.log, s) + o[l] || M(o, l, { + value: Wn(o.log, o) }); const i = ( /** @type {VirtualConsole} */ - t === "unsafe" ? s : ns(s, a) + t === "unsafe" ? o : cs(o, a) ), c = E.process || void 0; if (e !== "none" && typeof c == "object" && typeof c.on == "function") { let l; if (e === "platform" || e === "exit") { const { exit: d } = c; - typeof d == "function" || Mr("missing process.exit"), l = () => d(c.exitCode || -1); + typeof d == "function" || jr("missing process.exit"), l = () => d(c.exitCode || -1); } else - e === "abort" && (l = c.abort, typeof l == "function" || Mr("missing process.abort")); + e === "abort" && (l = c.abort, typeof l == "function" || jr("missing process.abort")); c.on("uncaughtException", (d) => { i.error(d), l && l(); }); } if (r !== "none" && typeof c == "object" && typeof c.on == "function") { - const d = Zn((f) => { + const d = Vn((f) => { i.error("SES_UNHANDLED_REJECTION:", f); }); d && (c.on("unhandledRejection", d.unhandledRejectionHandler), c.on("rejectionHandled", d.rejectionHandledHandler), c.on("exit", d.processTerminationHandler)); @@ -3112,7 +3121,7 @@ const Zn = (t) => { if (e !== "none" && typeof u == "object" && typeof u.addEventListener == "function" && u.addEventListener("error", (l) => { l.preventDefault(), i.error(l.error), (e === "exit" || e === "abort") && (u.location.href = "about:blank"); }), r !== "none" && typeof u == "object" && typeof u.addEventListener == "function") { - const d = Zn((f) => { + const d = Vn((f) => { i.error("SES_UNHANDLED_REJECTION:", f); }); d && (u.addEventListener("unhandledrejection", (f) => { @@ -3124,7 +3133,7 @@ const Zn = (t) => { })); } return { console: i }; -}, ri = [ +}, ii = [ // suppress 'getThis' definitely "getTypeName", // suppress 'getFunction' definitely @@ -3147,43 +3156,43 @@ const Zn = (t) => { "getScriptNameOrSourceURL", "toString" // TODO replace to use only whitelisted info -], ni = (t) => { - const r = St(de(ri, (n) => { +], ci = (t) => { + const r = Pt(de(ii, (n) => { const a = t[n]; return [n, () => oe(a, t, [])]; })); return H(r, {}); -}, oi = (t) => de(t, ni), si = /\/node_modules\//, ai = /^(?:node:)?internal\//, ii = /\/packages\/ses\/src\/error\/assert.js$/, ci = /\/packages\/eventual-send\/src\//, li = [ - si, - ai, - ii, - ci -], ui = (t) => { +}, li = (t) => de(t, ci), ui = /\/node_modules\//, di = /^(?:node:)?internal\//, fi = /\/packages\/ses\/src\/error\/assert.js$/, pi = /\/packages\/eventual-send\/src\//, mi = [ + ui, + di, + fi, + pi +], hi = (t) => { if (!t) return !0; - for (const e of li) - if (an(e, t)) + for (const e of mi) + if (fn(e, t)) return !1; return !0; -}, di = /^((?:.*[( ])?)[:/\w_-]*\/\.\.\.\/(.+)$/, fi = /^((?:.*[( ])?)[:/\w_-]*\/(packages\/.+)$/, pi = [ - di, - fi -], mi = (t) => { - for (const e of pi) { - const r = cn(e, t); +}, gi = /^((?:.*[( ])?)[:/\w_-]*\/\.\.\.\/(.+)$/, yi = /^((?:.*[( ])?)[:/\w_-]*\/(packages\/.+)$/, vi = [ + gi, + yi +], _i = (t) => { + for (const e of vi) { + const r = pn(e, t); if (r) - return Pt(Ds(r, 1), ""); + return Tt(Gs(r, 1), ""); } return t; -}, hi = (t, e, r, n) => { - const a = t.captureStackTrace, s = (p) => n === "verbose" ? !0 : ui(p.getFileName()), i = (p) => { +}, bi = (t, e, r, n) => { + const a = t.captureStackTrace, o = (p) => n === "verbose" ? !0 : hi(p.getFileName()), i = (p) => { let h = `${p}`; - return n === "concise" && (h = mi(h)), ` + return n === "concise" && (h = _i(h)), ` at ${h}`; - }, c = (p, h) => Pt( - de(Ge(h, s), i), + }, c = (p, h) => Tt( + de(Ve(h, o), i), "" - ), u = new Pe(), l = { + ), u = new ke(), l = { // The optional `optFn` argument is for cutting off the bottom of // the stack --- for capturing the stack only above the topmost // call to that function. Since this isn't the "real" captureStackTrace @@ -3194,15 +3203,15 @@ const Zn = (t) => { oe(a, t, [p, h]); return; } - uo(p, "stack", ""); + go(p, "stack", ""); }, // Shim of proposed special power, to reside by default only // in the start compartment, for getting the stack traceback // string associated with an error. // See https://tc39.es/proposal-error-stacks/ getStackString(p) { - let h = M(u, p); - if (h === void 0 && (p.stack, h = M(u, p), h || (h = { stackString: "" }, ee(u, p, h))), h.stackString !== void 0) + let h = L(u, p); + if (h === void 0 && (p.stack, h = L(u, p), h || (h = { stackString: "" }, ee(u, p, h))), h.stackString !== void 0) return h.stackString; const _ = c(p, h.callSites); return ee(u, p, { stackString: _ }), _; @@ -3216,15 +3225,15 @@ const Zn = (t) => { } }, d = l.prepareStackTrace; t.prepareStackTrace = d; - const f = new xt([d]), m = (p) => { - if (Wt(f, p)) + const f = new Et([d]), m = (p) => { + if (Yt(f, p)) return p; const h = { prepareStackTrace(_, w) { - return ee(u, _, { callSites: w }), p(_, oi(w)); + return ee(u, _, { callSites: w }), p(_, li(w)); } }; - return Ir(f, h.prepareStackTrace), h.prepareStackTrace; + return Nr(f, h.prepareStackTrace), h.prepareStackTrace; }; return F(e, { captureStackTrace: { @@ -3248,20 +3257,20 @@ const Zn = (t) => { configurable: !0 } }), l.getStackString; -}, Bn = ue(le.prototype, "stack"), Gn = Bn && Bn.get, gi = { +}, qn = ue(le.prototype, "stack"), Kn = qn && qn.get, wi = { getStackString(t) { - return typeof Gn == "function" ? oe(Gn, t, []) : "stack" in t ? `${t.stack}` : ""; + return typeof Kn == "function" ? oe(Kn, t, []) : "stack" in t ? `${t.stack}` : ""; } }; -function yi(t = "safe", e = "concise") { +function xi(t = "safe", e = "concise") { if (t !== "safe" && t !== "unsafe") throw v(`unrecognized errorTaming ${t}`); if (e !== "concise" && e !== "verbose") throw v(`unrecognized stackFiltering ${e}`); - const r = le.prototype, n = typeof le.captureStackTrace == "function" ? "v8" : "unknown", { captureStackTrace: a } = le, s = (l = {}) => { + const r = le.prototype, n = typeof le.captureStackTrace == "function" ? "v8" : "unknown", { captureStackTrace: a } = le, o = (l = {}) => { const d = function(...m) { let p; - return new.target === void 0 ? p = oe(le, this, m) : p = sr(le, m, new.target), n === "v8" && oe(a, le, [p, d]), p; + return new.target === void 0 ? p = oe(le, this, m) : p = cr(le, m, new.target), n === "v8" && oe(a, le, [p, d]), p; }; return F(d, { length: { value: 1 }, @@ -3272,12 +3281,12 @@ function yi(t = "safe", e = "concise") { configurable: !1 } }), d; - }, i = s({ powers: "original" }), c = s({ powers: "none" }); + }, i = o({ powers: "original" }), c = o({ powers: "none" }); F(r, { constructor: { value: c } }); - for (const l of va) - so(l, c); + for (const l of Sa) + uo(l, c); F(i, { stackTraceLimit: { get() { @@ -3315,7 +3324,7 @@ function yi(t = "safe", e = "concise") { }, captureStackTrace: { value: (l, d) => { - L(l, "stack", { + M(l, "stack", { value: "" }); }, @@ -3324,8 +3333,8 @@ function yi(t = "safe", e = "concise") { configurable: !0 } }); - let u = gi.getStackString; - return n === "v8" ? u = hi( + let u = wi.getStackString; + return n === "v8" ? u = bi( le, i, t, @@ -3368,22 +3377,22 @@ function yi(t = "safe", e = "concise") { "%SharedError%": c }; } -const { Fail: vi, details: qr, quote: Re } = Z, os = () => { -}, _i = (t, e) => y({ +const { Fail: Si, details: Qr, quote: Me } = Z, ls = () => { +}, Ei = (t, e) => y({ compartment: t, specifier: e -}), bi = (t, e, r) => { +}), Pi = (t, e, r) => { const n = H(null); for (const a of t) { - const s = e(a, r); - n[a] = s; + const o = e(a, r); + n[a] = o; } return y(n); -}, Hn = (t, e, r, n, a, s, i, c, u) => { - const { resolveHook: l, moduleRecords: d } = M( +}, Yn = (t, e, r, n, a, o, i, c, u) => { + const { resolveHook: l, moduleRecords: d } = L( t, r - ), f = bi( + ), f = Pi( a.imports, l, n @@ -3394,62 +3403,62 @@ const { Fail: vi, details: qr, quote: Re } = Z, os = () => { resolvedImports: f, importMeta: u }); - for (const p of ao(f)) { - const h = ur( + for (const p of fo(f)) { + const h = pr( t, e, r, p, - s, + o, i, c ); - Tr( - s, - dn(h, os, (_) => { + Cr( + o, + gn(h, ls, (_) => { ae(c, _); }) ); } - return Ae(d, n, m), m; -}, wi = async (t, e, r, n, a, s, i) => { - const { importHook: c, moduleMap: u, moduleMapHook: l, moduleRecords: d } = M( + return Ce(d, n, m), m; +}, ki = async (t, e, r, n, a, o, i) => { + const { importHook: c, moduleMap: u, moduleMapHook: l, moduleRecords: d } = L( t, r ); let f = u[n]; if (f === void 0 && l !== void 0 && (f = l(n)), typeof f == "string") Z.fail( - qr`Cannot map module ${Re(n)} to ${Re( + Qr`Cannot map module ${Me(n)} to ${Me( f )} in parent compartment, not yet implemented`, v ); else if (f !== void 0) { - const p = M(e, f); + const p = L(e, f); p === void 0 && Z.fail( - qr`Cannot map module ${Re( + Qr`Cannot map module ${Me( n )} because the value is not a module exports namespace, or is from another realm`, - et + rt ); - const h = await ur( + const h = await pr( t, e, p.compartment, p.specifier, a, - s, + o, i ); - return Ae(d, n, h), h; + return Ce(d, n, h), h; } - if (kr(d, n)) - return Le(d, n); + if (Ar(d, n)) + return De(d, n); const m = await c(n); - if ((m === null || typeof m != "object") && vi`importHook must return a promise for an object, for module ${Re( + if ((m === null || typeof m != "object") && Si`importHook must return a promise for an object, for module ${Me( n - )} in compartment ${Re(r.name)}`, m.specifier !== void 0) { + )} in compartment ${Me(r.name)}`, m.specifier !== void 0) { if (m.record !== void 0) { if (m.compartment !== void 0) throw v( @@ -3460,109 +3469,109 @@ const { Fail: vi, details: qr, quote: Re } = Z, os = () => { specifier: h = n, record: _, importMeta: w - } = m, I = Hn( + } = m, I = Yn( t, e, p, h, _, a, - s, + o, i, w ); - return Ae(d, n, I), I; + return Ce(d, n, I), I; } if (m.compartment !== void 0) { if (m.importMeta !== void 0) throw v( "Cannot redirect to an implicit record with a specified importMeta" ); - const p = await ur( + const p = await pr( t, e, m.compartment, m.specifier, a, - s, + o, i ); - return Ae(d, n, p), p; + return Ce(d, n, p), p; } throw v("Unnexpected RedirectStaticModuleInterface record shape"); } - return Hn( + return Yn( t, e, r, n, m, a, - s, + o, i ); -}, ur = async (t, e, r, n, a, s, i) => { - const { name: c } = M( +}, pr = async (t, e, r, n, a, o, i) => { + const { name: c } = L( t, r ); - let u = Le(s, r); - u === void 0 && (u = new Ie(), Ae(s, r, u)); - let l = Le(u, n); - return l !== void 0 || (l = Xs( - wi( + let u = De(o, r); + u === void 0 && (u = new Ae(), Ce(o, r, u)); + let l = De(u, n); + return l !== void 0 || (l = na( + ki( t, e, r, n, a, - s, + o, i ), (d) => { throw Z.note( d, - qr`${d.message}, loading ${Re(n)} in compartment ${Re( + Qr`${d.message}, loading ${Me(n)} in compartment ${Me( c )}` ), d; } - ), Ae(u, n, l)), l; -}, Vn = async (t, e, r, n) => { - const { name: a } = M( + ), Ce(u, n, l)), l; +}, Jn = async (t, e, r, n) => { + const { name: a } = L( t, r - ), s = new wt(), i = new Ie(), c = [], u = ur( + ), o = new St(), i = new Ae(), c = [], u = pr( t, e, r, n, - s, + o, i, c ); - Tr( - s, - dn(u, os, (l) => { + Cr( + o, + gn(u, ls, (l) => { ae(c, l); }) ); - for (const l of s) + for (const l of o) await l; if (c.length > 0) throw v( - `Failed to load module ${Re(n)} in package ${Re( + `Failed to load module ${Me(n)} in package ${Me( a - )} (${c.length} underlying failures: ${Pt( + )} (${c.length} underlying failures: ${Tt( de(c, (l) => l.message), ", " )}` ); -}, { quote: dt } = Z, xi = () => { +}, { quote: pt } = Z, Ti = () => { let t = !1; const e = H(null, { // Make this appear like an ESM module namespace object. - [Be]: { + [He]: { value: "Module", writable: !1, enumerable: !1, @@ -3574,33 +3583,33 @@ const { Fail: vi, details: qr, quote: Re } = Z, os = () => { t = !0; }, exportsTarget: e, - exportsProxy: new br(e, { + exportsProxy: new Sr(e, { get(r, n, a) { if (!t) throw v( - `Cannot get property ${dt( + `Cannot get property ${pt( n )} of module exports namespace, the module has not yet begun to execute` ); - return Os(e, n, a); + return Ds(e, n, a); }, set(r, n, a) { throw v( - `Cannot set property ${dt(n)} of module exports namespace` + `Cannot set property ${pt(n)} of module exports namespace` ); }, has(r, n) { if (!t) throw v( - `Cannot check property ${dt( + `Cannot check property ${pt( n )}, the module has not yet begun to execute` ); - return lo(e, n); + return ho(e, n); }, deleteProperty(r, n) { throw v( - `Cannot delete property ${dt(n)}s of module exports namespace` + `Cannot delete property ${pt(n)}s of module exports namespace` ); }, ownKeys(r) { @@ -3608,30 +3617,30 @@ const { Fail: vi, details: qr, quote: Re } = Z, os = () => { throw v( "Cannot enumerate keys, the module has not yet begun to execute" ); - return nt(e); + return st(e); }, getOwnPropertyDescriptor(r, n) { if (!t) throw v( - `Cannot get own property descriptor ${dt( + `Cannot get own property descriptor ${pt( n )}, the module has not yet begun to execute` ); - return Rs(e, n); + return Us(e, n); }, preventExtensions(r) { if (!t) throw v( "Cannot prevent extensions of module exports namespace, the module has not yet begun to execute" ); - return Ls(e); + return Zs(e); }, isExtensible() { if (!t) throw v( "Cannot check extensibility of module exports namespace, the module has not yet begun to execute" ); - return Ms(e); + return js(e); }, getPrototypeOf(r) { return null; @@ -3641,7 +3650,7 @@ const { Fail: vi, details: qr, quote: Re } = Z, os = () => { }, defineProperty(r, n, a) { throw v( - `Cannot define property ${dt(n)} of module exports namespace` + `Cannot define property ${pt(n)} of module exports namespace` ); }, apply(r, n, a) { @@ -3656,71 +3665,71 @@ const { Fail: vi, details: qr, quote: Re } = Z, os = () => { } }) }); -}, vn = (t, e, r, n) => { +}, Sn = (t, e, r, n) => { const { deferredExports: a } = e; - if (!kr(a, n)) { - const s = xi(); + if (!Ar(a, n)) { + const o = Ti(); ee( r, - s.exportsProxy, - _i(t, n) - ), Ae(a, n, s); + o.exportsProxy, + Ei(t, n) + ), Ce(a, n, o); } - return Le(a, n); -}, Si = (t, e) => { + return De(a, n); +}, Ii = (t, e) => { const { sloppyGlobalsMode: r = !1, __moduleShimLexicals__: n = void 0 } = e; let a; if (n === void 0 && !r) ({ safeEvaluate: a } = t); else { - let { globalTransforms: s } = t; + let { globalTransforms: o } = t; const { globalObject: i } = t; let c; - n !== void 0 && (s = void 0, c = H( + n !== void 0 && (o = void 0, c = H( null, - Ke(n) - )), { safeEvaluate: a } = yn({ + Je(n) + )), { safeEvaluate: a } = xn({ globalObject: i, moduleLexicals: c, - globalTransforms: s, + globalTransforms: o, sloppyGlobalsMode: r }); } return { safeEvaluate: a }; -}, ss = (t, e, r) => { +}, us = (t, e, r) => { if (typeof e != "string") throw v("first argument of evaluate() must be a string"); const { transforms: n = [], __evadeHtmlCommentTest__: a = !1, - __evadeImportExpressionTest__: s = !1, + __evadeImportExpressionTest__: o = !1, __rejectSomeDirectEvalExpressions__: i = !0 // Note default on } = r, c = [...n]; - a === !0 && ae(c, Vo), s === !0 && ae(c, Ko), i === !0 && ae(c, Jo); - const { safeEvaluate: u } = Si( + a === !0 && ae(c, Jo), o === !0 && ae(c, es), i === !0 && ae(c, ts); + const { safeEvaluate: u } = Ii( t, r ); return u(e, { localTransforms: c }); -}, { quote: Yt } = Z, Ei = (t, e, r, n, a, s) => { - const { exportsProxy: i, exportsTarget: c, activate: u } = vn( +}, { quote: er } = Z, Ai = (t, e, r, n, a, o) => { + const { exportsProxy: i, exportsTarget: c, activate: u } = Sn( r, - M(t, r), + L(t, r), n, a ), l = H(null); if (e.exports) { - if (!mt(e.exports) || js(e.exports, (f) => typeof f != "string")) + if (!gt(e.exports) || Bs(e.exports, (f) => typeof f != "string")) throw v( `SES third-party static module record "exports" property must be an array of strings for module ${a}` ); - tt(e.exports, (f) => { + nt(e.exports, (f) => { let m = c[f]; const p = []; - L(c, f, { + M(c, f, { get: () => m, set: (w) => { m = w; @@ -3743,7 +3752,7 @@ const { Fail: vi, details: qr, quote: Re } = Z, os = () => { notifiers: l, exportsProxy: i, execute() { - if (lo(d, "errorFromExecute")) + if (ho(d, "errorFromExecute")) throw d.errorFromExecute; if (!d.activated) { u(), d.activated = !0; @@ -3751,7 +3760,7 @@ const { Fail: vi, details: qr, quote: Re } = Z, os = () => { e.execute( c, r, - s + o ); } catch (f) { throw d.errorFromExecute = f, f; @@ -3759,10 +3768,10 @@ const { Fail: vi, details: qr, quote: Re } = Z, os = () => { } } }); -}, Pi = (t, e, r, n) => { +}, Ci = (t, e, r, n) => { const { compartment: a, - moduleSpecifier: s, + moduleSpecifier: o, staticModuleRecord: i, importMeta: c } = r, { @@ -3773,124 +3782,124 @@ const { Fail: vi, details: qr, quote: Re } = Z, os = () => { __reexportMap__: m = {}, __needsImportMeta__: p = !1, __syncModuleFunctor__: h - } = i, _ = M(t, a), { __shimTransforms__: w, importMetaHook: I } = _, { exportsProxy: N, exportsTarget: T, activate: D } = vn( + } = i, _ = L(t, a), { __shimTransforms__: w, importMetaHook: I } = _, { exportsProxy: N, exportsTarget: T, activate: D } = Sn( a, _, e, - s - ), U = H(null), q = H(null), K = H(null), De = H(null), fe = H(null); - c && wr(fe, c), p && I && I(s, fe); - const je = H(null), Je = H(null); - tt(te(d), ([pe, [z]]) => { - let B = je[z]; - if (!B) { + o + ), j = H(null), q = H(null), K = H(null), je = H(null), fe = H(null); + c && Er(fe, c), p && I && I(o, fe); + const Ze = H(null), Xe = H(null); + nt(te(d), ([pe, [z]]) => { + let G = Ze[z]; + if (!G) { let X, Q = !0, ce = []; - const J = () => { + const Y = () => { if (Q) - throw et(`binding ${Yt(z)} not yet initialized`); + throw rt(`binding ${er(z)} not yet initialized`); return X; }, ve = y((_e) => { if (!Q) throw v( - `Internal: binding ${Yt(z)} already initialized` + `Internal: binding ${er(z)} already initialized` ); X = _e; - const En = ce; + const In = ce; ce = null, Q = !1; - for (const be of En || []) + for (const be of In || []) be(_e); return _e; }); - B = { - get: J, + G = { + get: Y, notify: (_e) => { _e !== ve && (Q ? ae(ce || [], _e) : _e(X)); } - }, je[z] = B, K[z] = ve; + }, Ze[z] = G, K[z] = ve; } - U[pe] = { - get: B.get, + j[pe] = { + get: G.get, set: void 0, enumerable: !0, configurable: !1 - }, Je[pe] = B.notify; - }), tt( + }, Xe[pe] = G.notify; + }), nt( te(f), - ([pe, [z, B]]) => { - let X = je[z]; + ([pe, [z, G]]) => { + let X = Ze[z]; if (!X) { let Q, ce = !0; - const J = [], ve = () => { + const Y = [], ve = () => { if (ce) - throw et( - `binding ${Yt(pe)} not yet initialized` + throw rt( + `binding ${er(pe)} not yet initialized` ); return Q; - }, ct = y((be) => { + }, ut = y((be) => { Q = be, ce = !1; - for (const $r of J) - $r(be); + for (const Lr of Y) + Lr(be); }), _e = (be) => { if (ce) - throw et(`binding ${Yt(z)} not yet initialized`); + throw rt(`binding ${er(z)} not yet initialized`); Q = be; - for (const $r of J) - $r(be); + for (const Lr of Y) + Lr(be); }; X = { get: ve, notify: (be) => { - be !== ct && (ae(J, be), ce || be(Q)); + be !== ut && (ae(Y, be), ce || be(Q)); } - }, je[z] = X, B && L(q, z, { + }, Ze[z] = X, G && M(q, z, { get: ve, set: _e, enumerable: !0, configurable: !1 - }), De[z] = ct; + }), je[z] = ut; } - U[pe] = { + j[pe] = { get: X.get, set: void 0, enumerable: !0, configurable: !1 - }, Je[pe] = X.notify; + }, Xe[pe] = X.notify; } ); - const Ue = (pe) => { + const ze = (pe) => { pe(T); }; - Je["*"] = Ue; - function Kt(pe) { + Xe["*"] = ze; + function Xt(pe) { const z = H(null); z.default = !1; - for (const [B, X] of pe) { - const Q = Le(n, B); + for (const [G, X] of pe) { + const Q = De(n, G); Q.execute(); const { notifiers: ce } = Q; - for (const [J, ve] of X) { - const ct = ce[J]; - if (!ct) - throw Gt( - `The requested module '${B}' does not provide an export named '${J}'` + for (const [Y, ve] of X) { + const ut = ce[Y]; + if (!ut) + throw Wt( + `The requested module '${G}' does not provide an export named '${Y}'` ); for (const _e of ve) - ct(_e); + ut(_e); } - if (Pr(u, B)) - for (const [J, ve] of te( + if (Ir(u, G)) + for (const [Y, ve] of te( ce )) - z[J] === void 0 ? z[J] = ve : z[J] = !1; - if (m[B]) - for (const [J, ve] of m[B]) - z[ve] = ce[J]; + z[Y] === void 0 ? z[Y] = ve : z[Y] = !1; + if (m[G]) + for (const [Y, ve] of m[G]) + z[ve] = ce[Y]; } - for (const [B, X] of te(z)) - if (!Je[B] && X !== !1) { - Je[B] = X; + for (const [G, X] of te(z)) + if (!Xe[G] && X !== !1) { + Xe[G] = X; let Q; - X((J) => Q = J), U[B] = { + X((Y) => Q = Y), j[G] = { get() { return Q; }, @@ -3899,111 +3908,111 @@ const { Fail: vi, details: qr, quote: Re } = Z, os = () => { configurable: !1 }; } - tt( - mo(no(U)), - (B) => L(T, B, U[B]) + nt( + _o(co(j)), + (G) => M(T, G, j[G]) ), y(T), D(); } - let kt; - h !== void 0 ? kt = h : kt = ss(_, l, { + let It; + h !== void 0 ? It = h : It = us(_, l, { globalObject: a.globalThis, transforms: w, __moduleShimLexicals__: q }); - let xn = !1, Sn; - function _s() { - if (kt) { - const pe = kt; - kt = null; + let kn = !1, Tn; + function Es() { + if (It) { + const pe = It; + It = null; try { pe( y({ - imports: y(Kt), + imports: y(Xt), onceVar: y(K), - liveVar: y(De), + liveVar: y(je), importMeta: fe }) ); } catch (z) { - xn = !0, Sn = z; + kn = !0, Tn = z; } } - if (xn) - throw Sn; + if (kn) + throw Tn; } return y({ - notifiers: Je, + notifiers: Xe, exportsProxy: N, - execute: _s + execute: Es }); -}, { Fail: Qe, quote: W } = Z, as = (t, e, r, n) => { - const { name: a, moduleRecords: s } = M( +}, { Fail: tt, quote: W } = Z, ds = (t, e, r, n) => { + const { name: a, moduleRecords: o } = L( t, r - ), i = Le(s, n); + ), i = De(o, n); if (i === void 0) - throw et( + throw rt( `Missing link to module ${W(n)} from compartment ${W( a )}` ); - return Ni(t, e, i); + return Mi(t, e, i); }; -function ki(t) { +function Ni(t) { return typeof t.__syncModuleProgram__ == "string"; } -function Ti(t, e) { +function $i(t, e) { const { __fixedExportMap__: r, __liveExportMap__: n } = t; - He(r) || Qe`Property '__fixedExportMap__' of a precompiled module record must be an object, got ${W( + We(r) || tt`Property '__fixedExportMap__' of a precompiled module record must be an object, got ${W( r - )}, for module ${W(e)}`, He(n) || Qe`Property '__liveExportMap__' of a precompiled module record must be an object, got ${W( + )}, for module ${W(e)}`, We(n) || tt`Property '__liveExportMap__' of a precompiled module record must be an object, got ${W( n )}, for module ${W(e)}`; } -function Ii(t) { +function Oi(t) { return typeof t.execute == "function"; } -function Ai(t, e) { +function Ri(t, e) { const { exports: r } = t; - mt(r) || Qe`Property 'exports' of a third-party static module record must be an array, got ${W( + gt(r) || tt`Property 'exports' of a third-party static module record must be an array, got ${W( r )}, for module ${W(e)}`; } -function Ci(t, e) { - He(t) || Qe`Static module records must be of type object, got ${W( +function Li(t, e) { + We(t) || tt`Static module records must be of type object, got ${W( t )}, for module ${W(e)}`; const { imports: r, exports: n, reexports: a = [] } = t; - mt(r) || Qe`Property 'imports' of a static module record must be an array, got ${W( + gt(r) || tt`Property 'imports' of a static module record must be an array, got ${W( r - )}, for module ${W(e)}`, mt(n) || Qe`Property 'exports' of a precompiled module record must be an array, got ${W( + )}, for module ${W(e)}`, gt(n) || tt`Property 'exports' of a precompiled module record must be an array, got ${W( n - )}, for module ${W(e)}`, mt(a) || Qe`Property 'reexports' of a precompiled module record must be an array if present, got ${W( + )}, for module ${W(e)}`, gt(a) || tt`Property 'reexports' of a precompiled module record must be an array if present, got ${W( a )}, for module ${W(e)}`; } -const Ni = (t, e, r) => { - const { compartment: n, moduleSpecifier: a, resolvedImports: s, staticModuleRecord: i } = r, { instances: c } = M(t, n); - if (kr(c, a)) - return Le(c, a); - Ci(i, a); - const u = new Ie(); +const Mi = (t, e, r) => { + const { compartment: n, moduleSpecifier: a, resolvedImports: o, staticModuleRecord: i } = r, { instances: c } = L(t, n); + if (Ar(c, a)) + return De(c, a); + Li(i, a); + const u = new Ae(); let l; - if (ki(i)) - Ti(i, a), l = Pi( + if (Ni(i)) + $i(i, a), l = Ci( t, e, r, u ); - else if (Ii(i)) - Ai(i, a), l = Ei( + else if (Oi(i)) + Ri(i, a), l = Ai( t, i, n, e, a, - s + o ); else throw v( @@ -4011,42 +4020,42 @@ const Ni = (t, e, r) => { i )}` ); - Ae(c, a, l); - for (const [d, f] of te(s)) { - const m = as( + Ce(c, a, l); + for (const [d, f] of te(o)) { + const m = ds( t, e, n, f ); - Ae(u, d, m); + Ce(u, d, m); } return l; -}, { quote: Lr } = Z, Ct = new Pe(), Oe = new Pe(), Xt = (t) => { - const { importHook: e, resolveHook: r } = M(Oe, t); +}, { quote: Zr } = Z, $t = new ke(), Le = new ke(), tr = (t) => { + const { importHook: e, resolveHook: r } = L(Le, t); if (typeof e != "function" || typeof r != "function") throw v( "Compartment must be constructed with an importHook and a resolveHook for it to be able to load modules" ); -}, _n = function(e = {}, r = {}, n = {}) { +}, En = function(e = {}, r = {}, n = {}) { throw v( "Compartment.prototype.constructor is not a valid constructor." ); -}, Wn = (t, e) => { - const { execute: r, exportsProxy: n } = as( - Oe, - Ct, +}, Xn = (t, e) => { + const { execute: r, exportsProxy: n } = ds( + Le, + $t, t, e ); return r(), n; -}, bn = { - constructor: _n, +}, Pn = { + constructor: En, get globalThis() { - return M(Oe, this).globalObject; + return L(Le, this).globalObject; }, get name() { - return M(Oe, this).name; + return L(Le, this).name; }, /** * @param {string} source is a JavaScript program grammar construction. @@ -4059,17 +4068,17 @@ const Ni = (t, e, r) => { * @param {boolean} [options.__rejectSomeDirectEvalExpressions__] */ evaluate(t, e = {}) { - const r = M(Oe, this); - return ss(r, t, e); + const r = L(Le, this); + return us(r, t, e); }, module(t) { if (typeof t != "string") throw v("first argument of module() must be a string"); - Xt(this); - const { exportsProxy: e } = vn( + tr(this); + const { exportsProxy: e } = Sn( this, - M(Oe, this), - Ct, + L(Le, this), + $t, t ); return e; @@ -4077,9 +4086,9 @@ const Ni = (t, e, r) => { async import(t) { if (typeof t != "string") throw v("first argument of import() must be a string"); - return Xt(this), dn( - Vn(Oe, Ct, this, t), - () => ({ namespace: Wn( + return tr(this), gn( + Jn(Le, $t, this, t), + () => ({ namespace: Xn( /** @type {Compartment} */ this, t @@ -4089,31 +4098,31 @@ const Ni = (t, e, r) => { async load(t) { if (typeof t != "string") throw v("first argument of load() must be a string"); - return Xt(this), Vn(Oe, Ct, this, t); + return tr(this), Jn(Le, $t, this, t); }, importNow(t) { if (typeof t != "string") throw v("first argument of importNow() must be a string"); - return Xt(this), Wn( + return tr(this), Xn( /** @type {Compartment} */ this, t ); } }; -F(bn, { - [Be]: { +F(Pn, { + [He]: { value: "Compartment", writable: !1, enumerable: !1, configurable: !0 } }); -F(_n, { - prototype: { value: bn } +F(En, { + prototype: { value: Pn } }); -const Kr = (t, e, r) => { - function n(a = {}, s = {}, i = {}) { +const en = (t, e, r) => { + function n(a = {}, o = {}, i = {}) { if (new.target === void 0) throw v( "Class constructor Compartment cannot be invoked without 'new'" @@ -4126,45 +4135,45 @@ const Kr = (t, e, r) => { importHook: f, moduleMapHook: m, importMetaHook: p - } = i, h = [...u, ...l], _ = new Ie(), w = new Ie(), I = new Ie(); - for (const [D, U] of te(s || {})) { - if (typeof U == "string") + } = i, h = [...u, ...l], _ = new Ae(), w = new Ae(), I = new Ae(); + for (const [D, j] of te(o || {})) { + if (typeof j == "string") throw v( - `Cannot map module ${Lr(D)} to ${Lr( - U + `Cannot map module ${Zr(D)} to ${Zr( + j )} in parent compartment` ); - if (M(Ct, U) === void 0) - throw et( - `Cannot map module ${Lr( + if (L($t, j) === void 0) + throw rt( + `Cannot map module ${Zr( D )} because it has no known compartment in this realm` ); } const N = {}; - Da(N), Do(N); - const { safeEvaluate: T } = yn({ + Ga(N), Go(N); + const { safeEvaluate: T } = xn({ globalObject: N, globalTransforms: h, sloppyGlobalsMode: !1 }); - jo(N, { + Bo(N, { intrinsics: e, - newGlobalPropertyNames: Oo, + newGlobalPropertyNames: Do, makeCompartmentConstructor: t, markVirtualizedNativeFunction: r - }), Wr( + }), Xr( N, T, r - ), wr(N, a), ee(Oe, this, { + ), Er(N, a), ee(Le, this, { name: `${c}`, globalTransforms: h, globalObject: N, safeEvaluate: T, resolveHook: d, importHook: f, - moduleMap: s, + moduleMap: o, moduleMapHook: m, importMetaHook: p, moduleRecords: _, @@ -4173,33 +4182,33 @@ const Kr = (t, e, r) => { instances: w }); } - return n.prototype = bn, n; + return n.prototype = Pn, n; }; -function Fr(t) { - return G(t).constructor; +function zr(t) { + return B(t).constructor; } -function $i() { +function Fi() { return arguments; } -const Oi = () => { - const t = ye.prototype.constructor, e = ue($i(), "callee"), r = e && e.get, n = Ks(new ie()), a = G(n), s = Sr[io] && Hs(/./), i = s && G(s), c = Us([]), u = G(c), l = G(xs), d = Bs(new Ie()), f = G(d), m = Gs(new wt()), p = G(m), h = G(u); +const Di = () => { + const t = ye.prototype.constructor, e = ue(Fi(), "callee"), r = e && e.get, n = ea(new ie()), a = B(n), o = kr[po] && Ys(/./), i = o && B(o), c = Hs([]), u = B(c), l = B(Ts), d = qs(new Ae()), f = B(d), m = Ks(new St()), p = B(m), h = B(u); function* _() { } - const w = Fr(_), I = w.prototype; + const w = zr(_), I = w.prototype; async function* N() { } - const T = Fr( + const T = zr( N - ), D = T.prototype, U = D.prototype, q = G(U); + ), D = T.prototype, j = D.prototype, q = B(j); async function K() { } - const De = Fr(K), fe = { + const je = zr(K), fe = { "%InertFunction%": t, "%ArrayIteratorPrototype%": u, - "%InertAsyncFunction%": De, + "%InertAsyncFunction%": je, "%AsyncGenerator%": D, "%InertAsyncGeneratorFunction%": T, - "%AsyncGeneratorPrototype%": U, + "%AsyncGeneratorPrototype%": j, "%AsyncIteratorPrototype%": q, "%Generator%": I, "%InertGeneratorFunction%": w, @@ -4210,24 +4219,24 @@ const Oi = () => { "%StringIteratorPrototype%": a, "%ThrowTypeError%": r, "%TypedArray%": l, - "%InertCompartment%": _n + "%InertCompartment%": En }; - return E.Iterator && (fe["%IteratorHelperPrototype%"] = G( + return E.Iterator && (fe["%IteratorHelperPrototype%"] = B( // eslint-disable-next-line @endo/no-polymorphic-call E.Iterator.from([]).take(0) - ), fe["%WrapForValidIteratorPrototype%"] = G( + ), fe["%WrapForValidIteratorPrototype%"] = B( // eslint-disable-next-line @endo/no-polymorphic-call E.Iterator.from({ next() { } }) - )), E.AsyncIterator && (fe["%AsyncIteratorHelperPrototype%"] = G( + )), E.AsyncIterator && (fe["%AsyncIteratorHelperPrototype%"] = B( // eslint-disable-next-line @endo/no-polymorphic-call E.AsyncIterator.from([]).take(0) - ), fe["%WrapForValidAsyncIteratorPrototype%"] = G( + ), fe["%WrapForValidAsyncIteratorPrototype%"] = B( // eslint-disable-next-line @endo/no-polymorphic-call E.AsyncIterator.from({ next() { } }) )), fe; -}, is = (t, e) => { +}, fs = (t, e) => { if (e !== "safe" && e !== "unsafe") throw v(`unrecognized fakeHardenOption ${e}`); if (e === "safe" || (Object.isExtensible = () => !1, Object.isFrozen = () => !0, Object.isSealed = () => !0, Reflect.isExtensible = () => !1, t.isFake)) @@ -4235,11 +4244,11 @@ const Oi = () => { const r = (n) => n; return r.isFake = !0, y(r); }; -y(is); -const Ri = () => { - const t = At, e = t.prototype, r = { - Symbol(s) { - return t(s); +y(fs); +const Ui = () => { + const t = Nt, e = t.prototype, r = { + Symbol(o) { + return t(o); } }.Symbol; F(e, { @@ -4249,52 +4258,52 @@ const Ri = () => { } }); const n = te( - Ke(t) - ), a = St( - de(n, ([s, i]) => [ - s, + Je(t) + ), a = Pt( + de(n, ([o, i]) => [ + o, { ...i, configurable: !0 } ]) ); return F(r, a), { "%SharedSymbol%": r }; -}, Mi = (t) => { +}, ji = (t) => { try { return t(), !1; } catch { return !0; } -}, qn = (t, e, r) => { +}, Qn = (t, e, r) => { if (t === void 0) return !1; const n = ue(t, e); if (!n || "value" in n) return !1; - const { get: a, set: s } = n; - if (typeof a != "function" || typeof s != "function" || a() !== r || oe(a, t, []) !== r) + const { get: a, set: o } = n; + if (typeof a != "function" || typeof o != "function" || a() !== r || oe(a, t, []) !== r) return !1; const i = "Seems to be a setter", c = { __proto__: null }; - if (oe(s, c, [i]), c[e] !== i) + if (oe(o, c, [i]), c[e] !== i) return !1; const u = { __proto__: t }; - return oe(s, u, [i]), u[e] !== i || !Mi(() => oe(s, t, [r])) || "originalValue" in a || n.configurable === !1 ? !1 : (L(t, e, { + return oe(o, u, [i]), u[e] !== i || !ji(() => oe(o, t, [r])) || "originalValue" in a || n.configurable === !1 ? !1 : (M(t, e, { value: r, writable: !0, enumerable: n.enumerable, configurable: !0 }), !0); -}, Li = (t) => { - qn( +}, Zi = (t) => { + Qn( t["%IteratorPrototype%"], "constructor", t.Iterator - ), qn( + ), Qn( t["%IteratorPrototype%"], - Be, + He, "Iterator" ); -}, { Fail: Kn, details: Jn, quote: Yn } = Z; -let Qt, er; -const Fi = ya(), Di = () => { +}, { Fail: eo, details: to, quote: ro } = Z; +let rr, nr; +const zi = xa(), Gi = () => { let t = !1; try { t = ye( @@ -4303,7 +4312,7 @@ const Fi = ya(), Di = () => { ` eval("SES_changed = true"); return SES_changed; ` - )(vo, !1), t || delete E.SES_changed; + )(So, !1), t || delete E.SES_changed; } catch { t = !0; } @@ -4311,7 +4320,7 @@ const Fi = ya(), Di = () => { throw v( "SES cannot initialize unless 'eval' is the original intrinsic 'eval', suitable for direct-eval (dynamically scoped eval) (SES_DIRECT_EVAL)" ); -}, cs = (t = {}) => { +}, ps = (t = {}) => { const { errorTaming: e = me("LOCKDOWN_ERROR_TAMING", "safe"), errorTrapping: r = ( @@ -4323,7 +4332,7 @@ const Fi = ya(), Di = () => { me("LOCKDOWN_UNHANDLED_REJECTION_TRAPPING", "report") ), regExpTaming: a = me("LOCKDOWN_REGEXP_TAMING", "safe"), - localeTaming: s = me("LOCKDOWN_LOCALE_TAMING", "safe"), + localeTaming: o = me("LOCKDOWN_LOCALE_TAMING", "safe"), consoleTaming: i = ( /** @type {'unsafe' | 'safe' | undefined} */ me("LOCKDOWN_CONSOLE_TAMING", "safe") @@ -4332,10 +4341,10 @@ const Fi = ya(), Di = () => { stackFiltering: u = me("LOCKDOWN_STACK_FILTERING", "concise"), domainTaming: l = me("LOCKDOWN_DOMAIN_TAMING", "safe"), evalTaming: d = me("LOCKDOWN_EVAL_TAMING", "safeEval"), - overrideDebug: f = Ge( - go(me("LOCKDOWN_OVERRIDE_DEBUG", ""), ","), + overrideDebug: f = Ve( + wo(me("LOCKDOWN_OVERRIDE_DEBUG", ""), ","), /** @param {string} debugName */ - (Ue) => Ue !== "" + (ze) => ze !== "" ), __hardenTaming__: m = me("LOCKDOWN_HARDEN_TAMING", "safe"), dateTaming: p = "safe", @@ -4344,70 +4353,70 @@ const Fi = ya(), Di = () => { // deprecated ..._ } = t; - d === "unsafeEval" || d === "safeEval" || d === "noEval" || Kn`lockdown(): non supported option evalTaming: ${Yn(d)}`; - const w = nt(_); - if (w.length === 0 || Kn`lockdown(): non supported option ${Yn(w)}`, Qt === void 0 || // eslint-disable-next-line @endo/no-polymorphic-call + d === "unsafeEval" || d === "safeEval" || d === "noEval" || eo`lockdown(): non supported option evalTaming: ${ro(d)}`; + const w = st(_); + if (w.length === 0 || eo`lockdown(): non supported option ${ro(w)}`, rr === void 0 || // eslint-disable-next-line @endo/no-polymorphic-call Z.fail( - Jn`Already locked down at ${Qt} (SES_ALREADY_LOCKED_DOWN)`, + to`Already locked down at ${rr} (SES_ALREADY_LOCKED_DOWN)`, v - ), Qt = v("Prior lockdown (SES_ALREADY_LOCKED_DOWN)"), Qt.stack, Di(), E.Function.prototype.constructor !== E.Function && // @ts-ignore harden is absent on globalThis type def. + ), rr = v("Prior lockdown (SES_ALREADY_LOCKED_DOWN)"), rr.stack, Gi(), E.Function.prototype.constructor !== E.Function && // @ts-ignore harden is absent on globalThis type def. typeof E.harden == "function" && // @ts-ignore lockdown is absent on globalThis type def. typeof E.lockdown == "function" && E.Date.prototype.constructor !== E.Date && typeof E.Date.now == "function" && // @ts-ignore does not recognize that Date constructor is a special // Function. // eslint-disable-next-line @endo/no-polymorphic-call - xr(E.Date.prototype.constructor.now(), NaN)) + Pr(E.Date.prototype.constructor.now(), NaN)) throw v( "Already locked down but not by this SES instance (SES_MULTIPLE_INSTANCES)" ); - Xa(l); - const N = Qo(), { addIntrinsics: T, completePrototypes: D, finalIntrinsics: U } = Mo(), q = is(Fi, m); - T({ harden: q }), T(Pa()), T(ka(p)), T(yi(e, u)), T(Ta(h)), T(Ia(a)), T(Ri()), T(Oi()), D(); - const K = U(), De = { __proto__: null }; - typeof E.Buffer == "function" && (De.Buffer = E.Buffer); + ni(l); + const N = os(), { addIntrinsics: T, completePrototypes: D, finalIntrinsics: j } = jo(), q = fs(zi, m); + T({ harden: q }), T(Ca()), T(Na(p)), T(xi(e, u)), T($a(h)), T(Oa(a)), T(Ui()), T(Di()), D(); + const K = j(), je = { __proto__: null }; + typeof E.Buffer == "function" && (je.Buffer = E.Buffer); let fe; e !== "unsafe" && (fe = K["%InitialGetStackString%"]); - const je = ti( + const Ze = ai( i, r, n, fe ); if (E.console = /** @type {Console} */ - je.console, typeof /** @type {any} */ - je.console._times == "object" && (De.SafeMap = G( + Ze.console, typeof /** @type {any} */ + Ze.console._times == "object" && (je.SafeMap = B( // eslint-disable-next-line no-underscore-dangle /** @type {any} */ - je.console._times - )), e === "unsafe" && E.assert === Z && (E.assert = Cr(void 0, !0)), Ma(K, s), Li(K), Ea(K, N), Do(E), jo(E, { + Ze.console._times + )), e === "unsafe" && E.assert === Z && (E.assert = Or(void 0, !0)), ja(K, o), Zi(K), Aa(K, N), Go(E), Bo(E, { intrinsics: K, - newGlobalPropertyNames: $n, - makeCompartmentConstructor: Kr, + newGlobalPropertyNames: Fn, + makeCompartmentConstructor: en, markVirtualizedNativeFunction: N }), d === "noEval") - Wr( + Xr( E, - ea, + sa, N ); else if (d === "safeEval") { - const { safeEvaluate: Ue } = yn({ globalObject: E }); - Wr( + const { safeEvaluate: ze } = xn({ globalObject: E }); + Xr( E, - Ue, + ze, N ); } return () => { - er === void 0 || // eslint-disable-next-line @endo/no-polymorphic-call + nr === void 0 || // eslint-disable-next-line @endo/no-polymorphic-call Z.fail( - Jn`Already locked down at ${er} (SES_ALREADY_LOCKED_DOWN)`, + to`Already locked down at ${nr} (SES_ALREADY_LOCKED_DOWN)`, v - ), er = v( + ), nr = v( "Prior lockdown (SES_ALREADY_LOCKED_DOWN)" - ), er.stack, Na(K, c, f); - const Ue = { + ), nr.stack, Ma(K, c, f); + const ze = { intrinsics: K, - hostIntrinsics: De, + hostIntrinsics: je, globals: { // Harden evaluators Function: E.Function, @@ -4418,107 +4427,152 @@ const Fi = ya(), Di = () => { Symbol: E.Symbol } }; - for (const Kt of Nt($n)) - Ue.globals[Kt] = E[Kt]; - return q(Ue), q; + for (const Xt of Ot(Fn)) + ze.globals[Xt] = E[Xt]; + return q(ze), q; }; }; E.lockdown = (t) => { - const e = cs(t); + const e = ps(t); E.harden = e(); }; E.repairIntrinsics = (t) => { - const e = cs(t); + const e = ps(t); E.hardenIntrinsics = () => { E.harden = e(); }; }; -const ji = Qo(); -E.Compartment = Kr( - Kr, - Sa(E), - ji +const Bi = os(); +E.Compartment = en( + en, + Ia(E), + Bi ); E.assert = Z; -const Ui = ` +const Hi = (t) => { + let e = { x: 0, y: 0 }, r = { x: 0, y: 0 }, n = { x: 0, y: 0 }; + const a = (c) => { + const { clientX: u, clientY: l } = c, d = u - n.x + r.x, f = l - n.y + r.y; + e = { x: d, y: f }, t.style.transform = `translate(${d}px, ${f}px)`; + }, o = () => { + document.removeEventListener("mousemove", a), document.removeEventListener("mouseup", o); + }, i = (c) => { + n = { x: c.clientX, y: c.clientY }, r = { x: e.x, y: e.y }, document.addEventListener("mousemove", a), document.addEventListener("mouseup", o); + }; + return t.addEventListener("mousedown", i), o; +}, Vi = ` `; -class Zi extends HTMLElement { +var we, Vt; +class Wi extends HTMLElement { constructor() { - super(), this.attachShadow({ mode: "open" }); + super(); + Mr(this, we, null); + Mr(this, Vt, null); + this.attachShadow({ mode: "open" }); + } + setTheme(r) { + Re(this, we) && Re(this, we).setAttribute("data-theme", r); + } + disconnectedCallback() { + var r; + (r = Re(this, Vt)) == null || r.call(this); } connectedCallback() { - const e = this.getAttribute("title"), r = this.getAttribute("iframe-src"), n = Number(this.getAttribute("width") || "300"), a = Number(this.getAttribute("height") || "400"); - if (!e || !r) + const r = this.getAttribute("title"), n = this.getAttribute("iframe-src"), a = Number(this.getAttribute("width") || "300"), o = Number(this.getAttribute("height") || "400"); + if (!r || !n) throw new Error("title and iframe-src attributes are required"); if (!this.shadowRoot) throw new Error("Error creating shadow root"); - const s = document.createElement("div"); - s.classList.add("header"); - const i = document.createElement("h1"); - i.textContent = e, s.appendChild(i); - const c = document.createElement("button"); - c.setAttribute("type", "button"), c.innerHTML = `
    ${Ui}
    `, c.addEventListener("click", () => { + Fr(this, we, document.createElement("div")), Re(this, we).classList.add("wrapper"), Fr(this, Vt, Hi(Re(this, we))); + const i = document.createElement("div"); + i.classList.add("header"); + const c = document.createElement("h1"); + c.textContent = r, i.appendChild(c); + const u = document.createElement("button"); + u.setAttribute("type", "button"), u.innerHTML = `
    ${Vi}
    `, u.addEventListener("click", () => { this.shadowRoot && this.shadowRoot.dispatchEvent( new CustomEvent("close", { composed: !0, bubbles: !0 }) ); - }), s.appendChild(c); - const u = document.createElement("iframe"); - u.src = r, u.allow = "", u.sandbox.add( + }), i.appendChild(u); + const l = document.createElement("iframe"); + l.src = n, l.allow = "", l.sandbox.add( "allow-scripts", "allow-forms", "allow-modals", "allow-popups", "allow-popups-to-escape-sandbox", "allow-storage-access-by-user-activation" - ), this.addEventListener("message", (d) => { - u.contentWindow && u.contentWindow.postMessage(d.detail, "*"); - }), this.shadowRoot.appendChild(s), this.shadowRoot.appendChild(u); - const l = document.createElement("style"); - l.textContent = ` + ), this.addEventListener("message", (f) => { + l.contentWindow && l.contentWindow.postMessage(f.detail, "*"); + }), this.shadowRoot.appendChild(Re(this, we)), Re(this, we).appendChild(i), Re(this, we).appendChild(l); + const d = document.createElement("style"); + d.textContent = ` :host { + --spacing-4: 0.25rem; + --spacing-8: calc(var(--spacing-4) * 2); + --spacing-12: calc(var(--spacing-4) * 3); + --spacing-16: calc(var(--spacing-4) * 4); + --spacing-20: calc(var(--spacing-4) * 5); + --spacing-24: calc(var(--spacing-4) * 6); + --spacing-28: calc(var(--spacing-4) * 7); + --spacing-32: calc(var(--spacing-4) * 8); + --spacing-36: calc(var(--spacing-4) * 9); + --spacing-40: calc(var(--spacing-4) * 10); + + --font-weight-regular: 400; + --font-weight-bold: 500; + --font-line-height-s: 1.2; + --font-line-height-m: 1.4; + --font-line-height-l: 1.5; + --font-size-s: 12px; + --font-size-m: 14px; + --font-size-l: 16px; + } + + [data-theme] { + background-color: var(--color-background-primary); + color: var(--color-foreground-secondary); + } + + .wrapper { display: flex; flex-direction: column; position: fixed; inset-block-end: 10px; inset-inline-start: 10px; z-index: 1000; - padding: 20px; - border-radius: 20px; - box-shadow: 0 4px 8px rgba(0,0,0,0.1); - inline-size: ${n}px; - block-size: ${a}px; - } - - :host([data-theme="dark"]) { - background: #2e3434; - border: 1px solid #2e3434; - color: #ffffff; - } - - :host([data-theme="light"]) { - background: #ffffff; - border: 1px solid #eef0f2; - color: #18181a; + padding: 25px; + border-radius: 15px; + box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.3); + inline-size: ${a}px; + block-size: ${o}px; } .header { + align-items: center; display: flex; justify-content: space-between; + border-block-end: 2px solid var(--color-background-quaternary); + padding-block-end: var(--spacing-4); + margin-block-end: var(--spacing-20); } button { background: transparent; border: 0; cursor: pointer; + padding: 0; } h1 { - font-family: Arial, sans-serif; + font-size: var(--font-size-s); + font-weight: var(--font-weight-bold); margin: 0; - margin-block-end: 10px; + margin-inline-end: var(--spacing-4); + user-select: none; } iframe { @@ -4526,10 +4580,11 @@ class Zi extends HTMLElement { inline-size: 100%; block-size: 100%; } - `, this.shadowRoot.appendChild(l); + `, this.shadowRoot.appendChild(d); } } -customElements.define("plugin-modal", Zi); +we = new WeakMap(), Vt = new WeakMap(); +customElements.define("plugin-modal", Wi); var R; (function(t) { t.assertEqual = (a) => a; @@ -4540,40 +4595,40 @@ var R; throw new Error(); } t.assertNever = r, t.arrayToEnum = (a) => { - const s = {}; + const o = {}; for (const i of a) - s[i] = i; - return s; + o[i] = i; + return o; }, t.getValidEnumValues = (a) => { - const s = t.objectKeys(a).filter((c) => typeof a[a[c]] != "number"), i = {}; - for (const c of s) + const o = t.objectKeys(a).filter((c) => typeof a[a[c]] != "number"), i = {}; + for (const c of o) i[c] = a[c]; return t.objectValues(i); - }, t.objectValues = (a) => t.objectKeys(a).map(function(s) { - return a[s]; + }, t.objectValues = (a) => t.objectKeys(a).map(function(o) { + return a[o]; }), t.objectKeys = typeof Object.keys == "function" ? (a) => Object.keys(a) : (a) => { - const s = []; + const o = []; for (const i in a) - Object.prototype.hasOwnProperty.call(a, i) && s.push(i); - return s; - }, t.find = (a, s) => { + Object.prototype.hasOwnProperty.call(a, i) && o.push(i); + return o; + }, t.find = (a, o) => { for (const i of a) - if (s(i)) + if (o(i)) return i; }, t.isInteger = typeof Number.isInteger == "function" ? (a) => Number.isInteger(a) : (a) => typeof a == "number" && isFinite(a) && Math.floor(a) === a; - function n(a, s = " | ") { - return a.map((i) => typeof i == "string" ? `'${i}'` : i).join(s); + function n(a, o = " | ") { + return a.map((i) => typeof i == "string" ? `'${i}'` : i).join(o); } - t.joinValues = n, t.jsonStringifyReplacer = (a, s) => typeof s == "bigint" ? s.toString() : s; + t.joinValues = n, t.jsonStringifyReplacer = (a, o) => typeof o == "bigint" ? o.toString() : o; })(R || (R = {})); -var Jr; +var tn; (function(t) { t.mergeShapes = (e, r) => ({ ...e, ...r // second overwrites first }); -})(Jr || (Jr = {})); +})(tn || (tn = {})); const b = R.arrayToEnum([ "string", "nan", @@ -4595,7 +4650,7 @@ const b = R.arrayToEnum([ "never", "map", "set" -]), Ze = (t) => { +]), Ge = (t) => { switch (typeof t) { case "undefined": return b.undefined; @@ -4633,8 +4688,8 @@ const b = R.arrayToEnum([ "invalid_intersection_types", "not_multiple_of", "not_finite" -]), zi = (t) => JSON.stringify(t, null, 2).replace(/"([^"]+)":/g, "$1:"); -class xe extends Error { +]), qi = (t) => JSON.stringify(t, null, 2).replace(/"([^"]+)":/g, "$1:"); +class Se extends Error { constructor(e) { super(), this.issues = [], this.addIssue = (n) => { this.issues = [...this.issues, n]; @@ -4648,10 +4703,10 @@ class xe extends Error { return this.issues; } format(e) { - const r = e || function(s) { - return s.message; - }, n = { _errors: [] }, a = (s) => { - for (const i of s.issues) + const r = e || function(o) { + return o.message; + }, n = { _errors: [] }, a = (o) => { + for (const i of o.issues) if (i.code === "invalid_union") i.unionErrors.map(a); else if (i.code === "invalid_return_type") @@ -4689,8 +4744,8 @@ class xe extends Error { return this.flatten(); } } -xe.create = (t) => new xe(t); -const $t = (t, e) => { +Se.create = (t) => new Se(t); +const Rt = (t, e) => { let r; switch (t.code) { case g.invalid_type: @@ -4746,17 +4801,17 @@ const $t = (t, e) => { } return { message: r }; }; -let ls = $t; -function Bi(t) { - ls = t; +let ms = Rt; +function Ki(t) { + ms = t; } -function dr() { - return ls; +function mr() { + return ms; } -const fr = (t) => { - const { data: e, path: r, errorMaps: n, issueData: a } = t, s = [...r, ...a.path || []], i = { +const hr = (t) => { + const { data: e, path: r, errorMaps: n, issueData: a } = t, o = [...r, ...a.path || []], i = { ...a, - path: s + path: o }; let c = ""; const u = n.filter((l) => !!l).slice().reverse(); @@ -4764,26 +4819,26 @@ const fr = (t) => { c = l(i, { data: e, defaultError: c }).message; return { ...a, - path: s, + path: o, message: a.message || c }; -}, Gi = []; +}, Yi = []; function x(t, e) { - const r = fr({ + const r = hr({ issueData: e, data: t.data, path: t.path, errorMaps: [ t.common.contextualErrorMap, t.schemaErrorMap, - dr(), - $t + mr(), + Rt // then global default map ].filter((n) => !!n) }); t.common.issues.push(r); } -class Y { +class J { constructor() { this.value = "valid"; } @@ -4809,27 +4864,27 @@ class Y { key: await a.key, value: await a.value }); - return Y.mergeObjectSync(e, n); + return J.mergeObjectSync(e, n); } static mergeObjectSync(e, r) { const n = {}; for (const a of r) { - const { key: s, value: i } = a; - if (s.status === "aborted" || i.status === "aborted") + const { key: o, value: i } = a; + if (o.status === "aborted" || i.status === "aborted") return A; - s.status === "dirty" && e.dirty(), i.status === "dirty" && e.dirty(), s.value !== "__proto__" && (typeof i.value < "u" || a.alwaysSet) && (n[s.value] = i.value); + o.status === "dirty" && e.dirty(), i.status === "dirty" && e.dirty(), o.value !== "__proto__" && (typeof i.value < "u" || a.alwaysSet) && (n[o.value] = i.value); } return { status: e.value, value: n }; } } const A = Object.freeze({ status: "aborted" -}), us = (t) => ({ status: "dirty", value: t }), re = (t) => ({ status: "valid", value: t }), Yr = (t) => t.status === "aborted", Xr = (t) => t.status === "dirty", Ot = (t) => t.status === "valid", pr = (t) => typeof Promise < "u" && t instanceof Promise; +}), hs = (t) => ({ status: "dirty", value: t }), re = (t) => ({ status: "valid", value: t }), rn = (t) => t.status === "aborted", nn = (t) => t.status === "dirty", Lt = (t) => t.status === "valid", gr = (t) => typeof Promise < "u" && t instanceof Promise; var S; (function(t) { t.errToObj = (e) => typeof e == "string" ? { message: e } : e || {}, t.toString = (e) => typeof e == "string" ? e : e == null ? void 0 : e.message; })(S || (S = {})); -class Ce { +class Ne { constructor(e, r, n, a) { this._cachedPath = [], this.parent = e, this.data = r, this._path = n, this._key = a; } @@ -4837,8 +4892,8 @@ class Ce { return this._cachedPath.length || (this._key instanceof Array ? this._cachedPath.push(...this._path, ...this._key) : this._cachedPath.push(...this._path, this._key)), this._cachedPath; } } -const Xn = (t, e) => { - if (Ot(e)) +const no = (t, e) => { + if (Lt(e)) return { success: !0, data: e.value }; if (!t.common.issues.length) throw new Error("Validation failed but no issues detected."); @@ -4847,7 +4902,7 @@ const Xn = (t, e) => { get error() { if (this._error) return this._error; - const r = new xe(t.common.issues); + const r = new Se(t.common.issues); return this._error = r, this._error; } }; @@ -4868,13 +4923,13 @@ class $ { return this._def.description; } _getType(e) { - return Ze(e.data); + return Ge(e.data); } _getOrReturnCtx(e, r) { return r || { common: e.parent.common, data: e.data, - parsedType: Ze(e.data), + parsedType: Ge(e.data), schemaErrorMap: this._def.errorMap, path: e.path, parent: e.parent @@ -4882,11 +4937,11 @@ class $ { } _processInputParams(e) { return { - status: new Y(), + status: new J(), ctx: { common: e.parent.common, data: e.data, - parsedType: Ze(e.data), + parsedType: Ge(e.data), schemaErrorMap: this._def.errorMap, path: e.path, parent: e.parent @@ -4895,7 +4950,7 @@ class $ { } _parseSync(e) { const r = this._parse(e); - if (pr(r)) + if (gr(r)) throw new Error("Synchronous parse encountered promise."); return r; } @@ -4921,9 +4976,9 @@ class $ { schemaErrorMap: this._def.errorMap, parent: null, data: e, - parsedType: Ze(e) - }, s = this._parseSync({ data: e, path: a.path, parent: a }); - return Xn(a, s); + parsedType: Ge(e) + }, o = this._parseSync({ data: e, path: a.path, parent: a }); + return no(a, o); } async parseAsync(e, r) { const n = await this.safeParseAsync(e, r); @@ -4942,14 +4997,14 @@ class $ { schemaErrorMap: this._def.errorMap, parent: null, data: e, - parsedType: Ze(e) - }, a = this._parse({ data: e, path: n.path, parent: n }), s = await (pr(a) ? a : Promise.resolve(a)); - return Xn(n, s); + parsedType: Ge(e) + }, a = this._parse({ data: e, path: n.path, parent: n }), o = await (gr(a) ? a : Promise.resolve(a)); + return no(n, o); } refine(e, r) { const n = (a) => typeof r == "string" || typeof r > "u" ? { message: r } : typeof r == "function" ? r(a) : r; - return this._refinement((a, s) => { - const i = e(a), c = () => s.addIssue({ + return this._refinement((a, o) => { + const i = e(a), c = () => o.addIssue({ code: g.custom, ...n(a) }); @@ -4960,7 +5015,7 @@ class $ { return this._refinement((n, a) => e(n) ? !0 : (a.addIssue(typeof r == "function" ? r(n, a) : r), !1)); } _refinement(e) { - return new Ee({ + return new Pe({ schema: this, typeName: P.ZodEffects, effect: { type: "refinement", refinement: e } @@ -4970,28 +5025,28 @@ class $ { return this._refinement(e); } optional() { - return Me.create(this, this._def); + return Fe.create(this, this._def); } nullable() { - return it.create(this, this._def); + return lt.create(this, this._def); } nullish() { return this.nullable().optional(); } array() { - return Se.create(this, this._def); + return Ee.create(this, this._def); } promise() { - return bt.create(this, this._def); + return xt.create(this, this._def); } or(e) { - return Ft.create([this, e], this._def); + return Ut.create([this, e], this._def); } and(e) { - return Dt.create(this, e, this._def); + return jt.create(this, e, this._def); } transform(e) { - return new Ee({ + return new Pe({ ...C(this._def), schema: this, typeName: P.ZodEffects, @@ -5000,7 +5055,7 @@ class $ { } default(e) { const r = typeof e == "function" ? e : () => e; - return new Bt({ + return new Ht({ ...C(this._def), innerType: this, defaultValue: r, @@ -5008,7 +5063,7 @@ class $ { }); } brand() { - return new fs({ + return new ys({ typeName: P.ZodBranded, type: this, ...C(this._def) @@ -5016,7 +5071,7 @@ class $ { } catch(e) { const r = typeof e == "function" ? e : () => e; - return new yr({ + return new br({ ...C(this._def), innerType: this, catchValue: r, @@ -5031,10 +5086,10 @@ class $ { }); } pipe(e) { - return qt.create(this, e); + return Jt.create(this, e); } readonly() { - return _r.create(this); + return xr.create(this); } isOptional() { return this.safeParse(void 0).success; @@ -5043,136 +5098,136 @@ class $ { return this.safeParse(null).success; } } -const Hi = /^c[^\s-]{8,}$/i, Vi = /^[a-z][a-z0-9]*$/, Wi = /^[0-9A-HJKMNP-TV-Z]{26}$/, qi = /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i, Ki = /^(?!\.)(?!.*\.\.)([A-Z0-9_+-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i, Ji = "^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$"; -let Dr; -const Yi = /^(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))$/, Xi = /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/, Qi = (t) => t.precision ? t.offset ? new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${t.precision}}(([+-]\\d{2}(:?\\d{2})?)|Z)$`) : new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${t.precision}}Z$`) : t.precision === 0 ? t.offset ? new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(([+-]\\d{2}(:?\\d{2})?)|Z)$") : new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$") : t.offset ? new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}(:?\\d{2})?)|Z)$") : new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"); -function ec(t, e) { - return !!((e === "v4" || !e) && Yi.test(t) || (e === "v6" || !e) && Xi.test(t)); +const Ji = /^c[^\s-]{8,}$/i, Xi = /^[a-z][a-z0-9]*$/, Qi = /^[0-9A-HJKMNP-TV-Z]{26}$/, ec = /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i, tc = /^(?!\.)(?!.*\.\.)([A-Z0-9_+-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i, rc = "^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$"; +let Gr; +const nc = /^(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))$/, oc = /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/, sc = (t) => t.precision ? t.offset ? new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${t.precision}}(([+-]\\d{2}(:?\\d{2})?)|Z)$`) : new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${t.precision}}Z$`) : t.precision === 0 ? t.offset ? new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(([+-]\\d{2}(:?\\d{2})?)|Z)$") : new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$") : t.offset ? new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}(:?\\d{2})?)|Z)$") : new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$"); +function ac(t, e) { + return !!((e === "v4" || !e) && nc.test(t) || (e === "v6" || !e) && oc.test(t)); } -class we extends $ { +class xe extends $ { _parse(e) { if (this._def.coerce && (e.data = String(e.data)), this._getType(e) !== b.string) { - const s = this._getOrReturnCtx(e); + const o = this._getOrReturnCtx(e); return x( - s, + o, { code: g.invalid_type, expected: b.string, - received: s.parsedType + received: o.parsedType } // ), A; } - const n = new Y(); + const n = new J(); let a; - for (const s of this._def.checks) - if (s.kind === "min") - e.data.length < s.value && (a = this._getOrReturnCtx(e, a), x(a, { + for (const o of this._def.checks) + if (o.kind === "min") + e.data.length < o.value && (a = this._getOrReturnCtx(e, a), x(a, { code: g.too_small, - minimum: s.value, + minimum: o.value, type: "string", inclusive: !0, exact: !1, - message: s.message + message: o.message }), n.dirty()); - else if (s.kind === "max") - e.data.length > s.value && (a = this._getOrReturnCtx(e, a), x(a, { + else if (o.kind === "max") + e.data.length > o.value && (a = this._getOrReturnCtx(e, a), x(a, { code: g.too_big, - maximum: s.value, + maximum: o.value, type: "string", inclusive: !0, exact: !1, - message: s.message + message: o.message }), n.dirty()); - else if (s.kind === "length") { - const i = e.data.length > s.value, c = e.data.length < s.value; + else if (o.kind === "length") { + const i = e.data.length > o.value, c = e.data.length < o.value; (i || c) && (a = this._getOrReturnCtx(e, a), i ? x(a, { code: g.too_big, - maximum: s.value, + maximum: o.value, type: "string", inclusive: !0, exact: !0, - message: s.message + message: o.message }) : c && x(a, { code: g.too_small, - minimum: s.value, + minimum: o.value, type: "string", inclusive: !0, exact: !0, - message: s.message + message: o.message }), n.dirty()); - } else if (s.kind === "email") - Ki.test(e.data) || (a = this._getOrReturnCtx(e, a), x(a, { + } else if (o.kind === "email") + tc.test(e.data) || (a = this._getOrReturnCtx(e, a), x(a, { validation: "email", code: g.invalid_string, - message: s.message + message: o.message }), n.dirty()); - else if (s.kind === "emoji") - Dr || (Dr = new RegExp(Ji, "u")), Dr.test(e.data) || (a = this._getOrReturnCtx(e, a), x(a, { + else if (o.kind === "emoji") + Gr || (Gr = new RegExp(rc, "u")), Gr.test(e.data) || (a = this._getOrReturnCtx(e, a), x(a, { validation: "emoji", code: g.invalid_string, - message: s.message + message: o.message }), n.dirty()); - else if (s.kind === "uuid") - qi.test(e.data) || (a = this._getOrReturnCtx(e, a), x(a, { + else if (o.kind === "uuid") + ec.test(e.data) || (a = this._getOrReturnCtx(e, a), x(a, { validation: "uuid", code: g.invalid_string, - message: s.message + message: o.message }), n.dirty()); - else if (s.kind === "cuid") - Hi.test(e.data) || (a = this._getOrReturnCtx(e, a), x(a, { + else if (o.kind === "cuid") + Ji.test(e.data) || (a = this._getOrReturnCtx(e, a), x(a, { validation: "cuid", code: g.invalid_string, - message: s.message + message: o.message }), n.dirty()); - else if (s.kind === "cuid2") - Vi.test(e.data) || (a = this._getOrReturnCtx(e, a), x(a, { + else if (o.kind === "cuid2") + Xi.test(e.data) || (a = this._getOrReturnCtx(e, a), x(a, { validation: "cuid2", code: g.invalid_string, - message: s.message + message: o.message }), n.dirty()); - else if (s.kind === "ulid") - Wi.test(e.data) || (a = this._getOrReturnCtx(e, a), x(a, { + else if (o.kind === "ulid") + Qi.test(e.data) || (a = this._getOrReturnCtx(e, a), x(a, { validation: "ulid", code: g.invalid_string, - message: s.message + message: o.message }), n.dirty()); - else if (s.kind === "url") + else if (o.kind === "url") try { new URL(e.data); } catch { a = this._getOrReturnCtx(e, a), x(a, { validation: "url", code: g.invalid_string, - message: s.message + message: o.message }), n.dirty(); } else - s.kind === "regex" ? (s.regex.lastIndex = 0, s.regex.test(e.data) || (a = this._getOrReturnCtx(e, a), x(a, { + o.kind === "regex" ? (o.regex.lastIndex = 0, o.regex.test(e.data) || (a = this._getOrReturnCtx(e, a), x(a, { validation: "regex", code: g.invalid_string, - message: s.message - }), n.dirty())) : s.kind === "trim" ? e.data = e.data.trim() : s.kind === "includes" ? e.data.includes(s.value, s.position) || (a = this._getOrReturnCtx(e, a), x(a, { + message: o.message + }), n.dirty())) : o.kind === "trim" ? e.data = e.data.trim() : o.kind === "includes" ? e.data.includes(o.value, o.position) || (a = this._getOrReturnCtx(e, a), x(a, { code: g.invalid_string, - validation: { includes: s.value, position: s.position }, - message: s.message - }), n.dirty()) : s.kind === "toLowerCase" ? e.data = e.data.toLowerCase() : s.kind === "toUpperCase" ? e.data = e.data.toUpperCase() : s.kind === "startsWith" ? e.data.startsWith(s.value) || (a = this._getOrReturnCtx(e, a), x(a, { + validation: { includes: o.value, position: o.position }, + message: o.message + }), n.dirty()) : o.kind === "toLowerCase" ? e.data = e.data.toLowerCase() : o.kind === "toUpperCase" ? e.data = e.data.toUpperCase() : o.kind === "startsWith" ? e.data.startsWith(o.value) || (a = this._getOrReturnCtx(e, a), x(a, { code: g.invalid_string, - validation: { startsWith: s.value }, - message: s.message - }), n.dirty()) : s.kind === "endsWith" ? e.data.endsWith(s.value) || (a = this._getOrReturnCtx(e, a), x(a, { + validation: { startsWith: o.value }, + message: o.message + }), n.dirty()) : o.kind === "endsWith" ? e.data.endsWith(o.value) || (a = this._getOrReturnCtx(e, a), x(a, { code: g.invalid_string, - validation: { endsWith: s.value }, - message: s.message - }), n.dirty()) : s.kind === "datetime" ? Qi(s).test(e.data) || (a = this._getOrReturnCtx(e, a), x(a, { + validation: { endsWith: o.value }, + message: o.message + }), n.dirty()) : o.kind === "datetime" ? sc(o).test(e.data) || (a = this._getOrReturnCtx(e, a), x(a, { code: g.invalid_string, validation: "datetime", - message: s.message - }), n.dirty()) : s.kind === "ip" ? ec(e.data, s.version) || (a = this._getOrReturnCtx(e, a), x(a, { + message: o.message + }), n.dirty()) : o.kind === "ip" ? ac(e.data, o.version) || (a = this._getOrReturnCtx(e, a), x(a, { validation: "ip", code: g.invalid_string, - message: s.message - }), n.dirty()) : R.assertNever(s); + message: o.message + }), n.dirty()) : R.assertNever(o); return { status: n.value, value: e.data }; } _regex(e, r, n) { @@ -5183,7 +5238,7 @@ class we extends $ { }); } _addCheck(e) { - return new we({ + return new xe({ ...this._def, checks: [...this._def.checks, e] }); @@ -5284,19 +5339,19 @@ class we extends $ { return this.min(1, S.errToObj(e)); } trim() { - return new we({ + return new xe({ ...this._def, checks: [...this._def.checks, { kind: "trim" }] }); } toLowerCase() { - return new we({ + return new xe({ ...this._def, checks: [...this._def.checks, { kind: "toLowerCase" }] }); } toUpperCase() { - return new we({ + return new xe({ ...this._def, checks: [...this._def.checks, { kind: "toUpperCase" }] }); @@ -5341,62 +5396,62 @@ class we extends $ { return e; } } -we.create = (t) => { +xe.create = (t) => { var e; - return new we({ + return new xe({ checks: [], typeName: P.ZodString, coerce: (e = t == null ? void 0 : t.coerce) !== null && e !== void 0 ? e : !1, ...C(t) }); }; -function tc(t, e) { - const r = (t.toString().split(".")[1] || "").length, n = (e.toString().split(".")[1] || "").length, a = r > n ? r : n, s = parseInt(t.toFixed(a).replace(".", "")), i = parseInt(e.toFixed(a).replace(".", "")); - return s % i / Math.pow(10, a); +function ic(t, e) { + const r = (t.toString().split(".")[1] || "").length, n = (e.toString().split(".")[1] || "").length, a = r > n ? r : n, o = parseInt(t.toFixed(a).replace(".", "")), i = parseInt(e.toFixed(a).replace(".", "")); + return o % i / Math.pow(10, a); } -class Ve extends $ { +class qe extends $ { constructor() { super(...arguments), this.min = this.gte, this.max = this.lte, this.step = this.multipleOf; } _parse(e) { if (this._def.coerce && (e.data = Number(e.data)), this._getType(e) !== b.number) { - const s = this._getOrReturnCtx(e); - return x(s, { + const o = this._getOrReturnCtx(e); + return x(o, { code: g.invalid_type, expected: b.number, - received: s.parsedType + received: o.parsedType }), A; } let n; - const a = new Y(); - for (const s of this._def.checks) - s.kind === "int" ? R.isInteger(e.data) || (n = this._getOrReturnCtx(e, n), x(n, { + const a = new J(); + for (const o of this._def.checks) + o.kind === "int" ? R.isInteger(e.data) || (n = this._getOrReturnCtx(e, n), x(n, { code: g.invalid_type, expected: "integer", received: "float", - message: s.message - }), a.dirty()) : s.kind === "min" ? (s.inclusive ? e.data < s.value : e.data <= s.value) && (n = this._getOrReturnCtx(e, n), x(n, { + message: o.message + }), a.dirty()) : o.kind === "min" ? (o.inclusive ? e.data < o.value : e.data <= o.value) && (n = this._getOrReturnCtx(e, n), x(n, { code: g.too_small, - minimum: s.value, + minimum: o.value, type: "number", - inclusive: s.inclusive, + inclusive: o.inclusive, exact: !1, - message: s.message - }), a.dirty()) : s.kind === "max" ? (s.inclusive ? e.data > s.value : e.data >= s.value) && (n = this._getOrReturnCtx(e, n), x(n, { + message: o.message + }), a.dirty()) : o.kind === "max" ? (o.inclusive ? e.data > o.value : e.data >= o.value) && (n = this._getOrReturnCtx(e, n), x(n, { code: g.too_big, - maximum: s.value, + maximum: o.value, type: "number", - inclusive: s.inclusive, + inclusive: o.inclusive, exact: !1, - message: s.message - }), a.dirty()) : s.kind === "multipleOf" ? tc(e.data, s.value) !== 0 && (n = this._getOrReturnCtx(e, n), x(n, { + message: o.message + }), a.dirty()) : o.kind === "multipleOf" ? ic(e.data, o.value) !== 0 && (n = this._getOrReturnCtx(e, n), x(n, { code: g.not_multiple_of, - multipleOf: s.value, - message: s.message - }), a.dirty()) : s.kind === "finite" ? Number.isFinite(e.data) || (n = this._getOrReturnCtx(e, n), x(n, { + multipleOf: o.value, + message: o.message + }), a.dirty()) : o.kind === "finite" ? Number.isFinite(e.data) || (n = this._getOrReturnCtx(e, n), x(n, { code: g.not_finite, - message: s.message - }), a.dirty()) : R.assertNever(s); + message: o.message + }), a.dirty()) : R.assertNever(o); return { status: a.value, value: e.data }; } gte(e, r) { @@ -5412,7 +5467,7 @@ class Ve extends $ { return this.setLimit("max", e, !1, S.toString(r)); } setLimit(e, r, n, a) { - return new Ve({ + return new qe({ ...this._def, checks: [ ...this._def.checks, @@ -5426,7 +5481,7 @@ class Ve extends $ { }); } _addCheck(e) { - return new Ve({ + return new qe({ ...this._def, checks: [...this._def.checks, e] }); @@ -5520,45 +5575,45 @@ class Ve extends $ { return Number.isFinite(r) && Number.isFinite(e); } } -Ve.create = (t) => new Ve({ +qe.create = (t) => new qe({ checks: [], typeName: P.ZodNumber, coerce: (t == null ? void 0 : t.coerce) || !1, ...C(t) }); -class We extends $ { +class Ke extends $ { constructor() { super(...arguments), this.min = this.gte, this.max = this.lte; } _parse(e) { if (this._def.coerce && (e.data = BigInt(e.data)), this._getType(e) !== b.bigint) { - const s = this._getOrReturnCtx(e); - return x(s, { + const o = this._getOrReturnCtx(e); + return x(o, { code: g.invalid_type, expected: b.bigint, - received: s.parsedType + received: o.parsedType }), A; } let n; - const a = new Y(); - for (const s of this._def.checks) - s.kind === "min" ? (s.inclusive ? e.data < s.value : e.data <= s.value) && (n = this._getOrReturnCtx(e, n), x(n, { + const a = new J(); + for (const o of this._def.checks) + o.kind === "min" ? (o.inclusive ? e.data < o.value : e.data <= o.value) && (n = this._getOrReturnCtx(e, n), x(n, { code: g.too_small, type: "bigint", - minimum: s.value, - inclusive: s.inclusive, - message: s.message - }), a.dirty()) : s.kind === "max" ? (s.inclusive ? e.data > s.value : e.data >= s.value) && (n = this._getOrReturnCtx(e, n), x(n, { + minimum: o.value, + inclusive: o.inclusive, + message: o.message + }), a.dirty()) : o.kind === "max" ? (o.inclusive ? e.data > o.value : e.data >= o.value) && (n = this._getOrReturnCtx(e, n), x(n, { code: g.too_big, type: "bigint", - maximum: s.value, - inclusive: s.inclusive, - message: s.message - }), a.dirty()) : s.kind === "multipleOf" ? e.data % s.value !== BigInt(0) && (n = this._getOrReturnCtx(e, n), x(n, { + maximum: o.value, + inclusive: o.inclusive, + message: o.message + }), a.dirty()) : o.kind === "multipleOf" ? e.data % o.value !== BigInt(0) && (n = this._getOrReturnCtx(e, n), x(n, { code: g.not_multiple_of, - multipleOf: s.value, - message: s.message - }), a.dirty()) : R.assertNever(s); + multipleOf: o.value, + message: o.message + }), a.dirty()) : R.assertNever(o); return { status: a.value, value: e.data }; } gte(e, r) { @@ -5574,7 +5629,7 @@ class We extends $ { return this.setLimit("max", e, !1, S.toString(r)); } setLimit(e, r, n, a) { - return new We({ + return new Ke({ ...this._def, checks: [ ...this._def.checks, @@ -5588,7 +5643,7 @@ class We extends $ { }); } _addCheck(e) { - return new We({ + return new Ke({ ...this._def, checks: [...this._def.checks, e] }); @@ -5645,16 +5700,16 @@ class We extends $ { return e; } } -We.create = (t) => { +Ke.create = (t) => { var e; - return new We({ + return new Ke({ checks: [], typeName: P.ZodBigInt, coerce: (e = t == null ? void 0 : t.coerce) !== null && e !== void 0 ? e : !1, ...C(t) }); }; -class Rt extends $ { +class Mt extends $ { _parse(e) { if (this._def.coerce && (e.data = !!e.data), this._getType(e) !== b.boolean) { const n = this._getOrReturnCtx(e); @@ -5667,52 +5722,52 @@ class Rt extends $ { return re(e.data); } } -Rt.create = (t) => new Rt({ +Mt.create = (t) => new Mt({ typeName: P.ZodBoolean, coerce: (t == null ? void 0 : t.coerce) || !1, ...C(t) }); -class st extends $ { +class it extends $ { _parse(e) { if (this._def.coerce && (e.data = new Date(e.data)), this._getType(e) !== b.date) { - const s = this._getOrReturnCtx(e); - return x(s, { + const o = this._getOrReturnCtx(e); + return x(o, { code: g.invalid_type, expected: b.date, - received: s.parsedType + received: o.parsedType }), A; } if (isNaN(e.data.getTime())) { - const s = this._getOrReturnCtx(e); - return x(s, { + const o = this._getOrReturnCtx(e); + return x(o, { code: g.invalid_date }), A; } - const n = new Y(); + const n = new J(); let a; - for (const s of this._def.checks) - s.kind === "min" ? e.data.getTime() < s.value && (a = this._getOrReturnCtx(e, a), x(a, { + for (const o of this._def.checks) + o.kind === "min" ? e.data.getTime() < o.value && (a = this._getOrReturnCtx(e, a), x(a, { code: g.too_small, - message: s.message, + message: o.message, inclusive: !0, exact: !1, - minimum: s.value, + minimum: o.value, type: "date" - }), n.dirty()) : s.kind === "max" ? e.data.getTime() > s.value && (a = this._getOrReturnCtx(e, a), x(a, { + }), n.dirty()) : o.kind === "max" ? e.data.getTime() > o.value && (a = this._getOrReturnCtx(e, a), x(a, { code: g.too_big, - message: s.message, + message: o.message, inclusive: !0, exact: !1, - maximum: s.value, + maximum: o.value, type: "date" - }), n.dirty()) : R.assertNever(s); + }), n.dirty()) : R.assertNever(o); return { status: n.value, value: new Date(e.data.getTime()) }; } _addCheck(e) { - return new st({ + return new it({ ...this._def, checks: [...this._def.checks, e] }); @@ -5744,13 +5799,13 @@ class st extends $ { return e != null ? new Date(e) : null; } } -st.create = (t) => new st({ +it.create = (t) => new it({ checks: [], coerce: (t == null ? void 0 : t.coerce) || !1, typeName: P.ZodDate, ...C(t) }); -class mr extends $ { +class yr extends $ { _parse(e) { if (this._getType(e) !== b.symbol) { const n = this._getOrReturnCtx(e); @@ -5763,11 +5818,11 @@ class mr extends $ { return re(e.data); } } -mr.create = (t) => new mr({ +yr.create = (t) => new yr({ typeName: P.ZodSymbol, ...C(t) }); -class Mt extends $ { +class Ft extends $ { _parse(e) { if (this._getType(e) !== b.undefined) { const n = this._getOrReturnCtx(e); @@ -5780,11 +5835,11 @@ class Mt extends $ { return re(e.data); } } -Mt.create = (t) => new Mt({ +Ft.create = (t) => new Ft({ typeName: P.ZodUndefined, ...C(t) }); -class Lt extends $ { +class Dt extends $ { _parse(e) { if (this._getType(e) !== b.null) { const n = this._getOrReturnCtx(e); @@ -5797,11 +5852,11 @@ class Lt extends $ { return re(e.data); } } -Lt.create = (t) => new Lt({ +Dt.create = (t) => new Dt({ typeName: P.ZodNull, ...C(t) }); -class _t extends $ { +class wt extends $ { constructor() { super(...arguments), this._any = !0; } @@ -5809,11 +5864,11 @@ class _t extends $ { return re(e.data); } } -_t.create = (t) => new _t({ +wt.create = (t) => new wt({ typeName: P.ZodAny, ...C(t) }); -class rt extends $ { +class ot extends $ { constructor() { super(...arguments), this._unknown = !0; } @@ -5821,11 +5876,11 @@ class rt extends $ { return re(e.data); } } -rt.create = (t) => new rt({ +ot.create = (t) => new ot({ typeName: P.ZodUnknown, ...C(t) }); -class Fe extends $ { +class Ue extends $ { _parse(e) { const r = this._getOrReturnCtx(e); return x(r, { @@ -5835,11 +5890,11 @@ class Fe extends $ { }), A; } } -Fe.create = (t) => new Fe({ +Ue.create = (t) => new Ue({ typeName: P.ZodNever, ...C(t) }); -class hr extends $ { +class vr extends $ { _parse(e) { if (this._getType(e) !== b.undefined) { const n = this._getOrReturnCtx(e); @@ -5852,11 +5907,11 @@ class hr extends $ { return re(e.data); } } -hr.create = (t) => new hr({ +vr.create = (t) => new vr({ typeName: P.ZodVoid, ...C(t) }); -class Se extends $ { +class Ee extends $ { _parse(e) { const { ctx: r, status: n } = this._processInputParams(e), a = this._def; if (r.parsedType !== b.array) @@ -5892,27 +5947,27 @@ class Se extends $ { exact: !1, message: a.maxLength.message }), n.dirty()), r.common.async) - return Promise.all([...r.data].map((i, c) => a.type._parseAsync(new Ce(r, i, r.path, c)))).then((i) => Y.mergeArray(n, i)); - const s = [...r.data].map((i, c) => a.type._parseSync(new Ce(r, i, r.path, c))); - return Y.mergeArray(n, s); + return Promise.all([...r.data].map((i, c) => a.type._parseAsync(new Ne(r, i, r.path, c)))).then((i) => J.mergeArray(n, i)); + const o = [...r.data].map((i, c) => a.type._parseSync(new Ne(r, i, r.path, c))); + return J.mergeArray(n, o); } get element() { return this._def.type; } min(e, r) { - return new Se({ + return new Ee({ ...this._def, minLength: { value: e, message: S.toString(r) } }); } max(e, r) { - return new Se({ + return new Ee({ ...this._def, maxLength: { value: e, message: S.toString(r) } }); } length(e, r) { - return new Se({ + return new Ee({ ...this._def, exactLength: { value: e, message: S.toString(r) } }); @@ -5921,7 +5976,7 @@ class Se extends $ { return this.min(1, e); } } -Se.create = (t, e) => new Se({ +Ee.create = (t, e) => new Ee({ type: t, minLength: null, maxLength: null, @@ -5929,24 +5984,24 @@ Se.create = (t, e) => new Se({ typeName: P.ZodArray, ...C(e) }); -function pt(t) { - if (t instanceof j) { +function ht(t) { + if (t instanceof U) { const e = {}; for (const r in t.shape) { const n = t.shape[r]; - e[r] = Me.create(pt(n)); + e[r] = Fe.create(ht(n)); } - return new j({ + return new U({ ...t._def, shape: () => e }); } else - return t instanceof Se ? new Se({ + return t instanceof Ee ? new Ee({ ...t._def, - type: pt(t.element) - }) : t instanceof Me ? Me.create(pt(t.unwrap())) : t instanceof it ? it.create(pt(t.unwrap())) : t instanceof Ne ? Ne.create(t.items.map((e) => pt(e))) : t; + type: ht(t.element) + }) : t instanceof Fe ? Fe.create(ht(t.unwrap())) : t instanceof lt ? lt.create(ht(t.unwrap())) : t instanceof $e ? $e.create(t.items.map((e) => ht(e))) : t; } -class j extends $ { +class U extends $ { constructor() { super(...arguments), this._cached = null, this.nonstrict = this.passthrough, this.augment = this.extend; } @@ -5965,20 +6020,20 @@ class j extends $ { received: l.parsedType }), A; } - const { status: n, ctx: a } = this._processInputParams(e), { shape: s, keys: i } = this._getCached(), c = []; - if (!(this._def.catchall instanceof Fe && this._def.unknownKeys === "strip")) + const { status: n, ctx: a } = this._processInputParams(e), { shape: o, keys: i } = this._getCached(), c = []; + if (!(this._def.catchall instanceof Ue && this._def.unknownKeys === "strip")) for (const l in a.data) i.includes(l) || c.push(l); const u = []; for (const l of i) { - const d = s[l], f = a.data[l]; + const d = o[l], f = a.data[l]; u.push({ key: { status: "valid", value: l }, - value: d._parse(new Ce(a, f, a.path, l)), + value: d._parse(new Ne(a, f, a.path, l)), alwaysSet: l in a.data }); } - if (this._def.catchall instanceof Fe) { + if (this._def.catchall instanceof Ue) { const l = this._def.unknownKeys; if (l === "passthrough") for (const d of c) @@ -6000,7 +6055,7 @@ class j extends $ { u.push({ key: { status: "valid", value: d }, value: l._parse( - new Ce(a, f, a.path, d) + new Ne(a, f, a.path, d) //, ctx.child(key), value, getParsedType(value) ), alwaysSet: d in a.data @@ -6018,19 +6073,19 @@ class j extends $ { }); } return l; - }).then((l) => Y.mergeObjectSync(n, l)) : Y.mergeObjectSync(n, u); + }).then((l) => J.mergeObjectSync(n, l)) : J.mergeObjectSync(n, u); } get shape() { return this._def.shape(); } strict(e) { - return S.errToObj, new j({ + return S.errToObj, new U({ ...this._def, unknownKeys: "strict", ...e !== void 0 ? { errorMap: (r, n) => { - var a, s, i, c; - const u = (i = (s = (a = this._def).errorMap) === null || s === void 0 ? void 0 : s.call(a, r, n).message) !== null && i !== void 0 ? i : n.defaultError; + var a, o, i, c; + const u = (i = (o = (a = this._def).errorMap) === null || o === void 0 ? void 0 : o.call(a, r, n).message) !== null && i !== void 0 ? i : n.defaultError; return r.code === "unrecognized_keys" ? { message: (c = S.errToObj(e).message) !== null && c !== void 0 ? c : u } : { @@ -6041,13 +6096,13 @@ class j extends $ { }); } strip() { - return new j({ + return new U({ ...this._def, unknownKeys: "strip" }); } passthrough() { - return new j({ + return new U({ ...this._def, unknownKeys: "passthrough" }); @@ -6070,7 +6125,7 @@ class j extends $ { // }) as any; // }; extend(e) { - return new j({ + return new U({ ...this._def, shape: () => ({ ...this._def.shape(), @@ -6084,7 +6139,7 @@ class j extends $ { * upgrade if you are experiencing issues. */ merge(e) { - return new j({ + return new U({ unknownKeys: e._def.unknownKeys, catchall: e._def.catchall, shape: () => ({ @@ -6154,7 +6209,7 @@ class j extends $ { // return merged; // } catchall(e) { - return new j({ + return new U({ ...this._def, catchall: e }); @@ -6163,7 +6218,7 @@ class j extends $ { const r = {}; return R.objectKeys(e).forEach((n) => { e[n] && this.shape[n] && (r[n] = this.shape[n]); - }), new j({ + }), new U({ ...this._def, shape: () => r }); @@ -6172,7 +6227,7 @@ class j extends $ { const r = {}; return R.objectKeys(this.shape).forEach((n) => { e[n] || (r[n] = this.shape[n]); - }), new j({ + }), new U({ ...this._def, shape: () => r }); @@ -6181,14 +6236,14 @@ class j extends $ { * @deprecated */ deepPartial() { - return pt(this); + return ht(this); } partial(e) { const r = {}; return R.objectKeys(this.shape).forEach((n) => { const a = this.shape[n]; e && !e[n] ? r[n] = a : r[n] = a.optional(); - }), new j({ + }), new U({ ...this._def, shape: () => r }); @@ -6199,59 +6254,59 @@ class j extends $ { if (e && !e[n]) r[n] = this.shape[n]; else { - let s = this.shape[n]; - for (; s instanceof Me; ) - s = s._def.innerType; - r[n] = s; + let o = this.shape[n]; + for (; o instanceof Fe; ) + o = o._def.innerType; + r[n] = o; } - }), new j({ + }), new U({ ...this._def, shape: () => r }); } keyof() { - return ds(R.objectKeys(this.shape)); + return gs(R.objectKeys(this.shape)); } } -j.create = (t, e) => new j({ +U.create = (t, e) => new U({ shape: () => t, unknownKeys: "strip", - catchall: Fe.create(), + catchall: Ue.create(), typeName: P.ZodObject, ...C(e) }); -j.strictCreate = (t, e) => new j({ +U.strictCreate = (t, e) => new U({ shape: () => t, unknownKeys: "strict", - catchall: Fe.create(), + catchall: Ue.create(), typeName: P.ZodObject, ...C(e) }); -j.lazycreate = (t, e) => new j({ +U.lazycreate = (t, e) => new U({ shape: t, unknownKeys: "strip", - catchall: Fe.create(), + catchall: Ue.create(), typeName: P.ZodObject, ...C(e) }); -class Ft extends $ { +class Ut extends $ { _parse(e) { const { ctx: r } = this._processInputParams(e), n = this._def.options; - function a(s) { - for (const c of s) + function a(o) { + for (const c of o) if (c.result.status === "valid") return c.result; - for (const c of s) + for (const c of o) if (c.result.status === "dirty") return r.common.issues.push(...c.ctx.common.issues), c.result; - const i = s.map((c) => new xe(c.ctx.common.issues)); + const i = o.map((c) => new Se(c.ctx.common.issues)); return x(r, { code: g.invalid_union, unionErrors: i }), A; } if (r.common.async) - return Promise.all(n.map(async (s) => { + return Promise.all(n.map(async (o) => { const i = { ...r, common: { @@ -6261,7 +6316,7 @@ class Ft extends $ { parent: null }; return { - result: await s._parseAsync({ + result: await o._parseAsync({ data: r.data, path: r.path, parent: i @@ -6270,7 +6325,7 @@ class Ft extends $ { }; })).then(a); { - let s; + let o; const i = []; for (const u of n) { const l = { @@ -6287,11 +6342,11 @@ class Ft extends $ { }); if (d.status === "valid") return d; - d.status === "dirty" && !s && (s = { result: d, ctx: l }), l.common.issues.length && i.push(l.common.issues); + d.status === "dirty" && !o && (o = { result: d, ctx: l }), l.common.issues.length && i.push(l.common.issues); } - if (s) - return r.common.issues.push(...s.ctx.common.issues), s.result; - const c = i.map((u) => new xe(u)); + if (o) + return r.common.issues.push(...o.ctx.common.issues), o.result; + const c = i.map((u) => new Se(u)); return x(r, { code: g.invalid_union, unionErrors: c @@ -6302,13 +6357,13 @@ class Ft extends $ { return this._def.options; } } -Ft.create = (t, e) => new Ft({ +Ut.create = (t, e) => new Ut({ options: t, typeName: P.ZodUnion, ...C(e) }); -const or = (t) => t instanceof Ut ? or(t.schema) : t instanceof Ee ? or(t.innerType()) : t instanceof Zt ? [t.value] : t instanceof qe ? t.options : t instanceof zt ? Object.keys(t.enum) : t instanceof Bt ? or(t._def.innerType) : t instanceof Mt ? [void 0] : t instanceof Lt ? [null] : null; -class Nr extends $ { +const ir = (t) => t instanceof zt ? ir(t.schema) : t instanceof Pe ? ir(t.innerType()) : t instanceof Gt ? [t.value] : t instanceof Ye ? t.options : t instanceof Bt ? Object.keys(t.enum) : t instanceof Ht ? ir(t._def.innerType) : t instanceof Ft ? [void 0] : t instanceof Dt ? [null] : null; +class Rr extends $ { _parse(e) { const { ctx: r } = this._processInputParams(e); if (r.parsedType !== b.object) @@ -6317,12 +6372,12 @@ class Nr extends $ { expected: b.object, received: r.parsedType }), A; - const n = this.discriminator, a = r.data[n], s = this.optionsMap.get(a); - return s ? r.common.async ? s._parseAsync({ + const n = this.discriminator, a = r.data[n], o = this.optionsMap.get(a); + return o ? r.common.async ? o._parseAsync({ data: r.data, path: r.path, parent: r - }) : s._parseSync({ + }) : o._parseSync({ data: r.data, path: r.path, parent: r @@ -6351,17 +6406,17 @@ class Nr extends $ { */ static create(e, r, n) { const a = /* @__PURE__ */ new Map(); - for (const s of r) { - const i = or(s.shape[e]); + for (const o of r) { + const i = ir(o.shape[e]); if (!i) throw new Error(`A discriminator value for key \`${e}\` could not be extracted from all schema options`); for (const c of i) { if (a.has(c)) throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(c)}`); - a.set(c, s); + a.set(c, o); } } - return new Nr({ + return new Rr({ typeName: P.ZodDiscriminatedUnion, discriminator: e, options: r, @@ -6370,14 +6425,14 @@ class Nr extends $ { }); } } -function Qr(t, e) { - const r = Ze(t), n = Ze(e); +function on(t, e) { + const r = Ge(t), n = Ge(e); if (t === e) return { valid: !0, data: t }; if (r === b.object && n === b.object) { - const a = R.objectKeys(e), s = R.objectKeys(t).filter((c) => a.indexOf(c) !== -1), i = { ...t, ...e }; - for (const c of s) { - const u = Qr(t[c], e[c]); + const a = R.objectKeys(e), o = R.objectKeys(t).filter((c) => a.indexOf(c) !== -1), i = { ...t, ...e }; + for (const c of o) { + const u = on(t[c], e[c]); if (!u.valid) return { valid: !1 }; i[c] = u.data; @@ -6387,8 +6442,8 @@ function Qr(t, e) { if (t.length !== e.length) return { valid: !1 }; const a = []; - for (let s = 0; s < t.length; s++) { - const i = t[s], c = e[s], u = Qr(i, c); + for (let o = 0; o < t.length; o++) { + const i = t[o], c = e[o], u = on(i, c); if (!u.valid) return { valid: !1 }; a.push(u.data); @@ -6397,13 +6452,13 @@ function Qr(t, e) { } else return r === b.date && n === b.date && +t == +e ? { valid: !0, data: t } : { valid: !1 }; } -class Dt extends $ { +class jt extends $ { _parse(e) { - const { status: r, ctx: n } = this._processInputParams(e), a = (s, i) => { - if (Yr(s) || Yr(i)) + const { status: r, ctx: n } = this._processInputParams(e), a = (o, i) => { + if (rn(o) || rn(i)) return A; - const c = Qr(s.value, i.value); - return c.valid ? ((Xr(s) || Xr(i)) && r.dirty(), { status: r.value, value: c.data }) : (x(n, { + const c = on(o.value, i.value); + return c.valid ? ((nn(o) || nn(i)) && r.dirty(), { status: r.value, value: c.data }) : (x(n, { code: g.invalid_intersection_types }), A); }; @@ -6418,7 +6473,7 @@ class Dt extends $ { path: n.path, parent: n }) - ]).then(([s, i]) => a(s, i)) : a(this._def.left._parseSync({ + ]).then(([o, i]) => a(o, i)) : a(this._def.left._parseSync({ data: n.data, path: n.path, parent: n @@ -6429,13 +6484,13 @@ class Dt extends $ { })); } } -Dt.create = (t, e, r) => new Dt({ +jt.create = (t, e, r) => new jt({ left: t, right: e, typeName: P.ZodIntersection, ...C(r) }); -class Ne extends $ { +class $e extends $ { _parse(e) { const { status: r, ctx: n } = this._processInputParams(e); if (n.parsedType !== b.array) @@ -6459,33 +6514,33 @@ class Ne extends $ { exact: !1, type: "array" }), r.dirty()); - const s = [...n.data].map((i, c) => { + const o = [...n.data].map((i, c) => { const u = this._def.items[c] || this._def.rest; - return u ? u._parse(new Ce(n, i, n.path, c)) : null; + return u ? u._parse(new Ne(n, i, n.path, c)) : null; }).filter((i) => !!i); - return n.common.async ? Promise.all(s).then((i) => Y.mergeArray(r, i)) : Y.mergeArray(r, s); + return n.common.async ? Promise.all(o).then((i) => J.mergeArray(r, i)) : J.mergeArray(r, o); } get items() { return this._def.items; } rest(e) { - return new Ne({ + return new $e({ ...this._def, rest: e }); } } -Ne.create = (t, e) => { +$e.create = (t, e) => { if (!Array.isArray(t)) throw new Error("You must pass an array of schemas to z.tuple([ ... ])"); - return new Ne({ + return new $e({ items: t, typeName: P.ZodTuple, rest: null, ...C(e) }); }; -class jt extends $ { +class Zt extends $ { get keySchema() { return this._def.keyType; } @@ -6500,32 +6555,32 @@ class jt extends $ { expected: b.object, received: n.parsedType }), A; - const a = [], s = this._def.keyType, i = this._def.valueType; + const a = [], o = this._def.keyType, i = this._def.valueType; for (const c in n.data) a.push({ - key: s._parse(new Ce(n, c, n.path, c)), - value: i._parse(new Ce(n, n.data[c], n.path, c)) + key: o._parse(new Ne(n, c, n.path, c)), + value: i._parse(new Ne(n, n.data[c], n.path, c)) }); - return n.common.async ? Y.mergeObjectAsync(r, a) : Y.mergeObjectSync(r, a); + return n.common.async ? J.mergeObjectAsync(r, a) : J.mergeObjectSync(r, a); } get element() { return this._def.valueType; } static create(e, r, n) { - return r instanceof $ ? new jt({ + return r instanceof $ ? new Zt({ keyType: e, valueType: r, typeName: P.ZodRecord, ...C(n) - }) : new jt({ - keyType: we.create(), + }) : new Zt({ + keyType: xe.create(), valueType: e, typeName: P.ZodRecord, ...C(r) }); } } -class gr extends $ { +class _r extends $ { get keySchema() { return this._def.keyType; } @@ -6540,9 +6595,9 @@ class gr extends $ { expected: b.map, received: n.parsedType }), A; - const a = this._def.keyType, s = this._def.valueType, i = [...n.data.entries()].map(([c, u], l) => ({ - key: a._parse(new Ce(n, c, n.path, [l, "key"])), - value: s._parse(new Ce(n, u, n.path, [l, "value"])) + const a = this._def.keyType, o = this._def.valueType, i = [...n.data.entries()].map(([c, u], l) => ({ + key: a._parse(new Ne(n, c, n.path, [l, "key"])), + value: o._parse(new Ne(n, u, n.path, [l, "value"])) })); if (n.common.async) { const c = /* @__PURE__ */ new Map(); @@ -6567,13 +6622,13 @@ class gr extends $ { } } } -gr.create = (t, e, r) => new gr({ +_r.create = (t, e, r) => new _r({ valueType: e, keyType: t, typeName: P.ZodMap, ...C(r) }); -class at extends $ { +class ct extends $ { _parse(e) { const { status: r, ctx: n } = this._processInputParams(e); if (n.parsedType !== b.set) @@ -6598,7 +6653,7 @@ class at extends $ { exact: !1, message: a.maxSize.message }), r.dirty()); - const s = this._def.valueType; + const o = this._def.valueType; function i(u) { const l = /* @__PURE__ */ new Set(); for (const d of u) { @@ -6608,17 +6663,17 @@ class at extends $ { } return { status: r.value, value: l }; } - const c = [...n.data.values()].map((u, l) => s._parse(new Ce(n, u, n.path, l))); + const c = [...n.data.values()].map((u, l) => o._parse(new Ne(n, u, n.path, l))); return n.common.async ? Promise.all(c).then((u) => i(u)) : i(c); } min(e, r) { - return new at({ + return new ct({ ...this._def, minSize: { value: e, message: S.toString(r) } }); } max(e, r) { - return new at({ + return new ct({ ...this._def, maxSize: { value: e, message: S.toString(r) } }); @@ -6630,14 +6685,14 @@ class at extends $ { return this.min(1, e); } } -at.create = (t, e) => new at({ +ct.create = (t, e) => new ct({ valueType: t, minSize: null, maxSize: null, typeName: P.ZodSet, ...C(e) }); -class ht extends $ { +class yt extends $ { constructor() { super(...arguments), this.validate = this.implement; } @@ -6650,14 +6705,14 @@ class ht extends $ { received: r.parsedType }), A; function n(c, u) { - return fr({ + return hr({ data: c, path: r.path, errorMaps: [ r.common.contextualErrorMap, r.schemaErrorMap, - dr(), - $t + mr(), + Rt ].filter((l) => !!l), issueData: { code: g.invalid_arguments, @@ -6666,14 +6721,14 @@ class ht extends $ { }); } function a(c, u) { - return fr({ + return hr({ data: c, path: r.path, errorMaps: [ r.common.contextualErrorMap, r.schemaErrorMap, - dr(), - $t + mr(), + Rt ].filter((l) => !!l), issueData: { code: g.invalid_return_type, @@ -6681,26 +6736,26 @@ class ht extends $ { } }); } - const s = { errorMap: r.common.contextualErrorMap }, i = r.data; - if (this._def.returns instanceof bt) { + const o = { errorMap: r.common.contextualErrorMap }, i = r.data; + if (this._def.returns instanceof xt) { const c = this; return re(async function(...u) { - const l = new xe([]), d = await c._def.args.parseAsync(u, s).catch((p) => { + const l = new Se([]), d = await c._def.args.parseAsync(u, o).catch((p) => { throw l.addIssue(n(u, p)), l; }), f = await Reflect.apply(i, this, d); - return await c._def.returns._def.type.parseAsync(f, s).catch((p) => { + return await c._def.returns._def.type.parseAsync(f, o).catch((p) => { throw l.addIssue(a(f, p)), l; }); }); } else { const c = this; return re(function(...u) { - const l = c._def.args.safeParse(u, s); + const l = c._def.args.safeParse(u, o); if (!l.success) - throw new xe([n(u, l.error)]); - const d = Reflect.apply(i, this, l.data), f = c._def.returns.safeParse(d, s); + throw new Se([n(u, l.error)]); + const d = Reflect.apply(i, this, l.data), f = c._def.returns.safeParse(d, o); if (!f.success) - throw new xe([a(d, f.error)]); + throw new Se([a(d, f.error)]); return f.data; }); } @@ -6712,13 +6767,13 @@ class ht extends $ { return this._def.returns; } args(...e) { - return new ht({ + return new yt({ ...this._def, - args: Ne.create(e).rest(rt.create()) + args: $e.create(e).rest(ot.create()) }); } returns(e) { - return new ht({ + return new yt({ ...this._def, returns: e }); @@ -6730,15 +6785,15 @@ class ht extends $ { return this.parse(e); } static create(e, r, n) { - return new ht({ - args: e || Ne.create([]).rest(rt.create()), - returns: r || rt.create(), + return new yt({ + args: e || $e.create([]).rest(ot.create()), + returns: r || ot.create(), typeName: P.ZodFunction, ...C(n) }); } } -class Ut extends $ { +class zt extends $ { get schema() { return this._def.getter(); } @@ -6747,12 +6802,12 @@ class Ut extends $ { return this._def.getter()._parse({ data: r.data, path: r.path, parent: r }); } } -Ut.create = (t, e) => new Ut({ +zt.create = (t, e) => new zt({ getter: t, typeName: P.ZodLazy, ...C(e) }); -class Zt extends $ { +class Gt extends $ { _parse(e) { if (e.data !== this._def.value) { const r = this._getOrReturnCtx(e); @@ -6768,19 +6823,19 @@ class Zt extends $ { return this._def.value; } } -Zt.create = (t, e) => new Zt({ +Gt.create = (t, e) => new Gt({ value: t, typeName: P.ZodLiteral, ...C(e) }); -function ds(t, e) { - return new qe({ +function gs(t, e) { + return new Ye({ values: t, typeName: P.ZodEnum, ...C(e) }); } -class qe extends $ { +class Ye extends $ { _parse(e) { if (typeof e.data != "string") { const r = this._getOrReturnCtx(e), n = this._def.values; @@ -6822,14 +6877,14 @@ class qe extends $ { return e; } extract(e) { - return qe.create(e); + return Ye.create(e); } exclude(e) { - return qe.create(this.options.filter((r) => !e.includes(r))); + return Ye.create(this.options.filter((r) => !e.includes(r))); } } -qe.create = ds; -class zt extends $ { +Ye.create = gs; +class Bt extends $ { _parse(e) { const r = R.getValidEnumValues(this._def.values), n = this._getOrReturnCtx(e); if (n.parsedType !== b.string && n.parsedType !== b.number) { @@ -6854,12 +6909,12 @@ class zt extends $ { return this._def.values; } } -zt.create = (t, e) => new zt({ +Bt.create = (t, e) => new Bt({ values: t, typeName: P.ZodNativeEnum, ...C(e) }); -class bt extends $ { +class xt extends $ { unwrap() { return this._def.type; } @@ -6878,12 +6933,12 @@ class bt extends $ { }))); } } -bt.create = (t, e) => new bt({ +xt.create = (t, e) => new xt({ type: t, typeName: P.ZodPromise, ...C(e) }); -class Ee extends $ { +class Pe extends $ { innerType() { return this._def.schema; } @@ -6891,7 +6946,7 @@ class Ee extends $ { return this._def.schema._def.typeName === P.ZodEffects ? this._def.schema.sourceType() : this._def.schema; } _parse(e) { - const { status: r, ctx: n } = this._processInputParams(e), a = this._def.effect || null, s = { + const { status: r, ctx: n } = this._processInputParams(e), a = this._def.effect || null, o = { addIssue: (i) => { x(n, i), i.fatal ? r.abort() : r.dirty(); }, @@ -6899,8 +6954,8 @@ class Ee extends $ { return n.path; } }; - if (s.addIssue = s.addIssue.bind(s), a.type === "preprocess") { - const i = a.transform(n.data, s); + if (o.addIssue = o.addIssue.bind(o), a.type === "preprocess") { + const i = a.transform(n.data, o); return n.common.issues.length ? { status: "dirty", value: n.data @@ -6916,7 +6971,7 @@ class Ee extends $ { } if (a.type === "refinement") { const i = (c) => { - const u = a.refinement(c, s); + const u = a.refinement(c, o); if (n.common.async) return Promise.resolve(u); if (u instanceof Promise) @@ -6940,30 +6995,30 @@ class Ee extends $ { path: n.path, parent: n }); - if (!Ot(i)) + if (!Lt(i)) return i; - const c = a.transform(i.value, s); + const c = a.transform(i.value, o); if (c instanceof Promise) throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead."); return { status: r.value, value: c }; } else - return this._def.schema._parseAsync({ data: n.data, path: n.path, parent: n }).then((i) => Ot(i) ? Promise.resolve(a.transform(i.value, s)).then((c) => ({ status: r.value, value: c })) : i); + return this._def.schema._parseAsync({ data: n.data, path: n.path, parent: n }).then((i) => Lt(i) ? Promise.resolve(a.transform(i.value, o)).then((c) => ({ status: r.value, value: c })) : i); R.assertNever(a); } } -Ee.create = (t, e, r) => new Ee({ +Pe.create = (t, e, r) => new Pe({ schema: t, typeName: P.ZodEffects, effect: e, ...C(r) }); -Ee.createWithPreprocess = (t, e, r) => new Ee({ +Pe.createWithPreprocess = (t, e, r) => new Pe({ schema: e, effect: { type: "preprocess", transform: t }, typeName: P.ZodEffects, ...C(r) }); -class Me extends $ { +class Fe extends $ { _parse(e) { return this._getType(e) === b.undefined ? re(void 0) : this._def.innerType._parse(e); } @@ -6971,12 +7026,12 @@ class Me extends $ { return this._def.innerType; } } -Me.create = (t, e) => new Me({ +Fe.create = (t, e) => new Fe({ innerType: t, typeName: P.ZodOptional, ...C(e) }); -class it extends $ { +class lt extends $ { _parse(e) { return this._getType(e) === b.null ? re(null) : this._def.innerType._parse(e); } @@ -6984,12 +7039,12 @@ class it extends $ { return this._def.innerType; } } -it.create = (t, e) => new it({ +lt.create = (t, e) => new lt({ innerType: t, typeName: P.ZodNullable, ...C(e) }); -class Bt extends $ { +class Ht extends $ { _parse(e) { const { ctx: r } = this._processInputParams(e); let n = r.data; @@ -7003,13 +7058,13 @@ class Bt extends $ { return this._def.innerType; } } -Bt.create = (t, e) => new Bt({ +Ht.create = (t, e) => new Ht({ innerType: t, typeName: P.ZodDefault, defaultValue: typeof e.default == "function" ? e.default : () => e.default, ...C(e) }); -class yr extends $ { +class br extends $ { _parse(e) { const { ctx: r } = this._processInputParams(e), n = { ...r, @@ -7024,11 +7079,11 @@ class yr extends $ { ...n } }); - return pr(a) ? a.then((s) => ({ + return gr(a) ? a.then((o) => ({ status: "valid", - value: s.status === "valid" ? s.value : this._def.catchValue({ + value: o.status === "valid" ? o.value : this._def.catchValue({ get error() { - return new xe(n.common.issues); + return new Se(n.common.issues); }, input: n.data }) @@ -7036,7 +7091,7 @@ class yr extends $ { status: "valid", value: a.status === "valid" ? a.value : this._def.catchValue({ get error() { - return new xe(n.common.issues); + return new Se(n.common.issues); }, input: n.data }) @@ -7046,13 +7101,13 @@ class yr extends $ { return this._def.innerType; } } -yr.create = (t, e) => new yr({ +br.create = (t, e) => new br({ innerType: t, typeName: P.ZodCatch, catchValue: typeof e.catch == "function" ? e.catch : () => e.catch, ...C(e) }); -class vr extends $ { +class wr extends $ { _parse(e) { if (this._getType(e) !== b.nan) { const n = this._getOrReturnCtx(e); @@ -7065,12 +7120,12 @@ class vr extends $ { return { status: "valid", value: e.data }; } } -vr.create = (t) => new vr({ +wr.create = (t) => new wr({ typeName: P.ZodNaN, ...C(t) }); -const rc = Symbol("zod_brand"); -class fs extends $ { +const cc = Symbol("zod_brand"); +class ys extends $ { _parse(e) { const { ctx: r } = this._processInputParams(e), n = r.data; return this._def.type._parse({ @@ -7083,18 +7138,18 @@ class fs extends $ { return this._def.type; } } -class qt extends $ { +class Jt extends $ { _parse(e) { const { status: r, ctx: n } = this._processInputParams(e); if (n.common.async) return (async () => { - const s = await this._def.in._parseAsync({ + const o = await this._def.in._parseAsync({ data: n.data, path: n.path, parent: n }); - return s.status === "aborted" ? A : s.status === "dirty" ? (r.dirty(), us(s.value)) : this._def.out._parseAsync({ - data: s.value, + return o.status === "aborted" ? A : o.status === "dirty" ? (r.dirty(), hs(o.value)) : this._def.out._parseAsync({ + data: o.value, path: n.path, parent: n }); @@ -7116,165 +7171,165 @@ class qt extends $ { } } static create(e, r) { - return new qt({ + return new Jt({ in: e, out: r, typeName: P.ZodPipeline }); } } -class _r extends $ { +class xr extends $ { _parse(e) { const r = this._def.innerType._parse(e); - return Ot(r) && (r.value = Object.freeze(r.value)), r; + return Lt(r) && (r.value = Object.freeze(r.value)), r; } } -_r.create = (t, e) => new _r({ +xr.create = (t, e) => new xr({ innerType: t, typeName: P.ZodReadonly, ...C(e) }); -const ps = (t, e = {}, r) => t ? _t.create().superRefine((n, a) => { - var s, i; +const vs = (t, e = {}, r) => t ? wt.create().superRefine((n, a) => { + var o, i; if (!t(n)) { - const c = typeof e == "function" ? e(n) : typeof e == "string" ? { message: e } : e, u = (i = (s = c.fatal) !== null && s !== void 0 ? s : r) !== null && i !== void 0 ? i : !0, l = typeof c == "string" ? { message: c } : c; + const c = typeof e == "function" ? e(n) : typeof e == "string" ? { message: e } : e, u = (i = (o = c.fatal) !== null && o !== void 0 ? o : r) !== null && i !== void 0 ? i : !0, l = typeof c == "string" ? { message: c } : c; a.addIssue({ code: "custom", ...l, fatal: u }); } -}) : _t.create(), nc = { - object: j.lazycreate +}) : wt.create(), lc = { + object: U.lazycreate }; var P; (function(t) { t.ZodString = "ZodString", t.ZodNumber = "ZodNumber", t.ZodNaN = "ZodNaN", t.ZodBigInt = "ZodBigInt", t.ZodBoolean = "ZodBoolean", t.ZodDate = "ZodDate", t.ZodSymbol = "ZodSymbol", t.ZodUndefined = "ZodUndefined", t.ZodNull = "ZodNull", t.ZodAny = "ZodAny", t.ZodUnknown = "ZodUnknown", t.ZodNever = "ZodNever", t.ZodVoid = "ZodVoid", t.ZodArray = "ZodArray", t.ZodObject = "ZodObject", t.ZodUnion = "ZodUnion", t.ZodDiscriminatedUnion = "ZodDiscriminatedUnion", t.ZodIntersection = "ZodIntersection", t.ZodTuple = "ZodTuple", t.ZodRecord = "ZodRecord", t.ZodMap = "ZodMap", t.ZodSet = "ZodSet", t.ZodFunction = "ZodFunction", t.ZodLazy = "ZodLazy", t.ZodLiteral = "ZodLiteral", t.ZodEnum = "ZodEnum", t.ZodEffects = "ZodEffects", t.ZodNativeEnum = "ZodNativeEnum", t.ZodOptional = "ZodOptional", t.ZodNullable = "ZodNullable", t.ZodDefault = "ZodDefault", t.ZodCatch = "ZodCatch", t.ZodPromise = "ZodPromise", t.ZodBranded = "ZodBranded", t.ZodPipeline = "ZodPipeline", t.ZodReadonly = "ZodReadonly"; })(P || (P = {})); -const oc = (t, e = { +const uc = (t, e = { message: `Input not instance of ${t.name}` -}) => ps((r) => r instanceof t, e), ms = we.create, hs = Ve.create, sc = vr.create, ac = We.create, gs = Rt.create, ic = st.create, cc = mr.create, lc = Mt.create, uc = Lt.create, dc = _t.create, fc = rt.create, pc = Fe.create, mc = hr.create, hc = Se.create, gc = j.create, yc = j.strictCreate, vc = Ft.create, _c = Nr.create, bc = Dt.create, wc = Ne.create, xc = jt.create, Sc = gr.create, Ec = at.create, Pc = ht.create, kc = Ut.create, Tc = Zt.create, Ic = qe.create, Ac = zt.create, Cc = bt.create, Qn = Ee.create, Nc = Me.create, $c = it.create, Oc = Ee.createWithPreprocess, Rc = qt.create, Mc = () => ms().optional(), Lc = () => hs().optional(), Fc = () => gs().optional(), Dc = { - string: (t) => we.create({ ...t, coerce: !0 }), - number: (t) => Ve.create({ ...t, coerce: !0 }), - boolean: (t) => Rt.create({ +}) => vs((r) => r instanceof t, e), _s = xe.create, bs = qe.create, dc = wr.create, fc = Ke.create, ws = Mt.create, pc = it.create, mc = yr.create, hc = Ft.create, gc = Dt.create, yc = wt.create, vc = ot.create, _c = Ue.create, bc = vr.create, wc = Ee.create, xc = U.create, Sc = U.strictCreate, Ec = Ut.create, Pc = Rr.create, kc = jt.create, Tc = $e.create, Ic = Zt.create, Ac = _r.create, Cc = ct.create, Nc = yt.create, $c = zt.create, Oc = Gt.create, Rc = Ye.create, Lc = Bt.create, Mc = xt.create, oo = Pe.create, Fc = Fe.create, Dc = lt.create, Uc = Pe.createWithPreprocess, jc = Jt.create, Zc = () => _s().optional(), zc = () => bs().optional(), Gc = () => ws().optional(), Bc = { + string: (t) => xe.create({ ...t, coerce: !0 }), + number: (t) => qe.create({ ...t, coerce: !0 }), + boolean: (t) => Mt.create({ ...t, coerce: !0 }), - bigint: (t) => We.create({ ...t, coerce: !0 }), - date: (t) => st.create({ ...t, coerce: !0 }) -}, jc = A; + bigint: (t) => Ke.create({ ...t, coerce: !0 }), + date: (t) => it.create({ ...t, coerce: !0 }) +}, Hc = A; var V = /* @__PURE__ */ Object.freeze({ __proto__: null, - defaultErrorMap: $t, - setErrorMap: Bi, - getErrorMap: dr, - makeIssue: fr, - EMPTY_PATH: Gi, + defaultErrorMap: Rt, + setErrorMap: Ki, + getErrorMap: mr, + makeIssue: hr, + EMPTY_PATH: Yi, addIssueToContext: x, - ParseStatus: Y, + ParseStatus: J, INVALID: A, - DIRTY: us, + DIRTY: hs, OK: re, - isAborted: Yr, - isDirty: Xr, - isValid: Ot, - isAsync: pr, + isAborted: rn, + isDirty: nn, + isValid: Lt, + isAsync: gr, get util() { return R; }, get objectUtil() { - return Jr; + return tn; }, ZodParsedType: b, - getParsedType: Ze, + getParsedType: Ge, ZodType: $, - ZodString: we, - ZodNumber: Ve, - ZodBigInt: We, - ZodBoolean: Rt, - ZodDate: st, - ZodSymbol: mr, - ZodUndefined: Mt, - ZodNull: Lt, - ZodAny: _t, - ZodUnknown: rt, - ZodNever: Fe, - ZodVoid: hr, - ZodArray: Se, - ZodObject: j, - ZodUnion: Ft, - ZodDiscriminatedUnion: Nr, - ZodIntersection: Dt, - ZodTuple: Ne, - ZodRecord: jt, - ZodMap: gr, - ZodSet: at, - ZodFunction: ht, - ZodLazy: Ut, - ZodLiteral: Zt, - ZodEnum: qe, - ZodNativeEnum: zt, - ZodPromise: bt, - ZodEffects: Ee, - ZodTransformer: Ee, - ZodOptional: Me, - ZodNullable: it, - ZodDefault: Bt, - ZodCatch: yr, - ZodNaN: vr, - BRAND: rc, - ZodBranded: fs, - ZodPipeline: qt, - ZodReadonly: _r, - custom: ps, + ZodString: xe, + ZodNumber: qe, + ZodBigInt: Ke, + ZodBoolean: Mt, + ZodDate: it, + ZodSymbol: yr, + ZodUndefined: Ft, + ZodNull: Dt, + ZodAny: wt, + ZodUnknown: ot, + ZodNever: Ue, + ZodVoid: vr, + ZodArray: Ee, + ZodObject: U, + ZodUnion: Ut, + ZodDiscriminatedUnion: Rr, + ZodIntersection: jt, + ZodTuple: $e, + ZodRecord: Zt, + ZodMap: _r, + ZodSet: ct, + ZodFunction: yt, + ZodLazy: zt, + ZodLiteral: Gt, + ZodEnum: Ye, + ZodNativeEnum: Bt, + ZodPromise: xt, + ZodEffects: Pe, + ZodTransformer: Pe, + ZodOptional: Fe, + ZodNullable: lt, + ZodDefault: Ht, + ZodCatch: br, + ZodNaN: wr, + BRAND: cc, + ZodBranded: ys, + ZodPipeline: Jt, + ZodReadonly: xr, + custom: vs, Schema: $, ZodSchema: $, - late: nc, + late: lc, get ZodFirstPartyTypeKind() { return P; }, - coerce: Dc, - any: dc, - array: hc, - bigint: ac, - boolean: gs, - date: ic, - discriminatedUnion: _c, - effect: Qn, - enum: Ic, - function: Pc, - instanceof: oc, - intersection: bc, - lazy: kc, - literal: Tc, - map: Sc, - nan: sc, - nativeEnum: Ac, - never: pc, - null: uc, - nullable: $c, - number: hs, - object: gc, - oboolean: Fc, - onumber: Lc, - optional: Nc, - ostring: Mc, - pipeline: Rc, - preprocess: Oc, - promise: Cc, - record: xc, - set: Ec, - strictObject: yc, - string: ms, - symbol: cc, - transformer: Qn, - tuple: wc, - undefined: lc, - union: vc, - unknown: fc, - void: mc, - NEVER: jc, + coerce: Bc, + any: yc, + array: wc, + bigint: fc, + boolean: ws, + date: pc, + discriminatedUnion: Pc, + effect: oo, + enum: Rc, + function: Nc, + instanceof: uc, + intersection: kc, + lazy: $c, + literal: Oc, + map: Ac, + nan: dc, + nativeEnum: Lc, + never: _c, + null: gc, + nullable: Dc, + number: bs, + object: xc, + oboolean: Gc, + onumber: zc, + optional: Fc, + ostring: Zc, + pipeline: jc, + preprocess: Uc, + promise: Mc, + record: Ic, + set: Cc, + strictObject: Sc, + string: _s, + symbol: mc, + transformer: oo, + tuple: Tc, + undefined: hc, + union: Ec, + unknown: vc, + void: bc, + NEVER: Hc, ZodIssueCode: g, - quotelessJson: zi, - ZodError: xe + quotelessJson: qi, + ZodError: Se }); -const Uc = V.object({ +const Vc = V.object({ name: V.string(), code: V.string().url(), permissions: V.array( @@ -7287,100 +7342,119 @@ const Uc = V.object({ ]) ) }); -function ys(t) { +function xs(t) { return fetch(t).then((e) => e.json()).then((e) => { - if (!Uc.safeParse(e).success) + if (!Vc.safeParse(e).success) throw new Error("Invalid plugin manifest"); return e; }).catch((e) => { throw console.error(e), e; }); } -function Zc(t) { +function Wc(t) { return fetch(t).then((e) => e.text()); } -async function zc(t) { - const e = await ys(t.manifest), r = await Zc(e.code); +async function qc(t) { + const e = await xs(t.manifest), r = await Wc(e.code); return { manifest: e, code: r }; } -function wn(t, e) { - t.setAttribute("data-theme", e); -} -function Bc(t, e, r, n) { - const a = document.createElement("plugin-modal"); - return wn(a, r), a.setAttribute("title", t), a.setAttribute("iframe-src", e), a.setAttribute("width", String(n.width || 300)), a.setAttribute("height", String(n.height || 400)), document.body.appendChild(a), a; -} -const Gc = V.object({ +const Kc = V.object({ width: V.number().positive(), height: V.number().positive() -}), Hc = V.function().args(V.string(), V.string(), V.enum(["dark", "light"]), Gc).implement((t, e, r, n) => Bc(t, e, r, n)), en = [ +}); +function Yc(t, e, r, n) { + const a = document.createElement("plugin-modal"); + return a.setTheme(r), a.setAttribute("title", t), a.setAttribute("iframe-src", e), a.setAttribute("width", String(n.width || 285)), a.setAttribute("height", String(n.height || 540)), document.body.appendChild(a), a; +} +const Jc = V.function().args(V.string(), V.string(), V.enum(["dark", "light"]), Kc).implement((t, e, r, n) => Yc(t, e, r, n)), sn = [ "pagechange", "filechange", "selectionchange", "themechange" ]; -let tn = [], ne = null; -const It = /* @__PURE__ */ new Map(); +let an = [], ne = null; +const Ct = /* @__PURE__ */ new Map(); window.addEventListener("message", (t) => { - for (const e of tn) + for (const e of an) e(t.data); }); -function Vc(t, e) { - t === "themechange" && ne && wn(ne, e), (It.get(t) || []).forEach((n) => n(e)); +function Xc(t, e) { + t === "themechange" && ne && ne.setTheme(e), (Ct.get(t) || []).forEach((n) => n(e)); } -function Wc(t, e) { +function Qc(t, e) { const r = () => { - ne == null || ne.removeEventListener("close", r), ne && ne.remove(), tn = [], ne = null; - }, n = (s) => { - if (!e.permissions.includes(s)) - throw new Error(`Permission ${s} is not granted`); + ne == null || ne.removeEventListener("close", r), ne && ne.remove(), an = [], ne = null; + }, n = (o) => { + if (!e.permissions.includes(o)) + throw new Error(`Permission ${o} is not granted`); }; return { ui: { - open: (s, i, c) => { + open: (o, i, c) => { const u = t.getTheme(); - ne = Hc(s, i, u, c), wn(ne, u), ne.addEventListener("close", r, { + ne = Jc(o, i, u, c), ne.setTheme(u), ne.addEventListener("close", r, { once: !0 }); }, - sendMessage(s) { + sendMessage(o) { const i = new CustomEvent("message", { - detail: s + detail: o }); ne == null || ne.dispatchEvent(i); }, - onMessage: (s) => { - V.function().parse(s), tn.push(s); + onMessage: (o) => { + V.function().parse(o), an.push(o); } }, - log: console.log, - setTimeout: V.function().args(V.function(), V.number()).implement((s, i) => { - setTimeout(s, i); + utils: { + types: { + isText(o) { + return o.type === "text"; + }, + isRectangle(o) { + return o.type === "rect"; + }, + isFrame(o) { + return o.type === "frame"; + } + } + }, + setTimeout: V.function().args(V.function(), V.number()).implement((o, i) => { + setTimeout(o, i); }), closePlugin: r, - on(s, i) { - V.enum(en).parse(s), V.function().parse(i), s === "pagechange" ? n("page:read") : s === "filechange" ? n("file:read") : s === "selectionchange" && n("selection:read"); - const c = It.get(s) || []; - c.push(i), It.set(s, c); + on(o, i) { + V.enum(sn).parse(o), V.function().parse(i), o === "pagechange" ? n("page:read") : o === "filechange" ? n("file:read") : o === "selectionchange" && n("selection:read"); + const c = Ct.get(o) || []; + c.push(i), Ct.set(o, c); }, - off(s, i) { - V.enum(en).parse(s), V.function().parse(i); - const c = It.get(s) || []; - It.set( - s, + off(o, i) { + V.enum(sn).parse(o), V.function().parse(i); + const c = Ct.get(o) || []; + Ct.set( + o, c.filter((u) => u !== i) ); }, // Penpot State API + get root() { + return n("page:read"), t.root; + }, + get currentPage() { + return n("page:read"), t.currentPage; + }, + get selection() { + return n("selection:read"), t.selection; + }, + get viewport() { + return n("selection:read"), t.viewport; + }, getFile() { return n("file:read"), t.getFile(); }, - getCurrentPage() { - return n("page:read"), t.getCurrentPage(); - }, getPage() { return n("page:read"), t.getPage(); }, @@ -7393,27 +7467,43 @@ function Wc(t, e) { getTheme() { return t.getTheme(); }, - fetch + createFrame() { + return t.createFrame(); + }, + createRectangle() { + return t.createRectangle(); + }, + createText(o) { + return t.createText(o); + }, + createShapeFromSvg(o) { + return t.createShapeFromSvg(o); + }, + uploadMediaUrl(o, i) { + return t.uploadMediaUrl(o, i); + } }; } -let eo = !1, tr, rn = null; -function qc(t) { - rn = t; +let so = !1, or, cn = null; +function el(t) { + cn = t; } -const vs = async function(t) { - const { code: e, manifest: r } = await zc(t); +const Ss = async function(t) { + const { code: e, manifest: r } = await qc(t); try { - eo || (eo = !0, hardenIntrinsics()), tr && tr.closePlugin(), rn ? (tr = Wc(rn, r), new Compartment({ - penpot: harden(tr) + so || (so = !0, hardenIntrinsics()), or && or.closePlugin(), cn ? (or = Qc(cn, r), new Compartment({ + penpot: harden(or), + fetch: window.fetch.bind(window), + console: harden(window.console) }).evaluate(e)) : console.error("Cannot find Penpot Context"); } catch (n) { console.error(n); } -}, Kc = ` -`, to = (t) => { +}, tl = ` +`, ao = (t) => { t.target.tagName === "INSTALLER-MODAL" && t.stopImmediatePropagation(); }; -class Jc extends HTMLElement { +class rl extends HTMLElement { constructor() { super(), this.dialog = null, this.attachShadow({ mode: "open" }); } @@ -7423,12 +7513,12 @@ class Jc extends HTMLElement { n.classList.add("plugin"), n.textContent = e; const a = document.createElement("div"); a.classList.add("actions"); - const s = document.createElement("button"); - s.classList.add("button"), s.textContent = "Open", s.type = "button", s.addEventListener("click", () => { - this.closeModal(), vs({ + const o = document.createElement("button"); + o.classList.add("button"), o.textContent = "Open", o.type = "button", o.addEventListener("click", () => { + this.closeModal(), Ss({ manifest: r }); - }), a.appendChild(s); + }), a.appendChild(o); const i = document.createElement("button"); i.classList.add("button", "remove"), i.textContent = "Remove", i.type = "button", i.addEventListener("click", () => { n.remove(); @@ -7454,19 +7544,19 @@ class Jc extends HTMLElement { if (!n) return; const a = n.value; - n.value = "", ys(a).then((s) => { - if (this.createPlugin(s.name, a), !localStorage.getItem("plugins")) + n.value = "", xs(a).then((o) => { + if (this.createPlugin(o.name, a), !localStorage.getItem("plugins")) localStorage.setItem( "plugins", - JSON.stringify([{ name: s.name, url: a }]) + JSON.stringify([{ name: o.name, url: a }]) ); else { const c = this.getPlugins(); - c.push({ name: s.name, url: a }), this.savePlugins(c); + c.push({ name: o.name, url: a }), this.savePlugins(c); } this.error(!1); - }).catch((s) => { - console.error(s), this.error(!0); + }).catch((o) => { + console.error(o), this.error(!0); }); } error(e) { @@ -7480,7 +7570,7 @@ class Jc extends HTMLElement { this.dialog = document.createElement("dialog"), this.dialog.innerHTML = `

    Plugins

    - +
    @@ -7635,30 +7725,33 @@ class Jc extends HTMLElement { } closeModal() { var e, r; - (r = (e = this.shadowRoot) == null ? void 0 : e.querySelector("dialog")) == null || r.close(), window.removeEventListener("paste", to, !0); + (r = (e = this.shadowRoot) == null ? void 0 : e.querySelector("dialog")) == null || r.close(), window.removeEventListener("paste", ao, !0); } openModal() { var e, r; - (r = (e = this.shadowRoot) == null ? void 0 : e.querySelector("dialog")) == null || r.showModal(), window.addEventListener("paste", to, !0); + (r = (e = this.shadowRoot) == null ? void 0 : e.querySelector("dialog")) == null || r.showModal(), window.addEventListener("paste", ao, !0); } } -function Yc() { - customElements.define("installer-modal", Jc); +function nl() { + customElements.define("installer-modal", rl); const t = document.createElement("installer-modal"); document.body.appendChild(t), document.addEventListener("keydown", (e) => { var r; e.key.toUpperCase() === "I" && e.ctrlKey && ((r = document.querySelector("installer-modal")) == null || r.openModal()); }); } -console.log("Loading plugin system"); +console.log("%c[PLUGINS] Loading plugin system", "color: #008d7c"); repairIntrinsics({ - evalTaming: "unsafeEval" + evalTaming: "unsafeEval", + stackFiltering: "verbose", + errorTaming: "unsafe", + consoleTaming: "unsafe" }); globalThis.initPluginsRuntime = (t) => { if (t) { - console.log("Initialize context"), globalThis.ɵcontext = t, globalThis.ɵloadPlugin = vs, Yc(), qc(t); - for (const e of en) - t.addListener(e, Vc.bind(null, e)); + console.log("%c[PLUGINS] Initialize context", "color: #008d7c"), globalThis.ɵcontext = t, globalThis.ɵloadPlugin = Ss, nl(), el(t); + for (const e of sn) + t.addListener(e, Xc.bind(null, e)); } }; -//# sourceMappingURL=index.mjs.map +//# sourceMappingURL=index.js.map diff --git a/frontend/resources/templates/index.mustache b/frontend/resources/templates/index.mustache index 285d1820c..b5967f94d 100644 --- a/frontend/resources/templates/index.mustache +++ b/frontend/resources/templates/index.mustache @@ -29,7 +29,7 @@ {{/manifest}} - + diff --git a/frontend/scripts/_helpers.js b/frontend/scripts/_helpers.js index b8fbd0de5..d4bb7182b 100644 --- a/frontend/scripts/_helpers.js +++ b/frontend/scripts/_helpers.js @@ -303,7 +303,20 @@ async function readTranslations() { } } - return JSON.stringify(result); + return result; +} + +function filterTranslations(translations, langs = [], keyFilter) { + const filteredEntries = Object.entries(translations) + .filter(([translationKey, _]) => keyFilter(translationKey)) + .map(([translationKey, value]) => { + const langEntries = Object.entries(value).filter(([lang, _]) => + langs.includes(lang), + ); + return [translationKey, Object.fromEntries(langEntries)]; + }); + + return Object.fromEntries(filteredEntries); } async function generateSvgSprite(files, prefix) { @@ -355,7 +368,14 @@ async function generateTemplates() { const isDebug = process.env.NODE_ENV !== "production"; await fs.mkdir("./resources/public/", { recursive: true }); - const translations = await readTranslations(); + let translations = await readTranslations(); + const storybookTranslations = JSON.stringify( + filterTranslations(translations, ["en"], (key) => + key.startsWith("labels."), + ), + ); + translations = JSON.stringify(translations); + const manifest = await readShadowManifest(); let content; @@ -408,6 +428,7 @@ async function generateTemplates() { "resources/templates/preview-head.mustache", { manifest: manifest, + translations: JSON.stringify(storybookTranslations), }, partials, ); -- Gitee From 8feb5dabb065bd91f558559cc8cb634b13b1a51e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Fri, 30 Aug 2024 15:45:52 +0200 Subject: [PATCH 1219/1266] :sparkles: Use translations in a DS component story --- frontend/shadow-cljs.edn | 1 - frontend/src/app/main/ui/ds.cljs | 7 ++++++- frontend/src/app/main/ui/ds/product/loader.cljs | 5 ++--- frontend/src/app/main/ui/ds/product/loader.stories.jsx | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/frontend/shadow-cljs.edn b/frontend/shadow-cljs.edn index 608357a29..0c0b91b57 100644 --- a/frontend/shadow-cljs.edn +++ b/frontend/shadow-cljs.edn @@ -91,7 +91,6 @@ :modules {:base {:entries []} - :components {:exports {default app.main.ui.ds/default} :depends-on #{:base}}} diff --git a/frontend/src/app/main/ui/ds.cljs b/frontend/src/app/main/ui/ds.cljs index e0f1c944f..6c4dcd8d1 100644 --- a/frontend/src/app/main/ui/ds.cljs +++ b/frontend/src/app/main/ui/ds.cljs @@ -6,6 +6,7 @@ (ns app.main.ui.ds (:require + [app.config :as cf] [app.main.ui.ds.buttons.button :refer [button*]] [app.main.ui.ds.buttons.icon-button :refer [icon-button*]] [app.main.ui.ds.forms.input :refer [input*]] @@ -17,7 +18,11 @@ [app.main.ui.ds.notifications.toast :refer [toast*]] [app.main.ui.ds.product.loader :refer [loader*]] [app.main.ui.ds.storybook :as sb] - [app.main.ui.ds.tab-switcher :refer [tab-switcher*]])) + [app.main.ui.ds.tab-switcher :refer [tab-switcher*]] + [app.util.i18n :as i18n])) + + +(i18n/init! cf/translations) (def default "A export used for storybook" diff --git a/frontend/src/app/main/ui/ds/product/loader.cljs b/frontend/src/app/main/ui/ds/product/loader.cljs index eca99efee..4249e2e22 100644 --- a/frontend/src/app/main/ui/ds/product/loader.cljs +++ b/frontend/src/app/main/ui/ds/product/loader.cljs @@ -10,6 +10,7 @@ [app.main.style :as stl]) (:require [app.common.math :as mth] + [app.util.i18n :as i18n :refer [tr]] [rumext.v2 :as mf])) (mf/defc loader-icon* @@ -40,11 +41,9 @@ h (or height (when (some? width) (mth/ceil (* width (/ 27 100)))) 27) class (dm/str (or class "") " " (stl/css-case :wrapper true :wrapper-overlay overlay)) + title (or title (tr "labels.loading")) props (mf/spread-props props {:class class})] - (assert title - (dm/str "You must provide an accesible name for the component")) - [:> "div" props [:> loader-icon* {:title title :width w diff --git a/frontend/src/app/main/ui/ds/product/loader.stories.jsx b/frontend/src/app/main/ui/ds/product/loader.stories.jsx index 8616f5c88..7292d701b 100644 --- a/frontend/src/app/main/ui/ds/product/loader.stories.jsx +++ b/frontend/src/app/main/ui/ds/product/loader.stories.jsx @@ -7,10 +7,10 @@ export default { title: "Product/Loader", component: Loader, args: { - title: "Loading…", overlay: false, }, argTypes: { + title: { control: "text" }, width: { control: "number" }, height: { control: "number" }, overlay: { control: "boolean" }, -- Gitee From 298db467225f26149fe75917261d1eec9de55c25 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Thu, 29 Aug 2024 13:44:36 +0200 Subject: [PATCH 1220/1266] :sparkles: Add documentation to select on storybook --- frontend/src/app/main/ui/ds/_sizes.scss | 1 + .../src/app/main/ui/ds/controls/select.cljs | 16 ++--- .../src/app/main/ui/ds/controls/select.mdx | 63 +++++++++++++++++++ .../src/app/main/ui/ds/controls/select.scss | 5 ++ .../main/ui/ds/controls/select.stories.jsx | 1 - frontend/src/app/main/ui/workspace.cljs | 2 - 6 files changed, 77 insertions(+), 11 deletions(-) create mode 100644 frontend/src/app/main/ui/ds/controls/select.mdx diff --git a/frontend/src/app/main/ui/ds/_sizes.scss b/frontend/src/app/main/ui/ds/_sizes.scss index e8d134cb0..63ad1f93b 100644 --- a/frontend/src/app/main/ui/ds/_sizes.scss +++ b/frontend/src/app/main/ui/ds/_sizes.scss @@ -9,5 +9,6 @@ // TODO: create actual tokens once we have them from design $sz-16: px2rem(16); $sz-32: px2rem(32); +$sz-36: px2rem(36); $sz-224: px2rem(224); $sz-400: px2rem(400); diff --git a/frontend/src/app/main/ui/ds/controls/select.cljs b/frontend/src/app/main/ui/ds/controls/select.cljs index 59b6b35a3..5389ed854 100644 --- a/frontend/src/app/main/ui/ds/controls/select.cljs +++ b/frontend/src/app/main/ui/ds/controls/select.cljs @@ -19,7 +19,7 @@ (mf/defc option* {::mf/props :obj ::mf/private true} - [{:keys [id label icon aria-label on-click selected on-ref focused] :rest props}] + [{:keys [id label icon aria-label on-click selected set-ref focused] :rest props}] [:> :li {:value id :class (stl/css-case :option true :option-with-icon (some? icon) @@ -27,7 +27,7 @@ :aria-selected selected :ref (fn [node] - (on-ref node id)) + (set-ref node id)) :role "option" :id id :on-click on-click @@ -52,7 +52,7 @@ (mf/defc options-dropdown* {::mf/props :obj ::mf/private true} - [{:keys [on-ref on-click options selected focused] :rest props}] + [{:keys [set-ref on-click options selected focused] :rest props}] (let [props (mf/spread-props props {:class (stl/css :option-list) :tab-index "-1" @@ -69,7 +69,7 @@ :label label :icon icon :aria-label aria-label - :on-ref on-ref + :set-ref set-ref :focused (= id focused) :on-click on-click}]))])) @@ -158,7 +158,7 @@ options-nodes-refs (mf/use-ref nil) options-ref (mf/use-ref nil) - on-ref + set-ref (mf/use-fn (fn [node id] (let [refs (or (mf/ref-val options-nodes-refs) #js {}) @@ -225,8 +225,8 @@ [:div {:class (stl/css :select-wrapper)} [:> :button props - [:div {:class (stl/css-case :select-header true - :header-icon (some? icon))} + [:span {:class (stl/css-case :select-header true + :header-icon (some? icon))} (when icon [:> icon* {:id icon :size "s" @@ -242,4 +242,4 @@ :options options :selected selected :focused focused - :on-ref on-ref}])])) + :set-ref set-ref}])])) diff --git a/frontend/src/app/main/ui/ds/controls/select.mdx b/frontend/src/app/main/ui/ds/controls/select.mdx new file mode 100644 index 000000000..2bc21a8c6 --- /dev/null +++ b/frontend/src/app/main/ui/ds/controls/select.mdx @@ -0,0 +1,63 @@ +import { Canvas, Meta } from '@storybook/blocks'; +import * as SelectStories from "./select.stories"; + + + +# Select + +Select lets users choose one option from an options menu. + +## Variants + +**Text**: We will use this variant when there are enough space and icons don't add any useful context. + + + +**Icon and text**: We will use this variant when there are enough space and icons add any useful context. + + +## Technical notes + +### Icons + +Each option of `select*` may accept an `icon`, which must contain an [icon ID](../foundations/assets/icon.mdx). +These are available in the `app.main.ds.foundations.assets.icon` namespace. + + +```clj +(ns app.main.ui.foo + (:require + [app.main.ui.ds.foundations.assets.icon :as i])) +``` + +```clj +[:> select* + {:options [{ :label "Code" + :id "option-code" + :icon i/fill-content } + { :label "Design" + :id "option-design" + :icon i/pentool } + { :label "Menu" + :id "option-menu" } + ]}] +``` + + + +## Usage guidelines (design) + +### Where to use + +Used in a wide range of applications in the app, +to select among available text-based options, +sometimes with icons that offers additional context. + +### When to use + +Consider using select when you have 5 or more options to choose from. + +### Interaction / Behavior + +When the user clicks on the clickable area, a list of +options appears. When an option is chosen, the list is closed. \ No newline at end of file diff --git a/frontend/src/app/main/ui/ds/controls/select.scss b/frontend/src/app/main/ui/ds/controls/select.scss index f7e0bf242..ff2cbe507 100644 --- a/frontend/src/app/main/ui/ds/controls/select.scss +++ b/frontend/src/app/main/ui/ds/controls/select.scss @@ -21,6 +21,7 @@ } @include use-typography("body-small"); + position: relative; display: grid; grid-template-rows: auto; gap: var(--sp-xxs); @@ -83,6 +84,10 @@ .option-list { --options-dropdown-bg-color: var(--color-background-tertiary); + position: absolute; + right: 0; + top: $sz-36; + width: 100%; background-color: var(--options-dropdown-bg-color); border-radius: $br-8; border: $b-1 solid var(--select-dropdown-border-color); diff --git a/frontend/src/app/main/ui/ds/controls/select.stories.jsx b/frontend/src/app/main/ui/ds/controls/select.stories.jsx index 27dddd051..03f488e8e 100644 --- a/frontend/src/app/main/ui/ds/controls/select.stories.jsx +++ b/frontend/src/app/main/ui/ds/controls/select.stories.jsx @@ -59,7 +59,6 @@ export const WithIcons = { { label: "Menu", id: "option-menu", - icon: "mask", }, ], }, diff --git a/frontend/src/app/main/ui/workspace.cljs b/frontend/src/app/main/ui/workspace.cljs index ba11982ea..e113096cf 100644 --- a/frontend/src/app/main/ui/workspace.cljs +++ b/frontend/src/app/main/ui/workspace.cljs @@ -81,8 +81,6 @@ (reset! palete-size size))) node-ref (use-resize-observer on-resize)] - - [:* (when (not hide-ui?) [:& palette {:layout layout -- Gitee From 91f6c001c0493c2fb215955fe53786a5d5cd73f4 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 3 Sep 2024 06:47:53 +0200 Subject: [PATCH 1221/1266] :books: Update changelog --- CHANGES.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index f0f5a05ec..27fdcc1b2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -8,6 +8,9 @@ ### :heart: Community contributions (Thank you!) +- Set proper default tenant on exporter (by @june128) [#4946](https://github.com/penpot/penpot/pull/4946) +- Correct a spelling in onboarding.edn (by @n-stha) [#4936](https://github.com/penpot/penpot/pull/4936) + ### :sparkles: New features - **Tiered File Data Storage** [Taiga #8376](https://tree.taiga.io/project/penpot/us/8376) @@ -56,6 +59,10 @@ registration only for OIDC authentication backend [Github #4882](https://github.com/penpot/penpot/issues/4882) +- https://tree.taiga.io/project/penpot/us/8145 + +- Update templates in libraries & templates in dashboard modal [Taiga #8145](https://tree.taiga.io/project/penpot/us/8145) + ### :bug: Bugs fixed - Fix wrong props on padding input [Taiga #8254](https://tree.taiga.io/project/penpot/issue/8254) -- Gitee From 6d8c4247108429355a65a0f70cc650f1267ae68f Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 3 Sep 2024 08:21:25 +0200 Subject: [PATCH 1222/1266] :paperclip: Fix linter issues on ui.auth ns --- frontend/src/app/main/ui/auth.cljs | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/src/app/main/ui/auth.cljs b/frontend/src/app/main/ui/auth.cljs index b4c2b0a7f..1b5fb62b4 100644 --- a/frontend/src/app/main/ui/auth.cljs +++ b/frontend/src/app/main/ui/auth.cljs @@ -8,7 +8,6 @@ (:require-macros [app.main.style :as stl]) (:require [app.common.data.macros :as dm] - [app.config :as cf] [app.main.data.users :as du] [app.main.store :as st] [app.main.ui.auth.login :refer [login-page]] -- Gitee From d2509f4b97223b87ff9a96e5ddf21a818a1bf0f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Albeza?= Date: Mon, 2 Sep 2024 16:39:56 +0200 Subject: [PATCH 1223/1266] :books: Update changelog with the latest DS features --- CHANGES.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 27fdcc1b2..20f1ba877 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -59,10 +59,16 @@ registration only for OIDC authentication backend [Github #4882](https://github.com/penpot/penpot/issues/4882) -- https://tree.taiga.io/project/penpot/us/8145 - - Update templates in libraries & templates in dashboard modal [Taiga #8145](https://tree.taiga.io/project/penpot/us/8145) +- **Design System** + + We implemented and subbed in new components from our Design System: `loader*` ([Taiga #8355](https://tree.taiga.io/project/penpot/task/8355)) and `tab-switcher*` ([Taiga #8518](https://tree.taiga.io/project/penpot/task/8518)). + +- **Storybook** [Taiga #6329](https://tree.taiga.io/project/penpot/us/6329) + + The Design System components are now published in a Storybook, available at `/storybook`. + ### :bug: Bugs fixed - Fix wrong props on padding input [Taiga #8254](https://tree.taiga.io/project/penpot/issue/8254) -- Gitee From 2a13c2ec005ecf450b98d766f5fb8a967ab7e3c8 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Fri, 30 Aug 2024 15:54:57 +0200 Subject: [PATCH 1224/1266] :tada: Add export event for telemetry --- frontend/src/app/main/data/exports.cljs | 53 +++++++++---------- .../app/main/data/workspace/shortcuts.cljs | 2 +- frontend/src/app/main/ui/export.cljs | 21 +++++--- .../app/main/ui/viewer/inspect/exports.cljs | 12 ++++- .../src/app/main/ui/workspace/main_menu.cljs | 2 +- .../sidebar/options/menus/exports.cljs | 20 +++++-- 6 files changed, 68 insertions(+), 42 deletions(-) diff --git a/frontend/src/app/main/data/exports.cljs b/frontend/src/app/main/data/exports.cljs index d77a4a021..ebea22149 100644 --- a/frontend/src/app/main/data/exports.cljs +++ b/frontend/src/app/main/data/exports.cljs @@ -49,31 +49,30 @@ (defn show-workspace-export-dialog - ([] (show-workspace-export-dialog nil)) - ([{:keys [selected]}] - (ptk/reify ::show-workspace-export-dialog - ptk/WatchEvent - (watch [_ state _] - (let [file-id (:current-file-id state) - page-id (:current-page-id state) - selected (or selected (wsh/lookup-selected state page-id {})) - - shapes (if (seq selected) - (wsh/lookup-shapes state selected) - (reverse (wsh/filter-shapes state #(pos? (count (:exports %)))))) - - exports (for [shape shapes - export (:exports shape)] - (-> export - (assoc :enabled true) - (assoc :page-id page-id) - (assoc :file-id file-id) - (assoc :object-id (:id shape)) - (assoc :shape (dissoc shape :exports)) - (assoc :name (:name shape))))] - - (rx/of (modal/show :export-shapes - {:exports (vec exports)}))))))) + [{:keys [selected origin]}] + (ptk/reify ::show-workspace-export-dialog + ptk/WatchEvent + (watch [_ state _] + (let [file-id (:current-file-id state) + page-id (:current-page-id state) + selected (or selected (wsh/lookup-selected state page-id {})) + + shapes (if (seq selected) + (wsh/lookup-shapes state selected) + (reverse (wsh/filter-shapes state #(pos? (count (:exports %)))))) + + exports (for [shape shapes + export (:exports shape)] + (-> export + (assoc :enabled true) + (assoc :page-id page-id) + (assoc :file-id file-id) + (assoc :object-id (:id shape)) + (assoc :shape (dissoc shape :exports)) + (assoc :name (:name shape))))] + + (rx/of (modal/show :export-shapes + {:exports (vec exports) :origin origin})))))) (defn show-viewer-export-dialog [{:keys [shapes page-id file-id share-id exports]}] @@ -90,7 +89,7 @@ (assoc :shape (dissoc shape :exports)) (assoc :name (:name shape)) (cond-> share-id (assoc :share-id share-id))))] - (rx/of (modal/show :export-shapes {:exports (vec exports)})))))) #_TODO + (rx/of (modal/show :export-shapes {:exports (vec exports) :origin "viewer"})))))) #_TODO (defn show-workspace-export-frames-dialog [frames] @@ -108,7 +107,7 @@ :name (:name frame)})] (rx/of (modal/show :export-frames - {:exports (vec exports)})))))) + {:exports (vec exports) :origin "workspace:menu"})))))) (defn- initialize-export-status [exports cmd resource] diff --git a/frontend/src/app/main/data/workspace/shortcuts.cljs b/frontend/src/app/main/data/workspace/shortcuts.cljs index bd0071602..fe1342d55 100644 --- a/frontend/src/app/main/data/workspace/shortcuts.cljs +++ b/frontend/src/app/main/data/workspace/shortcuts.cljs @@ -396,7 +396,7 @@ :command (ds/c-mod "shift+e") :subsections [:basics :main-menu] :fn #(st/emit! - (de/show-workspace-export-dialog))} + (de/show-workspace-export-dialog {:origin "workspace:shortcuts"}))} :toggle-snap-ruler-guide {:tooltip (ds/meta-shift "G") :command (ds/c-mod "shift+g") diff --git a/frontend/src/app/main/ui/export.cljs b/frontend/src/app/main/ui/export.cljs index c13b074a4..ff14251a9 100644 --- a/frontend/src/app/main/ui/export.cljs +++ b/frontend/src/app/main/ui/export.cljs @@ -11,6 +11,7 @@ [app.common.colors :as clr] [app.common.data :as d] [app.common.data.macros :as dm] + [app.main.data.events :as ev] [app.main.data.exports :as de] [app.main.data.modal :as modal] [app.main.refs :as refs] @@ -23,6 +24,7 @@ [app.util.strings :as ust] [beicon.v2.core :as rx] [cuerdas.core :as str] + [potok.v2.core :as ptk] [rumext.v2 :as mf])) (def ^:private neutral-icon @@ -35,10 +37,9 @@ (i/icon-xref :close (stl/css :close-icon))) (mf/defc export-multiple-dialog - [{:keys [exports title cmd no-selection]}] + [{:keys [exports title cmd no-selection origin]}] (let [lstate (mf/deref refs/export) in-progress? (:in-progress lstate) - exports (mf/use-state exports) all-exports (deref exports) @@ -61,7 +62,11 @@ (st/emit! (modal/hide) (de/request-multiple-export {:exports enabled-exports - :cmd cmd}))) + :cmd cmd}) + (ptk/event + ::ev/event {::ev/name "export-shapes" + ::ev/origin origin + :num-shapes (count enabled-exports)}))) on-toggle-enabled (mf/use-fn @@ -186,23 +191,25 @@ (mf/defc export-shapes-dialog {::mf/register modal/components ::mf/register-as :export-shapes} - [{:keys [exports]}] + [{:keys [exports origin]}] (let [title (tr "dashboard.export-shapes.title")] [:& export-multiple-dialog {:exports exports :title title :cmd :export-shapes - :no-selection shapes-no-selection}])) + :no-selection shapes-no-selection + :origin origin}])) (mf/defc export-frames {::mf/register modal/components ::mf/register-as :export-frames} - [{:keys [exports]}] + [{:keys [exports origin]}] (let [title (tr "dashboard.export-frames.title")] [:& export-multiple-dialog {:exports exports :title title - :cmd :export-frames}])) + :cmd :export-frames + :origin origin}])) (mf/defc export-progress-widget {::mf/wrap [mf/memo]} diff --git a/frontend/src/app/main/ui/viewer/inspect/exports.cljs b/frontend/src/app/main/ui/viewer/inspect/exports.cljs index 392b6d8cd..2e38efd40 100644 --- a/frontend/src/app/main/ui/viewer/inspect/exports.cljs +++ b/frontend/src/app/main/ui/viewer/inspect/exports.cljs @@ -8,6 +8,7 @@ (:require-macros [app.main.style :as stl]) (:require [app.common.data :as d] + [app.main.data.events :as ev] [app.main.data.exports :as de] [app.main.refs :as refs] [app.main.store :as st] @@ -17,6 +18,7 @@ [app.util.dom :as dom] [app.util.i18n :refer [tr c]] [app.util.keyboard :as kbd] + [potok.v2.core :as ptk] [rumext.v2 :as mf])) (mf/defc exports @@ -62,8 +64,14 @@ (cond-> share-id (assoc :share-id share-id))) exports (mapv #(merge % defaults) @exports)] (if (= 1 (count exports)) - (st/emit! (de/request-simple-export {:export (first exports)})) - (st/emit! (de/request-multiple-export {:exports exports :filename filename})))))) + (st/emit! + (de/request-simple-export {:export (first exports)}) + (ptk/event + ::ev/event {::ev/name "export-shapes" ::ev/origin "viewer" :num-shapes 1})) + (st/emit! + (de/request-multiple-export {:exports exports}) + (ptk/event + ::ev/event {::ev/name "export-shapes" ::ev/origin "viewer" :num-shapes (count exports)})))))) add-export (mf/use-callback diff --git a/frontend/src/app/main/ui/workspace/main_menu.cljs b/frontend/src/app/main/ui/workspace/main_menu.cljs index 2abca79a0..8fb4b6135 100644 --- a/frontend/src/app/main/ui/workspace/main_menu.cljs +++ b/frontend/src/app/main/ui/workspace/main_menu.cljs @@ -508,7 +508,7 @@ (on-add-shared event)))) on-export-shapes - (mf/use-fn #(st/emit! (de/show-workspace-export-dialog))) + (mf/use-fn #(st/emit! (de/show-workspace-export-dialog {:origin "workspace:menu"}))) on-export-shapes-key-down (mf/use-fn diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/exports.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/menus/exports.cljs index a1981f191..13133cc47 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/exports.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/exports.cljs @@ -8,6 +8,7 @@ (:require-macros [app.main.style :as stl]) (:require [app.common.data :as d] + [app.main.data.events :as ev] [app.main.data.exports :as de] [app.main.data.workspace.shapes :as dwsh] [app.main.data.workspace.state-helpers :as wsh] @@ -20,6 +21,7 @@ [app.util.dom :as dom] [app.util.i18n :refer [tr c]] [app.util.keyboard :as kbd] + [potok.v2.core :as ptk] [rumext.v2 :as mf])) (def exports-attrs @@ -75,8 +77,12 @@ (cond-> sname (some? suffix) (str suffix)) - (st/emit! (de/request-simple-export {:export (merge export defaults)}))) - (st/emit! (de/show-workspace-export-dialog {:selected (reverse ids)}))) + (st/emit! + (de/request-simple-export {:export (merge export defaults)}) + (ptk/event + ::ev/event {::ev/name "export-shapes" ::ev/origin "workspace:sidebar" :num-shapes 1}))) + (st/emit! + (de/show-workspace-export-dialog {:selected (reverse ids) :origin "workspace:sidebar"}))) ;; In other all cases we only allowed to have a single ;; shape-id because multiple shape-ids are handled @@ -88,8 +94,14 @@ exports (mapv #(merge % defaults) exports)] (if (= 1 (count exports)) (let [export (first exports)] - (st/emit! (de/request-simple-export {:export export}))) - (st/emit! (de/request-multiple-export {:exports exports}))))))) + (st/emit! + (de/request-simple-export {:export export}) + (ptk/event + ::ev/event {::ev/name "export-shapes" ::ev/origin "workspace:sidebar" :num-shapes 1}))) + (st/emit! + (de/request-multiple-export {:exports exports}) + (ptk/event + ::ev/event {::ev/name "export-shapes" ::ev/origin "workspace:sidebar" :num-shapes (count exports)}))))))) ;; TODO: maybe move to specific events for avoid to have this logic here? add-export -- Gitee From c642f4afa26dec2716954f37a55868b363a94c18 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 3 Sep 2024 12:52:36 +0200 Subject: [PATCH 1225/1266] :paperclip: Update version.txt file --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index ac2cdeba0..7d2ed7c70 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.1.3 +2.1.4 -- Gitee From 689aab32c9cf7713a62852087cb62e46eb4b2d24 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 3 Sep 2024 13:04:04 +0200 Subject: [PATCH 1226/1266] :paperclip: Update changelog --- CHANGES.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 0aa485362..5b6141608 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,14 @@ # CHANGELOG -## 2.1.2 +## 2.1.4 + +### :bug: Bugs fixed + +- Fix json encoding on zip encoding decoding. +- Add schema validation for color changes. +- Fix render of some texts without position data. + +## 2.1.3 ### :bug: Bugs fixed -- Gitee From be84b1cb01c408b785e628b3c743bba6fe7358d1 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 3 Sep 2024 11:16:34 +0200 Subject: [PATCH 1227/1266] :bug: Change place for circular dependency workaround --- frontend/src/app/plugins.cljs | 12 ++++++++++++ frontend/src/app/plugins/library.cljs | 4 ---- frontend/src/app/plugins/shape.cljs | 6 ------ 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/frontend/src/app/plugins.cljs b/frontend/src/app/plugins.cljs index d3a4872a7..8fccc0dcb 100644 --- a/frontend/src/app/plugins.cljs +++ b/frontend/src/app/plugins.cljs @@ -10,8 +10,13 @@ [app.main.features :as features] [app.main.store :as st] [app.plugins.api :as api] + [app.plugins.flex :as flex] + [app.plugins.format :as format] + [app.plugins.grid :as grid] + [app.plugins.library :as library] [app.plugins.public-utils] [app.plugins.register :as register] + [app.plugins.shape :as shape] [app.util.globals :refer [global]] [app.util.object :as obj] [beicon.v2.core :as rx] @@ -36,3 +41,10 @@ (rx/tap init-plugins-runtime!) (rx/ignore))))) +;; Prevent circular dependency +(set! flex/shape-proxy? shape/shape-proxy?) +(set! grid/shape-proxy? shape/shape-proxy?) +(set! format/shape-proxy shape/shape-proxy) + +(set! shape/lib-typography-proxy? library/lib-typography-proxy?) +(set! shape/lib-component-proxy library/lib-component-proxy) diff --git a/frontend/src/app/plugins/library.cljs b/frontend/src/app/plugins/library.cljs index 1e00d27f3..31080c720 100644 --- a/frontend/src/app/plugins/library.cljs +++ b/frontend/src/app/plugins/library.cljs @@ -413,8 +413,6 @@ (defn lib-typography-proxy? [p] (instance? LibraryTypographyProxy p)) -(set! shape/lib-typography-proxy? lib-typography-proxy?) - (defn lib-typography-proxy [plugin-id file-id id] (assert (uuid? file-id)) @@ -758,8 +756,6 @@ value (dm/str value " / " (:name component))] (st/emit! (dwl/rename-component id value)))))})) -(set! shape/lib-component-proxy lib-component-proxy) - (deftype Library [$plugin $id] Object diff --git a/frontend/src/app/plugins/shape.cljs b/frontend/src/app/plugins/shape.cljs index 1a8bb3e63..a6a1730be 100644 --- a/frontend/src/app/plugins/shape.cljs +++ b/frontend/src/app/plugins/shape.cljs @@ -576,12 +576,6 @@ (defn shape-proxy? [p] (instance? ShapeProxy p)) -;; Prevent circular dependency -(do (set! flex/shape-proxy? shape-proxy?) - (set! grid/shape-proxy? shape-proxy?)) - -(set! format/shape-proxy shape-proxy) - (crc/define-properties! ShapeProxy {:name js/Symbol.toStringTag -- Gitee From 37a6446e323430a9ef1430ca5deb8f75ae1e5c21 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 3 Sep 2024 11:17:05 +0200 Subject: [PATCH 1228/1266] :bug: Fix problem with font style --- frontend/src/app/plugins/text.cljs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/plugins/text.cljs b/frontend/src/app/plugins/text.cljs index b5e398d65..bdcc67b04 100644 --- a/frontend/src/app/plugins/text.cljs +++ b/frontend/src/app/plugins/text.cljs @@ -193,7 +193,7 @@ :set (fn [self value] (let [font (fonts/get-font-data (obj/get self "fontId")) - variant (fonts/find-variant font {:weight (dm/str value)})] + variant (fonts/find-variant font {:style (dm/str value)})] (cond (nil? variant) (u/display-not-valid :fontStyle (dm/str "Font style '" value "' not supported for the current font")) @@ -456,7 +456,7 @@ (fn [self value] (let [id (obj/get self "$id") font (fonts/get-font-data (obj/get self "fontId")) - variant (fonts/find-variant font {:weight (dm/str value)})] + variant (fonts/find-variant font {:style (dm/str value)})] (cond (nil? variant) (u/display-not-valid :fontStyle (dm/str "Font style '" value "' not supported for the current font")) -- Gitee From 5f2ec595cb89b96e4b9178a46a9acb182ee12197 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 3 Sep 2024 13:15:48 +0200 Subject: [PATCH 1229/1266] :paperclip: Update changelog --- CHANGES.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 69ada0a1d..06a29a52b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,17 @@ # CHANGELOG +## 2.3.0 + +### :rocket: Epics and highlights + +### :boom: Breaking changes & Deprecations + +### :heart: Community contributions (Thank you!) + +### :sparkles: New features + +### :bug: Bugs fixed + ## 2.2.0 ### :rocket: Epics and highlights -- Gitee From 71ba0242c708cedb0e62a1afe84eb81649bbdd16 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 2 Sep 2024 16:34:03 +0200 Subject: [PATCH 1230/1266] :bug: Add missing type decoding on changes schema --- common/src/app/common/files/changes.cljc | 17 +++++++++++------ common/src/app/common/types/page.cljc | 18 +++++++++++------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/common/src/app/common/files/changes.cljc b/common/src/app/common/files/changes.cljc index a46c02352..40a253759 100644 --- a/common/src/app/common/files/changes.cljc +++ b/common/src/app/common/files/changes.cljc @@ -31,8 +31,7 @@ ;; SCHEMAS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(def ^:private - schema:operation +(def schema:operation [:multi {:dispatch :type :title "Operation" :decode/json #(update % :type keyword) @@ -61,9 +60,12 @@ [:type [:= :set-remote-synced]] [:remote-synced {:optional true} [:maybe :boolean]]]]]) -(sm/register! ::change +(def schema:change [:schema - [:multi {:dispatch :type :title "Change" ::smd/simplified true} + [:multi {:dispatch :type + :title "Change" + :decode/json #(update % :type keyword) + ::smd/simplified true} [:set-option [:map {:title "SetOptionChange"} [:type [:= :set-option]] @@ -256,8 +258,11 @@ [:type [:= :del-typography]] [:id ::sm/uuid]]]]]) -(sm/register! ::changes - [:sequential {:gen/max 2} ::change]) +(def schema:changes + [:sequential {:gen/max 5 :gen/min 1} schema:change]) + +(sm/register! ::change schema:change) +(sm/register! ::changes schema:changes) (def check-change! (sm/check-fn ::change)) diff --git a/common/src/app/common/types/page.cljc b/common/src/app/common/types/page.cljc index 1c3bef33b..b49755115 100644 --- a/common/src/app/common/types/page.cljc +++ b/common/src/app/common/types/page.cljc @@ -18,20 +18,20 @@ ;; SCHEMAS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(sm/register! ::flow - [:map {:title "PageFlow"} +(def schema:flow + [:map {:title "Flow"} [:id ::sm/uuid] [:name :string] [:starting-frame ::sm/uuid]]) -(sm/register! ::guide - [:map {:title "PageGuide"} +(def schema:guide + [:map {:title "Guide"} [:id ::sm/uuid] [:axis [::sm/one-of #{:x :y}]] [:position ::sm/safe-number] [:frame-id {:optional true} [:maybe ::sm/uuid]]]) -(sm/register! ::page +(def schema:page [:map {:title "FilePage"} [:id ::sm/uuid] [:name :string] @@ -42,11 +42,15 @@ [:background {:optional true} ::ctc/rgb-color] [:saved-grids {:optional true} ::ctg/saved-grids] [:flows {:optional true} - [:vector {:gen/max 2} ::flow]] + [:vector {:gen/max 2} schema:flow]] [:guides {:optional true} - [:map-of {:gen/max 2} ::sm/uuid ::guide]] + [:map-of {:gen/max 2} ::sm/uuid schema:guide]] [:plugin-data {:optional true} ::ctpg/plugin-data]]]]) +(sm/register! ::page schema:page) +(sm/register! ::guide schema:guide) +(sm/register! ::flow schema:flow) + (def check-page-guide! (sm/check-fn ::guide)) -- Gitee From 50df2279a7b3258c25b52c85a39d55cb5781e469 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 2 Sep 2024 16:40:18 +0200 Subject: [PATCH 1231/1266] :bug: Make the media cleaning on file-gc task aware of snapshots It now takes in account the snapshots, and prevents deletion of media files used in snapshots. --- backend/src/app/migrations.clj | 5 +- .../sql/0130-mod-file-change-table.sql | 2 + .../src/app/rpc/commands/files_snapshot.clj | 5 +- backend/src/app/rpc/commands/files_update.clj | 1 + backend/src/app/tasks/file_gc.clj | 60 +++++++++++-------- backend/src/app/tasks/file_xlog_gc.clj | 5 +- frontend/src/debug.cljs | 6 +- 7 files changed, 53 insertions(+), 31 deletions(-) create mode 100644 backend/src/app/migrations/sql/0130-mod-file-change-table.sql diff --git a/backend/src/app/migrations.clj b/backend/src/app/migrations.clj index bc61a89d1..5226e5152 100644 --- a/backend/src/app/migrations.clj +++ b/backend/src/app/migrations.clj @@ -409,7 +409,10 @@ :fn (mg/resource "app/migrations/sql/0128-mod-task-table.sql")} {:name "0129-mod-file-change-table" - :fn (mg/resource "app/migrations/sql/0129-mod-file-change-table.sql")}]) + :fn (mg/resource "app/migrations/sql/0129-mod-file-change-table.sql")} + + {:name "0130-mod-file-change-table" + :fn (mg/resource "app/migrations/sql/0130-mod-file-change-table.sql")}]) (defn apply-migrations! [pool name migrations] diff --git a/backend/src/app/migrations/sql/0130-mod-file-change-table.sql b/backend/src/app/migrations/sql/0130-mod-file-change-table.sql new file mode 100644 index 000000000..272828fc2 --- /dev/null +++ b/backend/src/app/migrations/sql/0130-mod-file-change-table.sql @@ -0,0 +1,2 @@ +ALTER TABLE file_change + ADD COLUMN version integer NULL; diff --git a/backend/src/app/rpc/commands/files_snapshot.clj b/backend/src/app/rpc/commands/files_snapshot.clj index ced6a64de..2fdb262a0 100644 --- a/backend/src/app/rpc/commands/files_snapshot.clj +++ b/backend/src/app/rpc/commands/files_snapshot.clj @@ -103,6 +103,7 @@ (db/update! conn :file {:data (:data snapshot) :revn (inc (:revn file)) + :version (:version snapshot) :data-backend nil :data-ref-id nil :has-media-trimmed false @@ -170,7 +171,7 @@ (update :data blob/encode))))) (defn take-file-snapshot! - [cfg {:keys [file-id label]}] + [cfg {:keys [file-id label ::rpc/profile-id]}] (let [file (get-file cfg file-id) id (uuid/next)] @@ -182,7 +183,9 @@ {:id id :revn (:revn file) :data (:data file) + :version (:version file) :features (:features file) + :profile-id profile-id :file-id (:id file) :label label} {::db/return-keys false}) diff --git a/backend/src/app/rpc/commands/files_update.clj b/backend/src/app/rpc/commands/files_update.clj index 007b3b68a..f010ac7b7 100644 --- a/backend/src/app/rpc/commands/files_update.clj +++ b/backend/src/app/rpc/commands/files_update.clj @@ -251,6 +251,7 @@ :created-at created-at :file-id (:id file) :revn (:revn file) + :version (:version file) :label (::snapshot-label file) :data (::snapshot-data file) :features (db/create-array conn "text" (:features file)) diff --git a/backend/src/app/tasks/file_gc.clj b/backend/src/app/tasks/file_gc.clj index e88cfcef0..07bc7ffba 100644 --- a/backend/src/app/tasks/file_gc.clj +++ b/backend/src/app/tasks/file_gc.clj @@ -11,7 +11,6 @@ inactivity (the default threshold is 72h)." (:require [app.binfile.common :as bfc] - [app.common.exceptions :as ex] [app.common.files.migrations :as fmg] [app.common.files.validate :as cfv] [app.common.logging :as l] @@ -35,16 +34,36 @@ (declare ^:private decode-file) (declare ^:private persist-file!) +(def ^:private sql:get-snapshots + "SELECT f.file_id AS id, + f.data, + f.revn, + f.version, + f.features, + f.data_backend, + f.data_ref_id + FROM file_change AS f + WHERE f.file_id = ? + AND f.label IS NOT NULL + ORDER BY f.created_at ASC") + (def ^:private sql:mark-file-media-object-deleted "UPDATE file_media_object SET deleted_at = now() WHERE file_id = ? AND id != ALL(?::uuid[]) RETURNING id") +(def ^:private xf:collect-used-media + (comp (map :data) (mapcat bfc/collect-used-media))) + (defn- clean-file-media! "Performs the garbage collection of file media objects." - [{:keys [::db/conn]} {:keys [id data] :as file}] - (let [used (bfc/collect-used-media data) + [{:keys [::db/conn] :as cfg} {:keys [id] :as file}] + (let [used (into #{} + xf:collect-used-media + (cons file + (->> (db/cursor conn [sql:get-snapshots id]) + (map (partial decode-file cfg))))) ids (db/create-array conn "uuid" used) unused (->> (db/exec! conn [sql:mark-file-media-object-deleted id ids]) (into #{} (map :id)))] @@ -170,11 +189,6 @@ (l/dbg :hint "clean" :rel "components" :file-id (str file-id) :total (count unused)) file)) -(def ^:private sql:get-changes - "SELECT id, data FROM file_change - WHERE file_id = ? AND data IS NOT NULL - ORDER BY created_at ASC") - (def ^:private sql:mark-deleted-data-fragments "UPDATE file_data_fragment SET deleted_at = now() @@ -190,8 +204,7 @@ (defn- clean-data-fragments! [{:keys [::db/conn]} {:keys [id] :as file}] - (let [used (into #{} xf:collect-pointers - (cons file (db/cursor conn [sql:get-changes id]))) + (let [used (into #{} xf:collect-pointers [file]) unused (let [ids (db/create-array conn "uuid" used)] (->> (db/exec! conn [sql:mark-deleted-data-fragments id ids]) @@ -220,7 +233,9 @@ f.revn, f.version, f.features, - f.modified_at + f.modified_at, + f.data_backend, + f.data_ref_id FROM file AS f WHERE f.has_media_trimmed IS false AND f.modified_at < now() - ?::interval @@ -236,18 +251,8 @@ (defn- decode-file [cfg {:keys [id] :as file}] - ;; NOTE: a preventive check that does not allow proceed the gc for - ;; already offloaded file; if this exception happens, means that - ;; something external modified the file flag without preloading the - ;; file back again to the table - (when (feat.fdata/offloaded? file) - (ex/raise :hint "unable to run file-gc on an already offloaded file" - :type :internal - :code :file-already-offloaded - :file-id id)) - (binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg id)] - (-> file + (-> (feat.fdata/resolve-file-data cfg file) (update :features db/decode-pgarray #{}) (update :data blob/decode) (update :data feat.fdata/process-pointers deref) @@ -256,7 +261,7 @@ (fmg/migrate-file)))) (defn- persist-file! - [{:keys [::db/conn] :as cfg} {:keys [id] :as file}] + [{:keys [::db/conn ::sto/storage] :as cfg} {:keys [id] :as file}] (let [file (if (contains? (:features file) "fdata/objects-map") (feat.fdata/enable-objects-map file) file) @@ -272,11 +277,18 @@ (update :features db/encode-pgarray conn "text") (update :data blob/encode))] + ;; If file was already offloaded, we touch the underlying storage + ;; object for properly trigger storage-gc-touched task + (when (feat.fdata/offloaded? file) + (some->> (:data-ref-id file) (sto/touch-object! storage))) + (db/update! conn :file {:has-media-trimmed true :features (:features file) :version (:version file) - :data (:data file)} + :data (:data file) + :data-backend nil + :data-ref-id nil} {:id id} {::db/return-keys true}))) diff --git a/backend/src/app/tasks/file_xlog_gc.clj b/backend/src/app/tasks/file_xlog_gc.clj index 07253f0d8..6bbacd250 100644 --- a/backend/src/app/tasks/file_xlog_gc.clj +++ b/backend/src/app/tasks/file_xlog_gc.clj @@ -10,6 +10,7 @@ (:require [app.common.logging :as l] [app.db :as db] + [app.features.fdata :as feat.fdata] [app.storage :as sto] [app.util.time :as dt] [clojure.spec.alpha :as s] @@ -26,8 +27,8 @@ (def xf:filter-offloded (comp - (filter #(= "objects-storage" (:data-backend %))) - (map :data-ref-id))) + (filter feat.fdata/offloaded?) + (keep :data-ref-id))) (defn- delete-in-chunks [{:keys [::chunk-size ::threshold] :as cfg}] diff --git a/frontend/src/debug.cljs b/frontend/src/debug.cljs index 818028f52..9ccbd442a 100644 --- a/frontend/src/debug.cljs +++ b/frontend/src/debug.cljs @@ -506,6 +506,6 @@ (rx/mapcat rp/handle-response) (rx/subs! (fn [_] (println "Snapshot restored " (or snapshot-id label))) - #_(.reload js/location)) - (fn [cause] - (js/console.log "EE:" cause)))))) + #_(.reload js/location) + (fn [cause] + (js/console.log "EE:" cause))))))) -- Gitee From 85444f5a479529a3a3cff645f1e287d813b57db8 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 3 Sep 2024 16:28:46 +0200 Subject: [PATCH 1232/1266] :bug: Fix incorrect params handling on webhook processing task --- CHANGES.md | 6 +++++ backend/src/app/loggers/audit.clj | 2 ++ backend/src/app/loggers/webhooks.clj | 27 +++++++++---------- .../backend_tests/loggers_webhooks_test.clj | 14 +++++----- 4 files changed, 26 insertions(+), 23 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 5b6141608..16a0868f0 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,11 @@ # CHANGELOG +## 2.1.5 + +### :bug: Bugs fixed + +- Fix broken webhooks [Taiga #8370](https://tree.taiga.io/project/penpot/issue/8370) + ## 2.1.4 ### :bug: Bugs fixed diff --git a/backend/src/app/loggers/audit.clj b/backend/src/app/loggers/audit.clj index c0ca61da9..6b1e7ea28 100644 --- a/backend/src/app/loggers/audit.clj +++ b/backend/src/app/loggers/audit.clj @@ -263,6 +263,8 @@ (assoc ::wrk/dedupe dedupe?) (assoc ::wrk/label label) (assoc ::wrk/params (-> params + (dissoc :source) + (dissoc :context) (dissoc :ip-addr) (dissoc :type))))))) params)) diff --git a/backend/src/app/loggers/webhooks.clj b/backend/src/app/loggers/webhooks.clj index cd6385429..371b627bb 100644 --- a/backend/src/app/loggers/webhooks.clj +++ b/backend/src/app/loggers/webhooks.clj @@ -66,21 +66,18 @@ (defmethod ig/init-key ::process-event-handler [_ cfg] (fn [{:keys [props] :as task}] - (let [event (:event props)] - (l/dbg :hint "process webhook event" :name (:name event)) - - (when-let [items (lookup-webhooks cfg event)] - (l/trc :hint "webhooks found for event" :total (count items)) - - (db/tx-run! cfg (fn [cfg] - (doseq [item items] - (wrk/submit! (-> cfg - (assoc ::wrk/task :run-webhook) - (assoc ::wrk/queue :webhooks) - (assoc ::wrk/max-retries 3) - (assoc ::wrk/params {:event event - :config item})))))))))) - + (l/dbg :hint "process webhook event" :name (:name props)) + + (when-let [items (lookup-webhooks cfg props)] + (l/trc :hint "webhooks found for event" :total (count items)) + (db/tx-run! cfg (fn [cfg] + (doseq [item items] + (wrk/submit! (-> cfg + (assoc ::wrk/task :run-webhook) + (assoc ::wrk/queue :webhooks) + (assoc ::wrk/max-retries 3) + (assoc ::wrk/params {:event props + :config item}))))))))) ;; --- RUN (declare interpret-exception) diff --git a/backend/test/backend_tests/loggers_webhooks_test.clj b/backend/test/backend_tests/loggers_webhooks_test.clj index d0a8e7475..c34df7154 100644 --- a/backend/test/backend_tests/loggers_webhooks_test.clj +++ b/backend/test/backend_tests/loggers_webhooks_test.clj @@ -21,10 +21,9 @@ (with-mocks [submit-mock {:target 'app.worker/submit! :return nil}] (let [prof (th/create-profile* 1 {:is-active true}) res (th/run-task! :process-webhook-event - {:event - {:type "command" - :name "create-project" - :props {:team-id (:default-team-id prof)}}})] + {:type "command" + :name "create-project" + :props {:team-id (:default-team-id prof)}})] (t/is (= 0 (:call-count @submit-mock))) (t/is (nil? res))))) @@ -34,10 +33,9 @@ (let [prof (th/create-profile* 1 {:is-active true}) whk (th/create-webhook* {:team-id (:default-team-id prof)}) res (th/run-task! :process-webhook-event - {:event - {:type "command" - :name "create-project" - :props {:team-id (:default-team-id prof)}}})] + {:type "command" + :name "create-project" + :props {:team-id (:default-team-id prof)}})] (t/is (= 1 (:call-count @submit-mock))) (t/is (nil? res))))) -- Gitee From 47cc80a93fa66f64015a552debd0fadb0ea9ec2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Tue, 3 Sep 2024 23:26:22 +0200 Subject: [PATCH 1233/1266] :wrench: Add serializable ordered collections --- common/dev/user.clj | 2 ++ common/src/app/common/data.cljc | 39 ++++++++++++++++++++++++++++-- common/src/app/common/fressian.clj | 13 ++++++++++ common/src/app/common/transit.cljc | 10 ++++++-- 4 files changed, 60 insertions(+), 4 deletions(-) diff --git a/common/dev/user.clj b/common/dev/user.clj index 0e7787ae7..cb907fade 100644 --- a/common/dev/user.clj +++ b/common/dev/user.clj @@ -6,6 +6,8 @@ (ns user (:require + [app.common.data :as d] + [app.common.fressian :as fres] [app.common.json :as json] [app.common.pprint :as pp] [app.common.schema :as sm] diff --git a/common/src/app/common/data.cljc b/common/src/app/common/data.cljc index ecf55b115..77e9af51b 100644 --- a/common/src/app/common/data.cljc +++ b/common/src/app/common/data.cljc @@ -44,8 +44,8 @@ (defn ordered-map ([] lkm/empty-linked-map) - ([a] (conj lkm/empty-linked-map a)) - ([a & xs] (apply conj lkm/empty-linked-map a xs))) + ([k a] (assoc lkm/empty-linked-map k a)) + ([k a & xs] (apply assoc lkm/empty-linked-map k a xs))) (defn ordered-set? [o] @@ -564,6 +564,41 @@ new-elems (remove p? after)))) +(defn addm-at-index + "Insert an element in an ordered map at an arbitrary index" + [coll index key element] + (assert (ordered-map? coll)) + (-> (ordered-map) + (into (take index coll)) + (assoc key element) + (into (drop index coll)))) + +(defn insertm-at-index + "Insert a map {k v} of elements in an ordered map at an arbitrary index" + [coll index new-elems] + (assert (ordered-map? coll)) + (-> (ordered-map) + (into (take index coll)) + (into new-elems) + (into (drop index coll)))) + +(defn adds-at-index + "Insert an element in an ordered set at an arbitrary index" + [coll index element] + (assert (ordered-set? coll)) + (-> (ordered-set) + (into (take index coll)) + (conj element) + (into (drop index coll)))) + +(defn inserts-at-index + "Insert a list of elements in an ordered set at an arbitrary index" + [coll index new-elems] + (assert (ordered-set? coll)) + (-> (ordered-set) + (into (take index coll)) + (into new-elems) + (into (drop index coll)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Data Parsing / Conversion diff --git a/common/src/app/common/fressian.clj b/common/src/app/common/fressian.clj index 282620698..4a640cd8c 100644 --- a/common/src/app/common/fressian.clj +++ b/common/src/app/common/fressian.clj @@ -15,6 +15,7 @@ java.time.Instant java.time.OffsetDateTime java.util.List + linked.map.LinkedMap org.fressian.Reader org.fressian.StreamingWriter org.fressian.Writer @@ -109,6 +110,13 @@ (clojure.lang.PersistentArrayMap. (.toArray kvs)) (clojure.lang.PersistentHashMap/create (seq kvs))))) +(defn read-ordered-map + [^Reader rdr] + (let [kvs ^java.util.List (read-object! rdr)] + (reduce #(assoc %1 (first %2) (second %2)) + (d/ordered-map) + (partition-all 2 (seq kvs))))) + (def ^:dynamic *write-handler-lookup* nil) (def ^:dynamic *read-handler-lookup* nil) @@ -225,6 +233,11 @@ :wfn write-map-like :rfn read-map-like} + {:name "linked/map" + :class LinkedMap + :wfn write-map-like + :rfn read-ordered-map} + {:name "clj/keyword" :class clojure.lang.Keyword :wfn write-named diff --git a/common/src/app/common/transit.cljc b/common/src/app/common/transit.cljc index 93ab8d4b2..21673bdb4 100644 --- a/common/src/app/common/transit.cljc +++ b/common/src/app/common/transit.cljc @@ -12,7 +12,7 @@ [app.common.uri :as uri] [cognitect.transit :as t] [lambdaisland.uri :as luri] - [linked.core :as lk] + [linked.map :as lkm] [linked.set :as lks]) #?(:clj (:import @@ -24,6 +24,7 @@ java.time.Instant java.time.OffsetDateTime lambdaisland.uri.URI + linked.map.LinkedMap linked.set.LinkedSet))) (def write-handlers (atom nil)) @@ -118,10 +119,15 @@ {:id "u" :rfn parse-uuid}) + {:id "ordered-map" + :class #?(:clj LinkedMap :cljs lkm/LinkedMap) + :wfn vec + :rfn #(into lkm/empty-linked-map %)} + {:id "ordered-set" :class #?(:clj LinkedSet :cljs lks/LinkedSet) :wfn vec - :rfn #(into (lk/set) %)} + :rfn #(into lks/empty-linked-set %)} {:id "duration" :class #?(:clj Duration :cljs lxn/Duration) -- Gitee From d5f5c440dd594166b1ba1d3655f8d6ba5781b8c1 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 4 Sep 2024 11:09:05 +0200 Subject: [PATCH 1234/1266] :bug: Fix issues with srepl helper for profile deletion in bulk --- backend/src/app/srepl/main.clj | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/backend/src/app/srepl/main.clj b/backend/src/app/srepl/main.clj index 98cb5b9cb..922466675 100644 --- a/backend/src/app/srepl/main.clj +++ b/backend/src/app/srepl/main.clj @@ -727,13 +727,15 @@ deleted 0 total 0] (if-let [email (first emails)] - (if-let [profile (db/get* system :profile - {:email (str/lower email)} - {::db/remove-deleted false})] + (if-let [profile (some-> (db/get* system :profile + {:email (str/lower email)} + {::db/remove-deleted false}) + (profile/decode-row))] (do (audit/insert! system {::audit/name "delete-profile" ::audit/type "action" + ::audit/profile-id (:id profile) ::audit/tracked-at deleted-at ::audit/props (audit/profile->props profile) ::audit/context {:triggered-by "srepl" -- Gitee From a6de12323e529a7d8cfd3539212ab07af94f5e60 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 4 Sep 2024 12:02:35 +0200 Subject: [PATCH 1235/1266] :recycle: Refactor file-update for make it more reusable --- backend/src/app/rpc/commands/files_update.clj | 423 ++++++++++-------- backend/test/backend_tests/helpers.clj | 12 +- 2 files changed, 243 insertions(+), 192 deletions(-) diff --git a/backend/src/app/rpc/commands/files_update.clj b/backend/src/app/rpc/commands/files_update.clj index f010ac7b7..7cf5dfa40 100644 --- a/backend/src/app/rpc/commands/files_update.clj +++ b/backend/src/app/rpc/commands/files_update.clj @@ -38,6 +38,20 @@ [clojure.set :as set] [promesa.exec :as px])) +(declare ^:private get-lagged-changes) +(declare ^:private send-notifications!) +(declare ^:private update-file) +(declare ^:private update-file*) +(declare ^:private process-changes-and-validate) +(declare ^:private take-snapshot?) +(declare ^:private delete-old-snapshots!) + +;; PUBLIC API; intended to be used outside of this module +(declare update-file!) +(declare update-file-data!) +(declare persist-file!) +(declare get-file) + ;; --- SCHEMA (def ^:private @@ -97,41 +111,6 @@ (or (contains? library-change-types type) (contains? file-change-types type))) -(def ^:private sql:get-file - "SELECT f.*, p.team_id - FROM file AS f - JOIN project AS p ON (p.id = f.project_id) - WHERE f.id = ? - AND (f.deleted_at IS NULL OR - f.deleted_at > now()) - FOR KEY SHARE") - -(defn get-file - [conn id] - (let [file (db/exec-one! conn [sql:get-file id])] - (when-not file - (ex/raise :type :not-found - :code :object-not-found - :hint (format "file with id '%s' does not exists" id))) - (update file :features db/decode-pgarray #{}))) - -(defn- wrap-with-pointer-map-context - [f] - (fn [cfg {:keys [id] :as file}] - (binding [pmap/*tracked* (pmap/create-tracked) - pmap/*load-fn* (partial feat.fdata/load-pointer cfg id)] - (let [result (f cfg file)] - (feat.fdata/persist-pointers! cfg id) - result)))) - -(declare ^:private delete-old-snapshots!) -(declare ^:private get-lagged-changes) -(declare ^:private send-notifications!) -(declare ^:private take-snapshot?) -(declare ^:private update-file) -(declare ^:private update-file*) -(declare ^:private update-file-data) - ;; If features are specified from params and the final feature ;; set is different than the persisted one, update it on the ;; database. @@ -147,7 +126,8 @@ ::sm/result schema:update-file-result ::doc/module :files ::doc/added "1.17"} - [cfg {:keys [::rpc/profile-id id] :as params}] + [{:keys [::mtx/metrics] :as cfg} + {:keys [::rpc/profile-id id changes changes-with-metadata] :as params}] (db/tx-run! cfg (fn [{:keys [::db/conn] :as cfg}] (files/check-edition-permissions! conn profile-id id) (db/xact-lock! conn id) @@ -161,14 +141,30 @@ (cfeat/check-client-features! (:features params)) (cfeat/check-file-features! (:features file) (:features params))) - params (assoc params - :profile-id profile-id - :features features - :team team - :file file) + changes (if changes-with-metadata + (->> changes-with-metadata (mapcat :changes) vec) + (vec changes)) + + params (-> params + (assoc :profile-id profile-id) + (assoc :features features) + (assoc :team team) + (assoc :file file) + (assoc :changes changes)) + + cfg (assoc cfg ::timestamp (dt/now)) tpoint (dt/tpoint)] + + (when (> (:revn params) + (:revn file)) + (ex/raise :type :validation + :code :revn-conflict + :hint "The incoming revision number is greater that stored version." + :context {:incoming-revn (:revn params) + :stored-revn (:revn file)})) + ;; When newly computed features does not match exactly with ;; the features defined on team row, we update it. (when (not= features (:features team)) @@ -177,90 +173,126 @@ {:features features} {:id (:id team)}))) + (mtx/run! metrics {:id :update-file-changes :inc (count changes)}) + (binding [l/*context* (some-> (meta params) (get :app.http/request) (errors/request->context))] - (-> (update-file cfg params) + (-> (update-file* cfg params) (rph/with-defer #(let [elapsed (tpoint)] (l/trace :hint "update-file" :time (dt/format-duration elapsed)))))))))) -(defn update-file - [{:keys [::mtx/metrics] :as cfg} - {:keys [file features changes changes-with-metadata] :as params}] - (let [features (-> features - (set/difference cfeat/frontend-only-features) - (set/union (:features file))) - - update-fn (cond-> update-file* - (contains? features "fdata/pointer-map") - (wrap-with-pointer-map-context)) - - changes (if changes-with-metadata - (->> changes-with-metadata (mapcat :changes) vec) - (vec changes))] - - (when (> (:revn params) - (:revn file)) - (ex/raise :type :validation - :code :revn-conflict - :hint "The incoming revision number is greater that stored version." - :context {:incoming-revn (:revn params) - :stored-revn (:revn file)})) - - (mtx/run! metrics {:id :update-file-changes :inc (count changes)}) - - (binding [cfeat/*current* features - cfeat/*previous* (:features file)] - (let [file (assoc file :features features) - params (-> params - (assoc :file file) - (assoc :changes changes) - (assoc ::created-at (dt/now)))] - - (-> (update-fn cfg params) - (vary-meta assoc ::audit/replace-props - {:id (:id file) - :name (:name file) - :features (:features file) - :project-id (:project-id file) - :team-id (:team-id file)})))))) - (defn- update-file* - [{:keys [::db/conn ::wrk/executor] :as cfg} - {:keys [profile-id file changes session-id ::created-at skip-validate] :as params}] + "Internal function, part of the update-file process, that encapsulates + the changes application offload to a separated thread and emit all + corresponding notifications. + + Follow the inner implementation to `update-file-data!` function. + + Only intended for internal use on this module." + [{:keys [::db/conn ::wrk/executor ::timestamp] :as cfg} + {:keys [profile-id file features changes session-id skip-validate] :as params}] + (let [;; Retrieve the file data - file (feat.fdata/resolve-file-data cfg file) + file (feat.fdata/resolve-file-data cfg file) + + file (assoc file :features + (-> features + (set/difference cfeat/frontend-only-features) + (set/union (:features file)))) ;; Process the file data on separated thread for avoid to do ;; the CPU intensive operation on vthread. - - file (px/invoke! executor (partial update-file-data cfg file changes skip-validate)) - features (db/create-array conn "text" (:features file))] - - ;; NOTE: if file was offloaded, we need to touch the referenced - ;; storage object because on this update operation the data will - ;; be overwritted. - (when (= "objects-storage" (:data-backend file)) + file (px/invoke! executor + (fn [] + (binding [cfeat/*current* features + cfeat/*previous* (:features file)] + (update-file-data! cfg file + process-changes-and-validate + changes skip-validate))))] + + (when (feat.fdata/offloaded? file) (let [storage (sto/resolve cfg ::db/reuse-conn true)] - (sto/touch-object! storage (:data-ref-id file)))) - - (db/insert! conn :file-change - {:id (uuid/next) - :session-id session-id - :profile-id profile-id - :created-at created-at - :file-id (:id file) - :revn (:revn file) - :version (:version file) - :label (::snapshot-label file) - :data (::snapshot-data file) - :features (db/create-array conn "text" (:features file)) - :changes (blob/encode changes)} - {::db/return-keys false}) + (some->> (:data-ref-id file) (sto/touch-object! storage)))) + ;; TODO: move this to asynchronous task (when (::snapshot-data file) (delete-old-snapshots! cfg file)) + (persist-file! cfg file) + + (let [params (assoc params :file file) + response {:revn (:revn file) + :lagged (get-lagged-changes conn params)} + features (db/create-array conn "text" (:features file))] + + ;; Insert change (xlog) + (db/insert! conn :file-change + {:id (uuid/next) + :session-id session-id + :profile-id profile-id + :created-at timestamp + :file-id (:id file) + :revn (:revn file) + :version (:version file) + :features (db/create-array conn "text" (:features file)) + :label (::snapshot-label file) + :data (::snapshot-data file) + :changes (blob/encode changes)} + {::db/return-keys false}) + + ;; Send asynchronous notifications + (send-notifications! cfg params) + + (vary-meta response assoc ::audit/replace-props + {:id (:id file) + :name (:name file) + :features (:features file) + :project-id (:project-id file) + :team-id (:team-id file)})))) + +(defn update-file! + "A public api that allows apply a transformation to a file with all context setup." + [cfg file-id update-fn & args] + (let [file (get-file cfg file-id) + file (apply update-file-data! cfg file update-fn args)] + (persist-file! cfg file))) + +(def ^:private sql:get-file + "SELECT f.*, p.team_id + FROM file AS f + JOIN project AS p ON (p.id = f.project_id) + WHERE f.id = ? + AND (f.deleted_at IS NULL OR + f.deleted_at > now()) + FOR KEY SHARE") + +(defn get-file + "Get not-decoded file, only decodes the features set." + [conn id] + (let [file (db/exec-one! conn [sql:get-file id])] + (when-not file + (ex/raise :type :not-found + :code :object-not-found + :hint (format "file with id '%s' does not exists" id))) + (update file :features db/decode-pgarray #{}))) + +(defn persist-file! + "Function responsible of persisting already encoded file. Should be + used together with `get-file` and `update-file-data!`. + + It also updates the project modified-at attr." + [{:keys [::db/conn ::timestamp]} file] + (let [features (db/create-array conn "text" (:features file)) + ;; The timestamp can be nil because this function is also + ;; intended to be used outside of this module + modified-at (or timestamp (dt/now))] + + (db/update! conn :project + {:modified-at modified-at} + {:id (:project-id file)} + {::db/return-keys false}) + (db/update! conn :file {:revn (:revn file) :data (:data file) @@ -268,20 +300,95 @@ :features features :data-backend nil :data-ref-id nil - :modified-at created-at + :modified-at modified-at :has-media-trimmed false} - {:id (:id file)}) - - (db/update! conn :project - {:modified-at created-at} - {:id (:project-id file)}) - - (let [params (assoc params :file file)] - ;; Send asynchronous notifications - (send-notifications! cfg params) - - {:revn (:revn file) - :lagged (get-lagged-changes conn params)}))) + {:id (:id file)} + {::db/return-keys false}))) + +(defn- update-file-data! + "Perform a file data transformation in with all update context setup. + + This function expected not-decoded file and transformation function. Returns + an encoded file. + + This function is not responsible of saving the file. It only saves + fdata/pointer-map modified fragments." + + [cfg {:keys [id] :as file} update-fn & args] + (binding [pmap/*tracked* (pmap/create-tracked) + pmap/*load-fn* (partial feat.fdata/load-pointer cfg id)] + (let [file (update file :data (fn [data] + (-> data + (blob/decode) + (assoc :id (:id file))))) + + ;; For avoid unnecesary overhead of creating multiple pointers + ;; and handly internally with objects map in their worst + ;; case (when probably all shapes and all pointers will be + ;; readed in any case), we just realize/resolve them before + ;; applying the migration to the file + file (if (fmg/need-migration? file) + (-> file + (update :data feat.fdata/process-pointers deref) + (update :data feat.fdata/process-objects (partial into {})) + (fmg/migrate-file)) + file) + + file (apply update-fn cfg file args) + + ;; TODO: reuse operations if file is migrated + ;; TODO: move encoding to a separated thread + file (if (take-snapshot? file) + (let [tpoint (dt/tpoint) + snapshot (-> (:data file) + (feat.fdata/process-pointers deref) + (feat.fdata/process-objects (partial into {})) + (blob/encode)) + elapsed (tpoint) + label (str "internal/snapshot/" (:revn file))] + + (l/trc :hint "take snapshot" + :file-id (str (:id file)) + :revn (:revn file) + :label label + :elapsed (dt/format-duration elapsed)) + + (-> file + (assoc ::snapshot-data snapshot) + (assoc ::snapshot-label label))) + file) + + file (cond-> file + (contains? cfeat/*current* "fdata/objects-map") + (feat.fdata/enable-objects-map) + + (contains? cfeat/*current* "fdata/pointer-map") + (feat.fdata/enable-pointer-map) + + :always + (update :data blob/encode))] + + (feat.fdata/persist-pointers! cfg id) + + file))) + +(defn- get-file-libraries + "A helper for preload file libraries, mainly used for perform file + semantical and structural validation" + [{:keys [::db/conn] :as cfg} file] + (->> (files/get-file-libraries conn (:id file)) + (into [file] (map (fn [{:keys [id]}] + (binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg id) + pmap/*tracked* nil] + ;; We do not resolve the objects maps here + ;; because there is a lower probability that all + ;; shapes needed to be loded into memory, so we + ;; leeave it on lazy status + (-> (files/get-file cfg id :migrate? false) + (update :data feat.fdata/process-pointers deref) ; ensure all pointers resolved + (update :data feat.fdata/process-objects (partial into {})) + (fmg/migrate-file)))))) + (d/index-by :id))) (defn- soft-validate-file-schema! [file] @@ -298,68 +405,19 @@ (l/error :hint "file validation error" :cause cause)))) -(defn- update-file-data - [{:keys [::db/conn] :as cfg} file changes skip-validate] - (let [file (update file :data (fn [data] - (-> data - (blob/decode) - (assoc :id (:id file))))) - ;; For avoid unnecesary overhead of creating multiple pointers - ;; and handly internally with objects map in their worst - ;; case (when probably all shapes and all pointers will be - ;; readed in any case), we just realize/resolve them before - ;; applying the migration to the file - file (if (fmg/need-migration? file) - (-> file - (update :data feat.fdata/process-pointers deref) - (update :data feat.fdata/process-objects (partial into {})) - (fmg/migrate-file)) - file) - - ;; WARNING: this ruins performance; maybe we need to find +(defn- process-changes-and-validate + [cfg file changes skip-validate] + (let [;; WARNING: this ruins performance; maybe we need to find ;; some other way to do general validation libs (when (and (or (contains? cf/flags :file-validation) (contains? cf/flags :soft-file-validation)) (not skip-validate)) - (->> (files/get-file-libraries conn (:id file)) - (into [file] (map (fn [{:keys [id]}] - (binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg id) - pmap/*tracked* nil] - ;; We do not resolve the objects maps here - ;; because there is a lower probability that all - ;; shapes needed to be loded into memory, so we - ;; leeave it on lazy status - (-> (files/get-file cfg id :migrate? false) - (update :data feat.fdata/process-pointers deref) ; ensure all pointers resolved - (update :data feat.fdata/process-objects (partial into {})) - (fmg/migrate-file)))))) - (d/index-by :id))) - + (get-file-libraries cfg file)) file (-> (files/check-version! file) (update :revn inc) (update :data cpc/process-changes changes) - (update :data d/without-nils)) - - file (if (take-snapshot? file) - (let [tpoint (dt/tpoint) - snapshot (-> (:data file) - (feat.fdata/process-pointers deref) - (feat.fdata/process-objects (partial into {})) - (blob/encode)) - elapsed (tpoint) - label (str "internal/snapshot/" (:revn file))] - - (l/trc :hint "take snapshot" - :file-id (str (:id file)) - :revn (:revn file) - :label label - :elapsed (dt/format-duration elapsed)) - - (-> file - (assoc ::snapshot-data snapshot) - (assoc ::snapshot-label label))) - file)] + (update :data d/without-nils))] (binding [pmap/*tracked* nil] (when (contains? cf/flags :soft-file-validation) @@ -376,15 +434,7 @@ (not skip-validate)) (val/validate-file-schema! file))) - (cond-> file - (contains? cfeat/*current* "fdata/objects-map") - (feat.fdata/enable-objects-map) - - (contains? cfeat/*current* "fdata/pointer-map") - (feat.fdata/enable-pointer-map) - - :always - (update :data blob/encode)))) + file)) (defn- take-snapshot? "Defines the rule when file `data` snapshot should be saved." @@ -426,8 +476,7 @@ result (db/exec-one! conn [sql:delete-snapshots id last-date])] (l/trc :hint "delete old snapshots" :file-id (str id) :total (db/get-update-count result))))) -(def ^:private - sql:lagged-changes +(def ^:private sql:lagged-changes "select s.id, s.revn, s.file_id, s.session_id, s.changes from file_change as s diff --git a/backend/test/backend_tests/helpers.clj b/backend/test/backend_tests/helpers.clj index 8380ea13e..e77b51d6a 100644 --- a/backend/test/backend_tests/helpers.clj +++ b/backend/test/backend_tests/helpers.clj @@ -76,7 +76,7 @@ :enable-feature-fdata-pointer-map :enable-feature-fdata-objets-map :enable-feature-components-v2 - :enable-file-snapshot + :enable-auto-file-snapshot :disable-file-validation]) (defn state-init @@ -304,16 +304,18 @@ ([params] (update-file* *system* params)) ([system {:keys [file-id changes session-id profile-id revn] :or {session-id (uuid/next) revn 0}}] - (db/tx-run! system (fn [{:keys [::db/conn] :as system}] - (let [file (files.update/get-file conn file-id)] - (files.update/update-file system + (-> system + (assoc ::files.update/timestamp (dt/now)) + (db/tx-run! (fn [{:keys [::db/conn] :as system}] + (let [file (files.update/get-file conn file-id)] + (#'files.update/update-file* system {:id file-id :revn revn :file file :features (:features file) :changes changes :session-id session-id - :profile-id profile-id})))))) + :profile-id profile-id}))))))) (declare command!) -- Gitee From 9da891e9b0ddf0ba69d04c0194fdbb180c0ad166 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 4 Sep 2024 12:02:58 +0200 Subject: [PATCH 1236/1266] :paperclip: Enable auto-file-snapshot feature scripts/repl --- backend/scripts/repl | 2 +- backend/src/app/rpc/commands/files_update.clj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/scripts/repl b/backend/scripts/repl index a9efcb623..9d3a5a808 100755 --- a/backend/scripts/repl +++ b/backend/scripts/repl @@ -24,7 +24,7 @@ export PENPOT_FLAGS="\ enable-rpc-climit \ enable-rpc-rlimit \ enable-soft-rpc-rlimit \ - enable-file-snapshot \ + enable-auto-file-snapshot \ enable-webhooks \ enable-access-tokens \ enable-tiered-file-data-storage \ diff --git a/backend/src/app/rpc/commands/files_update.clj b/backend/src/app/rpc/commands/files_update.clj index 7cf5dfa40..bd98b7071 100644 --- a/backend/src/app/rpc/commands/files_update.clj +++ b/backend/src/app/rpc/commands/files_update.clj @@ -235,7 +235,7 @@ :file-id (:id file) :revn (:revn file) :version (:version file) - :features (db/create-array conn "text" (:features file)) + :features features :label (::snapshot-label file) :data (::snapshot-data file) :changes (blob/encode changes)} -- Gitee From f812b288928c41ee45752c0ef015ced49dc24ceb Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 4 Sep 2024 12:37:40 +0200 Subject: [PATCH 1237/1266] :arrow_up: Update plugin dependencies --- frontend/resources/plugins-runtime/index.js | 3941 ++++++++++--------- 1 file changed, 2004 insertions(+), 1937 deletions(-) diff --git a/frontend/resources/plugins-runtime/index.js b/frontend/resources/plugins-runtime/index.js index bda1dbdae..40ab72dfc 100644 --- a/frontend/resources/plugins-runtime/index.js +++ b/frontend/resources/plugins-runtime/index.js @@ -1,33 +1,33 @@ -var Gn = (t) => { +var Zn = (t) => { throw TypeError(t); }; -var Vn = (t, e, r) => e.has(t) || Gn("Cannot " + r); -var Ae = (t, e, r) => (Vn(t, e, "read from private field"), r ? r.call(t) : e.get(t)), Wr = (t, e, r) => e.has(t) ? Gn("Cannot add the same private member more than once") : e instanceof WeakSet ? e.add(t) : e.set(t, r), qr = (t, e, r, n) => (Vn(t, e, "write to private field"), n ? n.call(t, r) : e.set(t, r), r); +var zn = (t, e, r) => e.has(t) || Zn("Cannot " + r); +var Ie = (t, e, r) => (zn(t, e, "read from private field"), r ? r.call(t) : e.get(t)), Wr = (t, e, r) => e.has(t) ? Zn("Cannot add the same private member more than once") : e instanceof WeakSet ? e.add(t) : e.set(t, r), qr = (t, e, r, n) => (zn(t, e, "write to private field"), n ? n.call(t, r) : e.set(t, r), r); const P = globalThis, { - Array: Gs, - Date: Vs, + Array: Bs, + Date: Gs, FinalizationRegistry: Tt, - Float32Array: Hs, - JSON: Ws, + Float32Array: Vs, + JSON: Hs, Map: Ce, - Math: qs, - Number: So, - Object: bn, - Promise: Ks, - Proxy: Rr, - Reflect: Ys, + Math: Ws, + Number: wo, + Object: yn, + Promise: qs, + Proxy: Nr, + Reflect: Ks, RegExp: Je, - Set: Rt, - String: ge, - Symbol: St, + Set: Nt, + String: ye, + Symbol: wt, WeakMap: Ue, WeakSet: Ot } = globalThis, { // The feral Error constructor is safe for internal use, but must not be // revealed to post-lockdown code in any compartment including the start // compartment since in V8 at least it bears stack inspection capabilities. - Error: ne, - RangeError: Js, + Error: oe, + RangeError: Ys, ReferenceError: zt, SyntaxError: or, TypeError: _, @@ -35,79 +35,79 @@ const P = globalThis, { } = globalThis, { assign: Or, create: V, - defineProperties: Z, - entries: de, + defineProperties: z, + entries: fe, freeze: y, - getOwnPropertyDescriptor: X, + getOwnPropertyDescriptor: Q, getOwnPropertyDescriptors: je, - getOwnPropertyNames: At, + getOwnPropertyNames: It, getPrototypeOf: G, is: Mr, - isFrozen: Zl, - isSealed: zl, - isExtensible: Bl, - keys: Eo, - prototype: wn, - seal: Gl, - preventExtensions: Xs, - setPrototypeOf: xo, - values: ko, - fromEntries: ht -} = bn, { + isFrozen: jl, + isSealed: Zl, + isExtensible: zl, + keys: xo, + prototype: _n, + seal: Bl, + preventExtensions: Js, + setPrototypeOf: So, + values: Eo, + fromEntries: mt +} = yn, { species: Yr, toStringTag: Xe, iterator: sr, - matchAll: Po, - unscopables: Qs, - keyFor: ea, - for: ta -} = St, { isInteger: ra } = So, { stringify: To } = Ws, { defineProperty: na } = bn, F = (t, e, r) => { - const n = na(t, e, r); + matchAll: ko, + unscopables: Xs, + keyFor: Qs, + for: ea +} = wt, { isInteger: ta } = wo, { stringify: Po } = Hs, { defineProperty: ra } = yn, U = (t, e, r) => { + const n = ra(t, e, r); if (n !== t) throw _( - `Please report that the original defineProperty silently failed to set ${To( - ge(e) + `Please report that the original defineProperty silently failed to set ${Po( + ye(e) )}. (SES_DEFINE_PROPERTY_FAILED_SILENTLY)` ); return n; }, { - apply: se, + apply: ae, construct: yr, - get: oa, - getOwnPropertyDescriptor: sa, - has: Ao, - isExtensible: aa, + get: na, + getOwnPropertyDescriptor: oa, + has: To, + isExtensible: sa, ownKeys: Be, - preventExtensions: ia, + preventExtensions: aa, set: Io -} = Ys, { isArray: Et, prototype: Ee } = Gs, { prototype: Mt } = Ce, { prototype: Lr } = RegExp, { prototype: ar } = Rt, { prototype: Ze } = ge, { prototype: Fr } = Ue, { prototype: Co } = Ot, { prototype: Sn } = Function, { prototype: $o } = Ks, { prototype: No } = G( +} = Ks, { isArray: xt, prototype: Ee } = Bs, { prototype: Mt } = Ce, { prototype: Lr } = RegExp, { prototype: ar } = Nt, { prototype: Ze } = ye, { prototype: Fr } = Ue, { prototype: Ao } = Ot, { prototype: vn } = Function, { prototype: Co } = qs, { prototype: $o } = G( // eslint-disable-next-line no-empty-function, func-names function* () { } -), ca = G(Uint8Array.prototype), { bind: sn } = Sn, T = sn.bind(sn.call), ae = T(wn.hasOwnProperty), Qe = T(Ee.filter), dt = T(Ee.forEach), Dr = T(Ee.includes), Lt = T(Ee.join), ie = ( +), ia = G(Uint8Array.prototype), { bind: on } = vn, T = on.bind(on.call), ie = T(_n.hasOwnProperty), Qe = T(Ee.filter), dt = T(Ee.forEach), Dr = T(Ee.includes), Lt = T(Ee.join), ce = ( /** @type {any} */ T(Ee.map) ), Ro = ( /** @type {any} */ T(Ee.flatMap) -), _r = T(Ee.pop), Q = T(Ee.push), la = T(Ee.slice), ua = T(Ee.some), Oo = T(Ee.sort), da = T(Ee[sr]), le = T(Mt.set), Ge = T(Mt.get), Ur = T(Mt.has), fa = T(Mt.delete), pa = T(Mt.entries), ma = T(Mt[sr]), En = T(ar.add); +), _r = T(Ee.pop), ee = T(Ee.push), ca = T(Ee.slice), la = T(Ee.some), No = T(Ee.sort), ua = T(Ee[sr]), ue = T(Mt.set), Ge = T(Mt.get), Ur = T(Mt.has), da = T(Mt.delete), fa = T(Mt.entries), pa = T(Mt[sr]), bn = T(ar.add); T(ar.delete); -const Hn = T(ar.forEach), xn = T(ar.has), ha = T(ar[sr]), kn = T(Lr.test), Pn = T(Lr.exec), ga = T(Lr[Po]), Mo = T(Ze.endsWith), Lo = T(Ze.includes), ya = T(Ze.indexOf); +const Bn = T(ar.forEach), wn = T(ar.has), ha = T(ar[sr]), xn = T(Lr.test), Sn = T(Lr.exec), ma = T(Lr[ko]), Oo = T(Ze.endsWith), Mo = T(Ze.includes), ga = T(Ze.indexOf); T(Ze.match); -const vr = T(No.next), Fo = T(No.throw), br = ( +const vr = T($o.next), Lo = T($o.throw), br = ( /** @type {any} */ T(Ze.replace) -), _a = T(Ze.search), Tn = T(Ze.slice), An = T(Ze.split), Do = T(Ze.startsWith), va = T(Ze[sr]), ba = T(Fr.delete), j = T(Fr.get), xt = T(Fr.has), ue = T(Fr.set), jr = T(Co.add), ir = T(Co.has), wa = T(Sn.toString), Sa = T(sn); -T($o.catch); -const Uo = ( +), ya = T(Ze.search), En = T(Ze.slice), kn = T(Ze.split), Fo = T(Ze.startsWith), _a = T(Ze[sr]), va = T(Fr.delete), Z = T(Fr.get), St = T(Fr.has), de = T(Fr.set), jr = T(Ao.add), ir = T(Ao.has), ba = T(vn.toString), wa = T(on); +T(Co.catch); +const Do = ( /** @type {any} */ - T($o.then) -), Ea = Tt && T(Tt.prototype.register); + T(Co.then) +), xa = Tt && T(Tt.prototype.register); Tt && T(Tt.prototype.unregister); -const In = y(V(null)), Se = (t) => bn(t) === t, Zr = (t) => t instanceof ne, jo = eval, we = Function, xa = () => { +const Pn = y(V(null)), Se = (t) => yn(t) === t, Zr = (t) => t instanceof oe, Uo = eval, xe = Function, Sa = () => { throw _('Cannot eval with evalTaming set to "noEval" (SES_NO_EVAL)'); -}, qe = X(Error("er1"), "stack"), Jr = X(_("er2"), "stack"); -let Zo, zo; +}, qe = Q(Error("er1"), "stack"), Jr = Q(_("er2"), "stack"); +let jo, Zo; if (qe && Jr && qe.get) if ( // In the v8 case as we understand it, all errors have an own stack @@ -116,41 +116,41 @@ if (qe && Jr && qe.get) // This is therefore the case that we repair. typeof qe.get == "function" && qe.get === Jr.get && typeof qe.set == "function" && qe.set === Jr.set ) - Zo = y(qe.get), zo = y(qe.set); + jo = y(qe.get), Zo = y(qe.set); else throw _( "Unexpected Error own stack accessor functions (SES_UNEXPECTED_ERROR_OWN_STACK_ACCESSOR)" ); -const Xr = Zo, ka = zo; -function Pa() { +const Xr = jo, Ea = Zo; +function ka() { return this; } -if (Pa()) +if (ka()) throw _("SES failed to initialize, sloppy mode (SES_NO_SLOPPY)"); -const { freeze: ct } = Object, { apply: Ta } = Reflect, Cn = (t) => (e, ...r) => Ta(t, e, r), Aa = Cn(Array.prototype.push), Wn = Cn(Array.prototype.includes), Ia = Cn(String.prototype.split), st = JSON.stringify, ur = (t, ...e) => { +const { freeze: ct } = Object, { apply: Pa } = Reflect, Tn = (t) => (e, ...r) => Pa(t, e, r), Ta = Tn(Array.prototype.push), Gn = Tn(Array.prototype.includes), Ia = Tn(String.prototype.split), st = JSON.stringify, ur = (t, ...e) => { let r = t[0]; for (let n = 0; n < e.length; n += 1) r = `${r}${e[n]}${t[n + 1]}`; throw Error(r); -}, Bo = (t, e = !1) => { - const r = [], n = (c, l, d = void 0) => { +}, zo = (t, e = !1) => { + const r = [], n = (c, l, u = void 0) => { typeof c == "string" || ur`Environment option name ${st(c)} must be a string.`, typeof l == "string" || ur`Environment option default setting ${st( l )} must be a string.`; - let u = l; - const f = t.process || void 0, m = typeof f == "object" && f.env || void 0; - if (typeof m == "object" && c in m) { - e || Aa(r, c); - const p = m[c]; + let d = l; + const f = t.process || void 0, h = typeof f == "object" && f.env || void 0; + if (typeof h == "object" && c in h) { + e || Ta(r, c); + const p = h[c]; typeof p == "string" || ur`Environment option named ${st( c )}, if present, must have a corresponding string value, got ${st( p - )}`, u = p; + )}`, d = p; } - return d === void 0 || u === l || Wn(d, u) || ur`Unrecognized ${st(c)} value ${st( - u - )}. Expected one of ${st([l, ...d])}`, u; + return u === void 0 || d === l || Gn(u, d) || ur`Unrecognized ${st(c)} value ${st( + d + )}. Expected one of ${st([l, ...u])}`, d; }; ct(n); const o = (c) => { @@ -158,7 +158,7 @@ const { freeze: ct } = Object, { apply: Ta } = Reflect, Cn = (t) => (e, ...r) => return ct(l === "" ? [] : Ia(l, ",")); }; ct(o); - const a = (c, l) => Wn(o(c), l), i = () => ct([...r]); + const a = (c, l) => Gn(o(c), l), i = () => ct([...r]); return ct(i), ct({ getEnvironmentOption: n, getEnvironmentOptionsList: o, @@ -166,49 +166,49 @@ const { freeze: ct } = Object, { apply: Ta } = Reflect, Cn = (t) => (e, ...r) => getCapturedEnvironmentOptionNames: i }); }; -ct(Bo); +ct(zo); const { - getEnvironmentOption: pe, - getEnvironmentOptionsList: Vl, - environmentOptionsListHas: Hl -} = Bo(globalThis, !0), wr = (t) => (t = `${t}`, t.length >= 1 && Lo("aeiouAEIOU", t[0]) ? `an ${t}` : `a ${t}`); + getEnvironmentOption: he, + getEnvironmentOptionsList: Gl, + environmentOptionsListHas: Vl +} = zo(globalThis, !0), wr = (t) => (t = `${t}`, t.length >= 1 && Mo("aeiouAEIOU", t[0]) ? `an ${t}` : `a ${t}`); y(wr); -const Go = (t, e = void 0) => { - const r = new Rt(), n = (o, a) => { +const Bo = (t, e = void 0) => { + const r = new Nt(), n = (o, a) => { switch (typeof a) { case "object": { if (a === null) return null; - if (xn(r, a)) + if (wn(r, a)) return "[Seen]"; - if (En(r, a), Zr(a)) + if (bn(r, a), Zr(a)) return `[${a.name}: ${a.message}]`; if (Xe in a) return `[${a[Xe]}]`; - if (Et(a)) + if (xt(a)) return a; - const i = Eo(a); + const i = xo(a); if (i.length < 2) return a; let c = !0; - for (let d = 1; d < i.length; d += 1) - if (i[d - 1] >= i[d]) { + for (let u = 1; u < i.length; u += 1) + if (i[u - 1] >= i[u]) { c = !1; break; } if (c) return a; - Oo(i); - const l = ie(i, (d) => [d, a[d]]); - return ht(l); + No(i); + const l = ce(i, (u) => [u, a[u]]); + return mt(l); } case "function": return `[Function ${a.name || ""}]`; case "string": - return Do(a, "[") ? `[${a}]` : a; + return Fo(a, "[") ? `[${a}]` : a; case "undefined": case "symbol": - return `[${ge(a)}]`; + return `[${ye(a)}]`; case "bigint": return `[${a}n]`; case "number": @@ -218,20 +218,20 @@ const Go = (t, e = void 0) => { } }; try { - return To(t, n, e); + return Po(t, n, e); } catch { return "[Something that failed to stringify]"; } }; -y(Go); -const { isSafeInteger: Ca } = Number, { freeze: _t } = Object, { toStringTag: $a } = Symbol, qn = (t) => { +y(Bo); +const { isSafeInteger: Aa } = Number, { freeze: _t } = Object, { toStringTag: Ca } = Symbol, Vn = (t) => { const r = { next: void 0, prev: void 0, data: t }; return r.next = r, r.prev = r, r; -}, Kn = (t, e) => { +}, Hn = (t, e) => { if (t === e) throw TypeError("Cannot splice a cell into itself"); if (e.next !== e || e.prev !== e) @@ -241,40 +241,40 @@ const { isSafeInteger: Ca } = Number, { freeze: _t } = Object, { toStringTag: $a }, Qr = (t) => { const { prev: e, next: r } = t; e.next = r, r.prev = e, t.prev = t, t.next = t; -}, Vo = (t) => { - if (!Ca(t) || t < 0) +}, Go = (t) => { + if (!Aa(t) || t < 0) throw TypeError("keysBudget must be a safe non-negative integer number"); const e = /* @__PURE__ */ new WeakMap(); let r = 0; - const n = qn(void 0), o = (u) => { - const f = e.get(u); + const n = Vn(void 0), o = (d) => { + const f = e.get(d); if (!(f === void 0 || f.data === void 0)) - return Qr(f), Kn(n, f), f; - }, a = (u) => o(u) !== void 0; + return Qr(f), Hn(n, f), f; + }, a = (d) => o(d) !== void 0; _t(a); - const i = (u) => { - const f = o(u); - return f && f.data && f.data.get(u); + const i = (d) => { + const f = o(d); + return f && f.data && f.data.get(d); }; _t(i); - const c = (u, f) => { + const c = (d, f) => { if (t < 1) - return d; - let m = o(u); - if (m === void 0 && (m = qn(void 0), Kn(n, m)), !m.data) - for (r += 1, m.data = /* @__PURE__ */ new WeakMap(), e.set(u, m); r > t; ) { + return u; + let h = o(d); + if (h === void 0 && (h = Vn(void 0), Hn(n, h)), !h.data) + for (r += 1, h.data = /* @__PURE__ */ new WeakMap(), e.set(d, h); r > t; ) { const p = n.prev; Qr(p), p.data = void 0, r -= 1; } - return m.data.set(u, f), d; + return h.data.set(d, f), u; }; _t(c); - const l = (u) => { - const f = e.get(u); - return f === void 0 || (Qr(f), e.delete(u), f.data === void 0) ? !1 : (f.data = void 0, r -= 1, !0); + const l = (d) => { + const f = e.get(d); + return f === void 0 || (Qr(f), e.delete(d), f.data === void 0) ? !1 : (f.data = void 0, r -= 1, !0); }; _t(l); - const d = _t({ + const u = _t({ has: a, get: i, set: c, @@ -282,92 +282,92 @@ const { isSafeInteger: Ca } = Number, { freeze: _t } = Object, { toStringTag: $a // eslint-disable-next-line jsdoc/check-types [ /** @type {typeof Symbol.toStringTag} */ - $a + Ca ]: "LRUCacheMap" }); - return d; + return u; }; -_t(Vo); -const { freeze: hr } = Object, { isSafeInteger: Na } = Number, Ra = 1e3, Oa = 100, Ho = (t = Ra, e = Oa) => { - if (!Na(e) || e < 1) +_t(Go); +const { freeze: mr } = Object, { isSafeInteger: $a } = Number, Ra = 1e3, Na = 100, Vo = (t = Ra, e = Na) => { + if (!$a(e) || e < 1) throw TypeError( "argsPerErrorBudget must be a safe positive integer number" ); - const r = Vo(t), n = (a, i) => { + const r = Go(t), n = (a, i) => { const c = r.get(a); c !== void 0 ? (c.length >= e && c.shift(), c.push(i)) : r.set(a, [i]); }; - hr(n); + mr(n); const o = (a) => { const i = r.get(a); return r.delete(a), i; }; - return hr(o), hr({ + return mr(o), mr({ addLogArgs: n, takeLogArgsArray: o }); }; -hr(Ho); -const It = new Ue(), U = (t, e = void 0) => { +mr(Vo); +const At = new Ue(), j = (t, e = void 0) => { const r = y({ - toString: y(() => Go(t, e)) + toString: y(() => Bo(t, e)) }); - return ue(It, r, t), r; + return de(At, r, t), r; }; -y(U); -const Ma = y(/^[\w:-]( ?[\w:-])*$/), Sr = (t, e = void 0) => { - if (typeof t != "string" || !kn(Ma, t)) - return U(t, e); +y(j); +const Oa = y(/^[\w:-]( ?[\w:-])*$/), xr = (t, e = void 0) => { + if (typeof t != "string" || !xn(Oa, t)) + return j(t, e); const r = y({ toString: y(() => t) }); - return ue(It, r, t), r; + return de(At, r, t), r; }; -y(Sr); -const zr = new Ue(), Wo = ({ template: t, args: e }) => { +y(xr); +const zr = new Ue(), Ho = ({ template: t, args: e }) => { const r = [t[0]]; for (let n = 0; n < e.length; n += 1) { const o = e[n]; let a; - xt(It, o) ? a = `${o}` : Zr(o) ? a = `(${wr(o.name)})` : a = `(${wr(typeof o)})`, Q(r, a, t[n + 1]); + St(At, o) ? a = `${o}` : Zr(o) ? a = `(${wr(o.name)})` : a = `(${wr(typeof o)})`, ee(r, a, t[n + 1]); } return Lt(r, ""); -}, qo = y({ +}, Wo = y({ toString() { - const t = j(zr, this); - return t === void 0 ? "[Not a DetailsToken]" : Wo(t); + const t = Z(zr, this); + return t === void 0 ? "[Not a DetailsToken]" : Ho(t); } }); -y(qo.toString); -const oe = (t, ...e) => { - const r = y({ __proto__: qo }); - return ue(zr, r, { template: t, args: e }), /** @type {DetailsToken} */ +y(Wo.toString); +const se = (t, ...e) => { + const r = y({ __proto__: Wo }); + return de(zr, r, { template: t, args: e }), /** @type {DetailsToken} */ /** @type {unknown} */ r; }; -y(oe); -const Ko = (t, ...e) => (e = ie( +y(se); +const qo = (t, ...e) => (e = ce( e, - (r) => xt(It, r) ? r : U(r) -), oe(t, ...e)); -y(Ko); -const Yo = ({ template: t, args: e }) => { + (r) => St(At, r) ? r : j(r) +), se(t, ...e)); +y(qo); +const Ko = ({ template: t, args: e }) => { const r = [t[0]]; for (let n = 0; n < e.length; n += 1) { let o = e[n]; - xt(It, o) && (o = j(It, o)); + St(At, o) && (o = Z(At, o)); const a = br(_r(r) || "", / $/, ""); - a !== "" && Q(r, a); + a !== "" && ee(r, a); const i = br(t[n + 1], /^ /, ""); - Q(r, o, i); + ee(r, o, i); } return r[r.length - 1] === "" && _r(r), r; }, gr = new Ue(); -let an = 0; -const Yn = new Ue(), Jo = (t, e = t.name) => { - let r = j(Yn, t); - return r !== void 0 || (an += 1, r = `${e}#${an}`, ue(Yn, t, r)), r; -}, La = (t) => { +let sn = 0; +const Wn = new Ue(), Yo = (t, e = t.name) => { + let r = Z(Wn, t); + return r !== void 0 || (sn += 1, r = `${e}#${sn}`, de(Wn, t, r)), r; +}, Ma = (t) => { const e = je(t), { name: r, message: n, @@ -377,150 +377,150 @@ const Yn = new Ue(), Jo = (t, e = t.name) => { ...c } = e, l = Be(c); if (l.length >= 1) { - for (const u of l) - delete t[u]; - const d = V(wn, c); + for (const d of l) + delete t[d]; + const u = V(_n, c); Br( t, - oe`originally with properties ${U(d)}` + se`originally with properties ${j(u)}` ); } - for (const d of Be(t)) { - const u = e[d]; - u && ae(u, "get") && F(t, d, { - value: t[d] + for (const u of Be(t)) { + const d = e[u]; + d && ie(d, "get") && U(t, u, { + value: t[u] // invoke the getter to convert to data property }); } y(t); -}, Me = (t = oe`Assert failed`, e = P.Error, { +}, Me = (t = se`Assert failed`, e = P.Error, { errorName: r = void 0, cause: n = void 0, errors: o = void 0, sanitize: a = !0 } = {}) => { - typeof t == "string" && (t = oe([t])); - const i = j(zr, t); + typeof t == "string" && (t = se([t])); + const i = Z(zr, t); if (i === void 0) - throw _(`unrecognized details ${U(t)}`); - const c = Wo(i), l = n && { cause: n }; - let d; - return typeof Kr < "u" && e === Kr ? d = Kr(o || [], c, l) : (d = /** @type {ErrorConstructor} */ + throw _(`unrecognized details ${j(t)}`); + const c = Ho(i), l = n && { cause: n }; + let u; + return typeof Kr < "u" && e === Kr ? u = Kr(o || [], c, l) : (u = /** @type {ErrorConstructor} */ e( c, l - ), o !== void 0 && F(d, "errors", { + ), o !== void 0 && U(u, "errors", { value: o, writable: !0, enumerable: !1, configurable: !0 - })), ue(gr, d, Yo(i)), r !== void 0 && Jo(d, r), a && La(d), d; + })), de(gr, u, Ko(i)), r !== void 0 && Yo(u, r), a && Ma(u), u; }; y(Me); -const { addLogArgs: Fa, takeLogArgsArray: Da } = Ho(), cn = new Ue(), Br = (t, e) => { - typeof e == "string" && (e = oe([e])); - const r = j(zr, e); +const { addLogArgs: La, takeLogArgsArray: Fa } = Vo(), an = new Ue(), Br = (t, e) => { + typeof e == "string" && (e = se([e])); + const r = Z(zr, e); if (r === void 0) - throw _(`unrecognized details ${U(e)}`); - const n = Yo(r), o = j(cn, t); + throw _(`unrecognized details ${j(e)}`); + const n = Ko(r), o = Z(an, t); if (o !== void 0) for (const a of o) a(t, n); else - Fa(t, n); + La(t, n); }; y(Br); -const Ua = (t) => { +const Da = (t) => { if (!("stack" in t)) return ""; - const e = `${t.stack}`, r = ya(e, ` + const e = `${t.stack}`, r = ga(e, ` `); - return Do(e, " ") || r === -1 ? e : Tn(e, r + 1); -}, Er = { - getStackString: P.getStackString || Ua, - tagError: (t) => Jo(t), + return Fo(e, " ") || r === -1 ? e : En(e, r + 1); +}, Sr = { + getStackString: P.getStackString || Da, + tagError: (t) => Yo(t), resetErrorTagNum: () => { - an = 0; + sn = 0; }, - getMessageLogArgs: (t) => j(gr, t), + getMessageLogArgs: (t) => Z(gr, t), takeMessageLogArgs: (t) => { - const e = j(gr, t); - return ba(gr, t), e; + const e = Z(gr, t); + return va(gr, t), e; }, takeNoteLogArgsArray: (t, e) => { - const r = Da(t); + const r = Fa(t); if (e !== void 0) { - const n = j(cn, t); - n ? Q(n, e) : ue(cn, t, [e]); + const n = Z(an, t); + n ? ee(n, e) : de(an, t, [e]); } return r || []; } }; -y(Er); +y(Sr); const Gr = (t = void 0, e = !1) => { - const r = e ? Ko : oe, n = r`Check failed`, o = (f = n, m = void 0, p = void 0) => { - const h = Me(f, m, p); - throw t !== void 0 && t(h), h; + const r = e ? qo : se, n = r`Check failed`, o = (f = n, h = void 0, p = void 0) => { + const m = Me(f, h, p); + throw t !== void 0 && t(m), m; }; y(o); - const a = (f, ...m) => o(r(f, ...m)); - function i(f, m = void 0, p = void 0, h = void 0) { - f || o(m, p, h); - } - const c = (f, m, p = void 0, h = void 0, b = void 0) => { - Mr(f, m) || o( - p || r`Expected ${f} is same as ${m}`, - h || Js, + const a = (f, ...h) => o(r(f, ...h)); + function i(f, h = void 0, p = void 0, m = void 0) { + f || o(h, p, m); + } + const c = (f, h, p = void 0, m = void 0, b = void 0) => { + Mr(f, h) || o( + p || r`Expected ${f} is same as ${h}`, + m || Ys, b ); }; y(c); - const l = (f, m, p) => { - if (typeof f !== m) { - if (typeof m == "string" || a`${U(m)} must be a string`, p === void 0) { - const h = wr(m); - p = r`${f} must be ${Sr(h)}`; + const l = (f, h, p) => { + if (typeof f !== h) { + if (typeof h == "string" || a`${j(h)} must be a string`, p === void 0) { + const m = wr(h); + p = r`${f} must be ${xr(m)}`; } o(p, _); } }; y(l); - const u = Or(i, { + const d = Or(i, { error: Me, fail: o, equal: c, typeof: l, - string: (f, m = void 0) => l(f, "string", m), + string: (f, h = void 0) => l(f, "string", h), note: Br, details: r, Fail: a, - quote: U, - bare: Sr, + quote: j, + bare: xr, makeAssert: Gr }); - return y(u); + return y(d); }; y(Gr); -const Y = Gr(), Jn = Y.equal, Xo = X( - ca, +const Y = Gr(), qn = Y.equal, Jo = Q( + ia, Xe ); +Y(Jo); +const Xo = Jo.get; Y(Xo); -const Qo = Xo.get; -Y(Qo); -const ja = (t) => se(Qo, t, []) !== void 0, Za = (t) => { - const e = +ge(t); - return ra(e) && ge(e) === t; -}, za = (t) => { - Xs(t), dt(Be(t), (e) => { - const r = X(t, e); - Y(r), Za(e) || F(t, e, { +const Ua = (t) => ae(Xo, t, []) !== void 0, ja = (t) => { + const e = +ye(t); + return ta(e) && ye(e) === t; +}, Za = (t) => { + Js(t), dt(Be(t), (e) => { + const r = Q(t, e); + Y(r), ja(e) || U(t, e, { ...r, writable: !1, configurable: !1 }); }); -}, Ba = () => { +}, za = () => { if (typeof P.harden == "function") return P.harden; const t = new Ot(), { harden: e } = { @@ -530,60 +530,60 @@ const ja = (t) => se(Qo, t, []) !== void 0, Za = (t) => { * @returns {T} */ harden(r) { - const n = new Rt(); - function o(u) { - if (!Se(u)) + const n = new Nt(); + function o(d) { + if (!Se(d)) return; - const f = typeof u; + const f = typeof d; if (f !== "object" && f !== "function") throw _(`Unexpected typeof: ${f}`); - ir(t, u) || xn(n, u) || En(n, u); + ir(t, d) || wn(n, d) || bn(n, d); } - const a = (u) => { - ja(u) ? za(u) : y(u); - const f = je(u), m = G(u); - o(m), dt(Be(f), (p) => { - const h = f[ + const a = (d) => { + Ua(d) ? Za(d) : y(d); + const f = je(d), h = G(d); + o(h), dt(Be(f), (p) => { + const m = f[ /** @type {string} */ p ]; - ae(h, "value") ? o(h.value) : (o(h.get), o(h.set)); + ie(m, "value") ? o(m.value) : (o(m.get), o(m.set)); }); - }, i = Xr === void 0 && ka === void 0 ? ( + }, i = Xr === void 0 && Ea === void 0 ? ( // On platforms without v8's error own stack accessor problem, // don't pay for any extra overhead. a - ) : (u) => { - if (Zr(u)) { - const f = X(u, "stack"); - f && f.get === Xr && f.configurable && F(u, "stack", { + ) : (d) => { + if (Zr(d)) { + const f = Q(d, "stack"); + f && f.get === Xr && f.configurable && U(d, "stack", { // NOTE: Calls getter during harden, which seems dangerous. // But we're only calling the problematic getter whose // hazards we think we understand. // @ts-expect-error TS should know FERAL_STACK_GETTER // cannot be `undefined` here. // See https://github.com/endojs/endo/pull/2232#discussion_r1575179471 - value: se(Xr, u, []) + value: ae(Xr, d, []) }); } - return a(u); + return a(d); }, c = () => { - Hn(n, i); - }, l = (u) => { - jr(t, u); - }, d = () => { - Hn(n, l); + Bn(n, i); + }, l = (d) => { + jr(t, d); + }, u = () => { + Bn(n, l); }; - return o(r), c(), d(), r; + return o(r), c(), u(), r; } }; return e; -}, es = { +}, Qo = { // *** Value Properties of the Global Object Infinity: 1 / 0, NaN: NaN, undefined: void 0 -}, ts = { +}, es = { // *** Function Properties of the Global Object isFinite: "isFinite", isNaN: "isNaN", @@ -644,7 +644,7 @@ const ja = (t) => se(Qo, t, []) !== void 0, Za = (t) => { harden: "harden", HandledPromise: "HandledPromise" // TODO: Until Promise.delegate (see below). -}, Xn = { +}, Kn = { // *** Constructor Properties of the Global Object Date: "%InitialDate%", Error: "%InitialError%", @@ -663,7 +663,7 @@ const ja = (t) => se(Qo, t, []) !== void 0, Za = (t) => { // TODO https://github.com/Agoric/SES-shim/issues/551 // Need initial WeakRef and FinalizationGroup in // start compartment only. -}, rs = { +}, ts = { // *** Constructor Properties of the Global Object Date: "%SharedDate%", Error: "%SharedError%", @@ -671,7 +671,7 @@ const ja = (t) => se(Qo, t, []) !== void 0, Za = (t) => { Symbol: "%SharedSymbol%", // *** Other Properties of the Global Object Math: "%SharedMath%" -}, ns = [ +}, rs = [ EvalError, RangeError, ReferenceError, @@ -683,25 +683,25 @@ const ja = (t) => se(Qo, t, []) !== void 0, Za = (t) => { // Instead, conditional push below. // AggregateError, ]; -typeof AggregateError < "u" && Q(ns, AggregateError); -const ln = { +typeof AggregateError < "u" && ee(rs, AggregateError); +const cn = { "[[Proto]]": "%FunctionPrototype%", length: "number", name: "string" // Do not specify "prototype" here, since only Function instances that can // be used as a constructor have a prototype property. For constructors, // since prototype properties are instance-specific, we define it there. -}, Ga = { +}, Ba = { // This property is not mentioned in ECMA 262, but is present in V8 and // necessary for lockdown to succeed. "[[Proto]]": "%AsyncFunctionPrototype%" -}, s = ln, Qn = Ga, R = { +}, s = cn, Yn = Ba, L = { get: s, set: "undefined" -}, Re = { +}, Ne = { get: s, set: s -}, eo = (t) => t === R || t === Re; +}, Jn = (t) => t === L || t === Ne; function at(t) { return { // Properties of the NativeError Constructors @@ -724,7 +724,7 @@ function it(t) { cause: !1 }; } -function ve(t) { +function be(t) { return { // Properties of the TypedArray Constructors "[[Proto]]": "%TypedArray%", @@ -732,7 +732,7 @@ function ve(t) { prototype: t }; } -function be(t) { +function we(t) { return { // Properties of the TypedArray Prototype Objects "[[Proto]]": "%TypedArrayPrototype%", @@ -740,7 +740,7 @@ function be(t) { constructor: t }; } -const to = { +const Xn = { E: "number", LN10: "number", LN2: "number", @@ -798,7 +798,7 @@ const to = { mod: !1, // See https://github.com/Moddable-OpenSource/moddable/issues/523#issuecomment-1942904505 irandom: !1 -}, xr = { +}, Er = { // ECMA https://tc39.es/ecma262 // The intrinsics object has no prototype to avoid conflicts. "[[Proto]]": null, @@ -865,7 +865,7 @@ const to = { // Annex B: Additional Properties of the Object.prototype Object // See note in header about the difference between [[Proto]] and --proto-- // special notations. - "--proto--": Re, + "--proto--": Ne, __defineGetter__: s, __defineSetter__: s, __lookupGetter__: s, @@ -937,7 +937,7 @@ const to = { "%SymbolPrototype%": { // Properties of the Symbol Prototype Object constructor: "%SharedSymbol%", - description: R, + description: L, toString: s, valueOf: s, "@@toPrimitive": s, @@ -950,9 +950,9 @@ const to = { // Non standard, v8 only, used by tap captureStackTrace: s, // Non standard, v8 only, used by tap, tamed to accessor - stackTraceLimit: Re, + stackTraceLimit: Ne, // Non standard, v8 only, used by several, tamed to accessor - prepareStackTrace: Re + prepareStackTrace: Ne }, "%SharedError%": { // Properties of the Error Constructor @@ -961,9 +961,9 @@ const to = { // Non standard, v8 only, used by tap captureStackTrace: s, // Non standard, v8 only, used by tap, tamed to accessor - stackTraceLimit: Re, + stackTraceLimit: Ne, // Non standard, v8 only, used by several, tamed to accessor - prepareStackTrace: Re + prepareStackTrace: Ne }, "%ErrorPrototype%": { constructor: "%SharedError%", @@ -974,7 +974,7 @@ const to = { // Seen on FF Nightly 88.0a1 at: !1, // Seen on FF and XS - stack: Re, + stack: Ne, // Superfluously present in some versions of V8. // https://github.com/tc39/notes/blob/master/meetings/2021-10/oct-26.md#:~:text=However%2C%20Chrome%2093,and%20node%2016.11. cause: !1 @@ -1069,12 +1069,12 @@ const to = { "@@toStringTag": "string" }, "%InitialMath%": { - ...to, + ...Xn, // `%InitialMath%.random()` has the standard unsafe behavior random: s }, "%SharedMath%": { - ...to, + ...Xn, // `%SharedMath%.random()` is tamed to always throw random: s }, @@ -1230,7 +1230,7 @@ const to = { // Properties of the RegExp Constructor "[[Proto]]": "%FunctionPrototype%", prototype: "%RegExpPrototype%", - "@@species": R, + "@@species": L, // The https://github.com/tc39/proposal-regexp-legacy-features // are all optional, unsafe, and omitted input: !1, @@ -1257,29 +1257,29 @@ const to = { // Properties of the RegExp Constructor "[[Proto]]": "%FunctionPrototype%", prototype: "%RegExpPrototype%", - "@@species": R + "@@species": L }, "%RegExpPrototype%": { // Properties of the RegExp Prototype Object constructor: "%SharedRegExp%", exec: s, - dotAll: R, - flags: R, - global: R, - hasIndices: R, - ignoreCase: R, + dotAll: L, + flags: L, + global: L, + hasIndices: L, + ignoreCase: L, "@@match": s, "@@matchAll": s, - multiline: R, + multiline: L, "@@replace": s, "@@search": s, - source: R, + source: L, "@@split": s, - sticky: R, + sticky: L, test: s, toString: s, - unicode: R, - unicodeSets: R, + unicode: L, + unicodeSets: L, // Annex B: Additional Properties of the RegExp.prototype Object compile: !1 // UNSAFE and suppressed. @@ -1298,7 +1298,7 @@ const to = { isArray: s, of: s, prototype: "%ArrayPrototype%", - "@@species": R, + "@@species": L, // Stage 3: // https://tc39.es/proposal-relative-indexing-method/ at: s, @@ -1398,13 +1398,13 @@ const to = { from: s, of: s, prototype: "%TypedArrayPrototype%", - "@@species": R + "@@species": L }, "%TypedArrayPrototype%": { at: s, - buffer: R, - byteLength: R, - byteOffset: R, + buffer: L, + byteLength: L, + byteOffset: L, constructor: "%TypedArray%", copyWithin: s, entries: s, @@ -1419,7 +1419,7 @@ const to = { join: s, keys: s, lastIndexOf: s, - length: R, + length: L, map: s, reduce: s, reduceRight: s, @@ -1433,7 +1433,7 @@ const to = { toString: s, values: s, "@@iterator": s, - "@@toStringTag": R, + "@@toStringTag": L, // See https://github.com/tc39/proposal-array-find-from-last findLast: s, findLastIndex: s, @@ -1443,39 +1443,39 @@ const to = { with: s }, // The TypedArray Constructors - BigInt64Array: ve("%BigInt64ArrayPrototype%"), - BigUint64Array: ve("%BigUint64ArrayPrototype%"), + BigInt64Array: be("%BigInt64ArrayPrototype%"), + BigUint64Array: be("%BigUint64ArrayPrototype%"), // https://github.com/tc39/proposal-float16array - Float16Array: ve("%Float16ArrayPrototype%"), - Float32Array: ve("%Float32ArrayPrototype%"), - Float64Array: ve("%Float64ArrayPrototype%"), - Int16Array: ve("%Int16ArrayPrototype%"), - Int32Array: ve("%Int32ArrayPrototype%"), - Int8Array: ve("%Int8ArrayPrototype%"), - Uint16Array: ve("%Uint16ArrayPrototype%"), - Uint32Array: ve("%Uint32ArrayPrototype%"), - Uint8ClampedArray: ve("%Uint8ClampedArrayPrototype%"), + Float16Array: be("%Float16ArrayPrototype%"), + Float32Array: be("%Float32ArrayPrototype%"), + Float64Array: be("%Float64ArrayPrototype%"), + Int16Array: be("%Int16ArrayPrototype%"), + Int32Array: be("%Int32ArrayPrototype%"), + Int8Array: be("%Int8ArrayPrototype%"), + Uint16Array: be("%Uint16ArrayPrototype%"), + Uint32Array: be("%Uint32ArrayPrototype%"), + Uint8ClampedArray: be("%Uint8ClampedArrayPrototype%"), Uint8Array: { - ...ve("%Uint8ArrayPrototype%"), + ...be("%Uint8ArrayPrototype%"), // https://github.com/tc39/proposal-arraybuffer-base64 fromBase64: s, // https://github.com/tc39/proposal-arraybuffer-base64 fromHex: s }, - "%BigInt64ArrayPrototype%": be("BigInt64Array"), - "%BigUint64ArrayPrototype%": be("BigUint64Array"), + "%BigInt64ArrayPrototype%": we("BigInt64Array"), + "%BigUint64ArrayPrototype%": we("BigUint64Array"), // https://github.com/tc39/proposal-float16array - "%Float16ArrayPrototype%": be("Float16Array"), - "%Float32ArrayPrototype%": be("Float32Array"), - "%Float64ArrayPrototype%": be("Float64Array"), - "%Int16ArrayPrototype%": be("Int16Array"), - "%Int32ArrayPrototype%": be("Int32Array"), - "%Int8ArrayPrototype%": be("Int8Array"), - "%Uint16ArrayPrototype%": be("Uint16Array"), - "%Uint32ArrayPrototype%": be("Uint32Array"), - "%Uint8ClampedArrayPrototype%": be("Uint8ClampedArray"), + "%Float16ArrayPrototype%": we("Float16Array"), + "%Float32ArrayPrototype%": we("Float32Array"), + "%Float64ArrayPrototype%": we("Float64Array"), + "%Int16ArrayPrototype%": we("Int16Array"), + "%Int32ArrayPrototype%": we("Int32Array"), + "%Int8ArrayPrototype%": we("Int8Array"), + "%Uint16ArrayPrototype%": we("Uint16Array"), + "%Uint32ArrayPrototype%": we("Uint32Array"), + "%Uint8ClampedArrayPrototype%": we("Uint8ClampedArray"), "%Uint8ArrayPrototype%": { - ...be("Uint8Array"), + ...we("Uint8Array"), // https://github.com/tc39/proposal-arraybuffer-base64 setFromBase64: s, // https://github.com/tc39/proposal-arraybuffer-base64 @@ -1489,7 +1489,7 @@ const to = { Map: { // Properties of the Map Constructor "[[Proto]]": "%FunctionPrototype%", - "@@species": R, + "@@species": L, prototype: "%MapPrototype%", // https://github.com/tc39/proposal-array-grouping groupBy: s @@ -1504,7 +1504,7 @@ const to = { has: s, keys: s, set: s, - size: R, + size: L, values: s, "@@iterator": s, "@@toStringTag": "string" @@ -1519,7 +1519,7 @@ const to = { // Properties of the Set Constructor "[[Proto]]": "%FunctionPrototype%", prototype: "%SetPrototype%", - "@@species": R, + "@@species": L, // Seen on QuickJS groupBy: !1 }, @@ -1532,7 +1532,7 @@ const to = { forEach: s, has: s, keys: s, - size: R, + size: L, values: s, "@@iterator": s, "@@toStringTag": "string", @@ -1588,14 +1588,14 @@ const to = { "[[Proto]]": "%FunctionPrototype%", isView: s, prototype: "%ArrayBufferPrototype%", - "@@species": R, + "@@species": L, // See https://github.com/Moddable-OpenSource/moddable/issues/523 fromString: !1, // See https://github.com/Moddable-OpenSource/moddable/issues/523 fromBigInt: !1 }, "%ArrayBufferPrototype%": { - byteLength: R, + byteLength: L, constructor: "ArrayBuffer", slice: s, "@@toStringTag": "string", @@ -1604,11 +1604,11 @@ const to = { // See https://github.com/tc39/proposal-resizablearraybuffer transfer: s, resize: s, - resizable: R, - maxByteLength: R, + resizable: L, + maxByteLength: L, // https://github.com/tc39/proposal-arraybuffer-transfer transferToFixedLength: s, - detached: R + detached: L }, // SharedArrayBuffer Objects SharedArrayBuffer: !1, @@ -1623,9 +1623,9 @@ const to = { prototype: "%DataViewPrototype%" }, "%DataViewPrototype%": { - buffer: R, - byteLength: R, - byteOffset: R, + buffer: L, + byteLength: L, + byteOffset: L, constructor: "DataView", getBigInt64: s, getBigUint64: s, @@ -1826,7 +1826,7 @@ const to = { resolve: s, // https://github.com/tc39/proposal-promise-with-resolvers withResolvers: s, - "@@species": R + "@@species": L }, "%PromisePrototype%": { // Properties of the Promise Prototype Object @@ -1836,9 +1836,9 @@ const to = { then: s, "@@toStringTag": "string", // Non-standard, used in node to prevent async_hooks from breaking - "UniqueSymbol(async_id_symbol)": Re, - "UniqueSymbol(trigger_async_id_symbol)": Re, - "UniqueSymbol(destroyed)": Re + "UniqueSymbol(async_id_symbol)": Ne, + "UniqueSymbol(trigger_async_id_symbol)": Ne, + "UniqueSymbol(destroyed)": Ne }, "%InertAsyncFunction%": { // Properties of the AsyncFunction Constructor @@ -1897,10 +1897,10 @@ const to = { "%CompartmentPrototype%": { constructor: "%InertCompartment%", evaluate: s, - globalThis: R, - name: R, - import: Qn, - load: Qn, + globalThis: L, + name: L, + import: Yn, + load: Yn, importNow: s, module: s, "@@toStringTag": "string" @@ -1908,55 +1908,55 @@ const to = { lockdown: s, harden: { ...s, isFake: "boolean" }, "%InitialGetStackString%": s -}, Va = (t) => typeof t == "function"; -function Ha(t, e, r) { - if (ae(t, e)) { - const n = X(t, e); +}, Ga = (t) => typeof t == "function"; +function Va(t, e, r) { + if (ie(t, e)) { + const n = Q(t, e); if (!n || !Mr(n.value, r.value) || n.get !== r.get || n.set !== r.set || n.writable !== r.writable || n.enumerable !== r.enumerable || n.configurable !== r.configurable) throw _(`Conflicting definitions of ${e}`); } - F(t, e, r); + U(t, e, r); } -function Wa(t, e) { - for (const [r, n] of de(e)) - Ha(t, r, n); +function Ha(t, e) { + for (const [r, n] of fe(e)) + Va(t, r, n); } -function os(t, e) { +function ns(t, e) { const r = { __proto__: null }; - for (const [n, o] of de(e)) - ae(t, n) && (r[o] = t[n]); + for (const [n, o] of fe(e)) + ie(t, n) && (r[o] = t[n]); return r; } -const ss = () => { +const os = () => { const t = V(null); let e; const r = (c) => { - Wa(t, je(c)); + Ha(t, je(c)); }; y(r); const n = () => { - for (const [c, l] of de(t)) { - if (!Se(l) || !ae(l, "prototype")) + for (const [c, l] of fe(t)) { + if (!Se(l) || !ie(l, "prototype")) continue; - const d = xr[c]; - if (typeof d != "object") + const u = Er[c]; + if (typeof u != "object") throw _(`Expected permit object at whitelist.${c}`); - const u = d.prototype; - if (!u) + const d = u.prototype; + if (!d) throw _(`${c}.prototype property not whitelisted`); - if (typeof u != "string" || !ae(xr, u)) + if (typeof d != "string" || !ie(Er, d)) throw _(`Unrecognized ${c}.prototype whitelist entry`); const f = l.prototype; - if (ae(t, u)) { - if (t[u] !== f) - throw _(`Conflicting bindings of ${u}`); + if (ie(t, d)) { + if (t[d] !== f) + throw _(`Conflicting bindings of ${d}`); continue; } - t[u] = f; + t[d] = f; } }; y(n); - const o = () => (y(t), e = new Ot(Qe(ko(t), Va)), t); + const o = () => (y(t), e = new Ot(Qe(Eo(t), Ga)), t); y(o); const a = (c) => { if (!e) @@ -1972,126 +1972,126 @@ const ss = () => { finalIntrinsics: o, isPseudoNative: a }; - return y(i), r(es), r(os(P, ts)), i; -}, qa = (t) => { - const { addIntrinsics: e, finalIntrinsics: r } = ss(); - return e(os(t, rs)), r(); + return y(i), r(Qo), r(ns(P, es)), i; +}, Wa = (t) => { + const { addIntrinsics: e, finalIntrinsics: r } = os(); + return e(ns(t, ts)), r(); }; -function Ka(t, e) { +function qa(t, e) { let r = !1; - const n = (m, ...p) => (r || (console.groupCollapsed("Removing unpermitted intrinsics"), r = !0), console[m](...p)), o = ["undefined", "boolean", "number", "string", "symbol"], a = new Ce( - St ? ie( + const n = (h, ...p) => (r || (console.groupCollapsed("Removing unpermitted intrinsics"), r = !0), console[h](...p)), o = ["undefined", "boolean", "number", "string", "symbol"], a = new Ce( + wt ? ce( Qe( - de(xr["%SharedSymbol%"]), - ([m, p]) => p === "symbol" && typeof St[m] == "symbol" + fe(Er["%SharedSymbol%"]), + ([h, p]) => p === "symbol" && typeof wt[h] == "symbol" ), - ([m]) => [St[m], `@@${m}`] + ([h]) => [wt[h], `@@${h}`] ) : [] ); - function i(m, p) { + function i(h, p) { if (typeof p == "string") return p; - const h = Ge(a, p); + const m = Ge(a, p); if (typeof p == "symbol") { - if (h) - return h; + if (m) + return m; { - const b = ea(p); - return b !== void 0 ? `RegisteredSymbol(${b})` : `Unique${ge(p)}`; + const b = Qs(p); + return b !== void 0 ? `RegisteredSymbol(${b})` : `Unique${ye(p)}`; } } - throw _(`Unexpected property name type ${m} ${p}`); + throw _(`Unexpected property name type ${h} ${p}`); } - function c(m, p, h) { + function c(h, p, m) { if (!Se(p)) - throw _(`Object expected: ${m}, ${p}, ${h}`); + throw _(`Object expected: ${h}, ${p}, ${m}`); const b = G(p); - if (!(b === null && h === null)) { - if (h !== void 0 && typeof h != "string") - throw _(`Malformed whitelist permit ${m}.__proto__`); - if (b !== t[h || "%ObjectPrototype%"]) - throw _(`Unexpected intrinsic ${m}.__proto__ at ${h}`); + if (!(b === null && m === null)) { + if (m !== void 0 && typeof m != "string") + throw _(`Malformed whitelist permit ${h}.__proto__`); + if (b !== t[m || "%ObjectPrototype%"]) + throw _(`Unexpected intrinsic ${h}.__proto__ at ${m}`); } } - function l(m, p, h, b) { + function l(h, p, m, b) { if (typeof b == "object") - return f(m, p, b), !0; + return f(h, p, b), !0; if (b === !1) return !1; if (typeof b == "string") { - if (h === "prototype" || h === "constructor") { - if (ae(t, b)) { + if (m === "prototype" || m === "constructor") { + if (ie(t, b)) { if (p !== t[b]) - throw _(`Does not match whitelist ${m}`); + throw _(`Does not match whitelist ${h}`); return !0; } } else if (Dr(o, b)) { if (typeof p !== b) throw _( - `At ${m} expected ${b} not ${typeof p}` + `At ${h} expected ${b} not ${typeof p}` ); return !0; } } - throw _(`Unexpected whitelist permit ${b} at ${m}`); - } - function d(m, p, h, b) { - const E = X(p, h); - if (!E) - throw _(`Property ${h} not found at ${m}`); - if (ae(E, "value")) { - if (eo(b)) - throw _(`Accessor expected at ${m}`); - return l(m, E.value, h, b); + throw _(`Unexpected whitelist permit ${b} at ${h}`); + } + function u(h, p, m, b) { + const S = Q(p, m); + if (!S) + throw _(`Property ${m} not found at ${h}`); + if (ie(S, "value")) { + if (Jn(b)) + throw _(`Accessor expected at ${h}`); + return l(h, S.value, m, b); } - if (!eo(b)) - throw _(`Accessor not expected at ${m}`); - return l(`${m}`, E.get, h, b.get) && l(`${m}`, E.set, h, b.set); + if (!Jn(b)) + throw _(`Accessor not expected at ${h}`); + return l(`${h}`, S.get, m, b.get) && l(`${h}`, S.set, m, b.set); } - function u(m, p, h) { - const b = h === "__proto__" ? "--proto--" : h; - if (ae(p, b)) + function d(h, p, m) { + const b = m === "__proto__" ? "--proto--" : m; + if (ie(p, b)) return p[b]; - if (typeof m == "function" && ae(ln, b)) - return ln[b]; + if (typeof h == "function" && ie(cn, b)) + return cn[b]; } - function f(m, p, h) { + function f(h, p, m) { if (p == null) return; - const b = h["[[Proto]]"]; - c(m, p, b), typeof p == "function" && e(p); - for (const E of Be(p)) { - const S = i(m, E), C = `${m}.${S}`, x = u(p, h, S); - if (!x || !d(C, p, E, x)) { - x !== !1 && n("warn", `Removing ${C}`); + const b = m["[[Proto]]"]; + c(h, p, b), typeof p == "function" && e(p); + for (const S of Be(p)) { + const x = i(h, S), I = `${h}.${x}`, E = d(p, m, x); + if (!E || !u(I, p, S, E)) { + E !== !1 && n("warn", `Removing ${I}`); try { - delete p[E]; - } catch (M) { - if (E in p) { - if (typeof p == "function" && E === "prototype" && (p.prototype = void 0, p.prototype === void 0)) { + delete p[S]; + } catch (A) { + if (S in p) { + if (typeof p == "function" && S === "prototype" && (p.prototype = void 0, p.prototype === void 0)) { n( "warn", - `Tolerating undeletable ${C} === undefined` + `Tolerating undeletable ${I} === undefined` ); continue; } - n("error", `failed to delete ${C}`, M); + n("error", `failed to delete ${I}`, A); } else - n("error", `deleting ${C} threw`, M); - throw M; + n("error", `deleting ${I} threw`, A); + throw A; } } } } try { - f("intrinsics", t, xr); + f("intrinsics", t, Er); } finally { r && console.groupEnd(); } } -function Ya() { +function Ka() { try { - we.prototype.constructor("return 1"); + xe.prototype.constructor("return 1"); } catch { return y({}); } @@ -2110,7 +2110,7 @@ function Ya() { "Function.prototype.constructor is not a valid constructor." ); }; - Z(c, { + z(c, { prototype: { value: i }, name: { value: r, @@ -2118,9 +2118,9 @@ function Ya() { enumerable: !1, configurable: !0 } - }), Z(i, { + }), z(i, { constructor: { value: c } - }), c !== we.prototype.constructor && xo(c, we.prototype.constructor), t[n] = c; + }), c !== xe.prototype.constructor && So(c, xe.prototype.constructor), t[n] = c; } return e("Function", "%InertFunction%", "(function(){})"), e( "GeneratorFunction", @@ -2136,10 +2136,10 @@ function Ya() { "(async function*(){})" ), t; } -function Ja(t = "safe") { +function Ya(t = "safe") { if (t !== "safe" && t !== "unsafe") throw _(`unrecognized dateTaming ${t}`); - const e = Vs, r = e.prototype, n = { + const e = Gs, r = e.prototype, n = { /** * `%SharedDate%.now()` throw a `TypeError` starting with "secure mode". * See https://github.com/endojs/endo/issues/910#issuecomment-1581855420 @@ -2149,19 +2149,19 @@ function Ja(t = "safe") { } }, o = ({ powers: c = "none" } = {}) => { let l; - return c === "original" ? l = function(...u) { - return new.target === void 0 ? se(e, void 0, u) : yr(e, u, new.target); - } : l = function(...u) { + return c === "original" ? l = function(...d) { + return new.target === void 0 ? ae(e, void 0, d) : yr(e, d, new.target); + } : l = function(...d) { if (new.target === void 0) throw _( "secure mode Calling %SharedDate% constructor as a function throws" ); - if (u.length === 0) + if (d.length === 0) throw _( "secure mode Calling new %SharedDate%() with no arguments throws" ); - return yr(e, u, new.target); - }, Z(l, { + return yr(e, d, new.target); + }, z(l, { length: { value: 7 }, prototype: { value: r, @@ -2183,31 +2183,31 @@ function Ja(t = "safe") { } }), l; }, a = o({ powers: "original" }), i = o({ powers: "none" }); - return Z(a, { + return z(a, { now: { value: e.now, writable: !0, enumerable: !1, configurable: !0 } - }), Z(i, { + }), z(i, { now: { value: n.now, writable: !0, enumerable: !1, configurable: !0 } - }), Z(r, { + }), z(r, { constructor: { value: i } }), { "%InitialDate%": a, "%SharedDate%": i }; } -function Xa(t = "safe") { +function Ja(t = "safe") { if (t !== "safe" && t !== "unsafe") throw _(`unrecognized mathTaming ${t}`); - const e = qs, r = e, { random: n, ...o } = je(e), i = V(wn, { + const e = Ws, r = e, { random: n, ...o } = je(e), i = V(_n, { ...o, random: { value: { @@ -2229,14 +2229,14 @@ function Xa(t = "safe") { "%SharedMath%": i }; } -function Qa(t = "safe") { +function Xa(t = "safe") { if (t !== "safe" && t !== "unsafe") throw _(`unrecognized regExpTaming ${t}`); const e = Je.prototype, r = (a = {}) => { const i = function(...l) { return new.target === void 0 ? Je(...l) : yr(Je, l, new.target); }; - if (Z(i, { + if (z(i, { length: { value: 2 }, prototype: { value: e, @@ -2245,26 +2245,26 @@ function Qa(t = "safe") { configurable: !1 } }), Yr) { - const c = X( + const c = Q( Je, Yr ); if (!c) throw _("no RegExp[Symbol.species] descriptor"); - Z(i, { + z(i, { [Yr]: c }); } return i; }, n = r(), o = r(); - return t !== "unsafe" && delete e.compile, Z(e, { + return t !== "unsafe" && delete e.compile, z(e, { constructor: { value: o } }), { "%InitialRegExp%": n, "%SharedRegExp%": o }; } -const ei = { +const Qa = { "%ObjectPrototype%": { toString: !0 }, @@ -2283,7 +2283,7 @@ const ei = { // https://github.com/tc39/proposal-iterator-helpers [Xe]: !0 } -}, as = { +}, ss = { "%ObjectPrototype%": { toString: !0, valueOf: !0 @@ -2381,8 +2381,8 @@ const ei = { // https://github.com/tc39/proposal-iterator-helpers [Xe]: !0 } -}, ti = { - ...as, +}, ei = { + ...ss, /** * Rollup (as used at least by vega) and webpack * (as used at least by regenerator) both turn exports into assignments @@ -2435,24 +2435,24 @@ const ei = { */ "%SetPrototype%": "*" }; -function ri(t, e, r = []) { - const n = new Rt(r); - function o(d, u, f, m) { - if ("value" in m && m.configurable) { - const { value: p } = m, h = xn(n, f), { get: b, set: E } = X( +function ti(t, e, r = []) { + const n = new Nt(r); + function o(u, d, f, h) { + if ("value" in h && h.configurable) { + const { value: p } = h, m = wn(n, f), { get: b, set: S } = Q( { get [f]() { return p; }, - set [f](S) { - if (u === this) + set [f](x) { + if (d === this) throw _( - `Cannot assign to read only property '${ge( + `Cannot assign to read only property '${ye( f - )}' of '${d}'` + )}' of '${u}'` ); - ae(this, f) ? this[f] = S : (h && console.error(_(`Override property ${f}`)), F(this, f, { - value: S, + ie(this, f) ? this[f] = x : (m && console.error(_(`Override property ${f}`)), U(this, f, { + value: x, writable: !0, enumerable: !0, configurable: !0 @@ -2461,55 +2461,55 @@ function ri(t, e, r = []) { }, f ); - F(b, "originalValue", { + U(b, "originalValue", { value: p, writable: !1, enumerable: !1, configurable: !1 - }), F(u, f, { + }), U(d, f, { get: b, - set: E, - enumerable: m.enumerable, - configurable: m.configurable + set: S, + enumerable: h.enumerable, + configurable: h.configurable }); } } - function a(d, u, f) { - const m = X(u, f); - m && o(d, u, f, m); + function a(u, d, f) { + const h = Q(d, f); + h && o(u, d, f, h); } - function i(d, u) { - const f = je(u); - f && dt(Be(f), (m) => o(d, u, m, f[m])); + function i(u, d) { + const f = je(d); + f && dt(Be(f), (h) => o(u, d, h, f[h])); } - function c(d, u, f) { - for (const m of Be(f)) { - const p = X(u, m); + function c(u, d, f) { + for (const h of Be(f)) { + const p = Q(d, h); if (!p || p.get || p.set) continue; - const h = `${d}.${ge(m)}`, b = f[m]; + const m = `${u}.${ye(h)}`, b = f[h]; if (b === !0) - a(h, u, m); + a(m, d, h); else if (b === "*") - i(h, p.value); + i(m, p.value); else if (Se(b)) - c(h, p.value, b); + c(m, p.value, b); else - throw _(`Unexpected override enablement plan ${h}`); + throw _(`Unexpected override enablement plan ${m}`); } } let l; switch (e) { case "min": { - l = ei; + l = Qa; break; } case "moderate": { - l = as; + l = ss; break; } case "severe": { - l = ti; + l = ei; break; } default: @@ -2517,7 +2517,7 @@ function ri(t, e, r = []) { } c("root", t, l); } -const { Fail: un, quote: kr } = Y, ni = /^(\w*[a-z])Locale([A-Z]\w*)$/, is = { +const { Fail: ln, quote: kr } = Y, ri = /^(\w*[a-z])Locale([A-Z]\w*)$/, as = { // See https://tc39.es/ecma262/#sec-string.prototype.localecompare localeCompare(t) { if (this === null || this === void 0) @@ -2525,64 +2525,64 @@ const { Fail: un, quote: kr } = Y, ni = /^(\w*[a-z])Locale([A-Z]\w*)$/, is = { 'Cannot localeCompare with null or undefined "this" value' ); const e = `${this}`, r = `${t}`; - return e < r ? -1 : e > r ? 1 : (e === r || un`expected ${kr(e)} and ${kr(r)} to compare`, 0); + return e < r ? -1 : e > r ? 1 : (e === r || ln`expected ${kr(e)} and ${kr(r)} to compare`, 0); }, toString() { return `${this}`; } -}, oi = is.localeCompare, si = is.toString; -function ai(t, e = "safe") { +}, ni = as.localeCompare, oi = as.toString; +function si(t, e = "safe") { if (e !== "safe" && e !== "unsafe") throw _(`unrecognized localeTaming ${e}`); if (e !== "unsafe") { - F(ge.prototype, "localeCompare", { - value: oi + U(ye.prototype, "localeCompare", { + value: ni }); - for (const r of At(t)) { + for (const r of It(t)) { const n = t[r]; if (Se(n)) - for (const o of At(n)) { - const a = Pn(ni, o); + for (const o of It(n)) { + const a = Sn(ri, o); if (a) { - typeof n[o] == "function" || un`expected ${kr(o)} to be a function`; + typeof n[o] == "function" || ln`expected ${kr(o)} to be a function`; const i = `${a[1]}${a[2]}`, c = n[i]; - typeof c == "function" || un`function ${kr(i)} not found`, F(n, o, { value: c }); + typeof c == "function" || ln`function ${kr(i)} not found`, U(n, o, { value: c }); } } } - F(So.prototype, "toLocaleString", { - value: si + U(wo.prototype, "toLocaleString", { + value: oi }); } } -const ii = (t) => ({ +const ai = (t) => ({ eval(r) { return typeof r != "string" ? r : t(r); } -}).eval, { Fail: ro } = Y, ci = (t) => { +}).eval, { Fail: Qn } = Y, ii = (t) => { const e = function(n) { const o = `${_r(arguments) || ""}`, a = `${Lt(arguments, ",")}`; - new we(a, ""), new we(o); + new xe(a, ""), new xe(o); const i = `(function anonymous(${a} ) { ${o} })`; return t(i); }; - return Z(e, { + return z(e, { // Ensure that any function created in any evaluator in a realm is an // instance of Function in any evaluator of the same realm. prototype: { - value: we.prototype, + value: xe.prototype, writable: !1, enumerable: !1, configurable: !1 } - }), G(we) === we.prototype || ro`Function prototype is the same accross compartments`, G(e) === we.prototype || ro`Function constructor prototype is the same accross compartments`, e; -}, li = (t) => { - F( + }), G(xe) === xe.prototype || Qn`Function prototype is the same accross compartments`, G(e) === xe.prototype || Qn`Function constructor prototype is the same accross compartments`, e; +}, ci = (t) => { + U( t, - Qs, + Xs, y( Or(V(null), { set: y(() => { @@ -2595,30 +2595,30 @@ ${o} }) ) ); -}, cs = (t) => { - for (const [e, r] of de(es)) - F(t, e, { +}, is = (t) => { + for (const [e, r] of fe(Qo)) + U(t, e, { value: r, writable: !1, enumerable: !1, configurable: !1 }); -}, ls = (t, { +}, cs = (t, { intrinsics: e, newGlobalPropertyNames: r, makeCompartmentConstructor: n, markVirtualizedNativeFunction: o, parentCompartment: a }) => { - for (const [c, l] of de(ts)) - ae(e, l) && F(t, c, { + for (const [c, l] of fe(es)) + ie(e, l) && U(t, c, { value: e[l], writable: !0, enumerable: !1, configurable: !0 }); - for (const [c, l] of de(r)) - ae(e, l) && F(t, c, { + for (const [c, l] of fe(r)) + ie(e, l) && U(t, c, { value: e[l], writable: !0, enumerable: !1, @@ -2635,17 +2635,17 @@ ${o} a ) ); - for (const [c, l] of de(i)) - F(t, c, { + for (const [c, l] of fe(i)) + U(t, c, { value: l, writable: !0, enumerable: !1, configurable: !0 }), typeof l == "function" && o(l); -}, dn = (t, e, r) => { +}, un = (t, e, r) => { { - const n = y(ii(e)); - r(n), F(t, "eval", { + const n = y(ai(e)); + r(n), U(t, "eval", { value: n, writable: !0, enumerable: !1, @@ -2653,26 +2653,26 @@ ${o} }); } { - const n = y(ci(e)); - r(n), F(t, "Function", { + const n = y(ii(e)); + r(n), U(t, "Function", { value: n, writable: !0, enumerable: !1, configurable: !0 }); } -}, { Fail: ui, quote: us } = Y, ds = new Rr( - In, +}, { Fail: li, quote: ls } = Y, us = new Nr( + Pn, y({ get(t, e) { - ui`Please report unexpected scope handler trap: ${us(ge(e))}`; + li`Please report unexpected scope handler trap: ${ls(ye(e))}`; } }) -), di = { +), ui = { get(t, e) { }, set(t, e, r) { - throw zt(`${ge(e)} is not defined`); + throw zt(`${ye(e)} is not defined`); }, has(t, e) { return e in P; @@ -2685,7 +2685,7 @@ ${o} // See https://github.com/endojs/endo/issues/1510 // TODO: report as bug to v8 or Chrome, and record issue link here. getOwnPropertyDescriptor(t, e) { - const r = us(ge(e)); + const r = ls(ye(e)); console.warn( `getOwnPropertyDescriptor trap on scopeTerminatorHandler for ${r}`, _().stack @@ -2696,18 +2696,18 @@ ${o} ownKeys(t) { return []; } -}, fs = y( +}, ds = y( V( - ds, - je(di) + us, + je(ui) ) -), fi = new Rr( - In, - fs -), ps = (t) => { +), di = new Nr( + Pn, + ds +), fs = (t) => { const e = { // inherit scopeTerminator behavior - ...fs, + ...ds, // Redirect set properties to the globalObject. set(o, a, i) { return Io(t, a, i); @@ -2718,21 +2718,21 @@ ${o} } }, r = y( V( - ds, + us, je(e) ) ); - return new Rr( - In, + return new Nr( + Pn, r ); }; -y(ps); -const { Fail: pi } = Y, mi = () => { +y(fs); +const { Fail: fi } = Y, pi = () => { const t = V(null), e = y({ eval: { get() { - return delete t.eval, jo; + return delete t.eval, Uo; }, enumerable: !1, configurable: !0 @@ -2741,78 +2741,78 @@ const { Fail: pi } = Y, mi = () => { evalScope: t, allowNextEvalToBeUnsafe() { const { revoked: n } = r; - n !== null && pi`a handler did not reset allowNextEvalToBeUnsafe ${n.err}`, Z(t, e); + n !== null && fi`a handler did not reset allowNextEvalToBeUnsafe ${n.err}`, z(t, e); }, /** @type {null | { err: any }} */ revoked: null }; return r; -}, no = "\\s*[@#]\\s*([a-zA-Z][a-zA-Z0-9]*)\\s*=\\s*([^\\s\\*]*)", hi = new Je( - `(?:\\s*//${no}|/\\*${no}\\s*\\*/)\\s*$` -), $n = (t) => { +}, eo = "\\s*[@#]\\s*([a-zA-Z][a-zA-Z0-9]*)\\s*=\\s*([^\\s\\*]*)", hi = new Je( + `(?:\\s*//${eo}|/\\*${eo}\\s*\\*/)\\s*$` +), In = (t) => { let e = ""; for (; t.length > 0; ) { - const r = Pn(hi, t); + const r = Sn(hi, t); if (r === null) break; - t = Tn(t, 0, t.length - r[0].length), r[3] === "sourceURL" ? e = r[4] : r[1] === "sourceURL" && (e = r[2]); + t = En(t, 0, t.length - r[0].length), r[3] === "sourceURL" ? e = r[4] : r[1] === "sourceURL" && (e = r[2]); } return e; }; -function Nn(t, e) { - const r = _a(t, e); +function An(t, e) { + const r = ya(t, e); if (r < 0) return -1; const n = t[r] === ` ` ? 1 : 0; - return An(Tn(t, 0, r), ` + return kn(En(t, 0, r), ` `).length + n; } -const ms = new Je("(?:)", "g"), hs = (t) => { - const e = Nn(t, ms); +const ps = new Je("(?:)", "g"), hs = (t) => { + const e = An(t, ps); if (e < 0) return t; - const r = $n(t); + const r = In(t); throw or( `Possible HTML comment rejected at ${r}:${e}. (SES_HTML_COMMENT_REJECTED)` ); -}, gs = (t) => br(t, ms, (r) => r[0] === "<" ? "< ! --" : "-- >"), ys = new Je( +}, ms = (t) => br(t, ps, (r) => r[0] === "<" ? "< ! --" : "-- >"), gs = new Je( "(^|[^.]|\\.\\.\\.)\\bimport(\\s*(?:\\(|/[/*]))", "g" -), _s = (t) => { - const e = Nn(t, ys); +), ys = (t) => { + const e = An(t, gs); if (e < 0) return t; - const r = $n(t); + const r = In(t); throw or( `Possible import expression rejected at ${r}:${e}. (SES_IMPORT_REJECTED)` ); -}, vs = (t) => br(t, ys, (r, n, o) => `${n}__import__${o}`), gi = new Je( +}, _s = (t) => br(t, gs, (r, n, o) => `${n}__import__${o}`), mi = new Je( "(^|[^.])\\beval(\\s*\\()", "g" -), bs = (t) => { - const e = Nn(t, gi); +), vs = (t) => { + const e = An(t, mi); if (e < 0) return t; - const r = $n(t); + const r = In(t); throw or( `Possible direct eval expression rejected at ${r}:${e}. (SES_EVAL_REJECTED)` ); -}, ws = (t) => (t = hs(t), t = _s(t), t), Ss = (t, e) => { +}, bs = (t) => (t = hs(t), t = ys(t), t), ws = (t, e) => { for (const r of e) t = r(t); return t; }; y({ rejectHtmlComments: y(hs), - evadeHtmlCommentTest: y(gs), - rejectImportExpressions: y(_s), - evadeImportExpressionTest: y(vs), - rejectSomeDirectEvalExpressions: y(bs), - mandatoryTransforms: y(ws), - applyTransforms: y(Ss) + evadeHtmlCommentTest: y(ms), + rejectImportExpressions: y(ys), + evadeImportExpressionTest: y(_s), + rejectSomeDirectEvalExpressions: y(vs), + mandatoryTransforms: y(bs), + applyTransforms: y(ws) }); -const yi = [ +const gi = [ // 11.6.2.1 Keywords "await", "break", @@ -2867,9 +2867,9 @@ const yi = [ "false", "this", "arguments" -], _i = /^[a-zA-Z_$][\w$]*$/, oo = (t) => t !== "eval" && !Dr(yi, t) && kn(_i, t); -function so(t, e) { - const r = X(t, e); +], yi = /^[a-zA-Z_$][\w$]*$/, to = (t) => t !== "eval" && !Dr(gi, t) && xn(yi, t); +function ro(t, e) { + const r = Q(t, e); return r && // // The getters will not have .writable, don't let the falsyness of // 'undefined' trick us: test with === false, not ! . However descriptors @@ -2883,12 +2883,12 @@ function so(t, e) { // can't have accessors and value properties at the same time, therefore // this check is sufficient. Using explicit own property deal with the // case where Object.prototype has been poisoned. - ae(r, "value"); + ie(r, "value"); } -const vi = (t, e = {}) => { - const r = At(t), n = At(e), o = Qe( +const _i = (t, e = {}) => { + const r = It(t), n = It(e), o = Qe( n, - (i) => oo(i) && so(e, i) + (i) => to(i) && ro(e, i) ); return { globalObjectConstants: Qe( @@ -2896,26 +2896,26 @@ const vi = (t, e = {}) => { (i) => ( // Can't define a constant: it would prevent a // lookup on the endowments. - !Dr(n, i) && oo(i) && so(t, i) + !Dr(n, i) && to(i) && ro(t, i) ) ), moduleLexicalConstants: o }; }; -function ao(t, e) { +function no(t, e) { return t.length === 0 ? "" : `const {${Lt(t, ",")}} = this.${e};`; } -const bi = (t) => { - const { globalObjectConstants: e, moduleLexicalConstants: r } = vi( +const vi = (t) => { + const { globalObjectConstants: e, moduleLexicalConstants: r } = _i( t.globalObject, t.moduleLexicals - ), n = ao( + ), n = no( e, "globalObject" - ), o = ao( + ), o = no( r, "moduleLexicals" - ), a = we(` + ), a = xe(` with (this.scopeTerminator) { with (this.globalObject) { with (this.moduleLexicals) { @@ -2931,50 +2931,50 @@ const bi = (t) => { } } `); - return se(a, t, []); -}, { Fail: wi } = Y, Rn = ({ + return ae(a, t, []); +}, { Fail: bi } = Y, Cn = ({ globalObject: t, moduleLexicals: e = {}, globalTransforms: r = [], sloppyGlobalsMode: n = !1 }) => { - const o = n ? ps(t) : fi, a = mi(), { evalScope: i } = a, c = y({ + const o = n ? fs(t) : di, a = pi(), { evalScope: i } = a, c = y({ evalScope: i, moduleLexicals: e, globalObject: t, scopeTerminator: o }); let l; - const d = () => { - l || (l = bi(c)); + const u = () => { + l || (l = vi(c)); }; - return { safeEvaluate: (f, m) => { - const { localTransforms: p = [] } = m || {}; - d(), f = Ss(f, [ + return { safeEvaluate: (f, h) => { + const { localTransforms: p = [] } = h || {}; + u(), f = ws(f, [ ...p, ...r, - ws + bs ]); - let h; + let m; try { - return a.allowNextEvalToBeUnsafe(), se(l, t, [f]); + return a.allowNextEvalToBeUnsafe(), ae(l, t, [f]); } catch (b) { - throw h = b, b; + throw m = b, b; } finally { const b = "eval" in i; - delete i.eval, b && (a.revoked = { err: h }, wi`handler did not reset allowNextEvalToBeUnsafe ${h}`); + delete i.eval, b && (a.revoked = { err: m }, bi`handler did not reset allowNextEvalToBeUnsafe ${m}`); } } }; -}, Si = ") { [native code] }"; +}, wi = ") { [native code] }"; let en; -const Es = () => { +const xs = () => { if (en === void 0) { const t = new Ot(); - F(Sn, "toString", { + U(vn, "toString", { value: { toString() { - const r = wa(this); - return Mo(r, Si) || !ir(t, this) ? r : `function ${this.name}() { [native code] }`; + const r = ba(this); + return Oo(r, wi) || !ir(t, this) ? r : `function ${this.name}() { [native code] }`; } }.toString }), en = y( @@ -2983,19 +2983,19 @@ const Es = () => { } return en; }; -function Ei(t = "safe") { +function xi(t = "safe") { if (t !== "safe" && t !== "unsafe") throw _(`unrecognized domainTaming ${t}`); if (t === "unsafe") return; const e = P.process || void 0; if (typeof e == "object") { - const r = X(e, "domain"); + const r = Q(e, "domain"); if (r !== void 0 && r.get !== void 0) throw _( "SES failed to lockdown, Node.js domains have been initialized (SES_NO_DOMAINS)" ); - F(e, "domain", { + U(e, "domain", { value: null, configurable: !1, writable: !1, @@ -3003,7 +3003,7 @@ function Ei(t = "safe") { }); } } -const On = y([ +const $n = y([ ["debug", "debug"], // (fmt?, ...args) verbose level on Chrome ["log", "log"], @@ -3022,7 +3022,7 @@ const On = y([ // (fmt?, ...args) but TS typed (...label) ["groupCollapsed", "log"] // (fmt?, ...args) but TS typed (...label) -]), Mn = y([ +]), Rn = y([ ["assert", "error"], // (value, fmt?, ...args) ["timeLog", "log"], @@ -3054,18 +3054,18 @@ const On = y([ // (label?) ["timeStamp", void 0] // (label?) -]), xs = y([ - ...On, - ...Mn -]), xi = (t, { shouldResetForDebugging: e = !1 } = {}) => { +]), Ss = y([ + ...$n, + ...Rn +]), Si = (t, { shouldResetForDebugging: e = !1 } = {}) => { e && t.resetErrorTagNum(); let r = []; - const n = ht( - ie(xs, ([i, c]) => { - const l = (...d) => { - Q(r, [i, ...d]); + const n = mt( + ce(Ss, ([i, c]) => { + const l = (...u) => { + ee(r, [i, ...u]); }; - return F(l, "name", { value: i }), [i, y(l)]; + return U(l, "name", { value: i }), [i, y(l)]; }) ); y(n); @@ -3078,7 +3078,7 @@ const On = y([ n ), takeLog: o }); }; -y(xi); +y(Si); const lt = { NOTE: "ERROR_NOTE:", MESSAGE: "ERROR_MESSAGE:", @@ -3086,153 +3086,153 @@ const lt = { ERRORS: "errors:" }; y(lt); -const Ln = (t, e) => { +const Nn = (t, e) => { if (!t) return; - const { getStackString: r, tagError: n, takeMessageLogArgs: o, takeNoteLogArgsArray: a } = e, i = (E, S) => ie(E, (x) => Zr(x) ? (Q(S, x), `(${n(x)})`) : x), c = (E, S, C, x, M) => { - const D = n(S), B = C === lt.MESSAGE ? `${D}:` : `${D} ${C}`, L = i(x, M); - t[E](B, ...L); - }, l = (E, S, C = void 0) => { - if (S.length === 0) + const { getStackString: r, tagError: n, takeMessageLogArgs: o, takeNoteLogArgsArray: a } = e, i = (S, x) => ce(S, (E) => Zr(E) ? (ee(x, E), `(${n(E)})`) : E), c = (S, x, I, E, A) => { + const N = n(x), D = I === lt.MESSAGE ? `${N}:` : `${N} ${I}`, M = i(E, A); + t[S](D, ...M); + }, l = (S, x, I = void 0) => { + if (x.length === 0) return; - if (S.length === 1 && C === void 0) { - f(E, S[0]); + if (x.length === 1 && I === void 0) { + f(S, x[0]); return; } - let x; - S.length === 1 ? x = "Nested error" : x = `Nested ${S.length} errors`, C !== void 0 && (x = `${x} under ${C}`), t.group(x); + let E; + x.length === 1 ? E = "Nested error" : E = `Nested ${x.length} errors`, I !== void 0 && (E = `${E} under ${I}`), t.group(E); try { - for (const M of S) - f(E, M); + for (const A of x) + f(S, A); } finally { t.groupEnd(); } - }, d = new Ot(), u = (E) => (S, C) => { - const x = []; - c(E, S, lt.NOTE, C, x), l(E, x, n(S)); - }, f = (E, S) => { - if (ir(d, S)) + }, u = new Ot(), d = (S) => (x, I) => { + const E = []; + c(S, x, lt.NOTE, I, E), l(S, E, n(x)); + }, f = (S, x) => { + if (ir(u, x)) return; - const C = n(S); - jr(d, S); - const x = [], M = o(S), D = a( - S, - u(E) + const I = n(x); + jr(u, x); + const E = [], A = o(x), N = a( + x, + d(S) ); - M === void 0 ? t[E](`${C}:`, S.message) : c( - E, + A === void 0 ? t[S](`${I}:`, x.message) : c( S, + x, lt.MESSAGE, - M, - x + A, + E ); - let B = r(S); - typeof B == "string" && B.length >= 1 && !Mo(B, ` -`) && (B += ` -`), t[E](B), S.cause && c(E, S, lt.CAUSE, [S.cause], x), S.errors && c(E, S, lt.ERRORS, S.errors, x); - for (const L of D) - c(E, S, lt.NOTE, L, x); - l(E, x, C); - }, m = ie(On, ([E, S]) => { - const C = (...x) => { - const M = [], D = i(x, M); - t[E](...D), l(E, M); + let D = r(x); + typeof D == "string" && D.length >= 1 && !Oo(D, ` +`) && (D += ` +`), t[S](D), x.cause && c(S, x, lt.CAUSE, [x.cause], E), x.errors && c(S, x, lt.ERRORS, x.errors, E); + for (const M of N) + c(S, x, lt.NOTE, M, E); + l(S, E, I); + }, h = ce($n, ([S, x]) => { + const I = (...E) => { + const A = [], N = i(E, A); + t[S](...N), l(S, A); }; - return F(C, "name", { value: E }), [E, y(C)]; + return U(I, "name", { value: S }), [S, y(I)]; }), p = Qe( - Mn, - ([E, S]) => E in t - ), h = ie(p, ([E, S]) => { - const C = (...x) => { - t[E](...x); + Rn, + ([S, x]) => S in t + ), m = ce(p, ([S, x]) => { + const I = (...E) => { + t[S](...E); }; - return F(C, "name", { value: E }), [E, y(C)]; - }), b = ht([...m, ...h]); + return U(I, "name", { value: S }), [S, y(I)]; + }), b = mt([...h, ...m]); return ( /** @type {VirtualConsole} */ y(b) ); }; -y(Ln); -const ki = (t, e, r) => { - const [n, ...o] = An(t, e), a = Ro(o, (i) => [e, ...r, i]); +y(Nn); +const Ei = (t, e, r) => { + const [n, ...o] = kn(t, e), a = Ro(o, (i) => [e, ...r, i]); return ["", n, ...a]; -}, ks = (t) => y((r) => { +}, Es = (t) => y((r) => { const n = [], o = (...l) => (n.length > 0 && (l = Ro( l, - (d) => typeof d == "string" && Lo(d, ` -`) ? ki(d, ` -`, n) : [d] - ), l = [...n, ...l]), r(...l)), a = (l, d) => ({ [l]: (...u) => d(...u) })[l], i = ht([ - ...ie(On, ([l]) => [ + (u) => typeof u == "string" && Mo(u, ` +`) ? Ei(u, ` +`, n) : [u] + ), l = [...n, ...l]), r(...l)), a = (l, u) => ({ [l]: (...d) => u(...d) })[l], i = mt([ + ...ce($n, ([l]) => [ l, a(l, o) ]), - ...ie(Mn, ([l]) => [ + ...ce(Rn, ([l]) => [ l, - a(l, (...d) => o(l, ...d)) + a(l, (...u) => o(l, ...u)) ]) ]); for (const l of ["group", "groupCollapsed"]) - i[l] && (i[l] = a(l, (...d) => { - d.length >= 1 && o(...d), Q(n, " "); + i[l] && (i[l] = a(l, (...u) => { + u.length >= 1 && o(...u), ee(n, " "); })); return i.groupEnd && (i.groupEnd = a("groupEnd", (...l) => { _r(n); - })), harden(i), Ln( + })), harden(i), Nn( /** @type {VirtualConsole} */ i, t ); }); -y(ks); -const Pi = (t, e, r = void 0) => { +y(Es); +const ki = (t, e, r = void 0) => { const n = Qe( - xs, + Ss, ([i, c]) => i in t - ), o = ie(n, ([i, c]) => [i, y((...d) => { - (c === void 0 || e.canLog(c)) && t[i](...d); - })]), a = ht(o); + ), o = ce(n, ([i, c]) => [i, y((...u) => { + (c === void 0 || e.canLog(c)) && t[i](...u); + })]), a = mt(o); return ( /** @type {VirtualConsole} */ y(a) ); }; -y(Pi); -const Ti = (t) => { +y(ki); +const oo = (t) => { if (Tt === void 0) return; let e = 0; - const r = new Ce(), n = (u) => { - fa(r, u); - }, o = new Ue(), a = (u) => { - if (Ur(r, u)) { - const f = Ge(r, u); - n(u), t(f); + const r = new Ce(), n = (d) => { + da(r, d); + }, o = new Ue(), a = (d) => { + if (Ur(r, d)) { + const f = Ge(r, d); + n(d), t(f); } }, i = new Tt(a); return { - rejectionHandledHandler: (u) => { - const f = j(o, u); + rejectionHandledHandler: (d) => { + const f = Z(o, d); n(f); }, - unhandledRejectionHandler: (u, f) => { + unhandledRejectionHandler: (d, f) => { e += 1; - const m = e; - le(r, m, u), ue(o, f, m), Ea(i, f, m, f); + const h = e; + ue(r, h, d), de(o, f, h), xa(i, f, h, f); }, processTerminationHandler: () => { - for (const [u, f] of pa(r)) - n(u), t(f); + for (const [d, f] of fa(r)) + n(d), t(f); } }; }, tn = (t) => { throw _(t); -}, io = (t, e) => y((...r) => se(t, e, r)), Ai = (t = "safe", e = "platform", r = "report", n = void 0) => { - console.log("tameConsole", t, e, r), t === "safe" || t === "unsafe" || tn(`unrecognized consoleTaming ${t}`); +}, so = (t, e) => y((...r) => ae(t, e, r)), Pi = (t = "safe", e = "platform", r = "report", n = void 0) => { + t === "safe" || t === "unsafe" || tn(`unrecognized consoleTaming ${t}`); let o; - n === void 0 ? o = Er : o = { - ...Er, + n === void 0 ? o = Sr : o = { + ...Sr, getStackString: n }; const a = ( @@ -3242,42 +3242,54 @@ const Ti = (t) => { // Make a good-enough console for eshost (including only functions that // log at a specific level with no special argument interpretation). // https://console.spec.whatwg.org/#logging - ((d) => y({ debug: d, log: d, info: d, warn: d, error: d }))( + ((u) => y({ debug: u, log: u, info: u, warn: u, error: u }))( // eslint-disable-next-line no-undef - io(P.print) + so(P.print) ) ) : void 0 ); if (a && a.log) - for (const d of ["warn", "error"]) - a[d] || F(a, d, { - value: io(a.log, a) + for (const u of ["warn", "error"]) + a[u] || U(a, u, { + value: so(a.log, a) }); const i = ( /** @type {VirtualConsole} */ - t === "unsafe" ? a : Ln(a, o) + t === "unsafe" ? a : Nn(a, o) ), c = P.process || void 0; if (e !== "none" && typeof c == "object" && typeof c.on == "function") { - let d; + let u; if (e === "platform" || e === "exit") { - const { exit: u } = c; - typeof u == "function" || tn("missing process.exit"), d = () => u(c.exitCode || -1); - } else e === "abort" && (d = c.abort, typeof d == "function" || tn("missing process.abort")); - c.on("uncaughtException", (u) => { - i.error(u), d && d(); + const { exit: d } = c; + typeof d == "function" || tn("missing process.exit"), u = () => d(c.exitCode || -1); + } else e === "abort" && (u = c.abort, typeof u == "function" || tn("missing process.abort")); + c.on("uncaughtException", (d) => { + i.error(d), u && u(); }); } if (r !== "none" && typeof c == "object" && typeof c.on == "function") { - const u = Ti((f) => { + const d = oo((f) => { i.error("SES_UNHANDLED_REJECTION:", f); }); - u && (c.on("unhandledRejection", u.unhandledRejectionHandler), c.on("rejectionHandled", u.rejectionHandledHandler), c.on("exit", u.processTerminationHandler)); + d && (c.on("unhandledRejection", d.unhandledRejectionHandler), c.on("rejectionHandled", d.rejectionHandledHandler), c.on("exit", d.processTerminationHandler)); } const l = P.window || void 0; - return e !== "none" && typeof l == "object" && typeof l.addEventListener == "function" && (console.log("eeeeeeeeeee"), l.addEventListener("error", (d) => { - d.preventDefault(), i.error(d.error), (e === "exit" || e === "abort") && (l.location.href = "about:blank"); - })), { console: i }; -}, Ii = [ + if (e !== "none" && typeof l == "object" && typeof l.addEventListener == "function" && l.addEventListener("error", (u) => { + u.preventDefault(), i.error(u.error), (e === "exit" || e === "abort") && (l.location.href = "about:blank"); + }), r !== "none" && typeof l == "object" && typeof l.addEventListener == "function") { + const d = oo((f) => { + i.error("SES_UNHANDLED_REJECTION:", f); + }); + d && (l.addEventListener("unhandledrejection", (f) => { + f.preventDefault(), d.unhandledRejectionHandler(f.reason, f.promise); + }), l.addEventListener("rejectionhandled", (f) => { + f.preventDefault(), d.rejectionHandledHandler(f.promise); + }), l.addEventListener("beforeunload", (f) => { + d.processTerminationHandler(); + })); + } + return { console: i }; +}, Ti = [ // suppress 'getThis' definitely "getTypeName", // suppress 'getFunction' definitely @@ -3300,55 +3312,55 @@ const Ti = (t) => { "getScriptNameOrSourceURL", "toString" // TODO replace to use only whitelisted info -], Ci = (t) => { - const r = ht(ie(Ii, (n) => { +], Ii = (t) => { + const r = mt(ce(Ti, (n) => { const o = t[n]; - return [n, () => se(o, t, [])]; + return [n, () => ae(o, t, [])]; })); return V(r, {}); -}, $i = (t) => ie(t, Ci), Ni = /\/node_modules\//, Ri = /^(?:node:)?internal\//, Oi = /\/packages\/ses\/src\/error\/assert.js$/, Mi = /\/packages\/eventual-send\/src\//, Li = [ - Ni, +}, Ai = (t) => ce(t, Ii), Ci = /\/node_modules\//, $i = /^(?:node:)?internal\//, Ri = /\/packages\/ses\/src\/error\/assert.js$/, Ni = /\/packages\/eventual-send\/src\//, Oi = [ + Ci, + $i, Ri, - Oi, - Mi -], Fi = (t) => { + Ni +], Mi = (t) => { if (!t) return !0; - for (const e of Li) - if (kn(e, t)) + for (const e of Oi) + if (xn(e, t)) return !1; return !0; -}, Di = /^((?:.*[( ])?)[:/\w_-]*\/\.\.\.\/(.+)$/, Ui = /^((?:.*[( ])?)[:/\w_-]*\/(packages\/.+)$/, ji = [ - Di, - Ui -], Zi = (t) => { - for (const e of ji) { - const r = Pn(e, t); +}, Li = /^((?:.*[( ])?)[:/\w_-]*\/\.\.\.\/(.+)$/, Fi = /^((?:.*[( ])?)[:/\w_-]*\/(packages\/.+)$/, Di = [ + Li, + Fi +], Ui = (t) => { + for (const e of Di) { + const r = Sn(e, t); if (r) - return Lt(la(r, 1), ""); + return Lt(ca(r, 1), ""); } return t; -}, zi = (t, e, r, n) => { +}, ji = (t, e, r, n) => { if (r === "unsafe-debug") throw _( "internal: v8+unsafe-debug special case should already be done" ); - const o = t.captureStackTrace, a = (p) => n === "verbose" ? !0 : Fi(p.getFileName()), i = (p) => { - let h = `${p}`; - return n === "concise" && (h = Zi(h)), ` - at ${h}`; - }, c = (p, h) => Lt( - ie(Qe(h, a), i), + const o = t.captureStackTrace, a = (p) => n === "verbose" ? !0 : Mi(p.getFileName()), i = (p) => { + let m = `${p}`; + return n === "concise" && (m = Ui(m)), ` + at ${m}`; + }, c = (p, m) => Lt( + ce(Qe(m, a), i), "" - ), l = new Ue(), d = { + ), l = new Ue(), u = { // The optional `optFn` argument is for cutting off the bottom of // the stack --- for capturing the stack only above the topmost // call to that function. Since this isn't the "real" captureStackTrace // but instead calls the real one, if no other cutoff is provided, // we cut this one off. - captureStackTrace(p, h = d.captureStackTrace) { + captureStackTrace(p, m = u.captureStackTrace) { if (typeof o == "function") { - se(o, t, [p, h]); + ae(o, t, [p, m]); return; } Io(p, "stack", ""); @@ -3358,34 +3370,34 @@ const Ti = (t) => { // string associated with an error. // See https://tc39.es/proposal-error-stacks/ getStackString(p) { - let h = j(l, p); - if (h === void 0 && (p.stack, h = j(l, p), h || (h = { stackString: "" }, ue(l, p, h))), h.stackString !== void 0) - return h.stackString; - const b = c(p, h.callSites); - return ue(l, p, { stackString: b }), b; + let m = Z(l, p); + if (m === void 0 && (p.stack, m = Z(l, p), m || (m = { stackString: "" }, de(l, p, m))), m.stackString !== void 0) + return m.stackString; + const b = c(p, m.callSites); + return de(l, p, { stackString: b }), b; }, - prepareStackTrace(p, h) { + prepareStackTrace(p, m) { if (r === "unsafe") { - const b = c(p, h); - return ue(l, p, { stackString: b }), `${p}${b}`; + const b = c(p, m); + return de(l, p, { stackString: b }), `${p}${b}`; } else - return ue(l, p, { callSites: h }), ""; + return de(l, p, { callSites: m }), ""; } - }, u = d.prepareStackTrace; - t.prepareStackTrace = u; - const f = new Ot([u]), m = (p) => { + }, d = u.prepareStackTrace; + t.prepareStackTrace = d; + const f = new Ot([d]), h = (p) => { if (ir(f, p)) return p; - const h = { - prepareStackTrace(b, E) { - return ue(l, b, { callSites: E }), p(b, $i(E)); + const m = { + prepareStackTrace(b, S) { + return de(l, b, { callSites: S }), p(b, Ai(S)); } }; - return jr(f, h.prepareStackTrace), h.prepareStackTrace; + return jr(f, m.prepareStackTrace), m.prepareStackTrace; }; - return Z(e, { + return z(e, { captureStackTrace: { - value: d.captureStackTrace, + value: u.captureStackTrace, writable: !0, enumerable: !1, configurable: !0 @@ -3396,32 +3408,32 @@ const Ti = (t) => { }, set(p) { if (typeof p == "function") { - const h = m(p); - t.prepareStackTrace = h; + const m = h(p); + t.prepareStackTrace = m; } else - t.prepareStackTrace = u; + t.prepareStackTrace = d; }, enumerable: !1, configurable: !0 } - }), d.getStackString; -}, co = X(ne.prototype, "stack"), lo = co && co.get, Bi = { + }), u.getStackString; +}, ao = Q(oe.prototype, "stack"), io = ao && ao.get, Zi = { getStackString(t) { - return typeof lo == "function" ? se(lo, t, []) : "stack" in t ? `${t.stack}` : ""; + return typeof io == "function" ? ae(io, t, []) : "stack" in t ? `${t.stack}` : ""; } }; -let dr = Bi.getStackString; -function Gi(t = "safe", e = "concise") { +let dr = Zi.getStackString; +function zi(t = "safe", e = "concise") { if (t !== "safe" && t !== "unsafe" && t !== "unsafe-debug") throw _(`unrecognized errorTaming ${t}`); if (e !== "concise" && e !== "verbose") throw _(`unrecognized stackFiltering ${e}`); - const r = ne.prototype, { captureStackTrace: n } = ne, o = typeof n == "function" ? "v8" : "unknown", a = (l = {}) => { - const d = function(...f) { - let m; - return new.target === void 0 ? m = se(ne, this, f) : m = yr(ne, f, new.target), o === "v8" && se(n, ne, [m, d]), m; + const r = oe.prototype, { captureStackTrace: n } = oe, o = typeof n == "function" ? "v8" : "unknown", a = (l = {}) => { + const u = function(...f) { + let h; + return new.target === void 0 ? h = ae(oe, this, f) : h = yr(oe, f, new.target), o === "v8" && ae(n, oe, [h, u]), h; }; - return Z(d, { + return z(u, { length: { value: 1 }, prototype: { value: r, @@ -3429,22 +3441,22 @@ function Gi(t = "safe", e = "concise") { enumerable: !1, configurable: !1 } - }), d; + }), u; }, i = a({ powers: "original" }), c = a({ powers: "none" }); - Z(r, { + z(r, { constructor: { value: c } }); - for (const l of ns) - xo(l, c); - if (Z(i, { + for (const l of rs) + So(l, c); + if (z(i, { stackTraceLimit: { get() { - if (typeof ne.stackTraceLimit == "number") - return ne.stackTraceLimit; + if (typeof oe.stackTraceLimit == "number") + return oe.stackTraceLimit; }, set(l) { - if (typeof l == "number" && typeof ne.stackTraceLimit == "number") { - ne.stackTraceLimit = l; + if (typeof l == "number" && typeof oe.stackTraceLimit == "number") { + oe.stackTraceLimit = l; return; } }, @@ -3453,26 +3465,26 @@ function Gi(t = "safe", e = "concise") { configurable: !0 } }), t === "unsafe-debug" && o === "v8") { - Z(i, { + z(i, { prepareStackTrace: { get() { - return ne.prepareStackTrace; + return oe.prepareStackTrace; }, - set(d) { - ne.prepareStackTrace = d; + set(u) { + oe.prepareStackTrace = u; }, enumerable: !1, configurable: !0 }, captureStackTrace: { - value: ne.captureStackTrace, + value: oe.captureStackTrace, writable: !0, enumerable: !1, configurable: !0 } }); const l = je(i); - return Z(c, { + return z(c, { stackTraceLimit: l.stackTraceLimit, prepareStackTrace: l.prepareStackTrace, captureStackTrace: l.captureStackTrace @@ -3482,7 +3494,7 @@ function Gi(t = "safe", e = "concise") { "%SharedError%": c }; } - return Z(c, { + return z(c, { stackTraceLimit: { get() { }, @@ -3491,7 +3503,7 @@ function Gi(t = "safe", e = "concise") { enumerable: !1, configurable: !0 } - }), o === "v8" && Z(c, { + }), o === "v8" && z(c, { prepareStackTrace: { get() { return () => ""; @@ -3502,8 +3514,8 @@ function Gi(t = "safe", e = "concise") { configurable: !0 }, captureStackTrace: { - value: (l, d) => { - F(l, "stack", { + value: (l, u) => { + U(l, "stack", { value: "" }); }, @@ -3511,18 +3523,18 @@ function Gi(t = "safe", e = "concise") { enumerable: !1, configurable: !0 } - }), o === "v8" ? dr = zi( - ne, + }), o === "v8" ? dr = ji( + oe, i, t, e - ) : t === "unsafe" || t === "unsafe-debug" ? Z(r, { + ) : t === "unsafe" || t === "unsafe-debug" ? z(r, { stack: { get() { return dr(this); }, set(l) { - Z(this, { + z(this, { stack: { value: l, writable: !0, @@ -3532,13 +3544,13 @@ function Gi(t = "safe", e = "concise") { }); } } - }) : Z(r, { + }) : z(r, { stack: { get() { return `${this}`; }, set(l) { - Z(this, { + z(this, { stack: { value: l, writable: !0, @@ -3554,8 +3566,8 @@ function Gi(t = "safe", e = "concise") { "%SharedError%": c }; } -const Vi = () => { -}, Hi = async (t, e, r) => { +const Bi = () => { +}, Gi = async (t, e, r) => { await null; const n = t(...e); let o = vr(n); @@ -3564,20 +3576,20 @@ const Vi = () => { const a = await o.value; o = vr(n, a); } catch (a) { - o = Fo(n, r(a)); + o = Lo(n, r(a)); } return o.value; -}, Wi = (t, e) => { +}, Vi = (t, e) => { const r = t(...e); let n = vr(r); for (; !n.done; ) try { n = vr(r, n.value); } catch (o) { - n = Fo(r, o); + n = Lo(r, o); } return n.value; -}, qi = (t, e) => y({ compartment: t, specifier: e }), Ki = (t, e, r) => { +}, Hi = (t, e) => y({ compartment: t, specifier: e }), Wi = (t, e, r) => { const n = V(null); for (const o of t) { const a = e(o, r); @@ -3585,102 +3597,102 @@ const Vi = () => { } return y(n); }, Dt = (t, e, r, n, o, a, i, c, l) => { - const { resolveHook: d } = j(t, r), u = Ki( + const { resolveHook: u } = Z(t, r), d = Wi( o.imports, - d, + u, n ), f = y({ compartment: r, moduleSource: o, moduleSpecifier: n, - resolvedImports: u, + resolvedImports: d, importMeta: l }); - for (const m of ko(u)) - a(kt, [ + for (const h of Eo(d)) + a(Et, [ t, e, r, - m, + h, a, i, c ]); return f; }; -function* Yi(t, e, r, n, o, a, i) { +function* qi(t, e, r, n, o, a, i) { const { importHook: c, importNowHook: l, - moduleMap: d, - moduleMapHook: u, + moduleMap: u, + moduleMapHook: d, moduleRecords: f, - parentCompartment: m - } = j(t, r); + parentCompartment: h + } = Z(t, r); if (Ur(f, n)) return Ge(f, n); - let p = d[n]; - if (p === void 0 && u !== void 0 && (p = u(n)), p === void 0) { - const h = a(c, l); - if (h === void 0) { + let p = u[n]; + if (p === void 0 && d !== void 0 && (p = d(n)), p === void 0) { + const m = a(c, l); + if (m === void 0) { const b = a( "importHook", "importNowHook" ); throw Me( - oe`${Sr(b)} needed to load module ${U( + se`${xr(b)} needed to load module ${j( n - )} in compartment ${U(r.name)}` + )} in compartment ${j(r.name)}` ); } - p = h(n), xt(e, p) || (p = yield p); + p = m(n), St(e, p) || (p = yield p); } if (typeof p == "string") throw Me( - oe`Cannot map module ${U(n)} to ${U( + se`Cannot map module ${j(n)} to ${j( p )} in parent compartment, use {source} module descriptor`, _ ); if (Se(p)) { - let h = j(e, p); - if (h !== void 0 && (p = h), p.namespace !== void 0) { + let m = Z(e, p); + if (m !== void 0 && (p = m), p.namespace !== void 0) { if (typeof p.namespace == "string") { const { - compartment: S = m, - namespace: C + compartment: x = h, + namespace: I } = p; - if (!Se(S) || !xt(t, S)) + if (!Se(x) || !St(t, x)) throw Me( - oe`Invalid compartment in module descriptor for specifier ${U(n)} in compartment ${U(r.name)}` + se`Invalid compartment in module descriptor for specifier ${j(n)} in compartment ${j(r.name)}` ); - const x = yield kt( + const E = yield Et( t, e, - S, - C, + x, + I, o, a, i ); - return le(f, n, x), x; + return ue(f, n, E), E; } if (Se(p.namespace)) { - const { namespace: S } = p; - if (h = j(e, S), h !== void 0) - p = h; + const { namespace: x } = p; + if (m = Z(e, x), m !== void 0) + p = m; else { - const C = At(S), D = Dt( + const I = It(x), N = Dt( t, e, r, n, { imports: [], - exports: C, - execute(B) { - for (const L of C) - B[L] = S[L]; + exports: I, + execute(D) { + for (const M of I) + D[M] = x[M]; } }, o, @@ -3688,87 +3700,87 @@ function* Yi(t, e, r, n, o, a, i) { i, void 0 ); - return le(f, n, D), D; + return ue(f, n, N), N; } } else throw Me( - oe`Invalid compartment in module descriptor for specifier ${U(n)} in compartment ${U(r.name)}` + se`Invalid compartment in module descriptor for specifier ${j(n)} in compartment ${j(r.name)}` ); } if (p.source !== void 0) if (typeof p.source == "string") { const { - source: S, - specifier: C = n, - compartment: x = m, - importMeta: M = void 0 - } = p, D = yield kt( + source: x, + specifier: I = n, + compartment: E = h, + importMeta: A = void 0 + } = p, N = yield Et( t, e, + E, x, - S, o, a, i - ), { moduleSource: B } = D, L = Dt( + ), { moduleSource: D } = N, M = Dt( t, e, r, - C, - B, + I, + D, o, a, i, - M + A ); - return le(f, n, L), L; + return ue(f, n, M), M; } else { const { - source: S, - specifier: C = n, - importMeta: x - } = p, M = Dt( + source: x, + specifier: I = n, + importMeta: E + } = p, A = Dt( t, e, r, - C, - S, + I, + x, o, a, i, - x + E ); - return le(f, n, M), M; + return ue(f, n, A), A; } if (p.archive !== void 0) throw Me( - oe`Unsupported archive module descriptor for specifier ${U(n)} in compartment ${U(r.name)}` + se`Unsupported archive module descriptor for specifier ${j(n)} in compartment ${j(r.name)}` ); if (p.record !== void 0) { const { - compartment: S = r, - specifier: C = n, - record: x, - importMeta: M - } = p, D = Dt( + compartment: x = r, + specifier: I = n, + record: E, + importMeta: A + } = p, N = Dt( t, e, - S, - C, x, + I, + E, o, a, i, - M + A ); - return le(f, n, D), le(f, C, D), D; + return ue(f, n, N), ue(f, I, N), N; } if (p.compartment !== void 0 && p.specifier !== void 0) { - if (!Se(p.compartment) || !xt(t, p.compartment) || typeof p.specifier != "string") + if (!Se(p.compartment) || !St(t, p.compartment) || typeof p.specifier != "string") throw Me( - oe`Invalid compartment in module descriptor for specifier ${U(n)} in compartment ${U(r.name)}` + se`Invalid compartment in module descriptor for specifier ${j(n)} in compartment ${j(r.name)}` ); - const S = yield kt( + const x = yield Et( t, e, p.compartment, @@ -3777,9 +3789,9 @@ function* Yi(t, e, r, n, o, a, i) { a, i ); - return le(f, n, S), S; + return ue(f, n, x), x; } - const E = Dt( + const S = Dt( t, e, r, @@ -3789,24 +3801,24 @@ function* Yi(t, e, r, n, o, a, i) { a, i ); - return le(f, n, E), E; + return ue(f, n, S), S; } else throw Me( - oe`module descriptor must be a string or object for specifier ${U( + se`module descriptor must be a string or object for specifier ${j( n - )} in compartment ${U(r.name)}` + )} in compartment ${j(r.name)}` ); } -const kt = (t, e, r, n, o, a, i) => { - const { name: c } = j( +const Et = (t, e, r, n, o, a, i) => { + const { name: c } = Z( t, r ); let l = Ge(i, r); - l === void 0 && (l = new Ce(), le(i, r, l)); - let d = Ge(l, n); - return d !== void 0 || (d = a(Hi, Wi)( - Yi, + l === void 0 && (l = new Ce(), ue(i, r, l)); + let u = Ge(l, n); + return u !== void 0 || (u = a(Gi, Vi)( + qi, [ t, e, @@ -3816,22 +3828,22 @@ const kt = (t, e, r, n, o, a, i) => { a, i ], - (u) => { + (d) => { throw Br( - u, - oe`${u.message}, loading ${U(n)} in compartment ${U( + d, + se`${d.message}, loading ${j(n)} in compartment ${j( c )}` - ), u; + ), d; } - ), le(l, n, d)), d; -}, Ji = () => { - const t = new Rt(), e = []; + ), ue(l, n, u)), u; +}, Ki = () => { + const t = new Nt(), e = []; return { enqueueJob: (o, a) => { - En( + bn( t, - Uo(o(...a), Vi, (i) => { - Q(e, i); + Do(o(...a), Bi, (i) => { + ee(e, i); }) ); }, drainQueue: async () => { @@ -3840,63 +3852,63 @@ const kt = (t, e, r, n, o, a, i) => { await o; return e; } }; -}, Ps = ({ errors: t, errorPrefix: e }) => { +}, ks = ({ errors: t, errorPrefix: e }) => { if (t.length > 0) { - const r = pe("COMPARTMENT_LOAD_ERRORS", "", ["verbose"]) === "verbose"; + const r = he("COMPARTMENT_LOAD_ERRORS", "", ["verbose"]) === "verbose"; throw _( `${e} (${t.length} underlying failures: ${Lt( - ie(t, (n) => n.message + (r ? n.stack : "")), + ce(t, (n) => n.message + (r ? n.stack : "")), ", " )}` ); } -}, Xi = (t, e) => e, Qi = (t, e) => t, uo = async (t, e, r, n) => { - const { name: o } = j( +}, Yi = (t, e) => e, Ji = (t, e) => t, co = async (t, e, r, n) => { + const { name: o } = Z( t, r - ), a = new Ce(), { enqueueJob: i, drainQueue: c } = Ji(); - i(kt, [ + ), a = new Ce(), { enqueueJob: i, drainQueue: c } = Ki(); + i(Et, [ t, e, r, n, i, - Qi, + Ji, a ]); const l = await c(); - Ps({ + ks({ errors: l, - errorPrefix: `Failed to load module ${U(n)} in package ${U( + errorPrefix: `Failed to load module ${j(n)} in package ${j( o )}` }); -}, ec = (t, e, r, n) => { - const { name: o } = j( +}, Xi = (t, e, r, n) => { + const { name: o } = Z( t, r - ), a = new Ce(), i = [], c = (l, d) => { + ), a = new Ce(), i = [], c = (l, u) => { try { - l(...d); - } catch (u) { - Q(i, u); + l(...u); + } catch (d) { + ee(i, d); } }; - c(kt, [ + c(Et, [ t, e, r, n, c, - Xi, + Yi, a - ]), Ps({ + ]), ks({ errors: i, - errorPrefix: `Failed to load module ${U(n)} in package ${U( + errorPrefix: `Failed to load module ${j(n)} in package ${j( o )}` }); -}, { quote: yt } = Y, tc = () => { +}, { quote: yt } = Y, Qi = () => { let t = !1; const e = V(null, { // Make this appear like an ESM module namespace object. @@ -3912,7 +3924,7 @@ const kt = (t, e, r, n, o, a, i) => { t = !0; }, exportsTarget: e, - exportsProxy: new Rr(e, { + exportsProxy: new Nr(e, { get(r, n, o) { if (!t) throw _( @@ -3920,7 +3932,7 @@ const kt = (t, e, r, n, o, a, i) => { n )} of module exports namespace, the module has not yet begun to execute` ); - return oa(e, n, o); + return na(e, n, o); }, set(r, n, o) { throw _( @@ -3934,7 +3946,7 @@ const kt = (t, e, r, n, o, a, i) => { n )}, the module has not yet begun to execute` ); - return Ao(e, n); + return To(e, n); }, deleteProperty(r, n) { throw _( @@ -3955,21 +3967,21 @@ const kt = (t, e, r, n, o, a, i) => { n )}, the module has not yet begun to execute` ); - return sa(e, n); + return oa(e, n); }, preventExtensions(r) { if (!t) throw _( "Cannot prevent extensions of module exports namespace, the module has not yet begun to execute" ); - return ia(e); + return aa(e); }, isExtensible() { if (!t) throw _( "Cannot check extensibility of module exports namespace, the module has not yet begun to execute" ); - return aa(e); + return sa(e); }, getPrototypeOf(r) { return null; @@ -3994,18 +4006,18 @@ const kt = (t, e, r, n, o, a, i) => { } }) }); -}, Fn = (t, e, r, n) => { +}, On = (t, e, r, n) => { const { deferredExports: o } = e; if (!Ur(o, n)) { - const a = tc(); - ue( + const a = Qi(); + de( r, a.exportsProxy, - qi(t, n) - ), le(o, n, a); + Hi(t, n) + ), ue(o, n, a); } return Ge(o, n); -}, rc = (t, e) => { +}, ec = (t, e) => { const { sloppyGlobalsMode: r = !1, __moduleShimLexicals__: n = void 0 } = e; let o; if (n === void 0 && !r) @@ -4017,7 +4029,7 @@ const kt = (t, e, r, n, o, a, i) => { n !== void 0 && (a = void 0, c = V( null, je(n) - )), { safeEvaluate: o } = Rn({ + )), { safeEvaluate: o } = Cn({ globalObject: i, moduleLexicals: c, globalTransforms: a, @@ -4025,7 +4037,7 @@ const kt = (t, e, r, n, o, a, i) => { }); } return { safeEvaluate: o }; -}, Ts = (t, e, r) => { +}, Ps = (t, e, r) => { if (typeof e != "string") throw _("first argument of evaluate() must be a string"); const { @@ -4035,65 +4047,65 @@ const kt = (t, e, r, n, o, a, i) => { __rejectSomeDirectEvalExpressions__: i = !0 // Note default on } = r, c = [...n]; - o === !0 && Q(c, gs), a === !0 && Q(c, vs), i === !0 && Q(c, bs); - const { safeEvaluate: l } = rc( + o === !0 && ee(c, ms), a === !0 && ee(c, _s), i === !0 && ee(c, vs); + const { safeEvaluate: l } = ec( t, r ); return l(e, { localTransforms: c }); -}, { quote: fr } = Y, nc = (t, e, r, n, o, a) => { - const { exportsProxy: i, exportsTarget: c, activate: l } = Fn( +}, { quote: fr } = Y, tc = (t, e, r, n, o, a) => { + const { exportsProxy: i, exportsTarget: c, activate: l } = On( r, - j(t, r), + Z(t, r), n, o - ), d = V(null); + ), u = V(null); if (e.exports) { - if (!Et(e.exports) || ua(e.exports, (f) => typeof f != "string")) + if (!xt(e.exports) || la(e.exports, (f) => typeof f != "string")) throw _( `SES virtual module source "exports" property must be an array of strings for module ${o}` ); dt(e.exports, (f) => { - let m = c[f]; + let h = c[f]; const p = []; - F(c, f, { - get: () => m, - set: (E) => { - m = E; - for (const S of p) - S(E); + U(c, f, { + get: () => h, + set: (S) => { + h = S; + for (const x of p) + x(S); }, enumerable: !0, configurable: !1 - }), d[f] = (E) => { - Q(p, E), E(m); + }), u[f] = (S) => { + ee(p, S), S(h); }; - }), d["*"] = (f) => { + }), u["*"] = (f) => { f(c); }; } - const u = { + const d = { activated: !1 }; return y({ - notifiers: d, + notifiers: u, exportsProxy: i, execute() { - if (Ao(u, "errorFromExecute")) - throw u.errorFromExecute; - if (!u.activated) { - l(), u.activated = !0; + if (To(d, "errorFromExecute")) + throw d.errorFromExecute; + if (!d.activated) { + l(), d.activated = !0; try { e.execute(c, r, a); } catch (f) { - throw u.errorFromExecute = f, f; + throw d.errorFromExecute = f, f; } } } }); -}, oc = (t, e, r, n) => { +}, rc = (t, e, r, n) => { const { compartment: o, moduleSpecifier: a, @@ -4101,132 +4113,132 @@ const kt = (t, e, r, n, o, a, i) => { importMeta: c } = r, { reexports: l = [], - __syncModuleProgram__: d, - __fixedExportMap__: u = {}, + __syncModuleProgram__: u, + __fixedExportMap__: d = {}, __liveExportMap__: f = {}, - __reexportMap__: m = {}, + __reexportMap__: h = {}, __needsImportMeta__: p = !1, - __syncModuleFunctor__: h - } = i, b = j(t, o), { __shimTransforms__: E, importMetaHook: S } = b, { exportsProxy: C, exportsTarget: x, activate: M } = Fn( + __syncModuleFunctor__: m + } = i, b = Z(t, o), { __shimTransforms__: S, importMetaHook: x } = b, { exportsProxy: I, exportsTarget: E, activate: A } = On( o, b, e, a - ), D = V(null), B = V(null), L = V(null), xe = V(null), ye = V(null); - c && Or(ye, c), p && S && S(a, ye); + ), N = V(null), D = V(null), M = V(null), J = V(null), _e = V(null); + c && Or(_e, c), p && x && x(a, _e); const He = V(null), ot = V(null); - dt(de(u), ([_e, [H]]) => { + dt(fe(d), ([ve, [H]]) => { let W = He[H]; if (!W) { - let te, re = !0, fe = []; - const J = () => { - if (re) + let re, ne = !0, pe = []; + const X = () => { + if (ne) throw zt(`binding ${fr(H)} not yet initialized`); - return te; + return re; }, ke = y((Pe) => { - if (!re) + if (!ne) throw _( `Internal: binding ${fr(H)} already initialized` ); - te = Pe; - const Bn = fe; - fe = null, re = !1; - for (const Te of Bn || []) + re = Pe; + const jn = pe; + pe = null, ne = !1; + for (const Te of jn || []) Te(Pe); return Pe; }); W = { - get: J, + get: X, notify: (Pe) => { - Pe !== ke && (re ? Q(fe || [], Pe) : Pe(te)); + Pe !== ke && (ne ? ee(pe || [], Pe) : Pe(re)); } - }, He[H] = W, L[H] = ke; + }, He[H] = W, M[H] = ke; } - D[_e] = { + N[ve] = { get: W.get, set: void 0, enumerable: !0, configurable: !1 - }, ot[_e] = W.notify; + }, ot[ve] = W.notify; }), dt( - de(f), - ([_e, [H, W]]) => { - let te = He[H]; - if (!te) { - let re, fe = !0; - const J = [], ke = () => { - if (fe) + fe(f), + ([ve, [H, W]]) => { + let re = He[H]; + if (!re) { + let ne, pe = !0; + const X = [], ke = () => { + if (pe) throw zt( - `binding ${fr(_e)} not yet initialized` + `binding ${fr(ve)} not yet initialized` ); - return re; + return ne; }, gt = y((Te) => { - re = Te, fe = !1; - for (const Hr of J) + ne = Te, pe = !1; + for (const Hr of X) Hr(Te); }), Pe = (Te) => { - if (fe) + if (pe) throw zt(`binding ${fr(H)} not yet initialized`); - re = Te; - for (const Hr of J) + ne = Te; + for (const Hr of X) Hr(Te); }; - te = { + re = { get: ke, notify: (Te) => { - Te !== gt && (Q(J, Te), fe || Te(re)); + Te !== gt && (ee(X, Te), pe || Te(ne)); } - }, He[H] = te, W && F(B, H, { + }, He[H] = re, W && U(D, H, { get: ke, set: Pe, enumerable: !0, configurable: !1 - }), xe[H] = gt; + }), J[H] = gt; } - D[_e] = { - get: te.get, + N[ve] = { + get: re.get, set: void 0, enumerable: !0, configurable: !1 - }, ot[_e] = te.notify; + }, ot[ve] = re.notify; } ); - const We = (_e) => { - _e(x); + const We = (ve) => { + ve(E); }; ot["*"] = We; - function lr(_e) { + function lr(ve) { const H = V(null); H.default = !1; - for (const [W, te] of _e) { - const re = Ge(n, W); - re.execute(); - const { notifiers: fe } = re; - for (const [J, ke] of te) { - const gt = fe[J]; + for (const [W, re] of ve) { + const ne = Ge(n, W); + ne.execute(); + const { notifiers: pe } = ne; + for (const [X, ke] of re) { + const gt = pe[X]; if (!gt) throw or( - `The requested module '${W}' does not provide an export named '${J}'` + `The requested module '${W}' does not provide an export named '${X}'` ); for (const Pe of ke) gt(Pe); } if (Dr(l, W)) - for (const [J, ke] of de( - fe + for (const [X, ke] of fe( + pe )) - H[J] === void 0 ? H[J] = ke : H[J] = !1; - if (m[W]) - for (const [J, ke] of m[W]) - H[ke] = fe[J]; + H[X] === void 0 ? H[X] = ke : H[X] = !1; + if (h[W]) + for (const [X, ke] of h[W]) + H[ke] = pe[X]; } - for (const [W, te] of de(H)) - if (!ot[W] && te !== !1) { - ot[W] = te; - let re; - te((J) => re = J), D[W] = { + for (const [W, re] of fe(H)) + if (!ot[W] && re !== !1) { + ot[W] = re; + let ne; + re((X) => ne = X), N[W] = { get() { - return re; + return ne; }, set: void 0, enumerable: !0, @@ -4234,44 +4246,44 @@ const kt = (t, e, r, n, o, a, i) => { }; } dt( - Oo(Eo(D)), - (W) => F(x, W, D[W]) - ), y(x), M(); + No(xo(N)), + (W) => U(E, W, N[W]) + ), y(E), A(); } let Ft; - h !== void 0 ? Ft = h : Ft = Ts(b, d, { + m !== void 0 ? Ft = m : Ft = Ps(b, u, { globalObject: o.globalThis, - transforms: E, - __moduleShimLexicals__: B + transforms: S, + __moduleShimLexicals__: D }); - let Zn = !1, zn; - function Bs() { + let Dn = !1, Un; + function zs() { if (Ft) { - const _e = Ft; + const ve = Ft; Ft = null; try { - _e( + ve( y({ imports: y(lr), - onceVar: y(L), - liveVar: y(xe), - importMeta: ye + onceVar: y(M), + liveVar: y(J), + importMeta: _e }) ); } catch (H) { - Zn = !0, zn = H; + Dn = !0, Un = H; } } - if (Zn) - throw zn; + if (Dn) + throw Un; } return y({ notifiers: ot, - exportsProxy: C, - execute: Bs + exportsProxy: I, + execute: zs }); -}, { Fail: ut, quote: K } = Y, As = (t, e, r, n) => { - const { name: o, moduleRecords: a } = j( +}, { Fail: ut, quote: K } = Y, Ts = (t, e, r, n) => { + const { name: o, moduleRecords: a } = Z( t, r ), i = Ge(a, n); @@ -4281,12 +4293,12 @@ const kt = (t, e, r, n, o, a, i) => { o )}` ); - return uc(t, e, i); + return cc(t, e, i); }; -function sc(t) { +function nc(t) { return typeof t.__syncModuleProgram__ == "string"; } -function ac(t, e) { +function oc(t, e) { const { __fixedExportMap__: r, __liveExportMap__: n } = t; Se(r) || ut`Property '__fixedExportMap__' of a precompiled module source must be an object, got ${K( r @@ -4294,44 +4306,44 @@ function ac(t, e) { n )}, for module ${K(e)}`; } -function ic(t) { +function sc(t) { return typeof t.execute == "function"; } -function cc(t, e) { +function ac(t, e) { const { exports: r } = t; - Et(r) || ut`Property 'exports' of a third-party module source must be an array, got ${K( + xt(r) || ut`Property 'exports' of a third-party module source must be an array, got ${K( r )}, for module ${K(e)}`; } -function lc(t, e) { +function ic(t, e) { Se(t) || ut`Module sources must be of type object, got ${K( t )}, for module ${K(e)}`; const { imports: r, exports: n, reexports: o = [] } = t; - Et(r) || ut`Property 'imports' of a module source must be an array, got ${K( + xt(r) || ut`Property 'imports' of a module source must be an array, got ${K( r - )}, for module ${K(e)}`, Et(n) || ut`Property 'exports' of a precompiled module source must be an array, got ${K( + )}, for module ${K(e)}`, xt(n) || ut`Property 'exports' of a precompiled module source must be an array, got ${K( n - )}, for module ${K(e)}`, Et(o) || ut`Property 'reexports' of a precompiled module source must be an array if present, got ${K( + )}, for module ${K(e)}`, xt(o) || ut`Property 'reexports' of a precompiled module source must be an array if present, got ${K( o )}, for module ${K(e)}`; } -const uc = (t, e, r) => { - const { compartment: n, moduleSpecifier: o, resolvedImports: a, moduleSource: i } = r, { instances: c } = j(t, n); +const cc = (t, e, r) => { + const { compartment: n, moduleSpecifier: o, resolvedImports: a, moduleSource: i } = r, { instances: c } = Z(t, n); if (Ur(c, o)) return Ge(c, o); - lc(i, o); + ic(i, o); const l = new Ce(); - let d; - if (sc(i)) - ac(i, o), d = oc( + let u; + if (nc(i)) + oc(i, o), u = rc( t, e, r, l ); - else if (ic(i)) - cc(i, o), d = nc( + else if (sc(i)) + ac(i, o), u = tc( t, i, n, @@ -4343,36 +4355,36 @@ const uc = (t, e, r) => { throw _( `importHook must provide a module source, got ${K(i)}` ); - le(c, o, d); - for (const [u, f] of de(a)) { - const m = As( + ue(c, o, u); + for (const [d, f] of fe(a)) { + const h = Ts( t, e, n, f ); - le(l, u, m); + ue(l, d, h); } - return d; -}, Ut = new Ue(), Oe = new Ue(), Dn = function(e = {}, r = {}, n = {}) { + return u; +}, Ut = new Ue(), Oe = new Ue(), Mn = function(e = {}, r = {}, n = {}) { throw _( "Compartment.prototype.constructor is not a valid constructor." ); -}, fo = (t, e) => { - const { execute: r, exportsProxy: n } = As( +}, lo = (t, e) => { + const { execute: r, exportsProxy: n } = Ts( Oe, Ut, t, e ); return r(), n; -}, Un = { - constructor: Dn, +}, Ln = { + constructor: Mn, get globalThis() { - return j(Oe, this).globalObject; + return Z(Oe, this).globalObject; }, get name() { - return j(Oe, this).name; + return Z(Oe, this).name; }, /** * @param {string} source is a JavaScript program grammar construction. @@ -4385,28 +4397,28 @@ const uc = (t, e, r) => { * @param {boolean} [options.__rejectSomeDirectEvalExpressions__] */ evaluate(t, e = {}) { - const r = j(Oe, this); - return Ts(r, t, e); + const r = Z(Oe, this); + return Ps(r, t, e); }, module(t) { if (typeof t != "string") throw _("first argument of module() must be a string"); - const { exportsProxy: e } = Fn( + const { exportsProxy: e } = On( this, - j(Oe, this), + Z(Oe, this), Ut, t ); return e; }, async import(t) { - const { noNamespaceBox: e } = j(Oe, this); + const { noNamespaceBox: e } = Z(Oe, this); if (typeof t != "string") throw _("first argument of import() must be a string"); - return Uo( - uo(Oe, Ut, this, t), + return Do( + co(Oe, Ut, this, t), () => { - const r = fo( + const r = lo( /** @type {Compartment} */ this, t @@ -4418,19 +4430,19 @@ const uc = (t, e, r) => { async load(t) { if (typeof t != "string") throw _("first argument of load() must be a string"); - return uo(Oe, Ut, this, t); + return co(Oe, Ut, this, t); }, importNow(t) { if (typeof t != "string") throw _("first argument of importNow() must be a string"); - return ec(Oe, Ut, this, t), fo( + return Xi(Oe, Ut, this, t), lo( /** @type {Compartment} */ this, t ); } }; -Z(Un, { +z(Ln, { [Xe]: { value: "Compartment", writable: !1, @@ -4438,10 +4450,10 @@ Z(Un, { configurable: !0 } }); -Z(Dn, { - prototype: { value: Un } +z(Mn, { + prototype: { value: Ln } }); -const dc = (...t) => { +const lc = (...t) => { if (t.length === 0) return {}; if (t.length === 1 && typeof t[0] == "object" && t[0] !== null && "__options__" in t[0]) { @@ -4462,11 +4474,11 @@ const dc = (...t) => { ), n = {} ] = t; - return Jn( + return qn( n.modules, void 0, "Compartment constructor must receive either a module map argument or modules option, not both" - ), Jn( + ), qn( n.globals, void 0, "Compartment constructor must receive either globals argument or option, not both" @@ -4476,7 +4488,7 @@ const dc = (...t) => { modules: r }; } -}, fn = (t, e, r, n = void 0) => { +}, dn = (t, e, r, n = void 0) => { function o(...a) { if (new.target === void 0) throw _( @@ -4486,104 +4498,104 @@ const dc = (...t) => { name: i = "", transforms: c = [], __shimTransforms__: l = [], - globals: d = {}, - modules: u = {}, + globals: u = {}, + modules: d = {}, resolveHook: f, - importHook: m, + importHook: h, importNowHook: p, - moduleMapHook: h, + moduleMapHook: m, importMetaHook: b, - __noNamespaceBox__: E = !1 - } = dc(...a), S = [...c, ...l], C = { __proto__: null, ...d }, x = { __proto__: null, ...u }, M = new Ce(), D = new Ce(), B = new Ce(), L = {}; - li(L), cs(L); - const { safeEvaluate: xe } = Rn({ - globalObject: L, - globalTransforms: S, + __noNamespaceBox__: S = !1 + } = lc(...a), x = [...c, ...l], I = { __proto__: null, ...u }, E = { __proto__: null, ...d }, A = new Ce(), N = new Ce(), D = new Ce(), M = {}; + ci(M), is(M); + const { safeEvaluate: J } = Cn({ + globalObject: M, + globalTransforms: x, sloppyGlobalsMode: !1 }); - ls(L, { + cs(M, { intrinsics: e, - newGlobalPropertyNames: rs, + newGlobalPropertyNames: ts, makeCompartmentConstructor: t, parentCompartment: this, markVirtualizedNativeFunction: r - }), dn( - L, - xe, + }), un( + M, + J, r - ), Or(L, C), ue(Oe, this, { + ), Or(M, I), de(Oe, this, { name: `${i}`, - globalTransforms: S, - globalObject: L, - safeEvaluate: xe, + globalTransforms: x, + globalObject: M, + safeEvaluate: J, resolveHook: f, - importHook: m, + importHook: h, importNowHook: p, - moduleMap: x, - moduleMapHook: h, + moduleMap: E, + moduleMapHook: m, importMetaHook: b, - moduleRecords: M, + moduleRecords: A, __shimTransforms__: l, - deferredExports: B, - instances: D, + deferredExports: D, + instances: N, parentCompartment: n, - noNamespaceBox: E + noNamespaceBox: S }); } - return o.prototype = Un, o; + return o.prototype = Ln, o; }; function rn(t) { return G(t).constructor; } -function fc() { +function uc() { return arguments; } -const pc = () => { - const t = we.prototype.constructor, e = X(fc(), "callee"), r = e && e.get, n = va(new ge()), o = G(n), a = Lr[Po] && ga(/./), i = a && G(a), c = da([]), l = G(c), d = G(Hs), u = ma(new Ce()), f = G(u), m = ha(new Rt()), p = G(m), h = G(l); +const dc = () => { + const t = xe.prototype.constructor, e = Q(uc(), "callee"), r = e && e.get, n = _a(new ye()), o = G(n), a = Lr[ko] && ma(/./), i = a && G(a), c = ua([]), l = G(c), u = G(Vs), d = pa(new Ce()), f = G(d), h = ha(new Nt()), p = G(h), m = G(l); function* b() { } - const E = rn(b), S = E.prototype; - async function* C() { + const S = rn(b), x = S.prototype; + async function* I() { } - const x = rn( - C - ), M = x.prototype, D = M.prototype, B = G(D); - async function L() { + const E = rn( + I + ), A = E.prototype, N = A.prototype, D = G(N); + async function M() { } - const xe = rn(L), ye = { + const J = rn(M), _e = { "%InertFunction%": t, "%ArrayIteratorPrototype%": l, - "%InertAsyncFunction%": xe, - "%AsyncGenerator%": M, - "%InertAsyncGeneratorFunction%": x, - "%AsyncGeneratorPrototype%": D, - "%AsyncIteratorPrototype%": B, - "%Generator%": S, - "%InertGeneratorFunction%": E, - "%IteratorPrototype%": h, + "%InertAsyncFunction%": J, + "%AsyncGenerator%": A, + "%InertAsyncGeneratorFunction%": E, + "%AsyncGeneratorPrototype%": N, + "%AsyncIteratorPrototype%": D, + "%Generator%": x, + "%InertGeneratorFunction%": S, + "%IteratorPrototype%": m, "%MapIteratorPrototype%": f, "%RegExpStringIteratorPrototype%": i, "%SetIteratorPrototype%": p, "%StringIteratorPrototype%": o, "%ThrowTypeError%": r, - "%TypedArray%": d, - "%InertCompartment%": Dn + "%TypedArray%": u, + "%InertCompartment%": Mn }; - return P.Iterator && (ye["%IteratorHelperPrototype%"] = G( + return P.Iterator && (_e["%IteratorHelperPrototype%"] = G( // eslint-disable-next-line @endo/no-polymorphic-call P.Iterator.from([]).take(0) - ), ye["%WrapForValidIteratorPrototype%"] = G( + ), _e["%WrapForValidIteratorPrototype%"] = G( // eslint-disable-next-line @endo/no-polymorphic-call P.Iterator.from({ next() { } }) - )), P.AsyncIterator && (ye["%AsyncIteratorHelperPrototype%"] = G( + )), P.AsyncIterator && (_e["%AsyncIteratorHelperPrototype%"] = G( // eslint-disable-next-line @endo/no-polymorphic-call P.AsyncIterator.from([]).take(0) - ), ye["%WrapForValidAsyncIteratorPrototype%"] = G( + ), _e["%WrapForValidAsyncIteratorPrototype%"] = G( // eslint-disable-next-line @endo/no-polymorphic-call P.AsyncIterator.from({ next() { } }) - )), ye; + )), _e; }, Is = (t, e) => { if (e !== "safe" && e !== "unsafe") throw _(`unrecognized fakeHardenOption ${e}`); @@ -4593,70 +4605,70 @@ const pc = () => { return r.isFake = !0, y(r); }; y(Is); -const mc = () => { - const t = St, e = t.prototype, r = Sa(St, void 0); - Z(e, { +const fc = () => { + const t = wt, e = t.prototype, r = wa(wt, void 0); + z(e, { constructor: { value: r // leave other `constructor` attributes as is } }); - const n = de( + const n = fe( je(t) - ), o = ht( - ie(n, ([a, i]) => [ + ), o = mt( + ce(n, ([a, i]) => [ a, { ...i, configurable: !0 } ]) ); - return Z(r, o), { "%SharedSymbol%": r }; -}, hc = (t) => { + return z(r, o), { "%SharedSymbol%": r }; +}, pc = (t) => { try { return t(), !1; } catch { return !0; } -}, po = (t, e, r) => { +}, uo = (t, e, r) => { if (t === void 0) return !1; - const n = X(t, e); + const n = Q(t, e); if (!n || "value" in n) return !1; const { get: o, set: a } = n; - if (typeof o != "function" || typeof a != "function" || o() !== r || se(o, t, []) !== r) + if (typeof o != "function" || typeof a != "function" || o() !== r || ae(o, t, []) !== r) return !1; const i = "Seems to be a setter", c = { __proto__: null }; - if (se(a, c, [i]), c[e] !== i) + if (ae(a, c, [i]), c[e] !== i) return !1; const l = { __proto__: t }; - return se(a, l, [i]), l[e] !== i || !hc(() => se(a, t, [r])) || "originalValue" in o || n.configurable === !1 ? !1 : (F(t, e, { + return ae(a, l, [i]), l[e] !== i || !pc(() => ae(a, t, [r])) || "originalValue" in o || n.configurable === !1 ? !1 : (U(t, e, { value: r, writable: !0, enumerable: n.enumerable, configurable: !0 }), !0); -}, gc = (t) => { - po( +}, hc = (t) => { + uo( t["%IteratorPrototype%"], "constructor", t.Iterator - ), po( + ), uo( t["%IteratorPrototype%"], Xe, "Iterator" ); -}, { Fail: mo, details: ho, quote: go } = Y; -let pr, mr; -const yc = Ba(), _c = () => { +}, { Fail: fo, details: po, quote: ho } = Y; +let pr, hr; +const mc = za(), gc = () => { let t = !1; try { - t = we( + t = xe( "eval", "SES_changed", ` eval("SES_changed = true"); return SES_changed; ` - )(jo, !1), t || delete P.SES_changed; + )(Uo, !1), t || delete P.SES_changed; } catch { t = !0; } @@ -4664,46 +4676,46 @@ const yc = Ba(), _c = () => { throw _( "SES cannot initialize unless 'eval' is the original intrinsic 'eval', suitable for direct-eval (dynamically scoped eval) (SES_DIRECT_EVAL)" ); -}, Cs = (t = {}) => { +}, As = (t = {}) => { const { - errorTaming: e = pe("LOCKDOWN_ERROR_TAMING", "safe"), + errorTaming: e = he("LOCKDOWN_ERROR_TAMING", "safe"), errorTrapping: r = ( /** @type {"platform" | "none" | "report" | "abort" | "exit" | undefined} */ - pe("LOCKDOWN_ERROR_TRAPPING", "platform") + he("LOCKDOWN_ERROR_TRAPPING", "platform") ), unhandledRejectionTrapping: n = ( /** @type {"none" | "report" | undefined} */ - pe("LOCKDOWN_UNHANDLED_REJECTION_TRAPPING", "report") + he("LOCKDOWN_UNHANDLED_REJECTION_TRAPPING", "report") ), - regExpTaming: o = pe("LOCKDOWN_REGEXP_TAMING", "safe"), - localeTaming: a = pe("LOCKDOWN_LOCALE_TAMING", "safe"), + regExpTaming: o = he("LOCKDOWN_REGEXP_TAMING", "safe"), + localeTaming: a = he("LOCKDOWN_LOCALE_TAMING", "safe"), consoleTaming: i = ( /** @type {'unsafe' | 'safe' | undefined} */ - pe("LOCKDOWN_CONSOLE_TAMING", "safe") + he("LOCKDOWN_CONSOLE_TAMING", "safe") ), - overrideTaming: c = pe("LOCKDOWN_OVERRIDE_TAMING", "moderate"), - stackFiltering: l = pe("LOCKDOWN_STACK_FILTERING", "concise"), - domainTaming: d = pe("LOCKDOWN_DOMAIN_TAMING", "safe"), - evalTaming: u = pe("LOCKDOWN_EVAL_TAMING", "safeEval"), + overrideTaming: c = he("LOCKDOWN_OVERRIDE_TAMING", "moderate"), + stackFiltering: l = he("LOCKDOWN_STACK_FILTERING", "concise"), + domainTaming: u = he("LOCKDOWN_DOMAIN_TAMING", "safe"), + evalTaming: d = he("LOCKDOWN_EVAL_TAMING", "safeEval"), overrideDebug: f = Qe( - An(pe("LOCKDOWN_OVERRIDE_DEBUG", ""), ","), + kn(he("LOCKDOWN_OVERRIDE_DEBUG", ""), ","), /** @param {string} debugName */ (We) => We !== "" ), - __hardenTaming__: m = pe("LOCKDOWN_HARDEN_TAMING", "safe"), + __hardenTaming__: h = he("LOCKDOWN_HARDEN_TAMING", "safe"), dateTaming: p = "safe", // deprecated - mathTaming: h = "safe", + mathTaming: m = "safe", // deprecated ...b } = t; - u === "unsafeEval" || u === "safeEval" || u === "noEval" || mo`lockdown(): non supported option evalTaming: ${go(u)}`; - const E = Be(b); - if (E.length === 0 || mo`lockdown(): non supported option ${go(E)}`, pr === void 0 || // eslint-disable-next-line @endo/no-polymorphic-call + d === "unsafeEval" || d === "safeEval" || d === "noEval" || fo`lockdown(): non supported option evalTaming: ${ho(d)}`; + const S = Be(b); + if (S.length === 0 || fo`lockdown(): non supported option ${ho(S)}`, pr === void 0 || // eslint-disable-next-line @endo/no-polymorphic-call Y.fail( - ho`Already locked down at ${pr} (SES_ALREADY_LOCKED_DOWN)`, + po`Already locked down at ${pr} (SES_ALREADY_LOCKED_DOWN)`, _ - ), pr = _("Prior lockdown (SES_ALREADY_LOCKED_DOWN)"), pr.stack, _c(), P.Function.prototype.constructor !== P.Function && // @ts-ignore harden is absent on globalThis type def. + ), pr = _("Prior lockdown (SES_ALREADY_LOCKED_DOWN)"), pr.stack, gc(), P.Function.prototype.constructor !== P.Function && // @ts-ignore harden is absent on globalThis type def. typeof P.harden == "function" && // @ts-ignore lockdown is absent on globalThis type def. typeof P.lockdown == "function" && P.Date.prototype.constructor !== P.Date && typeof P.Date.now == "function" && // @ts-ignore does not recognize that Date constructor is a special // Function. @@ -4712,55 +4724,55 @@ const yc = Ba(), _c = () => { throw _( "Already locked down but not by this SES instance (SES_MULTIPLE_INSTANCES)" ); - Ei(d); - const C = Es(), { addIntrinsics: x, completePrototypes: M, finalIntrinsics: D } = ss(), B = Is(yc, m); - x({ harden: B }), x(Ya()), x(Ja(p)), x(Gi(e, l)), x(Xa(h)), x(Qa(o)), x(mc()), x(pc()), M(); - const L = D(), xe = { __proto__: null }; - typeof P.Buffer == "function" && (xe.Buffer = P.Buffer); - let ye; - e === "safe" && (ye = L["%InitialGetStackString%"]); - const He = Ai( + xi(u); + const I = xs(), { addIntrinsics: E, completePrototypes: A, finalIntrinsics: N } = os(), D = Is(mc, h); + E({ harden: D }), E(Ka()), E(Ya(p)), E(zi(e, l)), E(Ja(m)), E(Xa(o)), E(fc()), E(dc()), A(); + const M = N(), J = { __proto__: null }; + typeof P.Buffer == "function" && (J.Buffer = P.Buffer); + let _e; + e === "safe" && (_e = M["%InitialGetStackString%"]); + const He = Pi( i, r, n, - ye + _e ); if (P.console = /** @type {Console} */ He.console, typeof /** @type {any} */ - He.console._times == "object" && (xe.SafeMap = G( + He.console._times == "object" && (J.SafeMap = G( // eslint-disable-next-line no-underscore-dangle /** @type {any} */ He.console._times - )), (e === "unsafe" || e === "unsafe-debug") && P.assert === Y && (P.assert = Gr(void 0, !0)), ai(L, a), gc(L), Ka(L, C), cs(P), ls(P, { - intrinsics: L, - newGlobalPropertyNames: Xn, - makeCompartmentConstructor: fn, - markVirtualizedNativeFunction: C - }), u === "noEval") - dn( + )), (e === "unsafe" || e === "unsafe-debug") && P.assert === Y && (P.assert = Gr(void 0, !0)), si(M, a), hc(M), qa(M, I), is(P), cs(P, { + intrinsics: M, + newGlobalPropertyNames: Kn, + makeCompartmentConstructor: dn, + markVirtualizedNativeFunction: I + }), d === "noEval") + un( P, - xa, - C + Sa, + I ); - else if (u === "safeEval") { - const { safeEvaluate: We } = Rn({ globalObject: P }); - dn( + else if (d === "safeEval") { + const { safeEvaluate: We } = Cn({ globalObject: P }); + un( P, We, - C + I ); } return () => { - mr === void 0 || // eslint-disable-next-line @endo/no-polymorphic-call + hr === void 0 || // eslint-disable-next-line @endo/no-polymorphic-call Y.fail( - ho`Already locked down at ${mr} (SES_ALREADY_LOCKED_DOWN)`, + po`Already locked down at ${hr} (SES_ALREADY_LOCKED_DOWN)`, _ - ), mr = _( + ), hr = _( "Prior lockdown (SES_ALREADY_LOCKED_DOWN)" - ), mr.stack, ri(L, c, f); + ), hr.stack, ti(M, c, f); const We = { - intrinsics: L, - hostIntrinsics: xe, + intrinsics: M, + hostIntrinsics: J, globals: { // Harden evaluators Function: P.Function, @@ -4771,47 +4783,47 @@ const yc = Ba(), _c = () => { Symbol: P.Symbol } }; - for (const lr of At(Xn)) + for (const lr of It(Kn)) We.globals[lr] = P[lr]; - return B(We), B; + return D(We), D; }; }; P.lockdown = (t) => { - const e = Cs(t); + const e = As(t); P.harden = e(); }; P.repairIntrinsics = (t) => { - const e = Cs(t); + const e = As(t); P.hardenIntrinsics = () => { P.harden = e(); }; }; -const vc = Es(); -P.Compartment = fn( - fn, - qa(P), - vc +const yc = xs(); +P.Compartment = dn( + dn, + Wa(P), + yc ); P.assert = Y; -const bc = ks(Er), wc = ta( +const _c = Es(Sr), vc = ea( "MAKE_CAUSAL_CONSOLE_FROM_LOGGER_KEY_FOR_SES_AVA" ); -P[wc] = bc; -const Sc = (t, e) => { +P[vc] = _c; +const bc = (t, e) => { let r = { x: 0, y: 0 }, n = { x: 0, y: 0 }, o = { x: 0, y: 0 }; const a = (l) => { - const { clientX: d, clientY: u } = l, f = d - o.x + n.x, m = u - o.y + n.y; - r = { x: f, y: m }, t.style.transform = `translate(${f}px, ${m}px)`, e == null || e(); + const { clientX: u, clientY: d } = l, f = u - o.x + n.x, h = d - o.y + n.y; + r = { x: f, y: h }, t.style.transform = `translate(${f}px, ${h}px)`, e == null || e(); }, i = () => { document.removeEventListener("mousemove", a), document.removeEventListener("mouseup", i); }, c = (l) => { o = { x: l.clientX, y: l.clientY }, n = { x: r.x, y: r.y }, document.addEventListener("mousemove", a), document.addEventListener("mouseup", i); }; return t.addEventListener("mousedown", c), i; -}, Ec = ":host{--spacing-4: .25rem;--spacing-8: calc(var(--spacing-4) * 2);--spacing-12: calc(var(--spacing-4) * 3);--spacing-16: calc(var(--spacing-4) * 4);--spacing-20: calc(var(--spacing-4) * 5);--spacing-24: calc(var(--spacing-4) * 6);--spacing-28: calc(var(--spacing-4) * 7);--spacing-32: calc(var(--spacing-4) * 8);--spacing-36: calc(var(--spacing-4) * 9);--spacing-40: calc(var(--spacing-4) * 10);--font-weight-regular: 400;--font-weight-bold: 500;--font-line-height-s: 1.2;--font-line-height-m: 1.4;--font-line-height-l: 1.5;--font-size-s: 12px;--font-size-m: 14px;--font-size-l: 16px}[data-theme]{background-color:var(--color-background-primary);color:var(--color-foreground-secondary)}.wrapper{box-sizing:border-box;display:flex;flex-direction:column;position:fixed;inset-block-start:var(--modal-block-start);inset-inline-end:var(--modal-inline-end);z-index:1000;padding:25px;border-radius:15px;border:2px solid var(--color-background-quaternary);box-shadow:0 0 10px #0000004d}.header{align-items:center;display:flex;justify-content:space-between;border-block-end:2px solid var(--color-background-quaternary);padding-block-end:var(--spacing-4)}button{background:transparent;border:0;cursor:pointer;padding:0}h1{font-size:var(--font-size-s);font-weight:var(--font-weight-bold);margin:0;margin-inline-end:var(--spacing-4);-webkit-user-select:none;user-select:none}iframe{border:none;inline-size:100%;block-size:100%}", xc = ` +}, wc = ":host{--spacing-4: .25rem;--spacing-8: calc(var(--spacing-4) * 2);--spacing-12: calc(var(--spacing-4) * 3);--spacing-16: calc(var(--spacing-4) * 4);--spacing-20: calc(var(--spacing-4) * 5);--spacing-24: calc(var(--spacing-4) * 6);--spacing-28: calc(var(--spacing-4) * 7);--spacing-32: calc(var(--spacing-4) * 8);--spacing-36: calc(var(--spacing-4) * 9);--spacing-40: calc(var(--spacing-4) * 10);--font-weight-regular: 400;--font-weight-bold: 500;--font-line-height-s: 1.2;--font-line-height-m: 1.4;--font-line-height-l: 1.5;--font-size-s: 12px;--font-size-m: 14px;--font-size-l: 16px}[data-theme]{background-color:var(--color-background-primary);color:var(--color-foreground-secondary)}.wrapper{box-sizing:border-box;display:flex;flex-direction:column;position:fixed;inset-block-start:var(--modal-block-start);inset-inline-end:var(--modal-inline-end);z-index:1000;padding:25px;border-radius:15px;border:2px solid var(--color-background-quaternary);box-shadow:0 0 10px #0000004d}.header{align-items:center;display:flex;justify-content:space-between;border-block-end:2px solid var(--color-background-quaternary);padding-block-end:var(--spacing-4)}button{background:transparent;border:0;cursor:pointer;padding:0}h1{font-size:var(--font-size-s);font-weight:var(--font-weight-bold);margin:0;margin-inline-end:var(--spacing-4);-webkit-user-select:none;user-select:none}iframe{border:none;inline-size:100%;block-size:100%}", xc = ` `; var me, nr; -class kc extends HTMLElement { +class Sc extends HTMLElement { constructor() { super(); Wr(this, me, null); @@ -4819,11 +4831,11 @@ class kc extends HTMLElement { this.attachShadow({ mode: "open" }); } setTheme(r) { - Ae(this, me) && Ae(this, me).setAttribute("data-theme", r); + Ie(this, me) && Ie(this, me).setAttribute("data-theme", r); } disconnectedCallback() { var r; - (r = Ae(this, nr)) == null || r.call(this); + (r = Ie(this, nr)) == null || r.call(this); } calculateZIndex() { const r = document.querySelectorAll("plugin-modal"), n = Array.from(r).filter((a) => a !== this).map((a) => Number(a.style.zIndex)), o = Math.max(...n, 0); @@ -4835,7 +4847,7 @@ class kc extends HTMLElement { throw new Error("title and iframe-src attributes are required"); if (!this.shadowRoot) throw new Error("Error creating shadow root"); - qr(this, me, document.createElement("div")), Ae(this, me).classList.add("wrapper"), Ae(this, me).style.inlineSize = `${o}px`, Ae(this, me).style.blockSize = `${a}px`, qr(this, nr, Sc(Ae(this, me), () => { + qr(this, me, document.createElement("div")), Ie(this, me).classList.add("wrapper"), Ie(this, me).style.inlineSize = `${o}px`, Ie(this, me).style.blockSize = `${a}px`, qr(this, nr, bc(Ie(this, me), () => { this.calculateZIndex(); })); const i = document.createElement("div"); @@ -4851,15 +4863,15 @@ class kc extends HTMLElement { }) ); }), i.appendChild(l); - const d = document.createElement("iframe"); - d.src = n, d.allow = "", d.sandbox.add( + const u = document.createElement("iframe"); + u.src = n, u.allow = "", u.sandbox.add( "allow-scripts", "allow-forms", "allow-modals", "allow-popups", "allow-popups-to-escape-sandbox", "allow-storage-access-by-user-activation" - ), d.addEventListener("load", () => { + ), u.addEventListener("load", () => { var f; (f = this.shadowRoot) == null || f.dispatchEvent( new CustomEvent("load", { @@ -4868,15 +4880,15 @@ class kc extends HTMLElement { }) ); }), this.addEventListener("message", (f) => { - d.contentWindow && d.contentWindow.postMessage(f.detail, "*"); - }), this.shadowRoot.appendChild(Ae(this, me)), Ae(this, me).appendChild(i), Ae(this, me).appendChild(d); - const u = document.createElement("style"); - u.textContent = Ec, this.shadowRoot.appendChild(u), this.calculateZIndex(); + u.contentWindow && u.contentWindow.postMessage(f.detail, "*"); + }), this.shadowRoot.appendChild(Ie(this, me)), Ie(this, me).appendChild(i), Ie(this, me).appendChild(u); + const d = document.createElement("style"); + d.textContent = wc, this.shadowRoot.appendChild(d), this.calculateZIndex(); } } me = new WeakMap(), nr = new WeakMap(); -customElements.define("plugin-modal", kc); -var O; +customElements.define("plugin-modal", Sc); +var F; (function(t) { t.assertEqual = (o) => o; function e(o) { @@ -4911,16 +4923,16 @@ var O; return o.map((i) => typeof i == "string" ? `'${i}'` : i).join(a); } t.joinValues = n, t.jsonStringifyReplacer = (o, a) => typeof a == "bigint" ? a.toString() : a; -})(O || (O = {})); -var pn; +})(F || (F = {})); +var fn; (function(t) { t.mergeShapes = (e, r) => ({ ...e, ...r // second overwrites first }); -})(pn || (pn = {})); -const w = O.arrayToEnum([ +})(fn || (fn = {})); +const w = F.arrayToEnum([ "string", "nan", "number", @@ -4962,7 +4974,7 @@ const w = O.arrayToEnum([ default: return w.unknown; } -}, g = O.arrayToEnum([ +}, g = F.arrayToEnum([ "invalid_type", "invalid_literal", "custom", @@ -4979,8 +4991,8 @@ const w = O.arrayToEnum([ "invalid_intersection_types", "not_multiple_of", "not_finite" -]), Pc = (t) => JSON.stringify(t, null, 2).replace(/"([^"]+)":/g, "$1:"); -class he extends Error { +]), Ec = (t) => JSON.stringify(t, null, 2).replace(/"([^"]+)":/g, "$1:"); +class ge extends Error { constructor(e) { super(), this.issues = [], this.addIssue = (n) => { this.issues = [...this.issues, n]; @@ -5009,22 +5021,22 @@ class he extends Error { else { let c = n, l = 0; for (; l < i.path.length; ) { - const d = i.path[l]; - l === i.path.length - 1 ? (c[d] = c[d] || { _errors: [] }, c[d]._errors.push(r(i))) : c[d] = c[d] || { _errors: [] }, c = c[d], l++; + const u = i.path[l]; + l === i.path.length - 1 ? (c[u] = c[u] || { _errors: [] }, c[u]._errors.push(r(i))) : c[u] = c[u] || { _errors: [] }, c = c[u], l++; } } }; return o(this), n; } static assert(e) { - if (!(e instanceof he)) + if (!(e instanceof ge)) throw new Error(`Not a ZodError: ${e}`); } toString() { return this.message; } get message() { - return JSON.stringify(this.issues, O.jsonStringifyReplacer, 2); + return JSON.stringify(this.issues, F.jsonStringifyReplacer, 2); } get isEmpty() { return this.issues.length === 0; @@ -5039,7 +5051,7 @@ class he extends Error { return this.flatten(); } } -he.create = (t) => new he(t); +ge.create = (t) => new ge(t); const Ct = (t, e) => { let r; switch (t.code) { @@ -5047,19 +5059,19 @@ const Ct = (t, e) => { t.received === w.undefined ? r = "Required" : r = `Expected ${t.expected}, received ${t.received}`; break; case g.invalid_literal: - r = `Invalid literal value, expected ${JSON.stringify(t.expected, O.jsonStringifyReplacer)}`; + r = `Invalid literal value, expected ${JSON.stringify(t.expected, F.jsonStringifyReplacer)}`; break; case g.unrecognized_keys: - r = `Unrecognized key(s) in object: ${O.joinValues(t.keys, ", ")}`; + r = `Unrecognized key(s) in object: ${F.joinValues(t.keys, ", ")}`; break; case g.invalid_union: r = "Invalid input"; break; case g.invalid_union_discriminator: - r = `Invalid discriminator value. Expected ${O.joinValues(t.options)}`; + r = `Invalid discriminator value. Expected ${F.joinValues(t.options)}`; break; case g.invalid_enum_value: - r = `Invalid enum value. Expected ${O.joinValues(t.options)}, received '${t.received}'`; + r = `Invalid enum value. Expected ${F.joinValues(t.options)}, received '${t.received}'`; break; case g.invalid_arguments: r = "Invalid function arguments"; @@ -5071,7 +5083,7 @@ const Ct = (t, e) => { r = "Invalid date"; break; case g.invalid_string: - typeof t.validation == "object" ? "includes" in t.validation ? (r = `Invalid input: must include "${t.validation.includes}"`, typeof t.validation.position == "number" && (r = `${r} at one or more positions greater than or equal to ${t.validation.position}`)) : "startsWith" in t.validation ? r = `Invalid input: must start with "${t.validation.startsWith}"` : "endsWith" in t.validation ? r = `Invalid input: must end with "${t.validation.endsWith}"` : O.assertNever(t.validation) : t.validation !== "regex" ? r = `Invalid ${t.validation}` : r = "Invalid"; + typeof t.validation == "object" ? "includes" in t.validation ? (r = `Invalid input: must include "${t.validation.includes}"`, typeof t.validation.position == "number" && (r = `${r} at one or more positions greater than or equal to ${t.validation.position}`)) : "startsWith" in t.validation ? r = `Invalid input: must start with "${t.validation.startsWith}"` : "endsWith" in t.validation ? r = `Invalid input: must end with "${t.validation.endsWith}"` : F.assertNever(t.validation) : t.validation !== "regex" ? r = `Invalid ${t.validation}` : r = "Invalid"; break; case g.too_small: t.type === "array" ? r = `Array must contain ${t.exact ? "exactly" : t.inclusive ? "at least" : "more than"} ${t.minimum} element(s)` : t.type === "string" ? r = `String must contain ${t.exact ? "exactly" : t.inclusive ? "at least" : "over"} ${t.minimum} character(s)` : t.type === "number" ? r = `Number must be ${t.exact ? "exactly equal to " : t.inclusive ? "greater than or equal to " : "greater than "}${t.minimum}` : t.type === "date" ? r = `Date must be ${t.exact ? "exactly equal to " : t.inclusive ? "greater than or equal to " : "greater than "}${new Date(Number(t.minimum))}` : r = "Invalid input"; @@ -5092,16 +5104,16 @@ const Ct = (t, e) => { r = "Number must be finite"; break; default: - r = e.defaultError, O.assertNever(t); + r = e.defaultError, F.assertNever(t); } return { message: r }; }; -let $s = Ct; -function Tc(t) { - $s = t; +let Cs = Ct; +function kc(t) { + Cs = t; } function Pr() { - return $s; + return Cs; } const Tr = (t) => { const { data: e, path: r, errorMaps: n, issueData: o } = t, a = [...r, ...o.path || []], i = { @@ -5115,15 +5127,15 @@ const Tr = (t) => { message: o.message }; let c = ""; - const l = n.filter((d) => !!d).slice().reverse(); - for (const d of l) - c = d(i, { data: e, defaultError: c }).message; + const l = n.filter((u) => !!u).slice().reverse(); + for (const u of l) + c = u(i, { data: e, defaultError: c }).message; return { ...o, path: a, message: c }; -}, Ac = []; +}, Pc = []; function v(t, e) { const r = Pr(), n = Tr({ issueData: e, @@ -5139,7 +5151,7 @@ function v(t, e) { }); t.common.issues.push(n); } -class ee { +class te { constructor() { this.value = "valid"; } @@ -5153,7 +5165,7 @@ class ee { const n = []; for (const o of r) { if (o.status === "aborted") - return I; + return $; o.status === "dirty" && e.dirty(), n.push(o.value); } return { status: e.value, value: n }; @@ -5167,27 +5179,27 @@ class ee { value: i }); } - return ee.mergeObjectSync(e, n); + return te.mergeObjectSync(e, n); } static mergeObjectSync(e, r) { const n = {}; for (const o of r) { const { key: a, value: i } = o; if (a.status === "aborted" || i.status === "aborted") - return I; + return $; a.status === "dirty" && e.dirty(), i.status === "dirty" && e.dirty(), a.value !== "__proto__" && (typeof i.value < "u" || o.alwaysSet) && (n[a.value] = i.value); } return { status: e.value, value: n }; } } -const I = Object.freeze({ +const $ = Object.freeze({ status: "aborted" -}), bt = (t) => ({ status: "dirty", value: t }), ce = (t) => ({ status: "valid", value: t }), mn = (t) => t.status === "aborted", hn = (t) => t.status === "dirty", Bt = (t) => t.status === "valid", Gt = (t) => typeof Promise < "u" && t instanceof Promise; -function Ar(t, e, r, n) { +}), bt = (t) => ({ status: "dirty", value: t }), le = (t) => ({ status: "valid", value: t }), pn = (t) => t.status === "aborted", hn = (t) => t.status === "dirty", Bt = (t) => t.status === "valid", Gt = (t) => typeof Promise < "u" && t instanceof Promise; +function Ir(t, e, r, n) { if (typeof e == "function" ? t !== e || !n : !e.has(t)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return e.get(t); } -function Ns(t, e, r, n, o) { +function $s(t, e, r, n, o) { if (typeof e == "function" ? t !== e || !o : !e.has(t)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return e.set(t, r), r; } @@ -5204,7 +5216,7 @@ class Fe { return this._cachedPath.length || (this._key instanceof Array ? this._cachedPath.push(...this._path, ...this._key) : this._cachedPath.push(...this._path, this._key)), this._cachedPath; } } -const yo = (t, e) => { +const mo = (t, e) => { if (Bt(e)) return { success: !0, data: e.value }; if (!t.common.issues.length) @@ -5214,24 +5226,24 @@ const yo = (t, e) => { get error() { if (this._error) return this._error; - const r = new he(t.common.issues); + const r = new ge(t.common.issues); return this._error = r, this._error; } }; }; -function $(t) { +function R(t) { if (!t) return {}; const { errorMap: e, invalid_type_error: r, required_error: n, description: o } = t; if (e && (r || n)) throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`); return e ? { errorMap: e, description: o } : { errorMap: (i, c) => { - var l, d; - const { message: u } = t; - return i.code === "invalid_enum_value" ? { message: u ?? c.defaultError } : typeof c.data > "u" ? { message: (l = u ?? n) !== null && l !== void 0 ? l : c.defaultError } : i.code !== "invalid_type" ? { message: c.defaultError } : { message: (d = u ?? r) !== null && d !== void 0 ? d : c.defaultError }; + var l, u; + const { message: d } = t; + return i.code === "invalid_enum_value" ? { message: d ?? c.defaultError } : typeof c.data > "u" ? { message: (l = d ?? n) !== null && l !== void 0 ? l : c.defaultError } : i.code !== "invalid_type" ? { message: c.defaultError } : { message: (u = d ?? r) !== null && u !== void 0 ? u : c.defaultError }; }, description: o }; } -class N { +class O { constructor(e) { this.spa = this.safeParseAsync, this._def = e, this.parse = this.parse.bind(this), this.safeParse = this.safeParse.bind(this), this.parseAsync = this.parseAsync.bind(this), this.safeParseAsync = this.safeParseAsync.bind(this), this.spa = this.spa.bind(this), this.refine = this.refine.bind(this), this.refinement = this.refinement.bind(this), this.superRefine = this.superRefine.bind(this), this.optional = this.optional.bind(this), this.nullable = this.nullable.bind(this), this.nullish = this.nullish.bind(this), this.array = this.array.bind(this), this.promise = this.promise.bind(this), this.or = this.or.bind(this), this.and = this.and.bind(this), this.transform = this.transform.bind(this), this.brand = this.brand.bind(this), this.default = this.default.bind(this), this.catch = this.catch.bind(this), this.describe = this.describe.bind(this), this.pipe = this.pipe.bind(this), this.readonly = this.readonly.bind(this), this.isNullable = this.isNullable.bind(this), this.isOptional = this.isOptional.bind(this); } @@ -5253,7 +5265,7 @@ class N { } _processInputParams(e) { return { - status: new ee(), + status: new te(), ctx: { common: e.parent.common, data: e.data, @@ -5294,7 +5306,7 @@ class N { data: e, parsedType: Ye(e) }, a = this._parseSync({ data: e, path: o.path, parent: o }); - return yo(o, a); + return mo(o, a); } async parseAsync(e, r) { const n = await this.safeParseAsync(e, r); @@ -5315,7 +5327,7 @@ class N { data: e, parsedType: Ye(e) }, o = this._parse({ data: e, path: n.path, parent: n }), a = await (Gt(o) ? o : Promise.resolve(o)); - return yo(n, a); + return mo(n, a); } refine(e, r) { const n = (o) => typeof r == "string" || typeof r > "u" ? { message: r } : typeof r == "function" ? r(o) : r; @@ -5331,9 +5343,9 @@ class N { return this._refinement((n, o) => e(n) ? !0 : (o.addIssue(typeof r == "function" ? r(n, o) : r), !1)); } _refinement(e) { - return new Ne({ + return new Re({ schema: this, - typeName: A.ZodEffects, + typeName: C.ZodEffects, effect: { type: "refinement", refinement: e } }); } @@ -5353,7 +5365,7 @@ class N { return $e.create(this, this._def); } promise() { - return Nt.create(this, this._def); + return Rt.create(this, this._def); } or(e) { return qt.create([this, e], this._def); @@ -5362,36 +5374,36 @@ class N { return Kt.create(this, e, this._def); } transform(e) { - return new Ne({ - ...$(this._def), + return new Re({ + ...R(this._def), schema: this, - typeName: A.ZodEffects, + typeName: C.ZodEffects, effect: { type: "transform", transform: e } }); } default(e) { const r = typeof e == "function" ? e : () => e; return new er({ - ...$(this._def), + ...R(this._def), innerType: this, defaultValue: r, - typeName: A.ZodDefault + typeName: C.ZodDefault }); } brand() { - return new jn({ - typeName: A.ZodBranded, + return new Fn({ + typeName: C.ZodBranded, type: this, - ...$(this._def) + ...R(this._def) }); } catch(e) { const r = typeof e == "function" ? e : () => e; return new tr({ - ...$(this._def), + ...R(this._def), innerType: this, catchValue: r, - typeName: A.ZodCatch + typeName: C.ZodCatch }); } describe(e) { @@ -5414,25 +5426,25 @@ class N { return this.safeParse(null).success; } } -const Ic = /^c[^\s-]{8,}$/i, Cc = /^[0-9a-z]+$/, $c = /^[0-9A-HJKMNP-TV-Z]{26}$/, Nc = /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i, Rc = /^[a-z0-9_-]{21}$/i, Oc = /^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/, Mc = /^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i, Lc = "^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$"; +const Tc = /^c[^\s-]{8,}$/i, Ic = /^[0-9a-z]+$/, Ac = /^[0-9A-HJKMNP-TV-Z]{26}$/, Cc = /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i, $c = /^[a-z0-9_-]{21}$/i, Rc = /^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/, Nc = /^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i, Oc = "^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$"; let nn; -const Fc = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/, Dc = /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/, Uc = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/, Rs = "((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))", jc = new RegExp(`^${Rs}$`); -function Os(t) { +const Mc = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/, Lc = /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/, Fc = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/, Rs = "((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))", Dc = new RegExp(`^${Rs}$`); +function Ns(t) { let e = "([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d"; return t.precision ? e = `${e}\\.\\d{${t.precision}}` : t.precision == null && (e = `${e}(\\.\\d+)?`), e; } -function Zc(t) { - return new RegExp(`^${Os(t)}$`); +function Uc(t) { + return new RegExp(`^${Ns(t)}$`); } -function Ms(t) { - let e = `${Rs}T${Os(t)}`; +function Os(t) { + let e = `${Rs}T${Ns(t)}`; const r = []; return r.push(t.local ? "Z?" : "Z"), t.offset && r.push("([+-]\\d{2}:?\\d{2})"), e = `${e}(${r.join("|")})`, new RegExp(`^${e}$`); } -function zc(t, e) { - return !!((e === "v4" || !e) && Fc.test(t) || (e === "v6" || !e) && Dc.test(t)); +function jc(t, e) { + return !!((e === "v4" || !e) && Mc.test(t) || (e === "v6" || !e) && Lc.test(t)); } -class Ie extends N { +class Ae extends O { _parse(e) { if (this._def.coerce && (e.data = String(e.data)), this._getType(e) !== w.string) { const a = this._getOrReturnCtx(e); @@ -5440,9 +5452,9 @@ class Ie extends N { code: g.invalid_type, expected: w.string, received: a.parsedType - }), I; + }), $; } - const n = new ee(); + const n = new te(); let o; for (const a of this._def.checks) if (a.kind === "min") @@ -5481,43 +5493,43 @@ class Ie extends N { message: a.message }), n.dirty()); } else if (a.kind === "email") - Mc.test(e.data) || (o = this._getOrReturnCtx(e, o), v(o, { + Nc.test(e.data) || (o = this._getOrReturnCtx(e, o), v(o, { validation: "email", code: g.invalid_string, message: a.message }), n.dirty()); else if (a.kind === "emoji") - nn || (nn = new RegExp(Lc, "u")), nn.test(e.data) || (o = this._getOrReturnCtx(e, o), v(o, { + nn || (nn = new RegExp(Oc, "u")), nn.test(e.data) || (o = this._getOrReturnCtx(e, o), v(o, { validation: "emoji", code: g.invalid_string, message: a.message }), n.dirty()); else if (a.kind === "uuid") - Nc.test(e.data) || (o = this._getOrReturnCtx(e, o), v(o, { + Cc.test(e.data) || (o = this._getOrReturnCtx(e, o), v(o, { validation: "uuid", code: g.invalid_string, message: a.message }), n.dirty()); else if (a.kind === "nanoid") - Rc.test(e.data) || (o = this._getOrReturnCtx(e, o), v(o, { + $c.test(e.data) || (o = this._getOrReturnCtx(e, o), v(o, { validation: "nanoid", code: g.invalid_string, message: a.message }), n.dirty()); else if (a.kind === "cuid") - Ic.test(e.data) || (o = this._getOrReturnCtx(e, o), v(o, { + Tc.test(e.data) || (o = this._getOrReturnCtx(e, o), v(o, { validation: "cuid", code: g.invalid_string, message: a.message }), n.dirty()); else if (a.kind === "cuid2") - Cc.test(e.data) || (o = this._getOrReturnCtx(e, o), v(o, { + Ic.test(e.data) || (o = this._getOrReturnCtx(e, o), v(o, { validation: "cuid2", code: g.invalid_string, message: a.message }), n.dirty()); else if (a.kind === "ulid") - $c.test(e.data) || (o = this._getOrReturnCtx(e, o), v(o, { + Ac.test(e.data) || (o = this._getOrReturnCtx(e, o), v(o, { validation: "ulid", code: g.invalid_string, message: a.message @@ -5548,31 +5560,31 @@ class Ie extends N { code: g.invalid_string, validation: { endsWith: a.value }, message: a.message - }), n.dirty()) : a.kind === "datetime" ? Ms(a).test(e.data) || (o = this._getOrReturnCtx(e, o), v(o, { + }), n.dirty()) : a.kind === "datetime" ? Os(a).test(e.data) || (o = this._getOrReturnCtx(e, o), v(o, { code: g.invalid_string, validation: "datetime", message: a.message - }), n.dirty()) : a.kind === "date" ? jc.test(e.data) || (o = this._getOrReturnCtx(e, o), v(o, { + }), n.dirty()) : a.kind === "date" ? Dc.test(e.data) || (o = this._getOrReturnCtx(e, o), v(o, { code: g.invalid_string, validation: "date", message: a.message - }), n.dirty()) : a.kind === "time" ? Zc(a).test(e.data) || (o = this._getOrReturnCtx(e, o), v(o, { + }), n.dirty()) : a.kind === "time" ? Uc(a).test(e.data) || (o = this._getOrReturnCtx(e, o), v(o, { code: g.invalid_string, validation: "time", message: a.message - }), n.dirty()) : a.kind === "duration" ? Oc.test(e.data) || (o = this._getOrReturnCtx(e, o), v(o, { + }), n.dirty()) : a.kind === "duration" ? Rc.test(e.data) || (o = this._getOrReturnCtx(e, o), v(o, { validation: "duration", code: g.invalid_string, message: a.message - }), n.dirty()) : a.kind === "ip" ? zc(e.data, a.version) || (o = this._getOrReturnCtx(e, o), v(o, { + }), n.dirty()) : a.kind === "ip" ? jc(e.data, a.version) || (o = this._getOrReturnCtx(e, o), v(o, { validation: "ip", code: g.invalid_string, message: a.message - }), n.dirty()) : a.kind === "base64" ? Uc.test(e.data) || (o = this._getOrReturnCtx(e, o), v(o, { + }), n.dirty()) : a.kind === "base64" ? Fc.test(e.data) || (o = this._getOrReturnCtx(e, o), v(o, { validation: "base64", code: g.invalid_string, message: a.message - }), n.dirty()) : O.assertNever(a); + }), n.dirty()) : F.assertNever(a); return { status: n.value, value: e.data }; } _regex(e, r, n) { @@ -5583,7 +5595,7 @@ class Ie extends N { }); } _addCheck(e) { - return new Ie({ + return new Ae({ ...this._def, checks: [...this._def.checks, e] }); @@ -5709,19 +5721,19 @@ class Ie extends N { return this.min(1, k.errToObj(e)); } trim() { - return new Ie({ + return new Ae({ ...this._def, checks: [...this._def.checks, { kind: "trim" }] }); } toLowerCase() { - return new Ie({ + return new Ae({ ...this._def, checks: [...this._def.checks, { kind: "toLowerCase" }] }); } toUpperCase() { - return new Ie({ + return new Ae({ ...this._def, checks: [...this._def.checks, { kind: "toUpperCase" }] }); @@ -5781,20 +5793,20 @@ class Ie extends N { return e; } } -Ie.create = (t) => { +Ae.create = (t) => { var e; - return new Ie({ + return new Ae({ checks: [], - typeName: A.ZodString, + typeName: C.ZodString, coerce: (e = t == null ? void 0 : t.coerce) !== null && e !== void 0 ? e : !1, - ...$(t) + ...R(t) }); }; -function Bc(t, e) { +function Zc(t, e) { const r = (t.toString().split(".")[1] || "").length, n = (e.toString().split(".")[1] || "").length, o = r > n ? r : n, a = parseInt(t.toFixed(o).replace(".", "")), i = parseInt(e.toFixed(o).replace(".", "")); return a % i / Math.pow(10, o); } -class et extends N { +class et extends O { constructor() { super(...arguments), this.min = this.gte, this.max = this.lte, this.step = this.multipleOf; } @@ -5805,12 +5817,12 @@ class et extends N { code: g.invalid_type, expected: w.number, received: a.parsedType - }), I; + }), $; } let n; - const o = new ee(); + const o = new te(); for (const a of this._def.checks) - a.kind === "int" ? O.isInteger(e.data) || (n = this._getOrReturnCtx(e, n), v(n, { + a.kind === "int" ? F.isInteger(e.data) || (n = this._getOrReturnCtx(e, n), v(n, { code: g.invalid_type, expected: "integer", received: "float", @@ -5829,14 +5841,14 @@ class et extends N { inclusive: a.inclusive, exact: !1, message: a.message - }), o.dirty()) : a.kind === "multipleOf" ? Bc(e.data, a.value) !== 0 && (n = this._getOrReturnCtx(e, n), v(n, { + }), o.dirty()) : a.kind === "multipleOf" ? Zc(e.data, a.value) !== 0 && (n = this._getOrReturnCtx(e, n), v(n, { code: g.not_multiple_of, multipleOf: a.value, message: a.message }), o.dirty()) : a.kind === "finite" ? Number.isFinite(e.data) || (n = this._getOrReturnCtx(e, n), v(n, { code: g.not_finite, message: a.message - }), o.dirty()) : O.assertNever(a); + }), o.dirty()) : F.assertNever(a); return { status: o.value, value: e.data }; } gte(e, r) { @@ -5948,7 +5960,7 @@ class et extends N { return e; } get isInt() { - return !!this._def.checks.find((e) => e.kind === "int" || e.kind === "multipleOf" && O.isInteger(e.value)); + return !!this._def.checks.find((e) => e.kind === "int" || e.kind === "multipleOf" && F.isInteger(e.value)); } get isFinite() { let e = null, r = null; @@ -5962,11 +5974,11 @@ class et extends N { } et.create = (t) => new et({ checks: [], - typeName: A.ZodNumber, + typeName: C.ZodNumber, coerce: (t == null ? void 0 : t.coerce) || !1, - ...$(t) + ...R(t) }); -class tt extends N { +class tt extends O { constructor() { super(...arguments), this.min = this.gte, this.max = this.lte; } @@ -5977,10 +5989,10 @@ class tt extends N { code: g.invalid_type, expected: w.bigint, received: a.parsedType - }), I; + }), $; } let n; - const o = new ee(); + const o = new te(); for (const a of this._def.checks) a.kind === "min" ? (a.inclusive ? e.data < a.value : e.data <= a.value) && (n = this._getOrReturnCtx(e, n), v(n, { code: g.too_small, @@ -5998,7 +6010,7 @@ class tt extends N { code: g.not_multiple_of, multipleOf: a.value, message: a.message - }), o.dirty()) : O.assertNever(a); + }), o.dirty()) : F.assertNever(a); return { status: o.value, value: e.data }; } gte(e, r) { @@ -6089,12 +6101,12 @@ tt.create = (t) => { var e; return new tt({ checks: [], - typeName: A.ZodBigInt, + typeName: C.ZodBigInt, coerce: (e = t == null ? void 0 : t.coerce) !== null && e !== void 0 ? e : !1, - ...$(t) + ...R(t) }); }; -class Vt extends N { +class Vt extends O { _parse(e) { if (this._def.coerce && (e.data = !!e.data), this._getType(e) !== w.boolean) { const n = this._getOrReturnCtx(e); @@ -6102,17 +6114,17 @@ class Vt extends N { code: g.invalid_type, expected: w.boolean, received: n.parsedType - }), I; + }), $; } - return ce(e.data); + return le(e.data); } } Vt.create = (t) => new Vt({ - typeName: A.ZodBoolean, + typeName: C.ZodBoolean, coerce: (t == null ? void 0 : t.coerce) || !1, - ...$(t) + ...R(t) }); -class pt extends N { +class pt extends O { _parse(e) { if (this._def.coerce && (e.data = new Date(e.data)), this._getType(e) !== w.date) { const a = this._getOrReturnCtx(e); @@ -6120,15 +6132,15 @@ class pt extends N { code: g.invalid_type, expected: w.date, received: a.parsedType - }), I; + }), $; } if (isNaN(e.data.getTime())) { const a = this._getOrReturnCtx(e); return v(a, { code: g.invalid_date - }), I; + }), $; } - const n = new ee(); + const n = new te(); let o; for (const a of this._def.checks) a.kind === "min" ? e.data.getTime() < a.value && (o = this._getOrReturnCtx(e, o), v(o, { @@ -6145,7 +6157,7 @@ class pt extends N { exact: !1, maximum: a.value, type: "date" - }), n.dirty()) : O.assertNever(a); + }), n.dirty()) : F.assertNever(a); return { status: n.value, value: new Date(e.data.getTime()) @@ -6187,10 +6199,10 @@ class pt extends N { pt.create = (t) => new pt({ checks: [], coerce: (t == null ? void 0 : t.coerce) || !1, - typeName: A.ZodDate, - ...$(t) + typeName: C.ZodDate, + ...R(t) }); -class Ir extends N { +class Ar extends O { _parse(e) { if (this._getType(e) !== w.symbol) { const n = this._getOrReturnCtx(e); @@ -6198,16 +6210,16 @@ class Ir extends N { code: g.invalid_type, expected: w.symbol, received: n.parsedType - }), I; + }), $; } - return ce(e.data); + return le(e.data); } } -Ir.create = (t) => new Ir({ - typeName: A.ZodSymbol, - ...$(t) +Ar.create = (t) => new Ar({ + typeName: C.ZodSymbol, + ...R(t) }); -class Ht extends N { +class Ht extends O { _parse(e) { if (this._getType(e) !== w.undefined) { const n = this._getOrReturnCtx(e); @@ -6215,16 +6227,16 @@ class Ht extends N { code: g.invalid_type, expected: w.undefined, received: n.parsedType - }), I; + }), $; } - return ce(e.data); + return le(e.data); } } Ht.create = (t) => new Ht({ - typeName: A.ZodUndefined, - ...$(t) + typeName: C.ZodUndefined, + ...R(t) }); -class Wt extends N { +class Wt extends O { _parse(e) { if (this._getType(e) !== w.null) { const n = this._getOrReturnCtx(e); @@ -6232,54 +6244,54 @@ class Wt extends N { code: g.invalid_type, expected: w.null, received: n.parsedType - }), I; + }), $; } - return ce(e.data); + return le(e.data); } } Wt.create = (t) => new Wt({ - typeName: A.ZodNull, - ...$(t) + typeName: C.ZodNull, + ...R(t) }); -class $t extends N { +class $t extends O { constructor() { super(...arguments), this._any = !0; } _parse(e) { - return ce(e.data); + return le(e.data); } } $t.create = (t) => new $t({ - typeName: A.ZodAny, - ...$(t) + typeName: C.ZodAny, + ...R(t) }); -class ft extends N { +class ft extends O { constructor() { super(...arguments), this._unknown = !0; } _parse(e) { - return ce(e.data); + return le(e.data); } } ft.create = (t) => new ft({ - typeName: A.ZodUnknown, - ...$(t) + typeName: C.ZodUnknown, + ...R(t) }); -class Ve extends N { +class Ve extends O { _parse(e) { const r = this._getOrReturnCtx(e); return v(r, { code: g.invalid_type, expected: w.never, received: r.parsedType - }), I; + }), $; } } Ve.create = (t) => new Ve({ - typeName: A.ZodNever, - ...$(t) + typeName: C.ZodNever, + ...R(t) }); -class Cr extends N { +class Cr extends O { _parse(e) { if (this._getType(e) !== w.undefined) { const n = this._getOrReturnCtx(e); @@ -6287,16 +6299,16 @@ class Cr extends N { code: g.invalid_type, expected: w.void, received: n.parsedType - }), I; + }), $; } - return ce(e.data); + return le(e.data); } } Cr.create = (t) => new Cr({ - typeName: A.ZodVoid, - ...$(t) + typeName: C.ZodVoid, + ...R(t) }); -class $e extends N { +class $e extends O { _parse(e) { const { ctx: r, status: n } = this._processInputParams(e), o = this._def; if (r.parsedType !== w.array) @@ -6304,7 +6316,7 @@ class $e extends N { code: g.invalid_type, expected: w.array, received: r.parsedType - }), I; + }), $; if (o.exactLength !== null) { const i = r.data.length > o.exactLength.value, c = r.data.length < o.exactLength.value; (i || c) && (v(r, { @@ -6332,9 +6344,9 @@ class $e extends N { exact: !1, message: o.maxLength.message }), n.dirty()), r.common.async) - return Promise.all([...r.data].map((i, c) => o.type._parseAsync(new Fe(r, i, r.path, c)))).then((i) => ee.mergeArray(n, i)); + return Promise.all([...r.data].map((i, c) => o.type._parseAsync(new Fe(r, i, r.path, c)))).then((i) => te.mergeArray(n, i)); const a = [...r.data].map((i, c) => o.type._parseSync(new Fe(r, i, r.path, c))); - return ee.mergeArray(n, a); + return te.mergeArray(n, a); } get element() { return this._def.type; @@ -6366,17 +6378,17 @@ $e.create = (t, e) => new $e({ minLength: null, maxLength: null, exactLength: null, - typeName: A.ZodArray, - ...$(e) + typeName: C.ZodArray, + ...R(e) }); function vt(t) { - if (t instanceof z) { + if (t instanceof B) { const e = {}; for (const r in t.shape) { const n = t.shape[r]; e[r] = Le.create(vt(n)); } - return new z({ + return new B({ ...t._def, shape: () => e }); @@ -6385,84 +6397,84 @@ function vt(t) { type: vt(t.element) }) : t instanceof Le ? Le.create(vt(t.unwrap())) : t instanceof nt ? nt.create(vt(t.unwrap())) : t instanceof De ? De.create(t.items.map((e) => vt(e))) : t; } -class z extends N { +class B extends O { constructor() { super(...arguments), this._cached = null, this.nonstrict = this.passthrough, this.augment = this.extend; } _getCached() { if (this._cached !== null) return this._cached; - const e = this._def.shape(), r = O.objectKeys(e); + const e = this._def.shape(), r = F.objectKeys(e); return this._cached = { shape: e, keys: r }; } _parse(e) { if (this._getType(e) !== w.object) { - const d = this._getOrReturnCtx(e); - return v(d, { + const u = this._getOrReturnCtx(e); + return v(u, { code: g.invalid_type, expected: w.object, - received: d.parsedType - }), I; + received: u.parsedType + }), $; } const { status: n, ctx: o } = this._processInputParams(e), { shape: a, keys: i } = this._getCached(), c = []; if (!(this._def.catchall instanceof Ve && this._def.unknownKeys === "strip")) - for (const d in o.data) - i.includes(d) || c.push(d); + for (const u in o.data) + i.includes(u) || c.push(u); const l = []; - for (const d of i) { - const u = a[d], f = o.data[d]; + for (const u of i) { + const d = a[u], f = o.data[u]; l.push({ - key: { status: "valid", value: d }, - value: u._parse(new Fe(o, f, o.path, d)), - alwaysSet: d in o.data + key: { status: "valid", value: u }, + value: d._parse(new Fe(o, f, o.path, u)), + alwaysSet: u in o.data }); } if (this._def.catchall instanceof Ve) { - const d = this._def.unknownKeys; - if (d === "passthrough") - for (const u of c) + const u = this._def.unknownKeys; + if (u === "passthrough") + for (const d of c) l.push({ - key: { status: "valid", value: u }, - value: { status: "valid", value: o.data[u] } + key: { status: "valid", value: d }, + value: { status: "valid", value: o.data[d] } }); - else if (d === "strict") + else if (u === "strict") c.length > 0 && (v(o, { code: g.unrecognized_keys, keys: c }), n.dirty()); - else if (d !== "strip") throw new Error("Internal ZodObject error: invalid unknownKeys value."); + else if (u !== "strip") throw new Error("Internal ZodObject error: invalid unknownKeys value."); } else { - const d = this._def.catchall; - for (const u of c) { - const f = o.data[u]; + const u = this._def.catchall; + for (const d of c) { + const f = o.data[d]; l.push({ - key: { status: "valid", value: u }, - value: d._parse( - new Fe(o, f, o.path, u) + key: { status: "valid", value: d }, + value: u._parse( + new Fe(o, f, o.path, d) //, ctx.child(key), value, getParsedType(value) ), - alwaysSet: u in o.data + alwaysSet: d in o.data }); } } return o.common.async ? Promise.resolve().then(async () => { - const d = []; - for (const u of l) { - const f = await u.key, m = await u.value; - d.push({ + const u = []; + for (const d of l) { + const f = await d.key, h = await d.value; + u.push({ key: f, - value: m, - alwaysSet: u.alwaysSet + value: h, + alwaysSet: d.alwaysSet }); } - return d; - }).then((d) => ee.mergeObjectSync(n, d)) : ee.mergeObjectSync(n, l); + return u; + }).then((u) => te.mergeObjectSync(n, u)) : te.mergeObjectSync(n, l); } get shape() { return this._def.shape(); } strict(e) { - return k.errToObj, new z({ + return k.errToObj, new B({ ...this._def, unknownKeys: "strict", ...e !== void 0 ? { @@ -6479,13 +6491,13 @@ class z extends N { }); } strip() { - return new z({ + return new B({ ...this._def, unknownKeys: "strip" }); } passthrough() { - return new z({ + return new B({ ...this._def, unknownKeys: "passthrough" }); @@ -6508,7 +6520,7 @@ class z extends N { // }) as any; // }; extend(e) { - return new z({ + return new B({ ...this._def, shape: () => ({ ...this._def.shape(), @@ -6522,14 +6534,14 @@ class z extends N { * upgrade if you are experiencing issues. */ merge(e) { - return new z({ + return new B({ unknownKeys: e._def.unknownKeys, catchall: e._def.catchall, shape: () => ({ ...this._def.shape(), ...e._def.shape() }), - typeName: A.ZodObject + typeName: C.ZodObject }); } // merge< @@ -6592,25 +6604,25 @@ class z extends N { // return merged; // } catchall(e) { - return new z({ + return new B({ ...this._def, catchall: e }); } pick(e) { const r = {}; - return O.objectKeys(e).forEach((n) => { + return F.objectKeys(e).forEach((n) => { e[n] && this.shape[n] && (r[n] = this.shape[n]); - }), new z({ + }), new B({ ...this._def, shape: () => r }); } omit(e) { const r = {}; - return O.objectKeys(this.shape).forEach((n) => { + return F.objectKeys(this.shape).forEach((n) => { e[n] || (r[n] = this.shape[n]); - }), new z({ + }), new B({ ...this._def, shape: () => r }); @@ -6623,17 +6635,17 @@ class z extends N { } partial(e) { const r = {}; - return O.objectKeys(this.shape).forEach((n) => { + return F.objectKeys(this.shape).forEach((n) => { const o = this.shape[n]; e && !e[n] ? r[n] = o : r[n] = o.optional(); - }), new z({ + }), new B({ ...this._def, shape: () => r }); } required(e) { const r = {}; - return O.objectKeys(this.shape).forEach((n) => { + return F.objectKeys(this.shape).forEach((n) => { if (e && !e[n]) r[n] = this.shape[n]; else { @@ -6642,37 +6654,37 @@ class z extends N { a = a._def.innerType; r[n] = a; } - }), new z({ + }), new B({ ...this._def, shape: () => r }); } keyof() { - return Ls(O.objectKeys(this.shape)); + return Ms(F.objectKeys(this.shape)); } } -z.create = (t, e) => new z({ +B.create = (t, e) => new B({ shape: () => t, unknownKeys: "strip", catchall: Ve.create(), - typeName: A.ZodObject, - ...$(e) + typeName: C.ZodObject, + ...R(e) }); -z.strictCreate = (t, e) => new z({ +B.strictCreate = (t, e) => new B({ shape: () => t, unknownKeys: "strict", catchall: Ve.create(), - typeName: A.ZodObject, - ...$(e) + typeName: C.ZodObject, + ...R(e) }); -z.lazycreate = (t, e) => new z({ +B.lazycreate = (t, e) => new B({ shape: t, unknownKeys: "strip", catchall: Ve.create(), - typeName: A.ZodObject, - ...$(e) + typeName: C.ZodObject, + ...R(e) }); -class qt extends N { +class qt extends O { _parse(e) { const { ctx: r } = this._processInputParams(e), n = this._def.options; function o(a) { @@ -6682,11 +6694,11 @@ class qt extends N { for (const c of a) if (c.result.status === "dirty") return r.common.issues.push(...c.ctx.common.issues), c.result; - const i = a.map((c) => new he(c.ctx.common.issues)); + const i = a.map((c) => new ge(c.ctx.common.issues)); return v(r, { code: g.invalid_union, unionErrors: i - }), I; + }), $; } if (r.common.async) return Promise.all(n.map(async (a) => { @@ -6711,29 +6723,29 @@ class qt extends N { let a; const i = []; for (const l of n) { - const d = { + const u = { ...r, common: { ...r.common, issues: [] }, parent: null - }, u = l._parseSync({ + }, d = l._parseSync({ data: r.data, path: r.path, - parent: d + parent: u }); - if (u.status === "valid") - return u; - u.status === "dirty" && !a && (a = { result: u, ctx: d }), d.common.issues.length && i.push(d.common.issues); + if (d.status === "valid") + return d; + d.status === "dirty" && !a && (a = { result: d, ctx: u }), u.common.issues.length && i.push(u.common.issues); } if (a) return r.common.issues.push(...a.ctx.common.issues), a.result; - const c = i.map((l) => new he(l)); + const c = i.map((l) => new ge(l)); return v(r, { code: g.invalid_union, unionErrors: c - }), I; + }), $; } } get options() { @@ -6742,11 +6754,11 @@ class qt extends N { } qt.create = (t, e) => new qt({ options: t, - typeName: A.ZodUnion, - ...$(e) + typeName: C.ZodUnion, + ...R(e) }); -const ze = (t) => t instanceof Jt ? ze(t.schema) : t instanceof Ne ? ze(t.innerType()) : t instanceof Xt ? [t.value] : t instanceof rt ? t.options : t instanceof Qt ? O.objectValues(t.enum) : t instanceof er ? ze(t._def.innerType) : t instanceof Ht ? [void 0] : t instanceof Wt ? [null] : t instanceof Le ? [void 0, ...ze(t.unwrap())] : t instanceof nt ? [null, ...ze(t.unwrap())] : t instanceof jn || t instanceof rr ? ze(t.unwrap()) : t instanceof tr ? ze(t._def.innerType) : []; -class Vr extends N { +const ze = (t) => t instanceof Jt ? ze(t.schema) : t instanceof Re ? ze(t.innerType()) : t instanceof Xt ? [t.value] : t instanceof rt ? t.options : t instanceof Qt ? F.objectValues(t.enum) : t instanceof er ? ze(t._def.innerType) : t instanceof Ht ? [void 0] : t instanceof Wt ? [null] : t instanceof Le ? [void 0, ...ze(t.unwrap())] : t instanceof nt ? [null, ...ze(t.unwrap())] : t instanceof Fn || t instanceof rr ? ze(t.unwrap()) : t instanceof tr ? ze(t._def.innerType) : []; +class Vr extends O { _parse(e) { const { ctx: r } = this._processInputParams(e); if (r.parsedType !== w.object) @@ -6754,7 +6766,7 @@ class Vr extends N { code: g.invalid_type, expected: w.object, received: r.parsedType - }), I; + }), $; const n = this.discriminator, o = r.data[n], a = this.optionsMap.get(o); return a ? r.common.async ? a._parseAsync({ data: r.data, @@ -6768,7 +6780,7 @@ class Vr extends N { code: g.invalid_union_discriminator, options: Array.from(this.optionsMap.keys()), path: [n] - }), I); + }), $); } get discriminator() { return this._def.discriminator; @@ -6800,22 +6812,22 @@ class Vr extends N { } } return new Vr({ - typeName: A.ZodDiscriminatedUnion, + typeName: C.ZodDiscriminatedUnion, discriminator: e, options: r, optionsMap: o, - ...$(n) + ...R(n) }); } } -function gn(t, e) { +function mn(t, e) { const r = Ye(t), n = Ye(e); if (t === e) return { valid: !0, data: t }; if (r === w.object && n === w.object) { - const o = O.objectKeys(e), a = O.objectKeys(t).filter((c) => o.indexOf(c) !== -1), i = { ...t, ...e }; + const o = F.objectKeys(e), a = F.objectKeys(t).filter((c) => o.indexOf(c) !== -1), i = { ...t, ...e }; for (const c of a) { - const l = gn(t[c], e[c]); + const l = mn(t[c], e[c]); if (!l.valid) return { valid: !1 }; i[c] = l.data; @@ -6826,7 +6838,7 @@ function gn(t, e) { return { valid: !1 }; const o = []; for (let a = 0; a < t.length; a++) { - const i = t[a], c = e[a], l = gn(i, c); + const i = t[a], c = e[a], l = mn(i, c); if (!l.valid) return { valid: !1 }; o.push(l.data); @@ -6834,15 +6846,15 @@ function gn(t, e) { return { valid: !0, data: o }; } else return r === w.date && n === w.date && +t == +e ? { valid: !0, data: t } : { valid: !1 }; } -class Kt extends N { +class Kt extends O { _parse(e) { const { status: r, ctx: n } = this._processInputParams(e), o = (a, i) => { - if (mn(a) || mn(i)) - return I; - const c = gn(a.value, i.value); + if (pn(a) || pn(i)) + return $; + const c = mn(a.value, i.value); return c.valid ? ((hn(a) || hn(i)) && r.dirty(), { status: r.value, value: c.data }) : (v(n, { code: g.invalid_intersection_types - }), I); + }), $); }; return n.common.async ? Promise.all([ this._def.left._parseAsync({ @@ -6869,10 +6881,10 @@ class Kt extends N { Kt.create = (t, e, r) => new Kt({ left: t, right: e, - typeName: A.ZodIntersection, - ...$(r) + typeName: C.ZodIntersection, + ...R(r) }); -class De extends N { +class De extends O { _parse(e) { const { status: r, ctx: n } = this._processInputParams(e); if (n.parsedType !== w.array) @@ -6880,7 +6892,7 @@ class De extends N { code: g.invalid_type, expected: w.array, received: n.parsedType - }), I; + }), $; if (n.data.length < this._def.items.length) return v(n, { code: g.too_small, @@ -6888,7 +6900,7 @@ class De extends N { inclusive: !0, exact: !1, type: "array" - }), I; + }), $; !this._def.rest && n.data.length > this._def.items.length && (v(n, { code: g.too_big, maximum: this._def.items.length, @@ -6900,7 +6912,7 @@ class De extends N { const l = this._def.items[c] || this._def.rest; return l ? l._parse(new Fe(n, i, n.path, c)) : null; }).filter((i) => !!i); - return n.common.async ? Promise.all(a).then((i) => ee.mergeArray(r, i)) : ee.mergeArray(r, a); + return n.common.async ? Promise.all(a).then((i) => te.mergeArray(r, i)) : te.mergeArray(r, a); } get items() { return this._def.items; @@ -6917,12 +6929,12 @@ De.create = (t, e) => { throw new Error("You must pass an array of schemas to z.tuple([ ... ])"); return new De({ items: t, - typeName: A.ZodTuple, + typeName: C.ZodTuple, rest: null, - ...$(e) + ...R(e) }); }; -class Yt extends N { +class Yt extends O { get keySchema() { return this._def.keyType; } @@ -6936,7 +6948,7 @@ class Yt extends N { code: g.invalid_type, expected: w.object, received: n.parsedType - }), I; + }), $; const o = [], a = this._def.keyType, i = this._def.valueType; for (const c in n.data) o.push({ @@ -6944,26 +6956,26 @@ class Yt extends N { value: i._parse(new Fe(n, n.data[c], n.path, c)), alwaysSet: c in n.data }); - return n.common.async ? ee.mergeObjectAsync(r, o) : ee.mergeObjectSync(r, o); + return n.common.async ? te.mergeObjectAsync(r, o) : te.mergeObjectSync(r, o); } get element() { return this._def.valueType; } static create(e, r, n) { - return r instanceof N ? new Yt({ + return r instanceof O ? new Yt({ keyType: e, valueType: r, - typeName: A.ZodRecord, - ...$(n) + typeName: C.ZodRecord, + ...R(n) }) : new Yt({ - keyType: Ie.create(), + keyType: Ae.create(), valueType: e, - typeName: A.ZodRecord, - ...$(r) + typeName: C.ZodRecord, + ...R(r) }); } } -class $r extends N { +class $r extends O { get keySchema() { return this._def.keyType; } @@ -6977,29 +6989,29 @@ class $r extends N { code: g.invalid_type, expected: w.map, received: n.parsedType - }), I; - const o = this._def.keyType, a = this._def.valueType, i = [...n.data.entries()].map(([c, l], d) => ({ - key: o._parse(new Fe(n, c, n.path, [d, "key"])), - value: a._parse(new Fe(n, l, n.path, [d, "value"])) + }), $; + const o = this._def.keyType, a = this._def.valueType, i = [...n.data.entries()].map(([c, l], u) => ({ + key: o._parse(new Fe(n, c, n.path, [u, "key"])), + value: a._parse(new Fe(n, l, n.path, [u, "value"])) })); if (n.common.async) { const c = /* @__PURE__ */ new Map(); return Promise.resolve().then(async () => { for (const l of i) { - const d = await l.key, u = await l.value; - if (d.status === "aborted" || u.status === "aborted") - return I; - (d.status === "dirty" || u.status === "dirty") && r.dirty(), c.set(d.value, u.value); + const u = await l.key, d = await l.value; + if (u.status === "aborted" || d.status === "aborted") + return $; + (u.status === "dirty" || d.status === "dirty") && r.dirty(), c.set(u.value, d.value); } return { status: r.value, value: c }; }); } else { const c = /* @__PURE__ */ new Map(); for (const l of i) { - const d = l.key, u = l.value; - if (d.status === "aborted" || u.status === "aborted") - return I; - (d.status === "dirty" || u.status === "dirty") && r.dirty(), c.set(d.value, u.value); + const u = l.key, d = l.value; + if (u.status === "aborted" || d.status === "aborted") + return $; + (u.status === "dirty" || d.status === "dirty") && r.dirty(), c.set(u.value, d.value); } return { status: r.value, value: c }; } @@ -7008,10 +7020,10 @@ class $r extends N { $r.create = (t, e, r) => new $r({ valueType: e, keyType: t, - typeName: A.ZodMap, - ...$(r) + typeName: C.ZodMap, + ...R(r) }); -class mt extends N { +class ht extends O { _parse(e) { const { status: r, ctx: n } = this._processInputParams(e); if (n.parsedType !== w.set) @@ -7019,7 +7031,7 @@ class mt extends N { code: g.invalid_type, expected: w.set, received: n.parsedType - }), I; + }), $; const o = this._def; o.minSize !== null && n.data.size < o.minSize.value && (v(n, { code: g.too_small, @@ -7038,25 +7050,25 @@ class mt extends N { }), r.dirty()); const a = this._def.valueType; function i(l) { - const d = /* @__PURE__ */ new Set(); - for (const u of l) { - if (u.status === "aborted") - return I; - u.status === "dirty" && r.dirty(), d.add(u.value); + const u = /* @__PURE__ */ new Set(); + for (const d of l) { + if (d.status === "aborted") + return $; + d.status === "dirty" && r.dirty(), u.add(d.value); } - return { status: r.value, value: d }; + return { status: r.value, value: u }; } - const c = [...n.data.values()].map((l, d) => a._parse(new Fe(n, l, n.path, d))); + const c = [...n.data.values()].map((l, u) => a._parse(new Fe(n, l, n.path, u))); return n.common.async ? Promise.all(c).then((l) => i(l)) : i(c); } min(e, r) { - return new mt({ + return new ht({ ...this._def, minSize: { value: e, message: k.toString(r) } }); } max(e, r) { - return new mt({ + return new ht({ ...this._def, maxSize: { value: e, message: k.toString(r) } }); @@ -7068,14 +7080,14 @@ class mt extends N { return this.min(1, e); } } -mt.create = (t, e) => new mt({ +ht.create = (t, e) => new ht({ valueType: t, minSize: null, maxSize: null, - typeName: A.ZodSet, - ...$(e) + typeName: C.ZodSet, + ...R(e) }); -class Pt extends N { +class kt extends O { constructor() { super(...arguments), this.validate = this.implement; } @@ -7086,7 +7098,7 @@ class Pt extends N { code: g.invalid_type, expected: w.function, received: r.parsedType - }), I; + }), $; function n(c, l) { return Tr({ data: c, @@ -7096,7 +7108,7 @@ class Pt extends N { r.schemaErrorMap, Pr(), Ct - ].filter((d) => !!d), + ].filter((u) => !!u), issueData: { code: g.invalid_arguments, argumentsError: l @@ -7112,7 +7124,7 @@ class Pt extends N { r.schemaErrorMap, Pr(), Ct - ].filter((d) => !!d), + ].filter((u) => !!u), issueData: { code: g.invalid_return_type, returnTypeError: l @@ -7120,25 +7132,25 @@ class Pt extends N { }); } const a = { errorMap: r.common.contextualErrorMap }, i = r.data; - if (this._def.returns instanceof Nt) { + if (this._def.returns instanceof Rt) { const c = this; - return ce(async function(...l) { - const d = new he([]), u = await c._def.args.parseAsync(l, a).catch((p) => { - throw d.addIssue(n(l, p)), d; - }), f = await Reflect.apply(i, this, u); + return le(async function(...l) { + const u = new ge([]), d = await c._def.args.parseAsync(l, a).catch((p) => { + throw u.addIssue(n(l, p)), u; + }), f = await Reflect.apply(i, this, d); return await c._def.returns._def.type.parseAsync(f, a).catch((p) => { - throw d.addIssue(o(f, p)), d; + throw u.addIssue(o(f, p)), u; }); }); } else { const c = this; - return ce(function(...l) { - const d = c._def.args.safeParse(l, a); - if (!d.success) - throw new he([n(l, d.error)]); - const u = Reflect.apply(i, this, d.data), f = c._def.returns.safeParse(u, a); + return le(function(...l) { + const u = c._def.args.safeParse(l, a); + if (!u.success) + throw new ge([n(l, u.error)]); + const d = Reflect.apply(i, this, u.data), f = c._def.returns.safeParse(d, a); if (!f.success) - throw new he([o(u, f.error)]); + throw new ge([o(d, f.error)]); return f.data; }); } @@ -7150,13 +7162,13 @@ class Pt extends N { return this._def.returns; } args(...e) { - return new Pt({ + return new kt({ ...this._def, args: De.create(e).rest(ft.create()) }); } returns(e) { - return new Pt({ + return new kt({ ...this._def, returns: e }); @@ -7168,15 +7180,15 @@ class Pt extends N { return this.parse(e); } static create(e, r, n) { - return new Pt({ + return new kt({ args: e || De.create([]).rest(ft.create()), returns: r || ft.create(), - typeName: A.ZodFunction, - ...$(n) + typeName: C.ZodFunction, + ...R(n) }); } } -class Jt extends N { +class Jt extends O { get schema() { return this._def.getter(); } @@ -7187,10 +7199,10 @@ class Jt extends N { } Jt.create = (t, e) => new Jt({ getter: t, - typeName: A.ZodLazy, - ...$(e) + typeName: C.ZodLazy, + ...R(e) }); -class Xt extends N { +class Xt extends O { _parse(e) { if (e.data !== this._def.value) { const r = this._getOrReturnCtx(e); @@ -7198,7 +7210,7 @@ class Xt extends N { received: r.data, code: g.invalid_literal, expected: this._def.value - }), I; + }), $; } return { status: "valid", value: e.data }; } @@ -7208,17 +7220,17 @@ class Xt extends N { } Xt.create = (t, e) => new Xt({ value: t, - typeName: A.ZodLiteral, - ...$(e) + typeName: C.ZodLiteral, + ...R(e) }); -function Ls(t, e) { +function Ms(t, e) { return new rt({ values: t, - typeName: A.ZodEnum, - ...$(e) + typeName: C.ZodEnum, + ...R(e) }); } -class rt extends N { +class rt extends O { constructor() { super(...arguments), jt.set(this, void 0); } @@ -7226,20 +7238,20 @@ class rt extends N { if (typeof e.data != "string") { const r = this._getOrReturnCtx(e), n = this._def.values; return v(r, { - expected: O.joinValues(n), + expected: F.joinValues(n), received: r.parsedType, code: g.invalid_type - }), I; + }), $; } - if (Ar(this, jt) || Ns(this, jt, new Set(this._def.values)), !Ar(this, jt).has(e.data)) { + if (Ir(this, jt) || $s(this, jt, new Set(this._def.values)), !Ir(this, jt).has(e.data)) { const r = this._getOrReturnCtx(e), n = this._def.values; return v(r, { received: r.data, code: g.invalid_enum_value, options: n - }), I; + }), $; } - return ce(e.data); + return le(e.data); } get options() { return this._def.values; @@ -7276,30 +7288,30 @@ class rt extends N { } } jt = /* @__PURE__ */ new WeakMap(); -rt.create = Ls; -class Qt extends N { +rt.create = Ms; +class Qt extends O { constructor() { super(...arguments), Zt.set(this, void 0); } _parse(e) { - const r = O.getValidEnumValues(this._def.values), n = this._getOrReturnCtx(e); + const r = F.getValidEnumValues(this._def.values), n = this._getOrReturnCtx(e); if (n.parsedType !== w.string && n.parsedType !== w.number) { - const o = O.objectValues(r); + const o = F.objectValues(r); return v(n, { - expected: O.joinValues(o), + expected: F.joinValues(o), received: n.parsedType, code: g.invalid_type - }), I; + }), $; } - if (Ar(this, Zt) || Ns(this, Zt, new Set(O.getValidEnumValues(this._def.values))), !Ar(this, Zt).has(e.data)) { - const o = O.objectValues(r); + if (Ir(this, Zt) || $s(this, Zt, new Set(F.getValidEnumValues(this._def.values))), !Ir(this, Zt).has(e.data)) { + const o = F.objectValues(r); return v(n, { received: n.data, code: g.invalid_enum_value, options: o - }), I; + }), $; } - return ce(e.data); + return le(e.data); } get enum() { return this._def.values; @@ -7308,10 +7320,10 @@ class Qt extends N { Zt = /* @__PURE__ */ new WeakMap(); Qt.create = (t, e) => new Qt({ values: t, - typeName: A.ZodNativeEnum, - ...$(e) + typeName: C.ZodNativeEnum, + ...R(e) }); -class Nt extends N { +class Rt extends O { unwrap() { return this._def.type; } @@ -7322,25 +7334,25 @@ class Nt extends N { code: g.invalid_type, expected: w.promise, received: r.parsedType - }), I; + }), $; const n = r.parsedType === w.promise ? r.data : Promise.resolve(r.data); - return ce(n.then((o) => this._def.type.parseAsync(o, { + return le(n.then((o) => this._def.type.parseAsync(o, { path: r.path, errorMap: r.common.contextualErrorMap }))); } } -Nt.create = (t, e) => new Nt({ +Rt.create = (t, e) => new Rt({ type: t, - typeName: A.ZodPromise, - ...$(e) + typeName: C.ZodPromise, + ...R(e) }); -class Ne extends N { +class Re extends O { innerType() { return this._def.schema; } sourceType() { - return this._def.schema._def.typeName === A.ZodEffects ? this._def.schema.sourceType() : this._def.schema; + return this._def.schema._def.typeName === C.ZodEffects ? this._def.schema.sourceType() : this._def.schema; } _parse(e) { const { status: r, ctx: n } = this._processInputParams(e), o = this._def.effect || null, a = { @@ -7356,23 +7368,23 @@ class Ne extends N { if (n.common.async) return Promise.resolve(i).then(async (c) => { if (r.value === "aborted") - return I; + return $; const l = await this._def.schema._parseAsync({ data: c, path: n.path, parent: n }); - return l.status === "aborted" ? I : l.status === "dirty" || r.value === "dirty" ? bt(l.value) : l; + return l.status === "aborted" ? $ : l.status === "dirty" || r.value === "dirty" ? bt(l.value) : l; }); { if (r.value === "aborted") - return I; + return $; const c = this._def.schema._parseSync({ data: i, path: n.path, parent: n }); - return c.status === "aborted" ? I : c.status === "dirty" || r.value === "dirty" ? bt(c.value) : c; + return c.status === "aborted" ? $ : c.status === "dirty" || r.value === "dirty" ? bt(c.value) : c; } } if (o.type === "refinement") { @@ -7390,9 +7402,9 @@ class Ne extends N { path: n.path, parent: n }); - return c.status === "aborted" ? I : (c.status === "dirty" && r.dirty(), i(c.value), { status: r.value, value: c.value }); + return c.status === "aborted" ? $ : (c.status === "dirty" && r.dirty(), i(c.value), { status: r.value, value: c.value }); } else - return this._def.schema._parseAsync({ data: n.data, path: n.path, parent: n }).then((c) => c.status === "aborted" ? I : (c.status === "dirty" && r.dirty(), i(c.value).then(() => ({ status: r.value, value: c.value })))); + return this._def.schema._parseAsync({ data: n.data, path: n.path, parent: n }).then((c) => c.status === "aborted" ? $ : (c.status === "dirty" && r.dirty(), i(c.value).then(() => ({ status: r.value, value: c.value })))); } if (o.type === "transform") if (n.common.async === !1) { @@ -7409,24 +7421,24 @@ class Ne extends N { return { status: r.value, value: c }; } else return this._def.schema._parseAsync({ data: n.data, path: n.path, parent: n }).then((i) => Bt(i) ? Promise.resolve(o.transform(i.value, a)).then((c) => ({ status: r.value, value: c })) : i); - O.assertNever(o); + F.assertNever(o); } } -Ne.create = (t, e, r) => new Ne({ +Re.create = (t, e, r) => new Re({ schema: t, - typeName: A.ZodEffects, + typeName: C.ZodEffects, effect: e, - ...$(r) + ...R(r) }); -Ne.createWithPreprocess = (t, e, r) => new Ne({ +Re.createWithPreprocess = (t, e, r) => new Re({ schema: e, effect: { type: "preprocess", transform: t }, - typeName: A.ZodEffects, - ...$(r) + typeName: C.ZodEffects, + ...R(r) }); -class Le extends N { +class Le extends O { _parse(e) { - return this._getType(e) === w.undefined ? ce(void 0) : this._def.innerType._parse(e); + return this._getType(e) === w.undefined ? le(void 0) : this._def.innerType._parse(e); } unwrap() { return this._def.innerType; @@ -7434,12 +7446,12 @@ class Le extends N { } Le.create = (t, e) => new Le({ innerType: t, - typeName: A.ZodOptional, - ...$(e) + typeName: C.ZodOptional, + ...R(e) }); -class nt extends N { +class nt extends O { _parse(e) { - return this._getType(e) === w.null ? ce(null) : this._def.innerType._parse(e); + return this._getType(e) === w.null ? le(null) : this._def.innerType._parse(e); } unwrap() { return this._def.innerType; @@ -7447,10 +7459,10 @@ class nt extends N { } nt.create = (t, e) => new nt({ innerType: t, - typeName: A.ZodNullable, - ...$(e) + typeName: C.ZodNullable, + ...R(e) }); -class er extends N { +class er extends O { _parse(e) { const { ctx: r } = this._processInputParams(e); let n = r.data; @@ -7466,11 +7478,11 @@ class er extends N { } er.create = (t, e) => new er({ innerType: t, - typeName: A.ZodDefault, + typeName: C.ZodDefault, defaultValue: typeof e.default == "function" ? e.default : () => e.default, - ...$(e) + ...R(e) }); -class tr extends N { +class tr extends O { _parse(e) { const { ctx: r } = this._processInputParams(e), n = { ...r, @@ -7489,7 +7501,7 @@ class tr extends N { status: "valid", value: a.status === "valid" ? a.value : this._def.catchValue({ get error() { - return new he(n.common.issues); + return new ge(n.common.issues); }, input: n.data }) @@ -7497,7 +7509,7 @@ class tr extends N { status: "valid", value: o.status === "valid" ? o.value : this._def.catchValue({ get error() { - return new he(n.common.issues); + return new ge(n.common.issues); }, input: n.data }) @@ -7509,11 +7521,11 @@ class tr extends N { } tr.create = (t, e) => new tr({ innerType: t, - typeName: A.ZodCatch, + typeName: C.ZodCatch, catchValue: typeof e.catch == "function" ? e.catch : () => e.catch, - ...$(e) + ...R(e) }); -class Nr extends N { +class Rr extends O { _parse(e) { if (this._getType(e) !== w.nan) { const n = this._getOrReturnCtx(e); @@ -7521,17 +7533,17 @@ class Nr extends N { code: g.invalid_type, expected: w.nan, received: n.parsedType - }), I; + }), $; } return { status: "valid", value: e.data }; } } -Nr.create = (t) => new Nr({ - typeName: A.ZodNaN, - ...$(t) +Rr.create = (t) => new Rr({ + typeName: C.ZodNaN, + ...R(t) }); -const Gc = Symbol("zod_brand"); -class jn extends N { +const zc = Symbol("zod_brand"); +class Fn extends O { _parse(e) { const { ctx: r } = this._processInputParams(e), n = r.data; return this._def.type._parse({ @@ -7544,7 +7556,7 @@ class jn extends N { return this._def.type; } } -class cr extends N { +class cr extends O { _parse(e) { const { status: r, ctx: n } = this._processInputParams(e); if (n.common.async) @@ -7554,7 +7566,7 @@ class cr extends N { path: n.path, parent: n }); - return a.status === "aborted" ? I : a.status === "dirty" ? (r.dirty(), bt(a.value)) : this._def.out._parseAsync({ + return a.status === "aborted" ? $ : a.status === "dirty" ? (r.dirty(), bt(a.value)) : this._def.out._parseAsync({ data: a.value, path: n.path, parent: n @@ -7566,7 +7578,7 @@ class cr extends N { path: n.path, parent: n }); - return o.status === "aborted" ? I : o.status === "dirty" ? (r.dirty(), { + return o.status === "aborted" ? $ : o.status === "dirty" ? (r.dirty(), { status: "dirty", value: o.value }) : this._def.out._parseSync({ @@ -7580,11 +7592,11 @@ class cr extends N { return new cr({ in: e, out: r, - typeName: A.ZodPipeline + typeName: C.ZodPipeline }); } } -class rr extends N { +class rr extends O { _parse(e) { const r = this._def.innerType._parse(e), n = (o) => (Bt(o) && (o.value = Object.freeze(o.value)), o); return Gt(r) ? r.then((o) => n(o)) : n(r); @@ -7595,29 +7607,29 @@ class rr extends N { } rr.create = (t, e) => new rr({ innerType: t, - typeName: A.ZodReadonly, - ...$(e) + typeName: C.ZodReadonly, + ...R(e) }); -function Fs(t, e = {}, r) { +function Ls(t, e = {}, r) { return t ? $t.create().superRefine((n, o) => { var a, i; if (!t(n)) { - const c = typeof e == "function" ? e(n) : typeof e == "string" ? { message: e } : e, l = (i = (a = c.fatal) !== null && a !== void 0 ? a : r) !== null && i !== void 0 ? i : !0, d = typeof c == "string" ? { message: c } : c; - o.addIssue({ code: "custom", ...d, fatal: l }); + const c = typeof e == "function" ? e(n) : typeof e == "string" ? { message: e } : e, l = (i = (a = c.fatal) !== null && a !== void 0 ? a : r) !== null && i !== void 0 ? i : !0, u = typeof c == "string" ? { message: c } : c; + o.addIssue({ code: "custom", ...u, fatal: l }); } }) : $t.create(); } -const Vc = { - object: z.lazycreate +const Bc = { + object: B.lazycreate }; -var A; +var C; (function(t) { t.ZodString = "ZodString", t.ZodNumber = "ZodNumber", t.ZodNaN = "ZodNaN", t.ZodBigInt = "ZodBigInt", t.ZodBoolean = "ZodBoolean", t.ZodDate = "ZodDate", t.ZodSymbol = "ZodSymbol", t.ZodUndefined = "ZodUndefined", t.ZodNull = "ZodNull", t.ZodAny = "ZodAny", t.ZodUnknown = "ZodUnknown", t.ZodNever = "ZodNever", t.ZodVoid = "ZodVoid", t.ZodArray = "ZodArray", t.ZodObject = "ZodObject", t.ZodUnion = "ZodUnion", t.ZodDiscriminatedUnion = "ZodDiscriminatedUnion", t.ZodIntersection = "ZodIntersection", t.ZodTuple = "ZodTuple", t.ZodRecord = "ZodRecord", t.ZodMap = "ZodMap", t.ZodSet = "ZodSet", t.ZodFunction = "ZodFunction", t.ZodLazy = "ZodLazy", t.ZodLiteral = "ZodLiteral", t.ZodEnum = "ZodEnum", t.ZodEffects = "ZodEffects", t.ZodNativeEnum = "ZodNativeEnum", t.ZodOptional = "ZodOptional", t.ZodNullable = "ZodNullable", t.ZodDefault = "ZodDefault", t.ZodCatch = "ZodCatch", t.ZodPromise = "ZodPromise", t.ZodBranded = "ZodBranded", t.ZodPipeline = "ZodPipeline", t.ZodReadonly = "ZodReadonly"; -})(A || (A = {})); -const Hc = (t, e = { +})(C || (C = {})); +const Gc = (t, e = { message: `Input not instance of ${t.name}` -}) => Fs((r) => r instanceof t, e), Ds = Ie.create, Us = et.create, Wc = Nr.create, qc = tt.create, js = Vt.create, Kc = pt.create, Yc = Ir.create, Jc = Ht.create, Xc = Wt.create, Qc = $t.create, el = ft.create, tl = Ve.create, rl = Cr.create, nl = $e.create, ol = z.create, sl = z.strictCreate, al = qt.create, il = Vr.create, cl = Kt.create, ll = De.create, ul = Yt.create, dl = $r.create, fl = mt.create, pl = Pt.create, ml = Jt.create, hl = Xt.create, gl = rt.create, yl = Qt.create, _l = Nt.create, _o = Ne.create, vl = Le.create, bl = nt.create, wl = Ne.createWithPreprocess, Sl = cr.create, El = () => Ds().optional(), xl = () => Us().optional(), kl = () => js().optional(), Pl = { - string: (t) => Ie.create({ ...t, coerce: !0 }), +}) => Ls((r) => r instanceof t, e), Fs = Ae.create, Ds = et.create, Vc = Rr.create, Hc = tt.create, Us = Vt.create, Wc = pt.create, qc = Ar.create, Kc = Ht.create, Yc = Wt.create, Jc = $t.create, Xc = ft.create, Qc = Ve.create, el = Cr.create, tl = $e.create, rl = B.create, nl = B.strictCreate, ol = qt.create, sl = Vr.create, al = Kt.create, il = De.create, cl = Yt.create, ll = $r.create, ul = ht.create, dl = kt.create, fl = Jt.create, pl = Xt.create, hl = rt.create, ml = Qt.create, gl = Rt.create, go = Re.create, yl = Le.create, _l = nt.create, vl = Re.createWithPreprocess, bl = cr.create, wl = () => Fs().optional(), xl = () => Ds().optional(), Sl = () => Us().optional(), El = { + string: (t) => Ae.create({ ...t, coerce: !0 }), number: (t) => et.create({ ...t, coerce: !0 }), boolean: (t) => Vt.create({ ...t, @@ -7625,39 +7637,39 @@ const Hc = (t, e = { }), bigint: (t) => tt.create({ ...t, coerce: !0 }), date: (t) => pt.create({ ...t, coerce: !0 }) -}, Tl = I; +}, kl = $; var q = /* @__PURE__ */ Object.freeze({ __proto__: null, defaultErrorMap: Ct, - setErrorMap: Tc, + setErrorMap: kc, getErrorMap: Pr, makeIssue: Tr, - EMPTY_PATH: Ac, + EMPTY_PATH: Pc, addIssueToContext: v, - ParseStatus: ee, - INVALID: I, + ParseStatus: te, + INVALID: $, DIRTY: bt, - OK: ce, - isAborted: mn, + OK: le, + isAborted: pn, isDirty: hn, isValid: Bt, isAsync: Gt, get util() { - return O; + return F; }, get objectUtil() { - return pn; + return fn; }, ZodParsedType: w, getParsedType: Ye, - ZodType: N, - datetimeRegex: Ms, - ZodString: Ie, + ZodType: O, + datetimeRegex: Os, + ZodString: Ae, ZodNumber: et, ZodBigInt: tt, ZodBoolean: Vt, ZodDate: pt, - ZodSymbol: Ir, + ZodSymbol: Ar, ZodUndefined: Ht, ZodNull: Wt, ZodAny: $t, @@ -7665,111 +7677,84 @@ var q = /* @__PURE__ */ Object.freeze({ ZodNever: Ve, ZodVoid: Cr, ZodArray: $e, - ZodObject: z, + ZodObject: B, ZodUnion: qt, ZodDiscriminatedUnion: Vr, ZodIntersection: Kt, ZodTuple: De, ZodRecord: Yt, ZodMap: $r, - ZodSet: mt, - ZodFunction: Pt, + ZodSet: ht, + ZodFunction: kt, ZodLazy: Jt, ZodLiteral: Xt, ZodEnum: rt, ZodNativeEnum: Qt, - ZodPromise: Nt, - ZodEffects: Ne, - ZodTransformer: Ne, + ZodPromise: Rt, + ZodEffects: Re, + ZodTransformer: Re, ZodOptional: Le, ZodNullable: nt, ZodDefault: er, ZodCatch: tr, - ZodNaN: Nr, - BRAND: Gc, - ZodBranded: jn, + ZodNaN: Rr, + BRAND: zc, + ZodBranded: Fn, ZodPipeline: cr, ZodReadonly: rr, - custom: Fs, - Schema: N, - ZodSchema: N, - late: Vc, + custom: Ls, + Schema: O, + ZodSchema: O, + late: Bc, get ZodFirstPartyTypeKind() { - return A; + return C; }, - coerce: Pl, - any: Qc, - array: nl, - bigint: qc, - boolean: js, - date: Kc, - discriminatedUnion: il, - effect: _o, - enum: gl, - function: pl, - instanceof: Hc, - intersection: cl, - lazy: ml, - literal: hl, - map: dl, - nan: Wc, - nativeEnum: yl, - never: tl, - null: Xc, - nullable: bl, - number: Us, - object: ol, - oboolean: kl, + coerce: El, + any: Jc, + array: tl, + bigint: Hc, + boolean: Us, + date: Wc, + discriminatedUnion: sl, + effect: go, + enum: hl, + function: dl, + instanceof: Gc, + intersection: al, + lazy: fl, + literal: pl, + map: ll, + nan: Vc, + nativeEnum: ml, + never: Qc, + null: Yc, + nullable: _l, + number: Ds, + object: rl, + oboolean: Sl, onumber: xl, - optional: vl, - ostring: El, - pipeline: Sl, - preprocess: wl, - promise: _l, - record: ul, - set: fl, - strictObject: sl, - string: Ds, - symbol: Yc, - transformer: _o, - tuple: ll, - undefined: Jc, - union: al, - unknown: el, - void: rl, - NEVER: Tl, + optional: yl, + ostring: wl, + pipeline: bl, + preprocess: vl, + promise: gl, + record: cl, + set: ul, + strictObject: nl, + string: Fs, + symbol: qc, + transformer: go, + tuple: il, + undefined: Kc, + union: ol, + unknown: Xc, + void: el, + NEVER: kl, ZodIssueCode: g, - quotelessJson: Pc, - ZodError: he + quotelessJson: Ec, + ZodError: ge }); -const Al = q.object({ - width: q.number().positive(), - height: q.number().positive() -}); -function Il(t, e, r, n) { - const o = document.createElement("plugin-modal"); - o.setTheme(r); - const a = 200, i = 200, c = 335, l = 590, d = { - blockStart: 40, - inlineEnd: 320 - }; - o.style.setProperty( - "--modal-block-start", - `${d.blockStart}px` - ), o.style.setProperty( - "--modal-inline-end", - `${d.inlineEnd}px` - ); - const u = window.innerWidth - d.inlineEnd, f = window.innerHeight - d.blockStart; - let m = Math.min((n == null ? void 0 : n.width) || c, u), p = Math.min((n == null ? void 0 : n.height) || l, f); - return m = Math.max(m, a), p = Math.max(p, i), o.setAttribute("title", t), o.setAttribute("iframe-src", e), o.setAttribute("width", String(m)), o.setAttribute("height", String(p)), document.body.appendChild(o), o; -} -const Cl = q.function().args( - q.string(), - q.string(), - q.enum(["dark", "light"]), - Al.optional() -).implement((t, e, r, n) => Il(t, e, r, n)), $l = q.object({ +const Pl = q.object({ pluginId: q.string(), name: q.string(), host: q.string().url(), @@ -7786,25 +7771,119 @@ const Cl = q.function().args( ]) ) }); -function Zs(t, e) { +function js(t, e) { return new URL(e, t).toString(); } -function Nl(t) { +function Tl(t) { return fetch(t).then((e) => e.json()).then((e) => { - if (!$l.safeParse(e).success) + if (!Pl.safeParse(e).success) throw new Error("Invalid plugin manifest"); return e; }).catch((e) => { throw console.error(e), e; }); } -function vo(t) { - return !t.host && !t.code.startsWith("http") ? Promise.resolve(t.code) : fetch(Zs(t.host, t.code)).then((e) => { +function yo(t) { + return !t.host && !t.code.startsWith("http") ? Promise.resolve(t.code) : fetch(js(t.host, t.code)).then((e) => { if (e.ok) return e.text(); throw new Error("Failed to load plugin code"); }); } +const Il = q.object({ + width: q.number().positive(), + height: q.number().positive() +}); +function Al(t, e, r, n) { + const o = document.createElement("plugin-modal"); + o.setTheme(r); + const a = 200, i = 200, c = 335, l = 590, u = { + blockStart: 40, + inlineEnd: 320 + }; + o.style.setProperty( + "--modal-block-start", + `${u.blockStart}px` + ), o.style.setProperty( + "--modal-inline-end", + `${u.inlineEnd}px` + ); + const d = window.innerWidth - u.inlineEnd, f = window.innerHeight - u.blockStart; + let h = Math.min((n == null ? void 0 : n.width) || c, d), p = Math.min((n == null ? void 0 : n.height) || l, f); + return h = Math.max(h, a), p = Math.max(p, i), o.setAttribute("title", t), o.setAttribute("iframe-src", e), o.setAttribute("width", String(h)), o.setAttribute("height", String(p)), document.body.appendChild(o), o; +} +const Cl = q.function().args( + q.string(), + q.string(), + q.enum(["dark", "light"]), + Il.optional() +).implement((t, e, r, n) => Al(t, e, r, n)); +async function $l(t, e, r, n) { + let o = await yo(e), a = !1, i = !1, c = null, l = []; + const u = /* @__PURE__ */ new Set(), d = t.addListener("themechange", (A) => { + c == null || c.setTheme(A); + }), f = t.addListener("finish", () => { + m(), t == null || t.removeListener(f); + }); + let h = {}; + const p = () => { + t.removeListener(d), Object.entries(h).forEach(([, A]) => { + A.forEach((N) => { + E(N); + }); + }), l = [], h = {}; + }, m = () => { + p(), u.forEach(clearTimeout), u.clear(), c && (c.removeEventListener("close", m), c.remove(), c = null), i = !0, r(); + }, b = async () => { + if (!a) { + a = !0; + return; + } + p(), o = await yo(e), n(o); + }, S = (A, N, D) => { + const M = t.getTheme(), J = js(e.host, N); + (c == null ? void 0 : c.getAttribute("iframe-src")) !== J && (c = Cl(A, J, M, D), c.setTheme(M), c.addEventListener("close", m, { + once: !0 + }), c.addEventListener("load", b)); + }, x = (A) => { + l.push(A); + }, I = (A, N, D) => { + const M = t.addListener( + A, + (...J) => { + i || N(...J); + }, + D + ); + return h[A] || (h[A] = /* @__PURE__ */ new Map()), h[A].set(N, M), M; + }, E = (A, N) => { + let D; + typeof A == "symbol" ? D = A : N && (D = h[A].get(N)), D && t.removeListener(D); + }; + return { + close: m, + destroyListener: E, + openModal: S, + getModal: () => c, + registerListener: I, + registerMessageCallback: x, + sendMessage: (A) => { + l.forEach((N) => N(A)); + }, + get manifest() { + return e; + }, + get context() { + return t; + }, + get timeouts() { + return u; + }, + get code() { + return o; + } + }; +} const Rl = [ "finish", "pagechange", @@ -7814,284 +7893,272 @@ const Rl = [ "shapechange", "contentsave" ]; -let yn = [], _n = /* @__PURE__ */ new Set([]); -window.addEventListener("message", (t) => { - try { - for (const e of yn) - e(t.data); - } catch (e) { - console.error(e); - } -}); -function Ol(t) { - _n.forEach((e) => { - e.setTheme(t); - }); -} -function Ml(t, e, r, n) { - let o = null, a = {}; - const i = () => { - Object.entries(a).forEach(([, u]) => { - u.forEach((f) => { - t.removeListener(f); - }); - }), yn = []; - }, c = () => { - i(), o && (_n.delete(o), o.removeEventListener("close", c), o.remove()), o = null, r(); - }, l = (u) => { - if (!e.permissions.includes(u)) - throw new Error(`Permission ${u} is not granted`); +function Nl(t) { + const e = (n) => { + if (!t.manifest.permissions.includes(n)) + throw new Error(`Permission ${n} is not granted`); }; return { penpot: { ui: { - open: (u, f, m) => { - const p = t.getTheme(), h = Zs(e.host, f); - (o == null ? void 0 : o.getAttribute("iframe-src")) !== h && (o = Cl(u, h, p, m), o.setTheme(p), o.addEventListener("close", c, { - once: !0 - }), o.addEventListener("load", n), _n.add(o)); + open: (n, o, a) => { + t.openModal(n, o, a); }, - sendMessage(u) { - const f = new CustomEvent("message", { - detail: u + sendMessage(n) { + var a; + const o = new CustomEvent("message", { + detail: n }); - o == null || o.dispatchEvent(f); + (a = t.getModal()) == null || a.dispatchEvent(o); }, - onMessage: (u) => { - q.function().parse(u), yn.push(u); + onMessage: (n) => { + q.function().parse(n), t.registerMessageCallback(n); } }, utils: { geometry: { - center(u) { - return window.app.plugins.public_utils.centerShapes(u); + center(n) { + return window.app.plugins.public_utils.centerShapes(n); } }, types: { - isFrame(u) { - return u.type === "frame"; + isBoard(n) { + return n.type === "board"; }, - isGroup(u) { - return u.type === "group"; + isGroup(n) { + return n.type === "group"; }, - isMask(u) { - return u.type === "group" && u.isMask(); + isMask(n) { + return n.type === "group" && n.isMask(); }, - isBool(u) { - return u.type === "bool"; + isBool(n) { + return n.type === "boolean"; }, - isRectangle(u) { - return u.type === "rect"; + isRectangle(n) { + return n.type === "rectangle"; }, - isPath(u) { - return u.type === "path"; + isPath(n) { + return n.type === "path"; }, - isText(u) { - return u.type === "text"; + isText(n) { + return n.type === "text"; }, - isEllipse(u) { - return u.type === "circle"; + isEllipse(n) { + return n.type === "ellipse"; }, - isSVG(u) { - return u.type === "svg-raw"; + isSVG(n) { + return n.type === "svg-raw"; } } }, - closePlugin: c, - on(u, f, m) { - q.enum(Rl).parse(u), q.function().parse(f), l("content:read"); - const p = t.addListener(u, f, m); - return a[u] || (a[u] = /* @__PURE__ */ new Map()), a[u].set(f, p), p; + closePlugin: () => { + t.close(); }, - off(u, f) { - let m; - typeof u == "symbol" ? m = u : f && (m = a[u].get(f)), m && t.removeListener(m); + on(n, o, a) { + return q.enum(Rl).parse(n), q.function().parse(o), e("content:read"), t.registerListener(n, o, a); + }, + off(n, o) { + t.destroyListener(n, o); }, // Penpot State API get root() { - return l("content:read"), t.root; + return e("content:read"), t.context.root; }, get currentPage() { - return l("content:read"), t.currentPage; + return e("content:read"), t.context.currentPage; }, get selection() { - return l("content:read"), t.selection; + return e("content:read"), t.context.selection; }, - set selection(u) { - l("content:read"), t.selection = u; + set selection(n) { + e("content:read"), t.context.selection = n; }, get viewport() { - return t.viewport; + return t.context.viewport; }, get history() { - return t.history; + return t.context.history; }, get library() { - return l("library:read"), t.library; + return e("library:read"), t.context.library; }, get fonts() { - return l("content:read"), t.fonts; + return e("content:read"), t.context.fonts; }, get currentUser() { - return l("user:read"), t.currentUser; + return e("user:read"), t.context.currentUser; }, get activeUsers() { - return l("user:read"), t.activeUsers; + return e("user:read"), t.context.activeUsers; }, getFile() { - return l("content:read"), t.getFile(); + return e("content:read"), t.context.getFile(); }, getPage() { - return l("content:read"), t.getPage(); + return e("content:read"), t.context.getPage(); }, getSelected() { - return l("content:read"), t.getSelected(); + return e("content:read"), t.context.getSelected(); }, getSelectedShapes() { - return l("content:read"), t.getSelectedShapes(); + return e("content:read"), t.context.getSelectedShapes(); }, - shapesColors(u) { - return l("content:read"), t.shapesColors(u); + shapesColors(n) { + return e("content:read"), t.context.shapesColors(n); }, - replaceColor(u, f, m) { - return l("content:write"), t.replaceColor(u, f, m); + replaceColor(n, o, a) { + return e("content:write"), t.context.replaceColor(n, o, a); }, getTheme() { - return t.getTheme(); + return t.context.getTheme(); }, - createFrame() { - return l("content:write"), t.createFrame(); + createBoard() { + return e("content:write"), t.context.createBoard(); }, createRectangle() { - return l("content:write"), t.createRectangle(); + return e("content:write"), t.context.createRectangle(); }, createEllipse() { - return l("content:write"), t.createEllipse(); + return e("content:write"), t.context.createEllipse(); }, - createText(u) { - return l("content:write"), t.createText(u); + createText(n) { + return e("content:write"), t.context.createText(n); }, createPath() { - return l("content:write"), t.createPath(); + return e("content:write"), t.context.createPath(); }, - createBoolean(u, f) { - return l("content:write"), t.createBoolean(u, f); + createBoolean(n, o) { + return e("content:write"), t.context.createBoolean(n, o); }, - createShapeFromSvg(u) { - return l("content:write"), t.createShapeFromSvg(u); + createShapeFromSvg(n) { + return e("content:write"), t.context.createShapeFromSvg(n); }, - group(u) { - return l("content:write"), t.group(u); + group(n) { + return e("content:write"), t.context.group(n); }, - ungroup(u, ...f) { - l("content:write"), t.ungroup(u, ...f); + ungroup(n, ...o) { + e("content:write"), t.context.ungroup(n, ...o); }, - uploadMediaUrl(u, f) { - return l("content:write"), t.uploadMediaUrl(u, f); + uploadMediaUrl(n, o) { + return e("content:write"), t.context.uploadMediaUrl(n, o); }, - uploadMediaData(u, f, m) { - return l("content:write"), t.uploadMediaData(u, f, m); + uploadMediaData(n, o, a) { + return e("content:write"), t.context.uploadMediaData(n, o, a); }, - generateMarkup(u, f) { - return l("content:read"), t.generateMarkup(u, f); + generateMarkup(n, o) { + return e("content:read"), t.context.generateMarkup(n, o); }, - generateStyle(u, f) { - return l("content:read"), t.generateStyle(u, f); + generateStyle(n, o) { + return e("content:read"), t.context.generateStyle(n, o); }, openViewer() { - l("content:read"), t.openViewer(); + e("content:read"), t.context.openViewer(); }, createPage() { - return l("content:write"), t.createPage(); + return e("content:write"), t.context.createPage(); }, - openPage(u) { - l("content:read"), t.openPage(u); + openPage(n) { + e("content:read"), t.context.openPage(n); } - }, - removeAllEventListeners: i + } }; } -let bo = !1; +let _o = !1; const Ke = { hardenIntrinsics: () => { - bo || (bo = !0, hardenIntrinsics()); + _o || (_o = !0, hardenIntrinsics()); }, createCompartment: (t) => new Compartment(t), harden: (t) => harden(t) }; -let wt = []; -const Ll = !1; -let vn = null; -function Fl(t) { - vn = t; +function Ol(t) { + Ke.hardenIntrinsics(); + const e = Nl(t), r = { + penpot: Ke.harden(e.penpot), + fetch: Ke.harden((...o) => { + const a = { + ...o[1], + credentials: "omit" + }; + return fetch(o[0], a); + }), + console: Ke.harden(window.console), + Math: Ke.harden(Math), + setTimeout: Ke.harden( + (...[o, a]) => { + const i = setTimeout(() => { + o(); + }, a); + return t.timeouts.add(i), i; + } + ), + clearTimeout: Ke.harden((o) => { + clearTimeout(o), t.timeouts.delete(o); + }) + }, n = Ke.createCompartment(r); + return { + evaluate: () => { + n.evaluate(t.code); + }, + cleanGlobalThis: () => { + Object.keys(r).forEach((o) => { + delete n.globalThis[o]; + }); + }, + compartment: n + }; } -const on = () => { - wt.forEach((t) => { - t.penpot.closePlugin(); - }), wt = []; -}, Dl = async function(t) { +async function Ml(t, e, r) { + const n = await $l( + t, + e, + function() { + o.cleanGlobalThis(), r(); + }, + function() { + o.evaluate(); + } + ), o = Ol(n); + return o.evaluate(), { + plugin: n, + compartment: o + }; +} +let Pt = [], gn = null; +function Ll(t) { + gn = t; +} +const vo = () => { + Pt.forEach((t) => { + t.plugin.close(); + }), Pt = []; +}; +window.addEventListener("message", (t) => { try { - const e = vn && vn(t.pluginId); + for (const e of Pt) + e.plugin.sendMessage(t.data); + } catch (e) { + console.error(e); + } +}); +const Fl = async function(t) { + try { + const e = gn && gn(t.pluginId); if (!e) return; - e.addListener("themechange", (f) => Ol(f)); - const r = e.addListener("finish", () => { - on(), e == null || e.removeListener(r); - }), n = await vo(t); - Ke.hardenIntrinsics(), wt && !Ll && on(); - const o = () => { - wt = wt.filter((f) => f !== c), l.forEach(clearTimeout), l.clear(), Object.keys(d).forEach((f) => { - delete u.globalThis[f]; - }); - }; - let a = !1; - const c = Ml(e, t, o, async () => { - if (!a) { - a = !0; - return; - } - c.removeAllEventListeners(); - const f = await vo(t); - u.evaluate(f); + vo(); + const r = await Ml(e, t, () => { + Pt = Pt.filter((n) => n !== r); }); - wt.push(c); - const l = /* @__PURE__ */ new Set(), d = { - penpot: Ke.harden(c.penpot), - fetch: Ke.harden((...f) => { - const m = { - ...f[1], - credentials: "omit" - }; - return fetch(f[0], m); - }), - console: Ke.harden(window.console), - Math: Ke.harden(Math), - setTimeout: Ke.harden( - (...[f, m]) => { - const p = setTimeout(() => { - f(); - }, m); - return l.add(p), p; - } - ), - clearTimeout: Ke.harden((f) => { - clearTimeout(f), l.delete(f); - }) - }, u = Ke.createCompartment(d); - return u.evaluate(n), { - compartment: u, - publicPluginApi: d, - timeouts: l, - context: e - }; + Pt.push(r); } catch (e) { - on(), console.error(e); + vo(), console.error(e); } -}, zs = async function(t) { - Dl(t); -}, Ul = async function(t) { - const e = await Nl(t); - zs(e); +}, Zs = async function(t) { + Fl(t); +}, Dl = async function(t) { + const e = await Tl(t); + Zs(e); }; console.log("%c[PLUGINS] Loading plugin system", "color: #008d7c"); repairIntrinsics({ @@ -8101,10 +8168,10 @@ repairIntrinsics({ consoleTaming: "unsafe", errorTrapping: "none" }); -const wo = globalThis; -wo.initPluginsRuntime = (t) => { +const bo = globalThis; +bo.initPluginsRuntime = (t) => { try { - console.log("%c[PLUGINS] Initialize runtime", "color: #008d7c"), Fl(t), wo.ɵcontext = t("TEST"), globalThis.ɵloadPlugin = zs, globalThis.ɵloadPluginByUrl = Ul; + console.log("%c[PLUGINS] Initialize runtime", "color: #008d7c"), Ll(t), bo.ɵcontext = t("TEST"), globalThis.ɵloadPlugin = Zs, globalThis.ɵloadPluginByUrl = Dl; } catch (e) { console.error(e); } -- Gitee From 8d66275187a58780af320cb80d77e4a29d99ad5f Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Wed, 4 Sep 2024 12:51:30 +0200 Subject: [PATCH 1238/1266] :bug: Fix webhook checkbox position --- CHANGES.md | 1 + frontend/src/app/main/ui/dashboard/team.scss | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 47282e744..2667f4c75 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -71,6 +71,7 @@ ### :bug: Bugs fixed +- Fix webhook checkbox position [Taiga #8634](https://tree.taiga.io/project/penpot/issue/8634) - Fix wrong props on padding input [Taiga #8254](https://tree.taiga.io/project/penpot/issue/8254) - Fix fill collapsed options [Taiga #8351](https://tree.taiga.io/project/penpot/issue/8351) - Fix scroll on color picker modal [Taiga #8353](https://tree.taiga.io/project/penpot/issue/8353) diff --git a/frontend/src/app/main/ui/dashboard/team.scss b/frontend/src/app/main/ui/dashboard/team.scss index d914ea773..d606c4053 100644 --- a/frontend/src/app/main/ui/dashboard/team.scss +++ b/frontend/src/app/main/ui/dashboard/team.scss @@ -519,8 +519,10 @@ @include bodySmallTypography; color: var(--modal-title-foreground-color); } - -.custom-input-checkbox { +// TODO: This fix is temporary, the error is caused by the +// cascading order of the compiled css files. +// https://tree.taiga.io/project/penpot/task/8658 +.custom-input-checkbox.custom-input-checkbox { align-items: flex-start; } -- Gitee From a63ded1ba1927b1f8ca86b6332c0f93247f2cb02 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 4 Sep 2024 12:38:17 +0200 Subject: [PATCH 1239/1266] :sparkles: Change type names in plugins --- frontend/src/app/config.cljs | 2 +- frontend/src/app/plugins/api.cljs | 2 +- frontend/src/app/plugins/format.cljs | 124 ++++++++++-------- frontend/src/app/plugins/parser.cljs | 121 +++++++++-------- frontend/src/app/plugins/shape.cljs | 21 ++- .../plugins/context_shapes_test.cljs | 26 ++-- 6 files changed, 164 insertions(+), 132 deletions(-) diff --git a/frontend/src/app/config.cljs b/frontend/src/app/config.cljs index 58d702f8b..72bbb4d00 100644 --- a/frontend/src/app/config.cljs +++ b/frontend/src/app/config.cljs @@ -110,7 +110,7 @@ (def privacy-policy-uri (obj/get global "penpotPrivacyPolicyURI" "https://penpot.app/privacy")) (def flex-help-uri (obj/get global "penpotGridHelpURI" "https://help.penpot.app/user-guide/flexible-layouts/")) (def grid-help-uri (obj/get global "penpotGridHelpURI" "https://help.penpot.app/user-guide/flexible-layouts/")) -(def plugins-list-uri (obj/get global "penpotPluginsListUri" "https://penpot-docs-plugins.pages.dev/technical-guide/plugins/getting-started/#examples")) +(def plugins-list-uri (obj/get global "penpotPluginsListUri" "https://penpot-docs-plugins.pages.dev/plugins/getting-started/#examples")) (defn- normalize-uri [uri-str] diff --git a/frontend/src/app/plugins/api.cljs b/frontend/src/app/plugins/api.cljs index cefacb0af..a7f52d164 100644 --- a/frontend/src/app/plugins/api.cljs +++ b/frontend/src/app/plugins/api.cljs @@ -227,7 +227,7 @@ ids (into #{} (map #(obj/get % "$id")) shapes)] (st/emit! (dwg/ungroup-shapes ids))))) - (createFrame + (createBoard [_] (create-shape $plugin :frame)) diff --git a/frontend/src/app/plugins/format.cljs b/frontend/src/app/plugins/format.cljs index b734decad..fce9ea6b4 100644 --- a/frontend/src/app/plugins/format.cljs +++ b/frontend/src/app/plugins/format.cljs @@ -31,14 +31,22 @@ "mixed" value)) -;; export type PenpotPoint = { x: number; y: number }; +;; export type Point = { x: number; y: number }; (defn format-point [{:keys [x y] :as point}] (when (some? point) (obj/without-empty #js {:x x :y y}))) -;;export type PenpotBounds = { +(defn shape-type + [type] + (case type + :frame "board" + :rect "rectangle" + :circle "ellipse" + (d/name type))) + +;;export type Bounds = { ;; x: number; ;; y: number; ;; width: number; @@ -50,7 +58,7 @@ (obj/without-empty #js {:x x :y y :width width :height height}))) -;; export interface PenpotColorShapeInfoEntry { +;; export interface ColorShapeInfoEntry { ;; readonly property: string; ;; readonly index?: number; ;; readonly shapeId: string; @@ -63,7 +71,7 @@ :index index :shapeId (dm/str shape-id)}))) -;; export type PenpotGradient = { +;; export type Gradient = { ;; type: 'linear' | 'radial'; ;; startX: number; ;; startY: number; @@ -89,7 +97,7 @@ :width width :stops (format-array format-stop stops)}))) -;; export type PenpotImageData = { +;; export type ImageData = { ;; name?: string; ;; width: number; ;; height: number; @@ -108,7 +116,7 @@ :id (format-id id) :keepAspectRatio keep-aspect-ratio}))) -;; export interface PenpotColor { +;; export interface Color { ;; id?: string; ;; name?: string; ;; path?: string; @@ -116,8 +124,8 @@ ;; opacity?: number; ;; refId?: string; ;; refFile?: string; -;; gradient?: PenpotGradient; -;; image?: PenpotImageData; +;; gradient?: Gradient; +;; image?: ImageData; ;; } (defn format-color [{:keys [id name path color opacity ref-id ref-file gradient image] :as color-data}] @@ -133,7 +141,7 @@ :gradient (format-gradient gradient) :image (format-image image)}))) -;; PenpotColor & PenpotColorShapeInfo +;; Color & ColorShapeInfo (defn format-color-result [[color attrs]] (let [shapes-info (apply array (map format-shape-info attrs)) @@ -142,7 +150,7 @@ color)) -;; export interface PenpotShadow { +;; export interface Shadow { ;; id?: string; ;; style?: 'drop-shadow' | 'inner-shadow'; ;; offsetX?: number; @@ -150,7 +158,7 @@ ;; blur?: number; ;; spread?: number; ;; hidden?: boolean; -;; color?: PenpotColor; +;; color?: Color; ;; } (defn format-shadow [{:keys [id style offset-x offset-y blur spread hidden color] :as shadow}] @@ -170,13 +178,13 @@ (when (some? shadows) (format-array format-shadow shadows))) -;;export interface PenpotFill { +;;export interface Fill { ;; fillColor?: string; ;; fillOpacity?: number; -;; fillColorGradient?: PenpotGradient; +;; fillColorGradient?: Gradient; ;; fillColorRefFile?: string; ;; fillColorRefId?: string; -;; fillImage?: PenpotImageData; +;; fillImage?: ImageData; ;;} (defn format-fill [{:keys [fill-color fill-opacity fill-color-gradient fill-color-ref-file fill-color-ref-id fill-image] :as fill}] @@ -201,7 +209,7 @@ (some? fills) (format-array format-fill fills))) -;; export interface PenpotStroke { +;; export interface Stroke { ;; strokeColor?: string; ;; strokeColorRefFile?: string; ;; strokeColorRefId?: string; @@ -209,9 +217,9 @@ ;; strokeStyle?: 'solid' | 'dotted' | 'dashed' | 'mixed' | 'none' | 'svg'; ;; strokeWidth?: number; ;; strokeAlignment?: 'center' | 'inner' | 'outer'; -;; strokeCapStart?: PenpotStrokeCap; -;; strokeCapEnd?: PenpotStrokeCap; -;; strokeColorGradient?: PenpotGradient; +;; strokeCapStart?: StrokeCap; +;; strokeCapEnd?: StrokeCap; +;; strokeColorGradient?: Gradient; ;; } (defn format-stroke [{:keys [stroke-color stroke-color-ref-file stroke-color-ref-id @@ -236,7 +244,7 @@ (when (some? strokes) (format-array format-stroke strokes))) -;; export interface PenpotBlur { +;; export interface Blur { ;; id?: string; ;; type?: 'layer-blur'; ;; value?: number; @@ -251,7 +259,7 @@ :value value :hidden hidden}))) -;; export interface PenpotExport { +;; export interface Export { ;; type: 'png' | 'jpeg' | 'svg' | 'pdf'; ;; scale: number; ;; suffix: string; @@ -269,7 +277,7 @@ (when (some? exports) (format-array format-export exports))) -;; export interface PenpotFrameGuideColumnParams { +;; export interface GuideColumnParams { ;; color: { color: string; opacity: number }; ;; type?: 'stretch' | 'left' | 'center' | 'right'; ;; size?: number; @@ -288,10 +296,10 @@ :itemLength item-length :gutter gutter}))) -;; export interface PenpotFrameGuideColumn { +;; export interface GuideColumn { ;; type: 'column'; ;; display: boolean; -;; params: PenpotFrameGuideColumnParams; +;; params: GuideColumnParams; ;; } (defn format-frame-guide-column [{:keys [type display params] :as guide}] @@ -301,10 +309,10 @@ :display display :params (format-frame-guide-column-params params)}))) -;; export interface PenpotFrameGuideRow { +;; export interface GuideRow { ;; type: 'row'; ;; display: boolean; -;; params: PenpotFrameGuideColumnParams; +;; params: GuideColumnParams; ;; } (defn format-frame-guide-row [{:keys [type display params] :as guide}] @@ -314,7 +322,7 @@ :display display :params (format-frame-guide-column-params params)}))) -;;export interface PenpotFrameGuideSquareParams { +;;export interface GuideSquareParams { ;; color: { color: string; opacity: number }; ;; size?: number; ;;} @@ -325,10 +333,10 @@ #js {:color (format-color color) :size size}))) -;; export interface PenpotFrameGuideSquare { +;; export interface GuideSquare { ;; type: 'square'; ;; display: boolean; -;; params: PenpotFrameGuideSquareParams; +;; params: GuideSquareParams; ;; } (defn format-frame-guide-square @@ -352,7 +360,7 @@ (when (some? guides) (format-array format-frame-guide guides))) -;;interface PenpotPathCommand { +;;interface PathCommand { ;; command: ;; | 'M' | 'move-to' ;; | 'Z' | 'close-path' @@ -407,10 +415,10 @@ (when (some? content) (format-array format-command content))) -;; export type PenpotTrackType = 'flex' | 'fixed' | 'percent' | 'auto'; +;; export type TrackType = 'flex' | 'fixed' | 'percent' | 'auto'; ;; -;; export interface PenpotTrack { -;; type: PenpotTrackType; +;; export interface Track { +;; type: TrackType; ;; value: number | null; ;; } (defn format-track @@ -426,13 +434,13 @@ (format-array format-track tracks))) -;; export interface PenpotDissolve { +;; export interface Dissolve { ;; type: 'dissolve'; ;; duration: number; ;; easing?: 'linear' | 'ease' | 'ease-in' | 'ease-out' | 'ease-in-out'; ;; } ;; -;; export interface PenpotSlide { +;; export interface Slide { ;; type: 'slide'; ;; way: 'in' | 'out'; ;; direction?: @@ -445,7 +453,7 @@ ;; easing?: 'linear' | 'ease' | 'ease-in' | 'ease-out' | 'ease-in-out'; ;; } ;; -;; export interface PenpotPush { +;; export interface Push { ;; type: 'push'; ;; direction?: ;; | 'right' @@ -457,7 +465,7 @@ ;; easing?: 'linear' | 'ease' | 'ease-in' | 'ease-out' | 'ease-in-out'; ;; } ;; -;; export type PenpotAnimation = PenpotDissolve | PenpotSlide | PenpotPush; +;; export type Animation = Dissolve | Slide | Push; (defn format-animation [animation] @@ -485,24 +493,24 @@ :easing (format-key (:easing animation))} nil)))) -;;export type PenpotAction = -;; | PenpotNavigateTo -;; | PenpotOpenOverlay -;; | PenpotToggleOverlay -;; | PenpotCloseOverlay -;; | PenpotPreviousScreen -;; | PenpotOpenUrl; +;;export type Action = +;; | NavigateTo +;; | OpenOverlay +;; | ToggleOverlay +;; | CloseOverlay +;; | PreviousScreen +;; | OpenUrl; ;; -;;export interface PenpotNavigateTo { +;;export interface NavigateTo { ;; type: 'navigate-to'; -;; destination: PenpotFrame; +;; destination: Board; ;; preserveScrollPosition?: boolean; -;; animation: PenpotAnimation; +;; animation: Animation; ;;} ;; -;;export interface PenpotOverlayAction { -;; destination: PenpotFrame; -;; relativeTo?: PenpotShape; +;;export interface OverlayAction { +;; destination: Board; +;; relativeTo?: Shape; ;; position?: ;; | 'manual' ;; | 'center' @@ -512,31 +520,31 @@ ;; | 'bottom-left' ;; | 'bottom-right' ;; | 'bottom-center'; -;; manualPositionLocation?: PenpotPoint; +;; manualPositionLocation?: Point; ;; closeWhenClickOutside?: boolean; ;; addBackgroundOverlay?: boolean; -;; animation: PenpotAnimation; +;; animation: Animation; ;;} ;; -;;export interface PenpotOpenOverlay extends PenpotOverlayAction { +;;export interface OpenOverlay extends OverlayAction { ;; type: 'open-overlay'; ;;} ;; -;;export interface PenpotToggleOverlay extends PenpotOverlayAction { +;;export interface ToggleOverlay extends OverlayAction { ;; type: 'toggle-overlay'; ;;} ;; -;;export interface PenpotCloseOverlay { +;;export interface CloseOverlay { ;; type: 'close-overlay'; -;; destination?: PenpotFrame; -;; animation: PenpotAnimation; +;; destination?: Board; +;; animation: Animation; ;;} ;; -;;export interface PenpotPreviousScreen { +;;export interface PreviousScreen { ;; type: 'previous-screen'; ;;} ;; -;;export interface PenpotOpenUrl { +;;export interface OpenUrl { ;; type: 'open-url'; ;; url: string; ;;} diff --git a/frontend/src/app/plugins/parser.cljs b/frontend/src/app/plugins/parser.cljs index 460c21b1e..119c71bd3 100644 --- a/frontend/src/app/plugins/parser.cljs +++ b/frontend/src/app/plugins/parser.cljs @@ -29,17 +29,26 @@ {:x (obj/get point "x") :y (obj/get point "y")})) +(defn parse-shape-type + [type] + (case type + "board" :frame + "boolean" :bool + "rectangle" :rect + "ellipse" :circle + (parse-keyword type))) + ;; { ;; name?: string; ;; nameLike?: string; ;; type?: -;; | 'frame' +;; | 'board' ;; | 'group' -;; | 'bool' -;; | 'rect' +;; | 'boolean' +;; | 'rectangle' ;; | 'path' ;; | 'text' -;; | 'circle' +;; | 'ellipse' ;; | 'svg-raw' ;; | 'image'; ;; } @@ -49,9 +58,9 @@ (d/without-nils {:name (obj/get criteria "name") :name-like (obj/get criteria "nameLike") - :type (-> (obj/get criteria "type") parse-keyword)}))) + :type (-> (obj/get criteria "type") parse-shape-type)}))) -;;export type PenpotImageData = { +;;export type ImageData = { ;; name?: string; ;; width: number; ;; height: number; @@ -70,7 +79,7 @@ :mtype (obj/get image-data "mtype") :keep-aspect-ratio (obj/get image-data "keepApectRatio")}))) -;; export type PenpotGradient = { +;; export type Gradient = { ;; type: 'linear' | 'radial'; ;; startX: number; ;; startY: number; @@ -100,7 +109,7 @@ :stops (->> (obj/get gradient "stops") (mapv parse-gradient-stop))}))) -;; export interface PenpotColor { +;; export interface Color { ;; id?: string; ;; name?: string; ;; path?: string; @@ -108,8 +117,8 @@ ;; opacity?: number; ;; refId?: string; ;; refFile?: string; -;; gradient?: PenpotGradient; -;; image?: PenpotImageData; +;; gradient?: Gradient; +;; image?: ImageData; ;; } (defn parse-color [^js color] @@ -125,7 +134,7 @@ :gradient (-> (obj/get color "gradient") parse-gradient) :image (-> (obj/get color "image") parse-image-data)}))) -;; export interface PenpotShadow { +;; export interface Shadow { ;; id?: string; ;; style?: 'drop-shadow' | 'inner-shadow'; ;; offsetX?: number; @@ -133,7 +142,7 @@ ;; blur?: number; ;; spread?: number; ;; hidden?: boolean; -;; color?: PenpotColor; +;; color?: Color; ;; } (defn parse-shadow [^js shadow] @@ -153,13 +162,13 @@ (when (some? shadows) (into [] (map parse-shadow) shadows))) -;;export interface PenpotFill { +;;export interface Fill { ;; fillColor?: string; ;; fillOpacity?: number; -;; fillColorGradient?: PenpotGradient; +;; fillColorGradient?: Gradient; ;; fillColorRefFile?: string; ;; fillColorRefId?: string; -;; fillImage?: PenpotImageData; +;; fillImage?: ImageData; ;;} (defn parse-fill [^js fill] @@ -177,7 +186,7 @@ (when (some? fills) (into [] (map parse-fill) fills))) -;; export interface PenpotStroke { +;; export interface Stroke { ;; strokeColor?: string; ;; strokeColorRefFile?: string; ;; strokeColorRefId?: string; @@ -185,9 +194,9 @@ ;; strokeStyle?: 'solid' | 'dotted' | 'dashed' | 'mixed' | 'none' | 'svg'; ;; strokeWidth?: number; ;; strokeAlignment?: 'center' | 'inner' | 'outer'; -;; strokeCapStart?: PenpotStrokeCap; -;; strokeCapEnd?: PenpotStrokeCap; -;; strokeColorGradient?: PenpotGradient; +;; strokeCapStart?: StrokeCap; +;; strokeCapEnd?: StrokeCap; +;; strokeColorGradient?: Gradient; ;; } (defn parse-stroke [^js stroke] @@ -209,7 +218,7 @@ (when (some? strokes) (into [] (map parse-stroke) strokes))) -;; export interface PenpotBlur { +;; export interface Blur { ;; id?: string; ;; type?: 'layer-blur'; ;; value?: number; @@ -225,7 +234,7 @@ :hidden (obj/get blur "hidden")}))) -;; export interface PenpotExport { +;; export interface Export { ;; type: 'png' | 'jpeg' | 'svg' | 'pdf'; ;; scale: number; ;; suffix: string; @@ -243,7 +252,7 @@ (when (some? exports) (into [] (map parse-export) exports))) -;; export interface PenpotFrameGuideColumnParams { +;; export interface GuideColumnParams { ;; color: { color: string; opacity: number }; ;; type?: 'stretch' | 'left' | 'center' | 'right'; ;; size?: number; @@ -262,10 +271,10 @@ :item-length (obj/get params "itemLength") :gutter (obj/get params "gutter")}))) -;; export interface PenpotFrameGuideColumn { +;; export interface GuideColumn { ;; type: 'column'; ;; display: boolean; -;; params: PenpotFrameGuideColumnParams; +;; params: GuideColumnParams; ;; } (defn parse-frame-guide-column [^js guide] @@ -275,10 +284,10 @@ :display (obj/get guide "display") :params (-> (obj/get guide "params") parse-frame-guide-column-params)}))) -;; export interface PenpotFrameGuideRow { +;; export interface GuideRow { ;; type: 'row'; ;; display: boolean; -;; params: PenpotFrameGuideColumnParams; +;; params: GuideColumnParams; ;; } (defn parse-frame-guide-row @@ -289,7 +298,7 @@ :display (obj/get guide "display") :params (-> (obj/get guide "params") parse-frame-guide-column-params)}))) -;;export interface PenpotFrameGuideSquareParams { +;;export interface GuideSquareParams { ;; color: { color: string; opacity: number }; ;; size?: number; ;;} @@ -300,10 +309,10 @@ {:color (-> (obj/get params "color") parse-color) :size (obj/get params "size")}))) -;; export interface PenpotFrameGuideSquare { +;; export interface GuideSquare { ;; type: 'square'; ;; display: boolean; -;; params: PenpotFrameGuideSquareParams; +;; params: GuideSquareParams; ;; } (defn parse-frame-guide-square [^js guide] @@ -331,7 +340,7 @@ (when (some? guides) (into [] (map parse-frame-guide) guides))) -;;interface PenpotPathCommand { +;;interface PathCommand { ;; command: ;; | 'M' | 'move-to' ;; | 'Z' | 'close-path' @@ -401,13 +410,13 @@ (when (some? content) (into [] (map parse-command) content))) -;; export interface PenpotDissolve { +;; export interface Dissolve { ;; type: 'dissolve'; ;; duration: number; ;; easing?: 'linear' | 'ease' | 'ease-in' | 'ease-out' | 'ease-in-out'; ;; } ;; -;; export interface PenpotSlide { +;; export interface Slide { ;; type: 'slide'; ;; way: 'in' | 'out'; ;; direction?: @@ -420,7 +429,7 @@ ;; easing?: 'linear' | 'ease' | 'ease-in' | 'ease-out' | 'ease-in-out'; ;; } ;; -;; export interface PenpotPush { +;; export interface Push { ;; type: 'push'; ;; direction?: ;; | 'right' @@ -432,7 +441,7 @@ ;; easing?: 'linear' | 'ease' | 'ease-in' | 'ease-out' | 'ease-in-out'; ;; } ;; -;; export type PenpotAnimation = PenpotDissolve | PenpotSlide | PenpotPush; +;; export type Animation = Dissolve | Slide | Push; (defn parse-animation [^js animation] @@ -461,24 +470,24 @@ nil))))) -;;export type PenpotAction = -;; | PenpotNavigateTo -;; | PenpotOpenOverlay -;; | PenpotToggleOverlay -;; | PenpotCloseOverlay -;; | PenpotPreviousScreen -;; | PenpotOpenUrl; +;;export type Action = +;; | NavigateTo +;; | OpenOverlay +;; | ToggleOverlay +;; | CloseOverlay +;; | PreviousScreen +;; | OpenUrl; ;; -;;export interface PenpotNavigateTo { +;;export interface NavigateTo { ;; type: 'navigate-to'; -;; destination: PenpotFrame; +;; destination: Board; ;; preserveScrollPosition?: boolean; -;; animation: PenpotAnimation; +;; animation: Animation; ;;} ;; -;;export interface PenpotOverlayAction { -;; destination: PenpotFrame; -;; relativeTo?: PenpotShape; +;;export interface OverlayAction { +;; destination: Board; +;; relativeTo?: Shape; ;; position?: ;; | 'manual' ;; | 'center' @@ -488,31 +497,31 @@ ;; | 'bottom-left' ;; | 'bottom-right' ;; | 'bottom-center'; -;; manualPositionLocation?: PenpotPoint; +;; manualPositionLocation?: Point; ;; closeWhenClickOutside?: boolean; ;; addBackgroundOverlay?: boolean; -;; animation: PenpotAnimation; +;; animation: Animation; ;;} ;; -;;export interface PenpotOpenOverlay extends PenpotOverlayAction { +;;export interface OpenOverlay extends OverlayAction { ;; type: 'open-overlay'; ;;} ;; -;;export interface PenpotToggleOverlay extends PenpotOverlayAction { +;;export interface ToggleOverlay extends OverlayAction { ;; type: 'toggle-overlay'; ;;} ;; -;;export interface PenpotCloseOverlay { +;;export interface CloseOverlay { ;; type: 'close-overlay'; -;; destination?: PenpotFrame; -;; animation: PenpotAnimation; +;; destination?: Board; +;; animation: Animation; ;;} ;; -;;export interface PenpotPreviousScreen { +;;export interface PreviousScreen { ;; type: 'previous-screen'; ;;} ;; -;;export interface PenpotOpenUrl { +;;export interface OpenUrl { ;; type: 'open-url'; ;; url: string; ;;} diff --git a/frontend/src/app/plugins/shape.cljs b/frontend/src/app/plugins/shape.cljs index a6a1730be..f853116e6 100644 --- a/frontend/src/app/plugins/shape.cljs +++ b/frontend/src/app/plugins/shape.cljs @@ -605,7 +605,7 @@ :get #(-> % u/proxy->shape :id str)} {:name "type" - :get #(-> % u/proxy->shape :type d/name)} + :get #(-> % u/proxy->shape :type format/shape-type)} {:name "name" :get #(-> % u/proxy->shape :name) @@ -656,6 +656,21 @@ (let [id (obj/get self "$id")] (st/emit! (dwsh/update-shapes [id] #(assoc % :hidden value))))))} + {:name "visible" + :get #(-> % u/proxy->shape :hidden boolean not) + :set + (fn [self value] + (cond + (not (boolean? value)) + (u/display-not-valid :visible value) + + (not (r/check-permission plugin-id "content:write")) + (u/display-not-valid :visible "Plugin doesn't have 'content:write' permission") + + :else + (let [id (obj/get self "$id")] + (st/emit! (dwsh/update-shapes [id] #(assoc % :hidden (not value)))))))} + {:name "proportionLock" :get #(-> % u/proxy->shape :proportion-lock boolean) :set @@ -972,7 +987,7 @@ parent-y (:y parent)] (st/emit! (dw/update-position id {:y (+ parent-y value)})))))} - {:name "frameX" + {:name "boardX" :get (fn [self] (let [shape (u/proxy->shape self) frame-id (:parent-id shape) @@ -995,7 +1010,7 @@ frame-x (:x frame)] (st/emit! (dw/update-position id {:x (+ frame-x value)})))))} - {:name "frameY" + {:name "boardY" :get (fn [self] (let [shape (u/proxy->shape self) frame-id (:parent-id shape) diff --git a/frontend/test/frontend_tests/plugins/context_shapes_test.cljs b/frontend/test/frontend_tests/plugins/context_shapes_test.cljs index af6638b82..9a67f4a18 100644 --- a/frontend/test/frontend_tests/plugins/context_shapes_test.cljs +++ b/frontend/test/frontend_tests/plugins/context_shapes_test.cljs @@ -223,22 +223,22 @@ (t/is (= (-> (. shape -strokes) (aget 0) (aget "strokeWidth")) 5)))) (t/testing "Relative properties" - (let [frame (.createFrame context)] - (set! (.-x frame) 100) - (set! (.-y frame) 200) - (t/is (= (.-x frame) 100)) - (t/is (= (.-y frame) 200)) - (.appendChild frame shape) - - (t/testing " - frameX" - (set! (.-frameX shape) 10) - (t/is (m/close? (.-frameX shape) 10)) + (let [board (.createBoard context)] + (set! (.-x board) 100) + (set! (.-y board) 200) + (t/is (= (.-x board) 100)) + (t/is (= (.-y board) 200)) + (.appendChild board shape) + + (t/testing " - boardX" + (set! (.-boardX shape) 10) + (t/is (m/close? (.-boardX shape) 10)) (t/is (m/close? (.-x shape) 110)) (t/is (m/close? (get-in @store (get-shape-path :x)) 110))) - (t/testing " - frameY" - (set! (.-frameY shape) 20) - (t/is (m/close? (.-frameY shape) 20)) + (t/testing " - boardY" + (set! (.-boardY shape) 20) + (t/is (m/close? (.-boardY shape) 20)) (t/is (m/close? (.-y shape) 220)) (t/is (m/close? (get-in @store (get-shape-path :y)) 220))) -- Gitee From 762a883b399938b076020932f1ee74acaf741ec1 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 4 Sep 2024 13:52:48 +0200 Subject: [PATCH 1240/1266] :bug: Fix problem with font weight and style --- frontend/src/app/plugins/text.cljs | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/plugins/text.cljs b/frontend/src/app/plugins/text.cljs index bdcc67b04..d2343310a 100644 --- a/frontend/src/app/plugins/text.cljs +++ b/frontend/src/app/plugins/text.cljs @@ -175,7 +175,12 @@ :set (fn [self value] (let [font (fonts/get-font-data (obj/get self "fontId")) - variant (fonts/find-variant font {:weight (dm/str value)})] + weight (dm/str value) + style (obj/get self "fontStyle") + variant + (or + (fonts/find-variant font {:style style :weight weight}) + (fonts/find-variant font {:weight weight}))] (cond (nil? variant) (u/display-not-valid :fontWeight (dm/str "Font weight '" value "' not supported for the current font")) @@ -193,7 +198,12 @@ :set (fn [self value] (let [font (fonts/get-font-data (obj/get self "fontId")) - variant (fonts/find-variant font {:style (dm/str value)})] + style (dm/str value) + weight (obj/get self "fontWeight") + variant + (or + (fonts/find-variant font {:weight weight :style style}) + (fonts/find-variant font {:style style}))] (cond (nil? variant) (u/display-not-valid :fontStyle (dm/str "Font style '" value "' not supported for the current font")) @@ -439,7 +449,12 @@ (fn [self value] (let [id (obj/get self "$id") font (fonts/get-font-data (obj/get self "fontId")) - variant (fonts/find-variant font {:weight (dm/str value)})] + weight (dm/str value) + style (obj/get self "fontStyle") + variant + (or + (fonts/find-variant font {:style style :weight weight}) + (fonts/find-variant font {:weight weight}))] (cond (nil? variant) (u/display-not-valid :fontWeight (dm/str "Font weight '" value "' not supported for the current font")) @@ -456,7 +471,12 @@ (fn [self value] (let [id (obj/get self "$id") font (fonts/get-font-data (obj/get self "fontId")) - variant (fonts/find-variant font {:style (dm/str value)})] + style (dm/str value) + weight (obj/get self "fontWeight") + variant + (or + (fonts/find-variant font {:weight weight :style style}) + (fonts/find-variant font {:style style}))] (cond (nil? variant) (u/display-not-valid :fontStyle (dm/str "Font style '" value "' not supported for the current font")) -- Gitee From e9c55e9eb415c0742df48d41d502be5ed0481b58 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 3 Sep 2024 15:47:24 +0200 Subject: [PATCH 1241/1266] :sparkles: Make recent colors to be stored locally instead of on file --- common/src/app/common/files/changes.cljc | 19 ++++---------- .../src/app/common/files/changes_builder.cljc | 7 ------ common/src/app/common/types/color.cljc | 20 ++++++++++----- frontend/src/app/main/data/workspace.cljs | 2 ++ .../app/main/data/workspace/libraries.cljs | 25 +++++++++++++------ frontend/src/app/main/refs.cljs | 7 +++--- 6 files changed, 42 insertions(+), 38 deletions(-) diff --git a/common/src/app/common/files/changes.cljc b/common/src/app/common/files/changes.cljc index 40a253759..9df975937 100644 --- a/common/src/app/common/files/changes.cljc +++ b/common/src/app/common/files/changes.cljc @@ -190,10 +190,9 @@ [:type [:= :del-color]] [:id ::sm/uuid]]] + ;; DEPRECATED: remove before 2.3 [:add-recent-color - [:map {:title "AddRecentColorChange"} - [:type [:= :add-recent-color]] - [:color ::ctc/recent-color]]] + [:map {:title "AddRecentColorChange"}]] [:add-media [:map {:title "AddMediaChange"} @@ -656,18 +655,10 @@ [data {:keys [id]}] (ctcl/delete-color data id)) +;; DEPRECATED: remove before 2.3 (defmethod process-change :add-recent-color - [data {:keys [color]}] - ;; Moves the color to the top of the list and then truncates up to 15 - (update - data - :recent-colors - (fn [rc] - (let [rc (->> rc (d/removev (partial ctc/eq-recent-color? color))) - rc (-> rc (conj color))] - (cond-> rc - (> (count rc) 15) - (subvec 1)))))) + [data _] + data) ;; -- Media diff --git a/common/src/app/common/files/changes_builder.cljc b/common/src/app/common/files/changes_builder.cljc index c3ecbd8a1..9c613a91d 100644 --- a/common/src/app/common/files/changes_builder.cljc +++ b/common/src/app/common/files/changes_builder.cljc @@ -607,13 +607,6 @@ (reduce resize-parent changes all-parents))) ;; Library changes - -(defn add-recent-color - [changes color] - (-> changes - (update :redo-changes conj {:type :add-recent-color :color color}) - (apply-changes-local))) - (defn add-color [changes color] (-> changes diff --git a/common/src/app/common/types/color.cljc b/common/src/app/common/types/color.cljc index c0c400a9a..78a7f8114 100644 --- a/common/src/app/common/types/color.cljc +++ b/common/src/app/common/types/color.cljc @@ -107,17 +107,16 @@ [::sm/contains-any {:strict true} [:color :gradient :image]]]) (sm/register! ::rgb-color type:rgb-color) - (sm/register! ::color schema:color) (sm/register! ::gradient schema:gradient) (sm/register! ::image-color schema:image-color) (sm/register! ::recent-color schema:recent-color) -(def check-color! - (sm/check-fn schema:color)) +(def valid-color? + (sm/lazy-validator schema:color)) -(def check-recent-color! - (sm/check-fn schema:recent-color)) +(def valid-recent-color? + (sm/lazy-validator schema:recent-color)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; HELPERS @@ -392,13 +391,22 @@ (process-shape-colors shape sync-color))) -(defn eq-recent-color? +(defn- eq-recent-color? [c1 c2] (or (= c1 c2) (and (some? (:color c1)) (some? (:color c2)) (= (:color c1) (:color c2))))) +(defn add-recent-color + "Moves the color to the top of the list and then truncates up to 15" + [state file-id color] + (update state file-id (fn [colors] + (let [colors (d/removev (partial eq-recent-color? color) colors) + colors (conj colors color)] + (cond-> colors + (> (count colors) 15) + (subvec 1)))))) (defn stroke->color-att [stroke file-id shared-libs] diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index dfb18f0d6..dd62ff70d 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -79,6 +79,7 @@ [app.util.http :as http] [app.util.i18n :as i18n :refer [tr]] [app.util.router :as rt] + [app.util.storage :refer [storage]] [app.util.timers :as tm] [app.util.webapi :as wapi] [beicon.v2.core :as rx] @@ -335,6 +336,7 @@ ptk/UpdateEvent (update [_ state] (assoc state + :recent-colors (:recent-colors @storage) :workspace-ready? false :current-file-id file-id :current-project-id project-id diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index 8e3589b50..a6c6cb8b3 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -48,6 +48,7 @@ [app.util.color :as uc] [app.util.i18n :refer [tr]] [app.util.router :as rt] + [app.util.storage :as s] [app.util.time :as dt] [beicon.v2.core :as rx] [cuerdas.core :as str] @@ -132,16 +133,21 @@ (defn add-recent-color [color] + (dm/assert! "expected valid recent color map" - (ctc/check-recent-color! color)) + (ctc/valid-recent-color? color)) (ptk/reify ::add-recent-color - ptk/WatchEvent - (watch [it _ _] - (let [changes (-> (pcb/empty-changes it) - (pcb/add-recent-color color))] - (rx/of (dch/commit-changes changes)))))) + ptk/UpdateEvent + (update [_ state] + (let [file-id (:current-file-id state)] + (update state :recent-colors ctc/add-recent-color file-id color))) + + ptk/EffectEvent + (effect [_ state _] + (let [recent-colors (:recent-colors state)] + (swap! s/storage assoc :recent-colors recent-colors))))) (def clear-color-for-rename (ptk/reify ::clear-color-for-rename @@ -168,8 +174,11 @@ (dm/assert! "expected valid parameters" - (and (ctc/check-color! color) - (uuid? file-id))) + (ctc/valid-color? color)) + + (dm/assert! + "expected file-id" + (uuid? file-id)) (ptk/reify ::update-color ptk/WatchEvent diff --git a/frontend/src/app/main/refs.cljs b/frontend/src/app/main/refs.cljs index 36ec7a425..c0f32f643 100644 --- a/frontend/src/app/main/refs.cljs +++ b/frontend/src/app/main/refs.cljs @@ -236,9 +236,10 @@ =)) (def workspace-recent-colors - (l/derived (fn [data] - (get data :recent-colors [])) - workspace-data)) + (l/derived (fn [state] + (when-let [file-id (:current-file-id state)] + (dm/get-in state [:recent-colors file-id]))) + st/state)) (def workspace-recent-fonts (l/derived (fn [data] -- Gitee From 9619fcbc1fd3c847a94e6b4e04999ea8a6c2c14a Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 4 Sep 2024 14:22:30 +0200 Subject: [PATCH 1242/1266] :zap: Make efficiency improvements to use-shared-state hook --- frontend/src/app/main/ui/hooks.cljs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/frontend/src/app/main/ui/hooks.cljs b/frontend/src/app/main/ui/hooks.cljs index bb05d2b1c..14bff1559 100644 --- a/frontend/src/app/main/ui/hooks.cljs +++ b/frontend/src/app/main/ui/hooks.cljs @@ -294,19 +294,21 @@ `key` for new values." [key default] (let [id (mf/use-id) - state (mf/use-state (get @storage key default)) + state* (mf/use-state #(get @storage key default)) + state (deref state*) stream (mf/with-memo [id] (->> mbc/stream (rx/filter #(not= (:id %) id)) (rx/filter #(= (:type %) key)) (rx/map deref)))] - (mf/with-effect [@state key id] - (mbc/emit! id key @state) - (swap! storage assoc key @state)) + (mf/with-effect [state key id] + (mbc/emit! id key state) + (swap! storage assoc key state)) - (use-stream stream (partial reset! state)) - state)) + (use-stream stream (partial reset! state*)) + + state*)) (defonce ^:private intersection-subject (rx/subject)) (defonce ^:private intersection-observer -- Gitee From b2c0bed84c30517c1c549d1d255cb0eb4ae1efc8 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 4 Sep 2024 14:23:30 +0200 Subject: [PATCH 1243/1266] :zap: Add efficiency improvements to use-resize-hook --- frontend/src/app/main/ui/hooks/resize.cljs | 59 +++++++++++++--------- 1 file changed, 35 insertions(+), 24 deletions(-) diff --git a/frontend/src/app/main/ui/hooks/resize.cljs b/frontend/src/app/main/ui/hooks/resize.cljs index 148cdf773..7b57c1345 100644 --- a/frontend/src/app/main/ui/hooks/resize.cljs +++ b/frontend/src/app/main/ui/hooks/resize.cljs @@ -6,6 +6,7 @@ (ns app.main.ui.hooks.resize (:require + [app.common.data :as d] [app.common.data.macros :as dm] [app.common.geom.point :as gpt] [app.common.logging :as log] @@ -20,6 +21,15 @@ (def last-resize-type nil) +(defn- get-initial-state + [initial file-id key] + (let [saved (dm/get-in @storage [::state file-id key])] + (d/nilv saved initial))) + +(defn- update-persistent-state + [data file-id key size] + (update-in data [::state file-id] assoc key size)) + (defn set-resize-type! [type] (set! last-resize-type type)) @@ -28,26 +38,28 @@ (use-resize-hook key initial min-val max-val axis negate? resize-type nil)) ([key initial min-val max-val axis negate? resize-type on-change-size] - (let [current-file-id (mf/use-ctx ctx/current-file-id) - size-state (mf/use-state (or (get-in @storage [::saved-resize current-file-id key]) initial)) - parent-ref (mf/use-ref nil) + (let [file-id (mf/use-ctx ctx/current-file-id) + + current-size* (mf/use-state #(get-initial-state initial file-id key)) + current-size (deref current-size*) - dragging-ref (mf/use-ref false) + parent-ref (mf/use-ref nil) + dragging-ref (mf/use-ref false) start-size-ref (mf/use-ref nil) - start-ref (mf/use-ref nil) + start-ref (mf/use-ref nil) on-pointer-down - (mf/use-callback - (mf/deps @size-state) + (mf/use-fn + (mf/deps current-size) (fn [event] (dom/capture-pointer event) - (mf/set-ref-val! start-size-ref @size-state) + (mf/set-ref-val! start-size-ref current-size) (mf/set-ref-val! dragging-ref true) (mf/set-ref-val! start-ref (dom/get-client-position event)) (set! last-resize-type resize-type))) on-lost-pointer-capture - (mf/use-callback + (mf/use-fn (fn [event] (dom/release-pointer event) (mf/set-ref-val! start-size-ref nil) @@ -56,40 +68,39 @@ (set! last-resize-type nil))) on-pointer-move - (mf/use-callback - (mf/deps min-val max-val negate?) + (mf/use-fn + (mf/deps min-val max-val negate? file-id key) (fn [event] (when (mf/ref-val dragging-ref) (let [start (mf/ref-val start-ref) - pos (dom/get-client-position event) + pos (dom/get-client-position event) delta (-> (gpt/to-vec start pos) (cond-> negate? gpt/negate) (get axis)) + start-size (mf/ref-val start-size-ref) new-size (-> (+ start-size delta) (max min-val) (min max-val))] - (reset! size-state new-size) - (swap! storage assoc-in [::saved-resize current-file-id key] new-size) - (when on-change-size (on-change-size new-size)))))) + (reset! current-size* new-size) + (swap! storage update-persistent-state file-id key new-size))))) set-size - (mf/use-callback - (mf/deps on-change-size) + (mf/use-fn + (mf/deps on-change-size file-id key) (fn [new-size] (let [new-size (mth/clamp new-size min-val max-val)] - (reset! size-state new-size) - (swap! storage assoc-in [::saved-resize current-file-id key] new-size) - (when on-change-size (on-change-size new-size)))))] + (reset! current-size* new-size) + (swap! storage update-persistent-state file-id key new-size))))] - (mf/use-effect - (fn [] - (when on-change-size (on-change-size @size-state)))) + (mf/with-effect [on-change-size current-size] + (when on-change-size + (on-change-size current-size))) {:on-pointer-down on-pointer-down :on-lost-pointer-capture on-lost-pointer-capture :on-pointer-move on-pointer-move :parent-ref parent-ref :set-size set-size - :size @size-state}))) + :size current-size}))) (defn use-resize-observer [callback] -- Gitee From b8c61038587232cc7ef8e6604f6e10a155efae68 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 4 Sep 2024 16:04:43 +0200 Subject: [PATCH 1244/1266] :zap: Add performance enhancements for util/storage abstraction layer --- frontend/src/app/util/storage.cljs | 104 ++++++++++++++++++++--------- 1 file changed, 71 insertions(+), 33 deletions(-) diff --git a/frontend/src/app/util/storage.cljs b/frontend/src/app/util/storage.cljs index cd9303edd..80fd72f6e 100644 --- a/frontend/src/app/util/storage.cljs +++ b/frontend/src/app/util/storage.cljs @@ -6,42 +6,80 @@ (ns app.util.storage (:require + ["lodash/debounce" :as ldebounce] [app.common.exceptions :as ex] [app.common.transit :as t] [app.util.globals :as g] - [app.util.timers :as tm])) - -(defn- persist - [storage prev curr] - (run! (fn [key] - (let [prev* (get prev key) - curr* (get curr key)] - (when (not= curr* prev*) - (tm/schedule-on-idle - #(if (some? curr*) - (.setItem ^js storage (t/encode-str key) (t/encode-str curr*)) - (.removeItem ^js storage (t/encode-str key))))))) - - (into #{} (concat (keys curr) - (keys prev))))) + [cuerdas.core :as str])) + +;; Using ex/ignoring because can receive a DOMException like this when +;; importing the code as a library: Failed to read the 'localStorage' +;; property from 'Window': Storage is disabled inside 'data:' URLs. +(defonce ^:private local-storage + (ex/ignoring (unchecked-get g/global "localStorage"))) + +(defn- encode-key + [k] + (assert (keyword? k) "key must be keyword") + (let [kns (namespace k) + kn (name k)] + (str "penpot:" kns "/" kn))) + +(defn- decode-key + [k] + (when (str/starts-with? k "penpot:") + (let [k (subs k 7)] + (if (str/starts-with? k "/") + (keyword (subs k 1)) + (let [[kns kn] (str/split k "/" 2)] + (keyword kns kn)))))) + +(defn- lookup-by-index + [result index] + (try + (let [key (.key ^js local-storage index) + key' (decode-key key)] + (if key' + (let [val (.getItem ^js local-storage key)] + (assoc! result key' (t/decode-str val))) + result)) + (catch :default _ + result))) (defn- load - [storage] - (when storage - (let [len (.-length ^js storage)] - (reduce (fn [res index] - (let [key (.key ^js storage index) - val (.getItem ^js storage key)] - (try - (assoc res (t/decode-str key) (t/decode-str val)) - (catch :default _e - res)))) - {} - (range len))))) - -;; Using ex/ignoring because can receive a DOMException like this when importing the code as a library: -;; Failed to read the 'localStorage' property from 'Window': Storage is disabled inside 'data:' URLs. -(defonce storage (atom (load (ex/ignoring (unchecked-get g/global "localStorage"))))) - -(add-watch storage :persistence #(persist js/localStorage %3 %4)) + [] + (when (some? local-storage) + (let [length (.-length ^js local-storage)] + (loop [index 0 + result (transient {})] + (if (< index length) + (recur (inc index) + (lookup-by-index result index)) + (persistent! result)))))) + +(defonce ^:private latest-state (load)) + +(defn- on-change* + [curr-state] + (let [prev-state latest-state] + (try + (run! (fn [key] + (let [prev-val (get prev-state key) + curr-val (get curr-state key)] + (when-not (identical? curr-val prev-val) + (if (some? curr-val) + (.setItem ^js local-storage (encode-key key) (t/encode-str curr-val)) + (.removeItem ^js local-storage (encode-key key)))))) + (into #{} (concat (keys curr-state) + (keys prev-state)))) + (finally + (set! latest-state curr-state))))) + +(defonce on-change + (ldebounce on-change* 2000 #js {:leading false :trailing true})) + +(defonce storage (atom latest-state)) +(add-watch storage :persistence + (fn [_ _ _ curr-state] + (on-change curr-state))) -- Gitee From 1281670c61dc4c3b05027a8f71253e740a7eb493 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 4 Sep 2024 16:18:46 +0200 Subject: [PATCH 1245/1266] :sparkles: Clear storage on user logout --- frontend/src/app/main/data/users.cljs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/frontend/src/app/main/data/users.cljs b/frontend/src/app/main/data/users.cljs index 1a61a0644..3fc742783 100644 --- a/frontend/src/app/main/data/users.cljs +++ b/frontend/src/app/main/data/users.cljs @@ -21,7 +21,7 @@ [app.main.repo :as rp] [app.util.i18n :as i18n :refer [tr]] [app.util.router :as rt] - [app.util.storage :refer [storage]] + [app.util.storage :as s] [beicon.v2.core :as rx] [potok.v2.core :as ptk])) @@ -49,14 +49,14 @@ (defn get-current-team-id [profile] - (let [team-id (::current-team-id @storage)] + (let [team-id (::current-team-id @s/storage)] (or team-id (:default-team-id profile)))) (defn set-current-team! [team-id] (if (nil? team-id) - (swap! storage dissoc ::current-team-id) - (swap! storage assoc ::current-team-id team-id))) + (swap! s/storage dissoc ::current-team-id) + (swap! s/storage assoc ::current-team-id team-id))) ;; --- EVENT: fetch-teams @@ -76,9 +76,9 @@ ;; if not, dissoc it from storage. (let [ids (into #{} (map :id) teams)] - (when-let [ctid (::current-team-id @storage)] + (when-let [ctid (::current-team-id @s/storage)] (when-not (contains? ids ctid) - (swap! storage dissoc ::current-team-id))))))) + (swap! s/storage dissoc ::current-team-id))))))) (defn fetch-teams [] @@ -129,10 +129,10 @@ (effect [_ state _] (let [profile (:profile state) email (:email profile) - previous-profile (:profile @storage) + previous-profile (:profile @s/storage) previous-email (:email previous-profile)] (when profile - (swap! storage assoc :profile profile) + (swap! s/storage assoc :profile profile) (i18n/set-locale! (:lang profile)) (when (not= previous-email email) (set-current-team! nil))))))) @@ -311,7 +311,7 @@ ptk/EffectEvent (effect [_ _ _] ;; We prefer to keek some stuff in the storage like the current-team-id and the profile - (set-current-team! nil))))) + (swap! s/storage (constantly {})))))) (defn logout ([] (logout {})) -- Gitee From 81b797234706b27b47ae5f264fa70991c461b6a8 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Mon, 19 Aug 2024 10:47:25 +0200 Subject: [PATCH 1246/1266] :tada: Test A/B for start in workspace --- backend/resources/app/onboarding.edn | 5 +- backend/src/app/rpc/commands/auth.clj | 26 ++++-- backend/src/app/rpc/commands/management.clj | 8 +- backend/src/app/rpc/commands/profile.clj | 40 +++++----- backend/src/app/setup/welcome_file.clj | 64 +++++++++++++++ frontend/src/app/main/data/users.cljs | 23 ++++-- frontend/src/app/main/ui.cljs | 80 +++++++++++-------- frontend/src/app/main/ui/auth/register.cljs | 15 +++- .../src/app/main/ui/dashboard/templates.cljs | 4 +- .../app/main/ui/onboarding/team_choice.cljs | 9 ++- 10 files changed, 197 insertions(+), 77 deletions(-) create mode 100644 backend/src/app/setup/welcome_file.clj diff --git a/backend/resources/app/onboarding.edn b/backend/resources/app/onboarding.edn index a6449f5fd..07a11859d 100644 --- a/backend/resources/app/onboarding.edn +++ b/backend/resources/app/onboarding.edn @@ -36,4 +36,7 @@ :file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Open-Color-Scheme.penpot"} {:id "flex-layout-playground" :name "Flex Layout Playground" - :file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Flex-Layout-Playground.penpot"}] + :file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Flex-Layout-Playground.penpot"} + {:id "welcome" + :name "Welcome" + :file-uri "https://github.com/penpot/penpot-files/raw/binary-files/welcome.penpot"}] diff --git a/backend/src/app/rpc/commands/auth.clj b/backend/src/app/rpc/commands/auth.clj index 3adac1f55..1ed3fa364 100644 --- a/backend/src/app/rpc/commands/auth.clj +++ b/backend/src/app/rpc/commands/auth.clj @@ -27,9 +27,11 @@ [app.rpc.doc :as-alias doc] [app.rpc.helpers :as rph] [app.setup :as-alias setup] + [app.setup.welcome-file :refer [create-welcome-file]] [app.tokens :as tokens] [app.util.services :as sv] [app.util.time :as dt] + [app.worker :as wrk] [cuerdas.core :as str])) (def schema:password @@ -241,6 +243,7 @@ params (d/without-nils params) token (tokens/generate (::setup/props cfg) params)] + (with-meta {:token token} {::audit/profile-id uuid/zero}))) @@ -350,7 +353,7 @@ :extra-data ptoken}))) (defn register-profile - [{:keys [::db/conn] :as cfg} {:keys [token fullname theme] :as params}] + [{:keys [::db/conn ::wrk/executor] :as cfg} {:keys [token fullname theme] :as params}] (let [theme (when (= theme "light") theme) claims (tokens/verify (::setup/props cfg) {:token token :iss :prepared-register}) params (-> claims @@ -380,8 +383,13 @@ invitation (when-let [token (:invitation-token params)] (tokens/verify (::setup/props cfg) {:token token :iss :team-invitation})) - props (audit/profile->props profile)] + props (audit/profile->props profile) + create-welcome-file-when-needed + (fn [] + (when (:create-welcome-file params) + (let [cfg (dissoc cfg ::db/conn)] + (wrk/submit! executor (create-welcome-file cfg profile)))))] (cond ;; When profile is blocked, we just ignore it and return plain data (:is-blocked profile) @@ -418,6 +426,7 @@ (if (:is-active profile) (-> (profile/strip-private-attrs profile) (rph/with-transform (session/create-fn cfg (:id profile))) + (rph/with-defer create-welcome-file-when-needed) (rph/with-meta {::audit/replace-props props ::audit/context {:action "login"} @@ -427,10 +436,12 @@ (when-not (eml/has-reports? conn (:email profile)) (send-email-verification! cfg profile)) - (rph/with-meta {:email (:email profile)} - {::audit/replace-props props - ::audit/context {:action "email-verification"} - ::audit/profile-id (:id profile)}))) + (-> {:email (:email profile)} + (rph/with-defer create-welcome-file-when-needed) + (rph/with-meta + {::audit/replace-props props + ::audit/context {:action "email-verification"} + ::audit/profile-id (:id profile)})))) :else (let [elapsed? (elapsed-verify-threshold? profile) @@ -462,7 +473,8 @@ [:map {:title "register-profile"} [:token schema:token] [:fullname [::sm/word-string {:max 100}]] - [:theme {:optional true} [:string {:max 10}]]]) + [:theme {:optional true} [:string {:max 10}]] + [:create-welcome-file {:optional true} :boolean]]) (sv/defmethod ::register-profile {::rpc/auth false diff --git a/backend/src/app/rpc/commands/management.clj b/backend/src/app/rpc/commands/management.clj index e90b255fc..30d0d3460 100644 --- a/backend/src/app/rpc/commands/management.clj +++ b/backend/src/app/rpc/commands/management.clj @@ -396,8 +396,8 @@ ;; --- COMMAND: Clone Template -(defn- clone-template - [cfg {:keys [project-id ::rpc/profile-id] :as params} template] +(defn clone-template + [cfg {:keys [project-id profile-id] :as params} template] (db/tx-run! cfg (fn [{:keys [::db/conn ::wrk/executor] :as cfg}] ;; NOTE: the importation process performs some operations that ;; are not very friendly with virtual threads, and for avoid @@ -416,6 +416,7 @@ (doseq [file-id result] (let [props (assoc props :id file-id) event (-> (audit/event-from-rpc-params params) + (assoc ::audit/profile-id profile-id) (assoc ::audit/name "create-file") (assoc ::audit/props props))] (audit/submit! cfg event)))) @@ -437,7 +438,8 @@ [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id project-id template-id] :as params}] (let [project (db/get-by-id pool :project project-id {:columns [:id :team-id]}) _ (teams/check-edition-permissions! pool profile-id (:team-id project)) - template (tmpl/get-template-stream cfg template-id)] + template (tmpl/get-template-stream cfg template-id) + params (assoc params :profile-id profile-id)] (when-not template (ex/raise :type :not-found diff --git a/backend/src/app/rpc/commands/profile.clj b/backend/src/app/rpc/commands/profile.clj index ce302571e..3108fcbb2 100644 --- a/backend/src/app/rpc/commands/profile.clj +++ b/backend/src/app/rpc/commands/profile.clj @@ -360,27 +360,31 @@ [:map {:title "update-profile-props"} [:props [:map-of :keyword :any]]])) +(defn update-profile-props + [{:keys [::db/conn] :as cfg} profile-id props] + (let [profile (get-profile conn profile-id ::sql/for-update true) + props (reduce-kv (fn [props k v] + ;; We don't accept namespaced keys + (if (simple-ident? k) + (if (nil? v) + (dissoc props k) + (assoc props k v)) + props)) + (:props profile) + props)] + + (db/update! conn :profile + {:props (db/tjson props)} + {:id profile-id}) + + (filter-props props))) + (sv/defmethod ::update-profile-props {::doc/added "1.0" ::sm/params schema:update-profile-props} - [{:keys [::db/pool]} {:keys [::rpc/profile-id props]}] - (db/with-atomic [conn pool] - (let [profile (get-profile conn profile-id ::sql/for-update true) - props (reduce-kv (fn [props k v] - ;; We don't accept namespaced keys - (if (simple-ident? k) - (if (nil? v) - (dissoc props k) - (assoc props k v)) - props)) - (:props profile) - props)] - - (db/update! conn :profile - {:props (db/tjson props)} - {:id profile-id}) - - (filter-props props)))) + [cfg {:keys [::rpc/profile-id props]}] + (db/tx-run! cfg (fn [cfg] + (update-profile-props cfg profile-id props)))) ;; --- MUTATION: Delete Profile diff --git a/backend/src/app/setup/welcome_file.clj b/backend/src/app/setup/welcome_file.clj new file mode 100644 index 000000000..8de4acaa7 --- /dev/null +++ b/backend/src/app/setup/welcome_file.clj @@ -0,0 +1,64 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.setup.welcome-file + (:require + [app.common.logging :as l] + [app.db :as db] + [app.rpc :as-alias rpc] + [app.rpc.climit :as-alias climit] + [app.rpc.commands.files-update :as fupdate] + [app.rpc.commands.management :as management] + [app.rpc.commands.profile :as profile] + [app.rpc.doc :as-alias doc] + [app.setup :as-alias setup] + [app.setup.templates :as tmpl] + [app.worker :as-alias wrk])) + +(def ^:private page-id #uuid "2c6952ee-d00e-8160-8004-d2250b7210cb") +(def ^:private shape-id #uuid "765e9f82-c44e-802e-8004-d72a10b7b445") + +(def ^:private update-path + [:data :pages-index page-id :objects shape-id + :content :children 0 :children 0 :children 0]) + +(def ^:private sql:mark-file-object-thumbnails-deleted + "UPDATE file_tagged_object_thumbnail + SET deleted_at = now() + WHERE file_id = ?") + +(def ^:private sql:mark-file-thumbnail-deleted + "UPDATE file_thumbnail + SET deleted_at = now() + WHERE file_id = ?") + +(defn- update-welcome-shape + [_ file name] + (let [text (str "Welcome to Penpot, " name "!")] + (-> file + (update-in update-path assoc :text text) + (update-in [:data :pages-index page-id :objects shape-id] assoc :name "Welcome to Penpot!") + (update-in [:data :pages-index page-id :objects shape-id] dissoc :position-data)))) + +(defn create-welcome-file + [cfg {:keys [id fullname] :as profile}] + (try + (let [cfg (dissoc cfg ::db/conn) + params {:profile-id (:id profile) + :project-id (:default-project-id profile)} + template-stream (tmpl/get-template-stream cfg "welcome") + file-id (-> (management/clone-template cfg params template-stream) + first)] + + (db/tx-run! cfg (fn [{:keys [::db/conn] :as cfg}] + (fupdate/update-file! cfg file-id update-welcome-shape fullname) + (profile/update-profile-props cfg id {:welcome-file-id file-id}) + (db/exec-one! conn [sql:mark-file-object-thumbnails-deleted file-id]) + (db/exec-one! conn [sql:mark-file-thumbnail-deleted file-id])))) + + (catch Throwable cause + (l/error :hint "unexpected error on create welcome file " :cause cause)))) + diff --git a/frontend/src/app/main/data/users.cljs b/frontend/src/app/main/data/users.cljs index 1a61a0644..c59141867 100644 --- a/frontend/src/app/main/data/users.cljs +++ b/frontend/src/app/main/data/users.cljs @@ -25,6 +25,8 @@ [beicon.v2.core :as rx] [potok.v2.core :as ptk])) +(declare update-profile-props) + ;; --- SCHEMAS (def ^:private @@ -152,9 +154,15 @@ profile. The profile can proceed from standard login or from accepting invitation, or third party auth signup or singin." [profile] - (letfn [(get-redirect-event [] - (let [team-id (get-current-team-id profile)] - (rt/nav' :dashboard-projects {:team-id team-id})))] + (letfn [(get-redirect-events [] + (let [team-id (get-current-team-id profile) + welcome-file-id (get-in profile [:props :welcome-file-id])] + (if (some? welcome-file-id) + (rx/of + (rt/nav' :workspace {:project-id (:default-project-id profile) + :file-id welcome-file-id}) + (update-profile-props {:welcome-file-id nil})) + (rx/of (rt/nav' :dashboard-projects {:team-id team-id})))))] (ptk/reify ::logged-in ev/Event @@ -171,10 +179,11 @@ ptk/WatchEvent (watch [_ _ _] (when (is-authenticated? profile) - (->> (rx/of (profile-fetched profile) - (fetch-teams) - (get-redirect-event) - (ws/initialize)) + (->> (rx/concat + (rx/of (profile-fetched profile) + (fetch-teams) + (ws/initialize)) + (get-redirect-events)) (rx/observe-on :async))))))) (declare login-from-register) diff --git a/frontend/src/app/main/ui.cljs b/frontend/src/app/main/ui.cljs index 50cd947e6..8a53010de 100644 --- a/frontend/src/app/main/ui.cljs +++ b/frontend/src/app/main/ui.cljs @@ -44,7 +44,30 @@ (mf/defc main-page {::mf/props :obj} [{:keys [route profile]}] - (let [{:keys [data params]} route] + (let [{:keys [data params]} route + props (get profile :props) + show-question-modal? + (and (contains? cf/flags :onboarding) + (not (:onboarding-viewed props)) + (not (contains? props :onboarding-questions))) + + show-newsletter-modal? + (and (contains? cf/flags :onboarding) + (not (:onboarding-viewed props)) + (not (contains? props :newsletter-updates)) + (contains? props :onboarding-questions)) + + show-team-modal? + (and (contains? cf/flags :onboarding) + (not (:onboarding-viewed props)) + (not (contains? props :onboarding-team-id)) + (contains? props :newsletter-updates)) + + show-release-modal? + (and (contains? cf/flags :onboarding) + (:onboarding-viewed props) + (not= (:release-notes-viewed props) (:main cf/version)) + (not= "0.0" (:main cf/version)))] [:& (mf/provider ctx/current-route) {:value route} (case (:name data) (:auth-login @@ -84,42 +107,19 @@ #_[:& app.main.ui.onboarding/onboarding-templates-modal] #_[:& app.main.ui.onboarding/onboarding-modal] #_[:& app.main.ui.onboarding.team-choice/onboarding-team-modal] - (when-let [props (get profile :props)] - (let [show-question-modal? - (and (contains? cf/flags :onboarding) - (not (:onboarding-viewed props)) - (not (contains? props :onboarding-questions))) - - show-newsletter-modal? - (and (contains? cf/flags :onboarding) - (not (:onboarding-viewed props)) - (not (contains? props :newsletter-updates)) - (contains? props :onboarding-questions)) - - show-team-modal? - (and (contains? cf/flags :onboarding) - (not (:onboarding-viewed props)) - (not (contains? props :onboarding-team-id)) - (contains? props :newsletter-updates)) - - show-release-modal? - (and (contains? cf/flags :onboarding) - (:onboarding-viewed props) - (not= (:release-notes-viewed props) (:main cf/version)) - (not= "0.0" (:main cf/version)))] - (cond - show-question-modal? - [:& questions-modal] + (cond + show-question-modal? + [:& questions-modal] - show-newsletter-modal? - [:& onboarding-newsletter] + show-newsletter-modal? + [:& onboarding-newsletter] - show-team-modal? - [:& onboarding-team-modal] + show-team-modal? + [:& onboarding-team-modal {:go-to-team? true}] - show-release-modal? - [:& release-notes-modal {:version (:main cf/version)}]))) + show-release-modal? + [:& release-notes-modal {:version (:main cf/version)}]) [:& dashboard-page {:route route :profile profile}]] :viewer @@ -154,6 +154,20 @@ page-id (some-> params :query :page-id uuid) layout (some-> params :query :layout keyword)] [:? {} + (when (cf/external-feature-flag "onboarding-03" "test") + (cond + show-question-modal? + [:& questions-modal] + + show-newsletter-modal? + [:& onboarding-newsletter] + + show-team-modal? + [:& onboarding-team-modal {:go-to-team? false}] + + show-release-modal? + [:& release-notes-modal {:version (:main cf/version)}])) + [:& workspace-page {:project-id project-id :file-id file-id :page-id page-id diff --git a/frontend/src/app/main/ui/auth/register.cljs b/frontend/src/app/main/ui/auth/register.cljs index 192a96635..8c3a8a6da 100644 --- a/frontend/src/app/main/ui/auth/register.cljs +++ b/frontend/src/app/main/ui/auth/register.cljs @@ -39,7 +39,8 @@ form (fm/use-form :schema schema:register-form :initial initial) - submitted? (mf/use-state false) + submitted? + (mf/use-state false) on-error (mf/use-fn @@ -176,7 +177,9 @@ ::mf/private true} [{:keys [params on-success-callback]}] (let [form (fm/use-form :schema schema:register-validate-form :initial params) - submitted? (mf/use-state false) + + submitted? + (mf/use-state false) on-success (mf/use-fn @@ -208,7 +211,13 @@ (mf/deps on-success on-error) (fn [form _] (reset! submitted? true) - (let [params (:clean-data @form)] + (let [create-welcome-file? + (cf/external-feature-flag "onboarding-03" "test") + + params + (cond-> (:clean-data @form) + create-welcome-file? (assoc :create-welcome-file true))] + (->> (rp/cmd! :register-profile params) (rx/finalize #(reset! submitted? false)) (rx/subs! on-success on-error)))))] diff --git a/frontend/src/app/main/ui/dashboard/templates.cljs b/frontend/src/app/main/ui/dashboard/templates.cljs index 8927ff053..1d6e07998 100644 --- a/frontend/src/app/main/ui/dashboard/templates.cljs +++ b/frontend/src/app/main/ui/dashboard/templates.cljs @@ -168,7 +168,9 @@ [{:keys [default-project-id profile project-id team-id]}] (let [templates (mf/deref builtin-templates) templates (mf/with-memo [templates] - (filterv #(not= (:id %) "tutorial-for-beginners") templates)) + (filterv #(and + (not= (:id %) "welcome") + (not= (:id %) "tutorial-for-beginners")) templates)) route (mf/deref refs/route) route-name (get-in route [:data :name]) diff --git a/frontend/src/app/main/ui/onboarding/team_choice.cljs b/frontend/src/app/main/ui/onboarding/team_choice.cljs index e18d11ab1..79bcc98a9 100644 --- a/frontend/src/app/main/ui/onboarding/team_choice.cljs +++ b/frontend/src/app/main/ui/onboarding/team_choice.cljs @@ -66,7 +66,7 @@ (mf/defc team-form-step-2 {::mf/props :obj} - [{:keys [name on-back]}] + [{:keys [name on-back go-to-team?]}] (let [initial (mf/use-memo #(do {:role "editor" :name name})) @@ -85,7 +85,8 @@ (let [team-id (:id response)] (st/emit! (du/update-profile-props {:onboarding-team-id team-id :onboarding-viewed true}) - (rt/nav :dashboard-projects {:team-id team-id}))))) + (when go-to-team? + (rt/nav :dashboard-projects {:team-id team-id})))))) on-error (mf/use-fn @@ -240,7 +241,7 @@ (mf/defc onboarding-team-modal {::mf/props :obj} - [] + [{:keys [go-to-team?]}] (let [name* (mf/use-state nil) name (deref name*) @@ -262,6 +263,6 @@ [:& left-sidebar] [:div {:class (stl/css :separator)}] (if name - [:& team-form-step-2 {:name name :on-back on-back}] + [:& team-form-step-2 {:name name :on-back on-back :go-to-team? go-to-team?}] [:& team-form-step-1 {:on-submit on-submit}])]])) -- Gitee From a180c33a32a6949202a04950a9ceb3b8effee40c Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 5 Sep 2024 09:26:22 +0200 Subject: [PATCH 1247/1266] :bug: Fix problem with SVG import --- CHANGES.md | 1 + frontend/src/app/main/data/workspace/svg_upload.cljs | 10 ++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 2667f4c75..a09d96f2a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -76,6 +76,7 @@ - Fix fill collapsed options [Taiga #8351](https://tree.taiga.io/project/penpot/issue/8351) - Fix scroll on color picker modal [Taiga #8353](https://tree.taiga.io/project/penpot/issue/8353) - Fix components are not dragged from the group to the assets tab [Taiga #8273](https://tree.taiga.io/project/penpot/issue/8273) +- Fix problem with SVG import [Github #4888](https://github.com/penpot/penpot/issues/4888) ## 2.1.5 diff --git a/frontend/src/app/main/data/workspace/svg_upload.cljs b/frontend/src/app/main/data/workspace/svg_upload.cljs index 169e2dd3e..6f04e7c66 100644 --- a/frontend/src/app/main/data/workspace/svg_upload.cljs +++ b/frontend/src/app/main/data/workspace/svg_upload.cljs @@ -73,7 +73,6 @@ (let [id (d/nilv id (uuid/next)) page-id (:current-page-id state) objects (wsh/lookup-page-objects state page-id) - frame-id (ctst/top-nested-frame objects position) selected (if ignore-selection? #{} (wsh/lookup-selected state)) base (cfh/get-base-shape objects selected) @@ -81,9 +80,16 @@ selected-frame? (and (= 1 (count selected)) (= :frame (dm/get-in objects [selected-id :type]))) + base-id (:parent-id base) + + frame-id (if (or selected-frame? (empty? selected) + (not= :frame (dm/get-in objects [base-id :type]))) + (ctst/top-nested-frame objects position) + base-id) + parent-id (if (or selected-frame? (empty? selected)) frame-id - (:parent-id base)) + base-id) [new-shape new-children] (csvg.shapes-builder/create-svg-shapes id svg-data position objects frame-id parent-id selected true) -- Gitee From e95713c1df9dcc931f03a7c9d3e4057929e12d04 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Wed, 4 Sep 2024 17:59:09 +0200 Subject: [PATCH 1248/1266] :bug: Fix visual integration test --- frontend/playwright/ui/visual-specs/visual-viewer.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/playwright/ui/visual-specs/visual-viewer.spec.js b/frontend/playwright/ui/visual-specs/visual-viewer.spec.js index a3eeddc82..ef6901f70 100644 --- a/frontend/playwright/ui/visual-specs/visual-viewer.spec.js +++ b/frontend/playwright/ui/visual-specs/visual-viewer.spec.js @@ -117,7 +117,7 @@ test("User goes to the Viewer Inspect code, code tab", async ({ page }) => { }); await viewerPage.showCode(); - await viewerPage.page.getByTestId("code").click(); + await viewerPage.page.getByRole("tab", { name: "code" }).click(); await expect( viewerPage.page.getByRole("button", { name: "Copy all code" }), -- Gitee From 34cc2119127f2a58574dd60589610b4d64c7d0f2 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Wed, 4 Sep 2024 18:00:27 +0200 Subject: [PATCH 1249/1266] :wrench: Rearrange css files for compilation --- frontend/scripts/_helpers.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/frontend/scripts/_helpers.js b/frontend/scripts/_helpers.js index d4bb7182b..e7b301b30 100644 --- a/frontend/scripts/_helpers.js +++ b/frontend/scripts/_helpers.js @@ -115,20 +115,30 @@ export async function compileSassAll(worker) { return path.startsWith("app/main/ui/ds/"); }; + const isOldComponentSystemFile = (path) => { + return path.startsWith("app/main/ui/components/"); + }; + let files = (await fs.readdir(sourceDir, { recursive: true })).filter( isSassFile, ); const appFiles = files .filter((path) => !isDesignSystemFile(path)) + .filter((path) => !isOldComponentSystemFile(path)) .map((path) => ph.join(sourceDir, path)); + const dsFiles = files .filter(isDesignSystemFile) .map((path) => ph.join(sourceDir, path)); + const oldComponentsFiles = files + .filter(isOldComponentSystemFile) + .map((path) => ph.join(sourceDir, path)); + const procs = [compileSass(worker, "resources/styles/main-default.scss", {})]; - for (let path of [...dsFiles, ...appFiles]) { + for (let path of [...oldComponentsFiles, ...dsFiles, ...appFiles]) { const proc = limitFn(() => compileSass(worker, path, { modules: true })); procs.push(proc); } -- Gitee From a0bb5e5ef3e8b9d18496ad318d422382126e54ef Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Thu, 5 Sep 2024 09:41:11 +0200 Subject: [PATCH 1250/1266] :recycle: Remove unnecesary code --- frontend/src/app/main/ui/dashboard/team.scss | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/main/ui/dashboard/team.scss b/frontend/src/app/main/ui/dashboard/team.scss index d606c4053..d914ea773 100644 --- a/frontend/src/app/main/ui/dashboard/team.scss +++ b/frontend/src/app/main/ui/dashboard/team.scss @@ -519,10 +519,8 @@ @include bodySmallTypography; color: var(--modal-title-foreground-color); } -// TODO: This fix is temporary, the error is caused by the -// cascading order of the compiled css files. -// https://tree.taiga.io/project/penpot/task/8658 -.custom-input-checkbox.custom-input-checkbox { + +.custom-input-checkbox { align-items: flex-start; } -- Gitee From 6a161267ba8a3683fb523252cbba3c9b7b37a16d Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 5 Sep 2024 10:48:00 +0200 Subject: [PATCH 1251/1266] :bug: Fix problem with overlay positions in viewer --- CHANGES.md | 1 + frontend/src/app/main/ui/viewer/shapes.cljs | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index a09d96f2a..619de08d6 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -77,6 +77,7 @@ - Fix scroll on color picker modal [Taiga #8353](https://tree.taiga.io/project/penpot/issue/8353) - Fix components are not dragged from the group to the assets tab [Taiga #8273](https://tree.taiga.io/project/penpot/issue/8273) - Fix problem with SVG import [Github #4888](https://github.com/penpot/penpot/issues/4888) +- Fix problem with overlay positions in viewer [Taiga #8464](https://tree.taiga.io/project/penpot/issue/8464) ## 2.1.5 diff --git a/frontend/src/app/main/ui/viewer/shapes.cljs b/frontend/src/app/main/ui/viewer/shapes.cljs index 833a9fd79..0f9aec6bf 100644 --- a/frontend/src/app/main/ui/viewer/shapes.cljs +++ b/frontend/src/app/main/ui/viewer/shapes.cljs @@ -427,7 +427,8 @@ (let [childs (mapv #(get objects %) (:shapes (unchecked-get props "shape"))) props (obj/merge! #js {} props #js {:childs childs - :objects objects})] + :objects objects + :all-objects all-objects})] (when (not-empty childs) [:> group-wrapper props]))))) -- Gitee From caf78a6b4d91f826a68354c305beb38753088254 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 5 Sep 2024 11:50:16 +0200 Subject: [PATCH 1252/1266] :bug: Fix layer panel overflowing --- CHANGES.md | 1 + frontend/src/app/main/ui/workspace/sidebar/sitemap.scss | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 619de08d6..ebd9aa992 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -78,6 +78,7 @@ - Fix components are not dragged from the group to the assets tab [Taiga #8273](https://tree.taiga.io/project/penpot/issue/8273) - Fix problem with SVG import [Github #4888](https://github.com/penpot/penpot/issues/4888) - Fix problem with overlay positions in viewer [Taiga #8464](https://tree.taiga.io/project/penpot/issue/8464) +- Fix layer panel overflowing [Taiga #8665](https://tree.taiga.io/project/penpot/issue/8665) ## 2.1.5 diff --git a/frontend/src/app/main/ui/workspace/sidebar/sitemap.scss b/frontend/src/app/main/ui/workspace/sidebar/sitemap.scss index cd12ae572..c24801d0f 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/sitemap.scss +++ b/frontend/src/app/main/ui/workspace/sidebar/sitemap.scss @@ -55,6 +55,7 @@ overflow-x: hidden; overflow-y: overlay; scrollbar-gutter: stable; + max-width: var(--width); } .pages-list { -- Gitee From e36cf1d9639c51599eef567f84c8dd37cb3e6feb Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Thu, 5 Sep 2024 14:46:49 +0200 Subject: [PATCH 1253/1266] :bug: Fix onboarding slide after rearrange --- frontend/src/app/main/ui/onboarding/questions.cljs | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/src/app/main/ui/onboarding/questions.cljs b/frontend/src/app/main/ui/onboarding/questions.cljs index 00898cd2c..a9e62c965 100644 --- a/frontend/src/app/main/ui/onboarding/questions.cljs +++ b/frontend/src/app/main/ui/onboarding/questions.cljs @@ -372,7 +372,6 @@ [:& fm/image-radio-buttons {:options start-options :img-width "159px" :img-height "120px" - :class (stl/css :image-radio) :name :start-with :on-change on-start-change}] -- Gitee From b15b394c65112faf9cc0cad5a643f771530049bc Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 5 Sep 2024 14:41:09 +0200 Subject: [PATCH 1254/1266] :bug: Fix problem when creating a component instance from grid layout --- CHANGES.md | 1 + common/src/app/common/types/shape/layout.cljc | 10 +++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index ebd9aa992..39f0a47a3 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -79,6 +79,7 @@ - Fix problem with SVG import [Github #4888](https://github.com/penpot/penpot/issues/4888) - Fix problem with overlay positions in viewer [Taiga #8464](https://tree.taiga.io/project/penpot/issue/8464) - Fix layer panel overflowing [Taiga #8665](https://tree.taiga.io/project/penpot/issue/8665) +- Fix problem when creating a component instance from grid layout [Github #4881](https://github.com/penpot/penpot/issues/4881) ## 2.1.5 diff --git a/common/src/app/common/types/shape/layout.cljc b/common/src/app/common/types/shape/layout.cljc index a999145cb..9a71931cc 100644 --- a/common/src/app/common/types/shape/layout.cljc +++ b/common/src/app/common/types/shape/layout.cljc @@ -1622,13 +1622,17 @@ (defn remap-grid-cells "Remaps the shapes ids inside the cells" [shape ids-map] - (let [do-remap-cells + (let [remap-shape + (fn [id] + (get ids-map id id)) + + remap-cell (fn [cell] (-> cell - (update :shapes #(into [] (keep ids-map) %)))) + (update :shapes #(into [] (keep remap-shape) %)))) shape (-> shape - (update :layout-grid-cells update-vals do-remap-cells))] + (update :layout-grid-cells update-vals remap-cell))] shape)) (defn merge-cells -- Gitee From d88f28f5c242011419e6038923bad444c1373ab4 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 5 Sep 2024 15:28:24 +0200 Subject: [PATCH 1255/1266] :sparkles: Add support for optional human challenge --- .../resources/templates/challenge.mustache | 18 ++++++++++++++++++ frontend/scripts/_helpers.js | 7 +++++++ frontend/src/app/main/data/users.cljs | 13 ++++++++++++- frontend/src/app/main/repo.cljs | 10 +++++++++- frontend/src/app/util/router.cljs | 15 +++++++++++++++ 5 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 frontend/resources/templates/challenge.mustache diff --git a/frontend/resources/templates/challenge.mustache b/frontend/resources/templates/challenge.mustache new file mode 100644 index 000000000..16bba9b6a --- /dev/null +++ b/frontend/resources/templates/challenge.mustache @@ -0,0 +1,18 @@ + + + + + Penpot - Challenge + + + + + + + diff --git a/frontend/scripts/_helpers.js b/frontend/scripts/_helpers.js index d4bb7182b..20197e888 100644 --- a/frontend/scripts/_helpers.js +++ b/frontend/scripts/_helpers.js @@ -415,6 +415,13 @@ async function generateTemplates() { await fs.writeFile("./resources/public/index.html", content); + content = await renderTemplate( + "resources/templates/challenge.mustache", + {}, + partials, + ); + await fs.writeFile("./resources/public/challenge.html", content); + content = await renderTemplate( "resources/templates/preview-body.mustache", { diff --git a/frontend/src/app/main/data/users.cljs b/frontend/src/app/main/data/users.cljs index 1a61a0644..8dfe1c0a1 100644 --- a/frontend/src/app/main/data/users.cljs +++ b/frontend/src/app/main/data/users.cljs @@ -137,13 +137,24 @@ (when (not= previous-email email) (set-current-team! nil))))))) +(defn- on-fetch-profile-exception + [cause] + (let [data (ex-data cause)] + (if (and (= :authorization (:type data)) + (= :challenge-required (:code data))) + (let [path (rt/get-current-path) + href (str "/challenge.html?redirect=" path)] + (rx/of (rt/nav-raw href))) + (rx/throw cause)))) + (defn fetch-profile [] (ptk/reify ::fetch-profile ptk/WatchEvent (watch [_ _ _] (->> (rp/cmd! :get-profile) - (rx/map profile-fetched))))) + (rx/map profile-fetched) + (rx/catch on-fetch-profile-exception))))) ;; --- EVENT: login diff --git a/frontend/src/app/main/repo.cljs b/frontend/src/app/main/repo.cljs index b19edf933..77d4de012 100644 --- a/frontend/src/app/main/repo.cljs +++ b/frontend/src/app/main/repo.cljs @@ -17,7 +17,7 @@ [cuerdas.core :as str])) (defn handle-response - [{:keys [status body] :as response}] + [{:keys [status body headers] :as response}] (cond (= 204 status) ;; We need to send "something" so the streams listening downstream can act @@ -40,6 +40,13 @@ {:type :validation :code :request-body-too-large})) + (and (= status 403) + (or (= "cloudflare" (get headers "server")) + (= "challenge" (get headers "cf-mitigated")))) + (rx/throw (ex-info "http error" + {:type :authorization + :code :challenge-required})) + (and (>= status 400) (map? body)) (rx/throw (ex-info "http error" body)) @@ -48,6 +55,7 @@ (ex-info "http error" {:type :unexpected-error :status status + :headers headers :data body})))) (def default-options diff --git a/frontend/src/app/util/router.cljs b/frontend/src/app/util/router.cljs index 6374d8822..b556bd84b 100644 --- a/frontend/src/app/util/router.cljs +++ b/frontend/src/app/util/router.cljs @@ -16,6 +16,7 @@ [app.util.globals :as globals] [app.util.timers :as ts] [beicon.v2.core :as rx] + [cuerdas.core :as str] [goog.events :as e] [potok.v2.core :as ptk] [reitit.core :as r])) @@ -149,6 +150,20 @@ [] (set! (.-href globals/location) "/")) +(defn nav-raw + [href] + (ptk/reify ::nav-raw + ptk/EffectEvent + (effect [_ _ _] + (set! (.-href globals/location) href)))) + +(defn get-current-path + [] + (let [hash (.-hash globals/location)] + (if (str/starts-with? hash "#") + (subs hash 1) + hash))) + ;; --- History API (defn initialize-history -- Gitee From 396cbb27b26ab801eb99fbd0f92bce977d61bf0c Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 5 Sep 2024 16:00:04 +0200 Subject: [PATCH 1256/1266] :bug: Fix plugins add interaction --- frontend/src/app/plugins/parser.cljs | 17 ++++++++--------- frontend/src/app/plugins/shape.cljs | 4 ++-- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/frontend/src/app/plugins/parser.cljs b/frontend/src/app/plugins/parser.cljs index 119c71bd3..fad9c55bf 100644 --- a/frontend/src/app/plugins/parser.cljs +++ b/frontend/src/app/plugins/parser.cljs @@ -450,20 +450,20 @@ (d/without-nils (case animation-type :dissolve - {:type animation-type + {:animation-type animation-type :duration (obj/get animation "duration") :easing (-> (obj/get animation "easing") parse-keyword)} :slide - {:type animation-type + {:animation-type animation-type :way (-> (obj/get animation "way") parse-keyword) :direction (-> (obj/get animation "direction") parse-keyword) :duration (obj/get animation "duration") :easing (-> (obj/get animation "easing") parse-keyword) - :offset-effect (obj/get animation "offsetEffect")} + :offset-effect (boolean (obj/get animation "offsetEffect"))} :push - {:type animation-type + {:animation-type animation-type :direction (-> (obj/get animation "direction") parse-keyword) :duration (obj/get animation "duration") :easing (-> (obj/get animation "easing") parse-keyword)} @@ -563,10 +563,9 @@ nil))))) (defn parse-interaction - [^js interaction] - (when interaction - (let [trigger (-> (obj/get interaction "trigger") parse-keyword) - delay (obj/get interaction "trigger") - action (-> (obj/get interaction "action") parse-action)] + [trigger ^js action delay] + (when (and (string? trigger) (some? action)) + (let [trigger (parse-keyword trigger) + action (parse-action action)] (d/without-nils (d/patch-object {:event-type trigger :delay delay} action))))) diff --git a/frontend/src/app/plugins/shape.cljs b/frontend/src/app/plugins/shape.cljs index f853116e6..809ff4edd 100644 --- a/frontend/src/app/plugins/shape.cljs +++ b/frontend/src/app/plugins/shape.cljs @@ -551,10 +551,10 @@ ;; Interactions (addInteraction - [self interaction] + [self trigger action delay] (let [interaction (-> ctsi/default-interaction - (d/patch-object (parser/parse-interaction interaction)))] + (d/patch-object (parser/parse-interaction trigger action delay)))] (cond (not (sm/validate ::ctsi/interaction interaction)) (u/display-not-valid :addInteraction interaction) -- Gitee From bf202473e96a0cbc36d34c2706bde08f2bc3da25 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Fri, 6 Sep 2024 09:47:09 +0200 Subject: [PATCH 1257/1266] :bug: Fix guides submenu visualization --- .../app/main/ui/workspace/sidebar/options/menus/frame_grid.scss | 2 -- 1 file changed, 2 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/frame_grid.scss b/frontend/src/app/main/ui/workspace/sidebar/options/menus/frame_grid.scss index c4be7026a..bb4bf2366 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/frame_grid.scss +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/frame_grid.scss @@ -199,7 +199,6 @@ .height { @extend .input-element; @include bodySmallTypography; - width: $s-108; .icon-text { padding-top: $s-1; } @@ -208,7 +207,6 @@ .margin { @extend .input-element; @include bodySmallTypography; - width: $s-108; .icon { &.rotated svg { transform: rotate(90deg); -- Gitee From 5e89cd1cb3ea085b864bc6991ae76a89d976a490 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Fri, 6 Sep 2024 07:34:42 +0200 Subject: [PATCH 1258/1266] :sparkles: Release notes for 2.2 --- frontend/src/app/main/ui/releases.cljs | 3 +- frontend/src/app/main/ui/releases/v2_2.cljs | 51 +++++++++++++ frontend/src/app/main/ui/releases/v2_2.scss | 79 +++++++++++++++++++++ 3 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 frontend/src/app/main/ui/releases/v2_2.cljs create mode 100644 frontend/src/app/main/ui/releases/v2_2.scss diff --git a/frontend/src/app/main/ui/releases.cljs b/frontend/src/app/main/ui/releases.cljs index 6dd39b14f..3337e468d 100644 --- a/frontend/src/app/main/ui/releases.cljs +++ b/frontend/src/app/main/ui/releases.cljs @@ -28,6 +28,7 @@ [app.main.ui.releases.v1-9] [app.main.ui.releases.v2-0] [app.main.ui.releases.v2-1] + [app.main.ui.releases.v2-2] [app.util.object :as obj] [app.util.timers :as tm] [rumext.v2 :as mf])) @@ -92,4 +93,4 @@ (defmethod rc/render-release-notes "0.0" [params] - (rc/render-release-notes (assoc params :version "2.1"))) + (rc/render-release-notes (assoc params :version "2.2"))) diff --git a/frontend/src/app/main/ui/releases/v2_2.cljs b/frontend/src/app/main/ui/releases/v2_2.cljs new file mode 100644 index 000000000..2707f94d3 --- /dev/null +++ b/frontend/src/app/main/ui/releases/v2_2.cljs @@ -0,0 +1,51 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.main.ui.releases.v2-2 + (:require-macros [app.main.style :as stl]) + (:require + [app.common.data.macros :as dm] + [app.main.ui.releases.common :as c] + [rumext.v2 :as mf])) + +(defmethod c/render-release-notes "2.2" + [{:keys [slide klass finish version]}] + (mf/html + (case slide + :start + [:div {:class (stl/css-case :modal-overlay true)} + [:div.animated {:class klass} + [:div {:class (stl/css :modal-container)} + [:img {:src "images/features/2.0-intro-image.png" + :class (stl/css :start-image) + :border "0" + :alt "A graphic illustration with Penpot style"}] + + [:div {:class (stl/css :modal-content)} + [:div {:class (stl/css :modal-header)} + [:h1 {:class (stl/css :modal-title)} + "What's new in Penpot? "] + + [:div {:class (stl/css :version-tag)} + (dm/str "Version " version)]] + + [:div {:class (stl/css :features-block)} + [:p {:class (stl/css :feature-content)} + "This Penpot 2.2 release focuses on internal changes that are laying out the ground for the upcoming plugin system and substantial performance improvements."] + + [:p {:class (stl/css :feature-content)} + "This version also adds full JSON API interoperability and the brand-new Penpot’s Storybook!"] + + [:p {:class (stl/css :feature-content)} + "Self-hosted Penpot installations will benefit from better file data storage and Penpot admins can now use the improved automatic snapshotting process when recovering old files."] + + [:p {:class (stl/css :feature-content)} + "Thanks again to our awesome community for their amazing contributions to this release!"]] + + [:div {:class (stl/css :navigation)} + [:button {:class (stl/css :next-btn) + :on-click finish} "Let's go"]]]]]]))) + diff --git a/frontend/src/app/main/ui/releases/v2_2.scss b/frontend/src/app/main/ui/releases/v2_2.scss new file mode 100644 index 000000000..dd6adbd8a --- /dev/null +++ b/frontend/src/app/main/ui/releases/v2_2.scss @@ -0,0 +1,79 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. +// +// Copyright (c) KALEIDOS INC + +@import "refactor/common-refactor.scss"; + +.modal-overlay { + @extend .modal-overlay-base; +} + +.modal-container { + display: grid; + grid-template-columns: $s-324 1fr; + height: $s-480; + width: $s-888; + border-radius: $br-8; + background-color: var(--modal-background-color); + border: $s-2 solid var(--modal-border-color); +} + +.start-image { + width: $s-324; + border-radius: $br-8 0 0 $br-8; +} + +.modal-content { + padding: $s-40; + display: grid; + grid-template-rows: auto 1fr $s-32; + gap: $s-24; +} + +.modal-header { + display: grid; + gap: $s-8; +} + +.version-tag { + @include flexCenter; + @include headlineSmallTypography; + height: $s-32; + width: $s-96; + background-color: var(--communication-tag-background-color); + color: var(--communication-tag-foreground-color); + border-radius: $br-8; +} + +.modal-title { + @include headlineLargeTypography; + color: var(--modal-title-foreground-color); +} + +.features-block { + display: flex; + flex-direction: column; + gap: $s-16; + width: $s-440; +} + +.feature-content { + @include bodyMediumTypography; + margin: 0; + color: var(--modal-text-foreground-color); +} + +.navigation { + width: 100%; + display: grid; + grid-template-areas: "bullets button"; +} + +.next-btn { + @extend .button-primary; + width: $s-100; + justify-self: flex-end; + grid-area: button; +} -- Gitee From 03040ed40beae974493ae3ddbc31080011d48ef6 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Fri, 6 Sep 2024 11:02:02 +0200 Subject: [PATCH 1259/1266] :bug: Fix problem when dismissing shared library update --- CHANGES.md | 1 + backend/src/app/rpc/commands/files.clj | 2 +- backend/src/app/util/time.clj | 15 ++++++++------- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 39f0a47a3..8943da36c 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -80,6 +80,7 @@ - Fix problem with overlay positions in viewer [Taiga #8464](https://tree.taiga.io/project/penpot/issue/8464) - Fix layer panel overflowing [Taiga #8665](https://tree.taiga.io/project/penpot/issue/8665) - Fix problem when creating a component instance from grid layout [Github #4881](https://github.com/penpot/penpot/issues/4881) +- Fix problem when dismissing shared library update [Taiga #8669](https://tree.taiga.io/project/penpot/issue/8669) ## 2.1.5 diff --git a/backend/src/app/rpc/commands/files.clj b/backend/src/app/rpc/commands/files.clj index d3317ac2b..79381d34f 100644 --- a/backend/src/app/rpc/commands/files.clj +++ b/backend/src/app/rpc/commands/files.clj @@ -1058,7 +1058,7 @@ (def ^:private schema:ignore-file-library-sync-status [:map {:title "ignore-file-library-sync-status"} [:file-id ::sm/uuid] - [:date ::dt/duration]]) + [:date ::dt/instant]]) ;; TODO: improve naming (sv/defmethod ::ignore-file-library-sync-status diff --git a/backend/src/app/util/time.clj b/backend/src/app/util/time.clj index 6d40df6aa..c1526bfb4 100644 --- a/backend/src/app/util/time.clj +++ b/backend/src/app/util/time.clj @@ -141,21 +141,22 @@ ;; --- INSTANT +(defn instant? + [v] + (instance? Instant v)) + (defn instant ([s] - (if (int? s) - (Instant/ofEpochMilli s) - (Instant/parse s))) + (cond + (instant? s) s + (int? s) (Instant/ofEpochMilli s) + :else (Instant/parse s))) ([s fmt] (case fmt :rfc1123 (Instant/from (.parse DateTimeFormatter/RFC_1123_DATE_TIME ^String s)) :iso (Instant/from (.parse DateTimeFormatter/ISO_INSTANT ^String s)) :iso8601 (Instant/from (.parse DateTimeFormatter/ISO_INSTANT ^String s))))) -(defn instant? - [v] - (instance? Instant v)) - (defn is-after? [da db] (.isAfter ^Instant da ^Instant db)) -- Gitee From c24b2dadec3c46430864ddf3c5b00bb3f9a2b5d7 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Fri, 6 Sep 2024 09:56:19 +0200 Subject: [PATCH 1260/1266] :sparkles: Change installation data to profile --- frontend/src/app/main/data/users.cljs | 5 +++- frontend/src/app/plugins.cljs | 2 -- frontend/src/app/plugins/register.cljs | 36 +++++--------------------- 3 files changed, 10 insertions(+), 33 deletions(-) diff --git a/frontend/src/app/main/data/users.cljs b/frontend/src/app/main/data/users.cljs index 854777904..b3c4e8f05 100644 --- a/frontend/src/app/main/data/users.cljs +++ b/frontend/src/app/main/data/users.cljs @@ -19,6 +19,7 @@ [app.main.data.websocket :as ws] [app.main.features :as features] [app.main.repo :as rp] + [app.plugins.register :as register] [app.util.i18n :as i18n :refer [tr]] [app.util.router :as rt] [app.util.storage :as s] @@ -137,7 +138,9 @@ (swap! s/storage assoc :profile profile) (i18n/set-locale! (:lang profile)) (when (not= previous-email email) - (set-current-team! nil))))))) + (set-current-team! nil)) + + (register/init)))))) (defn- on-fetch-profile-exception [cause] diff --git a/frontend/src/app/plugins.cljs b/frontend/src/app/plugins.cljs index 8fccc0dcb..a66d1f023 100644 --- a/frontend/src/app/plugins.cljs +++ b/frontend/src/app/plugins.cljs @@ -15,7 +15,6 @@ [app.plugins.grid :as grid] [app.plugins.library :as library] [app.plugins.public-utils] - [app.plugins.register :as register] [app.plugins.shape :as shape] [app.util.globals :refer [global]] [app.util.object :as obj] @@ -25,7 +24,6 @@ (defn init-plugins-runtime! [] (when-let [init-runtime (obj/get global "initPluginsRuntime")] - (register/init) (init-runtime (fn [plugin-id] (api/create-context plugin-id))))) (defn initialize diff --git a/frontend/src/app/plugins/register.cljs b/frontend/src/app/plugins/register.cljs index 1579b24b7..2ebe1912d 100644 --- a/frontend/src/app/plugins/register.cljs +++ b/frontend/src/app/plugins/register.cljs @@ -10,8 +10,10 @@ [app.common.data :as d] [app.common.data.macros :as dm] [app.common.uuid :as uuid] + [app.main.repo :as rp] + [app.main.store :as st] [app.util.object :as obj] - [app.util.storage :refer [storage]])) + [beicon.v2.core :as rx])) ;; Stores the installed plugins information (defonce ^:private registry (atom {})) @@ -58,40 +60,14 @@ :icon icon :permissions (into #{} (map str) permissions)})) -;; FIXME: LEGACY version of the load from store -;; can be removed before deploying plugins to production -;; Needs to be preserved for the beta users -(defn legacy-load-from-store - [] - (let [parse-plugin-data - (fn [^js data] - {:plugin-id (obj/get data "plugin-id") - :name (obj/get data "name") - :description (obj/get data "description") - :host (obj/get data "host") - :code (obj/get data "code") - :icon (obj/get data "icon") - :permissions (into #{} (obj/get data "permissions"))}) - - ls (.-localStorage js/window) - plugins-val (.getItem ls "plugins")] - (when plugins-val - (let [stored (->> (.parse js/JSON plugins-val) - (map parse-plugin-data))] - (reset! registry - {:ids (->> stored (map :plugin-id)) - :data (d/index-by :plugin-id stored)}))))) - (defn save-to-store [] - (swap! storage assoc :plugins @registry)) + (->> (rp/cmd! :update-profile-props {:props {:plugins @registry}}) + (rx/subs! identity))) (defn load-from-store [] - (if (:plugins @storage) - (reset! registry (:plugins @storage)) - (do (legacy-load-from-store) - (save-to-store)))) + (reset! registry (get-in @st/state [:profile :props :plugins] {}))) (defn init [] -- Gitee From d583661e589ea3b28d10712e888bba5a879f9fed Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 6 Sep 2024 12:29:48 +0200 Subject: [PATCH 1261/1266] :bug: Fix storybook build related to commonjs to esm module conversion issue --- frontend/package.json | 1 + frontend/src/app/util/functions.cljs | 29 ++++++++++++++++++++++++++++ frontend/src/app/util/storage.cljs | 5 ++--- frontend/yarn.lock | 1 + 4 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 frontend/src/app/util/functions.cljs diff --git a/frontend/package.json b/frontend/package.json index 67bb13612..1612361ab 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -96,6 +96,7 @@ "highlight.js": "^11.9.0", "js-beautify": "^1.15.1", "jszip": "^3.10.1", + "lodash": "^4.17.21", "luxon": "^3.4.4", "mousetrap": "^1.6.5", "opentype.js": "^1.3.4", diff --git a/frontend/src/app/util/functions.cljs b/frontend/src/app/util/functions.cljs new file mode 100644 index 000000000..fa7818ea7 --- /dev/null +++ b/frontend/src/app/util/functions.cljs @@ -0,0 +1,29 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.util.functions + "A functions helpers" + (:require + ["lodash/debounce.js" :as lodash-debounce])) + +;; NOTE: this is needed because depending on the type of the build and +;; target execution evironment (browser, esm), the real export can be +;; different. All this issue is about the commonjs and esm +;; interop/conversion, because the js ecosystem decided that is should +;; work this way. +;; +;; In this concrete case, lodash exposes commonjs module which works +;; ok on browser build but for ESM build it is converted in the best +;; effort to esm module, exporting the module.exports as the default +;; property. This is why on ESM builds we need to look on .-default +;; property. +(def ^:private ext-debounce + (or (.-default lodash-debounce) + lodash-debounce)) + +(defn debounce + [f timeout] + (ext-debounce f timeout #{:leading false :trailing true})) diff --git a/frontend/src/app/util/storage.cljs b/frontend/src/app/util/storage.cljs index 80fd72f6e..df08e0eac 100644 --- a/frontend/src/app/util/storage.cljs +++ b/frontend/src/app/util/storage.cljs @@ -6,9 +6,9 @@ (ns app.util.storage (:require - ["lodash/debounce" :as ldebounce] [app.common.exceptions :as ex] [app.common.transit :as t] + [app.util.functions :as fns] [app.util.globals :as g] [cuerdas.core :as str])) @@ -76,8 +76,7 @@ (set! latest-state curr-state))))) (defonce on-change - (ldebounce on-change* 2000 #js {:leading false :trailing true})) - + (fns/debounce on-change* 2000)) (defonce storage (atom latest-state)) (add-watch storage :persistence diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 24131d15b..43a1f3c3e 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -6647,6 +6647,7 @@ __metadata: js-beautify: "npm:^1.15.1" jsdom: "npm:^24.1.0" jszip: "npm:^3.10.1" + lodash: "npm:^4.17.21" luxon: "npm:^3.4.4" map-stream: "npm:0.0.7" marked: "npm:^12.0.2" -- Gitee From c99102e49b0576e7097c3d8aa8af4b1c615edb73 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Fri, 6 Sep 2024 13:18:39 +0200 Subject: [PATCH 1262/1266] :bug: Fix onboarding questions --- frontend/src/app/main/ui/onboarding/questions.cljs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/main/ui/onboarding/questions.cljs b/frontend/src/app/main/ui/onboarding/questions.cljs index 00898cd2c..738bc324e 100644 --- a/frontend/src/app/main/ui/onboarding/questions.cljs +++ b/frontend/src/app/main/ui/onboarding/questions.cljs @@ -217,9 +217,9 @@ [:team-size [:enum "more-than-50" "31-50" "11-30" "2-10" "freelancer" "personal-project"]] [:role - [:enum "designer" "developer" "student-teacher" "graphic-design" "marketing" "manager" "other"]] + [:enum "ux" "developer" "student-teacher" "designer" "marketing" "manager" "other"]] [:responsability - [:enum "team-leader" "team-member" "freelancer" "ceo-founder" "director" "student-teacher" "other"]] + [:enum "team-leader" "team-member" "freelancer" "ceo-founder" "director" "other"]] [:role-other {:optional true} [::sm/text {:max 512}]] [:responsability-other {:optional true} [::sm/text {:max 512}]]] -- Gitee From 3f34aa92fa46f7d785ff176e305c972f9a25e7be Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 5 Sep 2024 15:28:24 +0200 Subject: [PATCH 1263/1266] :sparkles: Add support for optional human challenge --- .../resources/templates/challenge.mustache | 18 ++++++++++++++++++ frontend/scripts/_helpers.js | 7 +++++++ frontend/src/app/main/data/users.cljs | 13 ++++++++++++- frontend/src/app/main/repo.cljs | 10 +++++++++- frontend/src/app/util/router.cljs | 16 ++++++++++++++++ 5 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 frontend/resources/templates/challenge.mustache diff --git a/frontend/resources/templates/challenge.mustache b/frontend/resources/templates/challenge.mustache new file mode 100644 index 000000000..16bba9b6a --- /dev/null +++ b/frontend/resources/templates/challenge.mustache @@ -0,0 +1,18 @@ + + + + + Penpot - Challenge + + + + + + + diff --git a/frontend/scripts/_helpers.js b/frontend/scripts/_helpers.js index 0e284111d..6e2bd2765 100644 --- a/frontend/scripts/_helpers.js +++ b/frontend/scripts/_helpers.js @@ -333,6 +333,13 @@ async function generateTemplates() { await fs.writeFile("./resources/public/index.html", content); + content = await renderTemplate( + "resources/templates/challenge.mustache", + {}, + partials, + ); + await fs.writeFile("./resources/public/challenge.html", content); + content = await renderTemplate("resources/templates/preview-body.mustache", { manifest: manifest, translations: JSON.stringify(translations), diff --git a/frontend/src/app/main/data/users.cljs b/frontend/src/app/main/data/users.cljs index 375119931..bd27cddb8 100644 --- a/frontend/src/app/main/data/users.cljs +++ b/frontend/src/app/main/data/users.cljs @@ -137,13 +137,24 @@ (when (not= previous-email email) (set-current-team! nil))))))) +(defn- on-fetch-profile-exception + [cause] + (let [data (ex-data cause)] + (if (and (= :authorization (:type data)) + (= :challenge-required (:code data))) + (let [path (rt/get-current-path) + href (str "/challenge.html?redirect=" path)] + (rx/of (rt/nav-raw href))) + (rx/throw cause)))) + (defn fetch-profile [] (ptk/reify ::fetch-profile ptk/WatchEvent (watch [_ _ _] (->> (rp/cmd! :get-profile) - (rx/map profile-fetched))))) + (rx/map profile-fetched) + (rx/catch on-fetch-profile-exception))))) ;; --- EVENT: login diff --git a/frontend/src/app/main/repo.cljs b/frontend/src/app/main/repo.cljs index b19edf933..77d4de012 100644 --- a/frontend/src/app/main/repo.cljs +++ b/frontend/src/app/main/repo.cljs @@ -17,7 +17,7 @@ [cuerdas.core :as str])) (defn handle-response - [{:keys [status body] :as response}] + [{:keys [status body headers] :as response}] (cond (= 204 status) ;; We need to send "something" so the streams listening downstream can act @@ -40,6 +40,13 @@ {:type :validation :code :request-body-too-large})) + (and (= status 403) + (or (= "cloudflare" (get headers "server")) + (= "challenge" (get headers "cf-mitigated")))) + (rx/throw (ex-info "http error" + {:type :authorization + :code :challenge-required})) + (and (>= status 400) (map? body)) (rx/throw (ex-info "http error" body)) @@ -48,6 +55,7 @@ (ex-info "http error" {:type :unexpected-error :status status + :headers headers :data body})))) (def default-options diff --git a/frontend/src/app/util/router.cljs b/frontend/src/app/util/router.cljs index c4d541cfd..cb17f1a80 100644 --- a/frontend/src/app/util/router.cljs +++ b/frontend/src/app/util/router.cljs @@ -13,8 +13,10 @@ [app.main.data.events :as ev] [app.util.browser-history :as bhistory] [app.util.dom :as dom] + [app.util.globals :as globals] [app.util.timers :as ts] [beicon.v2.core :as rx] + [cuerdas.core :as str] [goog.events :as e] [potok.v2.core :as ptk] [reitit.core :as r])) @@ -143,6 +145,20 @@ (= (.-hostname location) (:host referrer))) (nav-back)))) +(defn nav-raw + [href] + (ptk/reify ::nav-raw + ptk/EffectEvent + (effect [_ _ _] + (set! (.-href globals/location) href)))) + +(defn get-current-path + [] + (let [hash (.-hash globals/location)] + (if (str/starts-with? hash "#") + (subs hash 1) + hash))) + ;; --- History API (defn initialize-history -- Gitee From 15faa57e0106d0b87c2eaf0fb4df7c7993332ce2 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 9 Sep 2024 09:37:43 +0200 Subject: [PATCH 1264/1266] :bug: Fix decoding on sm/set schema --- common/src/app/common/schema.cljc | 91 +++++++++++++++++++------------ frontend/src/app/util/router.cljs | 2 +- 2 files changed, 57 insertions(+), 36 deletions(-) diff --git a/common/src/app/common/schema.cljc b/common/src/app/common/schema.cljc index c741ee682..493311af2 100644 --- a/common/src/app/common/schema.cljc +++ b/common/src/app/common/schema.cljc @@ -476,7 +476,7 @@ ::oapi/type "string" ::oapi/format "email"}}) -(def non-empty-strings-xf +(def xf:filter-word-strings (comp (filter string?) (remove str/empty?) @@ -489,11 +489,8 @@ :min 0 :max 1 :compile - (fn [{:keys [coerce kind max min] :as props} children _] - (let [xform (if coerce - (comp non-empty-strings-xf (map coerce)) - non-empty-strings-xf) - kind (or (last children) kind) + (fn [{:keys [kind max min] :as props} children _] + (let [kind (or (last children) kind) pred (cond @@ -501,9 +498,6 @@ (nil? kind) any? :else (validator kind)) - encode-child - (encoder kind string-transformer) - pred (cond (and max min) @@ -531,31 +525,49 @@ (fn [value] (every? pred value))) - decode + + decode-string-child + (decoder kind string-transformer) + + decode-string (fn [v] - (let [v (if (string? v) (str/split v #"[\s,]+") v)] - (into #{} xform v))) + (let [v (if (string? v) (str/split v #"[\s,]+") v) + x (comp xf:filter-word-strings (map decode-string-child))] + (into #{} x v))) - encode-json + decode-json-child + (decoder kind json-transformer) + + decode-json + (fn [v] + (let [v (if (string? v) (str/split v #"[\s,]+") v) + x (comp xf:filter-word-strings (map decode-json-child))] + (into #{} x v))) + + encode-string-child + (encoder kind string-transformer) + + encode-string (fn [o] (if (set? o) - (vec o) + (str/join ", " (map encode-string-child o)) o)) - encode-string + encode-json (fn [o] (if (set? o) - (str/join ", " (map encode-child o)) + (vec o) o))] + {:pred pred :type-properties {:title "set" :description "Set of Strings" :error/message "should be a set of strings" :gen/gen (-> kind sg/generator sg/set) - :decode/string decode - :decode/json decode + :decode/string decode-string + :decode/json decode-json :encode/string encode-string :encode/json encode-json ::oapi/type "array" @@ -569,21 +581,14 @@ :min 0 :max 1 :compile - (fn [{:keys [coerce kind max min] :as props} children _] - (let [xform (if coerce - (comp non-empty-strings-xf (map coerce)) - non-empty-strings-xf) - - kind (or (last children) kind) + (fn [{:keys [kind max min] :as props} children _] + (let [kind (or (last children) kind) pred (cond (fn? kind) kind (nil? kind) any? :else (validator kind)) - encode-child - (encoder kind string-transformer) - pred (cond (and max min) @@ -611,15 +616,31 @@ (fn [value] (every? pred value))) - decode + decode-string-child + (decoder kind string-transformer) + + decode-json-child + (decoder kind json-transformer) + + decode-string + (fn [v] + (let [v (if (string? v) (str/split v #"[\s,]+") v) + x (comp xf:filter-word-strings (map decode-string-child))] + (into #{} x v))) + + decode-json (fn [v] - (let [v (if (string? v) (str/split v #"[\s,]+") v)] - (into [] xform v))) + (let [v (if (string? v) (str/split v #"[\s,]+") v) + x (comp xf:filter-word-strings (map decode-json-child))] + (into #{} x v))) + + encode-string-child + (encoder kind string-transformer) encode-string (fn [o] (if (vector? o) - (str/join ", " (map encode-child o)) + (str/join ", " (map encode-string-child o)) o))] {:pred pred @@ -628,8 +649,8 @@ :description "Set of Strings" :error/message "should be a set of strings" :gen/gen (-> kind sg/generator sg/set) - :decode/string decode - :decode/json decode + :decode/string decode-string + :decode/json decode-json :encode/string encode-string ::oapi/type "array" ::oapi/format "set" @@ -646,7 +667,7 @@ :gen/gen (-> :string sg/generator sg/set) :decode/string (fn [v] (let [v (if (string? v) (str/split v #"[\s,]+") v)] - (into #{} non-empty-strings-xf v))) + (into #{} xf:filter-word-strings v))) ::oapi/type "array" ::oapi/format "set" ::oapi/items {:type "string"} @@ -662,7 +683,7 @@ :gen/gen (-> :keyword sg/generator sg/set) :decode/string (fn [v] (let [v (if (string? v) (str/split v #"[\s,]+") v)] - (into #{} (comp non-empty-strings-xf (map keyword)) v))) + (into #{} (comp xf:filter-word-strings (map keyword)) v))) ::oapi/type "array" ::oapi/format "set" ::oapi/items {:type "string" :format "keyword"} diff --git a/frontend/src/app/util/router.cljs b/frontend/src/app/util/router.cljs index 221c4b499..b556bd84b 100644 --- a/frontend/src/app/util/router.cljs +++ b/frontend/src/app/util/router.cljs @@ -13,7 +13,7 @@ [app.main.data.events :as ev] [app.util.browser-history :as bhistory] [app.util.dom :as dom] - [app.util.globals :as globals] + [app.util.globals :as globals] [app.util.timers :as ts] [beicon.v2.core :as rx] [cuerdas.core :as str] -- Gitee From 1c69a9fd8ae68b3fb7eb958171d4002fb265ad22 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 9 Sep 2024 09:38:07 +0200 Subject: [PATCH 1265/1266] :bug: Fix config parsing on exporter --- exporter/src/app/config.cljs | 44 +++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/exporter/src/app/config.cljs b/exporter/src/app/config.cljs index 4c0088077..6ca84f584 100644 --- a/exporter/src/app/config.cljs +++ b/exporter/src/app/config.cljs @@ -26,16 +26,24 @@ (def ^:private schema:config - (sm/define - [:map {:title "config"} - [:public-uri {:optional true} ::sm/uri] - [:host {:optional true} :string] - [:tenant {:optional true} :string] - [:flags {:optional true} ::sm/set-of-keywords] - [:redis-uri {:optional true} :string] - [:tempdir {:optional true} :string] - [:browser-pool-max {:optional true} :int] - [:browser-pool-min {:optional true} :int]])) + [:map {:title "config"} + [:public-uri {:optional true} ::sm/uri] + [:host {:optional true} :string] + [:tenant {:optional true} :string] + [:flags {:optional true} [::sm/set :keyword]] + [:redis-uri {:optional true} :string] + [:tempdir {:optional true} :string] + [:browser-pool-max {:optional true} ::sm/int] + [:browser-pool-min {:optional true} ::sm/int]]) + +(def ^:private decode-config + (sm/decoder schema:config sm/string-transformer)) + +(def ^:private explain-config + (sm/explainer schema:config)) + +(def ^:private valid-config? + (sm/validator schema:config)) (defn- parse-flags [config] @@ -60,15 +68,15 @@ [] (let [env (read-env "penpot") env (d/without-nils env) - data (merge defaults env)] + data (merge defaults env) + data (decode-config data)] + + (when-not (valid-config? data) + (let [explain (explain-config data)] + (println (sm/humanize-explain explain)) + (process/exit -1))) - (try - (sm/conform! schema:config data) - (catch :default cause - (if-let [explain (some->> cause ex-data ::sm/explain)] - (println (sm/humanize-explain explain)) - (js/console.error cause)) - (process/exit -1))))) + data)) (def config (prepare-config)) -- Gitee From 3a4e9ccc5aaa1a76324b987d5ac512fd21477cf3 Mon Sep 17 00:00:00 2001 From: Eva Marco Date: Fri, 6 Sep 2024 16:47:19 +0200 Subject: [PATCH 1266/1266] :construction_worker: Fix CI error --- frontend/src/app/main/data/users.cljs | 10 ---------- frontend/src/app/util/router.cljs | 2 +- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/frontend/src/app/main/data/users.cljs b/frontend/src/app/main/data/users.cljs index f4e01c219..b3c4e8f05 100644 --- a/frontend/src/app/main/data/users.cljs +++ b/frontend/src/app/main/data/users.cljs @@ -152,16 +152,6 @@ (rx/of (rt/nav-raw href))) (rx/throw cause)))) -(defn- on-fetch-profile-exception - [cause] - (let [data (ex-data cause)] - (if (and (= :authorization (:type data)) - (= :challenge-required (:code data))) - (let [path (rt/get-current-path) - href (str "/challenge.html?redirect=" path)] - (rx/of (rt/nav-raw href))) - (rx/throw cause)))) - (defn fetch-profile [] (ptk/reify ::fetch-profile diff --git a/frontend/src/app/util/router.cljs b/frontend/src/app/util/router.cljs index 221c4b499..b556bd84b 100644 --- a/frontend/src/app/util/router.cljs +++ b/frontend/src/app/util/router.cljs @@ -13,7 +13,7 @@ [app.main.data.events :as ev] [app.util.browser-history :as bhistory] [app.util.dom :as dom] - [app.util.globals :as globals] + [app.util.globals :as globals] [app.util.timers :as ts] [beicon.v2.core :as rx] [cuerdas.core :as str] -- Gitee